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