⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pangen2.h

📁 对软件进行可达性测试的软件
💻 H
📖 第 1 页 / 共 2 页
字号:
	"#ifdef HAS_UNLESS",	"	int p;",	"#endif",	"	if (state_tables >= 4)",	"	{	printf(\"STEP 1 proctype %%s\\n\", ",	"			procname[n]);",	"		for (i = 1; i < m; i++)",	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"			crack(n, i, T0, srcln);",	"		return;",	"	}",	"	do {",	"		for (i = 1, cnt = 0; i < m; i++)",	"		{	T2 = trans[n][i];",	"			T1 = T2?T2->nxt:(Trans *)0;",	"/* prescan: */		for (T0 = T1; T0; T0 = T0->nxt)",	"/* choice in choice */	{	if (T0->st && trans[n][T0->st]",	"				&&  trans[n][T0->st]->nxt)",	"					break;",	"			}",	"#if 0",	"		if (T0)",	"		printf(\"\\tstate %%d / %%d: choice in choice\\n\",",	"		i, T0->st);",	"#endif",	"			if (T0)",	"			for (T0 = T1; T0; T0 = T0->nxt)",	"			{	T3 = trans[n][T0->st];",	"				if (!T3->nxt)",	"				{	T2->nxt = cpytr(T0);",	"					T2 = T2->nxt;",	"					imed(T2, T0->st, n, i);",	"					continue;",	"				}",	"				do {	T3 = T3->nxt;",	"					T2->nxt = cpytr(T3);",	"					T2 = T2->nxt;",	"					imed(T2, T0->st, n, i);",	"				} while (T3->nxt);",	"				cnt++;",	"			}",	"		}",	"	} while (cnt);",	"	if (state_tables >= 3)",	"	{	printf(\"STEP 2 proctype %%s\\n\", ",	"			procname[n]);",	"		for (i = 1; i < m; i++)",	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"			crack(n, i, T0, srcln);",	"		return;",	"	}",	"	for (i = 1; i < m; i++)",	"	{	if (trans[n][i] && trans[n][i]->nxt) /* optimize */",	"		{	T1 = trans[n][i]->nxt;",	"#if 0",	"			printf(\"\\t\\tpull %%d (%%d) to %%d\\n\",",	"			T1->st, T1->forw, i);",	"#endif",	"			if (!trans[n][T1->st]) continue;",	"			T0 = cpytr(trans[n][T1->st]);",	"			trans[n][i] = T0;",	"			reach[T1->st] = 1;",	"			imed(T0, T1->st, n, i);",	"			for (T1 = T1->nxt; T1; T1 = T1->nxt)",	"			{",	"#if 0",	"			printf(\"\\t\\tpull %%d (%%d) to %%d\\n\",",	"				T1->st, T1->forw, i);",	"#endif",	"				if (!trans[n][T1->st]) continue;",	"				T0->nxt = cpytr(trans[n][T1->st]);",	"				T0 = T0->nxt;",	"				reach[T1->st] = 1;",	"				imed(T0, T1->st, n, i);",	"	}	}	}",	"	if (state_tables >= 2)",	"	{	printf(\"STEP 3 proctype %%s\\n\", ",	"			procname[n]);",	"		for (i = 1; i < m; i++)",	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"			crack(n, i, T0, srcln);",	"		return;",	"	}",	"#ifdef HAS_UNLESS",	"	for (i = 1; i < m; i++)",	"	{	if (!trans[n][i]) continue;",	"		/* check for each state i if an",	"		 * escape to some state p is defined",	"		 * if so, copy and mark p's transitions",	"		 * and prepend them to the transition-",	"		 * list of state i",	"		 */",	" if (!like_java) /* the default */",	" {		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"		for (k = HAS_UNLESS-1; k >= 0; k--)",	"		{	if (p = T0->escp[k])",	"			for (T1 = trans[n][p]; T1; T1 = T1->nxt)",	"			{	if (isthere(trans[n][i], T1->t_id))",	"					continue;",	"				T2 = cpytr(T1);",	"				T2->e_trans = p;",	"				T2->nxt = trans[n][i];",	"				trans[n][i] = T2;",	"		}	}",	" } else /* outermost unless checked first */",	" {		Trans *T4;",	"		T4 = T3 = (Trans *) 0;",	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"		for (k = HAS_UNLESS-1; k >= 0; k--)",	"		{	if (p = T0->escp[k])",	"			for (T1 = trans[n][p]; T1; T1 = T1->nxt)",	"			{	if (isthere(trans[n][i], T1->t_id))",	"					continue;",	"				T2 = cpytr(T1);",	"				T2->nxt = (Trans *) 0;",	"				T2->e_trans = p;",	"				if (T3)	T3->nxt = T2;",	"				else	T4 = T2;",	"				T3 = T2;",	"		}	}",	"		if (T4)",	"		{	T3->nxt = trans[n][i];",	"			trans[n][i] = T4;",	"		}",	" }",	"	}",	"#endif",	"#ifndef NOREDUCE",	"	for (i = 1; i < m; i++)",	"	{",	"		if (a_cycles)",	"		{ /* moves through these states are visible */",	"#if PROG_LAB>0 && defined(HAS_NP)",	"			if (progstate[n][i])",	"				goto degrade;",	"			for (T1 = trans[n][i]; T1; T1 = T1->nxt)",	"				if (progstate[n][T1->st])",	"					goto degrade;",	"#endif",	"			if (accpstate[n][i] || visstate[n][i])",	"				goto degrade;",	"			for (T1 = trans[n][i]; T1; T1 = T1->nxt)",	"				if (accpstate[n][T1->st])",	"					goto degrade;",	"		}",	"		T1 = trans[n][i];",	"		if (!T1) continue;",	"		g = mark_safety(T1);	/* V3.3.1 */",	"		if (g < 0) goto degrade; /* global */",	"		/* check if mixing of guards preserves reduction */",	"		if (T1->nxt)",	"		{	k = 0;",	"			for (T0 = T1; T0; T0 = T0->nxt)",	"			{	if (!(T0->atom&8))",	"					goto degrade;",	"				for (aa = 0; aa < 2; aa++)",	"				{	j = srinc_set(T0->tpe[aa]);",	"					if (j >= GLOBAL && j != ALPHA_F)",	"						goto degrade;",	"					if (T0->tpe[aa]",	"					&&  T0->tpe[aa]",	"					!=  T1->tpe[0])",	"						k = 1;",	"			}	}",	"			/* g = 0;	V3.3.1 */",	"			if (k)	/* non-uniform selection */",	"			for (T0 = T1; T0; T0 = T0->nxt)",	"			for (aa = 0; aa < 2; aa++)",	"			{	j = srinc_set(T0->tpe[aa]);",	"				if (j != LOCAL)",	"				{	k = srunc(T0->tpe[aa], j);",	"					for (h = 0; h < 6; h++)",	"						if (T1->qu[h] == k",	"						&&  T1->ty[h] == j)",	"							break;",	"					if (h >= 6)",	"					{	T1->qu[g%%6] = k;",	"						T1->ty[g%%6] = j;",	"						g++;",	"			}	}	}",	"			if (g > 6)",	"			{	T1->qu[0] = 0;	/* turn it off */",	"				printf(\"pan: warning, line %%d, \",",	"					srcln[i]);",	"			 	printf(\"too many stmnt types (%%d)\",",	"					g);",	"			  	printf(\" in selection\\n\");",	"			  goto degrade;",	"			}",	"		}",	"		/* mark all options global if >=1 is global */",	"		for (T1 = trans[n][i]; T1; T1 = T1->nxt)",	"			if (!(T1->atom&8)) break;",	"		if (T1)",	"degrade:	for (T1 = trans[n][i]; T1; T1 = T1->nxt)",	"			T1->atom &= ~8;	/* mark as unsafe */",	"		/* can only mix 'r's or 's's if on same chan */",	"		/* and not mixed with other local operations */",	"		T1 = trans[n][i];",	"		if (!T1 || T1->qu[0]) continue;",	"		j = T1->tpe[0];",	"		if (T1->nxt && T1->atom&8)",	"		{ if (j == 5*DELTA)",	"		  {	printf(\"warning: line %%d \", srcln[i]);",	"			printf(\"mixed condition \");",	"			printf(\"(defeats reduction)\\n\");",	"			goto degrade;",	"		  }",	"		  for (T0 = T1; T0; T0 = T0->nxt)",	"		  for (aa = 0; aa < 2; aa++)",	"		  if  (T0->tpe[aa] && T0->tpe[aa] != j)",	"		  {	printf(\"warning: line %%d \", srcln[i]);",	"			printf(\"[%%d-%%d] mixed %%stion \",",	"				T0->tpe[aa], j, ",	"				(j==5*DELTA)?\"condi\":\"selec\");",	"			printf(\"(defeats reduction)\\n\");",	"			printf(\"	'%%s' <-> '%%s'\\n\",",	"				T1->tp, T0->tp);",	"			goto degrade;",	"		} }",	"	}",	"#endif",	"	for (i = 1; i < m; i++)",	/* R */	"	{	T2 = trans[n][i];",	"		if (!T2",	"		||  T2->nxt",	"		||  strncmp(T2->tp, \".(goto)\", 7)",	"		||  !stopstate[n][i])",	"			continue;",	"		stopstate[n][T2->st] = 1;",	"	}",	"	if (state_tables)",	"	{	printf(\"proctype \");",	"		if (!strcmp(procname[n], \":init:\"))",	"			printf(\"init\\n\");",	"		else",	"			printf(\"%%s\\n\", procname[n]);",	"		for (i = 1; i < m; i++)",	"			reach[i] = 1;",	"		tagtable(n, m, is, srcln, reach);",	"	} else",	"	for (i = 1; i < m; i++)",	"	{	int nrelse;",	"		if (strcmp(procname[n], \":never:\") != 0)",	"		{	for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"			{	if (T0->st == i",	"				&& strcmp(T0->tp, \"(1)\") == 0)",	"				{	printf(\"error: proctype '%%s' \",",	"						procname[n]);",	"		  			printf(\"line %%d, state %%d: has un\",",	"						srcln[i], i);",	"					printf(\"conditional self-loop\\n\");",	"					pan_exit(1);",	"		}	}	}",	"		nrelse = 0;",	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"		{	if (strcmp(T0->tp, \"else\") == 0)",	"				nrelse++;",	"		}",	"		if (nrelse > 1)",	"		{	printf(\"error: proctype '%%s' state\",",	"				procname[n]);",	"		  	printf(\" %%d, inherits %%d\", i, nrelse);",	"		  	printf(\" 'else' stmnts\\n\");",	"			pan_exit(1);",	"	}	}",	"	if (!state_tables && strcmp(procname[n], \":never:\") == 0)",	"	{	int h = 0;",	"		for (i = 1; i < m; i++)",	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"			if (T0->forw > h) h = T0->forw;",	"		h++;",	"		frm_st0 = (short *) emalloc(h * sizeof(short));",	"		for (i = 1; i < m; i++)",	"		for (T0 = trans[n][i]; T0; T0 = T0->nxt)",	"			frm_st0[T0->forw] = i;",	"	}",	"#ifndef LOOPSTATE",	"	if (state_tables)",	"#endif",	"	do_dfs(n, m, is, srcln, reach, lstate);",	"}",	"void",	"imed(Trans *T, int v, int n, int j)	/* set intermediate state */",	"{	progstate[n][T->st] |= progstate[n][v];",	"	accpstate[n][T->st] |= accpstate[n][v];",	"	stopstate[n][T->st] |= stopstate[n][v];",	"	mapstate[n][j] = T->st;",	"}",	"void",	"tagtable(int n, int m, int is, short srcln[], uchar reach[])",	"{	Trans *z;\n",	"	if (is >= m || !trans[n][is]",	"	||  is <= 0 || reach[is] == 0)",	"		return;",	"	reach[is] = 0;",	"	if (state_tables)",	"	for (z = trans[n][is]; z; z = z->nxt)",	"		crack(n, is, z, srcln);",	"	for (z = trans[n][is]; z; z = z->nxt)",	"	{",	"#ifdef HAS_UNLESS",	"		int i, j;",	"#endif",	"		tagtable(n, m, z->st, srcln, reach);",	"#ifdef HAS_UNLESS",	"		for (i = 0; i < HAS_UNLESS; i++)",	"		{	j = trans[n][is]->escp[i];",	"			if (!j) break;",	"			tagtable(n, m, j, srcln, reach);",	"		}",	"#endif",	"	}",	"}",	"void",	"dfs_table(int n, int m, int is, short srcln[], uchar reach[], uchar lstate[])",	"{	Trans *z;\n",	"	if (is >= m || is <= 0 || !trans[n][is])",	"		return;",	"	if ((reach[is] & (4|8|16)) != 0)",	"	{	if ((reach[is] & (8|16)) == 16)	/* on stack, not yet recorded */",	"		{	lstate[is] = 1;",	"			reach[is] |= 8; /* recorded */",	"			if (state_tables)",	"			{	printf(\"state %%d line %%d is a loopstate\\n\", is, srcln[is]);",	"		}	}",	"		return;",	"	}",	"	reach[is] |= (4|16);	/* visited | onstack */",	"	for (z = trans[n][is]; z; z = z->nxt)",	"	{",	"#ifdef HAS_UNLESS",	"		int i, j;",	"#endif",	"		dfs_table(n, m, z->st, srcln, reach, lstate);",	"#ifdef HAS_UNLESS",	"		for (i = 0; i < HAS_UNLESS; i++)",	"		{	j = trans[n][is]->escp[i];",	"			if (!j) break;",	"			dfs_table(n, m, j, srcln, reach, lstate);",	"		}",	"#endif",	"	}",	"	reach[is] &= ~16; /* no longer on stack */",	"}",	"void",	"do_dfs(int n, int m, int is, short srcln[], uchar reach[], uchar lstate[])",	"{	int i;\n",	"",	"	dfs_table(n, m, is, srcln, reach, lstate);",	"",	"	for (i = 0; i < m; i++)",	"		reach[i] &= ~(4|8|16);",	"}",	"void",	"crack(int n, int j, Trans *z, short srcln[])",	"{	int i;\n",	"	if (!z) return;",	"	printf(\"\tstate %%3d -(tr %%3d)-> state %%3d  \",",	"		j, z->forw, z->st);",	"	printf(\"[id %%3d tp %%3d\", z->t_id, z->tpe[0]);",	"	if (z->tpe[1]) printf(\",%%d\", z->tpe[1]);",	"#ifdef HAS_UNLESS",	"	if (z->e_trans)",	"		printf(\" org %%3d\", z->e_trans);",	"	else if (state_tables >= 2)",	"	for (i = 0; i < HAS_UNLESS; i++)",	"	{	if (!z->escp[i]) break;",	"		printf(\" esc %%d\", z->escp[i]);",	"	}",	"#endif",	"	printf(\"]\");",	"	printf(\" [%%s%%s%%s%%s%%s] line %%d => \",",	"		z->atom&6?\"A\":z->atom&32?\"D\":\"-\",",	"		accpstate[n][j]?\"a\" :\"-\",",	"		stopstate[n][j]?\"e\" : \"-\",",	"		progstate[n][j]?\"p\" : \"-\",",	"		z->atom & 8 ?\"L\":\"G\",",	"		srcln[j]);",	"	for (i = 0; z->tp[i]; i++)",	"		if (z->tp[i] == \'\\n\')",	"			printf(\"\\\\n\");",	"		else",	"			putchar(z->tp[i]);",	"	if (z->qu[0])",	"	{	printf(\"\\t[\");",	"		for (i = 0; i < 6; i++)",	"			if (z->qu[i])",	"				printf(\"(%%d,%%d)\",",	"				z->qu[i], z->ty[i]);",	"		printf(\"]\");",	"	}",	"	printf(\"\\n\");",	"	fflush(stdout);",	"}",	"",	"#ifdef VAR_RANGES",	"#define BYTESIZE	32	/* 2^8 : 2^3 = 256:8 = 32 */",	"",	"typedef struct Vr_Ptr {",	"	char	*nm;",	"	uchar	vals[BYTESIZE];",	"	struct Vr_Ptr *nxt;",	"} Vr_Ptr;",	"Vr_Ptr *ranges = (Vr_Ptr *) 0;",	"",	"void",	"logval(char *s, int v)",	"{	Vr_Ptr *tmp;",	"",	"	if (v<0 || v > 255) return;",	"	for (tmp = ranges; tmp; tmp = tmp->nxt)",	"		if (!strcmp(tmp->nm, s))",	"			goto found;",	"	tmp = (Vr_Ptr *) emalloc(sizeof(Vr_Ptr));",	"	tmp->nxt = ranges;",	"	ranges = tmp;",	"	tmp->nm = s;",	"found:",	"	tmp->vals[(v)/8] |= 1<<((v)%%8);",	"}",	"",	"void",	"dumpval(uchar X[], int range)",	"{	int w, x, i, j = -1;",	"",	"	for (w = i = 0; w < range; w++)",	"	for (x = 0; x < 8; x++, i++)",	"	{",	"from:		if ((X[w] & (1<<x)))",	"		{	printf(\"%%d\", i);",	"			j = i;",	"			goto upto;",	"	}	}",	"	return;",	"	for (w = 0; w < range; w++)",	"	for (x = 0; x < 8; x++, i++)",	"	{",	"upto:		if (!(X[w] & (1<<x)))",	"		{	if (i-1 == j)",	"				printf(\", \");",	"			else",	"				printf(\"-%%d, \", i-1);",	"			goto from;",	"	}	}",	"	if (j >= 0 && j != 255)",	"		printf(\"-255\");",	"}",	"",	"void",	"dumpranges(void)",	"{	Vr_Ptr *tmp;",	"	printf(\"\\nValues assigned within \");",	"	printf(\"interval [0..255]:\\n\");",	"	for (tmp = ranges; tmp; tmp = tmp->nxt)",	"	{	printf(\"\\t%%s\\t: \", tmp->nm);",	"		dumpval(tmp->vals, BYTESIZE);",	"		printf(\"\\n\");",	"	}",	"}",	"#endif",	0,};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -