xref: /plan9/sys/src/cmd/spin/pangen3.c (revision 00d970127b9d44d2b22f4f656717a212dec1f1d2)
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