|
|
1.1.1.2 ! root 1: /* $Header: /cvsroot/src/sys/netiso/xebec/main.c,v 1.1 1993/04/09 12:02:09 cgd Exp $ */ ! 2: /* $Source: /cvsroot/src/sys/netiso/xebec/main.c,v $ */ 1.1 root 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.