4154e9c602f4c2cafe1889ce9dfb46728e088dd7
[YACASL2.git] / comet2monitor.c
1 #include "package.h"
2 #include "exec.h"
3
4 /**
5  * comet2monitorコマンドのオプション
6  */
7 static struct option longopts[] = {
8     {"memorysize", required_argument, NULL, 'M'},
9     {"clocks", required_argument, NULL, 'C'},
10     {"version", no_argument, NULL, 'v' },
11     {"help", no_argument, NULL, 'h'},
12     {0, 0, 0, 0},
13 };
14
15 /**
16  * @brief comet2コマンドのメイン
17  *
18  * @return 正常終了時は0、異常終了時は1
19  *
20  * @param argc コマンドライン引数の数
21  * @param *argv[] コマンドライン引数の配列
22  */
23 int main(int argc, char *argv[])
24 {
25     int memsize = DEFAULT_MEMSIZE, clocks = DEFAULT_CLOCKS;
26     int opt, stat = 0;
27     const char *version = PACKAGE_VERSION,  *cmdversion = "comet2monitor: COMET II machine code monitor of YACASL2 version %s\n";
28     const char *usage = "Usage: %s [-vh] [-M <MEMORYSIZE>] [-C <CLOCKS>]\n";
29
30     /* オプションの処理 */
31     while((opt = getopt_long(argc, argv, "M:C:vh", longopts, NULL)) != -1) {
32         switch(opt) {
33         case 'M':
34             memsize = atoi(optarg);
35             break;
36         case 'C':
37             clocks = atoi(optarg);
38             break;
39         case 'v':
40             fprintf(stdout, cmdversion, version);
41             return 0;
42         case 'h':
43             fprintf(stdout, usage, argv[0]);
44             return 0;
45         case '?':
46             fprintf(stderr, usage, argv[0]);
47             exit(1);
48         }
49     }
50     /* エラーの定義 */
51     cerr_init();
52     addcerrlist_load();
53     addcerrlist_exec();
54
55     create_cmdtable(HASH_CMDTYPE);
56     reset(memsize, clocks);     /* COMET II仮想マシンのリセット */
57     execptr->start = 0;
58     execmode.monitor = true;
59     exec();                     /* プログラム実行 */
60
61     shutdown();
62     free_cmdtable(HASH_CMDTYPE);
63     free_cmdtable(HASH_CODE);
64     stat = (cerr->num == 0) ? 0 : 1;
65     freecerr();                 /* エラーの解放 */
66     return stat;
67 }