e2d8cc5d1f0b567098209a8a133eac1fe37c044f
[YACASL2.git] / src / casl2.c
1 #include "casl2.h"
2 #include "assemble.h"
3 #include "exec.h"
4 #define _GNU_SOURCE
5 #include <getopt.h>
6
7 static struct option longopts[] =
8 {
9     {"source", no_argument, NULL, 's'},
10     {"label", no_argument, NULL, 'l'},
11     {"labelonly", no_argument, NULL, 'L'},
12     {"assembledetail", no_argument, NULL, 'a'},
13     {"assembledetailonly", no_argument, NULL, 'A'},
14     {"assembleout", optional_argument, NULL, 'o'},
15     {"assembleoutonly", optional_argument, NULL, 'O'},
16     {"trace", no_argument, NULL, 't'},
17     {"tracearithmetic", no_argument, NULL, 't'},
18     {"tracelogical", no_argument, NULL, 'T'},
19     {"dump", no_argument, NULL, 'd'},
20     {"memorysize", required_argument, NULL, 'M'},
21     {"clocks", required_argument, NULL, 'C'},
22     {"help", no_argument, NULL, 'h'},
23     {0, 0, 0, 0},
24 };
25
26 ASMODE asmode = {false, false, false, false, false};
27 EXECMODE execmode = {false, false, false};
28
29 /* 指定されたファイルにCOMET II仮想メモリ(アセンブル結果)を書込 */
30 void outassemble(char *file) {
31     FILE *fp;
32     if((fp = fopen(file, "w")) == NULL) {
33         perror(file);
34         exit(-1);
35     }
36     fwrite(memory, sizeof(WORD), endptr, fp);
37     fclose(fp);
38 }
39
40 int main(int argc, char *argv[])
41 {
42     int opt, i;
43     PASS pass;
44     bool status = false;
45     WORD beginptr[argc];
46     char *objfile = NULL;
47     const char *default_objfile = "a.o";
48     const char *usage =
49         "Usage: %s [-slLaAtTdh] [-oO<OUTFILE>] [-M <memorysize>] [-C <clocks>] FILE ...\n";
50
51     while((opt = getopt_long(argc, argv, "tTdslLao::O::AM:C:h", longopts, NULL)) != -1) {
52         switch(opt) {
53         case 's':
54             (&asmode)->srcmode = true;
55             break;
56         case 'l':
57             (&asmode)->labelmode = true;
58             break;
59         case 'L':
60             (&asmode)->labelmode = true;
61             (&asmode)->onlylabelmode = true;
62             break;
63         case 'a':
64             (&asmode)->asdetailmode = true;
65             break;
66         case 'A':
67             (&asmode)->onlyassemblemode = true;
68             (&asmode)->asdetailmode = true;
69             break;
70         case 'o':
71             if(optarg == NULL) {
72                 objfile = strdup(default_objfile);
73             } else {
74                 objfile = strdup(optarg);
75             }
76             break;
77         case 'O':
78             (&asmode)->onlyassemblemode = true;
79             if(optarg == NULL) {
80                 objfile = strdup(default_objfile);
81             } else {
82                 objfile = strdup(optarg);
83             }
84             break;
85         case 't':
86             (&execmode)->tracemode = true;
87             break;
88         case 'T':
89             (&execmode)->tracemode = true;
90             (&execmode)->logicalmode = true;
91             break;
92         case 'd':
93             (&execmode)->dumpmode = true;
94             break;
95         case 'M':
96             memsize = atoi(optarg);
97             break;
98         case 'C':
99             clocks = atoi(optarg);
100             break;
101         case 'h':
102             fprintf(stdout, usage, argv[0]);
103             return 0;
104         case '?':
105             fprintf(stderr, usage, argv[0]);
106             exit(-1);
107         }
108     }
109     if(argv[optind] == NULL) {
110         fprintf(stderr, "source file is not specified\n");
111         exit(-1);
112     }
113     /* ソースファイルが指定されていない場合は終了 */
114     reset();
115     /* アセンブル。ラベル表作成のため、2回行う */
116     for(pass = FIRST; pass <= SECOND; pass++) {
117         for(i = optind; i < argc; i++) {
118             /* データの格納開始位置 */
119             if(pass == FIRST) {
120                 beginptr[i] = ptr;
121             } else if(pass == SECOND) {
122                 ptr = beginptr[i];
123             }
124             if((&execmode)->tracemode == true || (&execmode)->dumpmode == true ||
125                (&asmode)->srcmode == true || (&asmode)->labelmode == true ||
126                (&asmode)->asdetailmode == true)
127             {
128                 fprintf(stdout, "\nAssemble %s (%d)\n", argv[i], pass);
129             }
130             if((status = assemble(argv[i], pass)) == false) {
131                 freelabel();    /* ラベル表の解放 */
132                 if(cerrno > 0) {
133                     freecerr();    /* エラーの解放 */
134                 }
135                 exit(-1);
136             }
137         }
138         if(pass == FIRST && (&asmode)->labelmode == true) {
139             fprintf(stdout, "\nLabel::::\n");
140             printlabel();
141             if((&asmode)->onlylabelmode == true) {
142                 return 0;
143             }
144         }
145     }
146     freelabel();    /* ラベル表の解放 */
147     if(status == true) {
148         if(objfile != NULL) {
149             outassemble(objfile);
150         }
151         if((&asmode)->onlyassemblemode == false) {
152             exec();    /* プログラム実行 */
153         }
154     }
155     if(cerrno > 0) {
156         freecerr();
157         exit(-1);
158     }
159     return 0;
160 }