|
|
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.