YACAL2: CASL2処理系
[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 /* 指定されたファイルにCOMET II仮想メモリ(アセンブル結果)を書込 */
8 void outassemble(char *file) {
9     FILE *fp;
10     if((fp = fopen(file, "w")) == NULL) {
11         perror(file);
12         return;
13     }
14     fwrite(memory, sizeof(WORD), endptr, fp);
15     fclose(fp);
16 }
17
18 static struct option longopts[] = {
19     {"trace", no_argument, NULL, 't'},
20     {"tracearithmetic", no_argument, NULL, 't'},
21     {"tracelogical", no_argument, NULL, 'T'},
22     {"dump", no_argument, NULL, 'd'},
23     {"source", no_argument, NULL, 's'},
24     {"label", no_argument, NULL, 'l'},
25     {"assembledetail", no_argument, NULL, 'a'},    
26     {"onlyassemble", optional_argument, NULL, 'o'},
27     {"assembledetailonly", no_argument, NULL, 'A'},
28     {"help", no_argument, NULL, 'h'},
29     {0, 0, 0, 0}
30 };
31
32 int main(int argc, char *argv[])
33 {
34     int opt, i;
35     PASS pass;
36     bool status = false;
37     WORD beginptr[argc];
38     char *objfile = NULL;
39     const char *usage = "Usage: %s [-tTdslaAh] [-o <OUTFILE>] FILE ...\n";
40
41     while((opt = getopt_long(argc, argv, "tTdslao:Ah", longopts, NULL)) != -1) {
42         switch(opt) {
43         case 't':
44             tracemode = true;
45             break;
46         case 'T':
47             tracemode = true;
48             logicalmode = true;
49             break;
50         case 'd':
51             dumpmode = true;
52             break;
53         case 's':
54             srcmode = true;
55             break;
56         case 'l':
57             labelmode = true;
58             break;
59         case 'a':
60             asdetailmode = true;
61             break;
62         case 'o':
63             onlyassemblemode = true;
64             if(optarg != NULL) {
65                 objfile = strdup(optarg);
66             }
67             break;
68         case 'A':
69             onlyassemblemode = true;
70             objfile = NULL;
71             asdetailmode = true;
72             break;
73         case 'h':
74             fprintf(stdout, usage, argv[0]);
75             exit(-1);
76         case '?':
77             fprintf(stderr, usage, argv[0]);
78             exit(-1);
79         }
80     }
81     /* アセンブル。ラベル表作成のため、2回行う */
82     for(pass = FIRST; pass <= SECOND; pass++) {
83         for(i = optind; i < argc; i++) {
84             /* データの格納開始位置 */
85             if(pass == FIRST) {
86                 beginptr[i] = ptr;
87             } else if(pass == SECOND) {
88                 ptr = beginptr[i];
89             }
90             if(tracemode == true || dumpmode == true || srcmode == true ||
91                labelmode == true || asdetailmode == true) {
92                 fprintf(stdout, "\nAssemble %s (%d)\n", argv[i], pass);
93             }
94             if((status = assemble(argv[i], pass)) == false) {
95                 freelabel();    /* ラベル表の解放 */
96                 if(cerrno > 0) {
97                     freecerr();    /* エラーの解放 */
98                 }
99                 exit(-1);
100             }
101         }
102         if(pass == FIRST && labelmode == true) {
103             fprintf(stdout, "\nLabel::::\n");
104             printlabel();
105         }
106     }
107     freelabel();    /* ラベル表の解放 */
108     if(status == true) {
109         if(onlyassemblemode) {
110             if(objfile != NULL) {
111                 outassemble(objfile);
112             }
113         } else {
114             exec();    /* プログラム実行 */
115         }
116     }
117     if(cerrno > 0) {
118         freecerr();
119         exit(-1);
120     }
121     return 0;
122 }