/* lop.c */ /* argv[1]で指定される、データ形式 * エピソード名惑星名1,[$]惑星名2,[%]惑星名3,惑星名n,<改行> * が乱順に並んだファイルからデータを読み込み、static char *epislist[]で * 指定されたエピソード順に並び替えてHTMLのテーブルにして標準出力に出力する。 * データファイルに、epislitに存在するエピソードのデータがなくてもエラーに * ならない。その場合、そのエピソードには惑星が1つも登場しないものとして * 扱われる。 */ /* コンパイルマシン/OSはSunの何ちゃらSPARCとSun OS、コンパイラはOS付属のもの。 * 特に特定の環境に依存するようなコードを書いたつもりはない。 */ /* 動けばいい、が方針なので少々行儀の悪いところもある。 * データファイルの文字コードについては無頓着なので注意。 * デバッグコードは恥ずかしいので(^^;、削除。 */ #include #include #include #include #define FALSE -1 /* 0だと困る */ #define TRUE 1 #define ON 'o' #define RETRO '%' /* 遡及的 - 惑星名が回想中などに出てくる場合 */ #define VAN '$' /* 消滅 */ #define MAX_PLANET_NUM 192 /* 全惑星数の上限; そのうち足りなくなる? */ #define MAX_PLANETNAME_NUM 64 /* 惑星名の文字数の上限 */ #define MAX_EPIS_NUM 80 /* 全エピソード数の上限; そのうち足りなくなる */ #define BUFSIZE 1024 /* 文字列バッファのサイズ */ /* ほぼ作中の年代順に並んでいる。 * この順序を入れ換えれば当然 * 執筆年代順の表を出力することも可能。 */ static char *epislist[] = { "インフィニット計画", "サイバー・ジェノサイド", "ロンウォールの嵐", "冬の惑星", "コズミックゲーム", "炎の虎", "魔女の世紀", "魔女の子供たち", "エスパーなんてこわくない", "黄昏の戦士", "がんばれ!!キャリアン", "ロード・レオン", "ELANA", "新世界戦隊", "アゼリア", "ミラーリング", "光の剣", "アウタープラネット", "エネセスの仮面", "ライザ", "星と少年", "スター・ゲイザー", "星を支配する者", "REPLAY", "愚か者の船", "マインド・バスター", "虚空の戦場", "ムーン・ハンター", "流浪I", "流浪II", "ソリティア", "円舞曲", "メヌエット", "狂死曲", "フィナーレ", "クロノスの罠", "歌姫", "永遠の旅人", "プリムラ", "魔術師の鏡", "ソング・オブ・アース", "妖精の森", "失われた翼", "シャトレーズ", "アストロ・レース", "バーミリオン・デザート", "夢使い―DREAM MASTER―", "超人の死", "ダークライオン", "黄金の牙", "赤いサーペント", "書を守る者", "ファイナル・クエスト", "WIZARDOM", "天空の魔法士", "公女タニア", "闇の王", "デスペラード", "邪神降臨", "愛しのグィネヴィア", "プリンス・オブ・ファントム", "神童", "ブレイン・シュリンカー", "不死者たち", "聖者の涙", "茉莉花", "クランベールの月", "ソード・オブ・ネメシス", "オメガ", "カデット", "星辰の門", "猫の散歩引き受けます", "女神と伝説", "時の倉庫", NULL}; char planetlist[MAX_PLANET_NUM][MAX_PLANETNAME_NUM]; /* 惑星名が入る配列 */ int handle_planetlist(char *); int find_episode(char *); void usage(void); int main(int argc, char *argv[]) { int i, j, last, episorder[MAX_EPIS_NUM], startpname[MAX_EPIS_NUM]; char thelist[MAX_EPIS_NUM][MAX_PLANET_NUM], *pline, line[BUFSIZE]; FILE *fp; if(argc == 1) {usage(); exit(EXIT_SUCCESS);} if(argc > 2) {fprintf(stderr, "Too many arguments.\n"); exit(EXIT_FAILURE);} if(!(fp = fopen(argv[1], "r"))) {fprintf(stderr, "No such file: %s.\n", argv[1]); exit(EXIT_FAILURE);} for(i=0; i"); printf(""); /* 第1行 == 惑星名; 第1列はエピソード名なので空 */ last=handle_planetlist(NULL); for(i=0; i%s", planetlist[i]); } puts(""); /* 第2行以下 */ for(i=0; epislist[i] != NULL; i++) { printf("%s", epislist[i]); for(j=0; j"); if(thelist[i][j] != '\0') { printf("%c", thelist[i][j]); } printf(""); } puts(""); } puts(""); fprintf(stderr, "total num of planets = %d\n", handle_planetlist(NULL)); return 0; } /* 引数で渡された惑星名をplanetlistから検索、見つかったらその番号を戻す。 * ない場合最後に追加し、やはり番号を戻す。 */ int handle_planetlist(char *p_planetname) { static int last=0; /* リストの最後 == 最初の未使用行 */ int i; if(p_planetname == NULL) { return last; /* 表を出力するときに全惑星数が必要になるので */ } else if(last >= MAX_PLANET_NUM) { return FALSE; } for(i=0; i