|
|
1.1 root 1: /* $Header: main.c,v 2.4 88/09/19 12:55:13 nhall Exp $ */
2: /* $Source: /var/home/tadl/src/argo/xebec/RCS/main.c,v $ */
3: /*
4: * TODO:
5: * rewrite the command line stuff altogether - it's kludged beyond
6: * belief (as is the rest of the code...)
7: *
8: * DISCLAIMER DISCLAIMER DISCLAIMER
9: * This code is such a kludge that I don't want to put my name on it.
10: * It was a ridiculously fast hack and needs rewriting.
11: * However it does work...
12: */
13:
14: #include <stdio.h>
15: #include <strings.h>
16: #include "malloc.h"
17: #include "debug.h"
18: #include "main.h"
19:
20: int debug[128];
21:
22: int lineno = 1;
23:
24: FILE *statefile, *actfile, *eventfile_h, *statevalfile;
25: FILE *infile, *astringfile;
26: char *Transfilename;
27: char *astringfile_name = DEBUGFILE;
28: char *actfile_name = ACTFILE;
29: char *statefile_name = STATEFILE;
30: char *statevalfile_name = STATEVALFILE;
31: char *eventfile_h_name = EVENTFILE_H;
32: int print_trans = 0;
33: int print_protoerrs = 0;
34: int pgoption = 0;
35: char kerneldirname[50] = "\0";
36:
37: char protocol[50];
38:
39: char *synonyms[] = {
40: "EVENT",
41: "PCB",
42: 0
43: };
44:
45: usage(a)
46: char *a;
47: {
48: fprintf(stderr,
49: "usage: %s <transition file> {-D<debug options>} <other options>\n",
50: a);
51: fprintf(stderr, "\t<other options> is any combination of:\n");
52: fprintf(stderr, "\t\t-A<action file name>\n");
53: fprintf(stderr, "\t\t-E<event file name>\n");
54: fprintf(stderr, "\t\t-S<state file name>\n");
55: fprintf(stderr, "\t\t-I<initial values file name>\n");
56: fprintf(stderr, "\t\t-X<debugging file name>\n");
57: fprintf(stderr, "\t\t-K<directory name>\n");
58: fprintf(stderr,
59: "\tThese names do NOT include the suffices (.c, .h)\n");
60: fprintf(stderr,
61: "\t\t-D<options> to turn on debug options for xebec itself\n");
62: fprintf(stderr, "\t-<nn> for levels of debugging output\n");
63: fprintf(stderr, "\t\t<nn> ranges from 1 to 3, 1 is default(everything)\n");
64: fprintf(stderr, "\t\t-T to print transitions\n");
65: fprintf(stderr, "\t\t-e to print list of combinations of\n");
66: fprintf(stderr, "\t\t\t [event,old_state] that produce protocol errors\n");
67: fprintf(stderr, "\t\t-g include profiling code in driver\n");
68: Exit(-1);
69: }
70:
71: openfiles(proto)
72: register char *proto;
73: {
74: register char *junk;
75: register int lenp = strlen(proto);
76:
77: IFDEBUG(b)
78: fprintf(OUT, "openfiles %s\n",proto);
79: ENDDEBUG
80:
81: #define HEADER Header
82: #define SOURCE Source
83: #define DOIT(X)\
84: /* GAG */\
85: junk = Malloc( 2 + lenp + strlen(X/**/_name) );\
86: (void) sprintf(junk, "%s_", proto);\
87: X/**/_name = strcat(junk, X/**/_name);\
88: X = fopen(X/**/_name, "w");\
89: if((X)==(FILE *)0)\
90: { fprintf(stderr,"Open failed: %s\n", "X"); Exit(-1); }\
91: fprintf(X, "/* %cHeader%c */\n",'$', '$' );\
92: fprintf(X, "/* %cSource%c */\n",'$', '$' );
93:
94: DOIT(eventfile_h);
95:
96: IFDEBUG(X)
97: #ifdef DEBUG
98: DOIT(astringfile);
99: #endif DEBUG
100: fprintf(astringfile,
101: "#ifndef _NFILE\n#include <stdio.h>\n#endif _NFILE\n" );
102: ENDDEBUG
103:
104: DOIT(statevalfile);
105: DOIT(statefile);
106: DOIT(actfile);
107: fprintf(actfile,
108: "#ifndef lint\nstatic char *rcsid = \"$Header/**/$\";\n#endif lint\n");
109:
110: if(pgoption)
111: putdriver(actfile, 15);
112: else
113: putdriver(actfile, 14);
114:
115: FakeFilename(actfile, Transfilename, lineno);
116: putdriver(actfile, 1);
117: FakeFilename(actfile, Transfilename, lineno);
118: putdriver(actfile, 12);
119: fprintf(actfile, "#include \"%s%s\"\n", kerneldirname, statevalfile_name);
120: FakeFilename(actfile, Transfilename, lineno);
121: putdriver(actfile, 2);
122:
123: initsets(eventfile_h, statefile);
124: }
125:
126: includecode(file, f)
127: FILE *file;
128: register char *f;
129: {
130: register int count=1;
131: static char o='{';
132: static char c='}';
133: register char *g;
134:
135: IFDEBUG(a)
136: fprintf(stdout, "including: %s, f=0x%x", f,f);
137: ENDDEBUG
138: g = ++f;
139: while(count>0) {
140: if(*g == o) count++;
141: if(*g == c) count--;
142: g++;
143: }
144: *(--g) = '\0';
145: IFDEBUG(a)
146: fprintf(stdout, "derived: %s", f);
147: ENDDEBUG
148: fprintf(file, "%s", f);
149: FakeFilename(file, Transfilename, lineno);
150: }
151:
152: putincludes()
153: {
154: FakeFilename(actfile, Transfilename, lineno);
155: fprintf(actfile, "\n#include \"%s%s\"\n", kerneldirname, eventfile_h_name);
156: IFDEBUG(X)
157: if( !debug['K'] )
158: fprintf(actfile, "\n#include \"%s\"\n", astringfile_name);
159: /* not in kernel mode */
160: ENDDEBUG
161: FakeFilename(actfile, Transfilename, lineno);
162: }
163:
164: main(argc, argv)
165: int argc;
166: char *argv[];
167: {
168: register int i = 2;
169: extern char *strcpy();
170: int start, finish;
171: extern int FirstEventAttribute;
172: extern int Nevents, Nstates;
173:
174: start = time(0);
175: if(argc < 2) {
176: usage(argv[0]);
177: }
178: IFDEBUG(a)
179: fprintf(stdout, "infile = %s\n",argv[1]);
180: ENDDEBUG
181: Transfilename = argv[1];
182: infile = fopen(argv[1], "r");
183:
184: if(argc > 2) while(i < argc) {
185: register int j=0;
186: char c;
187: char *name;
188:
189: if(argv[i][j] == '-') j++;
190: switch(c = argv[i][j]) {
191:
192: /* GROT */
193: case 'A':
194: name = &argv[i][++j];
195: actfile_name = Malloc( strlen(name)+4);
196: actfile_name = (char *)strcpy(actfile_name,name);
197: #ifdef LINT
198: name =
199: #endif LINT
200: strcat(actfile_name, ".c");
201: fprintf(stdout, "debugging file is %s\n",actfile_name);
202: break;
203: case 'K':
204: debug[c]=1;
205: fprintf(OUT, "option %c file %s\n",c, &argv[i][j+1]);
206: (void) strcpy(kerneldirname,&argv[i][++j]);
207: break;
208: case 'X':
209: debug[c]=1;
210: name = &argv[i][++j];
211: astringfile_name = Malloc( strlen(name)+4);
212: astringfile_name = (char *)strcpy(astringfile_name,name);
213: #ifdef LINT
214: name =
215: #endif LINT
216: strcat(astringfile_name, ".c");
217: fprintf(OUT, "option %c, astringfile name %s\n",c, name);
218: break;
219: case 'E':
220: name = &argv[i][++j];
221: eventfile_h_name = Malloc( strlen(name)+4);
222: eventfile_h_name = (char *)strcpy(eventfile_h_name,name);
223: #ifdef LINT
224: name =
225: #endif LINT
226: strcat(eventfile_h_name, ".h");
227: fprintf(stdout, "event files is %s\n",eventfile_h_name);
228: break;
229: case 'I':
230: name = &argv[i][++j];
231: statevalfile_name = Malloc( strlen(name)+4 );
232: statevalfile_name = (char *)strcpy(statevalfile_name,name);
233: #ifdef LINT
234: name =
235: #endif LINT
236: strcat(statevalfile_name, ".init");
237: fprintf(stdout, "state table initial values file is %s\n",statevalfile_name);
238: break;
239: case 'S':
240: name = &argv[i][++j];
241: statefile_name = Malloc( strlen(name)+4);
242: statefile_name = (char *)strcpy(statefile_name,name);
243: #ifdef LINT
244: name =
245: #endif LINT
246: strcat(statefile_name, ".h");
247: fprintf(stdout, "state file is %s\n",statefile_name);
248: break;
249: /* END GROT */
250: case '1':
251: case '2':
252: case '3':
253: debug['X']= (int)argv[i][j] - (int) '0';
254: fprintf(OUT, "value of debug['X'] is 0x%x,%d\n", debug['X'],
255: debug['X']);
256: break;
257: case 'D':
258: while( c = argv[i][++j] ) {
259: if(c == 'X') {
260: fprintf(OUT, "debugging on");
261: if(debug['X']) fprintf(OUT,
262: " - overrides any -%d flags used\n", debug['X']);
263: }
264: debug[c]=1;
265: fprintf(OUT, "debug %c\n",c);
266: }
267: break;
268: case 'g':
269: pgoption = 1;
270: fprintf(stdout, "Profiling\n");
271: break;
272: case 'e':
273: print_protoerrs = 1;
274: fprintf(stdout, "Protocol error table:\n");
275: break;
276:
277: case 'T':
278: print_trans = 1;
279: fprintf(stdout, "Transitions:\n");
280: break;
281: default:
282: usage(argv[0]);
283: break;
284: }
285: i++;
286: }
287: if(kerneldirname[0]) {
288: char *c;
289: #ifdef notdef
290: if(debug['X']) {
291: fprintf(OUT, "Option K overrides option X\n");
292: debug['X'] = 0;
293: }
294: #endif notdef
295: if(strlen(kerneldirname)<1) {
296: fprintf(OUT, "K option: dir name too short!\n");
297: exit(-1);
298: }
299: /* add ../name/ */
300: c = (char *) Malloc(strlen(kerneldirname)+6) ;
301: if(c <= (char *)0) {
302: fprintf(OUT, "Cannot allocate %d bytes for kerneldirname\n",
303: strlen(kerneldirname + 6) );
304: fprintf(OUT, "kerneldirname is %s\n", kerneldirname );
305: exit(-1);
306: }
307: *c = '.';
308: *(c+1) = '.';
309: *(c+2) = '/';
310: (void) strcat(c, kerneldirname);
311: (void) strcat(c, "/\0");
312: strcpy(kerneldirname, c);
313: }
314:
315: init_alloc();
316:
317: (void) llparse();
318:
319: /* {{ */
320: if( !FirstEventAttribute )
321: fprintf(eventfile_h, "\t}ev_union;\n");
322: fprintf(eventfile_h, "};/* end struct event */\n");
323: fprintf(eventfile_h, "\n#define %s_NEVENTS 0x%x\n", protocol, Nevents);
324: fprintf(eventfile_h,
325: "\n#define ATTR(X)ev_union.%s/**/X/**/\n",EV_PREFIX);
326: (void) fclose(eventfile_h);
327:
328: /* {{ */ fprintf(actfile, "\t}\nreturn 0;\n}\n"); /* end switch; end action() */
329: dump_predtable(actfile);
330:
331: putdriver(actfile, 3);
332: IFDEBUG(X)
333: if(!debug['K'])
334: putdriver(actfile, 4);
335: ENDDEBUG
336: putdriver(actfile, 6);
337: IFDEBUG(X)
338: /*
339: putdriver(actfile, 10);
340: */
341: if(debug['K']) {
342: putdriver(actfile, 11);
343: } else {
344: switch(debug['X']) {
345: case 1:
346: default:
347: putdriver(actfile, 7);
348: break;
349: case 2:
350: putdriver(actfile, 13);
351: break;
352: case 3:
353: break;
354: }
355: }
356: ENDDEBUG
357: putdriver(actfile, 8);
358: (void) fclose(actfile);
359: IFDEBUG(X)
360: /* { */
361: fprintf(astringfile, "};\n");
362: (void) fclose(astringfile);
363: ENDDEBUG
364:
365: (void) fclose(statevalfile);
366:
367: fprintf(statefile, "\n#define %s_NSTATES 0x%x\n", protocol, Nstates);
368: (void) fclose(statefile);
369:
370: finish = time(0);
371: fprintf(stdout, "%d seconds\n", finish - start);
372: if( print_protoerrs )
373: printprotoerrs();
374: }
375:
376: int transno = 0;
377:
378: Exit(n)
379: {
380: fprintf(stderr, "Error at line %d\n",lineno);
381: if(transno) fprintf(stderr, "Transition number %d\n",transno);
382: (void) fflush(stdout);
383: (void) fflush(statefile);
384: (void) fflush(eventfile_h);
385: (void) fflush(actfile);
386: exit(n);
387: }
388:
389: syntax()
390: {
391: static char *synt[] = {
392: "*PROTOCOL <string>\n",
393: "*PCB <string> <optional: SYNONYM synonymstring>\n",
394: "<optional: *INCLUDE {\n<C source>\n} >\n",
395: "*STATES <string>\n",
396: "*EVENTS <string>\n",
397: "*TRANSITIONS <string>\n",
398: };
399: }
400:
401: FakeFilename(outfile, name, l)
402: FILE *outfile;
403: char *name;
404: int l;
405: {
406: /*
407: doesn't work
408: fprintf(outfile, "\n\n\n\n# line %d \"%s\"\n", l, name);
409: */
410: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.