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

1.1       root        1: /* $Header: sets.c,v 2.3 88/09/19 12:55:30 nhall Exp $ */
                      2: /* $Source: /var/home/tadl/src/argo/xebec/RCS/sets.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: #include "main.h"
                      9: #include "malloc.h"
                     10: #include "sets.h"
                     11: #include "debug.h"
                     12: #include <stdio.h>
                     13: 
                     14: struct Object *CurrentEvent = (struct Object *)0;
                     15: struct Object *Objtree;
                     16: struct Object dummy;
                     17: /* 
                     18:  * define a set w/ type and name
                     19:  * return a set number 
                     20:  */
                     21: #undef NULL
                     22: #define NULL (struct Object *)0
                     23: 
                     24: static FILE *Sfile, *Efile;
                     25: extern FILE *astringfile;
                     26: char *Noname = "Unnamed set\0";
                     27: 
                     28: initsets(f,s)
                     29: FILE *f, *s;
                     30: {
                     31:        static char errorstring[20];
                     32:        extern struct Object *SameState;
                     33:        Efile = f;
                     34:        Sfile = s;
                     35: 
                     36:        IFDEBUG(X)
                     37:                fprintf(astringfile, "char *%s_sstring[] = {\n", protocol);
                     38:        ENDDEBUG
                     39:        sprintf(errorstring, "%sERROR\0", ST_PREFIX);
                     40:        defineitem(STATESET, errorstring, (char *)0);   /* state 0 */
                     41:        SameState = (struct Object *) Malloc( sizeof (struct Object) );
                     42:        SameState->obj_kind = OBJ_ITEM;
                     43:        SameState->obj_type = STATESET;
                     44:        SameState->obj_name = "SAME";
                     45:        SameState->obj_struc = (char *)0;
                     46:        SameState->obj_number = 0;
                     47:        SameState->obj_members = (struct Object *)0;
                     48:        SameState->obj_left = (struct Object *)0;
                     49:        SameState->obj_right = (struct Object *)0;
                     50:        SameState->obj_parent = (struct Object *)0;
                     51: }
                     52: 
                     53: /*
                     54:  * get a set based on its type and name
                     55:  * returns address of an Object, may be set or item
                     56:  */
                     57: 
                     58: struct Object *lookup(type, name)
                     59: unsigned char type;
                     60: char *name;
                     61: {
                     62:        register struct Object *p = Objtree;
                     63:        int val = 1 ;
                     64: 
                     65:        IFDEBUG(o)
                     66:                fprintf(stdout,"lookup 0x%x,%s \n",
                     67:                        type, name);
                     68:        ENDDEBUG
                     69: 
                     70:        while( p && val ) {
                     71:                IFDEBUG(o)
                     72:                fprintf(OUT, "lookup strcmp 0x%x,%s, 0x%x,%s\n",
                     73:                        name, name, OBJ_NAME(p), OBJ_NAME(p));
                     74:                ENDDEBUG
                     75:                if( p->obj_name == (char *)0 ) {
                     76:                        fprintf(stderr, "Unnamed set in table!\n");
                     77:                        Exit(-1);
                     78:                }
                     79:                val =  (int) strcmp(name, OBJ_NAME(p));
                     80:                if(val < 0) {
                     81:                        /* left */
                     82:                        p = p->obj_left;
                     83:                } else if (val > 0) {
                     84:                        /* right */
                     85:                        p = p->obj_right;
                     86:                }
                     87:        }
                     88:        if( p && ( p->obj_type != type)) {
                     89:                fprintf(stdout, "lookup(0x%x,%s) found wrong obj type 0x%x\n",
                     90:                        type,name, p->obj_type);
                     91:                p = NULL;
                     92:        }
                     93:        IFDEBUG(o)
                     94:                fprintf(stdout,"lookup 0x%x,%s returning 0x%x\n",type, name, p);
                     95:        ENDDEBUG
                     96:        return(p);
                     97: }
                     98: 
                     99: static int states_done  = 0;
                    100: 
                    101: end_states(f)
                    102: FILE *f;
                    103: {
                    104:        register unsigned n = Nstates;
                    105:        register int i;
                    106:        extern char Eventshiftstring[];
                    107: 
                    108:        states_done = 1;
                    109: 
                    110:        for( i = 0; ;i++) {
                    111:                if( (n >>= 1) <= 0 ) break;
                    112:        }
                    113:        Eventshift = i+1;
                    114:        IFDEBUG(d)
                    115:                fprintf(OUT, "Eventshift=%d\n", Eventshift);
                    116:        ENDDEBUG
                    117:        sprintf(Eventshiftstring, "%d\0",Eventshift);
                    118:        fprintf(f, "struct %s_event {\n\tint ev_number;\n", &protocol[0]);
                    119:        IFDEBUG(X)
                    120:                /* finish sstring[] & start estring[] */
                    121:                fprintf(astringfile, 
                    122:                "};\n\nchar *%s_estring[] = {\n", protocol);
                    123:        ENDDEBUG
                    124: }
                    125: 
                    126: int FirstEventAttribute = 1;
                    127: 
                    128: static 
                    129: insert(o) 
                    130: struct Object *o;
                    131: {
                    132:        struct Object *p = Objtree;
                    133:        struct Object **q = &Objtree; 
                    134:        int val=1;
                    135: 
                    136: 
                    137:        if (o->obj_name == (char *)0) {
                    138:                fprintf(stderr, "Internal Error: inserting unnamed object\n");
                    139:                Exit(-1);
                    140:        }
                    141:        if( o->obj_type == STATESET) {
                    142:                if( states_done )  {
                    143:                        fprintf(stderr, "No states may be defined after *TRANSITIONS\n");
                    144:                        Exit(-1);
                    145:                }
                    146:                o->obj_number =  Nstates++ ; 
                    147:                if(Nstates > MAXSTATES) {
                    148:                        fprintf(stderr, "Too many states\n");
                    149:                        Exit(-1);
                    150:                }
                    151:                fprintf(Sfile, "#define %s 0x%x\n", o->obj_name, o->obj_number);
                    152:                IFDEBUG(X)
                    153:                        fprintf(astringfile, "\"%s(0x%x)\",\n", o->obj_name, o->obj_number);
                    154:                ENDDEBUG
                    155:        } else {
                    156:                /* EVENTSET */ 
                    157:                if( ! states_done )  {
                    158:                        fprintf(stderr, "states must precede events\n");
                    159:                        Exit(-1);
                    160:                }
                    161:                o->obj_number =  Nevents++ ;
                    162:                if(Nevents > MAXEVENTS) {
                    163:                        fprintf(stderr, "Too many events\n");
                    164:                        Exit(-1);
                    165:                }
                    166:                if(o->obj_struc)  {
                    167:                        if( FirstEventAttribute ) {
                    168:                                fprintf(Efile,  "\n\tunion{\n"); /*} */
                    169:                                FirstEventAttribute = 0;
                    170:                        }
                    171:                        fprintf(Efile, 
                    172:                        "struct %s %s%s;\n\n", o->obj_struc, EV_PREFIX,  o->obj_name);
                    173:                }
                    174:                fprintf(Efile, "#define %s 0x%x\n", o->obj_name, o->obj_number);
                    175:                IFDEBUG(X)
                    176:                        fprintf(astringfile, "\"%s(0x%x)\",\n", o->obj_name, o->obj_number);
                    177:                ENDDEBUG
                    178:        }
                    179:        IFDEBUG(o)
                    180:                fprintf(OUT, "insert(%s)\n", OBJ_NAME(o) );
                    181:                if(o->obj_right != NULL) {
                    182:                        fprintf(OUT, "insert: unclean Object right\n");
                    183:                        exit(-1);
                    184:                }
                    185:                if(o->obj_left != NULL) {
                    186:                        fprintf(OUT, "insert: unclean Object left\n");
                    187:                        exit(-1);
                    188:                }
                    189:                fflush(OUT);
                    190:        ENDDEBUG
                    191: 
                    192:        while( val ) {
                    193:                if(p == NULL) {
                    194:                        *q = o;
                    195:                        o->obj_parent = (struct Object *)q;
                    196:                        break;
                    197:                }
                    198:                if(!(val = strcmp(o->obj_name, p->obj_name)) ) {
                    199:                        /* equal */
                    200:                        fprintf(stderr, "re-inserting %s\n",o->obj_name);
                    201:                        exit(-1);
                    202:                }
                    203:                if(val < 0) {
                    204:                        /* left */
                    205:                        q = &p->obj_left;
                    206:                        p = p->obj_left;
                    207:                } else {
                    208:                        /* right */
                    209:                        q = &p->obj_right;
                    210:                        p = p->obj_right;
                    211:                }
                    212:        }
                    213:        IFDEBUG(a)
                    214:                dumptree(Objtree,0);
                    215:        ENDDEBUG
                    216: }
                    217: 
                    218: delete(o) 
                    219: struct Object *o;
                    220: {
                    221:        register struct Object *p = o->obj_right; 
                    222:        register struct Object *q;
                    223:        register struct Object *newparent;
                    224:        register struct Object **np_childlink;
                    225: 
                    226:        IFDEBUG(T)
                    227:                fprintf(stdout, "delete(0x%x)\n", o);
                    228:                dumptree(Objtree,0);
                    229:        ENDDEBUG
                    230: 
                    231:        /* q <== lowest valued node of the right subtree */
                    232:        while( p ) {
                    233:                q = p;
                    234:                p = p->obj_left;
                    235:        }
                    236: 
                    237:        if (o->obj_parent == (struct Object *)&Objtree)  {
                    238:                newparent =  (struct Object *)&Objtree;
                    239:                np_childlink = (struct Object **)&Objtree;
                    240:        } else if(o->obj_parent->obj_left == o)  {
                    241:                newparent = o->obj_parent;
                    242:                np_childlink = &(o->obj_parent->obj_left);
                    243:        } else {
                    244:                newparent = o->obj_parent;
                    245:                np_childlink = &(o->obj_parent->obj_right);
                    246:        }
                    247:        IFDEBUG(T)
                    248:                fprintf(OUT, "newparent=0x%x\n");
                    249:        ENDDEBUG
                    250: 
                    251:        if (q) { /* q gets the left, parent gets the right */
                    252:                IFDEBUG(T)
                    253:                        fprintf(OUT, "delete: q null\n");
                    254:                ENDDEBUG
                    255:                q->obj_left = p;
                    256:                if(p) p->obj_parent = q;
                    257:                p = o->obj_right;
                    258:        } else { /* parent(instead of q) gets the left ; there is no right  */
                    259:                IFDEBUG(T)
                    260:                        fprintf(OUT, "delete: q not null\n");
                    261:                ENDDEBUG
                    262:                p = o->obj_left;
                    263:        }
                    264:        *np_childlink = p;
                    265:        if(p) 
                    266:                p->obj_parent = newparent;
                    267: 
                    268:        IFDEBUG(T)
                    269:                fprintf(OUT, "After deleting 0x%x\n",o);
                    270:                dumptree(Objtree,0);
                    271:        ENDDEBUG
                    272: }
                    273: 
                    274: struct Object *
                    275: defineset(type, adr, keep)
                    276: unsigned char type;
                    277: char *adr;
                    278: int keep;
                    279: {
                    280:        struct Object *onew;
                    281:        IFDEBUG(o)
                    282:                printf("defineset(0x%x,%s, %s)\n", type , adr, keep?"KEEP":"NO_KEEP");
                    283:        ENDDEBUG
                    284:        
                    285:        onew = (struct Object *)Malloc(sizeof (struct Object));
                    286:        bzero(onew, sizeof(struct Object));
                    287:        onew->obj_name = adr;
                    288:        onew->obj_kind = OBJ_SET;
                    289:        onew->obj_type = type;
                    290:        if(keep) 
                    291:                insert( onew );
                    292:                /* address already stashed before calling defineset */
                    293:        IFDEBUG(o)
                    294:                printf("defineset(0x%x,%s) returning 0x%x\n", type , adr, onew);
                    295:                dumptree(Objtree,0);
                    296:        ENDDEBUG
                    297:        return(onew);
                    298: }
                    299: 
                    300: dumpit(o, s)
                    301: char *o;
                    302: char *s;
                    303: {
                    304:        register int i;
                    305: 
                    306: IFDEBUG(o)
                    307:        fprintf(OUT, "object 0x%x, %s\n",o, s);
                    308:        for(i=0; i< sizeof(struct Object); i+=4) {
                    309:                fprintf(OUT, "0x%x: 0x%x 0x%x 0x%x 0x%x\n",
                    310:                *((int *)o), *o, *(o+1), *(o+2), *(o+3) );
                    311:        }
                    312: ENDDEBUG
                    313: }
                    314: 
                    315: defineitem(type, adr, struc)
                    316: unsigned char type;
                    317: char *adr;
                    318: char *struc;
                    319: {
                    320:        struct Object *onew;
                    321:        IFDEBUG(o)
                    322:                printf("defineitem(0x%x, %s at 0x%x, %s)\n", type, adr, adr, struc);
                    323:        ENDDEBUG
                    324:        
                    325:        if( onew = lookup( type, adr ) ) {
                    326:                fprintf(stderr, 
                    327:        "Internal error at defineitem: trying to redefine obj type 0x%x, adr %s\n",
                    328:                        type, adr);
                    329:                exit(-1);
                    330:        } else {
                    331:                onew = (struct Object *)Malloc(sizeof (struct Object));
                    332:                bzero(onew, sizeof(struct Object));
                    333:                onew->obj_name = stash(adr);
                    334:                onew->obj_kind = OBJ_ITEM;
                    335:                onew->obj_type =  type;
                    336:                onew->obj_struc = struc?stash(struc):struc;
                    337:                insert( onew );
                    338:        }
                    339:        IFDEBUG(o)
                    340:                fprintf(OUT, "defineitem(0x%x, %s) returning 0x%x\n", type, adr, onew);
                    341:        ENDDEBUG
                    342: }
                    343: 
                    344: member(o, adr)
                    345: struct Object *o;
                    346: char *adr;
                    347: {
                    348:        struct Object *onew, *oold;
                    349:        IFDEBUG(o)
                    350:                printf("member(0x%x, %s)\n", o, adr);
                    351:        ENDDEBUG
                    352:        
                    353:        oold = lookup(  o->obj_type, adr );
                    354: 
                    355:        onew = (struct Object *)Malloc(sizeof (struct Object));
                    356:        if( oold == NULL ) {
                    357:                extern int lineno;
                    358: 
                    359:                fprintf(stderr,
                    360:                "Warning at line %d: set definition of %s causes definition of\n",
                    361:                        lineno, OBJ_NAME(o));
                    362:                fprintf(stderr, "\t (previously undefined) member %s\n", adr);
                    363:                bzero(onew, sizeof(struct Object));
                    364:                onew->obj_name = stash(adr);
                    365:                onew->obj_kind = OBJ_ITEM;
                    366:                onew->obj_type = o->obj_type;
                    367:                onew->obj_members = NULL;
                    368:                insert( onew );
                    369:        } else {
                    370:                if(oold->obj_kind != OBJ_ITEM) {
                    371:                        fprintf(stderr, "Sets cannot be members of sets; %s\n", adr);
                    372:                        exit(-1);
                    373:                }
                    374:                bcopy(oold, onew, sizeof(struct Object));
                    375:                onew->obj_members = onew->obj_left = onew->obj_right = NULL;
                    376:        }
                    377:        onew->obj_members = o->obj_members;
                    378:        o->obj_members = onew;
                    379: }
                    380: 
                    381: struct Object *Lookup(type, name)
                    382: unsigned char type;
                    383: char *name;
                    384: {
                    385:        register struct Object *o = lookup(type,name);
                    386: 
                    387:        if(o == NULL) {
                    388:                fprintf(stderr, "Trying to use undefined %s: %s\n",
                    389:                        type==STATESET?"state":"event", name);
                    390:                Exit(-1);
                    391:        }
                    392:        return(o);
                    393: }
                    394: 
                    395: AddCurrentEventName(x)
                    396: register char **x;
                    397: {
                    398:        register char *n = EV_PREFIX; ;
                    399:        
                    400:        if( CurrentEvent == (struct Object *)0 ) {
                    401:                fprintf(stderr, "No event named!  BARF!\n"); Exit(-1);
                    402:        }
                    403: 
                    404:        if( ! CurrentEvent->obj_struc ) {
                    405:                fprintf(stderr, "No attributes for current event!\n"); Exit(-1);
                    406:        }
                    407: 
                    408:        /* add prefix first */
                    409:        while(*n) {
                    410:                *(*x)++ = *n++;
                    411:        }
                    412: 
                    413:        n = CurrentEvent->obj_name;
                    414: 
                    415:        while(*n) {
                    416:                *(*x)++ = *n++;
                    417:        }
                    418: }
                    419: 
                    420: dumptree(o,i)
                    421:        register struct Object *o;
                    422:        int i;
                    423: {
                    424:        register int j;
                    425: 
                    426:        if(o == NULL) {
                    427:                for(j=0; j<i; j++)
                    428:                        fputc(' ', stdout);
                    429:                fprintf(stdout, "%3d NULL\n", i);
                    430:        } else {
                    431:                dumptree(o->obj_left, i+1);
                    432:                for(j=0; j<i; j++) 
                    433:                        fputc(' ', stdout);
                    434:                fprintf(stdout, "%3d 0x%x: %s\n", i,o, OBJ_NAME(o));
                    435:                dumptree(o->obj_right, i+1);
                    436:        }
                    437: }
                    438: 
                    439: dump(c,a)
                    440: {
                    441:        register int x = 8;
                    442:        int zero = 0;
                    443: #include <sys/signal.h>
                    444: 
                    445:        fprintf(stderr, "dump: c 0x%x, a 0x%x\n",c,a);
                    446: 
                    447:        x = x/zero;
                    448:        kill(0, SIGQUIT);
                    449: }
                    450: 
                    451: dump_trans( pred, oldstate, newstate, action, event )
                    452: struct Object *oldstate, *newstate, *event;
                    453: char *pred, *action;
                    454: {
                    455:        extern int transno;
                    456:        struct Object *o;
                    457: 
                    458:        fprintf(stdout, "\n%d:  ", transno);
                    459: #define dumpit(x)\
                    460:        if((x)->obj_kind == OBJ_SET) {\
                    461:                o = (x)->obj_members; fprintf( stdout, "[ " );\
                    462:                while(o) { fprintf(stdout, "%s ", o->obj_name); o = o->obj_members; }\
                    463:                fprintf( stdout, " ] ");\
                    464:        } else { fprintf(stdout, "%s ", (x)->obj_name); }
                    465: 
                    466:        dumpit(newstate);
                    467:        fprintf(stdout, " <== ");
                    468:        dumpit(oldstate);
                    469:        dumpit(event);
                    470:        fprintf(stdout, "\n\t\t%s\n\t\t%s\n", pred?pred:"DEFAULT", 
                    471:                action);
                    472: }

unix.superglobalmegacorp.com

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