// This may look like C code, but it is really -*- C++ -*-
// RTSS --- Railway Total System Simulator
// (c) TAKAGI Ryo (at Prof. SONE's Laboratory, the Univ. of Tokyo.)
// rtsscmds.hh --- header file that defines command lists
// $Id: rtsscmds.hh,v 2.4 1994/12/27 12:03:47 rt Exp $

#ifndef ___RTSSCMDS_HH
#define ___RTSSCMDS_HH

#include <cstring>

enum commandvalue {	// コマンド・フラグリスト

    // N Flags
    STATION_OBJECT_VALID,	// 信号系を有効に, h_file を読み込む指令
    CONGES_STATION,		// 混雑率を駅ごとに変更
    ONTPREC_DELAY_SET,		// ontprec セット判定の遅れ絶対値
    STARTSTOP_PARAMETER,	// 駅間走行時分を一斉変更
    ONTPREC,			// ノッチオフ位置計算を高精度バージョンで
    INITIALDEPARTURETIME,	// tdept を trainvar コマンドで指定

    // N Commands in feeder::rf_nfile()
    PATTERNS,		// ダイヤパターン数

    // N Commands in diapattern::readfile()
    NEXTSTA,		// nextsta オブジェクトの数
    CYCLETIME,		// ダイヤパターン1周期分の時間
    PHASE,		// 位相
    CARS,		// 列車数
    PATTERNCIRC,	// パターン倍数
    TRAINVAR,		// 列車に与える初期値
    TRAINDATA,		// 列車の形式

    // N Commands in nextsta::readfile()
    STARTPOINT,			// 開始地点
    ENDPOINT,			// 終了地点
    ENDVELOCITY,		// 次駅データ終了地点での速度
    NEXTNXX,			// 次データ移行点
//     STATION_OBJECT_NUMBER,	// 対応する駅オブジェクト番号 -> H Cmds.
    STARTSTOPTIME,		// 駅間走行時分
    STATIONSTOP,		// 駅停車時間
    NOTCHOFF,			// ノッチオフ速度
    DIREC,			// 列車進行方向（下り = 1）
    NFLINE,			// 饋電線番号
    CONGESTION,			// 当該区間での列車混雑率
    NEXTSTA_PATTERN,		// 次駅データのタイプ
    GRADCRVNUMBER,		// gradcrv コマンドの数
    GRADCRV,			// gradcrv 配列の番号

    // H Flags
    STOPORIENTED,		// 駅間停止指向
    STATIONSTOP_VARIATION_TYPE_A,	// 駅停車時分の変動（金論文タイプ）

    // H Commands in station_obj::readfile()
    STATION_OBJECT_NUMBER,	// station_obj の数
    IOLINENUMBER,		// niolno
    TRACKNUMBER,		// nvoie
    STATION_OBJECT_TYPE,	// stnobjtype
    STOP_OUT_OF_STATION,	// stop_out_of_station
    DEPART_ARRIVAL,		// 発車後次列車到着まで
    ARRIVAL_DEPART,		// 到着後次列車発車まで
    ARRIVAL_ARRIVAL,		// 到着後次列車到着まで
    DEPART_DEPART,		// 発車後次列車発車まで
    DEPART_PASS,		// 発車後次列車通過まで
    ARRIVAL_PASS,		// 到着後次列車通過まで
    PASS_ARRIVAL,		// 通過後次列車到着まで
    PASS_DEPART,		// 通過後次列車発車まで
    PASS_PASS,			// 通過後次列車通過まで

    // H Commands in
    // station_obj_stationstop_variation::readfile_additional_readfile()
    DISTURBANCE,		// 列車を遅らせるか否か
    DISTURBANCE_TIME,		// 列車を遅らせる時間
    CONTROL_DISTURBANCE_TYPE,	// 制御の種類
    CONTROL_STATION_OBJ_NUMBER,	// 制御対象の station_obj の番号
    CONTROL_STATION_OBJ_VALUE,	// 制御量 [秒]
    CONTROL_STATION_OBJ_TIME,	// 制御をかける時刻 [秒]

    END_OF_DATA		// データ終了指示用

};
    
struct commandlist {		// コマンドリスト用
    commandvalue cmdval;	// 対応する enum 指定子
    char* cmdname; 		// コマンドの名前
};

#ifndef __GLOB_MAIN_ROUTINE

extern commandlist comlist[];
extern int comnum;

