Annotation of 43BSDReno/sys/netiso/xebec/procs.c, revision 1.1.1.1

1.1       root        1: /* $Header: procs.c,v 2.3 88/09/19 12:55:22 nhall Exp $ */
                      2: /* $Source: /var/home/tadl/src/argo/xebec/RCS/procs.c,v $ */
                      3: /*
                      4:  * This code is such a kludge that I don't want to put my name on it.
                      5:  * It was a ridiculously fast hack and needs rewriting.
                      6:  * However it does work...
                      7:  */
                      8: 
                      9: #include <stdio.h>
                     10: #include <strings.h>
                     11: #include "malloc.h"
                     12: #include "main.h"
                     13: #include "debug.h"
                     14: #include "sets.h"
                     15: #include "procs.h"
                     16: 
                     17: struct Predicate {
                     18:        int p_index;
                     19:        int p_transno;
                     20:        char *p_str;
                     21:        struct Predicate *p_next;
                     22: };
                     23: 
                     24: struct Stateent {
                     25:        int s_index;
                     26:        int s_newstate;
                     27:        int s_action;
                     28:        struct Stateent *s_next;
                     29: };
                     30: 
                     31: struct Object *SameState = (struct Object *)-1;
                     32: int Index = 0;
                     33: int Nstates = 0;
                     34: int Nevents = 0;
                     35: struct Predicate **Predlist;
                     36: struct Stateent **Statelist;
                     37: extern FILE *astringfile;
                     38: 
                     39: end_events() {
                     40:        int size, part;
                     41:        char *addr;
                     42: 
                     43:        IFDEBUG(X)
                     44:                /* finish estring[], start astring[] */
                     45:        if(debug['X'] < 2 )
                     46:                fprintf(astringfile, "};\n\nchar *%s_astring[] = {\n\"NULLACTION\",\n",
                     47:                        protocol);
                     48:        ENDDEBUG
                     49:        /* NOSTRICT */
                     50:        Statelist = 
                     51:          (struct Stateent **) Malloc((Nstates+1) * sizeof(struct Statent *));
                     52:        /* NOSTRICT */
                     53:        Predlist =  
                     54:          (struct Predicate **) 
                     55:          Malloc ( (((Nevents)<<Eventshift)+Nstates)*sizeof(struct Predicate *) );
                     56: 
                     57:        size = (((Nevents)<<Eventshift)+Nstates)*sizeof(struct Predicate *) ;
                     58:        addr = (char *)Predlist;
                     59:        IFDEBUG(N)
                     60:                fprintf(OUT, "Predlist at 0x%x, sbrk 0x%x bzero size %d at addr 0x%x\n",
                     61:                Predlist, sbrk(0), size, addr);
                     62:        ENDDEBUG
                     63: #define BZSIZE 8192
                     64:        while(size) {
                     65:                part = size>BZSIZE?BZSIZE:size;
                     66:        IFDEBUG(N)
                     67:                fprintf(OUT, "bzero addr 0x%x part %d size %d\n",addr, part, size);
                     68:        ENDDEBUG
                     69:                bzero(addr, part);
                     70:        IFDEBUG(N)
                     71:                fprintf(OUT, "after bzero addr 0x%x part %d size %d\n",addr, part, size);
                     72:        ENDDEBUG
                     73:                addr += part;
                     74:                size -= part;
                     75: 
                     76:        }
                     77:        IFDEBUG(N)
                     78:                fprintf(OUT, "endevents..done \n");
                     79:        ENDDEBUG
                     80: }
                     81: 
                     82: int acttable(f,actstring)
                     83: char *actstring;
                     84: FILE *f;
                     85: {
                     86:        static Actindex = 0;
                     87:        extern FILE *astringfile;
                     88:        extern int pgoption;
                     89: 
                     90:        IFDEBUG(a)
                     91:                fprintf(OUT,"acttable()\n");
                     92:        ENDDEBUG
                     93:        fprintf(f, "case 0x%x: \n", ++Actindex);
                     94: 
                     95:        if(pgoption) {
                     96:                fprintf(f, "asm(\" # dummy statement\");\n");
                     97:                fprintf(f, "asm(\"_Xebec_action_%x: \");\n", Actindex );
                     98:                fprintf(f, "asm(\".data\");\n");
                     99:                fprintf(f, "asm(\".globl _Xebec_action_%x# X profiling\");\n",
                    100:                        Actindex );
                    101:                fprintf(f, "asm(\".long 0 # X profiling\");\n");
                    102:                fprintf(f, "asm(\".text # X profiling\");\n");
                    103:                fprintf(f, "asm(\"cas r0,r15,r0 # X profiling\");\n");
                    104:                fprintf(f, "asm(\"bali r15,mcount   # X profiling\");\n");
                    105:        }
                    106: 
                    107:        fprintf(f, "\t\t%s\n\t\t break;\n", actstring);
                    108:        IFDEBUG(X)
                    109:                if(debug['X']<2) {
                    110:                        register int len = 0;
                    111:                        fputc('"',astringfile);
                    112:                        while(*actstring) {
                    113:                                if( *actstring == '\n' ) {
                    114:                                        fputc('\\', astringfile);
                    115:                                        len++;
                    116:                                        fputc('n', astringfile);
                    117:                                } else if (*actstring == '\\') {
                    118:                                        fputc('\\', astringfile);
                    119:                                        len ++;
                    120:                                        fputc('\\', astringfile);
                    121:                                } else if (*actstring == '\"') {
                    122:                                        fputc('\\', astringfile);
                    123:                                        len ++;
                    124:                                        fputc('\"', astringfile);
                    125:                                } else fputc(*actstring, astringfile);
                    126:                                actstring++;
                    127:                                len++;
                    128:                        }
                    129:                        fprintf(astringfile,"\",\n");
                    130:                        if (len > LINELEN) {
                    131:                                fprintf(stderr, "Action too long: %d\n",len); Exit(-1);
                    132:                        }
                    133:                }
                    134:        ENDDEBUG
                    135: 
                    136:        return(Actindex);
                    137: }
                    138: 
                    139: static int Npred=0, Ndefpred=0, Ntrans=0, Ndefevent=0, Nnulla=0;
                    140: 
                    141: statetable(string, oldstate, newstate, action, event)
                    142: char *string;
                    143: int action;
                    144: struct Object *oldstate, *newstate, *event; 
                    145: {
                    146:        register int different;
                    147: 
                    148:        IFDEBUG(a)
                    149:                fprintf(OUT,"statetable(0x%x, 0x%x,0x%x, 0x%x)\n",
                    150:                        string, oldstate, newstate, action);
                    151:                fprintf(OUT,"statetable(%s, %s,%s, 0x%x)\n",
                    152:                        string, oldstate->obj_name, newstate->obj_name, action);
                    153:        ENDDEBUG
                    154: 
                    155:        if( !action) Nnulla++;
                    156:        if( newstate->obj_kind == OBJ_SET) {
                    157:                fprintf(stderr, "Newstate cannot be a set\n");
                    158:                Exit(-1);
                    159:        }
                    160:        different = (newstate != SameState);
                    161: 
                    162:        (void) predtable( oldstate, event, string,
                    163:                                action, (newstate->obj_number) * different );
                    164:        IFDEBUG(a)
                    165:                fprintf(OUT,"EXIT statetable\n");
                    166:        ENDDEBUG
                    167: }
                    168: 
                    169: stateentry(index, oldstate, newstate, action)
                    170: int index, action;
                    171: int oldstate, newstate; 
                    172: {
                    173:        extern FILE *statevalfile;
                    174: 
                    175:        IFDEBUG(a)
                    176:                fprintf(OUT,"stateentry(0x%x,0x%x,0x%x,0x%x) Statelist@0x%x, val 0x%x\n",
                    177:                        index, oldstate, newstate,action, &Statelist, Statelist);
                    178:        ENDDEBUG
                    179: 
                    180: 
                    181:        fprintf(statevalfile, "{0x%x,0x%x},\n", newstate, action);
                    182: }
                    183: 
                    184: int predtable(os, oe, str, action, newstate)
                    185: struct Object *os, *oe;
                    186: char *str;
                    187: int action, newstate;
                    188: {
                    189:        register struct Predicate *p, **q;
                    190:        register int event, state;
                    191:        register struct Object *e, *s;
                    192:        struct Object *firste;
                    193: 
                    194:        if (oe == (struct Object *)0 ) {
                    195:                Ndefevent ++;
                    196:                fprintf(stderr, "DEFAULT EVENTS aren't implemented; trans ignored\n");
                    197:                return;
                    198:        }
                    199:        Ntrans++;
                    200:        IFDEBUG(g)
                    201:                fprintf(stdout,
                    202:                "PREDTAB: s %5s;  e %5s\n", os->obj_kind==OBJ_SET?"SET":"item",
                    203:                        oe->obj_kind==OBJ_SET?"SET":"item");
                    204:        ENDDEBUG
                    205:        if (os->obj_kind == OBJ_SET) s = os->obj_members;
                    206:        else s = os;
                    207:        if (oe->obj_kind == OBJ_SET) firste = oe->obj_members;
                    208:        else firste = oe;
                    209:        if(newstate) {
                    210:                fprintf(statevalfile, "{0x%x,0x%x},\n",newstate, action);
                    211:                Index++;
                    212:        }
                    213:        while (s) {
                    214:                if( !newstate ) { /* !newstate --> SAME */
                    215:                        /* i.e., use old obj_number */
                    216:                        fprintf(statevalfile, "{0x%x,0x%x},\n",s->obj_number, action);
                    217:                        Index++;
                    218:                }
                    219:                e = firste;
                    220:                while (e) {
                    221:                        event = e->obj_number; state = s->obj_number;
                    222:                        IFDEBUG(g)
                    223:                                fprintf(stdout,"pred table event=0x%x, state 0x%x\n",
                    224:                                event, state);
                    225:                                fflush(stdout);
                    226:                        ENDDEBUG
                    227:                        if( !str /* DEFAULT PREDICATE */) {
                    228:                                Ndefpred++;
                    229:                                IFDEBUG(g)
                    230:                                        fprintf(stdout,
                    231:                                        "DEFAULT pred state 0x%x, event 0x%x, Index 0x%x\n",
                    232:                                        state, event, Index);
                    233:                                        fflush(stdout);
                    234:                                ENDDEBUG
                    235:                        } else 
                    236:                                Npred++;
                    237:                        /* put at END of list */
                    238: #ifndef LINT
                    239:                        IFDEBUG(g)
                    240:                                fprintf(stdout, 
                    241:                                "predicate for event 0x%x, state 0x%x is 0x%x, %s\n", 
                    242:                                event, state, Index, str);
                    243:                                fflush(stdout);
                    244:                        ENDDEBUG
                    245: #endif LINT
                    246:                        for( ((q = &Predlist[(event<<Eventshift)+state]), 
                    247:                                         (p = Predlist[(event<<Eventshift)+state]));
                    248:                                                        p ; p = p->p_next ) {
                    249:                                q = &p->p_next;
                    250:                        }
                    251: 
                    252:                        p = (struct Predicate *)Malloc(sizeof(struct Predicate));
                    253:                        p->p_next = (struct Predicate *)0;
                    254:                        p->p_str = str;
                    255:                        p->p_index = Index;
                    256:                        p->p_transno = transno;
                    257:                        *q = p;
                    258: 
                    259:                        IFDEBUG(g)
                    260:                                fprintf(stdout, 
                    261:                                  "predtable index 0x%x, transno %d, E 0x%x, S 0x%x\n",
                    262:                                         Index, transno, e, s);
                    263:                        ENDDEBUG
                    264: 
                    265:                        e = e->obj_members;
                    266:                }
                    267:                s = s->obj_members;
                    268:        }
                    269:        return Index ;
                    270: }
                    271: 
                    272: printprotoerrs()
                    273: {
                    274:        register int e,s;
                    275: 
                    276:        fprintf(stderr, "[ Event, State ] without any transitions :\n");
                    277:        for(e = 0; e < Nevents; e++) { 
                    278:                fprintf(stderr, "Event 0x%x: states ", e);
                    279:                for(s = 0; s < Nstates; s++) {
                    280:                        if( Predlist[(e<<Eventshift)+s] == 0 )
                    281:                                fprintf(stderr, "0x%x ", s);
                    282:                }
                    283:                fprintf(stderr, "\n");
                    284:        }
                    285: }
                    286: 
                    287: #ifndef LINT
                    288: dump_predtable(f)
                    289: FILE *f;
                    290: {
                    291:        struct Predicate *p;
                    292:        register int e,s, hadapred;
                    293:        int defaultindex;
                    294:        int defaultItrans;
                    295:        extern int bytesmalloced;
                    296:        extern int byteswasted;
                    297: 
                    298: #ifdef notdef
                    299:        fprintf(stdout,
                    300:                " Xebec used %8d bytes of storage, wasted %8d bytes\n", 
                    301:                bytesmalloced, byteswasted);
                    302: #endif notdef
                    303:        fprintf(stdout, 
                    304:                " %8d states\n %8d events\n %8d transitions\n",
                    305:                Nstates, Nevents, Ntrans);
                    306:        fprintf(stdout,
                    307:                " %8d predicates\n %8d default predicates used\n",
                    308:                Npred, Ndefpred);
                    309:        fprintf(stdout,
                    310:                " %8d null actions\n",
                    311:                Nnulla);
                    312: 
                    313:        putdriver(f, 5);
                    314:        for(e = 0; e < Nevents; e++) { for(s = 0; s < Nstates; s++) {
                    315:                p = Predlist[(e<<Eventshift)+s];
                    316:                hadapred=0;
                    317:                defaultindex=0;
                    318:                defaultItrans=0;
                    319:                if(p) {
                    320:                        IFDEBUG(d)
                    321:                                fflush(f);
                    322:                        ENDDEBUG
                    323:                        while(p) {
                    324:                                if(p->p_str) {
                    325:                                        if(!hadapred)
                    326:                                                fprintf(f, "case 0x%x:\n\t", (e<<Eventshift) + s);
                    327:                                        hadapred = 1;
                    328:                                        fprintf(f, "if %s return 0x%x;\n\t else ", 
                    329:                                        p->p_str, p->p_index);
                    330:                                } else {
                    331:                                        if(defaultindex) {
                    332:                                                fprintf(stderr, 
                    333: "\nConflict between transitions %d and %d: duplicate default \n",
                    334:                                                p->p_transno, defaultItrans);
                    335:                                                Exit(-1);
                    336:                                        }
                    337:                                        defaultindex = p->p_index;
                    338:                                        defaultItrans = p->p_transno;
                    339:                                }
                    340:                                p = p->p_next;
                    341:                        }
                    342:                        if( hadapred)  {
                    343:                                fprintf(f, "return 0x%x;\n", defaultindex);
                    344:                        }
                    345:                        IFDEBUG(d)
                    346:                                fflush(f);
                    347:                        ENDDEBUG
                    348:                } 
                    349:                IFDEBUG(g)
                    350:                fprintf(stdout, 
                    351:                "loop: e 0x%x s 0x%x hadapred 0x%x dindex 0x%x for trans 0x%x\n",
                    352:                        e, s, hadapred, defaultindex, defaultItrans);
                    353:                ENDDEBUG
                    354:                if ( hadapred ) {
                    355:                        /* put a -1 in the array  - Predlist is temporary storage */
                    356:                        Predlist[(e<<Eventshift)+s] = (struct Predicate *)(-1);
                    357:                } else {
                    358:                        /* put defaultindex in the array */
                    359:                        /* if defaultindex is zero, then the driver will
                    360:                         * cause an erroraction (same as if no default
                    361:                         * were given and none of the predicates were true;
                    362:                         * also same as if no preds or defaults were given
                    363:                         * for this combo)
                    364:                         */
                    365:                        Predlist[(e<<Eventshift)+s] = (struct Predicate *)(defaultindex);
                    366:                }
                    367:        } }
                    368:        fprintf(f, "default: return 0;\n} /* end switch */\n");
                    369: #ifdef notdef
                    370:        fprintf(f, "/*NOTREACHED*/return 0;\n} /* _Xebec_index() */\n");
                    371: #else notdef
                    372:        fprintf(f, "} /* _Xebec_index() */\n");
                    373: #endif notdef
                    374:        fprintf(f, "static int inx[%d][%d] = { {", Nevents+1,Nstates);
                    375:        for(s = 0; s< Nstates; s++) fprintf(f, "0,"); /* event 0 */
                    376:        fprintf(f, "},\n");
                    377: 
                    378:        for(e = 0; e < Nevents; e++) { 
                    379:                fprintf(f, " {"); 
                    380:                for(s = 0; s < Nstates; s++) {
                    381:                        register struct Predicate *xyz = Predlist[(e<<Eventshift)+s];
                    382:                        /* this kludge is to avoid a lint msg. concerning
                    383:                         * loss of bits 
                    384:                         */
                    385:                        if (xyz == (struct Predicate *)(-1))
                    386:                                fprintf(f, "-1,");
                    387:                        else
                    388:                                fprintf(f, "0x%x,", Predlist[(e<<Eventshift)+s]);
                    389:                }
                    390:                fprintf(f, " },\n"); 
                    391:        }
                    392:        fprintf(f, "};");
                    393: }
                    394: #endif LINT
                    395: 
                    396: char *
                    397: stash(buf)
                    398: char *buf;
                    399: {
                    400:        register int len;
                    401:        register char *c;
                    402: 
                    403:        /* grot */
                    404:        len = strlen(buf);
                    405:        c = Malloc(len+1);
                    406: #ifdef LINT
                    407:        c =
                    408: #endif LINT
                    409:        strcpy(c, buf);
                    410: 
                    411:        IFDEBUG(z)
                    412:                fprintf(stdout,"stash %s at 0x%x\n", c,c);
                    413:        ENDDEBUG
                    414:        return(c);
                    415: }
                    416: 
                    417: #ifdef notdef
                    418: dump_pentry(event,state)
                    419: int event,state;
                    420: {
                    421:        register struct Predicate *p, **q;
                    422: 
                    423:        for( 
                    424:        ((q = &Predlist[(event<<Eventshift) +state]), 
                    425:         (p = Predlist[(event<<Eventshift) + state]));
                    426:                p!= (struct Predicate *)0 ; p = p->p_next ) {
                    427: #ifndef LINT
                    428:                IFDEBUG(a)
                    429:                        fprintf(OUT, 
                    430:                        "dump_pentry for event 0x%x, state 0x%x is 0x%x\n", 
                    431:                         event, state, p);
                    432:                ENDDEBUG
                    433: #endif LINT
                    434:                q = &p->p_next;
                    435:        }
                    436: }
                    437: #endif notdef

unix.superglobalmegacorp.com

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