This source file includes following definitions.
- addcerrlist_casl2
- objfile_name
- main
1 #define _GNU_SOURCE
2 #include "package.h"
3 #include "assemble.h"
4 #include "exec.h"
5
6
7
8
9
10 void addcerrlist_casl2();
11
12
13
14
15
16
17
18
19 char *objfile_name(const char *name);
20
21
22
23
24 static struct option longopts[] = {
25 { "source", no_argument, NULL, 's' },
26 { "label", no_argument, NULL, 'l' },
27 { "labelonly", no_argument, NULL, 'L' },
28 { "assembledetail", no_argument, NULL, 'a' },
29 { "assembledetailonly", no_argument, NULL, 'A' },
30 { "assembleout", optional_argument, NULL, 'o' },
31 { "assembleoutonly", optional_argument, NULL, 'O' },
32 { "trace", no_argument, NULL, 't' },
33 { "tracearithmetic", no_argument, NULL, 't' },
34 { "tracelogical", no_argument, NULL, 'T' },
35 { "dump", no_argument, NULL, 'd' },
36 { "monitor", no_argument, NULL, 'm' },
37 { "memorysize", required_argument, NULL, 'M' },
38 { "clocks", required_argument, NULL, 'C' },
39 { "version", no_argument, NULL, 'v' },
40 { "help", no_argument, NULL, 'h' },
41 { 0, 0, 0, 0 },
42 };
43
44
45
46
47 CERR cerr_casl2[] = {
48 { 126, "no source file" },
49 { 127, "invalid option" },
50 };
51
52 void addcerrlist_casl2()
53 {
54 addcerrlist(ARRAYSIZE(cerr_casl2), cerr_casl2);
55 }
56
57 char *objfile_name(const char *name)
58 {
59 const char *default_name = "a.o";
60 return strdup_chk(
61 (name == NULL || !name[0]) ? default_name : name,
62 "objfile_name"
63 );
64 }
65
66
67
68
69
70
71
72
73
74 int main(int argc, char *argv[])
75 {
76 int memsize = DEFAULT_MEMSIZE;
77 int clocks = DEFAULT_CLOCKS;
78 int opt = 0;
79 int stat = 0;
80 int asfilecnt = 0;
81 char **asfile = NULL;
82 char *objfile = NULL;
83 const char *version = PACKAGE_VERSION;
84 const char *cmdversion = "casl2 of YACASL2 version %s\n";
85 const char *usage =
86 "Usage: %s [-slLaAtTdmvh] [-oO[<OBJECTFILE>]] [-M <MEMORYSIZE>] [-C <CLOCKS>] FILE1[ FILE2 ...]\n";
87
88
89 cerr_init();
90 addcerrlist_casl2();
91 addcerrlist_assemble();
92 addcerrlist_exec();
93
94
95 while((opt = getopt_long(argc, argv, "tTdslLmao::O::AM:C:vh", longopts, NULL)) != -1) {
96 switch(opt) {
97 case 's':
98 asmode.src = true;
99 break;
100 case 'l':
101 asmode.label = true;
102 break;
103 case 'L':
104 asmode.label = true;
105 asmode.onlylabel = true;
106 break;
107 case 'a':
108 asmode.asdetail = true;
109 break;
110 case 'A':
111 asmode.asdetail = true;
112 asmode.onlyassemble = true;
113 break;
114 case 'o':
115 objfile = objfile_name(optarg);
116 break;
117 case 'O':
118 asmode.onlyassemble = true;
119 objfile = objfile_name(optarg);
120 break;
121 case 't':
122 execmode.trace = true;
123 break;
124 case 'T':
125 execmode.trace = true;
126 execmode.logical = true;
127 break;
128 case 'd':
129 execmode.dump = true;
130 break;
131 case 'm':
132 execmode.step = true;
133 break;
134 case 'M':
135 if((memsize = memsize_str2word(optarg)) == 0) {
136 goto casl2fin;
137 }
138 break;
139 case 'C':
140 if((clocks = clock_str2clock(optarg)) == 0) {
141 goto casl2fin;
142 }
143 break;
144 case 'v':
145 fprintf(stdout, cmdversion, version);
146 goto casl2fin;
147 case 'h':
148 fprintf(stdout, usage, argv[0]);
149 goto casl2fin;
150 case '?':
151 fprintf(stderr, usage, argv[0]);
152 setcerr(212, "");
153 goto casl2fin;
154 }
155 }
156
157
158 if(argv[optind] == NULL) {
159 setcerr(126, "");
160 fprintf(stderr, "casl2 error - %d: %s\n", cerr->num, cerr->msg);
161 goto casl2fin;
162 }
163 create_cmdtable(HASH_CMDTYPE);
164 comet2_init(memsize, clocks);
165 asfilecnt = argc - optind;
166 asfile = calloc_chk(asfilecnt, sizeof(char *), "asfile");
167 for(int i = 0; i < asfilecnt; i++) {
168 asfile[i] = argv[optind + i];
169 }
170
171 if(assemble(asfilecnt, asfile, 0) == false || asmode.onlylabel == true) {
172 goto shutdown;
173 }
174
175 if(objfile != NULL) {
176 outassemble(objfile);
177 }
178
179 if(asmode.onlyassemble == false) {
180 exec();
181 }
182 shutdown:
183 comet2_shutdown();
184 casl2fin:
185 FREE(objfile);
186 FREE(asfile);
187 free_cmdtable(HASH_CMDTYPE);
188 if(cerr->num > 0) {
189 stat = 1;
190 }
191 freecerr();
192 return stat;
193 }