xref: /plan9-contrib/sys/src/cmd/spin/pangen3.c (revision de2caf28f9ba1a56e70be94a699435d36eb50311)
1219b2ee8SDavid du Colombier /***** spin: pangen3.c *****/
2219b2ee8SDavid du Colombier 
3*de2caf28SDavid du Colombier /*
4*de2caf28SDavid du Colombier  * This file is part of the public release of Spin. It is subject to the
5*de2caf28SDavid du Colombier  * terms in the LICENSE file that is included in this source directory.
6*de2caf28SDavid du Colombier  * Tool documentation is available at http://spinroot.com
7*de2caf28SDavid du Colombier  */
8219b2ee8SDavid du Colombier 
9219b2ee8SDavid du Colombier #include "spin.h"
10219b2ee8SDavid du Colombier #include "y.tab.h"
11*de2caf28SDavid du Colombier #include <assert.h>
12219b2ee8SDavid du Colombier 
13*de2caf28SDavid du Colombier extern FILE	*fd_th, *fd_tc;
14*de2caf28SDavid du Colombier extern int	eventmapnr, old_priority_rules, in_settr;
15219b2ee8SDavid du Colombier 
16219b2ee8SDavid du Colombier typedef struct SRC {
1700d97012SDavid du Colombier 	int ln, st;	/* linenr, statenr */
187dd7cddfSDavid du Colombier 	Symbol *fn;	/* filename */
19219b2ee8SDavid du Colombier 	struct SRC *nxt;
20219b2ee8SDavid du Colombier } SRC;
21219b2ee8SDavid du Colombier 
227dd7cddfSDavid du Colombier static int	col;
237dd7cddfSDavid du Colombier static Symbol	*lastfnm;
247dd7cddfSDavid du Colombier static Symbol	lastdef;
257dd7cddfSDavid du Colombier static int	lastfrom;
267dd7cddfSDavid du Colombier static SRC	*frst = (SRC *) 0;
277dd7cddfSDavid du Colombier static SRC	*skip = (SRC *) 0;
28219b2ee8SDavid du Colombier 
2900d97012SDavid du Colombier extern int	ltl_mode;
3000d97012SDavid du Colombier 
31*de2caf28SDavid du Colombier extern void	sr_mesg(FILE *, int, int, const char *);
32*de2caf28SDavid du Colombier extern Lextok	**find_mtype_list(const char *);
337dd7cddfSDavid du Colombier 
347dd7cddfSDavid du Colombier static void
putnr(int n)357dd7cddfSDavid du Colombier putnr(int n)
367dd7cddfSDavid du Colombier {
377dd7cddfSDavid du Colombier 	if (col++ == 8)
38*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "\n\t");	/* was th */
397dd7cddfSDavid du Colombier 		col = 1;
407dd7cddfSDavid du Colombier 	}
41*de2caf28SDavid du Colombier 	fprintf(fd_tc, "%3d, ", n);	/* was th */
427dd7cddfSDavid du Colombier }
437dd7cddfSDavid du Colombier 
447dd7cddfSDavid du Colombier static void
putfnm(int j,Symbol * s)457dd7cddfSDavid du Colombier putfnm(int j, Symbol *s)
467dd7cddfSDavid du Colombier {
477dd7cddfSDavid du Colombier 	if (lastfnm && lastfnm == s && j != -1)
487dd7cddfSDavid du Colombier 		return;
497dd7cddfSDavid du Colombier 
507dd7cddfSDavid du Colombier 	if (lastfnm)
51*de2caf28SDavid du Colombier 		fprintf(fd_tc, "{ \"%s\", %d, %d },\n\t",	/* was th */
527dd7cddfSDavid du Colombier 			lastfnm->name,
537dd7cddfSDavid du Colombier 			lastfrom,
547dd7cddfSDavid du Colombier 			j-1);
557dd7cddfSDavid du Colombier 	lastfnm = s;
567dd7cddfSDavid du Colombier 	lastfrom = j;
577dd7cddfSDavid du Colombier }
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier static void
putfnm_flush(int j)607dd7cddfSDavid du Colombier putfnm_flush(int j)
617dd7cddfSDavid du Colombier {
62f3793cddSDavid du Colombier 	if (lastfnm)
63*de2caf28SDavid du Colombier 		fprintf(fd_tc, "{ \"%s\", %d, %d }\n",	/* was th */
647dd7cddfSDavid du Colombier 			lastfnm->name,
657dd7cddfSDavid du Colombier 			lastfrom, j);
667dd7cddfSDavid du Colombier }
67219b2ee8SDavid du Colombier 
68*de2caf28SDavid du Colombier static SRC *
newsrc(int m,SRC * n)69*de2caf28SDavid du Colombier newsrc(int m, SRC *n)
70219b2ee8SDavid du Colombier {	SRC *tmp;
71219b2ee8SDavid du Colombier 	tmp = (SRC *) emalloc(sizeof(SRC));
7200d97012SDavid du Colombier 	tmp->st  = m;
73*de2caf28SDavid du Colombier 	tmp->nxt = n;
74*de2caf28SDavid du Colombier 	return tmp;
75*de2caf28SDavid du Colombier }
76*de2caf28SDavid du Colombier 
77*de2caf28SDavid du Colombier void
putskip(int m)78*de2caf28SDavid du Colombier putskip(int m)	/* states that need not be reached */
79*de2caf28SDavid du Colombier {	SRC *tmp, *lst = (SRC *)0;
80*de2caf28SDavid du Colombier 	/* 6.4.0: now an ordered list */
81*de2caf28SDavid du Colombier 	for (tmp = skip; tmp; lst = tmp, tmp = tmp->nxt)
82*de2caf28SDavid du Colombier 	{	if (tmp->st == m)
83*de2caf28SDavid du Colombier 		{	return;
84*de2caf28SDavid du Colombier 		}
85*de2caf28SDavid du Colombier 		if (tmp->st > m)	/* insert before */
86*de2caf28SDavid du Colombier 		{	if (tmp == skip)
87*de2caf28SDavid du Colombier 			{	tmp = newsrc(m, skip);
88219b2ee8SDavid du Colombier 				skip = tmp;
89*de2caf28SDavid du Colombier 			} else
90*de2caf28SDavid du Colombier 			{	assert(lst);
91*de2caf28SDavid du Colombier 				tmp = newsrc(m, lst->nxt);
92*de2caf28SDavid du Colombier 				lst->nxt = tmp;
93*de2caf28SDavid du Colombier 			}
94*de2caf28SDavid du Colombier 			return;
95*de2caf28SDavid du Colombier 	}	}
96*de2caf28SDavid du Colombier 	/* insert at the end */
97*de2caf28SDavid du Colombier 	if (lst)
98*de2caf28SDavid du Colombier 	{	lst->nxt = newsrc(m, 0);
99*de2caf28SDavid du Colombier 	} else	/* empty list */
100*de2caf28SDavid du Colombier 	{	skip = newsrc(m, 0);
101*de2caf28SDavid du Colombier 	}
102219b2ee8SDavid du Colombier }
103219b2ee8SDavid du Colombier 
104219b2ee8SDavid du Colombier void
unskip(int m)105219b2ee8SDavid du Colombier unskip(int m)	/* a state that needs to be reached after all */
106219b2ee8SDavid du Colombier {	SRC *tmp, *lst = (SRC *)0;
107219b2ee8SDavid du Colombier 
108219b2ee8SDavid du Colombier 	for (tmp = skip; tmp; lst = tmp, tmp = tmp->nxt)
109*de2caf28SDavid du Colombier 	{	if (tmp->st == m)
110219b2ee8SDavid du Colombier 		{	if (tmp == skip)
111219b2ee8SDavid du Colombier 				skip = skip->nxt;
11200d97012SDavid du Colombier 			else if (lst)	/* always true, but helps coverity */
113219b2ee8SDavid du Colombier 				lst->nxt = tmp->nxt;
114219b2ee8SDavid du Colombier 			break;
115219b2ee8SDavid du Colombier 		}
116*de2caf28SDavid du Colombier 		if (tmp->st > m)
117*de2caf28SDavid du Colombier 		{	break;	/* m is not in list */
118*de2caf28SDavid du Colombier 	}	}
119219b2ee8SDavid du Colombier }
120219b2ee8SDavid du Colombier 
121219b2ee8SDavid du Colombier void
putsrc(Element * e)1227dd7cddfSDavid du Colombier putsrc(Element *e)	/* match states to source lines */
123*de2caf28SDavid du Colombier {	SRC *tmp, *lst = (SRC *)0;
1247dd7cddfSDavid du Colombier 	int n, m;
1257dd7cddfSDavid du Colombier 
1267dd7cddfSDavid du Colombier 	if (!e || !e->n) return;
1277dd7cddfSDavid du Colombier 
1287dd7cddfSDavid du Colombier 	n = e->n->ln;
1297dd7cddfSDavid du Colombier 	m = e->seqno;
130*de2caf28SDavid du Colombier 	/* 6.4.0: now an ordered list */
131*de2caf28SDavid du Colombier 	for (tmp = frst; tmp; lst = tmp, tmp = tmp->nxt)
132*de2caf28SDavid du Colombier 	{	if (tmp->st == m)
1337dd7cddfSDavid du Colombier 		{	if (tmp->ln != n || tmp->fn != e->n->fn)
13400d97012SDavid du Colombier 			printf("putsrc mismatch seqno %d, line %d - %d, file %s\n", m, n,
135312a1df1SDavid du Colombier 				tmp->ln, tmp->fn->name);
136219b2ee8SDavid du Colombier 			return;
137219b2ee8SDavid du Colombier 		}
138*de2caf28SDavid du Colombier 		if (tmp->st > m) /* insert before */
139*de2caf28SDavid du Colombier 		{	if (tmp == frst)
140*de2caf28SDavid du Colombier 			{	tmp = newsrc(m, frst);
141219b2ee8SDavid du Colombier 				frst = tmp;
142*de2caf28SDavid du Colombier 			} else
143*de2caf28SDavid du Colombier 			{	assert(lst);
144*de2caf28SDavid du Colombier 				tmp = newsrc(m, lst->nxt);
145*de2caf28SDavid du Colombier 				lst->nxt = tmp;
146*de2caf28SDavid du Colombier 			}
147*de2caf28SDavid du Colombier 			tmp->ln = n;
148*de2caf28SDavid du Colombier 			tmp->fn = e->n->fn;
149*de2caf28SDavid du Colombier 			return;
150*de2caf28SDavid du Colombier 	}	}
151*de2caf28SDavid du Colombier 	/* insert at the end */
152*de2caf28SDavid du Colombier 	tmp = newsrc(m, lst?lst->nxt:0);
153*de2caf28SDavid du Colombier 	tmp->ln = n;
154*de2caf28SDavid du Colombier 	tmp->fn = e->n->fn;
155*de2caf28SDavid du Colombier 	if (lst)
156*de2caf28SDavid du Colombier 	{	lst->nxt = tmp;
157*de2caf28SDavid du Colombier 	} else
158*de2caf28SDavid du Colombier 	{	frst = tmp;
159*de2caf28SDavid du Colombier 	}
160219b2ee8SDavid du Colombier }
161219b2ee8SDavid du Colombier 
1627dd7cddfSDavid du Colombier static void
dumpskip(int n,int m)163219b2ee8SDavid du Colombier dumpskip(int n, int m)
164219b2ee8SDavid du Colombier {	SRC *tmp, *lst;
165*de2caf28SDavid du Colombier 	FILE *tz = fd_tc;	/* was fd_th */
166219b2ee8SDavid du Colombier 	int j;
167219b2ee8SDavid du Colombier 
168*de2caf28SDavid du Colombier 	fprintf(tz, "uchar reached%d [] = {\n\t", m);
169*de2caf28SDavid du Colombier 	tmp = skip;
170*de2caf28SDavid du Colombier 	lst = (SRC *) 0;
171219b2ee8SDavid du Colombier 	for (j = 0, col = 0; j <= n; j++)
172*de2caf28SDavid du Colombier 	{	/* find j in the sorted list */
173*de2caf28SDavid du Colombier 		for ( ; tmp; lst = tmp, tmp = tmp->nxt)
174*de2caf28SDavid du Colombier 		{	if (tmp->st == j)
175219b2ee8SDavid du Colombier 			{	putnr(1);
176219b2ee8SDavid du Colombier 				if (lst)
177219b2ee8SDavid du Colombier 					lst->nxt = tmp->nxt;
178219b2ee8SDavid du Colombier 				else
179219b2ee8SDavid du Colombier 					skip = tmp->nxt;
180219b2ee8SDavid du Colombier 				break;
181219b2ee8SDavid du Colombier 			}
182*de2caf28SDavid du Colombier 			if (tmp->st > j)
183*de2caf28SDavid du Colombier 			{	putnr(0);
184*de2caf28SDavid du Colombier 				break;	/* j is not in the list */
185*de2caf28SDavid du Colombier 		}	}
18600d97012SDavid du Colombier 
187*de2caf28SDavid du Colombier 		if (!tmp)
188*de2caf28SDavid du Colombier 		{	putnr(0);
189*de2caf28SDavid du Colombier 	}	}
190*de2caf28SDavid du Colombier 	fprintf(tz, "};\n");
191*de2caf28SDavid du Colombier 	fprintf(tz, "uchar *loopstate%d;\n", m);
19200d97012SDavid du Colombier 
1937dd7cddfSDavid du Colombier 	if (m == eventmapnr)
194*de2caf28SDavid du Colombier 		fprintf(fd_th, "#define reached_event	reached%d\n", m);
195219b2ee8SDavid du Colombier 
196219b2ee8SDavid du Colombier 	skip = (SRC *) 0;
197219b2ee8SDavid du Colombier }
198219b2ee8SDavid du Colombier 
199219b2ee8SDavid du Colombier void
dumpsrc(int n,int m)200219b2ee8SDavid du Colombier dumpsrc(int n, int m)
201219b2ee8SDavid du Colombier {	SRC *tmp, *lst;
202219b2ee8SDavid du Colombier 	int j;
20300d97012SDavid du Colombier 	static int did_claim = 0;
204*de2caf28SDavid du Colombier 	FILE *tz = fd_tc;	/* was fd_th */
205219b2ee8SDavid du Colombier 
206*de2caf28SDavid du Colombier 	fprintf(tz, "\nshort src_ln%d [] = {\n\t", m);
207*de2caf28SDavid du Colombier 	tmp = frst;
208219b2ee8SDavid du Colombier 	for (j = 0, col = 0; j <= n; j++)
209*de2caf28SDavid du Colombier 	{	for ( ; tmp; tmp = tmp->nxt)
210*de2caf28SDavid du Colombier 		{	if (tmp->st == j)
211219b2ee8SDavid du Colombier 			{	putnr(tmp->ln);
212219b2ee8SDavid du Colombier 				break;
213219b2ee8SDavid du Colombier 			}
214*de2caf28SDavid du Colombier 			if (tmp->st > j)
215*de2caf28SDavid du Colombier 			{	putnr(0);
216*de2caf28SDavid du Colombier 				break;
217*de2caf28SDavid du Colombier 		}	}
218219b2ee8SDavid du Colombier 		if (!tmp)
219*de2caf28SDavid du Colombier 		{	putnr(0);
220*de2caf28SDavid du Colombier 	}	}
221*de2caf28SDavid du Colombier 	fprintf(tz, "};\n");
222219b2ee8SDavid du Colombier 
2237dd7cddfSDavid du Colombier 	lastfnm = (Symbol *) 0;
22400d97012SDavid du Colombier 	lastdef.name = "-";
225*de2caf28SDavid du Colombier 	fprintf(tz, "S_F_MAP src_file%d [] = {\n\t", m);
226*de2caf28SDavid du Colombier 	tmp = frst;
227*de2caf28SDavid du Colombier 	lst = (SRC *) 0;
2287dd7cddfSDavid du Colombier 	for (j = 0, col = 0; j <= n; j++)
229*de2caf28SDavid du Colombier 	{	for ( ; tmp; lst = tmp, tmp = tmp->nxt)
230*de2caf28SDavid du Colombier 		{	if (tmp->st == j)
2317dd7cddfSDavid du Colombier 			{	putfnm(j, tmp->fn);
2327dd7cddfSDavid du Colombier 				if (lst)
2337dd7cddfSDavid du Colombier 					lst->nxt = tmp->nxt;
2347dd7cddfSDavid du Colombier 				else
2357dd7cddfSDavid du Colombier 					frst = tmp->nxt;
2367dd7cddfSDavid du Colombier 				break;
2377dd7cddfSDavid du Colombier 			}
238*de2caf28SDavid du Colombier 			if (tmp->st > j)
239*de2caf28SDavid du Colombier 			{	putfnm(j, &lastdef);
240*de2caf28SDavid du Colombier 				break;
241*de2caf28SDavid du Colombier 		}	}
2427dd7cddfSDavid du Colombier 		if (!tmp)
243*de2caf28SDavid du Colombier 		{	putfnm(j, &lastdef);
244*de2caf28SDavid du Colombier 	}	}
2457dd7cddfSDavid du Colombier 	putfnm_flush(j);
246*de2caf28SDavid du Colombier 	fprintf(tz, "};\n");
2477dd7cddfSDavid du Colombier 
24800d97012SDavid du Colombier 	if (pid_is_claim(m) && !did_claim)
249*de2caf28SDavid du Colombier 	{	fprintf(tz, "short *src_claim;\n");
25000d97012SDavid du Colombier 		did_claim++;
25100d97012SDavid du Colombier 	}
2527dd7cddfSDavid du Colombier 	if (m == eventmapnr)
253*de2caf28SDavid du Colombier 		fprintf(fd_th, "#define src_event	src_ln%d\n", m);
254219b2ee8SDavid du Colombier 
255219b2ee8SDavid du Colombier 	frst = (SRC *) 0;
256219b2ee8SDavid du Colombier 	dumpskip(n, m);
257219b2ee8SDavid du Colombier }
258219b2ee8SDavid du Colombier 
259219b2ee8SDavid du Colombier #define Cat0(x)   	comwork(fd,now->lft,m); fprintf(fd, x); \
260219b2ee8SDavid du Colombier 			comwork(fd,now->rgt,m)
261219b2ee8SDavid du Colombier #define Cat1(x)		fprintf(fd,"("); Cat0(x); fprintf(fd,")")
262219b2ee8SDavid du Colombier #define Cat2(x,y)  	fprintf(fd,x); comwork(fd,y,m)
263219b2ee8SDavid du Colombier #define Cat3(x,y,z)	fprintf(fd,x); comwork(fd,y,m); fprintf(fd,z)
264219b2ee8SDavid du Colombier 
2657dd7cddfSDavid du Colombier static int
symbolic(FILE * fd,Lextok * tv)266219b2ee8SDavid du Colombier symbolic(FILE *fd, Lextok *tv)
267*de2caf28SDavid du Colombier {	Lextok *n, *Mtype;
268219b2ee8SDavid du Colombier 	int cnt = 1;
269219b2ee8SDavid du Colombier 
270219b2ee8SDavid du Colombier 	if (tv->ismtyp)
271*de2caf28SDavid du Colombier 	{	char *s = "_unnamed_";
272*de2caf28SDavid du Colombier 		if (tv->sym && tv->sym->mtype_name)
273*de2caf28SDavid du Colombier 		{	s = tv->sym->mtype_name->name;
274*de2caf28SDavid du Colombier 		}
275*de2caf28SDavid du Colombier 		Mtype = *find_mtype_list(s);
276219b2ee8SDavid du Colombier 		for (n = Mtype; n; n = n->rgt, cnt++)
277*de2caf28SDavid du Colombier 		{	if (cnt == tv->val)
278219b2ee8SDavid du Colombier 			{	fprintf(fd, "%s", n->lft->sym->name);
279219b2ee8SDavid du Colombier 				return 1;
280*de2caf28SDavid du Colombier 	}	}	}
281*de2caf28SDavid du Colombier 
282219b2ee8SDavid du Colombier 	return 0;
283219b2ee8SDavid du Colombier }
284219b2ee8SDavid du Colombier 
2857dd7cddfSDavid du Colombier static void
comwork(FILE * fd,Lextok * now,int m)286219b2ee8SDavid du Colombier comwork(FILE *fd, Lextok *now, int m)
287219b2ee8SDavid du Colombier {	Lextok *v;
288*de2caf28SDavid du Colombier 	char *s = 0;
2897dd7cddfSDavid du Colombier 	int i, j;
290219b2ee8SDavid du Colombier 
291219b2ee8SDavid du Colombier 	if (!now) { fprintf(fd, "0"); return; }
292219b2ee8SDavid du Colombier 	switch (now->ntyp) {
293*de2caf28SDavid du Colombier 	case CONST:	if (now->ismtyp
294*de2caf28SDavid du Colombier 			&&  now->sym
295*de2caf28SDavid du Colombier 			&&  now->sym->mtype_name)
296*de2caf28SDavid du Colombier 			{	s = now->sym->mtype_name->name;
297*de2caf28SDavid du Colombier 			}
298*de2caf28SDavid du Colombier 			sr_mesg(fd, now->val, now->ismtyp, s);
299*de2caf28SDavid du Colombier 			break;
300*de2caf28SDavid du Colombier 
301219b2ee8SDavid du Colombier 	case '!':	Cat3("!(", now->lft, ")"); break;
302219b2ee8SDavid du Colombier 	case UMIN:	Cat3("-(", now->lft, ")"); break;
303219b2ee8SDavid du Colombier 	case '~':	Cat3("~(", now->lft, ")"); break;
304219b2ee8SDavid du Colombier 
305219b2ee8SDavid du Colombier 	case '/':	Cat1("/");  break;
306219b2ee8SDavid du Colombier 	case '*':	Cat1("*");  break;
307219b2ee8SDavid du Colombier 	case '-':	Cat1("-");  break;
308219b2ee8SDavid du Colombier 	case '+':	Cat1("+");  break;
309219b2ee8SDavid du Colombier 	case '%':	Cat1("%%"); break;
310219b2ee8SDavid du Colombier 	case '&':	Cat1("&");  break;
3117dd7cddfSDavid du Colombier 	case '^':	Cat1("^");  break;
312219b2ee8SDavid du Colombier 	case '|':	Cat1("|");  break;
313219b2ee8SDavid du Colombier 	case LE:	Cat1("<="); break;
314219b2ee8SDavid du Colombier 	case GE:	Cat1(">="); break;
315219b2ee8SDavid du Colombier 	case GT:	Cat1(">"); break;
316219b2ee8SDavid du Colombier 	case LT:	Cat1("<"); break;
317219b2ee8SDavid du Colombier 	case NE:	Cat1("!="); break;
31800d97012SDavid du Colombier 	case EQ:
31900d97012SDavid du Colombier 			if (ltl_mode
32000d97012SDavid du Colombier 			&&  now->lft->ntyp == 'p'
32100d97012SDavid du Colombier 			&&  now->rgt->ntyp == 'q')	/* remote ref */
32200d97012SDavid du Colombier 			{	Lextok *p = now->lft->lft;
32300d97012SDavid du Colombier 
32400d97012SDavid du Colombier 				fprintf(fd, "(");
32500d97012SDavid du Colombier 				fprintf(fd, "%s", p->sym->name);
32600d97012SDavid du Colombier 				if (p->lft)
32700d97012SDavid du Colombier 				{	fprintf(fd, "[");
32800d97012SDavid du Colombier 					putstmnt(fd, p->lft, 0); /* pid */
32900d97012SDavid du Colombier 					fprintf(fd, "]");
33000d97012SDavid du Colombier 				}
33100d97012SDavid du Colombier 				fprintf(fd, "@");
33200d97012SDavid du Colombier 				fprintf(fd, "%s", now->rgt->sym->name);
33300d97012SDavid du Colombier 				fprintf(fd, ")");
33400d97012SDavid du Colombier 				break;
33500d97012SDavid du Colombier 			}
33600d97012SDavid du Colombier 			Cat1("==");
33700d97012SDavid du Colombier 			break;
33800d97012SDavid du Colombier 
339219b2ee8SDavid du Colombier 	case OR:	Cat1("||"); break;
340219b2ee8SDavid du Colombier 	case AND:	Cat1("&&"); break;
341219b2ee8SDavid du Colombier 	case LSHIFT:	Cat1("<<"); break;
342219b2ee8SDavid du Colombier 	case RSHIFT:	Cat1(">>"); break;
343219b2ee8SDavid du Colombier 
344219b2ee8SDavid du Colombier 	case RUN:	fprintf(fd, "run %s(", now->sym->name);
345219b2ee8SDavid du Colombier 			for (v = now->lft; v; v = v->rgt)
346219b2ee8SDavid du Colombier 				if (v == now->lft)
3477dd7cddfSDavid du Colombier 				{	comwork(fd, v->lft, m);
348219b2ee8SDavid du Colombier 				} else
349219b2ee8SDavid du Colombier 				{	Cat2(",", v->lft);
350219b2ee8SDavid du Colombier 				}
351219b2ee8SDavid du Colombier 			fprintf(fd, ")");
352219b2ee8SDavid du Colombier 			break;
353219b2ee8SDavid du Colombier 
354219b2ee8SDavid du Colombier 	case LEN:	putname(fd, "len(", now->lft, m, ")");
355219b2ee8SDavid du Colombier 			break;
356219b2ee8SDavid du Colombier 	case FULL:	putname(fd, "full(", now->lft, m, ")");
357219b2ee8SDavid du Colombier 			break;
358219b2ee8SDavid du Colombier 	case EMPTY:	putname(fd, "empty(", now->lft, m, ")");
359219b2ee8SDavid du Colombier 			break;
360219b2ee8SDavid du Colombier 	case NFULL:	putname(fd, "nfull(", now->lft, m, ")");
361219b2ee8SDavid du Colombier 			break;
362219b2ee8SDavid du Colombier 	case NEMPTY:	putname(fd, "nempty(", now->lft, m, ")");
363219b2ee8SDavid du Colombier 			break;
364219b2ee8SDavid du Colombier 
365219b2ee8SDavid du Colombier 	case 's':	putname(fd, "", now->lft, m, now->val?"!!":"!");
366219b2ee8SDavid du Colombier 			for (v = now->rgt, i=0; v; v = v->rgt, i++)
367219b2ee8SDavid du Colombier 			{	if (v != now->rgt) fprintf(fd,",");
368219b2ee8SDavid du Colombier 				if (!symbolic(fd, v->lft))
369219b2ee8SDavid du Colombier 					comwork(fd,v->lft,m);
370219b2ee8SDavid du Colombier 			}
371219b2ee8SDavid du Colombier 			break;
3727dd7cddfSDavid du Colombier 	case 'r':	putname(fd, "", now->lft, m, "?");
3737dd7cddfSDavid du Colombier 			switch (now->val) {
3747dd7cddfSDavid du Colombier 			case 0: break;
3757dd7cddfSDavid du Colombier 			case 1: fprintf(fd, "?");  break;
3767dd7cddfSDavid du Colombier 			case 2: fprintf(fd, "<");  break;
3777dd7cddfSDavid du Colombier 			case 3: fprintf(fd, "?<"); break;
3787dd7cddfSDavid du Colombier 			}
379219b2ee8SDavid du Colombier 			for (v = now->rgt, i=0; v; v = v->rgt, i++)
380219b2ee8SDavid du Colombier 			{	if (v != now->rgt) fprintf(fd,",");
381219b2ee8SDavid du Colombier 				if (!symbolic(fd, v->lft))
382219b2ee8SDavid du Colombier 					comwork(fd,v->lft,m);
383219b2ee8SDavid du Colombier 			}
3847dd7cddfSDavid du Colombier 			if (now->val >= 2)
3857dd7cddfSDavid du Colombier 				fprintf(fd, ">");
386219b2ee8SDavid du Colombier 			break;
387219b2ee8SDavid du Colombier 	case 'R':	putname(fd, "", now->lft, m,  now->val?"??[":"?[");
388219b2ee8SDavid du Colombier 			for (v = now->rgt, i=0; v; v = v->rgt, i++)
389219b2ee8SDavid du Colombier 			{	if (v != now->rgt) fprintf(fd,",");
390219b2ee8SDavid du Colombier 				if (!symbolic(fd, v->lft))
391219b2ee8SDavid du Colombier 					comwork(fd,v->lft,m);
392219b2ee8SDavid du Colombier 			}
393219b2ee8SDavid du Colombier 			fprintf(fd, "]");
394219b2ee8SDavid du Colombier 			break;
395219b2ee8SDavid du Colombier 
396219b2ee8SDavid du Colombier 	case ENABLED:	Cat3("enabled(", now->lft, ")");
397219b2ee8SDavid du Colombier 			break;
398219b2ee8SDavid du Colombier 
399*de2caf28SDavid du Colombier 	case GET_P:	if (old_priority_rules)
400*de2caf28SDavid du Colombier 			{	fprintf(fd, "1");
401*de2caf28SDavid du Colombier 			} else
402*de2caf28SDavid du Colombier 			{	Cat3("get_priority(", now->lft, ")");
403*de2caf28SDavid du Colombier 			}
404*de2caf28SDavid du Colombier 			break;
405*de2caf28SDavid du Colombier 
406*de2caf28SDavid du Colombier 	case SET_P:	if (!old_priority_rules)
407*de2caf28SDavid du Colombier 			{	fprintf(fd, "set_priority(");
408*de2caf28SDavid du Colombier 				comwork(fd, now->lft->lft, m);
409*de2caf28SDavid du Colombier 				fprintf(fd, ", ");
410*de2caf28SDavid du Colombier 				comwork(fd, now->lft->rgt, m);
411*de2caf28SDavid du Colombier 				fprintf(fd, ")");
412*de2caf28SDavid du Colombier 			}
413*de2caf28SDavid du Colombier 			break;
414*de2caf28SDavid du Colombier 
415*de2caf28SDavid du Colombier 	case EVAL:	if (now->lft->ntyp == ',')
416*de2caf28SDavid du Colombier 			{	Cat3("eval(", now->lft->lft, ")");
417*de2caf28SDavid du Colombier 			} else
418*de2caf28SDavid du Colombier 			{	Cat3("eval(", now->lft, ")");
419*de2caf28SDavid du Colombier 			}
4207dd7cddfSDavid du Colombier 			break;
4217dd7cddfSDavid du Colombier 
4227dd7cddfSDavid du Colombier 	case NONPROGRESS:
4237dd7cddfSDavid du Colombier 			fprintf(fd, "np_");
4247dd7cddfSDavid du Colombier 			break;
4257dd7cddfSDavid du Colombier 
426219b2ee8SDavid du Colombier 	case PC_VAL:	Cat3("pc_value(", now->lft, ")");
427219b2ee8SDavid du Colombier 			break;
428219b2ee8SDavid du Colombier 
429219b2ee8SDavid du Colombier 	case 'c':	Cat3("(", now->lft, ")");
430219b2ee8SDavid du Colombier 			break;
431219b2ee8SDavid du Colombier 
432312a1df1SDavid du Colombier 	case '?':	if (now->lft)
433312a1df1SDavid du Colombier 			{	Cat3("( (", now->lft, ") -> ");
434312a1df1SDavid du Colombier 			}
435312a1df1SDavid du Colombier 			if (now->rgt)
436312a1df1SDavid du Colombier 			{	Cat3("(", now->rgt->lft, ") : ");
437219b2ee8SDavid du Colombier 				Cat3("(", now->rgt->rgt, ") )");
438312a1df1SDavid du Colombier 			}
439219b2ee8SDavid du Colombier 			break;
440219b2ee8SDavid du Colombier 
441*de2caf28SDavid du Colombier 	case ASGN:
442*de2caf28SDavid du Colombier 			if (check_track(now) == STRUCT) { break; }
443*de2caf28SDavid du Colombier 			comwork(fd,now->lft,m);
444219b2ee8SDavid du Colombier 			fprintf(fd," = ");
445219b2ee8SDavid du Colombier 			comwork(fd,now->rgt,m);
446219b2ee8SDavid du Colombier 			break;
447219b2ee8SDavid du Colombier 
448*de2caf28SDavid du Colombier 	case PRINT:	{	char c, buf[1024];
449219b2ee8SDavid du Colombier 				strncpy(buf, now->sym->name, 510);
450219b2ee8SDavid du Colombier 				for (i = j = 0; i < 510; i++, j++)
451219b2ee8SDavid du Colombier 				{	c = now->sym->name[i];
452219b2ee8SDavid du Colombier 					buf[j] = c;
453219b2ee8SDavid du Colombier 					if (c == '\\') buf[++j] = c;
454219b2ee8SDavid du Colombier 					if (c == '\"') buf[j] = '\'';
455219b2ee8SDavid du Colombier 					if (c == '\0') break;
456219b2ee8SDavid du Colombier 				}
4577dd7cddfSDavid du Colombier 				if (now->ntyp == PRINT)
4587dd7cddfSDavid du Colombier 					fprintf(fd, "printf");
4597dd7cddfSDavid du Colombier 				else
4607dd7cddfSDavid du Colombier 					fprintf(fd, "annotate");
4617dd7cddfSDavid du Colombier 				fprintf(fd, "(%s", buf);
462219b2ee8SDavid du Colombier 			}
463219b2ee8SDavid du Colombier 			for (v = now->lft; v; v = v->rgt)
464219b2ee8SDavid du Colombier 			{	Cat2(",", v->lft);
465219b2ee8SDavid du Colombier 			}
466219b2ee8SDavid du Colombier 			fprintf(fd, ")");
467219b2ee8SDavid du Colombier 			break;
468312a1df1SDavid du Colombier 	case PRINTM:	fprintf(fd, "printm(");
469*de2caf28SDavid du Colombier 			{ char *s = 0;
470*de2caf28SDavid du Colombier 		  	  if (now->lft->sym
471*de2caf28SDavid du Colombier 		  	  &&  now->lft->sym->mtype_name)
472*de2caf28SDavid du Colombier 		  	  {	s = now->lft->sym->mtype_name->name;
473*de2caf28SDavid du Colombier 		  	  }
474*de2caf28SDavid du Colombier 
475*de2caf28SDavid du Colombier 			  if (now->lft && now->lft->ismtyp)
476*de2caf28SDavid du Colombier 			  {	fprintf(fd, "%d", now->lft->val);
477*de2caf28SDavid du Colombier 			  } else
478*de2caf28SDavid du Colombier 			  {	comwork(fd, now->lft, m);
479*de2caf28SDavid du Colombier 			  }
480*de2caf28SDavid du Colombier 
481*de2caf28SDavid du Colombier 			  if (s)
482*de2caf28SDavid du Colombier 			  {	if (in_settr)
483*de2caf28SDavid du Colombier 				{	fprintf(fd, ", '%s')", s);
484*de2caf28SDavid du Colombier 				} else
485*de2caf28SDavid du Colombier 				{	fprintf(fd, ", \"%s\")", s);
486*de2caf28SDavid du Colombier 				}
487*de2caf28SDavid du Colombier 			  } else
488*de2caf28SDavid du Colombier 			  {	fprintf(fd, ", 0)");
489*de2caf28SDavid du Colombier 			  }
490*de2caf28SDavid du Colombier 			}
491312a1df1SDavid du Colombier 			break;
49200d97012SDavid du Colombier 	case NAME:
49300d97012SDavid du Colombier 			putname(fd, "", now, m, "");
494219b2ee8SDavid du Colombier 			break;
49500d97012SDavid du Colombier 
496*de2caf28SDavid du Colombier 	case   'p':
497*de2caf28SDavid du Colombier 			if (ltl_mode)
49800d97012SDavid du Colombier 			{	fprintf(fd, "%s", now->lft->sym->name); /* proctype */
49900d97012SDavid du Colombier 				if (now->lft->lft)
50000d97012SDavid du Colombier 				{	fprintf(fd, "[");
50100d97012SDavid du Colombier 					putstmnt(fd, now->lft->lft, 0); /* pid */
50200d97012SDavid du Colombier 					fprintf(fd, "]");
50300d97012SDavid du Colombier 				}
50400d97012SDavid du Colombier 				fprintf(fd, ":");	/* remote varref */
50500d97012SDavid du Colombier 				fprintf(fd, "%s", now->sym->name);	/* varname */
50600d97012SDavid du Colombier 				break;
50700d97012SDavid du Colombier 			}
50800d97012SDavid du Colombier 			putremote(fd, now, m);
509219b2ee8SDavid du Colombier 			break;
510219b2ee8SDavid du Colombier 	case   'q':	fprintf(fd, "%s", now->sym->name);
511219b2ee8SDavid du Colombier 			break;
512312a1df1SDavid du Colombier 	case C_EXPR:
513312a1df1SDavid du Colombier 	case C_CODE:	fprintf(fd, "{%s}", now->sym->name);
514312a1df1SDavid du Colombier 			break;
515219b2ee8SDavid du Colombier 	case ASSERT:	Cat3("assert(", now->lft, ")");
516219b2ee8SDavid du Colombier 			break;
517219b2ee8SDavid du Colombier 	case   '.':	fprintf(fd, ".(goto)"); break;
5187dd7cddfSDavid du Colombier 	case  GOTO:	fprintf(fd, "goto %s", now->sym->name); break;
519219b2ee8SDavid du Colombier 	case BREAK:	fprintf(fd, "break"); break;
520219b2ee8SDavid du Colombier 	case  ELSE:	fprintf(fd, "else"); break;
521219b2ee8SDavid du Colombier 	case   '@':	fprintf(fd, "-end-"); break;
522219b2ee8SDavid du Colombier 
523*de2caf28SDavid du Colombier 	case D_STEP:	fprintf(fd, "D_STEP%d", now->ln); break;
524219b2ee8SDavid du Colombier 	case ATOMIC:	fprintf(fd, "ATOMIC"); break;
525219b2ee8SDavid du Colombier 	case NON_ATOMIC: fprintf(fd, "sub-sequence"); break;
526219b2ee8SDavid du Colombier 	case IF:	fprintf(fd, "IF"); break;
527219b2ee8SDavid du Colombier 	case DO:	fprintf(fd, "DO"); break;
528219b2ee8SDavid du Colombier 	case UNLESS:	fprintf(fd, "unless"); break;
529219b2ee8SDavid du Colombier 	case TIMEOUT:	fprintf(fd, "timeout"); break;
530219b2ee8SDavid du Colombier 	default:	if (isprint(now->ntyp))
531219b2ee8SDavid du Colombier 				fprintf(fd, "'%c'", now->ntyp);
532219b2ee8SDavid du Colombier 			else
533219b2ee8SDavid du Colombier 				fprintf(fd, "%d", now->ntyp);
534219b2ee8SDavid du Colombier 			break;
535219b2ee8SDavid du Colombier 	}
536219b2ee8SDavid du Colombier }
537219b2ee8SDavid du Colombier 
538219b2ee8SDavid du Colombier void
comment(FILE * fd,Lextok * now,int m)539219b2ee8SDavid du Colombier comment(FILE *fd, Lextok *now, int m)
5407dd7cddfSDavid du Colombier {	extern short terse, nocast;
541219b2ee8SDavid du Colombier 
542219b2ee8SDavid du Colombier 	terse=nocast=1;
543219b2ee8SDavid du Colombier 	comwork(fd, now, m);
544219b2ee8SDavid du Colombier 	terse=nocast=0;
545219b2ee8SDavid du Colombier }
546