Annotation of 43BSDReno/sys/netiso/xebec/main.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.