55bab759af035537dc9018c2d0fc701b51cd7f0b
[YACASL2.git] / 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     {"monitor", no_argument, NULL, 'm'},
13     {"memorysize", required_argument, NULL, 'M'},
14     {"clocks", required_argument, NULL, 'C'},
15     {"version", no_argument, NULL, 'v' },
16     {"help", no_argument, NULL, 'h'},
17     {0, 0, 0, 0},
18 };
19
20 /**
21  * @brief comet2コマンドのメイン
22  *
23  * @return 正常終了時は0、異常終了時は1
24  *
25  * @param argc コマンドライン引数の数
26  * @param *argv[] コマンドライン引数の配列
27  */
28 int main(int argc, char *argv[])
29 {
30     int memsize = DEFAULT_MEMSIZE, clocks = DEFAULT_CLOCKS;
31     int opt, stat = 0;
32     const char *version = PACKAGE_VERSION,  *cmdversion = "comet2 of YACASL2 version %s\n";
33     const char *usage = "Usage: %s [-tTdmvh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
34
35     /* オプションの処理 */
36     while((opt = getopt_long(argc, argv, "tTdmM:C:vh", longopts, NULL)) != -1) {
37         switch(opt) {
38         case 't':
39             execmode.trace = true;
40             break;
41         case 'T':
42             execmode.trace = true;
43             execmode.logical = true;
44             break;
45         case 'd':
46             execmode.dump = true;
47             break;
48         case 'm':
49             execmode.monitor = 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     /* エラーの定義 */
69     cerr_init();
70     addcerrlist_load();
71     addcerrlist_exec();
72
73     if(argv[optind] == NULL) {
74         setcerr(211, "");    /* object file not specified */
75         fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg);
76         goto fin;
77     }
78     reset(memsize, clocks);     /* COMET II仮想マシンのリセット */
79     execptr->start = 0;
80     if((execptr->end = loadassemble(argv[optind], execptr->start)) > 0 && cerr->num == 0) {
81         exec();                 /* プログラム実行 */
82     }
83     shutdown();                 /* COMET II仮想マシンのシャットダウン */
84 fin:
85     stat = (cerr->num == 0) ? 0 : 1;
86     freecerr();                 /* エラーの解放 */
87     return stat;
88 }