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