xref: /plan9-contrib/sys/src/cmd/spin/pangen3.h (revision de2caf28f9ba1a56e70be94a699435d36eb50311)
1219b2ee8SDavid du Colombier /***** spin: pangen3.h *****/
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 
9*de2caf28SDavid du Colombier static const char *Head0[] = {
10312a1df1SDavid du Colombier 	"#if defined(BFS) && defined(REACH)",
11312a1df1SDavid du Colombier 	"	#undef REACH",	/* redundant with bfs */
12312a1df1SDavid du Colombier 	"#endif",
13219b2ee8SDavid du Colombier 	"#ifdef VERI",
14219b2ee8SDavid du Colombier 	"	#define BASE	1",
15219b2ee8SDavid du Colombier 	"#else",
16219b2ee8SDavid du Colombier 	"	#define BASE	0",
17219b2ee8SDavid du Colombier 	"#endif",
187dd7cddfSDavid du Colombier 	"typedef struct Trans {",
197dd7cddfSDavid du Colombier 	"	short atom;	/* if &2 = atomic trans; if &8 local */",
207dd7cddfSDavid du Colombier 	"#ifdef HAS_UNLESS",
217dd7cddfSDavid du Colombier 	"	short escp[HAS_UNLESS];	/* lists the escape states */",
227dd7cddfSDavid du Colombier 	"	short e_trans;	/* if set, this is an escp-trans */",
237dd7cddfSDavid du Colombier 	"#endif",
247dd7cddfSDavid du Colombier 	"	short tpe[2];	/* class of operation (for reduction) */",
257dd7cddfSDavid du Colombier 	"	short qu[6];	/* for conditional selections: qid's  */",
267dd7cddfSDavid du Colombier 	"	uchar ty[6];	/* ditto: type's */",
277dd7cddfSDavid du Colombier 	"#ifdef NIBIS",
287dd7cddfSDavid du Colombier 	"	short om;	/* completion status of preselects */",
297dd7cddfSDavid du Colombier 	"#endif",
307dd7cddfSDavid du Colombier 	"	char *tp;	/* src txt of statement */",
31312a1df1SDavid du Colombier 	"	int st;		/* the nextstate */",
327dd7cddfSDavid du Colombier 	"	int t_id;	/* transition id, unique within proc */",
337dd7cddfSDavid du Colombier 	"	int forw;	/* index forward transition */",
347dd7cddfSDavid du Colombier 	"	int back;	/* index return  transition */",
357dd7cddfSDavid du Colombier 	"	struct Trans *nxt;",
367dd7cddfSDavid du Colombier 	"} Trans;\n",
3700d97012SDavid du Colombier 
3800d97012SDavid du Colombier 	"#ifdef TRIX",
3900d97012SDavid du Colombier 	"	#define qptr(x)	(channels[x]->body)",
4000d97012SDavid du Colombier 	"	#define pptr(x)	(processes[x]->body)",
4100d97012SDavid du Colombier 	"#else",
42f3793cddSDavid du Colombier 	"	#define qptr(x)	(((uchar *)&now)+(int)q_offset[x])",
43f3793cddSDavid du Colombier 	"	#define pptr(x)	(((uchar *)&now)+(int)proc_offset[x])",
447dd7cddfSDavid du Colombier /*	"	#define Pptr(x)	((proc_offset[x])?pptr(x):noptr)",	*/
4500d97012SDavid du Colombier 	"#endif",
467dd7cddfSDavid du Colombier 	"extern uchar *Pptr(int);",
4700d97012SDavid du Colombier 	"extern uchar *Qptr(int);",
487dd7cddfSDavid du Colombier 
4900d97012SDavid du Colombier 	"#define q_sz(x)	(((Q0 *)qptr(x))->Qlen)",
5000d97012SDavid du Colombier 	"",
5100d97012SDavid du Colombier 	"#ifdef TRIX",
5200d97012SDavid du Colombier 	"	#ifdef VECTORSZ",
5300d97012SDavid du Colombier 	"		#undef VECTORSZ",	/* backward compatibility */
5400d97012SDavid du Colombier 	"	#endif",
5500d97012SDavid du Colombier 	"	#if WS==4",
5600d97012SDavid du Colombier 	"		#define VECTORSZ	2056	/* ((MAXPROC+MAXQ+4)*sizeof(uchar *)) */",
5700d97012SDavid du Colombier 	"	#else",
5800d97012SDavid du Colombier 	"		#define VECTORSZ	4112	/* the formula causes probs in preprocessing */",
5900d97012SDavid du Colombier 	"	#endif",
6000d97012SDavid du Colombier 	"#else",
617dd7cddfSDavid du Colombier 	"	#ifndef VECTORSZ",
627dd7cddfSDavid du Colombier 	"		#define VECTORSZ	1024	/* sv size in bytes */",
6300d97012SDavid du Colombier 	"	#endif",
647dd7cddfSDavid du Colombier 	"#endif\n",
65*de2caf28SDavid du Colombier 	"#define MAXQ   	255",
66*de2caf28SDavid du Colombier 	"#define MAXPROC	255",
67*de2caf28SDavid du Colombier 	"",
687dd7cddfSDavid du Colombier 	0,
697dd7cddfSDavid du Colombier };
707dd7cddfSDavid du Colombier 
71*de2caf28SDavid du Colombier static const char *Header[] = {
72219b2ee8SDavid du Colombier 	"#ifdef VERBOSE",
73312a1df1SDavid du Colombier 	"	#ifndef CHECK",
74219b2ee8SDavid du Colombier 	"		#define CHECK",
75312a1df1SDavid du Colombier 	"	#endif",
76312a1df1SDavid du Colombier 	"	#ifndef DEBUG",
77219b2ee8SDavid du Colombier 	"		#define DEBUG",
78219b2ee8SDavid du Colombier 	"	#endif",
79312a1df1SDavid du Colombier 	"#endif",
807dd7cddfSDavid du Colombier 	"#ifdef SAFETY",
817dd7cddfSDavid du Colombier 	"	#ifndef NOFAIR",
827dd7cddfSDavid du Colombier 	"		#define NOFAIR",
83219b2ee8SDavid du Colombier 	"	#endif",
847dd7cddfSDavid du Colombier 	"#endif",
85*de2caf28SDavid du Colombier #if 0
86*de2caf28SDavid du Colombier                  NOREDUCE BITSTATE SAFETY  MA   WS>4
87*de2caf28SDavid du Colombier      CNTRSTACK:     -        +       +     d     -
88*de2caf28SDavid du Colombier      FULLSTACK:     +        d       -     -     d
89*de2caf28SDavid du Colombier                     -        +       d     d     d
90*de2caf28SDavid du Colombier                     -        +       +     d     +
91*de2caf28SDavid du Colombier                     -        -       d     d     d
92*de2caf28SDavid du Colombier      Neither:       +        d       +     d     d
93*de2caf28SDavid du Colombier                     +        d       d     +     d
94*de2caf28SDavid du Colombier #endif
957dd7cddfSDavid du Colombier 	"#ifdef NOREDUCE",
96312a1df1SDavid du Colombier 	"	#ifndef XUSAFE",
977dd7cddfSDavid du Colombier 	"		#define XUSAFE",
98312a1df1SDavid du Colombier 	"	#endif",
997dd7cddfSDavid du Colombier 	"	#if !defined(SAFETY) && !defined(MA)",
100*de2caf28SDavid du Colombier 	"		#define FULLSTACK",		/* => NOREDUCE && !SAFETY && !MA */
1017dd7cddfSDavid du Colombier 	"	#endif",
1027dd7cddfSDavid du Colombier 	"#else",
103219b2ee8SDavid du Colombier 	"	#ifdef BITSTATE",
104*de2caf28SDavid du Colombier 	"		#if defined(SAFETY) && WS<=4",
105*de2caf28SDavid du Colombier 	"			#define CNTRSTACK",	/* => !NOREDUCE && BITSTATE && SAFETY && WS<=4 */
106219b2ee8SDavid du Colombier 	"		#else",
107*de2caf28SDavid du Colombier 	"			#define FULLSTACK",	/* => !NOREDUCE && BITSTATE && (!SAFETY || WS>4) */
108219b2ee8SDavid du Colombier 	"		#endif",
1097dd7cddfSDavid du Colombier 	"	#else",
110*de2caf28SDavid du Colombier 	"		#define FULLSTACK",		/* => !NOREDUCE && !BITSTATE */
1117dd7cddfSDavid du Colombier 	"	#endif",
112219b2ee8SDavid du Colombier 	"#endif",
113219b2ee8SDavid du Colombier 	"#ifdef BITSTATE",
114312a1df1SDavid du Colombier 	"	#ifndef NOCOMP",
115219b2ee8SDavid du Colombier 	"		#define NOCOMP",
116312a1df1SDavid du Colombier 	"	#endif",
1177dd7cddfSDavid du Colombier 	"	#if !defined(LC) && defined(SC)",
1187dd7cddfSDavid du Colombier 	"		#define LC",
1197dd7cddfSDavid du Colombier 	"	#endif",
120219b2ee8SDavid du Colombier 	"#endif",
1217dd7cddfSDavid du Colombier 	"#if defined(COLLAPSE2) || defined(COLLAPSE3) || defined(COLLAPSE4)",
1227dd7cddfSDavid du Colombier 	"	/* accept the above for backward compatibility */",
1237dd7cddfSDavid du Colombier 	"	#define COLLAPSE",
1247dd7cddfSDavid du Colombier 	"#endif",
1257dd7cddfSDavid du Colombier 	"#ifdef HC",
126312a1df1SDavid du Colombier 	"	#undef HC",
127312a1df1SDavid du Colombier 	"	#define HC4",
1287dd7cddfSDavid du Colombier 	"#endif",
129*de2caf28SDavid du Colombier 	"#if defined(HC0) || defined(HC1) || defined(HC2) || defined(HC3) || defined(HC4)",
130*de2caf28SDavid du Colombier 	"	#define HC	4",	/* 2x32 bits */
131*de2caf28SDavid du Colombier 	"#endif",	/* really only one hashcompact mode, not 5 */
13200d97012SDavid du Colombier 	"",
13300d97012SDavid du Colombier 	"typedef struct _Stack  {	 /* for queues and processes */",
1347dd7cddfSDavid du Colombier 	"#if VECTORSZ>32000",
1357dd7cddfSDavid du Colombier 	"	int o_delta;",
13600d97012SDavid du Colombier 	"	#ifndef TRIX",
1377dd7cddfSDavid du Colombier 	"		int o_offset;",
1387dd7cddfSDavid du Colombier 	"		int o_skip;",
13900d97012SDavid du Colombier 	"	#endif",
1407dd7cddfSDavid du Colombier 	"	int o_delqs;",
1417dd7cddfSDavid du Colombier 	"#else",
142219b2ee8SDavid du Colombier 	"	short o_delta;",
14300d97012SDavid du Colombier 	"	#ifndef TRIX",
144219b2ee8SDavid du Colombier 	"		short o_offset;",
145219b2ee8SDavid du Colombier 	"		short o_skip;",
14600d97012SDavid du Colombier 	"	#endif",
147219b2ee8SDavid du Colombier 	"	short o_delqs;",
1487dd7cddfSDavid du Colombier 	"#endif",
1497dd7cddfSDavid du Colombier 	"	short o_boq;",
15000d97012SDavid du Colombier 	"#ifdef TRIX",
15100d97012SDavid du Colombier 	"	short parent;",
15200d97012SDavid du Colombier 	"	char *b_ptr;",	/* used in delq/q_restor and delproc/p_restor */
15300d97012SDavid du Colombier 	"#else",
15400d97012SDavid du Colombier 	"	char *body;",	/* full copy of state vector in non-trix mode */
15500d97012SDavid du Colombier 	"#endif",
156219b2ee8SDavid du Colombier 	"#ifndef XUSAFE",
157219b2ee8SDavid du Colombier 	"	char *o_name;",
158219b2ee8SDavid du Colombier 	"#endif",
15900d97012SDavid du Colombier 	"	struct _Stack *nxt;",
16000d97012SDavid du Colombier 	"	struct _Stack *lst;",
16100d97012SDavid du Colombier 	"} _Stack;\n",
162219b2ee8SDavid du Colombier 	"typedef struct Svtack { /* for complete state vector */",
1637dd7cddfSDavid du Colombier 	"#if VECTORSZ>32000",
1647dd7cddfSDavid du Colombier 	"	int o_delta;",
1657dd7cddfSDavid du Colombier 	"	int m_delta;",
1667dd7cddfSDavid du Colombier 	"#else",
167219b2ee8SDavid du Colombier 	"	short o_delta;	 /* current size of frame */",
168219b2ee8SDavid du Colombier 	"	short m_delta;	 /* maximum size of frame */",
1697dd7cddfSDavid du Colombier 	"#endif",
170219b2ee8SDavid du Colombier 	"#if SYNC",
171219b2ee8SDavid du Colombier 	"	short o_boq;",
172219b2ee8SDavid du Colombier 	"#endif",
173312a1df1SDavid du Colombier 	0,
174312a1df1SDavid du Colombier };
175312a1df1SDavid du Colombier 
176*de2caf28SDavid du Colombier static const char *Header0[] = {
177219b2ee8SDavid du Colombier 	"	char *body;",
178219b2ee8SDavid du Colombier 	"	struct Svtack *nxt;",
179219b2ee8SDavid du Colombier 	"	struct Svtack *lst;",
180219b2ee8SDavid du Colombier 	"} Svtack;\n",
1817dd7cddfSDavid du Colombier 	0,
1827dd7cddfSDavid du Colombier };
1837dd7cddfSDavid du Colombier 
184*de2caf28SDavid du Colombier static const char *Head1[] = {
185219b2ee8SDavid du Colombier 	"typedef struct State {",
186219b2ee8SDavid du Colombier 	"	uchar _nr_pr;",
187219b2ee8SDavid du Colombier 	"	uchar _nr_qs;",
188219b2ee8SDavid du Colombier 	"	uchar   _a_t;	/* cycle detection */",
1897dd7cddfSDavid du Colombier #if 0
1907dd7cddfSDavid du Colombier 	in _a_t: bits 0,4, and 5 =(1|16|32) are set during a 2nd dfs
1917dd7cddfSDavid du Colombier 	bit 1 is used as the A-bit for fairness
1927dd7cddfSDavid du Colombier 	bit 7 (128) is the proviso bit, for reduced 2nd dfs (acceptance)
1937dd7cddfSDavid du Colombier #endif
1947dd7cddfSDavid du Colombier 	"#ifndef NOFAIR",
195219b2ee8SDavid du Colombier 	"	uchar   _cnt[NFAIR];	/* counters, weak fairness */",
1967dd7cddfSDavid du Colombier 	"#endif",
1977dd7cddfSDavid du Colombier 
1987dd7cddfSDavid du Colombier 	"#ifndef NOVSZ",
1997dd7cddfSDavid du Colombier #ifdef SOLARIS
2007dd7cddfSDavid du Colombier 		"#if 0",
2017dd7cddfSDavid du Colombier 		/* v3.4
2027dd7cddfSDavid du Colombier 		 * noticed alignment problems with some Solaris
2037dd7cddfSDavid du Colombier 		 * compilers, if widest field isn't wordsized
2047dd7cddfSDavid du Colombier 		 */
2057dd7cddfSDavid du Colombier #else
2067dd7cddfSDavid du Colombier 		"#if VECTORSZ<65536",
2077dd7cddfSDavid du Colombier #endif
2087dd7cddfSDavid du Colombier 		"	unsigned short _vsz;",
2097dd7cddfSDavid du Colombier 		"#else",
210*de2caf28SDavid du Colombier 		"	ulong  _vsz;",
2117dd7cddfSDavid du Colombier 		"#endif",
2127dd7cddfSDavid du Colombier 	"#endif",
2137dd7cddfSDavid du Colombier 
214*de2caf28SDavid du Colombier 	"#ifdef HAS_LAST",	/* cannot go before _cnt - see h_store() */
2157dd7cddfSDavid du Colombier 	"	uchar  _last;	/* pid executed in last step */",
2167dd7cddfSDavid du Colombier 	"#endif",
21700d97012SDavid du Colombier 
21800d97012SDavid du Colombier 	"#if defined(BITSTATE) && defined(BCS) && defined(STORE_CTX)",
21900d97012SDavid du Colombier 	"	uchar  _ctx;	/* nr of context switches so far */",
22000d97012SDavid du Colombier 	"#endif",
221*de2caf28SDavid du Colombier 	"#if defined(BFS_PAR) && defined(L_BOUND)",
222*de2caf28SDavid du Colombier 	"	uchar  _l_bnd;	/* bounded liveness */",
223*de2caf28SDavid du Colombier 	"	uchar *_l_sds;	/* seed state */",
224*de2caf28SDavid du Colombier 	"#endif",
2257dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
2267dd7cddfSDavid du Colombier 	"	#if nstates_event<256",
2277dd7cddfSDavid du Colombier 	"		uchar _event;",
2287dd7cddfSDavid du Colombier 	"	#else",
2297dd7cddfSDavid du Colombier 	"		unsigned short _event;",
2307dd7cddfSDavid du Colombier 	"	#endif",
231219b2ee8SDavid du Colombier 	"#endif",
232219b2ee8SDavid du Colombier 	0,
233219b2ee8SDavid du Colombier };
234219b2ee8SDavid du Colombier 
235*de2caf28SDavid du Colombier static const char *Addp0[] = {
236219b2ee8SDavid du Colombier 	/* addproc(....parlist... */ ")",
237*de2caf28SDavid du Colombier 	"{	int j = 0, h = now._nr_pr;",
238312a1df1SDavid du Colombier 	"#ifndef NOCOMP",
239312a1df1SDavid du Colombier 	"	int k;",
240312a1df1SDavid du Colombier 	"#endif",
241*de2caf28SDavid du Colombier 	"	uchar *o_this = _this;\n",
242219b2ee8SDavid du Colombier 	"#ifndef INLINE",
243219b2ee8SDavid du Colombier 	"	if (TstOnly) return (h < MAXPROC);",
244219b2ee8SDavid du Colombier 	"#endif",
2457dd7cddfSDavid du Colombier 	"#ifndef NOBOUNDCHECK",
2467dd7cddfSDavid du Colombier 	"	/* redefine Index only within this procedure */",
2477dd7cddfSDavid du Colombier 	"	#undef Index",
2487dd7cddfSDavid du Colombier 	"	#define Index(x, y)	Boundcheck(x, y, 0, 0, 0)",
2497dd7cddfSDavid du Colombier 	"#endif",
250219b2ee8SDavid du Colombier 	"	if (h >= MAXPROC)",
251219b2ee8SDavid du Colombier 	"		Uerror(\"too many processes\");",
25200d97012SDavid du Colombier 	"#ifdef V_TRIX",
25300d97012SDavid du Colombier 	"	printf(\"%%4d: add process %%d\\n\", depth, h);",
25400d97012SDavid du Colombier 	"#endif",
255219b2ee8SDavid du Colombier 	"	switch (n) {",
256219b2ee8SDavid du Colombier 	"	case 0: j = sizeof(P0); break;",
257219b2ee8SDavid du Colombier 	0,
258219b2ee8SDavid du Colombier };
259219b2ee8SDavid du Colombier 
260*de2caf28SDavid du Colombier static const char *Addp1[] = {
261219b2ee8SDavid du Colombier 	"	default: Uerror(\"bad proc - addproc\");",
262219b2ee8SDavid du Colombier 	"	}",
263*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
264*de2caf28SDavid du Colombier 	"		bfs_prepmask(1);	/* addproc */",
265*de2caf28SDavid du Colombier 	"	#endif",
26600d97012SDavid du Colombier 
26700d97012SDavid du Colombier 	"#ifdef TRIX",
268*de2caf28SDavid du Colombier 	"	vsize += sizeof(H_el *);",
26900d97012SDavid du Colombier 	"#else",
2707dd7cddfSDavid du Colombier 	"	if (vsize%%WS)",
271219b2ee8SDavid du Colombier 	"		proc_skip[h] = WS-(vsize%%WS);",
272219b2ee8SDavid du Colombier 	"	else",
273219b2ee8SDavid du Colombier 	"		proc_skip[h] = 0;",
274*de2caf28SDavid du Colombier 	"	#if !defined(NOCOMP) && !defined(HC)",
275f3793cddSDavid du Colombier 	"		for (k = vsize + (int) proc_skip[h]; k > vsize; k--)",
2767dd7cddfSDavid du Colombier 	"			Mask[k-1] = 1; /* align */",
277219b2ee8SDavid du Colombier 	"	#endif",
278f3793cddSDavid du Colombier 	"	vsize += (int) proc_skip[h];",
279219b2ee8SDavid du Colombier 	"	proc_offset[h] = vsize;",
28000d97012SDavid du Colombier 	"	vsize += j;",
28100d97012SDavid du Colombier 	"	#if defined(SVDUMP) && defined(VERBOSE)",
2827dd7cddfSDavid du Colombier 	"	if (vprefix > 0)",
2837dd7cddfSDavid du Colombier 	"	{	int dummy = 0;",
2847dd7cddfSDavid du Colombier 	"		write(svfd, (uchar *) &dummy, sizeof(int)); /* mark */",
2857dd7cddfSDavid du Colombier 	"		write(svfd, (uchar *) &h, sizeof(int));",
2867dd7cddfSDavid du Colombier 	"		write(svfd, (uchar *) &n, sizeof(int));",
287f3793cddSDavid du Colombier 	"	#if VECTORSZ>32000",
2887dd7cddfSDavid du Colombier 	"		write(svfd, (uchar *) &proc_offset[h], sizeof(int));",
28900d97012SDavid du Colombier 	"		write(svfd, (uchar *) &now, vprefix-4*sizeof(int)); /* padd */",
290f3793cddSDavid du Colombier 	"	#else",
291f3793cddSDavid du Colombier 	"		write(svfd, (uchar *) &proc_offset[h], sizeof(short));",
29200d97012SDavid du Colombier 	"		write(svfd, (uchar *) &now, vprefix-3*sizeof(int)-sizeof(short)); /* padd */",
293f3793cddSDavid du Colombier 	"	#endif",
2947dd7cddfSDavid du Colombier 	"	}",
2957dd7cddfSDavid du Colombier 	"	#endif",
29600d97012SDavid du Colombier 	"#endif",
29700d97012SDavid du Colombier 
298219b2ee8SDavid du Colombier 	"	now._nr_pr += 1;",
29900d97012SDavid du Colombier 	"#if defined(BCS) && defined(CONSERVATIVE)",
30000d97012SDavid du Colombier 	"	if (now._nr_pr >= CONSERVATIVE*8)",
30100d97012SDavid du Colombier 	"	{	printf(\"pan: error: too many processes -- recompile with \");",
30200d97012SDavid du Colombier 	"		printf(\"-DCONSERVATIVE=%%d\\n\", CONSERVATIVE+1);",
30300d97012SDavid du Colombier 	"		pan_exit(1);",
30400d97012SDavid du Colombier 	"	}",
30500d97012SDavid du Colombier 	"#endif",
3067dd7cddfSDavid du Colombier 	"	if (fairness && ((int) now._nr_pr + 1 >= (8*NFAIR)/2))",
307312a1df1SDavid du Colombier 	"	{	printf(\"pan: error: too many processes -- current\");",
3087dd7cddfSDavid du Colombier 	"		printf(\" max is %%d procs (-DNFAIR=%%d)\\n\",",
3097dd7cddfSDavid du Colombier 	"			(8*NFAIR)/2 - 2, NFAIR);",
3107dd7cddfSDavid du Colombier 	"		printf(\"\\trecompile with -DNFAIR=%%d\\n\",",
3117dd7cddfSDavid du Colombier 	"			NFAIR+1);",
312312a1df1SDavid du Colombier 	"		pan_exit(1);",
313219b2ee8SDavid du Colombier 	"	}",
3147dd7cddfSDavid du Colombier 	"#ifndef NOVSZ",
3157dd7cddfSDavid du Colombier 	"	now._vsz = vsize;",
3167dd7cddfSDavid du Colombier 	"#endif",
31700d97012SDavid du Colombier 	"	hmax = max(hmax, vsize);",
31800d97012SDavid du Colombier 
31900d97012SDavid du Colombier 	"#ifdef TRIX",
32000d97012SDavid du Colombier 	"	#ifndef BFS",
32100d97012SDavid du Colombier 	"		if (freebodies)",
32200d97012SDavid du Colombier 	"		{	processes[h] = freebodies;",
32300d97012SDavid du Colombier 	"			freebodies = freebodies->nxt;",
32400d97012SDavid du Colombier 	"		} else",
32500d97012SDavid du Colombier 	"		{	processes[h] = (TRIX_v6 *) emalloc(sizeof(TRIX_v6));",
32600d97012SDavid du Colombier 	"			processes[h]->body = (uchar *) emalloc(Maxbody * sizeof(char));",
32700d97012SDavid du Colombier 	"		}",
32800d97012SDavid du Colombier 	"		processes[h]->modified = 1;	/* addproc */",
32900d97012SDavid du Colombier 	"	#endif",
33000d97012SDavid du Colombier 	"	processes[h]->psize = j;",
33100d97012SDavid du Colombier 	"	processes[h]->parent_pid = calling_pid;",
33200d97012SDavid du Colombier 	"	processes[h]->nxt = (TRIX_v6 *) 0;",
33300d97012SDavid du Colombier 	"#else",
334*de2caf28SDavid du Colombier 	"	#if !defined(NOCOMP) && !defined(HC)",
335219b2ee8SDavid du Colombier 	"		for (k = 1; k <= Air[n]; k++)",
3367dd7cddfSDavid du Colombier 	"			Mask[vsize - k] = 1; /* pad */",
337219b2ee8SDavid du Colombier 	"		Mask[vsize-j] = 1; /* _pid */",
338219b2ee8SDavid du Colombier 	"	#endif",
339*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
340*de2caf28SDavid du Colombier 	"		bfs_fixmask(1);	/* addproc */",
341*de2caf28SDavid du Colombier 	"	#endif",
342219b2ee8SDavid du Colombier 	"	if (vsize >= VECTORSZ)",
3437dd7cddfSDavid du Colombier 	"	{	printf(\"pan: error, VECTORSZ too small, recompile pan.c\");",
34400d97012SDavid du Colombier 	"		printf(\" with -DVECTORSZ=N with N>%%d\\n\", (int) vsize);",
3457dd7cddfSDavid du Colombier 	"		Uerror(\"aborting\");",
3467dd7cddfSDavid du Colombier 	"	}",
34700d97012SDavid du Colombier 	"#endif",
34800d97012SDavid du Colombier 
349219b2ee8SDavid du Colombier 	"	memset((char *)pptr(h), 0, j);",
350*de2caf28SDavid du Colombier 	"	_this = pptr(h);",
351219b2ee8SDavid du Colombier 	"	if (BASE > 0 && h > 0)",
352*de2caf28SDavid du Colombier 	"	{	((P0 *)_this)->_pid = h-BASE;",
353*de2caf28SDavid du Colombier 	"	} else",
354*de2caf28SDavid du Colombier 	"	{	((P0 *)_this)->_pid = h;",
355*de2caf28SDavid du Colombier 	"	}",
356219b2ee8SDavid du Colombier 	"	switch (n) {",
357219b2ee8SDavid du Colombier 	0,
358219b2ee8SDavid du Colombier };
359219b2ee8SDavid du Colombier 
360*de2caf28SDavid du Colombier static const char *Addq0[] = {
361*de2caf28SDavid du Colombier 	"",
362219b2ee8SDavid du Colombier 	"int",
36300d97012SDavid du Colombier 	"addqueue(int calling_pid, int n, int is_rv)",
364312a1df1SDavid du Colombier 	"{	int j=0, i = now._nr_qs;",
36500d97012SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(TRIX)",
366312a1df1SDavid du Colombier 	"	int k;",
367312a1df1SDavid du Colombier 	"#endif",
368219b2ee8SDavid du Colombier 	"	if (i >= MAXQ)",
369219b2ee8SDavid du Colombier 	"		Uerror(\"too many queues\");",
37000d97012SDavid du Colombier 	"#ifdef V_TRIX",
37100d97012SDavid du Colombier 	"	printf(\"%%4d: add queue %%d\\n\", depth, i);",
37200d97012SDavid du Colombier 	"#endif",
373219b2ee8SDavid du Colombier 	"	switch (n) {",
374219b2ee8SDavid du Colombier 	0,
375219b2ee8SDavid du Colombier };
376219b2ee8SDavid du Colombier 
377*de2caf28SDavid du Colombier static const char *Addq1[] = {
378219b2ee8SDavid du Colombier 	"	default: Uerror(\"bad queue - addqueue\");",
379219b2ee8SDavid du Colombier 	"	}",
380*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
381*de2caf28SDavid du Colombier 	"		bfs_prepmask(2);	/* addqueue */",
382*de2caf28SDavid du Colombier 	"	#endif",
38300d97012SDavid du Colombier 
38400d97012SDavid du Colombier 	"#ifdef TRIX",
385*de2caf28SDavid du Colombier 	"	vsize += sizeof(H_el *);",
38600d97012SDavid du Colombier 	"#else",
3877dd7cddfSDavid du Colombier 	"	if (vsize%%WS)",
388219b2ee8SDavid du Colombier 	"		q_skip[i] = WS-(vsize%%WS);",
389219b2ee8SDavid du Colombier 	"	else",
390219b2ee8SDavid du Colombier 	"		q_skip[i] = 0;",
391*de2caf28SDavid du Colombier 	"	#if !defined(NOCOMP) && !defined(HC)",
392312a1df1SDavid du Colombier 	"		k = vsize;",
393312a1df1SDavid du Colombier 	"		#ifndef BFS",
394312a1df1SDavid du Colombier 	"			if (is_rv) k += j;",
395312a1df1SDavid du Colombier 	"		#endif",
396f3793cddSDavid du Colombier 	"		for (k += (int) q_skip[i]; k > vsize; k--)",
397312a1df1SDavid du Colombier 	"			Mask[k-1] = 1;",
398219b2ee8SDavid du Colombier 	"	#endif",
399f3793cddSDavid du Colombier 	"	vsize += (int) q_skip[i];",
400219b2ee8SDavid du Colombier 	"	q_offset[i] = vsize;",
401219b2ee8SDavid du Colombier 	"	vsize += j;",
402*de2caf28SDavid du Colombier 	"	#ifdef BFS_PAR",
403*de2caf28SDavid du Colombier 	"		bfs_fixmask(2);	/* addqueue */",
404*de2caf28SDavid du Colombier 	"	#endif",
40500d97012SDavid du Colombier 	"#endif",
40600d97012SDavid du Colombier 
40700d97012SDavid du Colombier 	"	now._nr_qs += 1;",
4087dd7cddfSDavid du Colombier 	"#ifndef NOVSZ",
4097dd7cddfSDavid du Colombier 	"	now._vsz = vsize;",
4107dd7cddfSDavid du Colombier 	"#endif",
411219b2ee8SDavid du Colombier 	"	hmax = max(hmax, vsize);",
41200d97012SDavid du Colombier 
41300d97012SDavid du Colombier 	"#ifdef TRIX",
41400d97012SDavid du Colombier 	"	#ifndef BFS",
41500d97012SDavid du Colombier 	"		if (freebodies)",
41600d97012SDavid du Colombier 	"		{	channels[i] = freebodies;",
41700d97012SDavid du Colombier 	"			freebodies = freebodies->nxt;",
41800d97012SDavid du Colombier 	"		} else",
41900d97012SDavid du Colombier 	"		{	channels[i] = (TRIX_v6 *) emalloc(sizeof(TRIX_v6));",
42000d97012SDavid du Colombier 	"			channels[i]->body = (uchar *) emalloc(Maxbody * sizeof(char));",
42100d97012SDavid du Colombier 	"		}",
42200d97012SDavid du Colombier 	"		channels[i]->modified = 1;	/* addq */",
42300d97012SDavid du Colombier 	"	#endif",
42400d97012SDavid du Colombier 	"	channels[i]->psize = j;",
42500d97012SDavid du Colombier 	"	channels[i]->parent_pid = calling_pid;",
42600d97012SDavid du Colombier 	"	channels[i]->nxt = (TRIX_v6 *) 0;",
42700d97012SDavid du Colombier 	"#else",
428219b2ee8SDavid du Colombier 	"	if (vsize >= VECTORSZ)",
429219b2ee8SDavid du Colombier 	"		Uerror(\"VECTORSZ is too small, edit pan.h\");",
43000d97012SDavid du Colombier 	"#endif",
43100d97012SDavid du Colombier 
43200d97012SDavid du Colombier 	"	if (j > 0)", /* zero if there are no queues */
43300d97012SDavid du Colombier 	"	{	memset((char *)qptr(i), 0, j);",
43400d97012SDavid du Colombier 	"	}",
435219b2ee8SDavid du Colombier 	"	((Q0 *)qptr(i))->_t = n;",
436219b2ee8SDavid du Colombier 	"	return i+1;",
437219b2ee8SDavid du Colombier 	"}\n",
438219b2ee8SDavid du Colombier 	0,
439219b2ee8SDavid du Colombier };
440219b2ee8SDavid du Colombier 
441*de2caf28SDavid du Colombier static const char *Addq11[] = {
442312a1df1SDavid du Colombier 	"{	int j; uchar *z;\n",
443312a1df1SDavid du Colombier 	"#ifdef HAS_SORTED",
444312a1df1SDavid du Colombier 	"	int k;",
445312a1df1SDavid du Colombier 	"#endif",
446219b2ee8SDavid du Colombier 	"	if (!into--)",
447219b2ee8SDavid du Colombier 	"	uerror(\"ref to uninitialized chan name (sending)\");",
4487dd7cddfSDavid du Colombier 	"	if (into >= (int) now._nr_qs || into < 0)",
449219b2ee8SDavid du Colombier 	"		Uerror(\"qsend bad queue#\");",
45000d97012SDavid du Colombier 	"#if defined(TRIX) && !defined(BFS)",
45100d97012SDavid du Colombier 	"	#ifndef TRIX_ORIG",
45200d97012SDavid du Colombier 	"		(trpt+1)->q_bup = now._ids_[now._nr_pr+into];",
45300d97012SDavid du Colombier 	"		#ifdef V_TRIX",
45400d97012SDavid du Colombier 	"			printf(\"%%4d: channel %%d s save %%p from %%d\\n\",",
45500d97012SDavid du Colombier 	"			depth, into, (trpt+1)->q_bup, now._nr_pr+into);",
45600d97012SDavid du Colombier 	"		#endif",
45700d97012SDavid du Colombier 	"	#endif",
45800d97012SDavid du Colombier 	"	channels[into]->modified = 1;	/* qsend */",
45900d97012SDavid du Colombier 	"	#ifdef V_TRIX",
46000d97012SDavid du Colombier 	"		printf(\"%%4d: channel %%d modified\\n\", depth, into);",
46100d97012SDavid du Colombier 	"	#endif",
46200d97012SDavid du Colombier 	"#endif",
463219b2ee8SDavid du Colombier 	"	z = qptr(into);",
464219b2ee8SDavid du Colombier 	"	j = ((Q0 *)qptr(into))->Qlen;",
465219b2ee8SDavid du Colombier 	"	switch (((Q0 *)qptr(into))->_t) {",
466219b2ee8SDavid du Colombier 	0,
467219b2ee8SDavid du Colombier };
468219b2ee8SDavid du Colombier 
469*de2caf28SDavid du Colombier static const char *Addq2[] = {
470219b2ee8SDavid du Colombier 	"	case 0: printf(\"queue %%d was deleted\\n\", into+1);",
471219b2ee8SDavid du Colombier 	"	default: Uerror(\"bad queue - qsend\");",
472219b2ee8SDavid du Colombier 	"	}",
4737dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
4747dd7cddfSDavid du Colombier 	"	if (in_s_scope(into+1))",
4757dd7cddfSDavid du Colombier 	"		require('s', into);",
4767dd7cddfSDavid du Colombier 	"#endif",
477312a1df1SDavid du Colombier 	"}",
478312a1df1SDavid du Colombier 	"#endif\n",
479219b2ee8SDavid du Colombier 	"#if SYNC",
480219b2ee8SDavid du Colombier 	"int",
481219b2ee8SDavid du Colombier 	"q_zero(int from)",
482219b2ee8SDavid du Colombier 	"{	if (!from--)",
483312a1df1SDavid du Colombier 	"	{	uerror(\"ref to uninitialized chan name (q_zero)\");",
484312a1df1SDavid du Colombier 	"		return 0;",
485312a1df1SDavid du Colombier 	"	}",
486219b2ee8SDavid du Colombier 	"	switch(((Q0 *)qptr(from))->_t) {",
487219b2ee8SDavid du Colombier 	0,
488219b2ee8SDavid du Colombier };
489219b2ee8SDavid du Colombier 
490*de2caf28SDavid du Colombier static const char *Addq3[] = {
491219b2ee8SDavid du Colombier 	"	case 0: printf(\"queue %%d was deleted\\n\", from+1);",
492219b2ee8SDavid du Colombier 	"	}",
493219b2ee8SDavid du Colombier 	"	Uerror(\"bad queue q-zero\");",
494312a1df1SDavid du Colombier 	"	return -1;",
495219b2ee8SDavid du Colombier 	"}",
496219b2ee8SDavid du Colombier 	"int",
497219b2ee8SDavid du Colombier 	"not_RV(int from)",
498219b2ee8SDavid du Colombier 	"{	if (q_zero(from))",
4997dd7cddfSDavid du Colombier 	"	{	printf(\"==>> a test of the contents of a rv \");",
5007dd7cddfSDavid du Colombier 	"		printf(\"channel always returns FALSE\\n\");",
501219b2ee8SDavid du Colombier 	"		uerror(\"error to poll rendezvous channel\");",
502219b2ee8SDavid du Colombier 	"	}",
503219b2ee8SDavid du Colombier 	"	return 1;",
504219b2ee8SDavid du Colombier 	"}",
505219b2ee8SDavid du Colombier 	"#endif",
506219b2ee8SDavid du Colombier 	"#ifndef XUSAFE",
507219b2ee8SDavid du Colombier 	"void",
508219b2ee8SDavid du Colombier 	"setq_claim(int x, int m, char *s, int y, char *p)",
509219b2ee8SDavid du Colombier 	"{	if (x == 0)",
510219b2ee8SDavid du Colombier 	"	uerror(\"x[rs] claim on uninitialized channel\");",
511219b2ee8SDavid du Colombier 	"	if (x < 0 || x > MAXQ)",
512219b2ee8SDavid du Colombier 	"		Uerror(\"cannot happen setq_claim\");",
513219b2ee8SDavid du Colombier 	"	q_claim[x] |= m;",
514219b2ee8SDavid du Colombier 	"	p_name[y] = p;",
515219b2ee8SDavid du Colombier 	"	q_name[x] = s;",
516219b2ee8SDavid du Colombier 	"	if (m&2) q_S_check(x, y);",
517219b2ee8SDavid du Colombier 	"	if (m&1) q_R_check(x, y);",
518219b2ee8SDavid du Colombier 	"}",
519219b2ee8SDavid du Colombier 	"short q_sender[MAXQ+1];",
520219b2ee8SDavid du Colombier 	"int",
521219b2ee8SDavid du Colombier 	"q_S_check(int x, int who)",
522219b2ee8SDavid du Colombier 	"{	if (!q_sender[x])",
523219b2ee8SDavid du Colombier 	"	{	q_sender[x] = who+1;",
524219b2ee8SDavid du Colombier 	"#if SYNC",
525219b2ee8SDavid du Colombier 	"		if (q_zero(x))",
5267dd7cddfSDavid du Colombier 	"		{	printf(\"chan %%s (%%d), \",",
5277dd7cddfSDavid du Colombier 	"				q_name[x], x-1);",
5287dd7cddfSDavid du Colombier 	"			printf(\"sndr proc %%s (%%d)\\n\",",
5297dd7cddfSDavid du Colombier 	"				p_name[who], who);",
5307dd7cddfSDavid du Colombier 	"			uerror(\"xs chans cannot be used for rv\");",
531219b2ee8SDavid du Colombier 	"		}",
532219b2ee8SDavid du Colombier 	"#endif",
533219b2ee8SDavid du Colombier 	"	} else",
534219b2ee8SDavid du Colombier 	"	if (q_sender[x] != who+1)",
5357dd7cddfSDavid du Colombier 	"	{	printf(\"pan: xs assertion violated: \");",
5367dd7cddfSDavid du Colombier 	"		printf(\"access to chan <%%s> (%%d)\\npan: by \",",
537219b2ee8SDavid du Colombier 	"			q_name[x], x-1);",
538312a1df1SDavid du Colombier 	"		if (q_sender[x] > 0 && p_name[q_sender[x]-1])",
539312a1df1SDavid du Colombier 	"			printf(\"%%s (proc %%d) and by \",",
540312a1df1SDavid du Colombier 	"			p_name[q_sender[x]-1], q_sender[x]-1);",
541312a1df1SDavid du Colombier 	"		printf(\"%%s (proc %%d)\\n\",",
542219b2ee8SDavid du Colombier 	"			p_name[who], who);",
543219b2ee8SDavid du Colombier 	"		uerror(\"error, partial order reduction invalid\");",
544219b2ee8SDavid du Colombier 	"	}",
545219b2ee8SDavid du Colombier 	"	return 1;",
546219b2ee8SDavid du Colombier 	"}",
547219b2ee8SDavid du Colombier 	"short q_recver[MAXQ+1];",
548219b2ee8SDavid du Colombier 	"int",
549219b2ee8SDavid du Colombier 	"q_R_check(int x, int who)",
550*de2caf28SDavid du Colombier 	"{",
551*de2caf28SDavid du Colombier 	"#ifdef VERBOSE",
552*de2caf28SDavid du Colombier 	"	printf(\"q_R_check x=%%d who=%%d\\n\", x, who);",
553*de2caf28SDavid du Colombier 	"#endif",
554*de2caf28SDavid du Colombier 	"	if (!q_recver[x])",
555219b2ee8SDavid du Colombier 	"	{	q_recver[x] = who+1;",
556219b2ee8SDavid du Colombier 	"#if SYNC",
557219b2ee8SDavid du Colombier 	"		if (q_zero(x))",
5587dd7cddfSDavid du Colombier 	"		{	printf(\"chan %%s (%%d), \",",
5597dd7cddfSDavid du Colombier 	"				q_name[x], x-1);",
5607dd7cddfSDavid du Colombier 	"			printf(\"recv proc %%s (%%d)\\n\",",
5617dd7cddfSDavid du Colombier 	"				p_name[who], who);",
5627dd7cddfSDavid du Colombier 	"			uerror(\"xr chans cannot be used for rv\");",
563219b2ee8SDavid du Colombier 	"		}",
564219b2ee8SDavid du Colombier 	"#endif",
565219b2ee8SDavid du Colombier 	"	} else",
566219b2ee8SDavid du Colombier 	"	if (q_recver[x] != who+1)",
5677dd7cddfSDavid du Colombier 	"	{	printf(\"pan: xr assertion violated: \");",
568312a1df1SDavid du Colombier 	"		printf(\"access to chan %%s (%%d)\\npan: \",",
569219b2ee8SDavid du Colombier 	"			q_name[x], x-1);",
570312a1df1SDavid du Colombier 	"		if (q_recver[x] > 0 && p_name[q_recver[x]-1])",
571312a1df1SDavid du Colombier 	"			printf(\"by %%s (proc %%d) and \",",
5727dd7cddfSDavid du Colombier 	"			p_name[q_recver[x]-1], q_recver[x]-1);",
573312a1df1SDavid du Colombier 	"		printf(\"by %%s (proc %%d)\\n\",",
574219b2ee8SDavid du Colombier 	"			p_name[who], who);",
575219b2ee8SDavid du Colombier 	"		uerror(\"error, partial order reduction invalid\");",
576219b2ee8SDavid du Colombier 	"	}",
577219b2ee8SDavid du Colombier 	"	return 1;",
578219b2ee8SDavid du Colombier 	"}",
579219b2ee8SDavid du Colombier 	"#endif",
580219b2ee8SDavid du Colombier 	"int",
581219b2ee8SDavid du Colombier 	"q_len(int x)",
582219b2ee8SDavid du Colombier 	"{	if (!x--)",
583219b2ee8SDavid du Colombier 	"	uerror(\"ref to uninitialized chan name (len)\");",
584219b2ee8SDavid du Colombier 	"	return ((Q0 *)qptr(x))->Qlen;",
585219b2ee8SDavid du Colombier 	"}\n",
586219b2ee8SDavid du Colombier 	"int",
587219b2ee8SDavid du Colombier 	"q_full(int from)",
588219b2ee8SDavid du Colombier 	"{	if (!from--)",
589219b2ee8SDavid du Colombier 	"	uerror(\"ref to uninitialized chan name (qfull)\");",
590219b2ee8SDavid du Colombier 	"	switch(((Q0 *)qptr(from))->_t) {",
591219b2ee8SDavid du Colombier 	0,
592219b2ee8SDavid du Colombier };
593219b2ee8SDavid du Colombier 
594*de2caf28SDavid du Colombier static const char *Addq4[] = {
595219b2ee8SDavid du Colombier 	"	case 0: printf(\"queue %%d was deleted\\n\", from+1);",
596219b2ee8SDavid du Colombier 	"	}",
597219b2ee8SDavid du Colombier 	"	Uerror(\"bad queue - q_full\");",
598219b2ee8SDavid du Colombier 	"	return 0;",
599219b2ee8SDavid du Colombier 	"}\n",
6007dd7cddfSDavid du Colombier 	"#ifdef HAS_UNLESS",
6017dd7cddfSDavid du Colombier 	"int",
6027dd7cddfSDavid du Colombier 	"q_e_f(int from)",
6037dd7cddfSDavid du Colombier 	"{	/* empty or full */",
6047dd7cddfSDavid du Colombier 	"	return !q_len(from) || q_full(from);",
6057dd7cddfSDavid du Colombier 	"}",
6067dd7cddfSDavid du Colombier 	"#endif",
607312a1df1SDavid du Colombier 	"#if NQS>0",
608219b2ee8SDavid du Colombier 	"int",
609219b2ee8SDavid du Colombier 	"qrecv(int from, int slot, int fld, int done)",
610219b2ee8SDavid du Colombier 	"{	uchar *z;",
611219b2ee8SDavid du Colombier 	"	int j, k, r=0;\n",
612219b2ee8SDavid du Colombier 	"	if (!from--)",
613219b2ee8SDavid du Colombier 	"	uerror(\"ref to uninitialized chan name (receiving)\");",
61400d97012SDavid du Colombier 	"#if defined(TRIX) && !defined(BFS)",
61500d97012SDavid du Colombier 	"	#ifndef TRIX_ORIG",
61600d97012SDavid du Colombier 	"		(trpt+1)->q_bup = now._ids_[now._nr_pr+from];",
61700d97012SDavid du Colombier 	"		#ifdef V_TRIX",
61800d97012SDavid du Colombier 	"			printf(\"%%4d: channel %%d r save %%p from %%d\\n\",",
61900d97012SDavid du Colombier 	"			depth, from, (trpt+1)->q_bup, now._nr_pr+from);",
62000d97012SDavid du Colombier 	"		#endif",
62100d97012SDavid du Colombier 	"	#endif",
62200d97012SDavid du Colombier 	"	channels[from]->modified = 1;	/* qrecv */",
62300d97012SDavid du Colombier 	"	#ifdef V_TRIX",
62400d97012SDavid du Colombier 	"		printf(\"%%4d: channel %%d modified\\n\", depth, from);",
62500d97012SDavid du Colombier 	"	#endif",
62600d97012SDavid du Colombier 	"#endif",
6277dd7cddfSDavid du Colombier 	"	if (from >= (int) now._nr_qs || from < 0)",
628219b2ee8SDavid du Colombier 	"		Uerror(\"qrecv bad queue#\");",
629219b2ee8SDavid du Colombier 	"	z = qptr(from);",
6307dd7cddfSDavid du Colombier 	"#ifdef EVENT_TRACE",
6317dd7cddfSDavid du Colombier 	"	if (done && (in_r_scope(from+1)))",
6327dd7cddfSDavid du Colombier 	"		require('r', from);",
6337dd7cddfSDavid du Colombier 	"#endif",
634219b2ee8SDavid du Colombier 	"	switch (((Q0 *)qptr(from))->_t) {",
635219b2ee8SDavid du Colombier 	0,
636219b2ee8SDavid du Colombier };
637219b2ee8SDavid du Colombier 
638*de2caf28SDavid du Colombier static const char *Addq5[] = {
639219b2ee8SDavid du Colombier 	"	case 0: printf(\"queue %%d was deleted\\n\", from+1);",
640219b2ee8SDavid du Colombier 	"	default: Uerror(\"bad queue - qrecv\");",
641219b2ee8SDavid du Colombier 	"	}",
642219b2ee8SDavid du Colombier 	"	return r;",
643312a1df1SDavid du Colombier 	"}",
644312a1df1SDavid du Colombier 	"#endif\n",
6457dd7cddfSDavid du Colombier 	"#ifndef BITSTATE",
6467dd7cddfSDavid du Colombier 	"	#ifdef COLLAPSE",
6477dd7cddfSDavid du Colombier 	"long",
6487dd7cddfSDavid du Colombier 	"col_q(int i, char *z)",
649312a1df1SDavid du Colombier 	"{	int j=0, k;",
6507dd7cddfSDavid du Colombier 	"	char *x, *y;",
6517dd7cddfSDavid du Colombier 	"	Q0 *ptr = (Q0 *) qptr(i);",
6527dd7cddfSDavid du Colombier 	"	switch (ptr->_t) {",
653219b2ee8SDavid du Colombier 	0,
654219b2ee8SDavid du Colombier };
655219b2ee8SDavid du Colombier 
656*de2caf28SDavid du Colombier static const char *Code0[] = {
657*de2caf28SDavid du Colombier 	"#ifdef INIT_STATE",
658*de2caf28SDavid du Colombier 	"void",	/* Bocchino */
659*de2caf28SDavid du Colombier 	"init_state(State state)"
660*de2caf28SDavid du Colombier 	"{	state._nr_pr = 0;",
661*de2caf28SDavid du Colombier 	"	state._nr_qs = 0;",
662*de2caf28SDavid du Colombier 	"	state._a_t = 0;",
663*de2caf28SDavid du Colombier 	"#ifndef NOFAIR",
664*de2caf28SDavid du Colombier 	"	memset(&state._cnt, 0, sizeof(state._cnt));",
665*de2caf28SDavid du Colombier 	"#endif",
666*de2caf28SDavid du Colombier 	"#ifndef NOVSZ",
667*de2caf28SDavid du Colombier 	"	state._vsz = 0;",
668*de2caf28SDavid du Colombier 	"#endif",
669*de2caf28SDavid du Colombier 	"#ifdef HAS_LAST",
670*de2caf28SDavid du Colombier 	"	state._last = 0;",
671*de2caf28SDavid du Colombier 	"#endif",
672*de2caf28SDavid du Colombier 	"#if defined(BITSTATE) && defined(BCS) && defined(STORE_CTX)",
673*de2caf28SDavid du Colombier 	"	state._ctx = 0;",
674*de2caf28SDavid du Colombier 	"#endif",
675*de2caf28SDavid du Colombier 	"#if defined(BFS_PAR) && defined(L_BOUND)",
676*de2caf28SDavid du Colombier 	"	state._l_bnd = 0;",
677*de2caf28SDavid du Colombier 	"	state._l_sds = 0;",
678*de2caf28SDavid du Colombier 	"#endif",
679*de2caf28SDavid du Colombier 	"#ifdef EVENT_TRACE",
680*de2caf28SDavid du Colombier 	"	state_event = 0;",
681*de2caf28SDavid du Colombier 	"#endif",
682*de2caf28SDavid du Colombier 	"#ifdef TRIX",
683*de2caf28SDavid du Colombier 	"	memset(&state._ids_, 0, sizeof(state._ids_));",
684*de2caf28SDavid du Colombier 	"#else",
685*de2caf28SDavid du Colombier 	"	memset(&state.sv, 0, sizeof(state.sv));",
686*de2caf28SDavid du Colombier 	"#endif",
687*de2caf28SDavid du Colombier 	"}",
688*de2caf28SDavid du Colombier 	"#endif",
689*de2caf28SDavid du Colombier 	"",
690219b2ee8SDavid du Colombier 	"void",
691219b2ee8SDavid du Colombier 	"run(void)",
692312a1df1SDavid du Colombier 	"{	/* int i; */",
693*de2caf28SDavid du Colombier 	"#ifdef INIT_STATE",
694*de2caf28SDavid du Colombier 	"	init_state(now);",
695*de2caf28SDavid du Colombier 	"#else",
696219b2ee8SDavid du Colombier 	"	memset((char *)&now, 0, sizeof(State));",
697*de2caf28SDavid du Colombier 	"#endif",
698*de2caf28SDavid du Colombier 	"	vsize = (ulong) (sizeof(State) - VECTORSZ);",
6997dd7cddfSDavid du Colombier 	"#ifndef NOVSZ",
7007dd7cddfSDavid du Colombier 	"	now._vsz = vsize;",
7017dd7cddfSDavid du Colombier 	"#endif",
70200d97012SDavid du Colombier 	"#ifdef TRIX",
70300d97012SDavid du Colombier 	"	if (VECTORSZ != sizeof(now._ids_))",
70400d97012SDavid du Colombier 	"	{	printf(\"VECTORSZ is %%d, but should be %%d in this mode\\n\",",
705*de2caf28SDavid du Colombier 	"			VECTORSZ, (int) sizeof(now._ids_));",
70600d97012SDavid du Colombier 	"		Uerror(\"VECTORSZ set incorrectly, recompile Spin (not pan.c)\");",
70700d97012SDavid du Colombier 	"	}",
70800d97012SDavid du Colombier 	"#endif",
7097dd7cddfSDavid du Colombier 	"/* optional provisioning statements, e.g. to */",
7107dd7cddfSDavid du Colombier 	"/* set hidden variables, used as constants */",
7117dd7cddfSDavid du Colombier 	"#ifdef PROV",
7127dd7cddfSDavid du Colombier 	"#include PROV",
7137dd7cddfSDavid du Colombier 	"#endif",
714219b2ee8SDavid du Colombier 	"	settable();",
715219b2ee8SDavid du Colombier 	0,
716219b2ee8SDavid du Colombier };
717219b2ee8SDavid du Colombier 
718*de2caf28SDavid du Colombier static const char *R0[] = {
71900d97012SDavid du Colombier 	"	Maxbody = max(Maxbody, ((int) sizeof(P%d)));",
720219b2ee8SDavid du Colombier 	"	reached[%d] = reached%d;",
721*de2caf28SDavid du Colombier 	"	accpstate[%d] = (uchar *) emalloc(_nstates%d);",
722*de2caf28SDavid du Colombier 	"	progstate[%d] = (uchar *) emalloc(_nstates%d);",
723*de2caf28SDavid du Colombier 	"	loopstate%d = loopstate[%d] = (uchar *) emalloc(_nstates%d);",
724*de2caf28SDavid du Colombier 	"	stopstate[%d] = (uchar *) emalloc(_nstates%d);",
725*de2caf28SDavid du Colombier 	"	visstate[%d] = (uchar *) emalloc(_nstates%d);",
726*de2caf28SDavid du Colombier 	"	mapstate[%d] = (short *) emalloc(_nstates%d * sizeof(short));",
727*de2caf28SDavid du Colombier 	"	stopstate[%d][_endstate%d] = 1;",
728219b2ee8SDavid du Colombier 	0,
729219b2ee8SDavid du Colombier };
730219b2ee8SDavid du Colombier 
731*de2caf28SDavid du Colombier static const char *R00[] = {
732*de2caf28SDavid du Colombier 	"	NrStates[%d] = _nstates%d;",
733219b2ee8SDavid du Colombier 	0,
734219b2ee8SDavid du Colombier };
735219b2ee8SDavid du Colombier 
736*de2caf28SDavid du Colombier static const char *R0a[] = {
737*de2caf28SDavid du Colombier 	"	retrans(%d, _nstates%d, _start%d, src_ln%d, reached%d, loopstate%d);",
738*de2caf28SDavid du Colombier 	0,
739*de2caf28SDavid du Colombier };
740*de2caf28SDavid du Colombier 
741*de2caf28SDavid du Colombier static const char *Code1[] = {
7427dd7cddfSDavid du Colombier 	"#ifdef NP",
7437dd7cddfSDavid du Colombier 	"	#define ACCEPT_LAB	1 /* at least 1 in np_ */",
7447dd7cddfSDavid du Colombier 	"#else",
7457dd7cddfSDavid du Colombier 	"	#define ACCEPT_LAB	%d /* user-defined accept labels */",
7467dd7cddfSDavid du Colombier 	"#endif",
74700d97012SDavid du Colombier 	"#ifdef MEMCNT",
74800d97012SDavid du Colombier 	"	#ifdef MEMLIM",
74900d97012SDavid du Colombier 	"		#warning -DMEMLIM takes precedence over -DMEMCNT",
75000d97012SDavid du Colombier 	"		#undef MEMCNT",
75100d97012SDavid du Colombier 	"	#else",
75200d97012SDavid du Colombier 	"		#if MEMCNT<20",
75300d97012SDavid du Colombier 	"			#warning using minimal value -DMEMCNT=20 (=1MB)",
75400d97012SDavid du Colombier 	"			#define MEMLIM	(1)",
75500d97012SDavid du Colombier 	"			#undef MEMCNT",
75600d97012SDavid du Colombier 	"		#else",
75700d97012SDavid du Colombier 	"			#if MEMCNT==20",
75800d97012SDavid du Colombier 	"				#define MEMLIM	(1)",
75900d97012SDavid du Colombier 	"				#undef MEMCNT",
76000d97012SDavid du Colombier 	"			#else",
76100d97012SDavid du Colombier 	"			 #if MEMCNT>=50",
76200d97012SDavid du Colombier 	"				#error excessive value for MEMCNT",
76300d97012SDavid du Colombier 	"			 #else",
76400d97012SDavid du Colombier 	"				#define MEMLIM	(1<<(MEMCNT-20))",
76500d97012SDavid du Colombier 	"			 #endif",
76600d97012SDavid du Colombier 	"			#endif",
76700d97012SDavid du Colombier 	"		#endif",
76800d97012SDavid du Colombier 	"	#endif",
76900d97012SDavid du Colombier 	"#endif",
77000d97012SDavid du Colombier 
77100d97012SDavid du Colombier 	"#if NCORE>1 && !defined(MEMLIM)",
77200d97012SDavid du Colombier 	"	#define MEMLIM	(2048)	/* need a default, using 2 GB */",
77300d97012SDavid du Colombier 	"#endif",
774219b2ee8SDavid du Colombier 	0,
775219b2ee8SDavid du Colombier };
776219b2ee8SDavid du Colombier 
777*de2caf28SDavid du Colombier static const char *Code3[] = {
778219b2ee8SDavid du Colombier 	"#define PROG_LAB	%d /* progress labels */",
779219b2ee8SDavid du Colombier 	0,
780219b2ee8SDavid du Colombier };
781219b2ee8SDavid du Colombier 
782*de2caf28SDavid du Colombier static const char *R2[] = {
783219b2ee8SDavid du Colombier 	"uchar *accpstate[%d];",
784219b2ee8SDavid du Colombier 	"uchar *progstate[%d];",
78500d97012SDavid du Colombier 	"uchar *loopstate[%d];",
786219b2ee8SDavid du Colombier 	"uchar *reached[%d];",
787219b2ee8SDavid du Colombier 	"uchar *stopstate[%d];",
7887dd7cddfSDavid du Colombier 	"uchar *visstate[%d];",
789312a1df1SDavid du Colombier 	"short *mapstate[%d];",
790312a1df1SDavid du Colombier 	"#ifdef HAS_CODE",
791312a1df1SDavid du Colombier 	"	int NrStates[%d];",
792312a1df1SDavid du Colombier 	"#endif",
793219b2ee8SDavid du Colombier 	0,
794219b2ee8SDavid du Colombier };
795*de2caf28SDavid du Colombier static const char *R3[] = {
79600d97012SDavid du Colombier 	"	Maxbody = max(Maxbody, ((int) sizeof(Q%d)));",
797219b2ee8SDavid du Colombier 	0,
798219b2ee8SDavid du Colombier };
799*de2caf28SDavid du Colombier static const char *R4[] = {
800*de2caf28SDavid du Colombier 	"	r_ck(reached%d, _nstates%d, %d, src_ln%d, src_file%d);",
801219b2ee8SDavid du Colombier 	0,
802219b2ee8SDavid du Colombier };
803*de2caf28SDavid du Colombier static const char *R5[] = {
804219b2ee8SDavid du Colombier 	"	case %d: j = sizeof(P%d); break;",
805219b2ee8SDavid du Colombier 	0,
806219b2ee8SDavid du Colombier };
807*de2caf28SDavid du Colombier static const char *R6[] = {
808219b2ee8SDavid du Colombier 	"	}",
809*de2caf28SDavid du Colombier 	"	_this = o_this;",
81000d97012SDavid du Colombier 	"#ifdef TRIX",
81100d97012SDavid du Colombier 	"	re_mark_all(1); /* addproc */",
81200d97012SDavid du Colombier 	"#endif",
813219b2ee8SDavid du Colombier 	"	return h-BASE;",
8147dd7cddfSDavid du Colombier 	"#ifndef NOBOUNDCHECK",
8157dd7cddfSDavid du Colombier 	"	#undef Index",
8167dd7cddfSDavid du Colombier 	"	#define Index(x, y)	Boundcheck(x, y, II, tt, t)",
8177dd7cddfSDavid du Colombier 	"#endif",
818219b2ee8SDavid du Colombier 	"}\n",
8197dd7cddfSDavid du Colombier 	"#if defined(BITSTATE) && defined(COLLAPSE)",
8207dd7cddfSDavid du Colombier 	"	/* just to allow compilation, to generate the error */",
8217dd7cddfSDavid du Colombier 	"	long col_p(int i, char *z) { return 0; }",
8227dd7cddfSDavid du Colombier 	"	long col_q(int i, char *z) { return 0; }",
8237dd7cddfSDavid du Colombier 	"#endif",
8247dd7cddfSDavid du Colombier 	"#ifndef BITSTATE",
8257dd7cddfSDavid du Colombier 	"	#ifdef COLLAPSE",
8267dd7cddfSDavid du Colombier 	"long",
8277dd7cddfSDavid du Colombier 	"col_p(int i, char *z)",
828*de2caf28SDavid du Colombier 	"{	int j, k; ulong ordinal(char *, long, short);",
8297dd7cddfSDavid du Colombier 	"	char *x, *y;",
8307dd7cddfSDavid du Colombier 	"	P0 *ptr = (P0 *) pptr(i);",
8317dd7cddfSDavid du Colombier 	"	switch (ptr->_t) {",
8327dd7cddfSDavid du Colombier 	"	case 0: j = sizeof(P0); break;",
833219b2ee8SDavid du Colombier 	0,
834219b2ee8SDavid du Colombier };
835*de2caf28SDavid du Colombier static const char *R7a[] = {
836*de2caf28SDavid du Colombier 	"void\nre_mark_all(int whichway)",
837*de2caf28SDavid du Colombier 	"{	int j;",
838*de2caf28SDavid du Colombier 	"	#ifdef V_TRIX",
839*de2caf28SDavid du Colombier 	"		printf(\"%%d: re_mark_all channels %%d\\n\", depth, whichway);",
840*de2caf28SDavid du Colombier 	"	#endif",
841*de2caf28SDavid du Colombier 	"	#ifndef BFS",
842*de2caf28SDavid du Colombier 	"	for (j = 0; j < now._nr_qs; j++)",
843*de2caf28SDavid du Colombier 	"		channels[j]->modified = 1; /* channel index moved */",
844*de2caf28SDavid du Colombier 	"	#endif",
845*de2caf28SDavid du Colombier 	"	#ifndef TRIX_ORIG",
846*de2caf28SDavid du Colombier 	"	if (whichway > 0)",
847*de2caf28SDavid du Colombier 	"	{	for (j = now._nr_pr + now._nr_qs - 1; j >= now._nr_pr; j--)",
848*de2caf28SDavid du Colombier 	"			now._ids_[j] = now._ids_[j-1];",
849*de2caf28SDavid du Colombier 	"	} else",
850*de2caf28SDavid du Colombier 	"	{	for (j = now._nr_pr; j < now._nr_pr + now._nr_qs; j++)",
851*de2caf28SDavid du Colombier 	"			now._ids_[j] = now._ids_[j+1];",
852*de2caf28SDavid du Colombier 	"	}",
853*de2caf28SDavid du Colombier 	"	#endif",
854*de2caf28SDavid du Colombier 	"}",
855*de2caf28SDavid du Colombier 	0,
856*de2caf28SDavid du Colombier };
857*de2caf28SDavid du Colombier 
858*de2caf28SDavid du Colombier static const char *R7b[] = {
859*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
860*de2caf28SDavid du Colombier 	"void",
861*de2caf28SDavid du Colombier 	"bfs_prepmask(int caller)",
862*de2caf28SDavid du Colombier 	"{",
863*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
864*de2caf28SDavid du Colombier 	"	memcpy((char *) &tmp_msk, (const char *) Mask, sizeof(State));",
865*de2caf28SDavid du Colombier 	"	Mask = (uchar *) &tmp_msk;",
866*de2caf28SDavid du Colombier 	"#endif",
867*de2caf28SDavid du Colombier 	"	switch (caller) {",
868*de2caf28SDavid du Colombier 	"	case 1:	/* addproc */",
869*de2caf28SDavid du Colombier 	"#if VECTORSZ>32000",
870*de2caf28SDavid du Colombier 	"		memcpy((char *) P_o_tmp, (const char *) proc_offset, MAXPROC*sizeof(int));",
871*de2caf28SDavid du Colombier 	"#else",
872*de2caf28SDavid du Colombier 	"		memcpy((char *) P_o_tmp, (const char *) proc_offset, MAXPROC*sizeof(short));",
873*de2caf28SDavid du Colombier 	"#endif",
874*de2caf28SDavid du Colombier 	"		memcpy((char *) P_s_tmp, (const char *) proc_skip, MAXPROC*sizeof(uchar));",
875*de2caf28SDavid du Colombier 	"		proc_offset = P_o_tmp;",
876*de2caf28SDavid du Colombier 	"		proc_skip   = (uchar *) &P_s_tmp[0];",
877*de2caf28SDavid du Colombier 	"		break;",
878*de2caf28SDavid du Colombier 	"	case 2: /* addqueue */",
879*de2caf28SDavid du Colombier 	"#if VECTORSZ>32000",
880*de2caf28SDavid du Colombier 	"		memcpy((char *) Q_o_tmp, (const char *) q_offset, MAXQ*sizeof(int));",
881*de2caf28SDavid du Colombier 	"#else",
882*de2caf28SDavid du Colombier 	"		memcpy((char *) Q_o_tmp, (const char *) q_offset, MAXQ*sizeof(short));",
883*de2caf28SDavid du Colombier 	"#endif",
884*de2caf28SDavid du Colombier 	"		memcpy((char *) Q_s_tmp, (const char *) q_skip, MAXQ*sizeof(uchar));",
885*de2caf28SDavid du Colombier 	"		q_offset = Q_o_tmp;",
886*de2caf28SDavid du Colombier 	"		q_skip   = (uchar *) &Q_s_tmp[0];",
887*de2caf28SDavid du Colombier 	"		break;",
888*de2caf28SDavid du Colombier 	"	case 3: /* no nothing */",
889*de2caf28SDavid du Colombier 	"		break;",
890*de2caf28SDavid du Colombier 	"	default: /* cannot happen */",
891*de2caf28SDavid du Colombier 	"		Uerror(\"no good\");",
892*de2caf28SDavid du Colombier 	"		break;",
893*de2caf28SDavid du Colombier 	"	}",
894*de2caf28SDavid du Colombier 	"}",
895*de2caf28SDavid du Colombier 	"",
896*de2caf28SDavid du Colombier 	"typedef struct BFS_saves BFS_saves;",
897*de2caf28SDavid du Colombier 	"struct BFS_saves {",
898*de2caf28SDavid du Colombier 	"	char *m;",
899*de2caf28SDavid du Colombier 	"	BFS_saves *nxt;",
900*de2caf28SDavid du Colombier 	"} *bfs_save_po,",
901*de2caf28SDavid du Colombier 	"  *bfs_save_ps,",
902*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
903*de2caf28SDavid du Colombier 	"  *bfs_save_mask,",
904*de2caf28SDavid du Colombier 	"#endif",
905*de2caf28SDavid du Colombier 	"  *bfs_save_qo,",
906*de2caf28SDavid du Colombier 	"  *bfs_save_qs;",
907*de2caf28SDavid du Colombier 	"",
908*de2caf28SDavid du Colombier 	"extern volatile uchar *sh_malloc(ulong);",
909*de2caf28SDavid du Colombier 	"static int bfs_runs; /* 0 before local heaps are initialized */",
910*de2caf28SDavid du Colombier 	"",
911*de2caf28SDavid du Colombier 	"void",
912*de2caf28SDavid du Colombier 	"bfs_swoosh(BFS_saves **where, char **what, int howmuch)",
913*de2caf28SDavid du Colombier 	"{	BFS_saves *m;",
914*de2caf28SDavid du Colombier 	"	for (m = *where; m; m = m->nxt)",
915*de2caf28SDavid du Colombier 	"	{	if (memcmp(m->m, *what, howmuch) == 0)",
916*de2caf28SDavid du Colombier 	"		{	*what = m->m;",
917*de2caf28SDavid du Colombier 	"			return;",
918*de2caf28SDavid du Colombier 	"	}	}",
919*de2caf28SDavid du Colombier 	"	m = (BFS_saves *) emalloc(sizeof(BFS_saves));",
920*de2caf28SDavid du Colombier 	"	if (bfs_runs)",
921*de2caf28SDavid du Colombier 	"	{	m->m = (char *) sh_malloc(howmuch);",
922*de2caf28SDavid du Colombier 	"	} else",
923*de2caf28SDavid du Colombier 	"	{	m->m = (char *) sh_pre_malloc(howmuch);",
924*de2caf28SDavid du Colombier 	"	}",
925*de2caf28SDavid du Colombier 	"	memcpy(m->m, *what, howmuch);",
926*de2caf28SDavid du Colombier 	"	m->nxt = *where;",
927*de2caf28SDavid du Colombier 	"	*where = m;",
928*de2caf28SDavid du Colombier 	"	*what = m->m;",
929*de2caf28SDavid du Colombier 	"}",
930*de2caf28SDavid du Colombier 	"",
931*de2caf28SDavid du Colombier 	"void",
932*de2caf28SDavid du Colombier 	"bfs_fixmask(int caller)",	/* 1=addproc, 2=addqueue */
933*de2caf28SDavid du Colombier 	"{",
934*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
935*de2caf28SDavid du Colombier 	"	bfs_swoosh(&bfs_save_mask, (char **) &Mask, sizeof(State));",
936*de2caf28SDavid du Colombier 	"#endif",
937*de2caf28SDavid du Colombier 	"#ifndef TRIX",
938*de2caf28SDavid du Colombier 	"	switch (caller) {",
939*de2caf28SDavid du Colombier 	"	case 1: /* addproc */",
940*de2caf28SDavid du Colombier 	"	#if VECTORSZ>32000",
941*de2caf28SDavid du Colombier 	"		bfs_swoosh(&bfs_save_po, (char **) &proc_offset, MAXPROC*sizeof(int));",
942*de2caf28SDavid du Colombier 	"	#else",
943*de2caf28SDavid du Colombier 	"		bfs_swoosh(&bfs_save_po, (char **) &proc_offset, MAXPROC*sizeof(short));",
944*de2caf28SDavid du Colombier 	"	#endif",
945*de2caf28SDavid du Colombier 	"		bfs_swoosh(&bfs_save_ps, (char **) &proc_skip, MAXPROC*sizeof(uchar));",
946*de2caf28SDavid du Colombier 	"		break;",
947*de2caf28SDavid du Colombier 	"	case 2: /* addqueue */",
948*de2caf28SDavid du Colombier 	"	#if VECTORSZ>32000",
949*de2caf28SDavid du Colombier 	"		bfs_swoosh(&bfs_save_qo, (char **) &q_offset, MAXQ*sizeof(int));",
950*de2caf28SDavid du Colombier 	"	#else",
951*de2caf28SDavid du Colombier 	"		bfs_swoosh(&bfs_save_qo, (char **) &q_offset, MAXQ*sizeof(short));",
952*de2caf28SDavid du Colombier 	"	#endif",
953*de2caf28SDavid du Colombier 	"		bfs_swoosh(&bfs_save_qs, (char **) &q_skip, MAXQ*sizeof(uchar));",
954*de2caf28SDavid du Colombier 	"		break;",
955*de2caf28SDavid du Colombier 	"	case 3: /* do nothing */",
956*de2caf28SDavid du Colombier 	"		break;",
957*de2caf28SDavid du Colombier 	"	default:",
958*de2caf28SDavid du Colombier 	"		Uerror(\"double plus ungood\");",
959*de2caf28SDavid du Colombier 	"		break;",
960*de2caf28SDavid du Colombier 	"	}",
961*de2caf28SDavid du Colombier 	"#endif",
962*de2caf28SDavid du Colombier 	"}",
963*de2caf28SDavid du Colombier 	"#endif",
964*de2caf28SDavid du Colombier 	0,
965*de2caf28SDavid du Colombier };
966*de2caf28SDavid du Colombier static const char *R8a[] = {
9677dd7cddfSDavid du Colombier 	"	default: Uerror(\"bad proctype - collapse\");",
9687dd7cddfSDavid du Colombier 	"	}",
9697dd7cddfSDavid du Colombier 	"	if (z) x = z; else x = scratch;",
9707dd7cddfSDavid du Colombier 	"	y = (char *) ptr; k = proc_offset[i];",
971*de2caf28SDavid du Colombier 	"",
972*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
9737dd7cddfSDavid du Colombier 	"	for ( ; j > 0; j--, y++)",
9747dd7cddfSDavid du Colombier 	"		if (!Mask[k++]) *x++ = *y;",
975*de2caf28SDavid du Colombier 	"#else",
976*de2caf28SDavid du Colombier 	"	memcpy(x, y, j);",
977*de2caf28SDavid du Colombier 	"	x += j;",
978*de2caf28SDavid du Colombier 	"#endif",
9797dd7cddfSDavid du Colombier 	"	for (j = 0; j < WS-1; j++)",
9807dd7cddfSDavid du Colombier 	"		*x++ = 0;",
9817dd7cddfSDavid du Colombier 	"	x -= j;",
982312a1df1SDavid du Colombier 	"	if (z) return (long) (x - z);",
983312a1df1SDavid du Colombier 	"	return ordinal(scratch, x-scratch, (short) (2+ptr->_t));",
9847dd7cddfSDavid du Colombier 	"}",
9857dd7cddfSDavid du Colombier 	"	#endif",
9867dd7cddfSDavid du Colombier 	"#endif",
9877dd7cddfSDavid du Colombier 	0,
9887dd7cddfSDavid du Colombier };
989*de2caf28SDavid du Colombier static const char *R8b[] = {
9907dd7cddfSDavid du Colombier 	"	default: Uerror(\"bad qtype - collapse\");",
9917dd7cddfSDavid du Colombier 	"	}",
9927dd7cddfSDavid du Colombier 	"	if (z) x = z; else x = scratch;",
9937dd7cddfSDavid du Colombier 	"	y = (char *) ptr; k = q_offset[i];",
9947dd7cddfSDavid du Colombier 
995*de2caf28SDavid du Colombier 	"#if NQS > 0",
9967dd7cddfSDavid du Colombier 	"	/* no need to store the empty slots at the end */",
9977dd7cddfSDavid du Colombier 	"	j -= (q_max[ptr->_t] - ptr->Qlen) * ((j - 2)/q_max[ptr->_t]);",
998*de2caf28SDavid du Colombier 	"#endif",
999*de2caf28SDavid du Colombier 	"",
1000*de2caf28SDavid du Colombier 	"#if !defined(NOCOMP) && !defined(HC)",
10017dd7cddfSDavid du Colombier 	"	for ( ; j > 0; j--, y++)",
10027dd7cddfSDavid du Colombier 	"		if (!Mask[k++]) *x++ = *y;",
1003*de2caf28SDavid du Colombier 	"#else",
1004*de2caf28SDavid du Colombier 	"	memcpy(x, y, j);",
1005*de2caf28SDavid du Colombier 	"	x += j;",
1006*de2caf28SDavid du Colombier 	"#endif",
10077dd7cddfSDavid du Colombier 	"	for (j = 0; j < WS-1; j++)",
10087dd7cddfSDavid du Colombier 	"		*x++ = 0;",
10097dd7cddfSDavid du Colombier 	"	x -= j;",
1010312a1df1SDavid du Colombier 	"	if (z) return (long) (x - z);",
10117dd7cddfSDavid du Colombier 	"	return ordinal(scratch, x-scratch, 1); /* chan */",
10127dd7cddfSDavid du Colombier 	"}",
10137dd7cddfSDavid du Colombier 	"	#endif",
10147dd7cddfSDavid du Colombier 	"#endif",
10157dd7cddfSDavid du Colombier 	0,
10167dd7cddfSDavid du Colombier };
1017312a1df1SDavid du Colombier 
1018*de2caf28SDavid du Colombier static const char *R12[] = {
1019219b2ee8SDavid du Colombier 	"\t\tcase %d: r = ((Q%d *)z)->contents[slot].fld%d; break;",
1020219b2ee8SDavid du Colombier 	0,
1021219b2ee8SDavid du Colombier };
1022*de2caf28SDavid du Colombier 
1023*de2caf28SDavid du Colombier const char *R13_[] = {
1024219b2ee8SDavid du Colombier 	"int ",
1025219b2ee8SDavid du Colombier 	"unsend(int into)",
1026312a1df1SDavid du Colombier 	"{	int _m=0, j; uchar *z;\n",
1027312a1df1SDavid du Colombier 	"#ifdef HAS_SORTED",
1028312a1df1SDavid du Colombier 	"	int k;",
1029312a1df1SDavid du Colombier 	"#endif",
10307dd7cddfSDavid du Colombier 	"	if (!into--)",
10317dd7cddfSDavid du Colombier 	"		uerror(\"ref to uninitialized chan (unsend)\");",
103200d97012SDavid du Colombier 	"#if defined(TRIX) && !defined(BFS)",
103300d97012SDavid du Colombier 	"	#ifndef TRIX_ORIG",
103400d97012SDavid du Colombier 	"		now._ids_[now._nr_pr+into] = trpt->q_bup;",
103500d97012SDavid du Colombier 	"		#ifdef V_TRIX",
103600d97012SDavid du Colombier 	"			printf(\"%%4d: channel %%d s restore %%p into %%d\\n\",",
103700d97012SDavid du Colombier 	"				depth, into, trpt->q_bup, now._nr_pr+into);",
103800d97012SDavid du Colombier 	"		#endif",
103900d97012SDavid du Colombier 	"	#else",
104000d97012SDavid du Colombier 	"		channels[into]->modified = 1;	/* unsend */",
104100d97012SDavid du Colombier 	"		#ifdef V_TRIX",
104200d97012SDavid du Colombier 	"			printf(\"%%4d: channel %%d unmodify\\n\", depth, into);",
104300d97012SDavid du Colombier 	"		#endif",
104400d97012SDavid du Colombier 	"	#endif",
104500d97012SDavid du Colombier 	"#endif",
1046219b2ee8SDavid du Colombier 	"	z = qptr(into);",
1047219b2ee8SDavid du Colombier 	"	j = ((Q0 *)z)->Qlen;",
1048219b2ee8SDavid du Colombier 	"	((Q0 *)z)->Qlen = --j;",
1049219b2ee8SDavid du Colombier 	"	switch (((Q0 *)qptr(into))->_t) {",
1050219b2ee8SDavid du Colombier 	0,
1051219b2ee8SDavid du Colombier };
1052*de2caf28SDavid du Colombier const char *R14_[] = {
1053219b2ee8SDavid du Colombier 	"	default: Uerror(\"bad queue - unsend\");",
1054219b2ee8SDavid du Colombier 	"	}",
1055312a1df1SDavid du Colombier 	"	return _m;",
1056219b2ee8SDavid du Colombier 	"}\n",
1057219b2ee8SDavid du Colombier 	"void",
1058219b2ee8SDavid du Colombier 	"unrecv(int from, int slot, int fld, int fldvar, int strt)",
1059219b2ee8SDavid du Colombier 	"{	int j; uchar *z;\n",
10607dd7cddfSDavid du Colombier 	"	if (!from--)",
10617dd7cddfSDavid du Colombier 	"		uerror(\"ref to uninitialized chan (unrecv)\");",
106200d97012SDavid du Colombier 	"#if defined(TRIX) && !defined(BFS)",
106300d97012SDavid du Colombier 	"	#ifndef TRIX_ORIG",
106400d97012SDavid du Colombier 	"		now._ids_[now._nr_pr+from] = trpt->q_bup;",
106500d97012SDavid du Colombier 	"		#ifdef V_TRIX",
106600d97012SDavid du Colombier 	"			printf(\"%%4d: channel %%d r restore %%p into %%d\\n\",",
106700d97012SDavid du Colombier 	"				depth, from, trpt->q_bup, now._nr_pr+from);",
106800d97012SDavid du Colombier 	"		#endif",
106900d97012SDavid du Colombier 	"	#else",
107000d97012SDavid du Colombier 	"		channels[from]->modified = 1;	/* unrecv */",
107100d97012SDavid du Colombier 	"		#ifdef V_TRIX",
107200d97012SDavid du Colombier 	"			printf(\"%%4d: channel %%d unmodify\\n\", depth, from);",
107300d97012SDavid du Colombier 	"		#endif",
107400d97012SDavid du Colombier 	"	#endif",
107500d97012SDavid du Colombier 	"#endif",
1076219b2ee8SDavid du Colombier 	"	z = qptr(from);",
1077219b2ee8SDavid du Colombier 	"	j = ((Q0 *)z)->Qlen;",
1078219b2ee8SDavid du Colombier 	"	if (strt) ((Q0 *)z)->Qlen = j+1;",
1079219b2ee8SDavid du Colombier 	"	switch (((Q0 *)qptr(from))->_t) {",
1080219b2ee8SDavid du Colombier 	0,
1081219b2ee8SDavid du Colombier };
1082*de2caf28SDavid du Colombier const char *R15_[] = {
1083219b2ee8SDavid du Colombier 	"	default: Uerror(\"bad queue - qrecv\");",
1084219b2ee8SDavid du Colombier 	"	}",
1085219b2ee8SDavid du Colombier 	"}",
1086219b2ee8SDavid du Colombier 	0,
1087219b2ee8SDavid du Colombier };
1088*de2caf28SDavid du Colombier static const char *Proto[] = {
1089219b2ee8SDavid du Colombier 	"",
1090219b2ee8SDavid du Colombier 	"/** function prototypes **/",
1091*de2caf28SDavid du Colombier 	"char *emalloc(ulong);",
1092*de2caf28SDavid du Colombier 	"char *Malloc(ulong);",
1093219b2ee8SDavid du Colombier 	"int Boundcheck(int, int, int, int, Trans *);",
109400d97012SDavid du Colombier 	"int addqueue(int, int, int);",
10957dd7cddfSDavid du Colombier 	"/* int atoi(char *); */",
1096f3793cddSDavid du Colombier 	"/* int abort(void); */",
1097f3793cddSDavid du Colombier 	"int close(int);",	/* should probably remove this */
1098f3793cddSDavid du Colombier #if 0
1099312a1df1SDavid du Colombier 	"#ifndef SC",
1100219b2ee8SDavid du Colombier 	"	int creat(char *, unsigned short);",
11017dd7cddfSDavid du Colombier 	"	int write(int, void *, unsigned);",
1102312a1df1SDavid du Colombier 	"#endif",
1103f3793cddSDavid du Colombier #endif
1104219b2ee8SDavid du Colombier 	"int delproc(int, int);",
1105219b2ee8SDavid du Colombier 	"int endstate(void);",
1106*de2caf28SDavid du Colombier 	"int find_claim(char *);",
1107*de2caf28SDavid du Colombier 	"int h_store(char *, int);",
1108*de2caf28SDavid du Colombier 	"int pan_rand(void);",
11097dd7cddfSDavid du Colombier 	"int q_cond(short, Trans *);",
1110219b2ee8SDavid du Colombier 	"int q_full(int);",
1111219b2ee8SDavid du Colombier 	"int q_len(int);",
1112219b2ee8SDavid du Colombier 	"int q_zero(int);",
1113219b2ee8SDavid du Colombier 	"int qrecv(int, int, int, int);",
1114219b2ee8SDavid du Colombier 	"int unsend(int);",
1115312a1df1SDavid du Colombier 	"/* void *sbrk(int); */",
111600d97012SDavid du Colombier 	"void spin_assert(int, char *, int, int, Trans *);",
1117*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
1118*de2caf28SDavid du Colombier 	"void bfs_printf(const char *, ...);",
1119*de2caf28SDavid du Colombier 	"volatile uchar *sh_pre_malloc(ulong);",
1120*de2caf28SDavid du Colombier 	"#endif",
1121312a1df1SDavid du Colombier 	"void c_chandump(int);",
1122312a1df1SDavid du Colombier 	"void c_globals(void);",
1123312a1df1SDavid du Colombier 	"void c_locals(int, int);",
1124219b2ee8SDavid du Colombier 	"void checkcycles(void);",
1125219b2ee8SDavid du Colombier 	"void crack(int, int, Trans *, short *);",
1126*de2caf28SDavid du Colombier 	"void d_sfh(uchar *, int);",
11277dd7cddfSDavid du Colombier 	"void d_hash(uchar *, int);",
1128*de2caf28SDavid du Colombier 	"void m_hash(uchar *, int);",
1129312a1df1SDavid du Colombier 	"void s_hash(uchar *, int);",
1130219b2ee8SDavid du Colombier 	"void delq(int);",
113100d97012SDavid du Colombier 	"void dot_crack(int, int, Trans *);",
1132219b2ee8SDavid du Colombier 	"void do_reach(void);",
1133312a1df1SDavid du Colombier 	"void pan_exit(int);",
1134219b2ee8SDavid du Colombier 	"void exit(int);",
1135*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
1136*de2caf28SDavid du Colombier 	"	void bfs_setup_mem(void);",
1137*de2caf28SDavid du Colombier 	"#endif",
1138*de2caf28SDavid du Colombier 	"#ifdef BITSTATE",
1139*de2caf28SDavid du Colombier 	"	void sinit(void);",
1140*de2caf28SDavid du Colombier 	"#else",
1141219b2ee8SDavid du Colombier 	"	void hinit(void);",
1142*de2caf28SDavid du Colombier 	"#endif",
1143312a1df1SDavid du Colombier 	"void imed(Trans *, int, int, int);",
1144219b2ee8SDavid du Colombier 	"void new_state(void);",
1145219b2ee8SDavid du Colombier 	"void p_restor(int);",
1146219b2ee8SDavid du Colombier 	"void putpeg(int, int);",
1147219b2ee8SDavid du Colombier 	"void putrail(void);",
1148219b2ee8SDavid du Colombier 	"void q_restor(void);",
114900d97012SDavid du Colombier 	"void retrans(int, int, int, short *, uchar *, uchar *);",
1150*de2caf28SDavid du Colombier 	"void select_claim(int);",
1151219b2ee8SDavid du Colombier 	"void settable(void);",
1152219b2ee8SDavid du Colombier 	"void setq_claim(int, int, char *, int, char *);",
11537dd7cddfSDavid du Colombier 	"void sv_restor(void);",
1154312a1df1SDavid du Colombier 	"void sv_save(void);",
1155219b2ee8SDavid du Colombier 	"void tagtable(int, int, int, short *, uchar *);",
115600d97012SDavid du Colombier 	"void do_dfs(int, int, int, short *, uchar *, uchar *);",
1157219b2ee8SDavid du Colombier 	"void unrecv(int, int, int, int, int);",
1158219b2ee8SDavid du Colombier 	"void usage(FILE *);",
1159*de2caf28SDavid du Colombier 	"void wrap_stats(void);\n",
1160*de2caf28SDavid du Colombier 	"#ifdef MA",
1161*de2caf28SDavid du Colombier 	"	int g_store(char *, int, uchar);",
1162*de2caf28SDavid du Colombier 	"#endif",
1163219b2ee8SDavid du Colombier 	"#if defined(FULLSTACK) && defined(BITSTATE)",
1164219b2ee8SDavid du Colombier 	"	int  onstack_now(void);",
1165219b2ee8SDavid du Colombier 	"	void onstack_init(void);",
1166219b2ee8SDavid du Colombier 	"	void onstack_put(void);",
1167219b2ee8SDavid du Colombier 	"	void onstack_zap(void);",
1168219b2ee8SDavid du Colombier 	"#endif",
1169219b2ee8SDavid du Colombier 	"#ifndef XUSAFE",
11707dd7cddfSDavid du Colombier 	"	int q_S_check(int, int);",
11717dd7cddfSDavid du Colombier 	"	int q_R_check(int, int);",
1172*de2caf28SDavid du Colombier 	"	extern uchar q_claim[MAXQ+1];",
1173*de2caf28SDavid du Colombier 	"	extern char *q_name[MAXQ+1];",
1174*de2caf28SDavid du Colombier 	"	extern char *p_name[MAXPROC+1];",
1175219b2ee8SDavid du Colombier 	"#endif",
1176*de2caf28SDavid du Colombier 	"",
1177*de2caf28SDavid du Colombier 	"#ifndef NO_V_PROVISO",
1178*de2caf28SDavid du Colombier 	"	#define V_PROVISO",
1179*de2caf28SDavid du Colombier 	"#endif",
1180*de2caf28SDavid du Colombier 	"#if !defined(NO_RESIZE) && !defined(AUTO_RESIZE) && !defined(BITSTATE) && !defined(SPACE) && !defined(USE_TDH) && NCORE==1",
1181*de2caf28SDavid du Colombier 	"	#define AUTO_RESIZE",
1182*de2caf28SDavid du Colombier 	"#endif",
1183*de2caf28SDavid du Colombier 	"",
1184*de2caf28SDavid du Colombier 	"typedef struct Trail Trail;",
1185*de2caf28SDavid du Colombier 	"typedef struct H_el  H_el;",
1186*de2caf28SDavid du Colombier 	"",
1187*de2caf28SDavid du Colombier 	"struct H_el {",
1188*de2caf28SDavid du Colombier 	"	H_el *nxt;",
1189*de2caf28SDavid du Colombier 	"	#ifdef FULLSTACK",
1190*de2caf28SDavid du Colombier 	"		unsigned int tagged;",
1191*de2caf28SDavid du Colombier 	"		#if defined(BITSTATE) && !defined(NOREDUCE) && !defined(SAFETY)",
1192*de2caf28SDavid du Colombier 	"			unsigned int proviso;", /* uses just 1 bit 0/1 */
1193*de2caf28SDavid du Colombier 	"		#endif",
1194*de2caf28SDavid du Colombier 	"	#endif",
1195*de2caf28SDavid du Colombier 	"	#if defined(CHECK) || (defined(COLLAPSE) && !defined(FULLSTACK))",
1196*de2caf28SDavid du Colombier 	"		ulong st_id;",
1197*de2caf28SDavid du Colombier 	"	#endif",
1198*de2caf28SDavid du Colombier 	"	#if !defined(SAFETY) || defined(REACH)",
1199*de2caf28SDavid du Colombier 	"		uint D;",
1200*de2caf28SDavid du Colombier 	"	#endif",
1201*de2caf28SDavid du Colombier 	"	#ifdef BCS",
1202*de2caf28SDavid du Colombier 	"		#ifndef CONSERVATIVE",
1203*de2caf28SDavid du Colombier 	"			#define CONSERVATIVE	1 /* good for up to 8 processes */",
1204*de2caf28SDavid du Colombier 	"		#endif",
1205*de2caf28SDavid du Colombier 	"		#ifdef CONSERVATIVE",
1206*de2caf28SDavid du Colombier 	"			#if CONSERVATIVE <= 0 || CONSERVATIVE>32",
1207*de2caf28SDavid du Colombier 	"			#error sensible values for CONSERVATIVE are 1..32 (256/8 = 32)",
1208*de2caf28SDavid du Colombier 	"			#endif",
1209*de2caf28SDavid du Colombier 	"			uchar ctx_pid[CONSERVATIVE];", /* pids setting lowest value */
1210*de2caf28SDavid du Colombier 	"		#endif",
1211*de2caf28SDavid du Colombier 	"		uchar ctx_low;", /* lowest nr of context switches seen so far */
1212*de2caf28SDavid du Colombier 	"	#endif",
1213*de2caf28SDavid du Colombier 	"	#if NCORE>1",
1214*de2caf28SDavid du Colombier 	"		/* could cost 1 extra word: 4 bytes if 32-bit and 8 bytes if 64-bit */",
1215*de2caf28SDavid du Colombier 	"		#ifdef V_PROVISO",
1216*de2caf28SDavid du Colombier 	"			uchar	cpu_id;		/* id of cpu that created the state */",
1217*de2caf28SDavid du Colombier 	"		#endif",
1218*de2caf28SDavid du Colombier 	"	#endif",
1219*de2caf28SDavid du Colombier 	"	#ifdef COLLAPSE",
1220*de2caf28SDavid du Colombier 	"		#if VECTORSZ<65536",
1221*de2caf28SDavid du Colombier 	"			ushort ln;",	/* length of vector */
1222*de2caf28SDavid du Colombier 	"		#else",
1223*de2caf28SDavid du Colombier 	"			ulong ln;",	/* length of vector */
1224*de2caf28SDavid du Colombier 	"		#endif",
1225*de2caf28SDavid du Colombier 	"	#endif",
1226*de2caf28SDavid du Colombier 	"	#if defined(AUTO_RESIZE) && !defined(BITSTATE)",
1227*de2caf28SDavid du Colombier 	"		ulong m_K1;",
1228*de2caf28SDavid du Colombier 	"	#endif",
1229*de2caf28SDavid du Colombier 	"	ulong state;",
1230*de2caf28SDavid du Colombier 	"};",
1231*de2caf28SDavid du Colombier 	"",
1232*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
1233*de2caf28SDavid du Colombier 	"typedef struct BFS_Trail BFS_Trail;",
1234*de2caf28SDavid du Colombier 	"struct BFS_Trail {",
1235*de2caf28SDavid du Colombier 	"	H_el *ostate;",
1236*de2caf28SDavid du Colombier 	"	int   st;",
1237*de2caf28SDavid du Colombier 	"	int   o_tt;",
1238*de2caf28SDavid du Colombier 	"	T_ID  t_id;", /* could be uint, ushort, or uchar */
1239*de2caf28SDavid du Colombier 	"	uchar pr;",
1240*de2caf28SDavid du Colombier 	"	uchar o_pm;",
1241*de2caf28SDavid du Colombier 	"	uchar tau;",
1242*de2caf28SDavid du Colombier 	"};",
1243*de2caf28SDavid du Colombier 	"	#if SYNC>0",
1244*de2caf28SDavid du Colombier 	"		#undef BFS_NOTRAIL", /* just in case it was used */
1245*de2caf28SDavid du Colombier 	"	#endif",
1246*de2caf28SDavid du Colombier 	"#endif",
1247*de2caf28SDavid du Colombier 	"",
1248*de2caf28SDavid du Colombier 	"#ifdef RHASH",
1249*de2caf28SDavid du Colombier 	"	#ifndef PERMUTED",
1250*de2caf28SDavid du Colombier 	"	#define PERMUTED",
1251*de2caf28SDavid du Colombier 	"	#endif",
1252*de2caf28SDavid du Colombier 	"#endif",
1253*de2caf28SDavid du Colombier 	"",
1254*de2caf28SDavid du Colombier 	"struct Trail {",
1255*de2caf28SDavid du Colombier 	"	int   st;	/* current state */",
1256*de2caf28SDavid du Colombier 	"	int   o_tt;",
1257*de2caf28SDavid du Colombier 	"#ifdef PERMUTED",
1258*de2caf28SDavid du Colombier 	"	uint  seed;",
1259*de2caf28SDavid du Colombier 	"	uchar oII;",
1260*de2caf28SDavid du Colombier 	"#endif",
1261*de2caf28SDavid du Colombier 	"	uchar pr;	/* process id */",
1262*de2caf28SDavid du Colombier 	"	uchar tau;	/* 8 bit-flags */",
1263*de2caf28SDavid du Colombier 	"	uchar o_pm;	/* 8 more bit-flags */",
1264*de2caf28SDavid du Colombier 	"",
1265*de2caf28SDavid du Colombier 	"	#if 0",
1266*de2caf28SDavid du Colombier 	"	Meaning of bit-flags on tau and o_pm:",
1267*de2caf28SDavid du Colombier 	"	tau&1   -> timeout enabled",
1268*de2caf28SDavid du Colombier 	"	tau&2   -> request to enable timeout 1 level up (in claim)",
1269*de2caf28SDavid du Colombier 	"	tau&4   -> current transition is a  claim move",
1270*de2caf28SDavid du Colombier 	"	tau&8   -> current transition is an atomic move",
1271*de2caf28SDavid du Colombier 	"	tau&16  -> last move was truncated on stack",
1272*de2caf28SDavid du Colombier 	"	tau&32  -> current transition is a preselected move",
1273*de2caf28SDavid du Colombier 	"	tau&64  -> at least one next state is not on the stack",
1274*de2caf28SDavid du Colombier 	"	tau&128 -> current transition is a stutter move",
1275*de2caf28SDavid du Colombier 
1276*de2caf28SDavid du Colombier 	"	o_pm&1	-> the current pid moved -- implements else",
1277*de2caf28SDavid du Colombier 	"	o_pm&2	-> this is an acceptance state",
1278*de2caf28SDavid du Colombier 	"	o_pm&4	-> this is a  progress state",
1279*de2caf28SDavid du Colombier 	"	o_pm&8	-> fairness alg rule 1 undo mark",
1280*de2caf28SDavid du Colombier 	"	o_pm&16	-> fairness alg rule 3 undo mark",
1281*de2caf28SDavid du Colombier 	"	o_pm&32	-> fairness alg rule 2 undo mark",
1282*de2caf28SDavid du Colombier 	"	o_pm&64 -> the current proc applied rule2",
1283*de2caf28SDavid du Colombier 	"	o_pm&128 -> a fairness, dummy move - all procs blocked",
1284*de2caf28SDavid du Colombier 	"	#endif",
1285*de2caf28SDavid du Colombier 	"",
1286*de2caf28SDavid du Colombier 	"	#ifdef NSUCC",
1287*de2caf28SDavid du Colombier 	"	 uchar n_succ;	/* nr of successor states */",
1288*de2caf28SDavid du Colombier 	"	#endif",
1289*de2caf28SDavid du Colombier 	"	#if defined(FULLSTACK) && defined(MA) && !defined(BFS)",
1290*de2caf28SDavid du Colombier 	"	 uchar proviso;",
1291*de2caf28SDavid du Colombier 	"	#endif",
1292*de2caf28SDavid du Colombier 	"	#ifndef BFS",
1293*de2caf28SDavid du Colombier 	"	 uchar  o_n, o_ot;	/* to save locals */",
1294*de2caf28SDavid du Colombier 	"	#endif",
1295*de2caf28SDavid du Colombier 	"	uchar  o_m;",
1296*de2caf28SDavid du Colombier 	"	#ifdef EVENT_TRACE",
1297*de2caf28SDavid du Colombier 	"		#if nstates_event<256",
1298*de2caf28SDavid du Colombier 	"		 uchar o_event;",
1299*de2caf28SDavid du Colombier 	"		#else",
1300*de2caf28SDavid du Colombier 	"		 unsigned short o_event;",
1301*de2caf28SDavid du Colombier 	"		#endif",
1302*de2caf28SDavid du Colombier 	"	#endif",
1303*de2caf28SDavid du Colombier 	"	#ifndef BFS",
1304*de2caf28SDavid du Colombier 	"		short o_To;",
1305*de2caf28SDavid du Colombier 	"		#if defined(T_RAND) || defined(RANDOMIZE)",
1306*de2caf28SDavid du Colombier 	"		 short oo_i;",
1307*de2caf28SDavid du Colombier 	"		#endif",
1308*de2caf28SDavid du Colombier 	"	#endif",
1309*de2caf28SDavid du Colombier 	"	#if defined(HAS_UNLESS) && !defined(BFS)",
1310*de2caf28SDavid du Colombier 	"	 int e_state;	/* if escape trans - state of origin */",
1311*de2caf28SDavid du Colombier 	"	#endif",
1312*de2caf28SDavid du Colombier 	"	#if (defined(FULLSTACK) && !defined(MA)) || defined(BFS) || (NCORE>1)",
1313*de2caf28SDavid du Colombier 	"	 H_el *ostate;	/* pointer to stored state */",
1314*de2caf28SDavid du Colombier 	"	#endif",
1315*de2caf28SDavid du Colombier 	/* CNTRSTACK when !NOREDUCE && BITSTATE && SAFETY && WS<=4, uses LL[] */
1316*de2caf28SDavid du Colombier 	"	#if defined(CNTRSTACK) && !defined(BFS)",
1317*de2caf28SDavid du Colombier 	"	 long	j6, j7;",
1318*de2caf28SDavid du Colombier 	"	#endif",
1319*de2caf28SDavid du Colombier 	"	Trans *o_t;",	/* transition fct, next state   */
1320*de2caf28SDavid du Colombier 
1321*de2caf28SDavid du Colombier 	"	#if !defined(BFS) && !defined(TRIX_ORIG)",
1322*de2caf28SDavid du Colombier 	"	 char *p_bup;",
1323*de2caf28SDavid du Colombier 	"	 char *q_bup;",
1324*de2caf28SDavid du Colombier 	"	#endif",
1325*de2caf28SDavid du Colombier 
1326*de2caf28SDavid du Colombier 	"	#ifdef BCS",
1327*de2caf28SDavid du Colombier 	"	 unsigned short sched_limit;",
1328*de2caf28SDavid du Colombier 	"	 unsigned char  bcs; /* phase 1 or 2, or forced 4 */",
1329*de2caf28SDavid du Colombier 	"	 unsigned char  b_pno; /* preferred pid */",
1330*de2caf28SDavid du Colombier 	"	#endif",
1331*de2caf28SDavid du Colombier 
1332*de2caf28SDavid du Colombier 	"	#ifdef P_RAND",	/* process scheduling randomization */
1333*de2caf28SDavid du Colombier 	"	 unsigned char p_left;	/* nr of procs left to explore */",
1334*de2caf28SDavid du Colombier 	"	 short p_skip;	/* to find starting point in list */",
1335*de2caf28SDavid du Colombier 	"	#endif",
1336*de2caf28SDavid du Colombier 
1337*de2caf28SDavid du Colombier 	"	#ifdef HAS_SORTED",
1338*de2caf28SDavid du Colombier 	"	 short ipt;",	/* insertion slot in q */
1339*de2caf28SDavid du Colombier 	"	#endif",
1340*de2caf28SDavid du Colombier 	"	#ifdef HAS_PRIORITY",
1341*de2caf28SDavid du Colombier 	"	 short o_priority;",
1342*de2caf28SDavid du Colombier 	"	#endif",
1343*de2caf28SDavid du Colombier 	"	union {",
1344*de2caf28SDavid du Colombier 	"	 int oval;",	/* single backup value of variable */
1345*de2caf28SDavid du Colombier 	"	 int *ovals;",	/* ptr to multiple values */
1346*de2caf28SDavid du Colombier 	"	} bup;",
1347*de2caf28SDavid du Colombier 	"}; /* end of struct Trail */",
1348*de2caf28SDavid du Colombier 	"",
1349*de2caf28SDavid du Colombier 	"#ifdef BFS",	/* breadth-first search */
1350*de2caf28SDavid du Colombier 	"	#define Q_PROVISO",
1351*de2caf28SDavid du Colombier 	"	#ifndef INLINE_REV",
1352*de2caf28SDavid du Colombier 	"		#define INLINE_REV",
1353*de2caf28SDavid du Colombier 	"	#endif",
1354*de2caf28SDavid du Colombier 	"",
1355*de2caf28SDavid du Colombier 	"typedef struct SV_Hold {",
1356*de2caf28SDavid du Colombier 	"	State *sv;",
1357*de2caf28SDavid du Colombier 	" #ifndef BFS_PAR",
1358*de2caf28SDavid du Colombier 	"	int  sz;",
1359*de2caf28SDavid du Colombier 	" #endif",
1360*de2caf28SDavid du Colombier 	"	struct SV_Hold *nxt;",
1361*de2caf28SDavid du Colombier 	"} SV_Hold;",
1362*de2caf28SDavid du Colombier 	"#if !defined(BFS_PAR) || NRUNS>0",
1363*de2caf28SDavid du Colombier 	"	typedef struct EV_Hold {",
1364*de2caf28SDavid du Colombier 	"	 #if !defined(BFS_PAR) || (!defined(NOCOMP) && !defined(HC) && NRUNS>0)",
1365*de2caf28SDavid du Colombier 	"		char *sv;	/* Mask */",
1366*de2caf28SDavid du Colombier 	"	 #endif",
1367*de2caf28SDavid du Colombier 	"	 #if VECTORSZ<65536",
1368*de2caf28SDavid du Colombier 	"		ushort sz;	/* vsize */",
1369*de2caf28SDavid du Colombier 	"	 #else",
1370*de2caf28SDavid du Colombier 	"		ulong  sz;",
1371*de2caf28SDavid du Colombier 	"	 #endif",
1372*de2caf28SDavid du Colombier 	"	 #ifdef BFS_PAR",
1373*de2caf28SDavid du Colombier 	"		uchar owner;",
1374*de2caf28SDavid du Colombier 	"	 #endif",
1375*de2caf28SDavid du Colombier 	"		uchar nrpr;",
1376*de2caf28SDavid du Colombier 	"		uchar nrqs;",
1377*de2caf28SDavid du Colombier 	"		#if !defined(BFS_PAR) || (!defined(TRIX) && NRUNS>0)",
1378*de2caf28SDavid du Colombier 	"			char *po, *qo;",
1379*de2caf28SDavid du Colombier 	"			char *ps, *qs;",
1380*de2caf28SDavid du Colombier 	"		#endif",
1381*de2caf28SDavid du Colombier 	"		struct EV_Hold *nxt;",
1382*de2caf28SDavid du Colombier 	"	} EV_Hold;",
1383*de2caf28SDavid du Colombier 	"#endif",
1384*de2caf28SDavid du Colombier 	"typedef struct BFS_State {",
1385*de2caf28SDavid du Colombier 	" #ifdef BFS_PAR",
1386*de2caf28SDavid du Colombier 	"	BFS_Trail *t_info;",
1387*de2caf28SDavid du Colombier 	"	State	*osv;",
1388*de2caf28SDavid du Colombier 	" #else",
1389*de2caf28SDavid du Colombier 	"	Trail	*frame;",
1390*de2caf28SDavid du Colombier 	"	SV_Hold *onow;",
1391*de2caf28SDavid du Colombier 	" #endif",
1392*de2caf28SDavid du Colombier 	" #if !defined(BFS_PAR) || NRUNS>0",
1393*de2caf28SDavid du Colombier 	"	EV_Hold *omask;",
1394*de2caf28SDavid du Colombier 	" #endif",
1395*de2caf28SDavid du Colombier 	" #if defined(Q_PROVISO) && !defined(NOREDUCE)",
1396*de2caf28SDavid du Colombier 	"	H_el *lstate;",
1397*de2caf28SDavid du Colombier 	" #endif",
1398*de2caf28SDavid du Colombier 	" #if !defined(BFS_PAR) || SYNC>0",
1399*de2caf28SDavid du Colombier 	"	short boq;",
1400*de2caf28SDavid du Colombier 	" #endif",
1401*de2caf28SDavid du Colombier 	" #ifdef VERBOSE",
1402*de2caf28SDavid du Colombier 	"	ulong nr;",
1403*de2caf28SDavid du Colombier 	" #endif",
1404*de2caf28SDavid du Colombier 	" #ifndef BFS_PAR",	/* new 6.2.4, 3 dec 2012 */
1405*de2caf28SDavid du Colombier 	"	struct BFS_State *nxt;",
1406*de2caf28SDavid du Colombier 	" #endif",
1407*de2caf28SDavid du Colombier 	"} BFS_State;",
1408*de2caf28SDavid du Colombier 	"#endif\n",
1409219b2ee8SDavid du Colombier 	0,
1410219b2ee8SDavid du Colombier };
14117dd7cddfSDavid du Colombier 
1412*de2caf28SDavid du Colombier static const char *SvMap[] = {
14137dd7cddfSDavid du Colombier 	"void",
14147dd7cddfSDavid du Colombier 	"to_compile(void)",
1415*de2caf28SDavid du Colombier 	"{	char ctd[2048], carg[128];",
14167dd7cddfSDavid du Colombier 	"#ifdef BITSTATE",
14177dd7cddfSDavid du Colombier 	"	strcpy(ctd, \"-DBITSTATE \");",
14187dd7cddfSDavid du Colombier 	"#else",
14197dd7cddfSDavid du Colombier 	"	strcpy(ctd, \"\");",
14207dd7cddfSDavid du Colombier 	"#endif",
1421*de2caf28SDavid du Colombier 	"#ifdef BFS_PAR",
1422*de2caf28SDavid du Colombier 	"	strcat(ctd, \"-DBFS_PAR \");",
1423*de2caf28SDavid du Colombier 	"#endif",
14247dd7cddfSDavid du Colombier 	"#ifdef NOVSZ",
14257dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DNOVSZ \");",
14267dd7cddfSDavid du Colombier 	"#endif",
1427*de2caf28SDavid du Colombier 	"#ifdef RHASH",
1428*de2caf28SDavid du Colombier 	"	strcat(ctd, \"-DRHASH \");",
1429*de2caf28SDavid du Colombier 	"#else",
1430*de2caf28SDavid du Colombier 	"	#ifdef PERMUTED",
1431*de2caf28SDavid du Colombier 	"		strcat(ctd, \"-DPERMUTED \");",
1432*de2caf28SDavid du Colombier 	"	#endif",
1433*de2caf28SDavid du Colombier 	"#endif",
1434*de2caf28SDavid du Colombier 	"#ifdef P_REVERSE",
1435*de2caf28SDavid du Colombier 	"	strcat(ctd, \"-DP_REVERSE \");",
143600d97012SDavid du Colombier 	"#endif",
143700d97012SDavid du Colombier 	"#ifdef T_REVERSE",
143800d97012SDavid du Colombier 	"	strcat(ctd, \"-DT_REVERSE \");",
143900d97012SDavid du Colombier 	"#endif",
144000d97012SDavid du Colombier 	"#ifdef T_RAND",
144100d97012SDavid du Colombier 	"	#if T_RAND>0",
144200d97012SDavid du Colombier 	"	sprintf(carg, \"-DT_RAND=%%d \", T_RAND);",
144300d97012SDavid du Colombier 	"	strcat(ctd, carg);",
144400d97012SDavid du Colombier 	"	#else",
144500d97012SDavid du Colombier 	"	strcat(ctd, \"-DT_RAND \");",
144600d97012SDavid du Colombier 	"	#endif",
144700d97012SDavid du Colombier 	"#endif",
144800d97012SDavid du Colombier 	"#ifdef P_RAND",
144900d97012SDavid du Colombier 	"	#if P_RAND>0",
145000d97012SDavid du Colombier 	"	sprintf(carg, \"-DP_RAND=%%d \", P_RAND);",
145100d97012SDavid du Colombier 	"	strcat(ctd, carg);",
145200d97012SDavid du Colombier 	"	#else",
145300d97012SDavid du Colombier 	"	strcat(ctd, \"-DP_RAND \");",
145400d97012SDavid du Colombier 	"	#endif",
145500d97012SDavid du Colombier 	"#endif",
145600d97012SDavid du Colombier 	"#ifdef BCS",
145700d97012SDavid du Colombier 	"	sprintf(carg, \"-DBCS=%%d \", BCS);",
145800d97012SDavid du Colombier 	"	strcat(ctd, carg);",
145900d97012SDavid du Colombier 	"#endif",
146000d97012SDavid du Colombier 	"#ifdef BFS",
146100d97012SDavid du Colombier 	"	strcat(ctd, \"-DBFS \");",
146200d97012SDavid du Colombier 	"#endif",
14637dd7cddfSDavid du Colombier 	"#ifdef MEMLIM",
14647dd7cddfSDavid du Colombier 	"	sprintf(carg, \"-DMEMLIM=%%d \", MEMLIM);",
14657dd7cddfSDavid du Colombier 	"	strcat(ctd, carg);",
1466312a1df1SDavid du Colombier 	"#else",
1467312a1df1SDavid du Colombier 	"#ifdef MEMCNT",
1468312a1df1SDavid du Colombier 	"	sprintf(carg, \"-DMEMCNT=%%d \", MEMCNT);",
1469312a1df1SDavid du Colombier 	"	strcat(ctd, carg);",
1470312a1df1SDavid du Colombier 	"#endif",
14717dd7cddfSDavid du Colombier 	"#endif",
14727dd7cddfSDavid du Colombier 	"#ifdef NOCLAIM",
14737dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DNOCLAIM \");",
14747dd7cddfSDavid du Colombier 	"#endif",
14757dd7cddfSDavid du Colombier 	"#ifdef SAFETY",
14767dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DSAFETY \");",
14777dd7cddfSDavid du Colombier 	"#else",
14787dd7cddfSDavid du Colombier 		"#ifdef NOFAIR",
14797dd7cddfSDavid du Colombier 		"	strcat(ctd, \"-DNOFAIR \");",
14807dd7cddfSDavid du Colombier 		"#else",
14817dd7cddfSDavid du Colombier 			"#ifdef NFAIR",
14827dd7cddfSDavid du Colombier 		"	if (NFAIR != 2)",
14837dd7cddfSDavid du Colombier 		"	{	sprintf(carg, \"-DNFAIR=%%d \", NFAIR);",
14847dd7cddfSDavid du Colombier 		"		strcat(ctd, carg);",
14857dd7cddfSDavid du Colombier 		"	}",
14867dd7cddfSDavid du Colombier 			"#endif",
14877dd7cddfSDavid du Colombier 		"#endif",
14887dd7cddfSDavid du Colombier 	"#endif",
14897dd7cddfSDavid du Colombier 	"#ifdef NOREDUCE",
14907dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DNOREDUCE \");",
14917dd7cddfSDavid du Colombier 	"#else",
14927dd7cddfSDavid du Colombier 		"#ifdef XUSAFE",
14937dd7cddfSDavid du Colombier 		"	strcat(ctd, \"-DXUSAFE \");",
14947dd7cddfSDavid du Colombier 		"#endif",
14957dd7cddfSDavid du Colombier 	"#endif",
14967dd7cddfSDavid du Colombier 	"#ifdef NP",
14977dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DNP \");",
14987dd7cddfSDavid du Colombier 	"#endif",
14997dd7cddfSDavid du Colombier 	"#ifdef PEG",
15007dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DPEG \");",
15017dd7cddfSDavid du Colombier 	"#endif",
15027dd7cddfSDavid du Colombier 	"#ifdef VAR_RANGES",
15037dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DVAR_RANGES \");",
15047dd7cddfSDavid du Colombier 	"#endif",
1505*de2caf28SDavid du Colombier 	"#ifdef HC",
1506*de2caf28SDavid du Colombier 	"	strcat(ctd, \"-DHC \");",
15077dd7cddfSDavid du Colombier 	"#endif",
15087dd7cddfSDavid du Colombier 	"#ifdef CHECK",
15097dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DCHECK \");",
15107dd7cddfSDavid du Colombier 	"#endif",
15117dd7cddfSDavid du Colombier 	"#ifdef CTL",
15127dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DCTL \");",
15137dd7cddfSDavid du Colombier 	"#endif",
151400d97012SDavid du Colombier 	"#ifdef TRIX",
151500d97012SDavid du Colombier 	"	strcat(ctd, \"-DTRIX \");",
151600d97012SDavid du Colombier 	"#endif",
15177dd7cddfSDavid du Colombier 	"#ifdef NIBIS",
15187dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DNIBIS \");",
15197dd7cddfSDavid du Colombier 	"#endif",
15207dd7cddfSDavid du Colombier 	"#ifdef NOBOUNDCHECK",
15217dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DNOBOUNDCHECK \");",
15227dd7cddfSDavid du Colombier 	"#endif",
15237dd7cddfSDavid du Colombier 	"#ifdef NOSTUTTER",
15247dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DNOSTUTTER \");",
15257dd7cddfSDavid du Colombier 	"#endif",
15267dd7cddfSDavid du Colombier 	"#ifdef REACH",
15277dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DREACH \");",
15287dd7cddfSDavid du Colombier 	"#endif",
15297dd7cddfSDavid du Colombier 	"#ifdef PRINTF",
15307dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DPRINTF \");",
15317dd7cddfSDavid du Colombier 	"#endif",
15327dd7cddfSDavid du Colombier 	"#ifdef COLLAPSE",
15337dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DCOLLAPSE \");",
15347dd7cddfSDavid du Colombier 	"#endif",
1535312a1df1SDavid du Colombier 	"#ifdef MA",
1536312a1df1SDavid du Colombier 	"	sprintf(carg, \"-DMA=%%d \", MA);",
1537312a1df1SDavid du Colombier 	"	strcat(ctd, carg);",
1538312a1df1SDavid du Colombier 	"#endif",
15397dd7cddfSDavid du Colombier 	"#ifdef SVDUMP",
15407dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DSVDUMP \");",
15417dd7cddfSDavid du Colombier 	"#endif",
154200d97012SDavid du Colombier 	"#if defined(VECTORSZ) && !defined(TRIX)",
15437dd7cddfSDavid du Colombier 	"	if (VECTORSZ != 1024)",
15447dd7cddfSDavid du Colombier 	"	{	sprintf(carg, \"-DVECTORSZ=%%d \", VECTORSZ);",
15457dd7cddfSDavid du Colombier 	"		strcat(ctd, carg);",
15467dd7cddfSDavid du Colombier 	"	}",
15477dd7cddfSDavid du Colombier 	"#endif",
15487dd7cddfSDavid du Colombier 	"#ifdef VERBOSE",
15497dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DVERBOSE \");",
15507dd7cddfSDavid du Colombier 	"#endif",
15517dd7cddfSDavid du Colombier 	"#ifdef CHECK",
15527dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DCHECK \");",
15537dd7cddfSDavid du Colombier 	"#endif",
15547dd7cddfSDavid du Colombier 	"#ifdef SDUMP",
15557dd7cddfSDavid du Colombier 	"	strcat(ctd, \"-DSDUMP \");",
15567dd7cddfSDavid du Colombier 	"#endif",
155700d97012SDavid du Colombier 	"#if NCORE>1",
155800d97012SDavid du Colombier 	"	sprintf(carg, \"-DNCORE=%%d \", NCORE);",
155900d97012SDavid du Colombier 	"	strcat(ctd, carg);",
156000d97012SDavid du Colombier 	"#endif",
156100d97012SDavid du Colombier 	"#ifdef VMAX",
156200d97012SDavid du Colombier 	"	if (VMAX != 256)",
156300d97012SDavid du Colombier 	"	{	sprintf(carg, \"-DVMAX=%%d \", VMAX);",
156400d97012SDavid du Colombier 	"		strcat(ctd, carg);",
156500d97012SDavid du Colombier 	"	}",
156600d97012SDavid du Colombier 	"#endif",
156700d97012SDavid du Colombier 	"#ifdef PMAX",
156800d97012SDavid du Colombier 	"	if (PMAX != 16)",
156900d97012SDavid du Colombier 	"	{	sprintf(carg, \"-DPMAX=%%d \", PMAX);",
157000d97012SDavid du Colombier 	"		strcat(ctd, carg);",
157100d97012SDavid du Colombier 	"	}",
157200d97012SDavid du Colombier 	"#endif",
157300d97012SDavid du Colombier 	"#ifdef QMAX",
157400d97012SDavid du Colombier 	"	if (QMAX != 16)",
157500d97012SDavid du Colombier 	"	{	sprintf(carg, \"-DQMAX=%%d \", QMAX);",
157600d97012SDavid du Colombier 	"		strcat(ctd, carg);",
157700d97012SDavid du Colombier 	"	}",
157800d97012SDavid du Colombier 	"#endif",
157900d97012SDavid du Colombier 	"#ifdef SET_WQ_SIZE",
158000d97012SDavid du Colombier 	"	sprintf(carg, \"-DSET_WQ_SIZE=%%d \", SET_WQ_SIZE);",
158100d97012SDavid du Colombier 	"	strcat(ctd, carg);",
15827dd7cddfSDavid du Colombier 	"#endif",
1583312a1df1SDavid du Colombier 	"	printf(\"Compiled as: cc -o pan %%span.c\\n\", ctd);",
15847dd7cddfSDavid du Colombier 	"}",
15857dd7cddfSDavid du Colombier 	0,
15867dd7cddfSDavid du Colombier };
1587