xref: /plan9-contrib/sys/src/cmd/spin/pangen1.c (revision de2caf28f9ba1a56e70be94a699435d36eb50311)
1219b2ee8SDavid du Colombier /***** spin: pangen1.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"
11219b2ee8SDavid du Colombier #include "pangen1.h"
12219b2ee8SDavid du Colombier #include "pangen3.h"
1300d97012SDavid du Colombier #include "pangen6.h"
1400d97012SDavid du Colombier #include <assert.h>
15219b2ee8SDavid du Colombier 
16*de2caf28SDavid du Colombier extern FILE	*fd_tc, *fd_th, *fd_tt;
177dd7cddfSDavid du Colombier extern Label	*labtab;
187dd7cddfSDavid du Colombier extern Ordered	*all_names;
19*de2caf28SDavid du Colombier extern ProcList	*ready;
20219b2ee8SDavid du Colombier extern Queue	*qtab;
217dd7cddfSDavid du Colombier extern Symbol	*Fname;
22*de2caf28SDavid du Colombier extern int	lineno, verbose, Pid_nr, separate, old_scope_rules, nclaims;
23*de2caf28SDavid du Colombier extern int	nrRdy, nrqs, mstp, Mpars, claimnr, eventmapnr;
24*de2caf28SDavid du Colombier extern short	has_sorted, has_random, has_provided, has_priority;
2500d97012SDavid du Colombier extern Queue	*ltab[];
26219b2ee8SDavid du Colombier 
27312a1df1SDavid du Colombier int	Npars=0, u_sync=0, u_async=0, hastrack = 1;
28312a1df1SDavid du Colombier short	has_io = 0;
29312a1df1SDavid du Colombier short	has_state=0;	/* code contains c_state */
30219b2ee8SDavid du Colombier 
31*de2caf28SDavid du Colombier extern void	c_add_stack(FILE *);
32*de2caf28SDavid du Colombier extern void	c_stack_size(FILE *);
33*de2caf28SDavid du Colombier 
347dd7cddfSDavid du Colombier static Symbol	*LstSet=ZS;
357dd7cddfSDavid du Colombier static int	acceptors=0, progressors=0, nBits=0;
367dd7cddfSDavid du Colombier static int	Types[] = { UNSIGNED, BIT, BYTE, CHAN, MTYPE, SHORT, INT, STRUCT };
377dd7cddfSDavid du Colombier 
387dd7cddfSDavid du Colombier static int	doglobal(char *, int);
397dd7cddfSDavid du Colombier static void	dohidden(void);
407dd7cddfSDavid du Colombier static void	do_init(FILE *, Symbol *);
417dd7cddfSDavid du Colombier static void	end_labs(Symbol *, int);
4200d97012SDavid du Colombier static void	put_ptype(char *, int, int, int, enum btypes);
437dd7cddfSDavid du Colombier static void	tc_predef_np(void);
447dd7cddfSDavid du Colombier static void	put_pinit(ProcList *);
4500d97012SDavid du Colombier static void	multi_init(void);
467dd7cddfSDavid du Colombier        void	walk_struct(FILE *, int, char *, Symbol *, char *, char *, char *);
477dd7cddfSDavid du Colombier 
487dd7cddfSDavid du Colombier static void
reverse_names(ProcList * p)49219b2ee8SDavid du Colombier reverse_names(ProcList *p)
50219b2ee8SDavid du Colombier {
51219b2ee8SDavid du Colombier 	if (!p) return;
52219b2ee8SDavid du Colombier 	reverse_names(p->nxt);
53*de2caf28SDavid du Colombier 	fprintf(fd_tc, "   \"%s\",\n", p->n->name);
54219b2ee8SDavid du Colombier }
5500d97012SDavid du Colombier static void
reverse_types(ProcList * p)5600d97012SDavid du Colombier reverse_types(ProcList *p)
5700d97012SDavid du Colombier {
5800d97012SDavid du Colombier 	if (!p) return;
5900d97012SDavid du Colombier 	reverse_types(p->nxt);
60*de2caf28SDavid du Colombier 	fprintf(fd_tc, "   %d,	/* %s */\n", p->b, p->n->name);
6100d97012SDavid du Colombier }
6200d97012SDavid du Colombier 
6300d97012SDavid du Colombier static int
blog(int n)6400d97012SDavid du Colombier blog(int n)	/* for small log2 without rounding problems */
6500d97012SDavid du Colombier {	int m=1, r=2;
6600d97012SDavid du Colombier 
6700d97012SDavid du Colombier 	while (r < n) { m++; r *= 2; }
6800d97012SDavid du Colombier 	return 1+m;
6900d97012SDavid du Colombier }
70219b2ee8SDavid du Colombier 
71219b2ee8SDavid du Colombier void
genheader(void)72219b2ee8SDavid du Colombier genheader(void)
73219b2ee8SDavid du Colombier {	ProcList *p; int i;
74219b2ee8SDavid du Colombier 
75312a1df1SDavid du Colombier 	if (separate == 2)
76*de2caf28SDavid du Colombier 	{	putunames(fd_th);
77312a1df1SDavid du Colombier 		goto here;
78312a1df1SDavid du Colombier 	}
7900d97012SDavid du Colombier 	/* 5.2.3: gcc 3 no longer seems to compute sizeof at compile time */
80*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define WS		%d /* word size in bytes */\n", (int) sizeof(void *));
81*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define SYNC	%d\n", u_sync);
82*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define ASYNC	%d\n\n", u_async);
83*de2caf28SDavid du Colombier 	fprintf(fd_th, "#ifndef NCORE\n");
84*de2caf28SDavid du Colombier 	fprintf(fd_th, "	#ifdef DUAL_CORE\n");
85*de2caf28SDavid du Colombier 	fprintf(fd_th, "		#define NCORE	2\n");
86*de2caf28SDavid du Colombier 	fprintf(fd_th, "	#elif QUAD_CORE\n");
87*de2caf28SDavid du Colombier 	fprintf(fd_th, "		#define NCORE	4\n");
88*de2caf28SDavid du Colombier 	fprintf(fd_th, "	#else\n");
89*de2caf28SDavid du Colombier 	fprintf(fd_th, "		#define NCORE	1\n");
90*de2caf28SDavid du Colombier 	fprintf(fd_th, "	#endif\n");
91*de2caf28SDavid du Colombier 	fprintf(fd_th, "#endif\n\n");
92219b2ee8SDavid du Colombier 
93*de2caf28SDavid du Colombier 	putunames(fd_th);
94219b2ee8SDavid du Colombier 
95*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\nshort Air[] = { ");
96*de2caf28SDavid du Colombier 	for (p = ready, i=0; p; p = p->nxt, i++)
97*de2caf28SDavid du Colombier 		fprintf(fd_tc, "%s (short) Air%d", (p!=ready)?",":"", i);
98*de2caf28SDavid du Colombier 	fprintf(fd_tc, ", (short) Air%d", i);	/* np_ */
9900d97012SDavid du Colombier 	if (nclaims > 1)
100*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "\n#ifndef NOCLAIM\n");
101*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	, (short) Air%d", i+1);	/* Multi */
102*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\n#endif\n\t");
10300d97012SDavid du Colombier 	}
104*de2caf28SDavid du Colombier 	fprintf(fd_tc, " };\n");
105219b2ee8SDavid du Colombier 
106*de2caf28SDavid du Colombier 	fprintf(fd_tc, "char *procname[] = {\n");
107*de2caf28SDavid du Colombier 		reverse_names(ready);
108*de2caf28SDavid du Colombier 	fprintf(fd_tc, "   \":np_:\",\n");
109*de2caf28SDavid du Colombier 	fprintf(fd_tc, "	0\n");
110*de2caf28SDavid du Colombier 	fprintf(fd_tc, "};\n\n");
111219b2ee8SDavid du Colombier 
112*de2caf28SDavid du Colombier 	fprintf(fd_tc, "enum btypes { NONE=%d, N_CLAIM=%d,", NONE, N_CLAIM);
113*de2caf28SDavid du Colombier 	fprintf(fd_tc, " I_PROC=%d, A_PROC=%d,", I_PROC, A_PROC);
114*de2caf28SDavid du Colombier 	fprintf(fd_tc, " P_PROC=%d, E_TRACE=%d, N_TRACE=%d };\n\n",
11500d97012SDavid du Colombier 		P_PROC, E_TRACE, N_TRACE);
116*de2caf28SDavid du Colombier 
117*de2caf28SDavid du Colombier 	fprintf(fd_tc, "int Btypes[] = {\n");
118*de2caf28SDavid du Colombier 		reverse_types(ready);
119*de2caf28SDavid du Colombier 	fprintf(fd_tc, "   0	/* :np_: */\n");
120*de2caf28SDavid du Colombier 	fprintf(fd_tc, "};\n\n");
12100d97012SDavid du Colombier 
1227dd7cddfSDavid du Colombier here:
123*de2caf28SDavid du Colombier 	for (p = ready; p; p = p->nxt)
124*de2caf28SDavid du Colombier 		put_ptype(p->n->name, p->tn, mstp, nrRdy+1, p->b);
1257dd7cddfSDavid du Colombier 		/* +1 for np_ */
126*de2caf28SDavid du Colombier 	put_ptype("np_", nrRdy, mstp, nrRdy+1, 0);
12700d97012SDavid du Colombier 
12800d97012SDavid du Colombier 	if (nclaims > 1)
12900d97012SDavid du Colombier 	{	/* this is the structure that goes into the state-vector
13000d97012SDavid du Colombier 		 * instead of the actual never claims
13100d97012SDavid du Colombier 		 * this assumes that the claims do not have any local variables
13200d97012SDavid du Colombier 		 * this claim records the types and states of all subclaims in an array
13300d97012SDavid du Colombier 		 * NB: not sure if we need the first 3 fields in this structure
13400d97012SDavid du Colombier 		 *     it's here for now to avoid breaking some possible dependence
13500d97012SDavid du Colombier 		 * in the calculations above, we were already taking into account
13600d97012SDavid du Colombier 		 * that there is one never-claim, which will now be this one
13700d97012SDavid du Colombier 		 */
13800d97012SDavid du Colombier 
139*de2caf28SDavid du Colombier 		i = blog(mstp);
140*de2caf28SDavid du Colombier 		fprintf(fd_th, "\n");
141*de2caf28SDavid du Colombier 
142*de2caf28SDavid du Colombier 		fprintf(fd_th, "#ifndef NOCLAIM\n");
143*de2caf28SDavid du Colombier 		fprintf(fd_th, " #ifndef NP\n");
144*de2caf28SDavid du Colombier 		fprintf(fd_th, "	#undef VERI\n");
145*de2caf28SDavid du Colombier 		fprintf(fd_th, "	#define VERI	%d\n", nrRdy+1);
146*de2caf28SDavid du Colombier 		fprintf(fd_th, " #endif\n");
147*de2caf28SDavid du Colombier 		fprintf(fd_th, "	#define Pclaim	P%d\n\n", nrRdy+1);
148*de2caf28SDavid du Colombier 		fprintf(fd_th, "typedef struct P%d {\n", nrRdy+1);
149*de2caf28SDavid du Colombier 		fprintf(fd_th, "	unsigned _pid : 8; /* always zero */\n");
150*de2caf28SDavid du Colombier 		fprintf(fd_th, "	unsigned _t   : %d; /* active-claim type  */\n",
15100d97012SDavid du Colombier 			blog(nrRdy+1));
152*de2caf28SDavid du Colombier 		fprintf(fd_th, "	unsigned _p   : %d; /* active-claim state */\n",
15300d97012SDavid du Colombier 			i);
154*de2caf28SDavid du Colombier 		fprintf(fd_th, "	unsigned _n   : %d; /* active-claim index */\n",
15500d97012SDavid du Colombier 			blog(nclaims));
15600d97012SDavid du Colombier 		if (i <= 255)	/* in stdint.h = UCHAR_MAX from limits.h */
157*de2caf28SDavid du Colombier 		{	fprintf(fd_th, "	uchar c_cur[NCLAIMS]; /* claim-states */\n");
15800d97012SDavid du Colombier 		} else if (i <= 65535)	/* really USHRT_MAX from limits.h */
159*de2caf28SDavid du Colombier 		{	fprintf(fd_th, "	ushort c_cur[NCLAIMS]; /* claim-states */\n");
16000d97012SDavid du Colombier 		} else	/* the most unlikely case */
161*de2caf28SDavid du Colombier 		{	fprintf(fd_th, "	uint c_cur[NCLAIMS]; /* claim-states */\n");
16200d97012SDavid du Colombier 		}
163*de2caf28SDavid du Colombier 		fprintf(fd_th, "} P%d;\n", nrRdy+1);
164*de2caf28SDavid du Colombier 
165*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#ifndef NOCLAIM\n");
166*de2caf28SDavid du Colombier 		fprintf(fd_tc, "uchar spin_c_typ[NCLAIMS]; /* claim-types */\n");
167*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#endif\n");
168*de2caf28SDavid du Colombier 
169*de2caf28SDavid du Colombier 		fprintf(fd_th, "	#define Air%d	(0)\n\n", nrRdy+1);
170*de2caf28SDavid du Colombier 		fprintf(fd_th, "#endif\n");
17100d97012SDavid du Colombier 		/*
17200d97012SDavid du Colombier 		 * find special states as:
17300d97012SDavid du Colombier 		 *	stopstate [ claimnr ][ curstate ] == 1
17400d97012SDavid du Colombier 		 *	accpstate [ claimnr ][ curstate ]
17500d97012SDavid du Colombier 		 *	progstate [ claimnr ][ curstate ]
17600d97012SDavid du Colombier 		 *	reached   [ claimnr ][ curstate ]
17700d97012SDavid du Colombier 		 *	visstate  [ claimnr ][ curstate ]
17800d97012SDavid du Colombier 		 *	loopstate [ claimnr ][ curstate ]
17900d97012SDavid du Colombier 		 *	mapstate  [ claimnr ][ curstate ]
18000d97012SDavid du Colombier 		 */
18100d97012SDavid du Colombier 	} else
182*de2caf28SDavid du Colombier 	{	fprintf(fd_th, "#define Pclaim	P0\n");
183*de2caf28SDavid du Colombier 		fprintf(fd_th, "#ifndef NCLAIMS\n");
184*de2caf28SDavid du Colombier 		fprintf(fd_th, "	#define NCLAIMS 1\n");
185*de2caf28SDavid du Colombier 		fprintf(fd_th, "#endif\n");
186*de2caf28SDavid du Colombier 		fprintf(fd_tc, "uchar spin_c_typ[NCLAIMS]; /* claim-types */\n");
18700d97012SDavid du Colombier 	}
1887dd7cddfSDavid du Colombier 
189*de2caf28SDavid du Colombier 	ntimes(fd_th, 0, 1, Head0);
1907dd7cddfSDavid du Colombier 
191312a1df1SDavid du Colombier 	if (separate != 2)
192*de2caf28SDavid du Colombier 	{
193*de2caf28SDavid du Colombier 		ntimes(fd_th, 0, 1, Header);
194*de2caf28SDavid du Colombier 		fprintf(fd_th, "#define StackSize	(");
195*de2caf28SDavid du Colombier 			c_stack_size(fd_th);
196*de2caf28SDavid du Colombier 		fprintf(fd_th, ")\n");
197312a1df1SDavid du Colombier 
198*de2caf28SDavid du Colombier 		c_add_stack(fd_th);
199*de2caf28SDavid du Colombier 		ntimes(fd_th, 0, 1, Header0);
200*de2caf28SDavid du Colombier 	} else
201*de2caf28SDavid du Colombier 	{	fprintf(fd_th, "extern char *emalloc(unsigned long);\n");
202312a1df1SDavid du Colombier 	}
203*de2caf28SDavid du Colombier 	ntimes(fd_th, 0, 1, Head1);
2047dd7cddfSDavid du Colombier 
2057dd7cddfSDavid du Colombier 	LstSet = ZS;
2067dd7cddfSDavid du Colombier 	(void) doglobal("", PUTV);
207312a1df1SDavid du Colombier 
208*de2caf28SDavid du Colombier 	hastrack = c_add_sv(fd_th);
209312a1df1SDavid du Colombier 
210*de2caf28SDavid du Colombier 	fprintf(fd_th, "#ifdef TRIX\n");
211*de2caf28SDavid du Colombier 	fprintf(fd_th, "	/* room for 512 proc+chan ptrs, + safety margin */\n");
212*de2caf28SDavid du Colombier 	fprintf(fd_th, "	char *_ids_[MAXPROC+MAXQ+4];\n");
213*de2caf28SDavid du Colombier 	fprintf(fd_th, "#else\n");
214*de2caf28SDavid du Colombier 	fprintf(fd_th, "	uchar sv[VECTORSZ];\n");
215*de2caf28SDavid du Colombier 	fprintf(fd_th, "#endif\n");
21600d97012SDavid du Colombier 
217*de2caf28SDavid du Colombier 	fprintf(fd_th, "} State");
218312a1df1SDavid du Colombier #ifdef SOLARIS
219*de2caf28SDavid du Colombier 	fprintf(fd_th,"\n#ifdef GCC\n");
220*de2caf28SDavid du Colombier 	fprintf(fd_th, "\t__attribute__ ((aligned(8)))");
221*de2caf28SDavid du Colombier 	fprintf(fd_th, "\n#endif\n\t");
222312a1df1SDavid du Colombier #endif
223*de2caf28SDavid du Colombier 	fprintf(fd_th, ";\n\n");
224312a1df1SDavid du Colombier 
225*de2caf28SDavid du Colombier 	fprintf(fd_th, "#ifdef TRIX\n");
226*de2caf28SDavid du Colombier 	fprintf(fd_th, "typedef struct TRIX_v6 {\n");
227*de2caf28SDavid du Colombier 	fprintf(fd_th, "	uchar *body; /* aligned */\n");
228*de2caf28SDavid du Colombier 	fprintf(fd_th, "#ifndef BFS\n");
229*de2caf28SDavid du Colombier 	fprintf(fd_th, "	short modified;\n");
230*de2caf28SDavid du Colombier 	fprintf(fd_th, "#endif\n");
231*de2caf28SDavid du Colombier 	fprintf(fd_th, "	short psize;\n");
232*de2caf28SDavid du Colombier 	fprintf(fd_th, "	short parent_pid;\n");
233*de2caf28SDavid du Colombier 	fprintf(fd_th, "	struct TRIX_v6 *nxt;\n");
234*de2caf28SDavid du Colombier 	fprintf(fd_th, "} TRIX_v6;\n");
235*de2caf28SDavid du Colombier 	fprintf(fd_th, "#endif\n\n");
23600d97012SDavid du Colombier 
237*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define HAS_TRACK	%d\n", hastrack);
238*de2caf28SDavid du Colombier 	if (0 && hastrack)	/* not really a problem */
239*de2caf28SDavid du Colombier 	{	fprintf(fd_th, "#ifdef BFS_PAR\n");
240*de2caf28SDavid du Colombier 		fprintf(fd_th, "	#error cannot use BFS_PAR on models with c_track stmnts\n");
241*de2caf28SDavid du Colombier 		fprintf(fd_th, "#endif\n");
242*de2caf28SDavid du Colombier 	}
243312a1df1SDavid du Colombier 	if (separate != 2)
244219b2ee8SDavid du Colombier 		dohidden();
245219b2ee8SDavid du Colombier }
246219b2ee8SDavid du Colombier 
247219b2ee8SDavid du Colombier void
genaddproc(void)248219b2ee8SDavid du Colombier genaddproc(void)
249219b2ee8SDavid du Colombier {	ProcList *p;
250*de2caf28SDavid du Colombier 	int i = 0;
251219b2ee8SDavid du Colombier 
2527dd7cddfSDavid du Colombier 	if (separate == 2) goto shortcut;
2537dd7cddfSDavid du Colombier 
254*de2caf28SDavid du Colombier 	ntimes(fd_tc, nrRdy+1, nrRdy+2, R2); /* +1 for np_ -- was th */
255*de2caf28SDavid du Colombier 
256*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#ifdef TRIX\n");
257*de2caf28SDavid du Colombier 	fprintf(fd_tc, "int what_p_size(int);\n");
258*de2caf28SDavid du Colombier 	fprintf(fd_tc, "int what_q_size(int);\n\n");
259*de2caf28SDavid du Colombier 
26000d97012SDavid du Colombier 	/* the number of processes just changed by 1 (up or down) */
26100d97012SDavid du Colombier 	/* this means that the channel indices move up or down by one slot */
26200d97012SDavid du Colombier 	/* not all new channels may have a valid index yet, but we move */
26300d97012SDavid du Colombier 	/* all of them anyway, as if they existed */
264*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, R7a);
265*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#endif\n\n");
26600d97012SDavid du Colombier 
267*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, R7b);
26800d97012SDavid du Colombier 
269*de2caf28SDavid du Colombier 	fprintf(fd_tc, "int\naddproc(int calling_pid, int priority, int n");
27000d97012SDavid du Colombier 	for (/* i = 0 */; i < Npars; i++)
271*de2caf28SDavid du Colombier 		fprintf(fd_tc, ", int par%d", i);
272219b2ee8SDavid du Colombier 
273*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addp0);
274*de2caf28SDavid du Colombier 	ntimes(fd_tc, 1, nrRdy+1, R5); /* +1 for np_ */
27500d97012SDavid du Colombier 
27600d97012SDavid du Colombier 	if (nclaims > 1)
277*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "#ifndef NOCLAIM\n");
278*de2caf28SDavid du Colombier 		ntimes(fd_tc, nrRdy+1, nrRdy+2, R5);
279*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#endif\n");
28000d97012SDavid du Colombier 	}
28100d97012SDavid du Colombier 
282*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addp1);
283219b2ee8SDavid du Colombier 
2847dd7cddfSDavid du Colombier 	if (has_provided)
285*de2caf28SDavid du Colombier 	{	fprintf(fd_tt, "\nint\nprovided(int II, unsigned char ot, ");
286*de2caf28SDavid du Colombier 		fprintf(fd_tt, "int tt, Trans *t)\n");
287*de2caf28SDavid du Colombier 		fprintf(fd_tt, "{\n\tswitch(ot) {\n");
2887dd7cddfSDavid du Colombier 	}
2897dd7cddfSDavid du Colombier shortcut:
29000d97012SDavid du Colombier 	if (nclaims > 1)
29100d97012SDavid du Colombier 	{	multi_init();
29200d97012SDavid du Colombier 	}
2937dd7cddfSDavid du Colombier 	tc_predef_np();
294*de2caf28SDavid du Colombier 	for (p = ready; p; p = p->nxt)
295*de2caf28SDavid du Colombier 	{	Pid_nr = p->tn;
2967dd7cddfSDavid du Colombier 		put_pinit(p);
2977dd7cddfSDavid du Colombier 	}
2987dd7cddfSDavid du Colombier 	if (separate == 2) return;
2997dd7cddfSDavid du Colombier 
300*de2caf28SDavid du Colombier 	Pid_nr = 0;
3017dd7cddfSDavid du Colombier 	if (has_provided)
302*de2caf28SDavid du Colombier 	{	fprintf(fd_tt, "\tdefault: return 1; /* e.g., a claim */\n");
303*de2caf28SDavid du Colombier 		fprintf(fd_tt, "\t}\n\treturn 0;\n}\n");
3047dd7cddfSDavid du Colombier 	}
305219b2ee8SDavid du Colombier 
306*de2caf28SDavid du Colombier 	ntimes(fd_tc, i, i+1, R6);
3077dd7cddfSDavid du Colombier 	if (separate == 0)
308*de2caf28SDavid du Colombier 		ntimes(fd_tc, 1, nrRdy+1, R5); /* +1 for np_ */
3097dd7cddfSDavid du Colombier 	else
310*de2caf28SDavid du Colombier 		ntimes(fd_tc, 1, nrRdy, R5);
311*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, R8a);
312219b2ee8SDavid du Colombier }
313219b2ee8SDavid du Colombier 
314219b2ee8SDavid du Colombier void
do_locinits(FILE * fd)315312a1df1SDavid du Colombier do_locinits(FILE *fd)
316312a1df1SDavid du Colombier {	ProcList *p;
317312a1df1SDavid du Colombier 
318*de2caf28SDavid du Colombier 	/* the locinit functions may refer to pptr or qptr */
319*de2caf28SDavid du Colombier 	fprintf(fd, "#if VECTORSZ>32000\n");
320*de2caf28SDavid du Colombier 	fprintf(fd, "	extern int \n");
321*de2caf28SDavid du Colombier 	fprintf(fd, "#else\n");
322*de2caf28SDavid du Colombier 	fprintf(fd, "	extern short \n");
323*de2caf28SDavid du Colombier 	fprintf(fd, "#endif\n");
324*de2caf28SDavid du Colombier 	fprintf(fd, "	*proc_offset, *q_offset;\n");
325*de2caf28SDavid du Colombier 
326*de2caf28SDavid du Colombier 	for (p = ready; p; p = p->nxt)
327*de2caf28SDavid du Colombier 	{	c_add_locinit(fd, p->tn, p->n->name);
328*de2caf28SDavid du Colombier 	}
329312a1df1SDavid du Colombier }
330312a1df1SDavid du Colombier 
331312a1df1SDavid du Colombier void
genother(void)332219b2ee8SDavid du Colombier genother(void)
333219b2ee8SDavid du Colombier {	ProcList *p;
334219b2ee8SDavid du Colombier 
3357dd7cddfSDavid du Colombier 	switch (separate) {
3367dd7cddfSDavid du Colombier 	case 2:
33700d97012SDavid du Colombier 		if (nclaims > 0)
338*de2caf28SDavid du Colombier 		{	for (p = ready; p; p = p->nxt)
33900d97012SDavid du Colombier 			{	if (p->b == N_CLAIM)
340*de2caf28SDavid du Colombier 				{	ntimes(fd_tc, p->tn, p->tn+1, R0); /* claims only */
341*de2caf28SDavid du Colombier 					fprintf(fd_tc, "#ifdef HAS_CODE\n");
342*de2caf28SDavid du Colombier 					ntimes(fd_tc, p->tn, p->tn+1, R00);
343*de2caf28SDavid du Colombier 					fprintf(fd_tc, "#endif\n");
34400d97012SDavid du Colombier 		}	}	}
3457dd7cddfSDavid du Colombier 		break;
3467dd7cddfSDavid du Colombier 	case 1:
347*de2caf28SDavid du Colombier 		ntimes(fd_tc,     0,    1, Code0);
348*de2caf28SDavid du Colombier 		for (p = ready; p; p = p->nxt)
34900d97012SDavid du Colombier 		{	if (p->b != N_CLAIM)
350*de2caf28SDavid du Colombier 			{	ntimes(fd_tc, p->tn, p->tn+1, R0); /* all except claims */
351*de2caf28SDavid du Colombier 				fprintf(fd_tc, "#ifdef HAS_CODE\n");
352*de2caf28SDavid du Colombier 				ntimes(fd_tc, p->tn, p->tn+1, R00);
353*de2caf28SDavid du Colombier 				fprintf(fd_tc, "#endif\n");
35400d97012SDavid du Colombier 		}	}
3557dd7cddfSDavid du Colombier 		break;
3567dd7cddfSDavid du Colombier 	case 0:
357*de2caf28SDavid du Colombier 		ntimes(fd_tc,     0,    1, Code0);
358*de2caf28SDavid du Colombier 		ntimes(fd_tc,     0, nrRdy+1, R0); /* +1 for np_ */
359*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#ifdef HAS_CODE\n");
360*de2caf28SDavid du Colombier 		ntimes(fd_tc,     0, nrRdy+1, R00); /* +1 for np_ */
361*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#endif\n");
3627dd7cddfSDavid du Colombier 		break;
3637dd7cddfSDavid du Colombier 	}
364*de2caf28SDavid du Colombier 	/* new place, make sure Maxbody is set to its final value here */
365*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\n");
366219b2ee8SDavid du Colombier 
367*de2caf28SDavid du Colombier 	if (separate != 2)
368*de2caf28SDavid du Colombier 	{	ntimes(fd_tc, 1, u_sync+u_async+1, R3); /* nrqs is still 0 */
369*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\tMaxbody = max(Maxbody, sizeof(State)-VECTORSZ);\n");
370*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\tif ((Maxbody %% WS) != 0)\n");
371*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t	Maxbody += WS - (Maxbody %% WS);\n\n");
372*de2caf28SDavid du Colombier 	}
373*de2caf28SDavid du Colombier 
374*de2caf28SDavid du Colombier 	for (p = ready; p; p = p->nxt)
375219b2ee8SDavid du Colombier 		end_labs(p->n, p->tn);
376219b2ee8SDavid du Colombier 
3777dd7cddfSDavid du Colombier 	switch (separate) {
3787dd7cddfSDavid du Colombier 	case 2:
37900d97012SDavid du Colombier 		if (nclaims > 0)
380*de2caf28SDavid du Colombier 		{	for (p = ready; p; p = p->nxt)
38100d97012SDavid du Colombier 			{	if (p->b == N_CLAIM)
382*de2caf28SDavid du Colombier 				{	ntimes(fd_tc, p->tn, p->tn+1, R0a); /* claims only */
38300d97012SDavid du Colombier 		}	}	}
3847dd7cddfSDavid du Colombier 		return;
3857dd7cddfSDavid du Colombier 	case 1:
386*de2caf28SDavid du Colombier 		for (p = ready; p; p = p->nxt)
38700d97012SDavid du Colombier 		{	if (p->b != N_CLAIM)
388*de2caf28SDavid du Colombier 			{	ntimes(fd_tc, p->tn, p->tn+1, R0a); /* all except claims */
38900d97012SDavid du Colombier 		}	}
390*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	if (state_tables)\n");
391*de2caf28SDavid du Colombier 		fprintf(fd_tc, "		ini_claim(%d, 0);\n", claimnr);	/* the default claim */
39200d97012SDavid du Colombier 		if (acceptors == 0)
39300d97012SDavid du Colombier 		{	acceptors = 1;	/* assume at least 1 acceptstate */
39400d97012SDavid du Colombier 		}
3957dd7cddfSDavid du Colombier 		break;
3967dd7cddfSDavid du Colombier 	case 0:
397*de2caf28SDavid du Colombier 		ntimes(fd_tc, 0, nrRdy, R0a);	/* all */
3987dd7cddfSDavid du Colombier 		break;
3997dd7cddfSDavid du Colombier 	}
400219b2ee8SDavid du Colombier 
401*de2caf28SDavid du Colombier 	ntimes(fd_th, acceptors,   acceptors+1,   Code1);
402*de2caf28SDavid du Colombier 	ntimes(fd_th, progressors, progressors+1, Code3);
403219b2ee8SDavid du Colombier 
404*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0,     1, Code2a);	/* dfs, bfs */
405*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0,     1, Code2e);	/* multicore */
406*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0,     1, Code2c);	/* multicore */
407*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0,     1, Code2d);
40800d97012SDavid du Colombier 
409*de2caf28SDavid du Colombier 	fprintf(fd_tc, "void\ndo_reach(void)\n{\n");
410*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0,     nrRdy, R4);
411*de2caf28SDavid du Colombier 	fprintf(fd_tc, "}\n\n");
4127dd7cddfSDavid du Colombier 
413*de2caf28SDavid du Colombier 	fprintf(fd_tc, "void\niniglobals(int calling_pid)\n{\n");
4147dd7cddfSDavid du Colombier 	if (doglobal("", INIV) > 0)
415*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "#ifdef VAR_RANGES\n");
4167dd7cddfSDavid du Colombier 		(void) doglobal("logval(\"", LOGV);
417*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#endif\n");
4187dd7cddfSDavid du Colombier 	}
419*de2caf28SDavid du Colombier 	fprintf(fd_tc, "}\n\n");
4207dd7cddfSDavid du Colombier }
4217dd7cddfSDavid du Colombier 
4227dd7cddfSDavid du Colombier void
gensvmap(void)4237dd7cddfSDavid du Colombier gensvmap(void)
4247dd7cddfSDavid du Colombier {
425*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, SvMap);
426219b2ee8SDavid du Colombier }
427219b2ee8SDavid du Colombier 
428219b2ee8SDavid du Colombier static struct {
429219b2ee8SDavid du Colombier 	char *s,	*t;		int n,	m,	p;
430219b2ee8SDavid du Colombier } ln[] = {
4317dd7cddfSDavid du Colombier 	{"end",  	"stopstate",	3,	0,	0},
4327dd7cddfSDavid du Colombier 	{"progress",	"progstate",	8,	0,	1},
4337dd7cddfSDavid du Colombier 	{"accept",	"accpstate",	6,	1,	0},
4347dd7cddfSDavid du Colombier 	{0,		0,		0,	0,	0},
435219b2ee8SDavid du Colombier };
436219b2ee8SDavid du Colombier 
4377dd7cddfSDavid du Colombier static void
end_labs(Symbol * s,int i)438219b2ee8SDavid du Colombier end_labs(Symbol *s, int i)
4397dd7cddfSDavid du Colombier {	int oln = lineno;
4407dd7cddfSDavid du Colombier 	Symbol *ofn = Fname;
441219b2ee8SDavid du Colombier 	Label *l;
4427dd7cddfSDavid du Colombier 	int j; char foo[128];
4437dd7cddfSDavid du Colombier 
44400d97012SDavid du Colombier 	if ((pid_is_claim(i) && separate == 1)
44500d97012SDavid du Colombier 	|| (!pid_is_claim(i) && separate == 2))
4467dd7cddfSDavid du Colombier 		return;
447219b2ee8SDavid du Colombier 
448219b2ee8SDavid du Colombier 	for (l = labtab; l; l = l->nxt)
449219b2ee8SDavid du Colombier 	for (j = 0; ln[j].n; j++)
45000d97012SDavid du Colombier 	{	if (strncmp(l->s->name, ln[j].s, ln[j].n) == 0
4517dd7cddfSDavid du Colombier 		&&  strcmp(l->c->name, s->name) == 0)
452*de2caf28SDavid du Colombier 		{	fprintf(fd_tc, "\t%s[%d][%d] = 1;\n",
453219b2ee8SDavid du Colombier 				ln[j].t, i, l->e->seqno);
454219b2ee8SDavid du Colombier 			acceptors   += ln[j].m;
455219b2ee8SDavid du Colombier 			progressors += ln[j].p;
4567dd7cddfSDavid du Colombier 			if (l->e->status & D_ATOM)
4577dd7cddfSDavid du Colombier 			{	sprintf(foo, "%s label inside d_step",
4587dd7cddfSDavid du Colombier 					ln[j].s);
4597dd7cddfSDavid du Colombier 				goto complain;
460219b2ee8SDavid du Colombier 			}
461312a1df1SDavid du Colombier 			if (j > 0 && (l->e->status & ATOM))
4627dd7cddfSDavid du Colombier 			{	sprintf(foo, "%s label inside atomic",
4637dd7cddfSDavid du Colombier 					ln[j].s);
4647dd7cddfSDavid du Colombier 		complain:	lineno = l->e->n->ln;
4657dd7cddfSDavid du Colombier 				Fname  = l->e->n->fn;
4667dd7cddfSDavid du Colombier 				printf("spin: %3d:%s, warning, %s - is invisible\n",
4677dd7cddfSDavid du Colombier 					lineno, Fname?Fname->name:"-", foo);
46800d97012SDavid du Colombier 	}	}	}
4697dd7cddfSDavid du Colombier 	/* visible states -- through remote refs: */
4707dd7cddfSDavid du Colombier 	for (l = labtab; l; l = l->nxt)
4717dd7cddfSDavid du Colombier 		if (l->visible
4727dd7cddfSDavid du Colombier 		&&  strcmp(l->s->context->name, s->name) == 0)
473*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\tvisstate[%d][%d] = 1;\n",
4747dd7cddfSDavid du Colombier 				i, l->e->seqno);
4757dd7cddfSDavid du Colombier 
4767dd7cddfSDavid du Colombier 	lineno = oln;
4777dd7cddfSDavid du Colombier 	Fname  = ofn;
478219b2ee8SDavid du Colombier }
479219b2ee8SDavid du Colombier 
480219b2ee8SDavid du Colombier void
ntimes(FILE * fd,int n,int m,const char * c[])481*de2caf28SDavid du Colombier ntimes(FILE *fd, int n, int m, const char *c[])
482219b2ee8SDavid du Colombier {
483219b2ee8SDavid du Colombier 	int i, j;
484219b2ee8SDavid du Colombier 	for (j = 0; c[j]; j++)
485219b2ee8SDavid du Colombier 	for (i = n; i < m; i++)
486219b2ee8SDavid du Colombier 	{	fprintf(fd, c[j], i, i, i, i, i, i);
487219b2ee8SDavid du Colombier 		fprintf(fd, "\n");
488219b2ee8SDavid du Colombier 	}
489219b2ee8SDavid du Colombier }
490219b2ee8SDavid du Colombier 
4917dd7cddfSDavid du Colombier void
prehint(Symbol * s)4927dd7cddfSDavid du Colombier prehint(Symbol *s)
4937dd7cddfSDavid du Colombier {	Lextok *n;
4947dd7cddfSDavid du Colombier 
4957dd7cddfSDavid du Colombier 	printf("spin: warning, ");
4967dd7cddfSDavid du Colombier 	if (!s) return;
4977dd7cddfSDavid du Colombier 
4987dd7cddfSDavid du Colombier 	n = (s->context != ZS)?s->context->ini:s->ini;
4997dd7cddfSDavid du Colombier 	if (n)
50000d97012SDavid du Colombier 	printf("line %s:%d, ", n->fn->name, n->ln);
5017dd7cddfSDavid du Colombier }
5027dd7cddfSDavid du Colombier 
5037dd7cddfSDavid du Colombier void
checktype(Symbol * sp,char * s)5047dd7cddfSDavid du Colombier checktype(Symbol *sp, char *s)
5057dd7cddfSDavid du Colombier {	char buf[128]; int i;
5067dd7cddfSDavid du Colombier 
5077dd7cddfSDavid du Colombier 	if (!s
5087dd7cddfSDavid du Colombier 	|| (sp->type != BYTE
5097dd7cddfSDavid du Colombier 	&&  sp->type != SHORT
5107dd7cddfSDavid du Colombier 	&&  sp->type != INT))
5117dd7cddfSDavid du Colombier 		return;
5127dd7cddfSDavid du Colombier 
5137dd7cddfSDavid du Colombier 	if (sp->hidden&16)	/* formal parameter */
5147dd7cddfSDavid du Colombier 	{	ProcList *p; Lextok *f, *t;
5157dd7cddfSDavid du Colombier 		int posnr = 0;
516*de2caf28SDavid du Colombier 		for (p = ready; p; p = p->nxt)
5177dd7cddfSDavid du Colombier 			if (p->n->name
5187dd7cddfSDavid du Colombier 			&&  strcmp(s, p->n->name) == 0)
5197dd7cddfSDavid du Colombier 				break;
5207dd7cddfSDavid du Colombier 		if (p)
5217dd7cddfSDavid du Colombier 		for (f = p->p; f; f = f->rgt) /* list of types */
5227dd7cddfSDavid du Colombier 		for (t = f->lft; t; t = t->rgt, posnr++)
5237dd7cddfSDavid du Colombier 			if (t->sym
5247dd7cddfSDavid du Colombier 			&&  strcmp(t->sym->name, sp->name) == 0)
5257dd7cddfSDavid du Colombier 			{	checkrun(sp, posnr);
5267dd7cddfSDavid du Colombier 				return;
5277dd7cddfSDavid du Colombier 			}
5287dd7cddfSDavid du Colombier 
5297dd7cddfSDavid du Colombier 	} else if (!(sp->hidden&4))
5307dd7cddfSDavid du Colombier 	{	if (!(verbose&32)) return;
5317dd7cddfSDavid du Colombier 		sputtype(buf, sp->type);
532312a1df1SDavid du Colombier 		i = (int) strlen(buf);
53300d97012SDavid du Colombier 		while (i > 0 && buf[--i] == ' ') buf[i] = '\0';
5347dd7cddfSDavid du Colombier 		prehint(sp);
5357dd7cddfSDavid du Colombier 		if (sp->context)
5367dd7cddfSDavid du Colombier 			printf("proctype %s:", s);
5377dd7cddfSDavid du Colombier 		else
5387dd7cddfSDavid du Colombier 			printf("global");
5397dd7cddfSDavid du Colombier 		printf(" '%s %s' could be declared 'bit %s'\n",
5407dd7cddfSDavid du Colombier 			buf, sp->name, sp->name);
5417dd7cddfSDavid du Colombier 	} else if (sp->type != BYTE && !(sp->hidden&8))
5427dd7cddfSDavid du Colombier 	{	if (!(verbose&32)) return;
5437dd7cddfSDavid du Colombier 		sputtype(buf, sp->type);
544312a1df1SDavid du Colombier 		i = (int) strlen(buf);
5457dd7cddfSDavid du Colombier 		while (buf[--i] == ' ') buf[i] = '\0';
5467dd7cddfSDavid du Colombier 		prehint(sp);
5477dd7cddfSDavid du Colombier 		if (sp->context)
5487dd7cddfSDavid du Colombier 			printf("proctype %s:", s);
5497dd7cddfSDavid du Colombier 		else
5507dd7cddfSDavid du Colombier 			printf("global");
5517dd7cddfSDavid du Colombier 		printf(" '%s %s' could be declared 'byte %s'\n",
5527dd7cddfSDavid du Colombier 			buf, sp->name, sp->name);
5537dd7cddfSDavid du Colombier 	}
5547dd7cddfSDavid du Colombier }
555219b2ee8SDavid du Colombier 
55600d97012SDavid du Colombier static int
dolocal(FILE * ofd,char * pre,int dowhat,int p,char * s,enum btypes b)55700d97012SDavid du Colombier dolocal(FILE *ofd, char *pre, int dowhat, int p, char *s, enum btypes b)
5587dd7cddfSDavid du Colombier {	int h, j, k=0; extern int nr_errs;
5597dd7cddfSDavid du Colombier 	Ordered *walk;
560219b2ee8SDavid du Colombier 	Symbol *sp;
56100d97012SDavid du Colombier 	char buf[128], buf2[128], buf3[128];
562219b2ee8SDavid du Colombier 
563f3793cddSDavid du Colombier 	if (dowhat == INIV)
564f3793cddSDavid du Colombier 	{	/* initialize in order of declaration */
565f3793cddSDavid du Colombier 		for (walk = all_names; walk; walk = walk->next)
566f3793cddSDavid du Colombier 		{	sp = walk->entry;
567f3793cddSDavid du Colombier 			if (sp->context
568f3793cddSDavid du Colombier 			&& !sp->owner
569f3793cddSDavid du Colombier 			&&  strcmp(s, sp->context->name) == 0)
570f3793cddSDavid du Colombier 			{	checktype(sp, s); /* fall through */
571f3793cddSDavid du Colombier 				if (!(sp->hidden&16))
572f3793cddSDavid du Colombier 				{	sprintf(buf, "((P%d *)pptr(h))->", p);
573f3793cddSDavid du Colombier 					do_var(ofd, dowhat, buf, sp, "", " = ", ";\n");
574f3793cddSDavid du Colombier 				}
575f3793cddSDavid du Colombier 				k++;
576f3793cddSDavid du Colombier 		}	}
577f3793cddSDavid du Colombier 	} else
578f3793cddSDavid du Colombier 	{	for (j = 0; j < 8; j++)
5797dd7cddfSDavid du Colombier 		for (h = 0; h <= 1; h++)
5807dd7cddfSDavid du Colombier 		for (walk = all_names; walk; walk = walk->next)
5817dd7cddfSDavid du Colombier 		{	sp = walk->entry;
582219b2ee8SDavid du Colombier 			if (sp->context
583219b2ee8SDavid du Colombier 			&& !sp->owner
584219b2ee8SDavid du Colombier 			&&  sp->type == Types[j]
58500d97012SDavid du Colombier 			&&  ((h == 0 && (sp->nel == 1 && sp->isarray == 0))
58600d97012SDavid du Colombier 			||   (h == 1 && (sp->nel  > 1 || sp->isarray == 1)))
587219b2ee8SDavid du Colombier 			&&  strcmp(s, sp->context->name) == 0)
5887dd7cddfSDavid du Colombier 			{	switch (dowhat) {
5897dd7cddfSDavid du Colombier 				case LOGV:
5907dd7cddfSDavid du Colombier 					if (sp->type == CHAN
5917dd7cddfSDavid du Colombier 					&&  verbose == 0)
5927dd7cddfSDavid du Colombier 						break;
5937dd7cddfSDavid du Colombier 					sprintf(buf, "%s%s:", pre, s);
5947dd7cddfSDavid du Colombier 					{ sprintf(buf2, "\", ((P%d *)pptr(h))->", p);
595312a1df1SDavid du Colombier 					  sprintf(buf3, ");\n");
5967dd7cddfSDavid du Colombier 					}
5977dd7cddfSDavid du Colombier 					do_var(ofd, dowhat, "", sp, buf, buf2, buf3);
5987dd7cddfSDavid du Colombier 					break;
5997dd7cddfSDavid du Colombier 				case PUTV:
6007dd7cddfSDavid du Colombier 					sprintf(buf, "((P%d *)pptr(h))->", p);
6017dd7cddfSDavid du Colombier 					do_var(ofd, dowhat, buf, sp, "", " = ", ";\n");
6027dd7cddfSDavid du Colombier 					k++;
6037dd7cddfSDavid du Colombier 					break;
6047dd7cddfSDavid du Colombier 				}
60500d97012SDavid du Colombier 				if (b == N_CLAIM)
6067dd7cddfSDavid du Colombier 				{	printf("error: %s defines local %s\n",
6077dd7cddfSDavid du Colombier 						s, sp->name);
608219b2ee8SDavid du Colombier 					nr_errs++;
609f3793cddSDavid du Colombier 	}	}	}	}
610f3793cddSDavid du Colombier 
611219b2ee8SDavid du Colombier 	return k;
612219b2ee8SDavid du Colombier }
613219b2ee8SDavid du Colombier 
614312a1df1SDavid du Colombier void
c_chandump(FILE * fd)615312a1df1SDavid du Colombier c_chandump(FILE *fd)
616312a1df1SDavid du Colombier {	Queue *q;
617312a1df1SDavid du Colombier 	char buf[256];
618312a1df1SDavid du Colombier 	int i;
619312a1df1SDavid du Colombier 
620312a1df1SDavid du Colombier 	if (!qtab)
621*de2caf28SDavid du Colombier 	{	fprintf(fd, "void\nc_chandump(int unused)\n");
622*de2caf28SDavid du Colombier 		fprintf(fd, "{\tunused++; /* avoid complaints */\n}\n");
623312a1df1SDavid du Colombier 		return;
624312a1df1SDavid du Colombier 	}
625312a1df1SDavid du Colombier 
626312a1df1SDavid du Colombier 	fprintf(fd, "void\nc_chandump(int from)\n");
627312a1df1SDavid du Colombier 	fprintf(fd, "{	uchar *z; int slot;\n");
628312a1df1SDavid du Colombier 
629312a1df1SDavid du Colombier 	fprintf(fd, "	from--;\n");
630312a1df1SDavid du Colombier 	fprintf(fd, "	if (from >= (int) now._nr_qs || from < 0)\n");
631312a1df1SDavid du Colombier 	fprintf(fd, "	{	printf(\"pan: bad qid %%d\\n\", from+1);\n");
632312a1df1SDavid du Colombier 	fprintf(fd, "		return;\n");
633312a1df1SDavid du Colombier 	fprintf(fd, "	}\n");
634312a1df1SDavid du Colombier 	fprintf(fd, "	z = qptr(from);\n");
635312a1df1SDavid du Colombier 	fprintf(fd, "	switch (((Q0 *)z)->_t) {\n");
636312a1df1SDavid du Colombier 
637312a1df1SDavid du Colombier 	for (q = qtab; q; q = q->nxt)
638312a1df1SDavid du Colombier 	{	fprintf(fd, "	case %d:\n\t\t", q->qid);
639312a1df1SDavid du Colombier 		sprintf(buf, "((Q%d *)z)->", q->qid);
640312a1df1SDavid du Colombier 
641312a1df1SDavid du Colombier 		fprintf(fd, "for (slot = 0; slot < %sQlen; slot++)\n\t\t", buf);
642312a1df1SDavid du Colombier 		fprintf(fd, "{	printf(\" [\");\n\t\t");
643312a1df1SDavid du Colombier 		for (i = 0; i < q->nflds; i++)
644312a1df1SDavid du Colombier 		{	if (q->fld_width[i] == MTYPE)
645*de2caf28SDavid du Colombier 			{	fprintf(fd, "\tprintm(%scontents[slot].fld%d",
646312a1df1SDavid du Colombier 					buf, i);
647*de2caf28SDavid du Colombier 				if (q->mtp[i])
648*de2caf28SDavid du Colombier 				{	fprintf(fd, ", \"%s\"", q->mtp[i]);
649312a1df1SDavid du Colombier 				} else
650*de2caf28SDavid du Colombier 				{	fprintf(fd, ", 0");
651*de2caf28SDavid du Colombier 				}
652*de2caf28SDavid du Colombier 			} else
653*de2caf28SDavid du Colombier 			{	fprintf(fd, "\tprintf(\"%%d,\", %scontents[slot].fld%d",
654312a1df1SDavid du Colombier 					buf, i);
655312a1df1SDavid du Colombier 			}
656*de2caf28SDavid du Colombier 			fprintf(fd, ");\n\t\t");
657*de2caf28SDavid du Colombier 		}
658312a1df1SDavid du Colombier 		fprintf(fd, "	printf(\"],\");\n\t\t");
659312a1df1SDavid du Colombier 		fprintf(fd, "}\n\t\t");
660312a1df1SDavid du Colombier 		fprintf(fd, "break;\n");
661312a1df1SDavid du Colombier 	}
662312a1df1SDavid du Colombier 	fprintf(fd, "	}\n");
663312a1df1SDavid du Colombier 	fprintf(fd, "	printf(\"\\n\");\n}\n");
664312a1df1SDavid du Colombier }
665312a1df1SDavid du Colombier 
666312a1df1SDavid du Colombier void
c_var(FILE * fd,char * pref,Symbol * sp)667312a1df1SDavid du Colombier c_var(FILE *fd, char *pref, Symbol *sp)
66800d97012SDavid du Colombier {	char *ptr, buf[256];
669312a1df1SDavid du Colombier 	int i;
670312a1df1SDavid du Colombier 
67100d97012SDavid du Colombier 	if (!sp)
67200d97012SDavid du Colombier 	{	fatal("cannot happen - c_var", 0);
67300d97012SDavid du Colombier 	}
67400d97012SDavid du Colombier 
675*de2caf28SDavid du Colombier 	ptr = sp->name;
67600d97012SDavid du Colombier 	if (!old_scope_rules)
67700d97012SDavid du Colombier 	{	while (*ptr == '_' || isdigit((int)*ptr))
67800d97012SDavid du Colombier 		{	ptr++;
67900d97012SDavid du Colombier 	}	}
68000d97012SDavid du Colombier 
681312a1df1SDavid du Colombier 	switch (sp->type) {
682312a1df1SDavid du Colombier 	case STRUCT:
683312a1df1SDavid du Colombier 		/* c_struct(fd, pref, sp); */
684312a1df1SDavid du Colombier 		fprintf(fd, "\t\tprintf(\"\t(struct %s)\\n\");\n",
685312a1df1SDavid du Colombier 			sp->name);
686312a1df1SDavid du Colombier 		sprintf(buf, "%s%s.", pref, sp->name);
687312a1df1SDavid du Colombier 		c_struct(fd, buf, sp);
688312a1df1SDavid du Colombier 		break;
689*de2caf28SDavid du Colombier 	case MTYPE:
690312a1df1SDavid du Colombier 	case BIT:   case BYTE:
691312a1df1SDavid du Colombier 	case SHORT: case INT:
692312a1df1SDavid du Colombier 	case UNSIGNED:
693312a1df1SDavid du Colombier 		sputtype(buf, sp->type);
69400d97012SDavid du Colombier 		if (sp->nel == 1 && sp->isarray == 0)
695*de2caf28SDavid du Colombier 		{
696*de2caf28SDavid du Colombier 			if (sp->type == MTYPE && ismtype(sp->name))
697*de2caf28SDavid du Colombier 			{	fprintf(fd, "\tprintf(\"\t%s %s:\t%d\\n\");\n",
698*de2caf28SDavid du Colombier 					buf, ptr, ismtype(sp->name));
699*de2caf28SDavid du Colombier 			} else
700f3793cddSDavid du Colombier 			{	fprintf(fd, "\tprintf(\"\t%s %s:\t%%d\\n\", %s%s);\n",
70100d97012SDavid du Colombier 					buf, ptr, pref, sp->name);
702*de2caf28SDavid du Colombier 			}
703f3793cddSDavid du Colombier 		} else
704f3793cddSDavid du Colombier 		{	fprintf(fd, "\t{\tint l_in;\n");
705f3793cddSDavid du Colombier 			fprintf(fd, "\t\tfor (l_in = 0; l_in < %d; l_in++)\n", sp->nel);
706f3793cddSDavid du Colombier 			fprintf(fd, "\t\t{\n");
707f3793cddSDavid du Colombier 			fprintf(fd, "\t\t\tprintf(\"\t%s %s[%%d]:\t%%d\\n\", l_in, %s%s[l_in]);\n",
70800d97012SDavid du Colombier 						buf, ptr, pref, sp->name);
709f3793cddSDavid du Colombier 			fprintf(fd, "\t\t}\n");
710f3793cddSDavid du Colombier 			fprintf(fd, "\t}\n");
711f3793cddSDavid du Colombier 		}
712312a1df1SDavid du Colombier 		break;
713312a1df1SDavid du Colombier 	case CHAN:
71400d97012SDavid du Colombier 		if (sp->nel == 1 && sp->isarray == 0)
71500d97012SDavid du Colombier 		{  fprintf(fd, "\tprintf(\"\tchan %s (=%%d):\tlen %%d:\\t\", ", ptr);
716312a1df1SDavid du Colombier 		   fprintf(fd, "%s%s, q_len(%s%s));\n",
717312a1df1SDavid du Colombier 			pref, sp->name, pref, sp->name);
718312a1df1SDavid du Colombier 		   fprintf(fd, "\tc_chandump(%s%s);\n", pref, sp->name);
719312a1df1SDavid du Colombier 		} else
720312a1df1SDavid du Colombier 		for (i = 0; i < sp->nel; i++)
721312a1df1SDavid du Colombier 		{  fprintf(fd, "\tprintf(\"\tchan %s[%d] (=%%d):\tlen %%d:\\t\", ",
72200d97012SDavid du Colombier 			ptr, i);
723312a1df1SDavid du Colombier 		   fprintf(fd, "%s%s[%d], q_len(%s%s[%d]));\n",
724312a1df1SDavid du Colombier 			pref, sp->name, i, pref, sp->name, i);
725312a1df1SDavid du Colombier 		   fprintf(fd, "\tc_chandump(%s%s[%d]);\n",
726312a1df1SDavid du Colombier 			pref, sp->name, i);
727312a1df1SDavid du Colombier 		}
728312a1df1SDavid du Colombier 		break;
729312a1df1SDavid du Colombier 	}
730312a1df1SDavid du Colombier }
731312a1df1SDavid du Colombier 
732f3793cddSDavid du Colombier int
c_splurge_any(ProcList * p)733f3793cddSDavid du Colombier c_splurge_any(ProcList *p)
734f3793cddSDavid du Colombier {	Ordered *walk;
735f3793cddSDavid du Colombier 	Symbol *sp;
736f3793cddSDavid du Colombier 
73700d97012SDavid du Colombier 	if (p->b != N_CLAIM && p->b != E_TRACE && p->b != N_TRACE)
738f3793cddSDavid du Colombier 	for (walk = all_names; walk; walk = walk->next)
739f3793cddSDavid du Colombier 	{	sp = walk->entry;
740f3793cddSDavid du Colombier 		if (!sp->context
741f3793cddSDavid du Colombier 		||  sp->type == 0
742f3793cddSDavid du Colombier 		||  strcmp(sp->context->name, p->n->name) != 0
743f3793cddSDavid du Colombier 		||  sp->owner || (sp->hidden&1)
744f3793cddSDavid du Colombier 		|| (sp->type == MTYPE && ismtype(sp->name)))
745f3793cddSDavid du Colombier 			continue;
746f3793cddSDavid du Colombier 
747f3793cddSDavid du Colombier 		return 1;
748f3793cddSDavid du Colombier 	}
749f3793cddSDavid du Colombier 	return 0;
750f3793cddSDavid du Colombier }
751f3793cddSDavid du Colombier 
752312a1df1SDavid du Colombier void
c_splurge(FILE * fd,ProcList * p)753312a1df1SDavid du Colombier c_splurge(FILE *fd, ProcList *p)
754312a1df1SDavid du Colombier {	Ordered *walk;
755312a1df1SDavid du Colombier 	Symbol *sp;
756312a1df1SDavid du Colombier 	char pref[64];
757312a1df1SDavid du Colombier 
75800d97012SDavid du Colombier 	if (p->b != N_CLAIM && p->b != E_TRACE && p->b != N_TRACE)
759312a1df1SDavid du Colombier 	for (walk = all_names; walk; walk = walk->next)
760312a1df1SDavid du Colombier 	{	sp = walk->entry;
761312a1df1SDavid du Colombier 		if (!sp->context
762f3793cddSDavid du Colombier 		||  sp->type == 0
763312a1df1SDavid du Colombier 		||  strcmp(sp->context->name, p->n->name) != 0
764312a1df1SDavid du Colombier 		||  sp->owner || (sp->hidden&1)
765312a1df1SDavid du Colombier 		|| (sp->type == MTYPE && ismtype(sp->name)))
766312a1df1SDavid du Colombier 			continue;
767312a1df1SDavid du Colombier 
768312a1df1SDavid du Colombier 		sprintf(pref, "((P%d *)pptr(pid))->", p->tn);
769312a1df1SDavid du Colombier 		c_var(fd, pref, sp);
770312a1df1SDavid du Colombier 	}
771312a1df1SDavid du Colombier }
772312a1df1SDavid du Colombier 
773312a1df1SDavid du Colombier void
c_wrapper(FILE * fd)774312a1df1SDavid du Colombier c_wrapper(FILE *fd)	/* allow pan.c to print out global sv entries */
775312a1df1SDavid du Colombier {	Ordered  *walk;
776312a1df1SDavid du Colombier 	ProcList *p;
777312a1df1SDavid du Colombier 	Symbol   *sp;
778*de2caf28SDavid du Colombier 	Mtypes_t *lst;
779312a1df1SDavid du Colombier 	Lextok   *n;
780312a1df1SDavid du Colombier 	int	  j;
781*de2caf28SDavid du Colombier 	extern Mtypes_t *Mtypes;
782312a1df1SDavid du Colombier 
783312a1df1SDavid du Colombier 	fprintf(fd, "void\nc_globals(void)\n{\t/* int i; */\n");
784312a1df1SDavid du Colombier 	fprintf(fd, "	printf(\"global vars:\\n\");\n");
785312a1df1SDavid du Colombier 	for (walk = all_names; walk; walk = walk->next)
786312a1df1SDavid du Colombier 	{	sp = walk->entry;
787*de2caf28SDavid du Colombier 		if (sp->context || sp->owner || (sp->hidden&1))
788312a1df1SDavid du Colombier 			continue;
789312a1df1SDavid du Colombier 		c_var(fd, "now.", sp);
790312a1df1SDavid du Colombier 	}
791312a1df1SDavid du Colombier 	fprintf(fd, "}\n");
792312a1df1SDavid du Colombier 
793312a1df1SDavid du Colombier 	fprintf(fd, "void\nc_locals(int pid, int tp)\n{\t/* int i; */\n");
794312a1df1SDavid du Colombier 	fprintf(fd, "	switch(tp) {\n");
795*de2caf28SDavid du Colombier 	for (p = ready; p; p = p->nxt)
796312a1df1SDavid du Colombier 	{	fprintf(fd, "	case %d:\n", p->tn);
797f3793cddSDavid du Colombier 		if (c_splurge_any(p))
798f3793cddSDavid du Colombier 		{	fprintf(fd, "	\tprintf(\"local vars proc %%d (%s):\\n\", pid);\n",
799f3793cddSDavid du Colombier 				p->n->name);
800312a1df1SDavid du Colombier 			c_splurge(fd, p);
801f3793cddSDavid du Colombier 		} else
802f3793cddSDavid du Colombier 		{	fprintf(fd, "	\t/* none */\n");
803f3793cddSDavid du Colombier 		}
804312a1df1SDavid du Colombier 		fprintf(fd, "	\tbreak;\n");
805312a1df1SDavid du Colombier 	}
806312a1df1SDavid du Colombier 	fprintf(fd, "	}\n}\n");
807312a1df1SDavid du Colombier 
808*de2caf28SDavid du Colombier 	fprintf(fd, "void\nprintm(int x, char *s)\n{\n");
809*de2caf28SDavid du Colombier 	fprintf(fd, "	if (!s) { s = \"_unnamed_\"; }\n");
810*de2caf28SDavid du Colombier 	for (lst = Mtypes; lst; lst = lst->nxt)
811*de2caf28SDavid du Colombier 	{	fprintf(fd, "	if (strcmp(s, \"%s\") == 0)\n", lst->nm);
812312a1df1SDavid du Colombier 		fprintf(fd, "	switch (x) {\n");
813*de2caf28SDavid du Colombier 	        for (n = lst->mt, j = 1; n && j; n = n->rgt, j++)
814*de2caf28SDavid du Colombier 	                fprintf(fd, "\tcase %d: Printf(\"%s\"); return;\n",
815312a1df1SDavid du Colombier 				j, n->lft->sym->name);
816*de2caf28SDavid du Colombier 		fprintf(fd, "	default: Printf(\"%%d\", x); return;\n");
817312a1df1SDavid du Colombier 		fprintf(fd, "	}\n");
818*de2caf28SDavid du Colombier 	}
819312a1df1SDavid du Colombier 	fprintf(fd, "}\n");
820312a1df1SDavid du Colombier }
821312a1df1SDavid du Colombier 
8227dd7cddfSDavid du Colombier static int
doglobal(char * pre,int dowhat)8237dd7cddfSDavid du Colombier doglobal(char *pre, int dowhat)
8247dd7cddfSDavid du Colombier {	Ordered *walk;
8257dd7cddfSDavid du Colombier 	Symbol *sp;
8267dd7cddfSDavid du Colombier 	int j, cnt = 0;
827219b2ee8SDavid du Colombier 
8287dd7cddfSDavid du Colombier 	for (j = 0; j < 8; j++)
8297dd7cddfSDavid du Colombier 	for (walk = all_names; walk; walk = walk->next)
8307dd7cddfSDavid du Colombier 	{	sp = walk->entry;
831219b2ee8SDavid du Colombier 		if (!sp->context
832219b2ee8SDavid du Colombier 		&&  !sp->owner
833219b2ee8SDavid du Colombier 		&&  sp->type == Types[j])
8347dd7cddfSDavid du Colombier 		{	if (Types[j] != MTYPE || !ismtype(sp->name))
8357dd7cddfSDavid du Colombier 			switch (dowhat) {
8367dd7cddfSDavid du Colombier 			case LOGV:
8377dd7cddfSDavid du Colombier 				if (sp->type == CHAN
8387dd7cddfSDavid du Colombier 				&&  verbose == 0)
8397dd7cddfSDavid du Colombier 					break;
8407dd7cddfSDavid du Colombier 				if (sp->hidden&1)
8417dd7cddfSDavid du Colombier 					break;
842*de2caf28SDavid du Colombier 				do_var(fd_tc, dowhat, "", sp,
8437dd7cddfSDavid du Colombier 					pre, "\", now.", ");\n");
8447dd7cddfSDavid du Colombier 				break;
8457dd7cddfSDavid du Colombier 			case INIV:
8467dd7cddfSDavid du Colombier 				checktype(sp, (char *) 0);
8477dd7cddfSDavid du Colombier 				cnt++; /* fall through */
8487dd7cddfSDavid du Colombier 			case PUTV:
849*de2caf28SDavid du Colombier 				do_var(fd_tc, dowhat,
85000d97012SDavid du Colombier 					(sp->hidden&1)?"":"now.", sp,
8517dd7cddfSDavid du Colombier 					"", " = ", ";\n");
8527dd7cddfSDavid du Colombier 				break;
8537dd7cddfSDavid du Colombier 	}	}	}
8547dd7cddfSDavid du Colombier 	return cnt;
855219b2ee8SDavid du Colombier }
856219b2ee8SDavid du Colombier 
8577dd7cddfSDavid du Colombier static void
dohidden(void)858219b2ee8SDavid du Colombier dohidden(void)
8597dd7cddfSDavid du Colombier {	Ordered *walk;
8607dd7cddfSDavid du Colombier 	Symbol *sp;
8617dd7cddfSDavid du Colombier 	int j;
862219b2ee8SDavid du Colombier 
8637dd7cddfSDavid du Colombier 	for (j = 0; j < 8; j++)
8647dd7cddfSDavid du Colombier 	for (walk = all_names; walk; walk = walk->next)
8657dd7cddfSDavid du Colombier 	{	sp = walk->entry;
8667dd7cddfSDavid du Colombier 		if ((sp->hidden&1)
867219b2ee8SDavid du Colombier 		&&  sp->type == Types[j])
868219b2ee8SDavid du Colombier 		{	if (sp->context || sp->owner)
869219b2ee8SDavid du Colombier 			  fatal("cannot hide non-globals (%s)", sp->name);
870219b2ee8SDavid du Colombier 			if (sp->type == CHAN)
871219b2ee8SDavid du Colombier 			  fatal("cannot hide channels (%s)", sp->name);
872*de2caf28SDavid du Colombier 			fprintf(fd_th, "/* hidden variable: */");
873219b2ee8SDavid du Colombier 			typ2c(sp);
8747dd7cddfSDavid du Colombier 	}	}
875219b2ee8SDavid du Colombier }
876219b2ee8SDavid du Colombier 
877219b2ee8SDavid du Colombier void
do_var(FILE * ofd,int dowhat,char * s,Symbol * sp,char * pre,char * sep,char * ter)8787dd7cddfSDavid du Colombier do_var(FILE *ofd, int dowhat, char *s, Symbol *sp,
8797dd7cddfSDavid du Colombier 	char *pre, char *sep, char *ter)
880219b2ee8SDavid du Colombier {	int i;
88100d97012SDavid du Colombier 	char *ptr = sp?sp->name:"";
88200d97012SDavid du Colombier 
88300d97012SDavid du Colombier 	if (!sp)
88400d97012SDavid du Colombier 	{	fatal("cannot happen - do_var", 0);
88500d97012SDavid du Colombier 	}
886219b2ee8SDavid du Colombier 
887219b2ee8SDavid du Colombier 	switch(dowhat) {
888219b2ee8SDavid du Colombier 	case PUTV:
8897dd7cddfSDavid du Colombier 		if (sp->hidden&1) break;
8907dd7cddfSDavid du Colombier 
891219b2ee8SDavid du Colombier 		typ2c(sp);
892219b2ee8SDavid du Colombier 		break;
89300d97012SDavid du Colombier 
8947dd7cddfSDavid du Colombier 	case LOGV:
89500d97012SDavid du Colombier 		if (!old_scope_rules)
89600d97012SDavid du Colombier 		{	while (*ptr == '_' || isdigit((int)*ptr))
89700d97012SDavid du Colombier 			{	ptr++;
89800d97012SDavid du Colombier 		}	}
89900d97012SDavid du Colombier 		/* fall thru */
900219b2ee8SDavid du Colombier 	case INIV:
901219b2ee8SDavid du Colombier 		if (sp->type == STRUCT)
902219b2ee8SDavid du Colombier 		{	/* struct may contain a chan */
9037dd7cddfSDavid du Colombier 			walk_struct(ofd, dowhat, s, sp, pre, sep, ter);
904219b2ee8SDavid du Colombier 			break;
905219b2ee8SDavid du Colombier 		}
9067dd7cddfSDavid du Colombier 		if (!sp->ini && dowhat != LOGV)	/* it defaults to 0 */
907219b2ee8SDavid du Colombier 			break;
90800d97012SDavid du Colombier 		if (sp->nel == 1 && sp->isarray == 0)
90900d97012SDavid du Colombier 		{	if (dowhat == LOGV)
91000d97012SDavid du Colombier 			{	fprintf(ofd, "\t\t%s%s%s%s",
91100d97012SDavid du Colombier 					pre, s, ptr, sep);
91200d97012SDavid du Colombier 				fprintf(ofd, "%s%s", s, sp->name);
91300d97012SDavid du Colombier 			} else
9147dd7cddfSDavid du Colombier 			{	fprintf(ofd, "\t\t%s%s%s%s",
9157dd7cddfSDavid du Colombier 					pre, s, sp->name, sep);
9167dd7cddfSDavid du Colombier 				do_init(ofd, sp);
91700d97012SDavid du Colombier 			}
9187dd7cddfSDavid du Colombier 			fprintf(ofd, "%s", ter);
919219b2ee8SDavid du Colombier 		} else
920f3793cddSDavid du Colombier 		{	if (sp->ini && sp->ini->ntyp == CHAN)
921f3793cddSDavid du Colombier 			{	for (i = 0; i < sp->nel; i++)
9227dd7cddfSDavid du Colombier 				{	fprintf(ofd, "\t\t%s%s%s[%d]%s",
9237dd7cddfSDavid du Colombier 						pre, s, sp->name, i, sep);
9247dd7cddfSDavid du Colombier 					if (dowhat == LOGV)
9257dd7cddfSDavid du Colombier 						fprintf(ofd, "%s%s[%d]",
9267dd7cddfSDavid du Colombier 							s, sp->name, i);
9277dd7cddfSDavid du Colombier 					else
9287dd7cddfSDavid du Colombier 						do_init(ofd, sp);
9297dd7cddfSDavid du Colombier 					fprintf(ofd, "%s", ter);
930219b2ee8SDavid du Colombier 				}
931*de2caf28SDavid du Colombier 			} else if (sp->ini)
932*de2caf28SDavid du Colombier 			{	if (dowhat != LOGV && sp->isarray && sp->ini->ntyp == ',')
933*de2caf28SDavid du Colombier 				{	Lextok *z, *y;
934*de2caf28SDavid du Colombier 					z = sp->ini;
935*de2caf28SDavid du Colombier 					for (i = 0; i < sp->nel; i++)
936*de2caf28SDavid du Colombier 					{	if (z && z->ntyp == ',')
937*de2caf28SDavid du Colombier 						{	y = z->lft;
938*de2caf28SDavid du Colombier 							z = z->rgt;
939*de2caf28SDavid du Colombier 						} else
940*de2caf28SDavid du Colombier 						{	y = z;
941*de2caf28SDavid du Colombier 						}
942*de2caf28SDavid du Colombier 						fprintf(ofd, "\t\t%s%s%s[%d]%s",
943*de2caf28SDavid du Colombier 							pre, s, sp->name, i, sep);
944*de2caf28SDavid du Colombier 						putstmnt(ofd, y, 0);
945*de2caf28SDavid du Colombier 						fprintf(ofd, "%s", ter);
946*de2caf28SDavid du Colombier 					}
947f3793cddSDavid du Colombier 				} else
948f3793cddSDavid du Colombier 				{	fprintf(ofd, "\t{\tint l_in;\n");
949*de2caf28SDavid du Colombier 					fprintf(ofd, "\t\tfor (l_in = 0; l_in < %d; l_in++)\n",
950*de2caf28SDavid du Colombier 						sp->nel);
951f3793cddSDavid du Colombier 					fprintf(ofd, "\t\t{\n");
952f3793cddSDavid du Colombier 					fprintf(ofd, "\t\t\t%s%s%s[l_in]%s",
953f3793cddSDavid du Colombier 						pre, s, sp->name, sep);
954f3793cddSDavid du Colombier 					if (dowhat == LOGV)
955*de2caf28SDavid du Colombier 					{	fprintf(ofd, "%s%s[l_in]", s, sp->name);
956*de2caf28SDavid du Colombier 					} else
957*de2caf28SDavid du Colombier 					{	putstmnt(ofd, sp->ini, 0);
958*de2caf28SDavid du Colombier 					}
959f3793cddSDavid du Colombier 					fprintf(ofd, "%s", ter);
960f3793cddSDavid du Colombier 					fprintf(ofd, "\t\t}\n");
961f3793cddSDavid du Colombier 					fprintf(ofd, "\t}\n");
962*de2caf28SDavid du Colombier 		}	}	}
963219b2ee8SDavid du Colombier 		break;
964219b2ee8SDavid du Colombier 	}
965219b2ee8SDavid du Colombier }
966219b2ee8SDavid du Colombier 
9677dd7cddfSDavid du Colombier static void
do_init(FILE * ofd,Symbol * sp)9687dd7cddfSDavid du Colombier do_init(FILE *ofd, Symbol *sp)
96900d97012SDavid du Colombier {	int i;
970219b2ee8SDavid du Colombier 
9717dd7cddfSDavid du Colombier 	if (sp->ini
9727dd7cddfSDavid du Colombier 	&&  sp->type == CHAN
9737dd7cddfSDavid du Colombier 	&& ((i = qmake(sp)) > 0))
974219b2ee8SDavid du Colombier 	{	if (sp->ini->ntyp == CHAN)
97500d97012SDavid du Colombier 		{	fprintf(ofd, "addqueue(calling_pid, %d, %d)",
976219b2ee8SDavid du Colombier 				i, ltab[i-1]->nslots == 0);
977219b2ee8SDavid du Colombier 		} else
97800d97012SDavid du Colombier 		{	fprintf(ofd, "%d", i);
979219b2ee8SDavid du Colombier 		}
98000d97012SDavid du Colombier 	} else
98100d97012SDavid du Colombier 	{	putstmnt(ofd, sp->ini, 0);
98200d97012SDavid du Colombier 	}
983219b2ee8SDavid du Colombier }
984219b2ee8SDavid du Colombier 
9857dd7cddfSDavid du Colombier static void
put_ptype(char * s,int i,int m0,int m1,enum btypes b)98600d97012SDavid du Colombier put_ptype(char *s, int i, int m0, int m1, enum btypes b)
987219b2ee8SDavid du Colombier {	int k;
988219b2ee8SDavid du Colombier 
98900d97012SDavid du Colombier 	if (b == I_PROC)
990*de2caf28SDavid du Colombier 	{	fprintf(fd_th, "#define Pinit	((P%d *)_this)\n", i);
99100d97012SDavid du Colombier 	} else if (b == P_PROC || b == A_PROC)
992*de2caf28SDavid du Colombier 	{	fprintf(fd_th, "#define P%s	((P%d *)_this)\n", s, i);
99300d97012SDavid du Colombier 	}
994312a1df1SDavid du Colombier 
995*de2caf28SDavid du Colombier 	fprintf(fd_th, "typedef struct P%d { /* %s */\n", i, s);
996*de2caf28SDavid du Colombier 	fprintf(fd_th, "	unsigned _pid : 8;  /* 0..255 */\n");
997*de2caf28SDavid du Colombier 	fprintf(fd_th, "	unsigned _t   : %d; /* proctype */\n", blog(m1));
998*de2caf28SDavid du Colombier 	fprintf(fd_th, "	unsigned _p   : %d; /* state    */\n", blog(m0));
999*de2caf28SDavid du Colombier 	fprintf(fd_th, "#ifdef HAS_PRIORITY\n");
1000*de2caf28SDavid du Colombier 	fprintf(fd_th, "	unsigned _priority : 8; /* 0..255 */\n");
1001*de2caf28SDavid du Colombier 	fprintf(fd_th, "#endif\n");
1002219b2ee8SDavid du Colombier 	LstSet = ZS;
1003219b2ee8SDavid du Colombier 	nBits = 8 + blog(m1) + blog(m0);
1004*de2caf28SDavid du Colombier 	k = dolocal(fd_tc, "", PUTV, i, s, b);	/* includes pars */
1005*de2caf28SDavid du Colombier 	c_add_loc(fd_th, s);
1006312a1df1SDavid du Colombier 
1007*de2caf28SDavid du Colombier 	fprintf(fd_th, "} P%d;\n", i);
1008312a1df1SDavid du Colombier 	if ((!LstSet && k > 0) || has_state)
1009*de2caf28SDavid du Colombier 		fprintf(fd_th, "#define Air%d	0\n\n", i);
101000d97012SDavid du Colombier 	else if (LstSet || k == 0)			/* 5.0, added condition */
1011*de2caf28SDavid du Colombier 	{	fprintf(fd_th, "#define Air%d	(sizeof(P%d) - ", i, i);
1012219b2ee8SDavid du Colombier 		if (k == 0)
1013*de2caf28SDavid du Colombier 		{	fprintf(fd_th, "%d", (nBits+7)/8);
1014219b2ee8SDavid du Colombier 			goto done;
1015219b2ee8SDavid du Colombier 		}
10167dd7cddfSDavid du Colombier 		if ((LstSet->type != BIT && LstSet->type != UNSIGNED)
10177dd7cddfSDavid du Colombier 		||   LstSet->nel != 1)
1018*de2caf28SDavid du Colombier 		{	fprintf(fd_th, "Offsetof(P%d, %s) - %d*sizeof(",
1019312a1df1SDavid du Colombier 				i, LstSet->name, LstSet->nel);
1020219b2ee8SDavid du Colombier 		}
1021219b2ee8SDavid du Colombier 		switch(LstSet->type) {
10227dd7cddfSDavid du Colombier 		case UNSIGNED:
1023*de2caf28SDavid du Colombier 			fprintf(fd_th, "%d", (nBits+7)/8);
10247dd7cddfSDavid du Colombier 			break;
1025219b2ee8SDavid du Colombier 		case BIT:
10267dd7cddfSDavid du Colombier 			if (LstSet->nel == 1)
1027*de2caf28SDavid du Colombier 			{	fprintf(fd_th, "%d", (nBits+7)/8);
1028219b2ee8SDavid du Colombier 				break;
1029219b2ee8SDavid du Colombier 			}	/* else fall through */
10307dd7cddfSDavid du Colombier 		case MTYPE: case BYTE: case CHAN:
1031*de2caf28SDavid du Colombier 			fprintf(fd_th, "uchar)"); break;
1032219b2ee8SDavid du Colombier 		case SHORT:
1033*de2caf28SDavid du Colombier 			fprintf(fd_th, "short)"); break;
1034219b2ee8SDavid du Colombier 		case INT:
1035*de2caf28SDavid du Colombier 			fprintf(fd_th, "int)"); break;
1036219b2ee8SDavid du Colombier 		default:
1037219b2ee8SDavid du Colombier 			fatal("cannot happen Air %s",
1038219b2ee8SDavid du Colombier 				LstSet->name);
1039219b2ee8SDavid du Colombier 		}
1040*de2caf28SDavid du Colombier done:		fprintf(fd_th, ")\n\n");
1041219b2ee8SDavid du Colombier 	}
1042219b2ee8SDavid du Colombier }
1043219b2ee8SDavid du Colombier 
10447dd7cddfSDavid du Colombier static void
tc_predef_np(void)10457dd7cddfSDavid du Colombier tc_predef_np(void)
1046*de2caf28SDavid du Colombier {
1047*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define _NP_	%d\n", nrRdy);	/* 1+ highest proctype nr */
10487dd7cddfSDavid du Colombier 
1049*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define _nstates%d	3 /* np_ */\n", nrRdy);
1050*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define _endstate%d	2 /* np_ */\n\n", nrRdy);
1051*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define _start%d	0 /* np_ */\n", nrRdy);
10527dd7cddfSDavid du Colombier 
1053*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\tcase %d:	/* np_ */\n", nrRdy);
10547dd7cddfSDavid du Colombier 	if (separate == 1)
1055*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "\t\tini_claim(%d, h);\n", nrRdy);
10567dd7cddfSDavid du Colombier 	} else
1057*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_t = %d;\n", nrRdy, nrRdy);
1058*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_p = 0;\n", nrRdy);
1059*de2caf28SDavid du Colombier 
1060*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#ifdef HAS_PRIORITY\n");
1061*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_priority = priority;\n", nrRdy);
1062*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#endif\n");
1063*de2caf28SDavid du Colombier 
1064*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\treached%d[0] = 1;\n", nrRdy);
1065*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\taccpstate[%d][1] = 1;\n", nrRdy);
10667dd7cddfSDavid du Colombier 	}
1067*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\tbreak;\n");
10687dd7cddfSDavid du Colombier }
10697dd7cddfSDavid du Colombier 
10707dd7cddfSDavid du Colombier static void
multi_init(void)107100d97012SDavid du Colombier multi_init(void)
107200d97012SDavid du Colombier {	ProcList *p;
107300d97012SDavid du Colombier 	Element	*e;
107400d97012SDavid du Colombier 	int i = nrRdy+1;
107500d97012SDavid du Colombier 	int ini, j;
107600d97012SDavid du Colombier 	int nrc = nclaims;
107700d97012SDavid du Colombier 
1078*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#ifndef NOCLAIM\n");
1079*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\tcase %d:	/* claim select */\n", i);
1080*de2caf28SDavid du Colombier 	for (p = ready, j = 0; p; p = p->nxt, j++)
108100d97012SDavid du Colombier 	{	if (p->b == N_CLAIM)
108200d97012SDavid du Colombier 		{	e = p->s->frst;
108300d97012SDavid du Colombier 			ini = huntele(e, e->status, -1)->seqno;
108400d97012SDavid du Colombier 
1085*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\tspin_c_typ[%d] = %d; /* %s */\n",
108600d97012SDavid du Colombier 				j, p->tn, p->n->name);
1087*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t((P%d *)pptr(h))->c_cur[%d] = %d;\n",
108800d97012SDavid du Colombier 				i, j, ini);
1089*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\treached%d[%d]=1;\n", p->tn, ini);
109000d97012SDavid du Colombier 
109100d97012SDavid du Colombier 			/* the default initial claim is first one in model */
109200d97012SDavid du Colombier 			if (--nrc == 0)
1093*de2caf28SDavid du Colombier 			{ fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_t = %d;\n", i, p->tn);
1094*de2caf28SDavid du Colombier 			  fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_p = %d;\n", i, ini);
1095*de2caf28SDavid du Colombier 			  fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_n = %d; /* %s */\n",
109600d97012SDavid du Colombier 				i, j, p->n->name);
1097*de2caf28SDavid du Colombier 			  fprintf(fd_tc, "\t\tsrc_claim = src_ln%d;\n", p->tn);
1098*de2caf28SDavid du Colombier 			  fprintf(fd_tc, "#ifndef BFS\n");
1099*de2caf28SDavid du Colombier 			  fprintf(fd_tc, "\t\tif (whichclaim == -1 && claimname == NULL)\n");
1100*de2caf28SDavid du Colombier 			  fprintf(fd_tc, "\t\t\tprintf(\"pan: ltl formula %s\\n\");\n",
1101*de2caf28SDavid du Colombier 				p->n->name);
1102*de2caf28SDavid du Colombier 			  fprintf(fd_tc, "#endif\n");
110300d97012SDavid du Colombier 			}
110400d97012SDavid du Colombier 	}	}
1105*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\tif (whichclaim != -1)\n");
1106*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\t{	select_claim(whichclaim);\n");
1107*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\t}\n");
1108*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\tbreak;\n\n");
1109*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#endif\n");
111000d97012SDavid du Colombier }
111100d97012SDavid du Colombier 
111200d97012SDavid du Colombier static void
put_pinit(ProcList * P)11137dd7cddfSDavid du Colombier put_pinit(ProcList *P)
1114219b2ee8SDavid du Colombier {	Lextok	*fp, *fpt, *t;
11157dd7cddfSDavid du Colombier 	Element	*e = P->s->frst;
11167dd7cddfSDavid du Colombier 	Symbol	*s = P->n;
11177dd7cddfSDavid du Colombier 	Lextok	*p = P->p;
11187dd7cddfSDavid du Colombier 	int	 i = P->tn;
11197dd7cddfSDavid du Colombier 	int	ini, j, k;
11207dd7cddfSDavid du Colombier 
112100d97012SDavid du Colombier 	if (pid_is_claim(i)
11227dd7cddfSDavid du Colombier 	&&  separate == 1)
1123*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "\tcase %d:	/* %s */\n", i, s->name);
1124*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\tini_claim(%d, h);\n", i);
1125*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\tbreak;\n");
11267dd7cddfSDavid du Colombier 		return;
11277dd7cddfSDavid du Colombier 	}
112800d97012SDavid du Colombier 	if (!pid_is_claim(i)
11297dd7cddfSDavid du Colombier 	&&  separate == 2)
11307dd7cddfSDavid du Colombier 		return;
1131219b2ee8SDavid du Colombier 
1132312a1df1SDavid du Colombier 	ini = huntele(e, e->status, -1)->seqno;
1133*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define _start%d	%d\n", i, ini);
11347dd7cddfSDavid du Colombier 	if (i == eventmapnr)
1135*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define start_event	%d\n", ini);
1136219b2ee8SDavid du Colombier 
1137*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\tcase %d:	/* %s */\n", i, s->name);
11387dd7cddfSDavid du Colombier 
1139*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_t = %d;\n", i, i);
1140*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_p = %d;\n", i, ini);
1141*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#ifdef HAS_PRIORITY\n");
1142*de2caf28SDavid du Colombier 
1143*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\t((P%d *)pptr(h))->_priority = priority; /* was: %d */\n",
1144*de2caf28SDavid du Colombier 		i, (P->priority<1)? 1 : P->priority);
1145*de2caf28SDavid du Colombier 
1146*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#endif\n");
1147*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\treached%d[%d]=1;\n", i, ini);
114800d97012SDavid du Colombier 	if (P->b == N_CLAIM)
1149*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "\t\tsrc_claim = src_ln%d;\n", i);
115000d97012SDavid du Colombier 	}
1151219b2ee8SDavid du Colombier 
11527dd7cddfSDavid du Colombier 	if (has_provided)
1153*de2caf28SDavid du Colombier 	{	fprintf(fd_tt, "\tcase %d: /* %s */\n\t\t", i, s->name);
11547dd7cddfSDavid du Colombier 		if (P->prov)
1155*de2caf28SDavid du Colombier 		{	fprintf(fd_tt, "if (");
1156*de2caf28SDavid du Colombier 			putstmnt(fd_tt, P->prov, 0);
1157*de2caf28SDavid du Colombier 			fprintf(fd_tt, ")\n\t\t\t");
11587dd7cddfSDavid du Colombier 		}
1159*de2caf28SDavid du Colombier 		fprintf(fd_tt, "return 1;\n");
11607dd7cddfSDavid du Colombier 		if (P->prov)
1161*de2caf28SDavid du Colombier 			fprintf(fd_tt, "\t\tbreak;\n");
11627dd7cddfSDavid du Colombier 	}
1163219b2ee8SDavid du Colombier 
1164*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\t/* params: */\n");
1165219b2ee8SDavid du Colombier 	for (fp  = p, j=0; fp; fp = fp->rgt)
1166219b2ee8SDavid du Colombier 	for (fpt = fp->lft; fpt; fpt = fpt->rgt, j++)
1167219b2ee8SDavid du Colombier 	{	t = (fpt->ntyp == ',') ? fpt->lft : fpt;
116800d97012SDavid du Colombier 		if (t->sym->nel > 1 || t->sym->isarray)
1169219b2ee8SDavid du Colombier 		{	lineno = t->ln;
1170219b2ee8SDavid du Colombier 			Fname  = t->fn;
1171219b2ee8SDavid du Colombier 			fatal("array in parameter list, %s",
1172219b2ee8SDavid du Colombier 			t->sym->name);
1173219b2ee8SDavid du Colombier 		}
1174*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t((P%d *)pptr(h))->", i);
1175219b2ee8SDavid du Colombier 		if (t->sym->type == STRUCT)
1176*de2caf28SDavid du Colombier 		{	if (full_name(fd_tc, t, t->sym, 1))
11777dd7cddfSDavid du Colombier 			{	lineno = t->ln;
11787dd7cddfSDavid du Colombier 				Fname  = t->fn;
1179312a1df1SDavid du Colombier 				fatal("hidden array in parameter %s",
11807dd7cddfSDavid du Colombier 				t->sym->name);
11817dd7cddfSDavid du Colombier 			}
11827dd7cddfSDavid du Colombier 		} else
1183*de2caf28SDavid du Colombier 			fprintf(fd_tc, "%s", t->sym->name);
1184*de2caf28SDavid du Colombier 		fprintf(fd_tc, " = par%d;\n", j);
1185219b2ee8SDavid du Colombier 	}
1186*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\t/* locals: */\n");
1187*de2caf28SDavid du Colombier 	k = dolocal(fd_tc, "", INIV, i, s->name, P->b);
11887dd7cddfSDavid du Colombier 	if (k > 0)
1189*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "#ifdef VAR_RANGES\n");
1190*de2caf28SDavid du Colombier 		(void) dolocal(fd_tc, "logval(\"", LOGV, i, s->name, P->b);
1191*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#endif\n");
11927dd7cddfSDavid du Colombier 	}
1193312a1df1SDavid du Colombier 
1194*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#ifdef HAS_CODE\n");
1195*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t\tlocinit%d(h);\n", i);
1196*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#endif\n");
1197312a1df1SDavid du Colombier 
1198*de2caf28SDavid du Colombier 	dumpclaims(fd_tc, i, s->name);
1199*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\t	break;\n");
1200219b2ee8SDavid du Colombier }
1201219b2ee8SDavid du Colombier 
1202219b2ee8SDavid du Colombier Element *
huntstart(Element * f)1203219b2ee8SDavid du Colombier huntstart(Element *f)
1204219b2ee8SDavid du Colombier {	Element *e = f;
1205312a1df1SDavid du Colombier 	Element *elast = (Element *) 0;
1206312a1df1SDavid du Colombier 	int cnt = 0;
1207219b2ee8SDavid du Colombier 
1208f3793cddSDavid du Colombier 	while (elast != e && cnt++ < 200)	/* new 4.0.8 */
1209312a1df1SDavid du Colombier 	{	elast = e;
1210219b2ee8SDavid du Colombier 		if (e->n)
1211219b2ee8SDavid du Colombier 		{	if (e->n->ntyp == '.' && e->nxt)
1212219b2ee8SDavid du Colombier 				e = e->nxt;
1213219b2ee8SDavid du Colombier 			else if (e->n->ntyp == UNLESS)
1214312a1df1SDavid du Colombier 				e = e->sub->this->frst;
1215312a1df1SDavid du Colombier 	}	}
1216312a1df1SDavid du Colombier 
1217f3793cddSDavid du Colombier 	if (cnt >= 200 || !e)
1218*de2caf28SDavid du Colombier 	{	lineno = (f && f->n)?f->n->ln:lineno;
1219*de2caf28SDavid du Colombier 		fatal("confusing control. structure", (char *) 0);
1220*de2caf28SDavid du Colombier 	}
1221219b2ee8SDavid du Colombier 	return e;
1222219b2ee8SDavid du Colombier }
1223219b2ee8SDavid du Colombier 
1224219b2ee8SDavid du Colombier Element *
huntele(Element * f,unsigned int o,int stopat)1225*de2caf28SDavid du Colombier huntele(Element *f, unsigned int o, int stopat)
1226219b2ee8SDavid du Colombier {	Element *g, *e = f;
1227312a1df1SDavid du Colombier 	int cnt=0; /* a precaution against loops */
1228219b2ee8SDavid du Colombier 
1229219b2ee8SDavid du Colombier 	if (e)
1230*de2caf28SDavid du Colombier 	for ( ; cnt < 500 && e->n; cnt++)
1231312a1df1SDavid du Colombier 	{
1232312a1df1SDavid du Colombier 		if (e->seqno == stopat)
1233312a1df1SDavid du Colombier 			break;
1234312a1df1SDavid du Colombier 
1235312a1df1SDavid du Colombier 		switch (e->n->ntyp) {
1236219b2ee8SDavid du Colombier 		case GOTO:
1237219b2ee8SDavid du Colombier 			g = get_lab(e->n,1);
1238*de2caf28SDavid du Colombier 			if (e == g)
1239*de2caf28SDavid du Colombier 			{	lineno = (f && f->n)?f->n->ln:lineno;
1240*de2caf28SDavid du Colombier 				fatal("infinite goto loop", (char *) 0);
1241*de2caf28SDavid du Colombier 			}
1242219b2ee8SDavid du Colombier 			cross_dsteps(e->n, g->n);
1243219b2ee8SDavid du Colombier 			break;
1244219b2ee8SDavid du Colombier 		case '.':
1245219b2ee8SDavid du Colombier 		case BREAK:
1246219b2ee8SDavid du Colombier 			if (!e->nxt)
1247219b2ee8SDavid du Colombier 				return e;
1248219b2ee8SDavid du Colombier 			g = e->nxt;
1249219b2ee8SDavid du Colombier 			break;
1250219b2ee8SDavid du Colombier 		case UNLESS:
1251312a1df1SDavid du Colombier 			g = huntele(e->sub->this->frst, o, stopat);
1252*de2caf28SDavid du Colombier 			if (!g)
1253*de2caf28SDavid du Colombier 			{	fatal("unexpected error 1", (char *) 0);
1254*de2caf28SDavid du Colombier 			}
1255219b2ee8SDavid du Colombier 			break;
1256219b2ee8SDavid du Colombier 		case D_STEP:
1257219b2ee8SDavid du Colombier 		case ATOMIC:
1258219b2ee8SDavid du Colombier 		case NON_ATOMIC:
1259312a1df1SDavid du Colombier 		default:
1260219b2ee8SDavid du Colombier 			return e;
1261219b2ee8SDavid du Colombier 		}
1262219b2ee8SDavid du Colombier 		if ((o & ATOM) && !(g->status & ATOM))
1263219b2ee8SDavid du Colombier 			return e;
1264219b2ee8SDavid du Colombier 		e = g;
1265219b2ee8SDavid du Colombier 	}
1266*de2caf28SDavid du Colombier 	if (cnt >= 500 || !e)
1267*de2caf28SDavid du Colombier 	{	lineno = (f && f->n)?f->n->ln:lineno;
1268312a1df1SDavid du Colombier 		fatal("confusing control structure", (char *) 0);
1269*de2caf28SDavid du Colombier 	}
1270219b2ee8SDavid du Colombier 	return e;
1271219b2ee8SDavid du Colombier }
1272219b2ee8SDavid du Colombier 
1273219b2ee8SDavid du Colombier void
typ2c(Symbol * sp)1274219b2ee8SDavid du Colombier typ2c(Symbol *sp)
12757dd7cddfSDavid du Colombier {	int wsbits = sizeof(long)*8; /* wordsize in bits */
1276219b2ee8SDavid du Colombier 	switch (sp->type) {
12777dd7cddfSDavid du Colombier 	case UNSIGNED:
12787dd7cddfSDavid du Colombier 		if (sp->hidden&1)
1279*de2caf28SDavid du Colombier 			fprintf(fd_th, "\tuchar %s;", sp->name);
12807dd7cddfSDavid du Colombier 		else
1281*de2caf28SDavid du Colombier 			fprintf(fd_th, "\tunsigned %s : %d",
12827dd7cddfSDavid du Colombier 				sp->name, sp->nbits);
12837dd7cddfSDavid du Colombier 		LstSet = sp;
12847dd7cddfSDavid du Colombier 		if (nBits%wsbits > 0
12857dd7cddfSDavid du Colombier 		&&  wsbits - nBits%wsbits < sp->nbits)
12867dd7cddfSDavid du Colombier 		{	/* must padd to a word-boundary */
12877dd7cddfSDavid du Colombier 			nBits += wsbits - nBits%wsbits;
12887dd7cddfSDavid du Colombier 		}
12897dd7cddfSDavid du Colombier 		nBits += sp->nbits;
12907dd7cddfSDavid du Colombier 		break;
1291219b2ee8SDavid du Colombier 	case BIT:
129200d97012SDavid du Colombier 		if (sp->nel == 1 && sp->isarray == 0 && !(sp->hidden&1))
1293*de2caf28SDavid du Colombier 		{	fprintf(fd_th, "\tunsigned %s : 1", sp->name);
1294219b2ee8SDavid du Colombier 			LstSet = sp;
1295219b2ee8SDavid du Colombier 			nBits++;
1296219b2ee8SDavid du Colombier 			break;
1297219b2ee8SDavid du Colombier 		} /* else fall through */
1298312a1df1SDavid du Colombier 		if (!(sp->hidden&1) && (verbose&32))
12997dd7cddfSDavid du Colombier 		printf("spin: warning: bit-array %s[%d] mapped to byte-array\n",
13007dd7cddfSDavid du Colombier 			sp->name, sp->nel);
13017dd7cddfSDavid du Colombier 		nBits += 8*sp->nel; /* mapped onto array of uchars */
13027dd7cddfSDavid du Colombier 	case MTYPE:
1303219b2ee8SDavid du Colombier 	case BYTE:
1304219b2ee8SDavid du Colombier 	case CHAN:	/* good for up to 255 channels */
1305*de2caf28SDavid du Colombier 		fprintf(fd_th, "\tuchar %s", sp->name);
1306219b2ee8SDavid du Colombier 		LstSet = sp;
1307219b2ee8SDavid du Colombier 		break;
1308219b2ee8SDavid du Colombier 	case SHORT:
1309*de2caf28SDavid du Colombier 		fprintf(fd_th, "\tshort %s", sp->name);
1310219b2ee8SDavid du Colombier 		LstSet = sp;
1311219b2ee8SDavid du Colombier 		break;
1312219b2ee8SDavid du Colombier 	case INT:
1313*de2caf28SDavid du Colombier 		fprintf(fd_th, "\tint %s", sp->name);
1314219b2ee8SDavid du Colombier 		LstSet = sp;
1315219b2ee8SDavid du Colombier 		break;
1316219b2ee8SDavid du Colombier 	case STRUCT:
13177dd7cddfSDavid du Colombier 		if (!sp->Snm)
13187dd7cddfSDavid du Colombier 			fatal("undeclared structure element %s", sp->name);
1319*de2caf28SDavid du Colombier 		fprintf(fd_th, "\tstruct %s %s",
1320219b2ee8SDavid du Colombier 			sp->Snm->name,
1321219b2ee8SDavid du Colombier 			sp->name);
1322219b2ee8SDavid du Colombier 		LstSet = ZS;
1323219b2ee8SDavid du Colombier 		break;
1324312a1df1SDavid du Colombier 	case CODE_FRAG:
1325219b2ee8SDavid du Colombier 	case PREDEF:
1326219b2ee8SDavid du Colombier 		return;
1327219b2ee8SDavid du Colombier 	default:
1328219b2ee8SDavid du Colombier 		fatal("variable %s undeclared", sp->name);
1329219b2ee8SDavid du Colombier 	}
1330219b2ee8SDavid du Colombier 
133100d97012SDavid du Colombier 	if (sp->nel > 1 || sp->isarray)
1332*de2caf28SDavid du Colombier 		fprintf(fd_th, "[%d]", sp->nel);
1333*de2caf28SDavid du Colombier 	fprintf(fd_th, ";\n");
1334219b2ee8SDavid du Colombier }
1335219b2ee8SDavid du Colombier 
13367dd7cddfSDavid du Colombier static void
ncases(FILE * fd,int p,int n,int m,const char * c[])1337*de2caf28SDavid du Colombier ncases(FILE *fd, int p, int n, int m, const char *c[])
1338219b2ee8SDavid du Colombier {	int i, j;
1339219b2ee8SDavid du Colombier 
1340219b2ee8SDavid du Colombier 	for (j = 0; c[j]; j++)
1341219b2ee8SDavid du Colombier 	for (i = n; i < m; i++)
1342219b2ee8SDavid du Colombier 	{	fprintf(fd, c[j], i, p, i);
1343219b2ee8SDavid du Colombier 		fprintf(fd, "\n");
1344219b2ee8SDavid du Colombier 	}
1345219b2ee8SDavid du Colombier }
1346219b2ee8SDavid du Colombier 
1347219b2ee8SDavid du Colombier void
qlen_type(int qmax)1348312a1df1SDavid du Colombier qlen_type(int qmax)
1349312a1df1SDavid du Colombier {
1350*de2caf28SDavid du Colombier 	fprintf(fd_th, "\t");
1351312a1df1SDavid du Colombier 	if (qmax < 256)
1352*de2caf28SDavid du Colombier 		fprintf(fd_th, "uchar");
1353312a1df1SDavid du Colombier 	else if (qmax < 65535)
1354*de2caf28SDavid du Colombier 		fprintf(fd_th, "ushort");
1355312a1df1SDavid du Colombier 	else
1356*de2caf28SDavid du Colombier 		fprintf(fd_th, "uint");
1357*de2caf28SDavid du Colombier 	fprintf(fd_th, " Qlen;	/* q_size */\n");
1358312a1df1SDavid du Colombier }
1359312a1df1SDavid du Colombier 
1360312a1df1SDavid du Colombier void
genaddqueue(void)1361219b2ee8SDavid du Colombier genaddqueue(void)
13627dd7cddfSDavid du Colombier {	char buf0[256];
1363312a1df1SDavid du Colombier 	int j, qmax = 0;
1364219b2ee8SDavid du Colombier 	Queue *q;
1365219b2ee8SDavid du Colombier 
1366*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addq0);
1367*de2caf28SDavid du Colombier 
1368*de2caf28SDavid du Colombier 	if (has_io && !nrqs)
1369*de2caf28SDavid du Colombier 		fprintf(fd_th, "#define NQS	1 /* nrqs=%d, but has_io */\n", nrqs);
1370312a1df1SDavid du Colombier 	else
1371*de2caf28SDavid du Colombier 		fprintf(fd_th, "#define NQS	%d\n", nrqs);
1372312a1df1SDavid du Colombier 
1373312a1df1SDavid du Colombier 	for (q = qtab; q; q = q->nxt)
1374312a1df1SDavid du Colombier 		if (q->nslots > qmax)
1375312a1df1SDavid du Colombier 			qmax = q->nslots;
1376312a1df1SDavid du Colombier 
1377219b2ee8SDavid du Colombier 	for (q = qtab; q; q = q->nxt)
1378219b2ee8SDavid du Colombier 	{	j = q->qid;
1379*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\tcase %d: j = sizeof(Q%d);", j, j);
1380*de2caf28SDavid du Colombier 		fprintf(fd_tc, " q_flds[%d] = %d;", j, q->nflds);
1381*de2caf28SDavid du Colombier 		fprintf(fd_tc, " q_max[%d] = %d;", j, max(1,q->nslots));
1382*de2caf28SDavid du Colombier 		fprintf(fd_tc, " break;\n");
1383312a1df1SDavid du Colombier 
1384*de2caf28SDavid du Colombier 		fprintf(fd_th, "typedef struct Q%d {\n", j);
1385312a1df1SDavid du Colombier 		qlen_type(qmax);	/* 4.2.2 */
1386*de2caf28SDavid du Colombier 		fprintf(fd_th, "	uchar _t;	/* q_type */\n");
1387*de2caf28SDavid du Colombier 		fprintf(fd_th, "	struct {\n");
1388312a1df1SDavid du Colombier 
1389219b2ee8SDavid du Colombier 		for (j = 0; j < q->nflds; j++)
1390219b2ee8SDavid du Colombier 		{	switch (q->fld_width[j]) {
1391219b2ee8SDavid du Colombier 			case BIT:
1392219b2ee8SDavid du Colombier 				if (q->nflds != 1)
1393*de2caf28SDavid du Colombier 				{	fprintf(fd_th, "\t\tunsigned");
1394*de2caf28SDavid du Colombier 					fprintf(fd_th, " fld%d : 1;\n", j);
1395219b2ee8SDavid du Colombier 					break;
13967dd7cddfSDavid du Colombier 				} /* else fall through: smaller struct */
1397219b2ee8SDavid du Colombier 			case MTYPE:
1398219b2ee8SDavid du Colombier 			case CHAN:
1399219b2ee8SDavid du Colombier 			case BYTE:
1400*de2caf28SDavid du Colombier 				fprintf(fd_th, "\t\tuchar fld%d;\n", j);
1401219b2ee8SDavid du Colombier 				break;
1402219b2ee8SDavid du Colombier 			case SHORT:
1403*de2caf28SDavid du Colombier 				fprintf(fd_th, "\t\tshort fld%d;\n", j);
1404219b2ee8SDavid du Colombier 				break;
1405219b2ee8SDavid du Colombier 			case INT:
1406*de2caf28SDavid du Colombier 				fprintf(fd_th, "\t\tint fld%d;\n", j);
1407219b2ee8SDavid du Colombier 				break;
1408219b2ee8SDavid du Colombier 			default:
1409219b2ee8SDavid du Colombier 				fatal("bad channel spec", "");
1410219b2ee8SDavid du Colombier 			}
1411219b2ee8SDavid du Colombier 		}
1412*de2caf28SDavid du Colombier 		fprintf(fd_th, "	} contents[%d];\n", max(1, q->nslots));
1413*de2caf28SDavid du Colombier 		fprintf(fd_th, "} Q%d;\n", q->qid);
1414219b2ee8SDavid du Colombier 	}
1415312a1df1SDavid du Colombier 
1416*de2caf28SDavid du Colombier 	fprintf(fd_th, "typedef struct Q0 {\t/* generic q */\n");
1417312a1df1SDavid du Colombier 	qlen_type(qmax);	/* 4.2.2 */
1418*de2caf28SDavid du Colombier 	fprintf(fd_th, "	uchar _t;\n");
1419*de2caf28SDavid du Colombier 	fprintf(fd_th, "} Q0;\n");
1420312a1df1SDavid du Colombier 
1421*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addq1);
1422219b2ee8SDavid du Colombier 
1423*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#ifdef TRIX\n");
1424*de2caf28SDavid du Colombier 	fprintf(fd_tc, "int\nwhat_p_size(int t)\n{\tint j;\n");
1425*de2caf28SDavid du Colombier 	fprintf(fd_tc, "	switch (t) {\n");
1426*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, nrRdy+1, R5); /* +1 for np_ */
1427*de2caf28SDavid du Colombier 	fprintf(fd_tc, "	default: Uerror(\"bad proctype\");\n");
1428*de2caf28SDavid du Colombier 	fprintf(fd_tc, "	}\n	return j;\n}\n\n");
142900d97012SDavid du Colombier 
1430*de2caf28SDavid du Colombier 	fprintf(fd_tc, "int\nwhat_q_size(int t)\n{\tint j;\n");
1431*de2caf28SDavid du Colombier 	fprintf(fd_tc, "	switch (t) {\n");
1432*de2caf28SDavid du Colombier 	for (j = 0; j < nrqs+1; j++)
1433*de2caf28SDavid du Colombier 	{	fprintf(fd_tc, "	case %d: j = sizeof(Q%d); break;\n", j, j);
143400d97012SDavid du Colombier 	}
1435*de2caf28SDavid du Colombier 	fprintf(fd_tc, "	default: Uerror(\"bad qtype\");\n");
1436*de2caf28SDavid du Colombier 	fprintf(fd_tc, "	}\n	return j;\n}\n");
1437*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#endif\n\n");
143800d97012SDavid du Colombier 
1439219b2ee8SDavid du Colombier 	if (has_random)
1440*de2caf28SDavid du Colombier 	{	fprintf(fd_th, "int Q_has(int");
14417dd7cddfSDavid du Colombier 		for (j = 0; j < Mpars; j++)
1442*de2caf28SDavid du Colombier 			fprintf(fd_th, ", int, int");
1443*de2caf28SDavid du Colombier 		fprintf(fd_th, ");\n");
14447dd7cddfSDavid du Colombier 
1445*de2caf28SDavid du Colombier 		fprintf(fd_tc, "int\nQ_has(int into");
1446219b2ee8SDavid du Colombier 		for (j = 0; j < Mpars; j++)
1447*de2caf28SDavid du Colombier 			fprintf(fd_tc, ", int want%d, int fld%d", j, j);
1448*de2caf28SDavid du Colombier 		fprintf(fd_tc, ")\n");
1449*de2caf28SDavid du Colombier 		fprintf(fd_tc, "{	int i;\n\n");
1450*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	if (!into--)\n");
1451*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	uerror(\"ref to unknown chan ");
1452*de2caf28SDavid du Colombier 		fprintf(fd_tc, "(recv-poll)\");\n\n");
1453*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	if (into >= now._nr_qs || into < 0)\n");
1454*de2caf28SDavid du Colombier 		fprintf(fd_tc, "		Uerror(\"qrecv bad queue#\");\n\n");
1455*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	for (i = 0; i < ((Q0 *)qptr(into))->Qlen;");
1456*de2caf28SDavid du Colombier 		fprintf(fd_tc, " i++)\n");
1457*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	{\n");
1458219b2ee8SDavid du Colombier 		for (j = 0; j < Mpars; j++)
1459*de2caf28SDavid du Colombier 		{	fprintf(fd_tc, "		if (want%d && ", j);
1460*de2caf28SDavid du Colombier 			fprintf(fd_tc, "qrecv(into+1, i, %d, 0) != fld%d)\n",
14617dd7cddfSDavid du Colombier 				j, j);
1462*de2caf28SDavid du Colombier 			fprintf(fd_tc, "			continue;\n");
1463219b2ee8SDavid du Colombier 		}
1464*de2caf28SDavid du Colombier 		fprintf(fd_tc, "		return i+1;\n");
1465*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	}\n");
1466*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	return 0;\n");
1467*de2caf28SDavid du Colombier 		fprintf(fd_tc, "}\n");
1468219b2ee8SDavid du Colombier 	}
1469219b2ee8SDavid du Colombier 
1470*de2caf28SDavid du Colombier 	fprintf(fd_tc, "#if NQS>0\n");
1471*de2caf28SDavid du Colombier 	fprintf(fd_tc, "void\nqsend(int into, int sorted");
1472219b2ee8SDavid du Colombier 	for (j = 0; j < Mpars; j++)
1473*de2caf28SDavid du Colombier 		fprintf(fd_tc, ", int fld%d", j);
1474*de2caf28SDavid du Colombier 	fprintf(fd_tc, ", int args_given)\n");
1475*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addq11);
1476219b2ee8SDavid du Colombier 
1477219b2ee8SDavid du Colombier 	for (q = qtab; q; q = q->nxt)
1478219b2ee8SDavid du Colombier 	{	sprintf(buf0, "((Q%d *)z)->", q->qid);
1479*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\tcase %d:%s\n", q->qid,
14807dd7cddfSDavid du Colombier 			(q->nslots)?"":" /* =rv= */");
1481219b2ee8SDavid du Colombier 		if (q->nslots == 0)	/* reset handshake point */
1482*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t(trpt+2)->o_m = 0;\n");
1483219b2ee8SDavid du Colombier 
1484219b2ee8SDavid du Colombier 		if (has_sorted)
1485*de2caf28SDavid du Colombier 		{	fprintf(fd_tc, "\t\tif (!sorted) goto append%d;\n", q->qid);
1486*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\tfor (j = 0; j < %sQlen; j++)\n", buf0);
1487*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t{\t/* find insertion point */\n");
1488219b2ee8SDavid du Colombier 			sprintf(buf0, "((Q%d *)z)->contents[j].fld", q->qid);
1489219b2ee8SDavid du Colombier 			for (j = 0; j < q->nflds; j++)
1490*de2caf28SDavid du Colombier 			{	fprintf(fd_tc, "\t\t\tif (fld%d > %s%d) continue;\n",
1491219b2ee8SDavid du Colombier 						j, buf0, j);
1492*de2caf28SDavid du Colombier 				fprintf(fd_tc, "\t\t\tif (fld%d < %s%d) ", j, buf0, j);
1493*de2caf28SDavid du Colombier 				fprintf(fd_tc, "goto found%d;\n\n", q->qid);
1494219b2ee8SDavid du Colombier 			}
1495*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t}\n");
1496*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\tfound%d:\n", q->qid);
1497219b2ee8SDavid du Colombier 			sprintf(buf0, "((Q%d *)z)->", q->qid);
1498*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\tfor (k = %sQlen - 1; k >= j; k--)\n", buf0);
1499*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t{\t/* shift up */\n");
1500219b2ee8SDavid du Colombier 			for (j = 0; j < q->nflds; j++)
1501*de2caf28SDavid du Colombier 			{	fprintf(fd_tc, "\t\t\t%scontents[k+1].fld%d = ",
15027dd7cddfSDavid du Colombier 					buf0, j);
1503*de2caf28SDavid du Colombier 				fprintf(fd_tc, "%scontents[k].fld%d;\n",
15047dd7cddfSDavid du Colombier 					buf0, j);
1505219b2ee8SDavid du Colombier 			}
1506*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t}\n");
1507*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\tappend%d:\t/* insert in slot j */\n", q->qid);
1508219b2ee8SDavid du Colombier 		}
1509219b2ee8SDavid du Colombier 
1510*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#ifdef HAS_SORTED\n");
1511*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t(trpt+1)->ipt = j;\n");	/* ipt was bup.oval */
1512*de2caf28SDavid du Colombier 		fprintf(fd_tc, "#endif\n");
1513*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t%sQlen = %sQlen + 1;\n", buf0, buf0);
1514219b2ee8SDavid du Colombier 		sprintf(buf0, "((Q%d *)z)->contents[j].fld", q->qid);
1515219b2ee8SDavid du Colombier 		for (j = 0; j < q->nflds; j++)
1516*de2caf28SDavid du Colombier 		{	fprintf(fd_tc, "\t\t%s%d = fld%d;", buf0, j, j);
1517*de2caf28SDavid du Colombier 			if (q->fld_width[j] == MTYPE)
1518*de2caf28SDavid du Colombier 			{	fprintf(fd_tc, "\t/* mtype %s */",
1519*de2caf28SDavid du Colombier 					q->mtp[j]?q->mtp[j]:"_unnamed_");
1520219b2ee8SDavid du Colombier 			}
1521*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\n");
1522*de2caf28SDavid du Colombier 		}
1523*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\tif (args_given != %d)\n", q->nflds);
1524*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t{	if (args_given > %d)\n", q->nflds);
1525*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t		uerror(\"too many parameters in send stmnt\");\n");
1526*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t	else\n");
1527*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t		uerror(\"too few parameters in send stmnt\");\n");
1528*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t}\n");
1529*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\tbreak;\n");
1530*de2caf28SDavid du Colombier 	}
1531*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addq2);
1532219b2ee8SDavid du Colombier 
1533219b2ee8SDavid du Colombier 	for (q = qtab; q; q = q->nxt)
1534*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\tcase %d: return %d;\n", q->qid, (!q->nslots));
1535219b2ee8SDavid du Colombier 
1536*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addq3);
1537219b2ee8SDavid du Colombier 
1538219b2ee8SDavid du Colombier 	for (q = qtab; q; q = q->nxt)
1539*de2caf28SDavid du Colombier 	fprintf(fd_tc, "\tcase %d: return (q_sz(from) == %d);\n",
1540219b2ee8SDavid du Colombier 			q->qid, max(1, q->nslots));
1541219b2ee8SDavid du Colombier 
1542*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addq4);
1543219b2ee8SDavid du Colombier 	for (q = qtab; q; q = q->nxt)
1544219b2ee8SDavid du Colombier 	{	sprintf(buf0, "((Q%d *)z)->", q->qid);
1545*de2caf28SDavid du Colombier 		fprintf(fd_tc, "	case %d:%s\n\t\t",
1546219b2ee8SDavid du Colombier 			q->qid, (q->nslots)?"":" /* =rv= */");
1547219b2ee8SDavid du Colombier 		if (q->nflds == 1)
1548*de2caf28SDavid du Colombier 		{	fprintf(fd_tc, "if (fld == 0) r = %s", buf0);
1549*de2caf28SDavid du Colombier 			fprintf(fd_tc, "contents[slot].fld0;\n");
1550219b2ee8SDavid du Colombier 		} else
1551*de2caf28SDavid du Colombier 		{	fprintf(fd_tc, "switch (fld) {\n");
1552*de2caf28SDavid du Colombier 			ncases(fd_tc, q->qid, 0, q->nflds, R12);
1553*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\tdefault: Uerror");
1554*de2caf28SDavid du Colombier 			fprintf(fd_tc, "(\"too many fields in recv\");\n");
1555*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t}\n");
1556219b2ee8SDavid du Colombier 		}
1557*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\tif (done)\n");
1558312a1df1SDavid du Colombier 		if (q->nslots == 0)
1559*de2caf28SDavid du Colombier 		{	fprintf(fd_tc, "\t\t{	j = %sQlen - 1;\n",  buf0);
1560*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t	%sQlen = 0;\n", buf0);
1561312a1df1SDavid du Colombier 			sprintf(buf0, "\t\t\t((Q%d *)z)->contents", q->qid);
1562312a1df1SDavid du Colombier 		} else
1563*de2caf28SDavid du Colombier 	 	{	fprintf(fd_tc, "\t\t{	j = %sQlen;\n",  buf0);
1564*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t	%sQlen = --j;\n", buf0);
1565*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t	for (k=slot; k<j; k++)\n");
1566*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t	{\n");
1567219b2ee8SDavid du Colombier 			sprintf(buf0, "\t\t\t((Q%d *)z)->contents", q->qid);
1568219b2ee8SDavid du Colombier 			for (j = 0; j < q->nflds; j++)
1569*de2caf28SDavid du Colombier 			{	fprintf(fd_tc, "\t%s[k].fld%d = \n", buf0, j);
1570*de2caf28SDavid du Colombier 				fprintf(fd_tc, "\t\t%s[k+1].fld%d;\n", buf0, j);
1571219b2ee8SDavid du Colombier 			}
1572*de2caf28SDavid du Colombier 			fprintf(fd_tc, "\t\t	}\n");
1573312a1df1SDavid du Colombier 	 	}
1574312a1df1SDavid du Colombier 
1575219b2ee8SDavid du Colombier 		for (j = 0; j < q->nflds; j++)
1576*de2caf28SDavid du Colombier 			fprintf(fd_tc, "%s[j].fld%d = 0;\n", buf0, j);
1577*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t\tif (fld+1 != %d)\n\t\t\t", q->nflds);
1578*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\tuerror(\"missing pars in receive\");\n");
1579219b2ee8SDavid du Colombier 		/* incompletely received msgs cannot be unrecv'ed */
1580*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\t}\n");
1581*de2caf28SDavid du Colombier 		fprintf(fd_tc, "\t\tbreak;\n");
1582219b2ee8SDavid du Colombier 	}
1583*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, Addq5);
15847dd7cddfSDavid du Colombier 	for (q = qtab; q; q = q->nxt)
1585*de2caf28SDavid du Colombier 	fprintf(fd_tc, "	case %d: j = sizeof(Q%d); break;\n",
15867dd7cddfSDavid du Colombier 		q->qid, q->qid);
1587*de2caf28SDavid du Colombier 	ntimes(fd_tc, 0, 1, R8b);
1588*de2caf28SDavid du Colombier 	ntimes(fd_th, 0, 1, Proto);	/* function prototypes */
15897dd7cddfSDavid du Colombier 
1590*de2caf28SDavid du Colombier 	fprintf(fd_th, "void qsend(int, int");
1591219b2ee8SDavid du Colombier 	for (j = 0; j < Mpars; j++)
1592*de2caf28SDavid du Colombier 		fprintf(fd_th, ", int");
1593*de2caf28SDavid du Colombier 	fprintf(fd_th, ", int);\n\n");
1594219b2ee8SDavid du Colombier 
1595*de2caf28SDavid du Colombier 	fprintf(fd_th, "#define Addproc(x,y)	addproc(256, y, x");
159600d97012SDavid du Colombier 	/* 256 is param outside the range of valid pids */
1597219b2ee8SDavid du Colombier 	for (j = 0; j < Npars; j++)
1598*de2caf28SDavid du Colombier 		fprintf(fd_th, ", 0");
1599*de2caf28SDavid du Colombier 	fprintf(fd_th, ")\n");
1600219b2ee8SDavid du Colombier }
1601