1219b2ee8SDavid du Colombier /***** spin: pangen3.c *****/
2219b2ee8SDavid du Colombier
3312a1df1SDavid du Colombier /* Copyright (c) 1989-2003 by Lucent Technologies, Bell Laboratories. */
47dd7cddfSDavid du Colombier /* All Rights Reserved. This software is for educational purposes only. */
5312a1df1SDavid du Colombier /* No guarantee whatsoever is expressed or implied by the distribution of */
6312a1df1SDavid du Colombier /* this code. Permission is given to distribute this code provided that */
7312a1df1SDavid du Colombier /* this introductory message is not removed and no monies are exchanged. */
8312a1df1SDavid du Colombier /* Software written by Gerard J. Holzmann. For tool documentation see: */
9312a1df1SDavid du Colombier /* http://spinroot.com/ */
10312a1df1SDavid du Colombier /* Send all bug-reports and/or questions to: bugs@spinroot.com */
11219b2ee8SDavid du Colombier
12219b2ee8SDavid du Colombier #include "spin.h"
13219b2ee8SDavid du Colombier #include "y.tab.h"
14219b2ee8SDavid du Colombier
15219b2ee8SDavid du Colombier extern FILE *th;
16*00d97012SDavid du Colombier extern int eventmapnr;
17219b2ee8SDavid du Colombier
18219b2ee8SDavid du Colombier typedef struct SRC {
19*00d97012SDavid du Colombier int ln, st; /* linenr, statenr */
207dd7cddfSDavid du Colombier Symbol *fn; /* filename */
21219b2ee8SDavid du Colombier struct SRC *nxt;
22219b2ee8SDavid du Colombier } SRC;
23219b2ee8SDavid du Colombier
247dd7cddfSDavid du Colombier static int col;
257dd7cddfSDavid du Colombier static Symbol *lastfnm;
267dd7cddfSDavid du Colombier static Symbol lastdef;
277dd7cddfSDavid du Colombier static int lastfrom;
287dd7cddfSDavid du Colombier static SRC *frst = (SRC *) 0;
297dd7cddfSDavid du Colombier static SRC *skip = (SRC *) 0;
30219b2ee8SDavid du Colombier
31*00d97012SDavid du Colombier extern int ltl_mode;
32*00d97012SDavid du Colombier
337dd7cddfSDavid du Colombier extern void sr_mesg(FILE *, int, int);
347dd7cddfSDavid du Colombier
357dd7cddfSDavid du Colombier static void
putnr(int n)367dd7cddfSDavid du Colombier putnr(int n)
377dd7cddfSDavid du Colombier {
387dd7cddfSDavid du Colombier if (col++ == 8)
397dd7cddfSDavid du Colombier { fprintf(th, "\n\t");
407dd7cddfSDavid du Colombier col = 1;
417dd7cddfSDavid du Colombier }
427dd7cddfSDavid du Colombier fprintf(th, "%3d, ", n);
437dd7cddfSDavid du Colombier }
447dd7cddfSDavid du Colombier
457dd7cddfSDavid du Colombier static void
putfnm(int j,Symbol * s)467dd7cddfSDavid du Colombier putfnm(int j, Symbol *s)
477dd7cddfSDavid du Colombier {
487dd7cddfSDavid du Colombier if (lastfnm && lastfnm == s && j != -1)
497dd7cddfSDavid du Colombier return;
507dd7cddfSDavid du Colombier
517dd7cddfSDavid du Colombier if (lastfnm)
52*00d97012SDavid du Colombier fprintf(th, "{ \"%s\", %d, %d },\n\t",
537dd7cddfSDavid du Colombier lastfnm->name,
547dd7cddfSDavid du Colombier lastfrom,
557dd7cddfSDavid du Colombier j-1);
567dd7cddfSDavid du Colombier lastfnm = s;
577dd7cddfSDavid du Colombier lastfrom = j;
587dd7cddfSDavid du Colombier }
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombier static void
putfnm_flush(int j)617dd7cddfSDavid du Colombier putfnm_flush(int j)
627dd7cddfSDavid du Colombier {
63f3793cddSDavid du Colombier if (lastfnm)
64*00d97012SDavid du Colombier fprintf(th, "{ \"%s\", %d, %d }\n",
657dd7cddfSDavid du Colombier lastfnm->name,
667dd7cddfSDavid du Colombier lastfrom, j);
677dd7cddfSDavid du Colombier }
68219b2ee8SDavid du Colombier
69219b2ee8SDavid du Colombier void
putskip(int m)70219b2ee8SDavid du Colombier putskip(int m) /* states that need not be reached */
71219b2ee8SDavid du Colombier { SRC *tmp;
72219b2ee8SDavid du Colombier
73219b2ee8SDavid du Colombier for (tmp = skip; tmp; tmp = tmp->nxt)
74219b2ee8SDavid du Colombier if (tmp->st == m)
75219b2ee8SDavid du Colombier return;
76219b2ee8SDavid du Colombier tmp = (SRC *) emalloc(sizeof(SRC));
77*00d97012SDavid du Colombier tmp->st = m;
78219b2ee8SDavid du Colombier tmp->nxt = skip;
79219b2ee8SDavid du Colombier skip = tmp;
80219b2ee8SDavid du Colombier }
81219b2ee8SDavid du Colombier
82219b2ee8SDavid du Colombier void
unskip(int m)83219b2ee8SDavid du Colombier unskip(int m) /* a state that needs to be reached after all */
84219b2ee8SDavid du Colombier { SRC *tmp, *lst=(SRC *)0;
85219b2ee8SDavid du Colombier
86219b2ee8SDavid du Colombier for (tmp = skip; tmp; lst = tmp, tmp = tmp->nxt)
87219b2ee8SDavid du Colombier if (tmp->st == m)
88219b2ee8SDavid du Colombier { if (tmp == skip)
89219b2ee8SDavid du Colombier skip = skip->nxt;
90*00d97012SDavid du Colombier else if (lst) /* always true, but helps coverity */
91219b2ee8SDavid du Colombier lst->nxt = tmp->nxt;
92219b2ee8SDavid du Colombier break;
93219b2ee8SDavid du Colombier }
94219b2ee8SDavid du Colombier }
95219b2ee8SDavid du Colombier
96219b2ee8SDavid du Colombier void
putsrc(Element * e)977dd7cddfSDavid du Colombier putsrc(Element *e) /* match states to source lines */
98219b2ee8SDavid du Colombier { SRC *tmp;
997dd7cddfSDavid du Colombier int n, m;
1007dd7cddfSDavid du Colombier
1017dd7cddfSDavid du Colombier if (!e || !e->n) return;
1027dd7cddfSDavid du Colombier
1037dd7cddfSDavid du Colombier n = e->n->ln;
1047dd7cddfSDavid du Colombier m = e->seqno;
105219b2ee8SDavid du Colombier
106219b2ee8SDavid du Colombier for (tmp = frst; tmp; tmp = tmp->nxt)
107219b2ee8SDavid du Colombier if (tmp->st == m)
1087dd7cddfSDavid du Colombier { if (tmp->ln != n || tmp->fn != e->n->fn)
109*00d97012SDavid du Colombier printf("putsrc mismatch seqno %d, line %d - %d, file %s\n", m, n,
110312a1df1SDavid du Colombier tmp->ln, tmp->fn->name);
111219b2ee8SDavid du Colombier return;
112219b2ee8SDavid du Colombier }
113219b2ee8SDavid du Colombier tmp = (SRC *) emalloc(sizeof(SRC));
114*00d97012SDavid du Colombier tmp->ln = n;
115*00d97012SDavid du Colombier tmp->st = m;
1167dd7cddfSDavid du Colombier tmp->fn = e->n->fn;
117219b2ee8SDavid du Colombier tmp->nxt = frst;
118219b2ee8SDavid du Colombier frst = tmp;
119219b2ee8SDavid du Colombier }
120219b2ee8SDavid du Colombier
1217dd7cddfSDavid du Colombier static void
dumpskip(int n,int m)122219b2ee8SDavid du Colombier dumpskip(int n, int m)
123219b2ee8SDavid du Colombier { SRC *tmp, *lst;
124219b2ee8SDavid du Colombier int j;
125219b2ee8SDavid du Colombier
126219b2ee8SDavid du Colombier fprintf(th, "uchar reached%d [] = {\n\t", m);
127219b2ee8SDavid du Colombier for (j = 0, col = 0; j <= n; j++)
128219b2ee8SDavid du Colombier { lst = (SRC *) 0;
129219b2ee8SDavid du Colombier for (tmp = skip; tmp; lst = tmp, tmp = tmp->nxt)
130219b2ee8SDavid du Colombier if (tmp->st == j)
131219b2ee8SDavid du Colombier { putnr(1);
132219b2ee8SDavid du Colombier if (lst)
133219b2ee8SDavid du Colombier lst->nxt = tmp->nxt;
134219b2ee8SDavid du Colombier else
135219b2ee8SDavid du Colombier skip = tmp->nxt;
136219b2ee8SDavid du Colombier break;
137219b2ee8SDavid du Colombier }
138219b2ee8SDavid du Colombier if (!tmp)
139219b2ee8SDavid du Colombier putnr(0);
140219b2ee8SDavid du Colombier }
141219b2ee8SDavid du Colombier fprintf(th, "};\n");
142*00d97012SDavid du Colombier
143*00d97012SDavid du Colombier fprintf(th, "uchar *loopstate%d;\n", m);
144*00d97012SDavid du Colombier
1457dd7cddfSDavid du Colombier if (m == eventmapnr)
1467dd7cddfSDavid du Colombier fprintf(th, "#define reached_event reached%d\n", m);
147219b2ee8SDavid du Colombier
148219b2ee8SDavid du Colombier skip = (SRC *) 0;
149219b2ee8SDavid du Colombier }
150219b2ee8SDavid du Colombier
151219b2ee8SDavid du Colombier void
dumpsrc(int n,int m)152219b2ee8SDavid du Colombier dumpsrc(int n, int m)
153219b2ee8SDavid du Colombier { SRC *tmp, *lst;
154219b2ee8SDavid du Colombier int j;
155*00d97012SDavid du Colombier static int did_claim = 0;
156219b2ee8SDavid du Colombier
157219b2ee8SDavid du Colombier fprintf(th, "short src_ln%d [] = {\n\t", m);
158219b2ee8SDavid du Colombier for (j = 0, col = 0; j <= n; j++)
159219b2ee8SDavid du Colombier { lst = (SRC *) 0;
160219b2ee8SDavid du Colombier for (tmp = frst; tmp; lst = tmp, tmp = tmp->nxt)
161219b2ee8SDavid du Colombier if (tmp->st == j)
162219b2ee8SDavid du Colombier { putnr(tmp->ln);
163219b2ee8SDavid du Colombier break;
164219b2ee8SDavid du Colombier }
165219b2ee8SDavid du Colombier if (!tmp)
166219b2ee8SDavid du Colombier putnr(0);
167219b2ee8SDavid du Colombier }
168219b2ee8SDavid du Colombier fprintf(th, "};\n");
169219b2ee8SDavid du Colombier
1707dd7cddfSDavid du Colombier lastfnm = (Symbol *) 0;
171*00d97012SDavid du Colombier lastdef.name = "-";
1727dd7cddfSDavid du Colombier fprintf(th, "S_F_MAP src_file%d [] = {\n\t", m);
1737dd7cddfSDavid du Colombier for (j = 0, col = 0; j <= n; j++)
1747dd7cddfSDavid du Colombier { lst = (SRC *) 0;
1757dd7cddfSDavid du Colombier for (tmp = frst; tmp; lst = tmp, tmp = tmp->nxt)
1767dd7cddfSDavid du Colombier if (tmp->st == j)
1777dd7cddfSDavid du Colombier { putfnm(j, tmp->fn);
1787dd7cddfSDavid du Colombier if (lst)
1797dd7cddfSDavid du Colombier lst->nxt = tmp->nxt;
1807dd7cddfSDavid du Colombier else
1817dd7cddfSDavid du Colombier frst = tmp->nxt;
1827dd7cddfSDavid du Colombier break;
1837dd7cddfSDavid du Colombier }
1847dd7cddfSDavid du Colombier if (!tmp)
1857dd7cddfSDavid du Colombier putfnm(j, &lastdef);
1867dd7cddfSDavid du Colombier }
1877dd7cddfSDavid du Colombier putfnm_flush(j);
1887dd7cddfSDavid du Colombier fprintf(th, "};\n");
1897dd7cddfSDavid du Colombier
190*00d97012SDavid du Colombier if (pid_is_claim(m) && !did_claim)
191*00d97012SDavid du Colombier { fprintf(th, "short *src_claim;\n");
192*00d97012SDavid du Colombier did_claim++;
193*00d97012SDavid du Colombier }
1947dd7cddfSDavid du Colombier if (m == eventmapnr)
1957dd7cddfSDavid du Colombier fprintf(th, "#define src_event src_ln%d\n", m);
196219b2ee8SDavid du Colombier
197219b2ee8SDavid du Colombier frst = (SRC *) 0;
198219b2ee8SDavid du Colombier dumpskip(n, m);
199219b2ee8SDavid du Colombier }
200219b2ee8SDavid du Colombier
201219b2ee8SDavid du Colombier #define Cat0(x) comwork(fd,now->lft,m); fprintf(fd, x); \
202219b2ee8SDavid du Colombier comwork(fd,now->rgt,m)
203219b2ee8SDavid du Colombier #define Cat1(x) fprintf(fd,"("); Cat0(x); fprintf(fd,")")
204219b2ee8SDavid du Colombier #define Cat2(x,y) fprintf(fd,x); comwork(fd,y,m)
205219b2ee8SDavid du Colombier #define Cat3(x,y,z) fprintf(fd,x); comwork(fd,y,m); fprintf(fd,z)
206219b2ee8SDavid du Colombier
2077dd7cddfSDavid du Colombier static int
symbolic(FILE * fd,Lextok * tv)208219b2ee8SDavid du Colombier symbolic(FILE *fd, Lextok *tv)
209219b2ee8SDavid du Colombier { Lextok *n; extern Lextok *Mtype;
210219b2ee8SDavid du Colombier int cnt = 1;
211219b2ee8SDavid du Colombier
212219b2ee8SDavid du Colombier if (tv->ismtyp)
213219b2ee8SDavid du Colombier for (n = Mtype; n; n = n->rgt, cnt++)
214219b2ee8SDavid du Colombier if (cnt == tv->val)
215219b2ee8SDavid du Colombier { fprintf(fd, "%s", n->lft->sym->name);
216219b2ee8SDavid du Colombier return 1;
217219b2ee8SDavid du Colombier }
218219b2ee8SDavid du Colombier return 0;
219219b2ee8SDavid du Colombier }
220219b2ee8SDavid du Colombier
2217dd7cddfSDavid du Colombier static void
comwork(FILE * fd,Lextok * now,int m)222219b2ee8SDavid du Colombier comwork(FILE *fd, Lextok *now, int m)
223219b2ee8SDavid du Colombier { Lextok *v;
2247dd7cddfSDavid du Colombier int i, j;
225219b2ee8SDavid du Colombier
226219b2ee8SDavid du Colombier if (!now) { fprintf(fd, "0"); return; }
227219b2ee8SDavid du Colombier switch (now->ntyp) {
2287dd7cddfSDavid du Colombier case CONST: sr_mesg(fd, now->val, now->ismtyp); break;
229219b2ee8SDavid du Colombier case '!': Cat3("!(", now->lft, ")"); break;
230219b2ee8SDavid du Colombier case UMIN: Cat3("-(", now->lft, ")"); break;
231219b2ee8SDavid du Colombier case '~': Cat3("~(", now->lft, ")"); break;
232219b2ee8SDavid du Colombier
233219b2ee8SDavid du Colombier case '/': Cat1("/"); break;
234219b2ee8SDavid du Colombier case '*': Cat1("*"); break;
235219b2ee8SDavid du Colombier case '-': Cat1("-"); break;
236219b2ee8SDavid du Colombier case '+': Cat1("+"); break;
237219b2ee8SDavid du Colombier case '%': Cat1("%%"); break;
238219b2ee8SDavid du Colombier case '&': Cat1("&"); break;
2397dd7cddfSDavid du Colombier case '^': Cat1("^"); break;
240219b2ee8SDavid du Colombier case '|': Cat1("|"); break;
241219b2ee8SDavid du Colombier case LE: Cat1("<="); break;
242219b2ee8SDavid du Colombier case GE: Cat1(">="); break;
243219b2ee8SDavid du Colombier case GT: Cat1(">"); break;
244219b2ee8SDavid du Colombier case LT: Cat1("<"); break;
245219b2ee8SDavid du Colombier case NE: Cat1("!="); break;
246*00d97012SDavid du Colombier case EQ:
247*00d97012SDavid du Colombier if (ltl_mode
248*00d97012SDavid du Colombier && now->lft->ntyp == 'p'
249*00d97012SDavid du Colombier && now->rgt->ntyp == 'q') /* remote ref */
250*00d97012SDavid du Colombier { Lextok *p = now->lft->lft;
251*00d97012SDavid du Colombier
252*00d97012SDavid du Colombier fprintf(fd, "(");
253*00d97012SDavid du Colombier fprintf(fd, "%s", p->sym->name);
254*00d97012SDavid du Colombier if (p->lft)
255*00d97012SDavid du Colombier { fprintf(fd, "[");
256*00d97012SDavid du Colombier putstmnt(fd, p->lft, 0); /* pid */
257*00d97012SDavid du Colombier fprintf(fd, "]");
258*00d97012SDavid du Colombier }
259*00d97012SDavid du Colombier fprintf(fd, "@");
260*00d97012SDavid du Colombier fprintf(fd, "%s", now->rgt->sym->name);
261*00d97012SDavid du Colombier fprintf(fd, ")");
262*00d97012SDavid du Colombier break;
263*00d97012SDavid du Colombier }
264*00d97012SDavid du Colombier Cat1("==");
265*00d97012SDavid du Colombier break;
266*00d97012SDavid du Colombier
267219b2ee8SDavid du Colombier case OR: Cat1("||"); break;
268219b2ee8SDavid du Colombier case AND: Cat1("&&"); break;
269219b2ee8SDavid du Colombier case LSHIFT: Cat1("<<"); break;
270219b2ee8SDavid du Colombier case RSHIFT: Cat1(">>"); break;
271219b2ee8SDavid du Colombier
272219b2ee8SDavid du Colombier case RUN: fprintf(fd, "run %s(", now->sym->name);
273219b2ee8SDavid du Colombier for (v = now->lft; v; v = v->rgt)
274219b2ee8SDavid du Colombier if (v == now->lft)
2757dd7cddfSDavid du Colombier { comwork(fd, v->lft, m);
276219b2ee8SDavid du Colombier } else
277219b2ee8SDavid du Colombier { Cat2(",", v->lft);
278219b2ee8SDavid du Colombier }
279219b2ee8SDavid du Colombier fprintf(fd, ")");
280219b2ee8SDavid du Colombier break;
281219b2ee8SDavid du Colombier
282219b2ee8SDavid du Colombier case LEN: putname(fd, "len(", now->lft, m, ")");
283219b2ee8SDavid du Colombier break;
284219b2ee8SDavid du Colombier case FULL: putname(fd, "full(", now->lft, m, ")");
285219b2ee8SDavid du Colombier break;
286219b2ee8SDavid du Colombier case EMPTY: putname(fd, "empty(", now->lft, m, ")");
287219b2ee8SDavid du Colombier break;
288219b2ee8SDavid du Colombier case NFULL: putname(fd, "nfull(", now->lft, m, ")");
289219b2ee8SDavid du Colombier break;
290219b2ee8SDavid du Colombier case NEMPTY: putname(fd, "nempty(", now->lft, m, ")");
291219b2ee8SDavid du Colombier break;
292219b2ee8SDavid du Colombier
293219b2ee8SDavid du Colombier case 's': putname(fd, "", now->lft, m, now->val?"!!":"!");
294219b2ee8SDavid du Colombier for (v = now->rgt, i=0; v; v = v->rgt, i++)
295219b2ee8SDavid du Colombier { if (v != now->rgt) fprintf(fd,",");
296219b2ee8SDavid du Colombier if (!symbolic(fd, v->lft))
297219b2ee8SDavid du Colombier comwork(fd,v->lft,m);
298219b2ee8SDavid du Colombier }
299219b2ee8SDavid du Colombier break;
3007dd7cddfSDavid du Colombier case 'r': putname(fd, "", now->lft, m, "?");
3017dd7cddfSDavid du Colombier switch (now->val) {
3027dd7cddfSDavid du Colombier case 0: break;
3037dd7cddfSDavid du Colombier case 1: fprintf(fd, "?"); break;
3047dd7cddfSDavid du Colombier case 2: fprintf(fd, "<"); break;
3057dd7cddfSDavid du Colombier case 3: fprintf(fd, "?<"); break;
3067dd7cddfSDavid du Colombier }
307219b2ee8SDavid du Colombier for (v = now->rgt, i=0; v; v = v->rgt, i++)
308219b2ee8SDavid du Colombier { if (v != now->rgt) fprintf(fd,",");
309219b2ee8SDavid du Colombier if (!symbolic(fd, v->lft))
310219b2ee8SDavid du Colombier comwork(fd,v->lft,m);
311219b2ee8SDavid du Colombier }
3127dd7cddfSDavid du Colombier if (now->val >= 2)
3137dd7cddfSDavid du Colombier fprintf(fd, ">");
314219b2ee8SDavid du Colombier break;
315219b2ee8SDavid du Colombier case 'R': putname(fd, "", now->lft, m, now->val?"??[":"?[");
316219b2ee8SDavid du Colombier for (v = now->rgt, i=0; v; v = v->rgt, i++)
317219b2ee8SDavid du Colombier { if (v != now->rgt) fprintf(fd,",");
318219b2ee8SDavid du Colombier if (!symbolic(fd, v->lft))
319219b2ee8SDavid du Colombier comwork(fd,v->lft,m);
320219b2ee8SDavid du Colombier }
321219b2ee8SDavid du Colombier fprintf(fd, "]");
322219b2ee8SDavid du Colombier break;
323219b2ee8SDavid du Colombier
324219b2ee8SDavid du Colombier case ENABLED: Cat3("enabled(", now->lft, ")");
325219b2ee8SDavid du Colombier break;
326219b2ee8SDavid du Colombier
3277dd7cddfSDavid du Colombier case EVAL: Cat3("eval(", now->lft, ")");
3287dd7cddfSDavid du Colombier break;
3297dd7cddfSDavid du Colombier
3307dd7cddfSDavid du Colombier case NONPROGRESS:
3317dd7cddfSDavid du Colombier fprintf(fd, "np_");
3327dd7cddfSDavid du Colombier break;
3337dd7cddfSDavid du Colombier
334219b2ee8SDavid du Colombier case PC_VAL: Cat3("pc_value(", now->lft, ")");
335219b2ee8SDavid du Colombier break;
336219b2ee8SDavid du Colombier
337219b2ee8SDavid du Colombier case 'c': Cat3("(", now->lft, ")");
338219b2ee8SDavid du Colombier break;
339219b2ee8SDavid du Colombier
340312a1df1SDavid du Colombier case '?': if (now->lft)
341312a1df1SDavid du Colombier { Cat3("( (", now->lft, ") -> ");
342312a1df1SDavid du Colombier }
343312a1df1SDavid du Colombier if (now->rgt)
344312a1df1SDavid du Colombier { Cat3("(", now->rgt->lft, ") : ");
345219b2ee8SDavid du Colombier Cat3("(", now->rgt->rgt, ") )");
346312a1df1SDavid du Colombier }
347219b2ee8SDavid du Colombier break;
348219b2ee8SDavid du Colombier
349219b2ee8SDavid du Colombier case ASGN: comwork(fd,now->lft,m);
350219b2ee8SDavid du Colombier fprintf(fd," = ");
351219b2ee8SDavid du Colombier comwork(fd,now->rgt,m);
352219b2ee8SDavid du Colombier break;
353219b2ee8SDavid du Colombier
354219b2ee8SDavid du Colombier case PRINT: { char c, buf[512];
355219b2ee8SDavid du Colombier strncpy(buf, now->sym->name, 510);
356219b2ee8SDavid du Colombier for (i = j = 0; i < 510; i++, j++)
357219b2ee8SDavid du Colombier { c = now->sym->name[i];
358219b2ee8SDavid du Colombier buf[j] = c;
359219b2ee8SDavid du Colombier if (c == '\\') buf[++j] = c;
360219b2ee8SDavid du Colombier if (c == '\"') buf[j] = '\'';
361219b2ee8SDavid du Colombier if (c == '\0') break;
362219b2ee8SDavid du Colombier }
3637dd7cddfSDavid du Colombier if (now->ntyp == PRINT)
3647dd7cddfSDavid du Colombier fprintf(fd, "printf");
3657dd7cddfSDavid du Colombier else
3667dd7cddfSDavid du Colombier fprintf(fd, "annotate");
3677dd7cddfSDavid du Colombier fprintf(fd, "(%s", buf);
368219b2ee8SDavid du Colombier }
369219b2ee8SDavid du Colombier for (v = now->lft; v; v = v->rgt)
370219b2ee8SDavid du Colombier { Cat2(",", v->lft);
371219b2ee8SDavid du Colombier }
372219b2ee8SDavid du Colombier fprintf(fd, ")");
373219b2ee8SDavid du Colombier break;
374312a1df1SDavid du Colombier case PRINTM: fprintf(fd, "printm(");
375312a1df1SDavid du Colombier comwork(fd, now->lft, m);
376312a1df1SDavid du Colombier fprintf(fd, ")");
377312a1df1SDavid du Colombier break;
378*00d97012SDavid du Colombier case NAME:
379*00d97012SDavid du Colombier putname(fd, "", now, m, "");
380219b2ee8SDavid du Colombier break;
381*00d97012SDavid du Colombier
382*00d97012SDavid du Colombier case 'p': if (ltl_mode)
383*00d97012SDavid du Colombier { fprintf(fd, "%s", now->lft->sym->name); /* proctype */
384*00d97012SDavid du Colombier if (now->lft->lft)
385*00d97012SDavid du Colombier { fprintf(fd, "[");
386*00d97012SDavid du Colombier putstmnt(fd, now->lft->lft, 0); /* pid */
387*00d97012SDavid du Colombier fprintf(fd, "]");
388*00d97012SDavid du Colombier }
389*00d97012SDavid du Colombier fprintf(fd, ":"); /* remote varref */
390*00d97012SDavid du Colombier fprintf(fd, "%s", now->sym->name); /* varname */
391*00d97012SDavid du Colombier break;
392*00d97012SDavid du Colombier }
393*00d97012SDavid du Colombier putremote(fd, now, m);
394219b2ee8SDavid du Colombier break;
395219b2ee8SDavid du Colombier case 'q': fprintf(fd, "%s", now->sym->name);
396219b2ee8SDavid du Colombier break;
397312a1df1SDavid du Colombier case C_EXPR:
398312a1df1SDavid du Colombier case C_CODE: fprintf(fd, "{%s}", now->sym->name);
399312a1df1SDavid du Colombier break;
400219b2ee8SDavid du Colombier case ASSERT: Cat3("assert(", now->lft, ")");
401219b2ee8SDavid du Colombier break;
402219b2ee8SDavid du Colombier case '.': fprintf(fd, ".(goto)"); break;
4037dd7cddfSDavid du Colombier case GOTO: fprintf(fd, "goto %s", now->sym->name); break;
404219b2ee8SDavid du Colombier case BREAK: fprintf(fd, "break"); break;
405219b2ee8SDavid du Colombier case ELSE: fprintf(fd, "else"); break;
406219b2ee8SDavid du Colombier case '@': fprintf(fd, "-end-"); break;
407219b2ee8SDavid du Colombier
408219b2ee8SDavid du Colombier case D_STEP: fprintf(fd, "D_STEP"); break;
409219b2ee8SDavid du Colombier case ATOMIC: fprintf(fd, "ATOMIC"); break;
410219b2ee8SDavid du Colombier case NON_ATOMIC: fprintf(fd, "sub-sequence"); break;
411219b2ee8SDavid du Colombier case IF: fprintf(fd, "IF"); break;
412219b2ee8SDavid du Colombier case DO: fprintf(fd, "DO"); break;
413219b2ee8SDavid du Colombier case UNLESS: fprintf(fd, "unless"); break;
414219b2ee8SDavid du Colombier case TIMEOUT: fprintf(fd, "timeout"); break;
415219b2ee8SDavid du Colombier default: if (isprint(now->ntyp))
416219b2ee8SDavid du Colombier fprintf(fd, "'%c'", now->ntyp);
417219b2ee8SDavid du Colombier else
418219b2ee8SDavid du Colombier fprintf(fd, "%d", now->ntyp);
419219b2ee8SDavid du Colombier break;
420219b2ee8SDavid du Colombier }
421219b2ee8SDavid du Colombier }
422219b2ee8SDavid du Colombier
423219b2ee8SDavid du Colombier void
comment(FILE * fd,Lextok * now,int m)424219b2ee8SDavid du Colombier comment(FILE *fd, Lextok *now, int m)
4257dd7cddfSDavid du Colombier { extern short terse, nocast;
426219b2ee8SDavid du Colombier
427219b2ee8SDavid du Colombier terse=nocast=1;
428219b2ee8SDavid du Colombier comwork(fd, now, m);
429219b2ee8SDavid du Colombier terse=nocast=0;
430219b2ee8SDavid du Colombier }
431