* added compilers lcc and bcc (linux86)
[mascara-docs.git] / compilers / lcc / src / main.c
blob63b85f23aab8c273d90b69320a91b8fd44d3caa4
1 #include "c.h"
3 static char rcsid[] = "main.c - faked rcsid";
5 static void typestab(Symbol, void *);
7 static void stabline(Coordinate *);
8 static void stabend(Coordinate *, Symbol, Coordinate **, Symbol *, Symbol *);
9 Interface *IR = NULL;
11 int Aflag; /* >= 0 if -A specified */
12 int Pflag; /* != 0 if -P specified */
13 int glevel; /* == [0-9] if -g[0-9] specified */
14 int xref; /* != 0 for cross-reference data */
15 Symbol YYnull; /* _YYnull symbol if -n or -nvalidate specified */
16 Symbol YYcheck; /* _YYcheck symbol if -nvalidate,check specified */
18 static char *comment;
19 static Interface stabIR;
20 static char *currentfile; /* current file name */
21 static int currentline; /* current line number */
22 static FILE *srcfp; /* stream for current file, if non-NULL */
23 static int srcpos; /* position of srcfp, if srcfp is non-NULL */
24 int main(int argc, char *argv[]) {
25 int i, j;
26 for (i = argc - 1; i > 0; i--)
27 if (strncmp(argv[i], "-target=", 8) == 0)
28 break;
29 if (i > 0) {
30 char *s = strchr(argv[i], '\\');
31 if (s != NULL)
32 *s = '/';
33 for (j = 0; bindings[j].name && bindings[j].ir; j++)
34 if (strcmp(&argv[i][8], bindings[j].name) == 0) {
35 IR = bindings[j].ir;
36 break;
38 if (s != NULL)
39 *s = '\\';
41 if (!IR) {
42 fprint(stderr, "%s: unknown target", argv[0]);
43 if (i > 0)
44 fprint(stderr, " `%s'", &argv[i][8]);
45 fprint(stderr, "; must specify one of\n");
46 for (i = 0; bindings[i].name; i++)
47 fprint(stderr, "\t-target=%s\n", bindings[i].name);
48 exit(EXIT_FAILURE);
50 init(argc, argv);
51 t = gettok();
52 (*IR->progbeg)(argc, argv);
53 if (glevel && IR->stabinit)
54 (*IR->stabinit)(firstfile, argc, argv);
55 program();
56 if (events.end)
57 apply(events.end, NULL, NULL);
58 memset(&events, 0, sizeof events);
59 if (glevel || xref) {
60 Symbol symroot = NULL;
61 Coordinate src;
62 foreach(types, GLOBAL, typestab, &symroot);
63 foreach(identifiers, GLOBAL, typestab, &symroot);
64 src.file = firstfile;
65 src.x = 0;
66 src.y = lineno;
67 if ((glevel > 2 || xref) && IR->stabend)
68 (*IR->stabend)(&src, symroot,
69 ltov(&loci, PERM),
70 ltov(&symbols, PERM), NULL);
71 else if (IR->stabend)
72 (*IR->stabend)(&src, NULL, NULL, NULL, NULL);
74 finalize();
75 (*IR->progend)();
76 deallocate(PERM);
77 return errcnt > 0;
79 /* main_init - process program arguments */
80 void main_init(int argc, char *argv[]) {
81 char *infile = NULL, *outfile = NULL;
82 int i;
83 static int inited;
85 if (inited)
86 return;
87 inited = 1;
88 type_init(argc, argv);
89 for (i = 1; i < argc; i++)
90 if (strcmp(argv[i], "-g") == 0 || strcmp(argv[i], "-g2") == 0)
91 glevel = 2;
92 else if (strncmp(argv[i], "-g", 2) == 0) { /* -gn[,x] */
93 char *p = strchr(argv[i], ',');
94 glevel = atoi(argv[i]+2);
95 if (p) {
96 comment = p + 1;
97 if (glevel == 0)
98 glevel = 1;
99 if (stabIR.stabline == NULL) {
100 stabIR.stabline = IR->stabline;
101 stabIR.stabend = IR->stabend;
102 IR->stabline = stabline;
103 IR->stabend = stabend;
106 } else if (strcmp(argv[i], "-x") == 0)
107 xref++;
108 else if (strcmp(argv[i], "-A") == 0) {
109 ++Aflag;
110 } else if (strcmp(argv[i], "-P") == 0)
111 Pflag++;
112 else if (strcmp(argv[i], "-w") == 0)
113 wflag++;
114 else if (strcmp(argv[i], "-n") == 0) {
115 if (!YYnull) {
116 YYnull = install(string("_YYnull"), &globals, GLOBAL, PERM);
117 YYnull->type = func(voidptype, NULL, 1);
118 YYnull->sclass = EXTERN;
119 (*IR->defsymbol)(YYnull);
121 } else if (strncmp(argv[i], "-n", 2) == 0) { /* -nvalid[,check] */
122 char *p = strchr(argv[i], ',');
123 if (p) {
124 YYcheck = install(string(p+1), &globals, GLOBAL, PERM);
125 YYcheck->type = func(voidptype, NULL, 1);
126 YYcheck->sclass = EXTERN;
127 (*IR->defsymbol)(YYcheck);
128 p = stringn(argv[i]+2, p - (argv[i]+2));
129 } else
130 p = string(argv[i]+2);
131 YYnull = install(p, &globals, GLOBAL, PERM);
132 YYnull->type = func(voidptype, NULL, 1);
133 YYnull->sclass = EXTERN;
134 (*IR->defsymbol)(YYnull);
135 } else if (strcmp(argv[i], "-v") == 0)
136 fprint(stderr, "%s %s\n", argv[0], rcsid);
137 else if (strncmp(argv[i], "-s", 2) == 0)
138 density = strtod(&argv[i][2], NULL);
139 else if (strncmp(argv[i], "-errout=", 8) == 0) {
140 FILE *f = fopen(argv[i]+8, "w");
141 if (f == NULL) {
142 fprint(stderr, "%s: can't write errors to `%s'\n", argv[0], argv[i]+8);
143 exit(EXIT_FAILURE);
145 fclose(f);
146 f = freopen(argv[i]+8, "w", stderr);
147 assert(f);
148 } else if (strncmp(argv[i], "-e", 2) == 0) {
149 int x;
150 if ((x = strtol(&argv[i][2], NULL, 0)) > 0)
151 errlimit = x;
152 } else if (strncmp(argv[i], "-little_endian=", 15) == 0)
153 IR->little_endian = argv[i][15] - '0';
154 else if (strncmp(argv[i], "-mulops_calls=", 18) == 0)
155 IR->mulops_calls = argv[i][18] - '0';
156 else if (strncmp(argv[i], "-wants_callb=", 13) == 0)
157 IR->wants_callb = argv[i][13] - '0';
158 else if (strncmp(argv[i], "-wants_argb=", 12) == 0)
159 IR->wants_argb = argv[i][12] - '0';
160 else if (strncmp(argv[i], "-left_to_right=", 15) == 0)
161 IR->left_to_right = argv[i][15] - '0';
162 else if (strncmp(argv[i], "-wants_dag=", 11) == 0)
163 IR->wants_dag = argv[i][11] - '0';
164 else if (*argv[i] != '-' || strcmp(argv[i], "-") == 0) {
165 if (infile == NULL)
166 infile = argv[i];
167 else if (outfile == NULL)
168 outfile = argv[i];
171 if (infile != NULL && strcmp(infile, "-") != 0
172 && freopen(infile, "r", stdin) == NULL) {
173 fprint(stderr, "%s: can't read `%s'\n", argv[0], infile);
174 exit(EXIT_FAILURE);
176 if (outfile != NULL && strcmp(outfile, "-") != 0
177 && freopen(outfile, "w", stdout) == NULL) {
178 fprint(stderr, "%s: can't write `%s'\n", argv[0], outfile);
179 exit(EXIT_FAILURE);
182 /* typestab - emit stab entries for p */
183 static void typestab(Symbol p, void *cl) {
184 if (*(Symbol *)cl == 0 && p->sclass && p->sclass != TYPEDEF)
185 *(Symbol *)cl = p;
186 if ((p->sclass == TYPEDEF || p->sclass == 0) && IR->stabtype)
187 (*IR->stabtype)(p);
190 /* stabline - emit source code for source coordinate *cp */
191 static void stabline(Coordinate *cp) {
192 if (cp->file && cp->file != currentfile) {
193 if (srcfp)
194 fclose(srcfp);
195 currentfile = cp->file;
196 srcfp = fopen(currentfile, "r");
197 srcpos = 0;
198 currentline = 0;
200 if (currentline != cp->y && srcfp) {
201 char buf[512];
202 if (srcpos > cp->y) {
203 rewind(srcfp);
204 srcpos = 0;
206 for ( ; srcpos < cp->y; srcpos++)
207 if (fgets(buf, sizeof buf, srcfp) == NULL) {
208 fclose(srcfp);
209 srcfp = NULL;
210 break;
212 if (srcfp && srcpos == cp->y)
213 print("%s%s", comment, buf);
215 currentline = cp->y;
216 if (stabIR.stabline)
217 (*stabIR.stabline)(cp);
220 static void stabend(Coordinate *cp, Symbol p, Coordinate **cpp, Symbol *sp, Symbol *stab) {
221 if (stabIR.stabend)
222 (*stabIR.stabend)(cp, p, cpp, sp, stab);
223 if (srcfp)
224 fclose(srcfp);