int sortcommands( const void* kvl, const void* dvl );

#else

commandlist comlist[] = {

    // N Flags
    { STATION_OBJECT_VALID, "station_object_valid" },
    { CONGES_STATION, "conges_station" },
    { ONTPREC_DELAY_SET, "ontprec_delay_set" },
    { STARTSTOP_PARAMETER, "startstop_parameter" },
    { ONTPREC, "ontprec" },
    { INITIALDEPARTURETIME, "initialdeparturetime" },

    // N Commands in feeder::rf_nfile()
    { PATTERNS, "patterns" },

    // N Commands in diapattern::readfile()
    { NEXTSTA, "nextsta" },
    { CYCLETIME, "cycletime" },
    { PHASE, "phase" },
    { CARS, "cars" },
    { PATTERNCIRC, "patterncirc" },
    { TRAINVAR, "trainvar" },
    { TRAINDATA, "traindata" },

    // N Commands in nextsta::readfile()
    { STARTPOINT, "startpoint" },		// 開始地点
    { ENDPOINT, "endpoint" },			// 終了地点
    { ENDVELOCITY, "endvelocity" },		// 次駅データ終了地点での速度
    { NEXTNXX, "nextnxx" },			// 次データ移行点
    { STARTSTOPTIME, "startstoptime" },		// 駅間走行時分
    { STATIONSTOP, "stationstop" },		// 駅停車時間
    { NOTCHOFF, "notchoff" },			// ノッチオフ速度
    { DIREC, "direc" },				// 列車進行方向（下り = 1）
    { NFLINE, "nfline" },			// 饋電線番号
    { CONGESTION, "congestion" },		// 当該区間での列車混雑率
    { NEXTSTA_PATTERN, "nextsta_pattern" },	// 次駅データのタイプ
    { GRADCRVNUMBER, "gradcrvnumber" },		// gradcrv コマンドの数
    { GRADCRV, "gradcrv" },			// gradcrv 配列の番号

    // H Flags
    { STOPORIENTED, "stoporiented" },	// 駅間停止指向
    { STATIONSTOP_VARIATION_TYPE_A, "stationstop_variation_type_a" },

    // H Commands in station_obj::readfile()
    { STATION_OBJECT_NUMBER, "station_object_number" },	// station_obj の数
    { IOLINENUMBER, "iolinenumber" },			// niolno
    { TRACKNUMBER, "tracknumber" },			// nvoie
    { STATION_OBJECT_TYPE, "station_object_type" },	// stnobjtype
    { STOP_OUT_OF_STATION, "stop_out_of_station" },	// out_of_station
    { DEPART_ARRIVAL, "depart_arrival" },	// 発車後次列車到着まで
    { ARRIVAL_DEPART, "arrival_depart" },	// 到着後次列車発車まで
    { ARRIVAL_ARRIVAL, "arrival_arrival" },	// 到着後次列車到着まで
    { DEPART_DEPART, "depart_depart" },		// 発車後次列車発車まで
    { DEPART_PASS, "depart_pass" },		// 発車後次列車通過まで
    { ARRIVAL_PASS, "arrival_pass" },		// 到着後次列車通過まで
    { PASS_ARRIVAL, "pass_arrival" },		// 通過後次列車到着まで
    { PASS_DEPART, "pass_depart" },		// 通過後次列車発車まで
    { PASS_PASS, "pass_pass" },			// 通過後次列車通過まで

    // H Commands in
    // station_obj_stationstop_variation::readfile_additional_readfile()
    { DISTURBANCE, "disturbance" },		// 列車を遅らせる
    { DISTURBANCE_TIME, "disturbance_time" },	// 列車を遅らせる時間
    { CONTROL_DISTURBANCE_TYPE,	"control_disturbance_type" },
    { CONTROL_STATION_OBJ_NUMBER, "control_station_obj_number" },
    { CONTROL_STATION_OBJ_VALUE, "control_station_obj_value" },
    { CONTROL_STATION_OBJ_TIME, "control_station_obj_time" },
 
    // End of Data
    { END_OF_DATA, "" }
};

int comnum = 0;

int sortcommands
( const void* kvl, const void* dvl ) {
    return strcmp( ( ( commandlist* ) kvl ) -> cmdname,
                   ( ( commandlist* ) dvl ) -> cmdname );
}

#endif /* __GLOB_MAIN_ROUTINE */

#endif /* ! ___RTSSCMDS_HH */
