|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.