Merge branch 'master'
[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     {"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 /**
22  * @brief comet2のエラー定義
23  */
24 CERR cerr_comet2[] = {
25     { 127, "invalid option" },
26 };
27
28 void addcerrlist_comet2()
29 {
30     addcerrlist(ARRAYSIZE(cerr_comet2), cerr_comet2);
31 }
32
33 /**
34  * @brief comet2コマンドのメイン
35  *
36  * @return 正常終了時は0、異常終了時は1
37  *
38  * @param argc コマンドライン引数の数
39  * @param *argv[] コマンドライン引数の配列
40  */
41 int main(int argc, char *argv[])
42 {
43     int memsize = DEFAULT_MEMSIZE;
44     int clocks = DEFAULT_CLOCKS;
45     int opt = 0;
46     int stat = 0;
47     const char *version = PACKAGE_VERSION;
48     const char *cmdversion = "comet2 of YACASL2 version %s\n";
49     const char *usage = "Usage: %s [-tTdmvh] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE\n";
50
51     /* エラーの定義 */
52     cerr_init();
53     addcerrlist_comet2();
54     addcerrlist_load();
55     addcerrlist_exec();
56
57     /* オプションの処理 */
58     while((opt = getopt_long(argc, argv, "tTdmM:C:vh", longopts, NULL)) != -1) {
59         switch(opt) {
60         case 't':
61             execmode.trace = true;
62             break;
63         case 'T':
64             execmode.trace = true;
65             execmode.logical = true;
66             break;
67         case 'd':
68             execmode.dump = true;
69             break;
70         case 'm':
71             execmode.monitor = true;
72             break;
73         case 'M':
74             memsize = atoi(optarg);
75             break;
76         case 'C':
77             clocks = atoi(optarg);
78             break;
79         case 'v':
80             fprintf(stdout, cmdversion, version);
81             goto comet2fin;
82         case 'h':
83             fprintf(stdout, usage, argv[0]);
84             goto comet2fin;
85         case '?':
86             fprintf(stderr, usage, argv[0]);
87             setcerr(212, "");    /* invalid option */
88             goto comet2fin;
89         }
90     }
91     if(argv[optind] == NULL) {
92         setcerr(211, "");    /* object file not specified */
93         fprintf(stderr, "comet2 error - %d: %s\n", cerr->num, cerr->msg);
94         goto comet2fin;
95     }
96     reset(memsize, clocks);     /* COMET II仮想マシンのリセット */
97     execptr->start = 0;
98     execptr->end = loadassemble(argv[optind], execptr->start);
99     if(execptr->end > 0 && cerr->num == 0) {
100         exec();                 /* プログラム実行 */
101     }
102     shutdown();                 /* COMET II仮想マシンのシャットダウン */
103 comet2fin:
104     if(cerr->num > 0) {
105         stat = 1;
106     }
107     freecerr();                 /* エラーの解放 */
108     return stat;
109 }