xref: /plan9-contrib/sys/src/cmd/spin/pangen5.h (revision de2caf28f9ba1a56e70be94a699435d36eb50311)
17dd7cddfSDavid du Colombier /***** spin: pangen5.h *****/
27dd7cddfSDavid 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  */
87dd7cddfSDavid du Colombier 
9*de2caf28SDavid du Colombier static const char *Xpt[] = {
10312a1df1SDavid du Colombier 	"#if defined(MA) && (defined(W_XPT) || defined(R_XPT))",
117dd7cddfSDavid du Colombier 	"static Vertex	**temptree;",
127dd7cddfSDavid du Colombier 	"static char	wbuf[4096];",
137dd7cddfSDavid du Colombier 	"static int	WCNT = 4096, wcnt=0;",
147dd7cddfSDavid du Colombier 	"static uchar	stacker[MA+1];",
157dd7cddfSDavid du Colombier 	"static ulong	stackcnt = 0;",
167dd7cddfSDavid du Colombier 	"extern double	nstates, nlinks, truncs, truncs2;",
177dd7cddfSDavid du Colombier 	"",
187dd7cddfSDavid du Colombier 	"static void",
197dd7cddfSDavid du Colombier 	"xwrite(int fd, char *b, int n)",
207dd7cddfSDavid du Colombier 	"{",
217dd7cddfSDavid du Colombier 	"	if (wcnt+n >= 4096)",
227dd7cddfSDavid du Colombier 	"	{	write(fd, wbuf, wcnt);",
237dd7cddfSDavid du Colombier 	"		wcnt = 0;",
247dd7cddfSDavid du Colombier 	"	}",
257dd7cddfSDavid du Colombier 	"	memcpy(&wbuf[wcnt], b, n);",
267dd7cddfSDavid du Colombier 	"	wcnt += n;",
277dd7cddfSDavid du Colombier 	"}",
287dd7cddfSDavid du Colombier 	"",
297dd7cddfSDavid du Colombier 	"static void",
30*de2caf28SDavid du Colombier 	"wclose(int fd)",
317dd7cddfSDavid du Colombier 	"{",
327dd7cddfSDavid du Colombier 	"	if (wcnt > 0)",
337dd7cddfSDavid du Colombier 	"		write(fd, wbuf, wcnt);",
347dd7cddfSDavid du Colombier 	"	wcnt = 0;",
357dd7cddfSDavid du Colombier 	"	close(fd);",
367dd7cddfSDavid du Colombier 	"}",
377dd7cddfSDavid du Colombier 	"",
387dd7cddfSDavid du Colombier 	"static void",
397dd7cddfSDavid du Colombier 	"w_vertex(int fd, Vertex *v)",
407dd7cddfSDavid du Colombier 	"{	char t[3]; int i; Edge *e;",
417dd7cddfSDavid du Colombier 	"",
427dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &v,  sizeof(Vertex *));",
437dd7cddfSDavid du Colombier 	"	t[0] = 0;",
447dd7cddfSDavid du Colombier 	"	for (i = 0; i < 2; i++)",
457dd7cddfSDavid du Colombier 	"		if (v->dst[i])",
467dd7cddfSDavid du Colombier 	"		{	t[1] = v->from[i], t[2] = v->to[i];",
477dd7cddfSDavid du Colombier 	"			xwrite(fd, t, 3);",
487dd7cddfSDavid du Colombier 	"			xwrite(fd, (char *) &(v->dst[i]), sizeof(Vertex *));",
497dd7cddfSDavid du Colombier 	"		}",
507dd7cddfSDavid du Colombier 	"	for (e = v->Succ; e; e = e->Nxt)",
517dd7cddfSDavid du Colombier 	"	{	t[1] = e->From, t[2] = e->To;",
527dd7cddfSDavid du Colombier 	"		xwrite(fd, t, 3);",
537dd7cddfSDavid du Colombier 	"		xwrite(fd, (char *) &(e->Dst), sizeof(Vertex *));",
547dd7cddfSDavid du Colombier 	"",
557dd7cddfSDavid du Colombier 	"		if (e->s)",
567dd7cddfSDavid du Colombier 	"		{	t[1] = t[2] = e->S;",
577dd7cddfSDavid du Colombier 	"			xwrite(fd, t, 3);",
587dd7cddfSDavid du Colombier 	"			xwrite(fd, (char *) &(e->Dst), sizeof(Vertex *));",
597dd7cddfSDavid du Colombier 	"	}	}",
607dd7cddfSDavid du Colombier 	"}",
617dd7cddfSDavid du Colombier 	"",
627dd7cddfSDavid du Colombier 	"static void",
637dd7cddfSDavid du Colombier 	"w_layer(int fd, Vertex *v)",
647dd7cddfSDavid du Colombier 	"{	uchar c=1;",
657dd7cddfSDavid du Colombier 	"",
667dd7cddfSDavid du Colombier 	"	if (!v) return;",
677dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &c, 1);",
687dd7cddfSDavid du Colombier 	"	w_vertex(fd, v);",
697dd7cddfSDavid du Colombier 	"	w_layer(fd, v->lnk);",
707dd7cddfSDavid du Colombier 	"	w_layer(fd, v->left);",
717dd7cddfSDavid du Colombier 	"	w_layer(fd, v->right);",
727dd7cddfSDavid du Colombier 	"}",
737dd7cddfSDavid du Colombier 	"",
747dd7cddfSDavid du Colombier 	"void",
757dd7cddfSDavid du Colombier 	"w_xpoint(void)",
767dd7cddfSDavid du Colombier 	"{	int fd; char nm[64];",
777dd7cddfSDavid du Colombier 	"	int i, j;  uchar c;",
787dd7cddfSDavid du Colombier 	"	static uchar xwarned = 0;",
797dd7cddfSDavid du Colombier 	"",
8000d97012SDavid du Colombier 	"	sprintf(nm, \"%%s.xpt\", PanSource);",
817dd7cddfSDavid du Colombier 	"	if ((fd = creat(nm, 0666)) <= 0)",
827dd7cddfSDavid du Colombier 	"	if (!xwarned)",
837dd7cddfSDavid du Colombier 	"	{	xwarned = 1;",
847dd7cddfSDavid du Colombier 	"		printf(\"cannot creat checkpoint file\\n\");",
857dd7cddfSDavid du Colombier 	"		return;",
867dd7cddfSDavid du Colombier 	"	}",
877dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &nstates, sizeof(double));",
887dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &truncs, sizeof(double));",
897dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &truncs2, sizeof(double));",
907dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &nlinks, sizeof(double));",
917dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &dfa_depth, sizeof(int));",
927dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &R,  sizeof(Vertex *));",
937dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &F,  sizeof(Vertex *));",
947dd7cddfSDavid du Colombier 	"	xwrite(fd, (char *) &NF, sizeof(Vertex *));",
957dd7cddfSDavid du Colombier 	"",
967dd7cddfSDavid du Colombier 	"	for (j = 0; j < TWIDTH; j++)",
977dd7cddfSDavid du Colombier 	"	for (i = 0; i < dfa_depth+1; i++)",
987dd7cddfSDavid du Colombier 	"	{	w_layer(fd, layers[i*TWIDTH+j]);",
997dd7cddfSDavid du Colombier 	"		c = 2; xwrite(fd, (char *) &c, 1);",
1007dd7cddfSDavid du Colombier 	"	}",
1017dd7cddfSDavid du Colombier 	"	wclose(fd);",
1027dd7cddfSDavid du Colombier 	"}",
1037dd7cddfSDavid du Colombier 	"",
1047dd7cddfSDavid du Colombier 	"static void",
1057dd7cddfSDavid du Colombier 	"xread(int fd, char *b, int n)",
1067dd7cddfSDavid du Colombier 	"{	int m = wcnt; int delta = 0;",
1077dd7cddfSDavid du Colombier 	"	if (m < n)",
1087dd7cddfSDavid du Colombier 	"	{	if (m > 0) memcpy(b, &wbuf[WCNT-m], m);",
1097dd7cddfSDavid du Colombier 	"		delta = m;",
1107dd7cddfSDavid du Colombier 	"		WCNT = wcnt = read(fd, wbuf, 4096);",
1117dd7cddfSDavid du Colombier 	"		if (wcnt < n-m)",
1127dd7cddfSDavid du Colombier 	"			Uerror(\"xread failed -- insufficient data\");",
1137dd7cddfSDavid du Colombier 	"		n -= m;",
1147dd7cddfSDavid du Colombier 	"	}",
1157dd7cddfSDavid du Colombier 	"	memcpy(&b[delta], &wbuf[WCNT-wcnt], n);",
1167dd7cddfSDavid du Colombier 	"	wcnt -= n;",
1177dd7cddfSDavid du Colombier 	"}",
1187dd7cddfSDavid du Colombier 	"",
1197dd7cddfSDavid du Colombier 	"static void",
1207dd7cddfSDavid du Colombier 	"x_cleanup(Vertex *c)",
1217dd7cddfSDavid du Colombier 	"{	Edge *e;	/* remove the tree and edges from c */",
1227dd7cddfSDavid du Colombier 	"	if (!c) return;",
1237dd7cddfSDavid du Colombier 	"	for (e = c->Succ; e; e = e->Nxt)",
1247dd7cddfSDavid du Colombier 	"		x_cleanup(e->Dst);",
1257dd7cddfSDavid du Colombier 	"	recyc_vertex(c);",
1267dd7cddfSDavid du Colombier 	"}",
1277dd7cddfSDavid du Colombier 	"",
1287dd7cddfSDavid du Colombier 	"static void",
1297dd7cddfSDavid du Colombier 	"x_remove(void)",
1307dd7cddfSDavid du Colombier 	"{	Vertex *tmp; int i, s;",
1317dd7cddfSDavid du Colombier 	"	int r, j;",
1327dd7cddfSDavid du Colombier 	"	/* double-check: */",
1337dd7cddfSDavid du Colombier 	"	stacker[dfa_depth-1] = 0; r = dfa_store(stacker);",
1347dd7cddfSDavid du Colombier 	"	stacker[dfa_depth-1] = 4; j = dfa_member(dfa_depth-1);",
1357dd7cddfSDavid du Colombier 	"	if (r != 1 || j != 0)",
136*de2caf28SDavid du Colombier 	"	{	printf(\"%%lu: \", stackcnt);",
1377dd7cddfSDavid du Colombier 	"		for (i = 0; i < dfa_depth; i++)",
1387dd7cddfSDavid du Colombier 	"			printf(\"%%d,\", stacker[i]);",
1397dd7cddfSDavid du Colombier 	"		printf(\" -- not a stackstate <o:%%d,4:%%d>\\n\", r, j);",
1407dd7cddfSDavid du Colombier 	"		return;",
1417dd7cddfSDavid du Colombier 	"	}",
1427dd7cddfSDavid du Colombier 	"	stacker[dfa_depth-1] = 1;",
1437dd7cddfSDavid du Colombier 	"	s = dfa_member(dfa_depth-1);",
1447dd7cddfSDavid du Colombier 	"",
1457dd7cddfSDavid du Colombier 	"	{ tmp = F; F = NF; NF = tmp; }	/* complement */",
1467dd7cddfSDavid du Colombier 	"		if (s) dfa_store(stacker);",
1477dd7cddfSDavid du Colombier 	"		stacker[dfa_depth-1] = 0;",
1487dd7cddfSDavid du Colombier 	"		dfa_store(stacker);",
1497dd7cddfSDavid du Colombier 	"		stackcnt++;",
1507dd7cddfSDavid du Colombier 	"	{ tmp = F; F = NF; NF = tmp; }",
1517dd7cddfSDavid du Colombier 	"}",
1527dd7cddfSDavid du Colombier 	"",
1537dd7cddfSDavid du Colombier 	"static void",
1547dd7cddfSDavid du Colombier 	"x_rm_stack(Vertex *t, int k)",
1557dd7cddfSDavid du Colombier 	"{	int j; Edge *e;",
1567dd7cddfSDavid du Colombier 	"",
1577dd7cddfSDavid du Colombier 	"	if (k == 0)",
1587dd7cddfSDavid du Colombier 	"	{	x_remove();",
1597dd7cddfSDavid du Colombier 	"		return;",
1607dd7cddfSDavid du Colombier 	"	}",
1617dd7cddfSDavid du Colombier 	"	if (t)",
1627dd7cddfSDavid du Colombier 	"	for (e = t->Succ; e; e = e->Nxt)",
1637dd7cddfSDavid du Colombier 	"	{	for (j = e->From; j <= (int) e->To; j++)",
1647dd7cddfSDavid du Colombier 	"		{	stacker[k] = (uchar) j;",
1657dd7cddfSDavid du Colombier 	"			x_rm_stack(e->Dst, k-1);",
1667dd7cddfSDavid du Colombier 	"		}",
1677dd7cddfSDavid du Colombier 	"		if (e->s)",
1687dd7cddfSDavid du Colombier 	"		{	stacker[k] = e->S;",
1697dd7cddfSDavid du Colombier 	"			x_rm_stack(e->Dst, k-1);",
1707dd7cddfSDavid du Colombier 	"	}	}",
1717dd7cddfSDavid du Colombier 	"}",
1727dd7cddfSDavid du Colombier 	"",
1737dd7cddfSDavid du Colombier 	"static Vertex *",
1747dd7cddfSDavid du Colombier 	"insert_withkey(Vertex *v, int L)",
1757dd7cddfSDavid du Colombier 	"{	Vertex *new, *t = temptree[L];",
1767dd7cddfSDavid du Colombier 	"",
1777dd7cddfSDavid du Colombier 	"	if (!t) { temptree[L] = v; return v; }",
1787dd7cddfSDavid du Colombier 	"	t = splay(v->key, t);",
1797dd7cddfSDavid du Colombier 	"	if (v->key < t->key)",
1807dd7cddfSDavid du Colombier 	"	{	new = v;",
1817dd7cddfSDavid du Colombier 	"		new->left = t->left;",
1827dd7cddfSDavid du Colombier 	"		new->right = t;",
1837dd7cddfSDavid du Colombier 	"		t->left = (Vertex *) 0;",
1847dd7cddfSDavid du Colombier 	"	} else if (v->key > t->key)",
1857dd7cddfSDavid du Colombier 	"	{	new = v;",
1867dd7cddfSDavid du Colombier 	"		new->right = t->right;",
1877dd7cddfSDavid du Colombier 	"		new->left = t;",
1887dd7cddfSDavid du Colombier 	"		t->right = (Vertex *) 0;",
1897dd7cddfSDavid du Colombier 	"	} else",
1907dd7cddfSDavid du Colombier 	"	{	if (t != R && t != F && t != NF)",
1917dd7cddfSDavid du Colombier 	"			Uerror(\"double insert, bad checkpoint data\");",
1927dd7cddfSDavid du Colombier 	"		else",
1937dd7cddfSDavid du Colombier 	"		{	recyc_vertex(v);",
1947dd7cddfSDavid du Colombier 	"			new = t;",
1957dd7cddfSDavid du Colombier 	"	}	}",
1967dd7cddfSDavid du Colombier 	"	temptree[L] = new;",
1977dd7cddfSDavid du Colombier 	"",
1987dd7cddfSDavid du Colombier 	"	return new;",
1997dd7cddfSDavid du Colombier 	"}",
2007dd7cddfSDavid du Colombier 	"",
2017dd7cddfSDavid du Colombier 	"static Vertex *",
2027dd7cddfSDavid du Colombier 	"find_withkey(Vertex *v, int L)",
2037dd7cddfSDavid du Colombier 	"{	Vertex *t = temptree[L];",
2047dd7cddfSDavid du Colombier 	"	if (t)",
2057dd7cddfSDavid du Colombier 	"	{	temptree[L] = t = splay((ulong) v, t);",
2067dd7cddfSDavid du Colombier 	"		if (t->key == (ulong) v)",
2077dd7cddfSDavid du Colombier 	"			return t;",
2087dd7cddfSDavid du Colombier 	"	}",
2097dd7cddfSDavid du Colombier 	"	Uerror(\"not found error, bad checkpoint data\");",
2107dd7cddfSDavid du Colombier 	"	return (Vertex *) 0;",
2117dd7cddfSDavid du Colombier 	"}",
2127dd7cddfSDavid du Colombier 	"",
2137dd7cddfSDavid du Colombier 	"void",
2147dd7cddfSDavid du Colombier 	"r_layer(int fd, int n)",
2157dd7cddfSDavid du Colombier 	"{	Vertex *v;",
2167dd7cddfSDavid du Colombier 	"	Edge *e;",
2177dd7cddfSDavid du Colombier 	"	char c, t[2];",
2187dd7cddfSDavid du Colombier 	"",
2197dd7cddfSDavid du Colombier 	"	for (;;)",
2207dd7cddfSDavid du Colombier 	"	{	xread(fd, &c, 1);",
2217dd7cddfSDavid du Colombier 	"		if (c == 2) break;",
2227dd7cddfSDavid du Colombier 	"		if (c == 1)",
2237dd7cddfSDavid du Colombier 	"		{	v = new_vertex();",
2247dd7cddfSDavid du Colombier 	"			xread(fd, (char *) &(v->key), sizeof(Vertex *));",
2257dd7cddfSDavid du Colombier 	"			v = insert_withkey(v, n);",
2267dd7cddfSDavid du Colombier 	"		} else	/* c == 0 */",
2277dd7cddfSDavid du Colombier 	"		{	e = new_edge((Vertex *) 0);",
2287dd7cddfSDavid du Colombier 	"			xread(fd, t, 2);",
2297dd7cddfSDavid du Colombier 	"			e->From = t[0];",
2307dd7cddfSDavid du Colombier 	"			e->To = t[1];",
2317dd7cddfSDavid du Colombier 	"			xread(fd, (char *) &(e->Dst), sizeof(Vertex *));",
2327dd7cddfSDavid du Colombier 	"			insert_edge(v, e);",
2337dd7cddfSDavid du Colombier 	"	}	}",
2347dd7cddfSDavid du Colombier 	"}",
2357dd7cddfSDavid du Colombier 	"",
2367dd7cddfSDavid du Colombier 	"static void",
2377dd7cddfSDavid du Colombier 	"v_fix(Vertex *t, int nr)",
2387dd7cddfSDavid du Colombier 	"{	int i; Edge *e;",
2397dd7cddfSDavid du Colombier 	"",
2407dd7cddfSDavid du Colombier 	"	if (!t) return;",
2417dd7cddfSDavid du Colombier 	"",
2427dd7cddfSDavid du Colombier 	"	for (i = 0; i < 2; i++)",
2437dd7cddfSDavid du Colombier 	"	if (t->dst[i])",
2447dd7cddfSDavid du Colombier 	"		t->dst[i] = find_withkey(t->dst[i], nr);",
2457dd7cddfSDavid du Colombier 	"",
2467dd7cddfSDavid du Colombier 	"	for (e = t->Succ; e; e = e->Nxt)",
2477dd7cddfSDavid du Colombier 	"		e->Dst = find_withkey(e->Dst, nr);",
2487dd7cddfSDavid du Colombier 	"		",
2497dd7cddfSDavid du Colombier 	"	v_fix(t->left, nr);",
2507dd7cddfSDavid du Colombier 	"	v_fix(t->right, nr);",
2517dd7cddfSDavid du Colombier 	"}",
2527dd7cddfSDavid du Colombier 	"",
2537dd7cddfSDavid du Colombier 	"static void",
2547dd7cddfSDavid du Colombier 	"v_insert(Vertex *t, int nr)",
2557dd7cddfSDavid du Colombier 	"{	Edge *e; int i;",
2567dd7cddfSDavid du Colombier 	"",
2577dd7cddfSDavid du Colombier 	"	if (!t) return;",
2587dd7cddfSDavid du Colombier 	"	v_insert(t->left, nr);",
2597dd7cddfSDavid du Colombier 	"	v_insert(t->right, nr);",
2607dd7cddfSDavid du Colombier 	"",
2617dd7cddfSDavid du Colombier 	"	/* remove only leafs from temptree */",
2627dd7cddfSDavid du Colombier 	"	t->left = t->right = t->lnk = (Vertex *) 0;",
2637dd7cddfSDavid du Colombier 	"	insert_it(t, nr);	/* into layers */",
2647dd7cddfSDavid du Colombier 	"	for (i = 0; i < 2; i++)",
2657dd7cddfSDavid du Colombier 	"		if (t->dst[i])",
2667dd7cddfSDavid du Colombier 	"			t->dst[i]->num += (t->to[i] - t->from[i] + 1);",
2677dd7cddfSDavid du Colombier 	"	for (e = t->Succ; e; e = e->Nxt)",
2687dd7cddfSDavid du Colombier 	"		e->Dst->num += (e->To - e->From + 1 + e->s);",
2697dd7cddfSDavid du Colombier 	"}",
2707dd7cddfSDavid du Colombier 	"",
2717dd7cddfSDavid du Colombier 	"static void",
2727dd7cddfSDavid du Colombier 	"x_fixup(void)",
2737dd7cddfSDavid du Colombier 	"{	int i;",
2747dd7cddfSDavid du Colombier 	"",
2757dd7cddfSDavid du Colombier 	"	for (i = 0; i < dfa_depth; i++)",
2767dd7cddfSDavid du Colombier 	"		v_fix(temptree[i], (i+1));",
2777dd7cddfSDavid du Colombier 	"",
2787dd7cddfSDavid du Colombier 	"	for (i = dfa_depth; i >= 0; i--)",
2797dd7cddfSDavid du Colombier 	"		v_insert(temptree[i], i);",
2807dd7cddfSDavid du Colombier 	"}",
2817dd7cddfSDavid du Colombier 	"",
2827dd7cddfSDavid du Colombier 	"static Vertex *",
2837dd7cddfSDavid du Colombier 	"x_tail(Vertex *t, ulong want)",
2847dd7cddfSDavid du Colombier 	"{	int i, yes, no; Edge *e; Vertex *v = (Vertex *) 0;",
2857dd7cddfSDavid du Colombier 	"",
2867dd7cddfSDavid du Colombier 	"	if (!t) return v;",
2877dd7cddfSDavid du Colombier 	"",
2887dd7cddfSDavid du Colombier 	"	yes = no = 0;",
2897dd7cddfSDavid du Colombier 	"	for (i = 0; i < 2; i++)",
2907dd7cddfSDavid du Colombier 	"		if ((ulong) t->dst[i] == want)",
291312a1df1SDavid du Colombier 	"		{	/* was t->from[i] <= 0 && t->to[i] >= 0 */",
292312a1df1SDavid du Colombier 	"			/* but from and to are uchar */",
293312a1df1SDavid du Colombier 	"			if (t->from[i] == 0)",
2947dd7cddfSDavid du Colombier 	"				yes = 1;",
2957dd7cddfSDavid du Colombier 	"			else",
2967dd7cddfSDavid du Colombier 	"			if (t->from[i] <= 4 && t->to[i] >= 4)",
2977dd7cddfSDavid du Colombier 	"				no = 1;",
2987dd7cddfSDavid du Colombier 	"		}",
2997dd7cddfSDavid du Colombier 	"",
3007dd7cddfSDavid du Colombier 	"	for (e = t->Succ; e; e = e->Nxt)",
3017dd7cddfSDavid du Colombier 	"		if ((ulong) e->Dst == want)",
302312a1df1SDavid du Colombier 	"		{	/* was INRANGE(e,0) but From and To are uchar */",
303312a1df1SDavid du Colombier 	"			if ((e->From == 0) || (e->s==1 && e->S==0))",
3047dd7cddfSDavid du Colombier 	"				yes = 1;",
3057dd7cddfSDavid du Colombier 	"			else if (INRANGE(e, 4))",
3067dd7cddfSDavid du Colombier 	"				no = 1;",
3077dd7cddfSDavid du Colombier 	"		}",
3087dd7cddfSDavid du Colombier 	"	if (yes && !no) return t;",
3097dd7cddfSDavid du Colombier 	"	v = x_tail(t->left, want);  if (v) return v;",
3107dd7cddfSDavid du Colombier 	"	v = x_tail(t->right, want); if (v) return v;",
3117dd7cddfSDavid du Colombier 	"	return (Vertex *) 0;",
3127dd7cddfSDavid du Colombier 	"}",
3137dd7cddfSDavid du Colombier 	"",
3147dd7cddfSDavid du Colombier 	"static void",
3157dd7cddfSDavid du Colombier 	"x_anytail(Vertex *t, Vertex *c, int nr)",
3167dd7cddfSDavid du Colombier 	"{	int i; Edge *e, *f; Vertex *v;",
3177dd7cddfSDavid du Colombier 	"",
3187dd7cddfSDavid du Colombier 	"	if (!t) return;",
3197dd7cddfSDavid du Colombier 	"",
3207dd7cddfSDavid du Colombier 	"	for (i = 0; i < 2; i++)",
3217dd7cddfSDavid du Colombier 	"		if ((ulong) t->dst[i] == c->key)",
3227dd7cddfSDavid du Colombier 	"		{	v = new_vertex(); v->key = t->key;",
3237dd7cddfSDavid du Colombier 	"			f = new_edge(v);",
3247dd7cddfSDavid du Colombier 	"			f->From = t->from[i];",
3257dd7cddfSDavid du Colombier 	"			f->To = t->to[i];",
3267dd7cddfSDavid du Colombier 	"			f->Nxt = c->Succ;",
3277dd7cddfSDavid du Colombier 	"			c->Succ = f;",
3287dd7cddfSDavid du Colombier 	"			if (nr > 0)",
3297dd7cddfSDavid du Colombier 	"			x_anytail(temptree[nr-1], v, nr-1);",
3307dd7cddfSDavid du Colombier 	"		}",
3317dd7cddfSDavid du Colombier 	"",
3327dd7cddfSDavid du Colombier 	"	for (e = t->Succ; e; e = e->Nxt)",
3337dd7cddfSDavid du Colombier 	"		if ((ulong) e->Dst == c->key)",
3347dd7cddfSDavid du Colombier 	"		{	v = new_vertex(); v->key = t->key;",
3357dd7cddfSDavid du Colombier 	"			f = new_edge(v);",
3367dd7cddfSDavid du Colombier 	"			f->From = e->From;",
3377dd7cddfSDavid du Colombier 	"			f->To = e->To;",
3387dd7cddfSDavid du Colombier 	"			f->s = e->s;",
3397dd7cddfSDavid du Colombier 	"			f->S = e->S;",
3407dd7cddfSDavid du Colombier 	"			f->Nxt = c->Succ;",
3417dd7cddfSDavid du Colombier 	"			c->Succ = f;",
3427dd7cddfSDavid du Colombier 	"			x_anytail(temptree[nr-1], v, nr-1);",
3437dd7cddfSDavid du Colombier 	"		}",
3447dd7cddfSDavid du Colombier 	"",
3457dd7cddfSDavid du Colombier 	"	x_anytail(t->left, c, nr);",
3467dd7cddfSDavid du Colombier 	"	x_anytail(t->right, c, nr);",
3477dd7cddfSDavid du Colombier 	"}",
3487dd7cddfSDavid du Colombier 	"",
3497dd7cddfSDavid du Colombier 	"static Vertex *",
3507dd7cddfSDavid du Colombier 	"x_cpy_rev(void)",
351312a1df1SDavid du Colombier 	"{	Vertex *c, *v;	/* find 0 and !4 predecessor of F */",
3527dd7cddfSDavid du Colombier 	"",
3537dd7cddfSDavid du Colombier 	"	v = x_tail(temptree[dfa_depth-1], F->key);",
3547dd7cddfSDavid du Colombier 	"	if (!v) return (Vertex *) 0;",
3557dd7cddfSDavid du Colombier 	"",
3567dd7cddfSDavid du Colombier 	"	c = new_vertex(); c->key = v->key;",
3577dd7cddfSDavid du Colombier 	"",
3587dd7cddfSDavid du Colombier 	"	/* every node on dfa_depth-2 that has v->key as succ */",
3597dd7cddfSDavid du Colombier 	"	/* make copy and let c point to these (reversing ptrs) */",
3607dd7cddfSDavid du Colombier 	"",
3617dd7cddfSDavid du Colombier 	"	x_anytail(temptree[dfa_depth-2], c, dfa_depth-2);",
3627dd7cddfSDavid du Colombier 	" ",
3637dd7cddfSDavid du Colombier 	"	return c;",
3647dd7cddfSDavid du Colombier 	"}",
3657dd7cddfSDavid du Colombier 	"",
3667dd7cddfSDavid du Colombier 	"void",
3677dd7cddfSDavid du Colombier 	"r_xpoint(void)",
3687dd7cddfSDavid du Colombier 	"{	int fd; char nm[64]; Vertex *d;",
3697dd7cddfSDavid du Colombier 	"	int i, j;",
3707dd7cddfSDavid du Colombier 	"",
3717dd7cddfSDavid du Colombier 	"	wcnt = 0;",
37200d97012SDavid du Colombier 	"	sprintf(nm, \"%%s.xpt\", PanSource);",
3737dd7cddfSDavid du Colombier 	"	if ((fd = open(nm, 0)) < 0)	/* O_RDONLY */",
3747dd7cddfSDavid du Colombier 	"		Uerror(\"cannot open checkpoint file\");",
3757dd7cddfSDavid du Colombier 	"",
3767dd7cddfSDavid du Colombier 	"	xread(fd, (char *) &nstates,   sizeof(double));",
3777dd7cddfSDavid du Colombier 	"	xread(fd, (char *) &truncs,    sizeof(double));",
3787dd7cddfSDavid du Colombier 	"	xread(fd, (char *) &truncs2,   sizeof(double));",
3797dd7cddfSDavid du Colombier 	"	xread(fd, (char *) &nlinks,    sizeof(double));",
3807dd7cddfSDavid du Colombier 	"	xread(fd, (char *) &dfa_depth, sizeof(int));",
3817dd7cddfSDavid du Colombier 	"",
3827dd7cddfSDavid du Colombier 	"	if (dfa_depth != MA+a_cycles)",
3837dd7cddfSDavid du Colombier 	"		Uerror(\"bad dfa_depth in checkpoint file\");",
3847dd7cddfSDavid du Colombier 	"",
3857dd7cddfSDavid du Colombier 	"	path	  = (Vertex **) emalloc((dfa_depth+1)*sizeof(Vertex *));",
3867dd7cddfSDavid du Colombier 	"	layers	  = (Vertex **) emalloc(TWIDTH*(dfa_depth+1)*sizeof(Vertex *));",
3877dd7cddfSDavid du Colombier 	"	temptree  = (Vertex **) emalloc((dfa_depth+2)*sizeof(Vertex *));",
3887dd7cddfSDavid du Colombier 	"	lastword  = (uchar *)   emalloc((dfa_depth+1)*sizeof(uchar));",
3897dd7cddfSDavid du Colombier 	"	lastword[dfa_depth] = lastword[0] = 255; ",
3907dd7cddfSDavid du Colombier 	"",
3917dd7cddfSDavid du Colombier 	"	path[0] = R = new_vertex();",
3927dd7cddfSDavid du Colombier 	"	xread(fd, (char *) &R->key, sizeof(Vertex *));",
3937dd7cddfSDavid du Colombier 	"	R = insert_withkey(R, 0);",
3947dd7cddfSDavid du Colombier 	"",
3957dd7cddfSDavid du Colombier 	"	F = new_vertex();",
3967dd7cddfSDavid du Colombier 	"	xread(fd, (char *) &F->key, sizeof(Vertex *));",
3977dd7cddfSDavid du Colombier 	"	F = insert_withkey(F, dfa_depth);",
3987dd7cddfSDavid du Colombier 	"",
3997dd7cddfSDavid du Colombier 	"	NF = new_vertex();",
4007dd7cddfSDavid du Colombier 	"	xread(fd, (char *) &NF->key, sizeof(Vertex *));",
4017dd7cddfSDavid du Colombier 	"	NF = insert_withkey(NF, dfa_depth);",
4027dd7cddfSDavid du Colombier 	"",
4037dd7cddfSDavid du Colombier 	"	for (j = 0; j < TWIDTH; j++)",
4047dd7cddfSDavid du Colombier 	"	for (i = 0; i < dfa_depth+1; i++)",
4057dd7cddfSDavid du Colombier 	"		r_layer(fd, i);",
4067dd7cddfSDavid du Colombier 	"",
4077dd7cddfSDavid du Colombier 	"	if (wcnt != 0) Uerror(\"bad count in checkpoint file\");",
4087dd7cddfSDavid du Colombier 	"",
4097dd7cddfSDavid du Colombier 	"	d = x_cpy_rev();",
4107dd7cddfSDavid du Colombier 	"	x_fixup();",
4117dd7cddfSDavid du Colombier 	"	stacker[dfa_depth-1] = 0;",
4127dd7cddfSDavid du Colombier 	"	x_rm_stack(d, dfa_depth-2);",
4137dd7cddfSDavid du Colombier 	"	x_cleanup(d);",
4147dd7cddfSDavid du Colombier 	"	close(fd);",
4157dd7cddfSDavid du Colombier 	"",
416*de2caf28SDavid du Colombier 	"	printf(\"pan: removed %%lu stackstates\\n\", stackcnt);",
4177dd7cddfSDavid du Colombier 	"	nstates -= (double) stackcnt;",
4187dd7cddfSDavid du Colombier 	"}",
4197dd7cddfSDavid du Colombier 	"#endif",
4207dd7cddfSDavid du Colombier 	0,
4217dd7cddfSDavid du Colombier };
422