diff options
Diffstat (limited to 'sys/netiso/xebec/sets.c')
-rw-r--r-- | sys/netiso/xebec/sets.c | 472 |
1 files changed, 472 insertions, 0 deletions
diff --git a/sys/netiso/xebec/sets.c b/sys/netiso/xebec/sets.c new file mode 100644 index 0000000..3bb74ed --- /dev/null +++ b/sys/netiso/xebec/sets.c @@ -0,0 +1,472 @@ +/* $Header: sets.c,v 2.3 88/09/19 12:55:30 nhall Exp $ */ +/* $Source: /var/home/tadl/src/argo/xebec/RCS/sets.c,v $ */ +/* + * This code is such a kludge that I don't want to put my name on it. + * It was a ridiculously fast hack and needs rewriting. + * However it does work... + */ +#include "main.h" +#include "malloc.h" +#include "sets.h" +#include "debug.h" +#include <stdio.h> + +struct Object *CurrentEvent = (struct Object *)0; +struct Object *Objtree; +struct Object dummy; +/* + * define a set w/ type and name + * return a set number + */ +#undef NULL +#define NULL (struct Object *)0 + +static FILE *Sfile, *Efile; +extern FILE *astringfile; +char *Noname = "Unnamed set\0"; + +initsets(f,s) +FILE *f, *s; +{ + static char errorstring[20]; + extern struct Object *SameState; + Efile = f; + Sfile = s; + + IFDEBUG(X) + fprintf(astringfile, "char *%s_sstring[] = {\n", protocol); + ENDDEBUG + sprintf(errorstring, "%sERROR\0", ST_PREFIX); + defineitem(STATESET, errorstring, (char *)0); /* state 0 */ + SameState = (struct Object *) Malloc( sizeof (struct Object) ); + SameState->obj_kind = OBJ_ITEM; + SameState->obj_type = STATESET; + SameState->obj_name = "SAME"; + SameState->obj_struc = (char *)0; + SameState->obj_number = 0; + SameState->obj_members = (struct Object *)0; + SameState->obj_left = (struct Object *)0; + SameState->obj_right = (struct Object *)0; + SameState->obj_parent = (struct Object *)0; +} + +/* + * get a set based on its type and name + * returns address of an Object, may be set or item + */ + +struct Object *lookup(type, name) +unsigned char type; +char *name; +{ + register struct Object *p = Objtree; + int val = 1 ; + + IFDEBUG(o) + fprintf(stdout,"lookup 0x%x,%s \n", + type, name); + ENDDEBUG + + while( p && val ) { + IFDEBUG(o) + fprintf(OUT, "lookup strcmp 0x%x,%s, 0x%x,%s\n", + name, name, OBJ_NAME(p), OBJ_NAME(p)); + ENDDEBUG + if( p->obj_name == (char *)0 ) { + fprintf(stderr, "Unnamed set in table!\n"); + Exit(-1); + } + val = (int) strcmp(name, OBJ_NAME(p)); + if(val < 0) { + /* left */ + p = p->obj_left; + } else if (val > 0) { + /* right */ + p = p->obj_right; + } + } + if( p && ( p->obj_type != type)) { + fprintf(stdout, "lookup(0x%x,%s) found wrong obj type 0x%x\n", + type,name, p->obj_type); + p = NULL; + } + IFDEBUG(o) + fprintf(stdout,"lookup 0x%x,%s returning 0x%x\n",type, name, p); + ENDDEBUG + return(p); +} + +static int states_done = 0; + +end_states(f) +FILE *f; +{ + register unsigned n = Nstates; + register int i; + extern char Eventshiftstring[]; + + states_done = 1; + + for( i = 0; ;i++) { + if( (n >>= 1) <= 0 ) break; + } + Eventshift = i+1; + IFDEBUG(d) + fprintf(OUT, "Eventshift=%d\n", Eventshift); + ENDDEBUG + sprintf(Eventshiftstring, "%d\0",Eventshift); + fprintf(f, "struct %s_event {\n\tint ev_number;\n", &protocol[0]); + IFDEBUG(X) + /* finish sstring[] & start estring[] */ + fprintf(astringfile, + "};\n\nchar *%s_estring[] = {\n", protocol); + ENDDEBUG +} + +int FirstEventAttribute = 1; + +static +insert(o) +struct Object *o; +{ + struct Object *p = Objtree; + struct Object **q = &Objtree; + int val=1; + + + if (o->obj_name == (char *)0) { + fprintf(stderr, "Internal Error: inserting unnamed object\n"); + Exit(-1); + } + if( o->obj_type == STATESET) { + if( states_done ) { + fprintf(stderr, "No states may be defined after *TRANSITIONS\n"); + Exit(-1); + } + o->obj_number = Nstates++ ; + if(Nstates > MAXSTATES) { + fprintf(stderr, "Too many states\n"); + Exit(-1); + } + fprintf(Sfile, "#define %s 0x%x\n", o->obj_name, o->obj_number); + IFDEBUG(X) + fprintf(astringfile, "\"%s(0x%x)\",\n", o->obj_name, o->obj_number); + ENDDEBUG + } else { + /* EVENTSET */ + if( ! states_done ) { + fprintf(stderr, "states must precede events\n"); + Exit(-1); + } + o->obj_number = Nevents++ ; + if(Nevents > MAXEVENTS) { + fprintf(stderr, "Too many events\n"); + Exit(-1); + } + if(o->obj_struc) { + if( FirstEventAttribute ) { + fprintf(Efile, "\n\tunion{\n"); /*} */ + FirstEventAttribute = 0; + } + fprintf(Efile, + "struct %s %s%s;\n\n", o->obj_struc, EV_PREFIX, o->obj_name); + } + fprintf(Efile, "#define %s 0x%x\n", o->obj_name, o->obj_number); + IFDEBUG(X) + fprintf(astringfile, "\"%s(0x%x)\",\n", o->obj_name, o->obj_number); + ENDDEBUG + } + IFDEBUG(o) + fprintf(OUT, "insert(%s)\n", OBJ_NAME(o) ); + if(o->obj_right != NULL) { + fprintf(OUT, "insert: unclean Object right\n"); + exit(-1); + } + if(o->obj_left != NULL) { + fprintf(OUT, "insert: unclean Object left\n"); + exit(-1); + } + fflush(OUT); + ENDDEBUG + + while( val ) { + if(p == NULL) { + *q = o; + o->obj_parent = (struct Object *)q; + break; + } + if(!(val = strcmp(o->obj_name, p->obj_name)) ) { + /* equal */ + fprintf(stderr, "re-inserting %s\n",o->obj_name); + exit(-1); + } + if(val < 0) { + /* left */ + q = &p->obj_left; + p = p->obj_left; + } else { + /* right */ + q = &p->obj_right; + p = p->obj_right; + } + } + IFDEBUG(a) + dumptree(Objtree,0); + ENDDEBUG +} + +delete(o) +struct Object *o; +{ + register struct Object *p = o->obj_right; + register struct Object *q; + register struct Object *newparent; + register struct Object **np_childlink; + + IFDEBUG(T) + fprintf(stdout, "delete(0x%x)\n", o); + dumptree(Objtree,0); + ENDDEBUG + + /* q <== lowest valued node of the right subtree */ + while( p ) { + q = p; + p = p->obj_left; + } + + if (o->obj_parent == (struct Object *)&Objtree) { + newparent = (struct Object *)&Objtree; + np_childlink = (struct Object **)&Objtree; + } else if(o->obj_parent->obj_left == o) { + newparent = o->obj_parent; + np_childlink = &(o->obj_parent->obj_left); + } else { + newparent = o->obj_parent; + np_childlink = &(o->obj_parent->obj_right); + } + IFDEBUG(T) + fprintf(OUT, "newparent=0x%x\n"); + ENDDEBUG + + if (q) { /* q gets the left, parent gets the right */ + IFDEBUG(T) + fprintf(OUT, "delete: q null\n"); + ENDDEBUG + q->obj_left = p; + if(p) p->obj_parent = q; + p = o->obj_right; + } else { /* parent(instead of q) gets the left ; there is no right */ + IFDEBUG(T) + fprintf(OUT, "delete: q not null\n"); + ENDDEBUG + p = o->obj_left; + } + *np_childlink = p; + if(p) + p->obj_parent = newparent; + + IFDEBUG(T) + fprintf(OUT, "After deleting 0x%x\n",o); + dumptree(Objtree,0); + ENDDEBUG +} + +struct Object * +defineset(type, adr, keep) +unsigned char type; +char *adr; +int keep; +{ + struct Object *onew; + IFDEBUG(o) + printf("defineset(0x%x,%s, %s)\n", type , adr, keep?"KEEP":"NO_KEEP"); + ENDDEBUG + + onew = (struct Object *)Malloc(sizeof (struct Object)); + bzero(onew, sizeof(struct Object)); + onew->obj_name = adr; + onew->obj_kind = OBJ_SET; + onew->obj_type = type; + if(keep) + insert( onew ); + /* address already stashed before calling defineset */ + IFDEBUG(o) + printf("defineset(0x%x,%s) returning 0x%x\n", type , adr, onew); + dumptree(Objtree,0); + ENDDEBUG + return(onew); +} + +dumpit(o, s) +char *o; +char *s; +{ + register int i; + +IFDEBUG(o) + fprintf(OUT, "object 0x%x, %s\n",o, s); + for(i=0; i< sizeof(struct Object); i+=4) { + fprintf(OUT, "0x%x: 0x%x 0x%x 0x%x 0x%x\n", + *((int *)o), *o, *(o+1), *(o+2), *(o+3) ); + } +ENDDEBUG +} + +defineitem(type, adr, struc) +unsigned char type; +char *adr; +char *struc; +{ + struct Object *onew; + IFDEBUG(o) + printf("defineitem(0x%x, %s at 0x%x, %s)\n", type, adr, adr, struc); + ENDDEBUG + + if( onew = lookup( type, adr ) ) { + fprintf(stderr, + "Internal error at defineitem: trying to redefine obj type 0x%x, adr %s\n", + type, adr); + exit(-1); + } else { + onew = (struct Object *)Malloc(sizeof (struct Object)); + bzero(onew, sizeof(struct Object)); + onew->obj_name = stash(adr); + onew->obj_kind = OBJ_ITEM; + onew->obj_type = type; + onew->obj_struc = struc?stash(struc):struc; + insert( onew ); + } + IFDEBUG(o) + fprintf(OUT, "defineitem(0x%x, %s) returning 0x%x\n", type, adr, onew); + ENDDEBUG +} + +member(o, adr) +struct Object *o; +char *adr; +{ + struct Object *onew, *oold; + IFDEBUG(o) + printf("member(0x%x, %s)\n", o, adr); + ENDDEBUG + + oold = lookup( o->obj_type, adr ); + + onew = (struct Object *)Malloc(sizeof (struct Object)); + if( oold == NULL ) { + extern int lineno; + + fprintf(stderr, + "Warning at line %d: set definition of %s causes definition of\n", + lineno, OBJ_NAME(o)); + fprintf(stderr, "\t (previously undefined) member %s\n", adr); + bzero(onew, sizeof(struct Object)); + onew->obj_name = stash(adr); + onew->obj_kind = OBJ_ITEM; + onew->obj_type = o->obj_type; + onew->obj_members = NULL; + insert( onew ); + } else { + if(oold->obj_kind != OBJ_ITEM) { + fprintf(stderr, "Sets cannot be members of sets; %s\n", adr); + exit(-1); + } + bcopy(oold, onew, sizeof(struct Object)); + onew->obj_members = onew->obj_left = onew->obj_right = NULL; + } + onew->obj_members = o->obj_members; + o->obj_members = onew; +} + +struct Object *Lookup(type, name) +unsigned char type; +char *name; +{ + register struct Object *o = lookup(type,name); + + if(o == NULL) { + fprintf(stderr, "Trying to use undefined %s: %s\n", + type==STATESET?"state":"event", name); + Exit(-1); + } + return(o); +} + +AddCurrentEventName(x) +register char **x; +{ + register char *n = EV_PREFIX; ; + + if( CurrentEvent == (struct Object *)0 ) { + fprintf(stderr, "No event named! BARF!\n"); Exit(-1); + } + + if( ! CurrentEvent->obj_struc ) { + fprintf(stderr, "No attributes for current event!\n"); Exit(-1); + } + + /* add prefix first */ + while(*n) { + *(*x)++ = *n++; + } + + n = CurrentEvent->obj_name; + + while(*n) { + *(*x)++ = *n++; + } +} + +dumptree(o,i) + register struct Object *o; + int i; +{ + register int j; + + if(o == NULL) { + for(j=0; j<i; j++) + fputc(' ', stdout); + fprintf(stdout, "%3d NULL\n", i); + } else { + dumptree(o->obj_left, i+1); + for(j=0; j<i; j++) + fputc(' ', stdout); + fprintf(stdout, "%3d 0x%x: %s\n", i,o, OBJ_NAME(o)); + dumptree(o->obj_right, i+1); + } +} + +dump(c,a) +{ + register int x = 8; + int zero = 0; +#include <sys/signal.h> + + fprintf(stderr, "dump: c 0x%x, a 0x%x\n",c,a); + + x = x/zero; + kill(0, SIGQUIT); +} + +dump_trans( pred, oldstate, newstate, action, event ) +struct Object *oldstate, *newstate, *event; +char *pred, *action; +{ + extern int transno; + struct Object *o; + + fprintf(stdout, "\n%d: ", transno); +#define dumpit(x)\ + if((x)->obj_kind == OBJ_SET) {\ + o = (x)->obj_members; fprintf( stdout, "[ " );\ + while(o) { fprintf(stdout, "%s ", o->obj_name); o = o->obj_members; }\ + fprintf( stdout, " ] ");\ + } else { fprintf(stdout, "%s ", (x)->obj_name); } + + dumpit(newstate); + fprintf(stdout, " <== "); + dumpit(oldstate); + dumpit(event); + fprintf(stdout, "\n\t\t%s\n\t\t%s\n", pred?pred:"DEFAULT", + action); +} |