Merge branch 'master'
[YACASL2.git] / src / 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 casl2のエラー定義
17  */
18 CERR cerr_comet2monitor[] = {
19     { 401, "invalid option" },
20 };
21
22 void addcerrlist_comet2monitor()
23 {
24     addcerrlist(ARRAYSIZE(cerr_comet2monitor), cerr_comet2monitor);
25 }
26
27 /**
28  * @brief comet2monitorコマンドのメイン
29  *
30  * @return 正常終了時は0、異常終了時は1
31  *
32  * @param argc コマンドライン引数の数
33  * @param *argv[] コマンドライン引数の配列
34  */
35 int main(int argc, char *argv[])
36 {
37     int memsize = DEFAULT_MEMSIZE;
38     int clocks = DEFAULT_CLOCKS;
39     int opt = 0;
40     int stat = 0;
41     const char *version = PACKAGE_VERSION;
42     const char *cmdversion = "comet2monitor: COMET II machine code monitor of YACASL2 version %s\n";
43     const char *usage = "Usage: %s [-vh] [-M <MEMORYSIZE>] [-C <CLOCKS>]\n";
44
45     /* エラーの定義 */
46     cerr_init();
47     addcerrlist_load();
48     addcerrlist_exec();
49     addcerrlist_comet2monitor();
50
51     /* オプションの処理 */
52     while((opt = getopt_long(argc, argv, "M:C:vh", longopts, NULL)) != -1) {
53         switch(opt) {
54         case 'M':
55             memsize = atoi(optarg);
56             break;
57         case 'C':
58             clocks = atoi(optarg);
59             break;
60         case 'v':
61             fprintf(stdout, cmdversion, version);
62             return 0;
63         case 'h':
64             fprintf(stdout, usage, argv[0]);
65             goto comet2monitorfin;
66         case '?':
67             fprintf(stderr, usage, argv[0]);
68             setcerr(212, "");    /* invalid option */
69             goto comet2monitorfin;
70         }
71     }
72     create_cmdtable(HASH_CMDTYPE);
73     reset(memsize, clocks);     /* COMET II仮想マシンのリセット */
74     execptr->start = 0;
75     execmode.monitor = true;
76     exec();                     /* プログラム実行 */
77     shutdown();
78 comet2monitorfin:
79     free_cmdtable(HASH_CMDTYPE);
80     free_cmdtable(HASH_CODE);
81     if(cerr->num > 0) {
82         stat = 1;
83     }
84     freecerr();                 /* エラーの解放 */
85     return stat;
86 }