コマンドファイル共通のヘッダファイル設定をpackage.hに整理
[YACASL2.git] / src / comet2.c
1 #include "package.h"
2 #include "exec.h"
3
4 /**
5  * comet2コマンドのオプション
6  */
7 static struct option longopts[] = {
8     {"trace", no_argument, NULL, 't'},
9     {"tracearithmetic", no_argument, NULL, 't'},
10     {"tracelogical", no_argument, NULL, 'T'},
11     {"dump", no_argument, NULL, 'd'},
12     {"memorysize", required_argument, NULL, 'M'},
13     {"clocks", required_argument, NULL, 'C'},
14     { "version", no_argument, NULL, 'v' },
15     {"help", no_argument, NULL, 'h'},
16     {0, 0, 0, 0},
17 };
18
19 /**
20  * @brief comet2コマンドのメイン
21  *
22  * @return 正常終了時は0、異常終了時は1
23  *
24  * @param argc コマンドライン引数の数
25  * @param *argv[] コマンドライン引数の配列
26  */
27 int main(int argc, char *argv[])
28 {
29     int memsize = DEFAULT_MEMSIZE, clocks = DEFAULT_CLOCKS;
30     int opt, stat = 0;
31     const char *version = PACKAGE_VERSION,  *cmdversion = "comet2 of YACASL2 version %s\n";
32     const char *usage = "Usage: %s [-tTdvh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
33
34     cerr_init();
35     addcerrlist_load();
36     addcerrlist_exec();
37
38     /* オプションの処理 */
39     while((opt = getopt_long(argc, argv, "tTdM:C:vh", longopts, NULL)) != -1) {
40         switch(opt) {
41         case 't':
42             execmode.trace = true;
43             break;
44         case 'T':
45             execmode.trace = true;
46             execmode.logical = true;
47             break;
48         case 'd':
49             execmode.dump = true;
50             break;
51         case 'M':
52             memsize = atoi(optarg);
53             break;
54         case 'C':
55             clocks = atoi(optarg);
56             break;
57         case 'v':
58             fprintf(stdout, cmdversion, version);
59             return 0;
60         case 'h':
61             fprintf(stdout, usage, argv[0]);
62             return 0;
63         case '?':
64             fprintf(stderr, usage, argv[0]);
65             exit(1);
66         }
67     }
68     if(argv[optind] == NULL) {
69         setcerr(211, "");    /* object file not specified */
70         fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg);
71         exit(1);
72     }
73     /* COMET II仮想マシンのリセット */
74     reset(memsize, clocks);
75     execptr->start = 0;
76     if(loadassemble(argv[optind]) == true) {
77         exec();                /* プログラム実行 */
78     }
79     /* COMET II仮想マシンのシャットダウン */
80     shutdown();
81     stat = (cerr->num == 0) ? 0 : 1;
82     /* エラーの解放 */
83     freecerr();
84     return stat;
85 }