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

📄 pangen1.c

📁 对软件进行可达性测试的软件
💻 C
📖 第 1 页 / 共 3 页
字号:
	ini = huntele(e, e->status, -1)->seqno;	fprintf(th, "#define start%d	%d\n", i, ini);	if (i == claimnr)	fprintf(th, "#define start_claim	%d\n", ini);	if (i == eventmapnr)	fprintf(th, "#define start_event	%d\n", ini);	fprintf(tc, "\tcase %d:	/* %s */\n", i, s->name);	fprintf(tc, "\t\t((P%d *)pptr(h))->_t = %d;\n", i, i);	fprintf(tc, "\t\t((P%d *)pptr(h))->_p = %d;", i, ini);	fprintf(tc, " reached%d[%d]=1;\n", i, ini);	if (has_provided)	{	fprintf(tt, "\tcase %d: /* %s */\n\t\t", i, s->name);		if (P->prov)		{	fprintf(tt, "if (");			putstmnt(tt, P->prov, 0);			fprintf(tt, ")\n\t\t\t");		}		fprintf(tt, "return 1;\n");		if (P->prov)			fprintf(tt, "\t\tbreak;\n");	}	fprintf(tc, "\t\t/* params: */\n");	for (fp  = p, j=0; fp; fp = fp->rgt)	for (fpt = fp->lft; fpt; fpt = fpt->rgt, j++)	{	t = (fpt->ntyp == ',') ? fpt->lft : fpt;		if (t->sym->nel != 1)		{	lineno = t->ln;			Fname  = t->fn;			fatal("array in parameter list, %s",			t->sym->name);		}		fprintf(tc, "\t\t((P%d *)pptr(h))->", i);		if (t->sym->type == STRUCT)		{	if (full_name(tc, t, t->sym, 1))			{	lineno = t->ln;				Fname  = t->fn;				fatal("hidden array in parameter %s",				t->sym->name);			}		} else			fprintf(tc, "%s", t->sym->name);		fprintf(tc, " = par%d;\n", j);	}	fprintf(tc, "\t\t/* locals: */\n");	k = dolocal(tc, "", INIV, i, s->name);	if (k > 0)	{	fprintf(tc, "#ifdef VAR_RANGES\n");		(void) dolocal(tc, "logval(\"", LOGV, i, s->name);		fprintf(tc, "#endif\n");	}	fprintf(tc, "#ifdef HAS_CODE\n");	fprintf(tc, "\t\tlocinit%d(h);\n", i);	fprintf(tc, "#endif\n");	dumpclaims(tc, i, s->name);	fprintf(tc, "\t	break;\n");}Element *huntstart(Element *f){	Element *e = f;	Element *elast = (Element *) 0;	int cnt = 0;	while (elast != e && cnt++ < 200)	/* new 4.0.8 */	{	elast = e;		if (e->n)		{	if (e->n->ntyp == '.' && e->nxt)				e = e->nxt;			else if (e->n->ntyp == UNLESS)				e = e->sub->this->frst;	}	}	if (cnt >= 200 || !e)		fatal("confusing control structure", (char *) 0);	return e;}Element *huntele(Element *f, int o, int stopat){	Element *g, *e = f;	int cnt=0; /* a precaution against loops */	if (e)	for ( ; cnt < 200 && e->n; cnt++)	{		if (e->seqno == stopat)			break;		switch (e->n->ntyp) {		case GOTO:			g = get_lab(e->n,1);			cross_dsteps(e->n, g->n);			break;		case '.':		case BREAK:			if (!e->nxt)				return e;			g = e->nxt;			break;		case UNLESS:			g = huntele(e->sub->this->frst, o, stopat);			break;		case D_STEP:		case ATOMIC:		case NON_ATOMIC:		default:			return e;		}		if ((o & ATOM) && !(g->status & ATOM))			return e;		e = g;	}	if (cnt >= 200 || !e)		fatal("confusing control structure", (char *) 0);	return e;}voidtyp2c(Symbol *sp){	int wsbits = sizeof(long)*8; /* wordsize in bits */	switch (sp->type) {	case UNSIGNED:		if (sp->hidden&1)			fprintf(th, "\tuchar %s;", sp->name);		else			fprintf(th, "\tunsigned %s : %d",				sp->name, sp->nbits);		LstSet = sp;		if (nBits%wsbits > 0		&&  wsbits - nBits%wsbits < sp->nbits)		{	/* must padd to a word-boundary */			nBits += wsbits - nBits%wsbits;		}		nBits += sp->nbits;		break;	case BIT:		if (sp->nel == 1 && !(sp->hidden&1))		{	fprintf(th, "\tunsigned %s : 1", sp->name);			LstSet = sp; 			nBits++;			break;		} /* else fall through */		if (!(sp->hidden&1) && (verbose&32))		printf("spin: warning: bit-array %s[%d] mapped to byte-array\n",			sp->name, sp->nel);		nBits += 8*sp->nel; /* mapped onto array of uchars */	case MTYPE:	case BYTE:	case CHAN:	/* good for up to 255 channels */		fprintf(th, "\tuchar %s", sp->name);		LstSet = sp;		break;	case SHORT:		fprintf(th, "\tshort %s", sp->name);		LstSet = sp;		break;	case INT:		fprintf(th, "\tint %s", sp->name);		LstSet = sp;		break;	case STRUCT:		if (!sp->Snm)			fatal("undeclared structure element %s", sp->name);		fprintf(th, "\tstruct %s %s",			sp->Snm->name,			sp->name);		LstSet = ZS;		break;	case CODE_FRAG:	case PREDEF:		return;	default:		fatal("variable %s undeclared", sp->name);	}	if (sp->nel != 1)		fprintf(th, "[%d]", sp->nel);	fprintf(th, ";\n");}static voidncases(FILE *fd, int p, int n, int m, char *c[]){	int i, j;	for (j = 0; c[j]; j++)	for (i = n; i < m; i++)	{	fprintf(fd, c[j], i, p, i);		fprintf(fd, "\n");	}}voidqlen_type(int qmax){	fprintf(th, "\t");	if (qmax < 256)		fprintf(th, "uchar");	else if (qmax < 65535)		fprintf(th, "ushort");	else		fprintf(th, "uint");	fprintf(th, " Qlen;	/* q_size */\n");}voidgenaddqueue(void){	char buf0[256];	int j, qmax = 0;	Queue *q;	ntimes(tc, 0, 1, Addq0);	if (has_io && !nqs)		fprintf(th, "#define NQS	1 /* nqs=%d, but has_io */\n", nqs);	else		fprintf(th, "#define NQS	%d\n", nqs);	fprintf(th, "short q_flds[%d];\n", nqs+1);	fprintf(th, "short q_max[%d];\n", nqs+1);	for (q = qtab; q; q = q->nxt)		if (q->nslots > qmax)			qmax = q->nslots;	for (q = qtab; q; q = q->nxt)	{	j = q->qid;		fprintf(tc, "\tcase %d: j = sizeof(Q%d);", j, j);		fprintf(tc, " q_flds[%d] = %d;", j, q->nflds);		fprintf(tc, " q_max[%d] = %d;", j, max(1,q->nslots));		fprintf(tc, " break;\n");		fprintf(th, "typedef struct Q%d {\n", j);		qlen_type(qmax);	/* 4.2.2 */		fprintf(th, "	uchar _t;	/* q_type */\n");		fprintf(th, "	struct {\n");		for (j = 0; j < q->nflds; j++)		{	switch (q->fld_width[j]) {			case BIT:				if (q->nflds != 1)				{	fprintf(th, "\t\tunsigned");					fprintf(th, " fld%d : 1;\n", j);					break;				} /* else fall through: smaller struct */			case MTYPE:			case CHAN:			case BYTE:				fprintf(th, "\t\tuchar fld%d;\n", j);				break;			case SHORT:				fprintf(th, "\t\tshort fld%d;\n", j);				break;			case INT:				fprintf(th, "\t\tint fld%d;\n", j);				break;			default:				fatal("bad channel spec", "");			}		}		fprintf(th, "	} contents[%d];\n", max(1, q->nslots));		fprintf(th, "} Q%d;\n", q->qid);	}	fprintf(th, "typedef struct Q0 {\t/* generic q */\n");	qlen_type(qmax);	/* 4.2.2 */	fprintf(th, "	uchar _t;\n");	fprintf(th, "} Q0;\n");	ntimes(tc, 0, 1, Addq1);	if (has_random)	{	fprintf(th, "int Q_has(int");		for (j = 0; j < Mpars; j++)			fprintf(th, ", int, int");		fprintf(th, ");\n");		fprintf(tc, "int\nQ_has(int into");		for (j = 0; j < Mpars; j++)			fprintf(tc, ", int want%d, int fld%d", j, j);		fprintf(tc, ")\n");		fprintf(tc, "{	int i;\n\n");		fprintf(tc, "	if (!into--)\n");		fprintf(tc, "	uerror(\"ref to unknown chan ");		fprintf(tc, "(recv-poll)\");\n\n");		fprintf(tc, "	if (into >= now._nr_qs || into < 0)\n");		fprintf(tc, "		Uerror(\"qrecv bad queue#\");\n\n");		fprintf(tc, "	for (i = 0; i < ((Q0 *)qptr(into))->Qlen;");		fprintf(tc, " i++)\n");		fprintf(tc, "	{\n");		for (j = 0; j < Mpars; j++)		{	fprintf(tc, "		if (want%d && ", j);			fprintf(tc, "qrecv(into+1, i, %d, 0) != fld%d)\n",				j, j);			fprintf(tc, "			continue;\n");		}		fprintf(tc, "		return i+1;\n");		fprintf(tc, "	}\n");		fprintf(tc, "	return 0;\n");		fprintf(tc, "}\n");	}	fprintf(tc, "#if NQS>0\n");	fprintf(tc, "void\nqsend(int into, int sorted");	for (j = 0; j < Mpars; j++)		fprintf(tc, ", int fld%d", j);	fprintf(tc, ", int args_given)\n");	ntimes(tc, 0, 1, Addq11);	for (q = qtab; q; q = q->nxt)	{	sprintf(buf0, "((Q%d *)z)->", q->qid);		fprintf(tc, "\tcase %d:%s\n", q->qid,			(q->nslots)?"":" /* =rv= */");		if (q->nslots == 0)	/* reset handshake point */			fprintf(tc, "\t\t(trpt+2)->o_m = 0;\n");		if (has_sorted)		{	fprintf(tc, "\t\tif (!sorted) goto append%d;\n", q->qid);			fprintf(tc, "\t\tfor (j = 0; j < %sQlen; j++)\n", buf0);			fprintf(tc, "\t\t{\t/* find insertion point */\n");			sprintf(buf0, "((Q%d *)z)->contents[j].fld", q->qid);			for (j = 0; j < q->nflds; j++)			{	fprintf(tc, "\t\t\tif (fld%d > %s%d) continue;\n",						j, buf0, j);				fprintf(tc, "\t\t\tif (fld%d < %s%d) ", j, buf0, j);				fprintf(tc, "goto found%d;\n\n", q->qid);			}			fprintf(tc, "\t\t}\n");			fprintf(tc, "\tfound%d:\n", q->qid);			sprintf(buf0, "((Q%d *)z)->", q->qid);			fprintf(tc, "\t\tfor (k = %sQlen - 1; k >= j; k--)\n", buf0);			fprintf(tc, "\t\t{\t/* shift up */\n");			for (j = 0; j < q->nflds; j++)			{	fprintf(tc, "\t\t\t%scontents[k+1].fld%d = ",					buf0, j);				fprintf(tc, "%scontents[k].fld%d;\n",					buf0, j);			}			fprintf(tc, "\t\t}\n");			fprintf(tc, "\tappend%d:\t/* insert in slot j */\n", q->qid);		}		fprintf(tc, "#ifdef HAS_SORTED\n");		fprintf(tc, "\t\t(trpt+1)->ipt = j;\n");	/* ipt was bup.oval */		fprintf(tc, "#endif\n");		fprintf(tc, "\t\t%sQlen = %sQlen + 1;\n", buf0, buf0);		sprintf(buf0, "((Q%d *)z)->contents[j].fld", q->qid);		for (j = 0; j < q->nflds; j++)			fprintf(tc, "\t\t%s%d = fld%d;\n", buf0, j, j);		fprintf(tc, "\t\tif (args_given != %d)\n", q->nflds);		fprintf(tc, "\t\t{	if (args_given > %d)\n", q->nflds);		fprintf(tc, "\t\t		uerror(\"too many parameters in send stmnt\");\n");		fprintf(tc, "\t\t	else\n");		fprintf(tc, "\t\t		uerror(\"too few parameters in send stmnt\");\n");		fprintf(tc, "\t\t}\n");		fprintf(tc, "\t\tbreak;\n");	}	ntimes(tc, 0, 1, Addq2);	for (q = qtab; q; q = q->nxt)	fprintf(tc, "\tcase %d: return %d;\n", q->qid, (!q->nslots));	ntimes(tc, 0, 1, Addq3);	for (q = qtab; q; q = q->nxt)	fprintf(tc, "\tcase %d: return (q_sz(from) == %d);\n",			q->qid, max(1, q->nslots));	ntimes(tc, 0, 1, Addq4);	for (q = qtab; q; q = q->nxt)	{	sprintf(buf0, "((Q%d *)z)->", q->qid);		fprintf(tc, "	case %d:%s\n\t\t",			q->qid, (q->nslots)?"":" /* =rv= */");		if (q->nflds == 1)		{	fprintf(tc, "if (fld == 0) r = %s", buf0);			fprintf(tc, "contents[slot].fld0;\n");		} else		{	fprintf(tc, "switch (fld) {\n");			ncases(tc, q->qid, 0, q->nflds, R12);			fprintf(tc, "\t\tdefault: Uerror");			fprintf(tc, "(\"too many fields in recv\");\n");			fprintf(tc, "\t\t}\n");		}		fprintf(tc, "\t\tif (done)\n");		if (q->nslots == 0)		{	fprintf(tc, "\t\t{	j = %sQlen - 1;\n",  buf0);			fprintf(tc, "\t\t	%sQlen = 0;\n", buf0);			sprintf(buf0, "\t\t\t((Q%d *)z)->contents", q->qid);		} else	 	{	fprintf(tc, "\t\t{	j = %sQlen;\n",  buf0);			fprintf(tc, "\t\t	%sQlen = --j;\n", buf0);			fprintf(tc, "\t\t	for (k=slot; k<j; k++)\n");			fprintf(tc, "\t\t	{\n");			sprintf(buf0, "\t\t\t((Q%d *)z)->contents", q->qid);			for (j = 0; j < q->nflds; j++)			{	fprintf(tc, "\t%s[k].fld%d = \n", buf0, j);				fprintf(tc, "\t\t%s[k+1].fld%d;\n", buf0, j);			}			fprintf(tc, "\t\t	}\n");	 	}		for (j = 0; j < q->nflds; j++)			fprintf(tc, "%s[j].fld%d = 0;\n", buf0, j);		fprintf(tc, "\t\t\tif (fld+1 != %d)\n\t\t\t", q->nflds);		fprintf(tc, "\tuerror(\"missing pars in receive\");\n");		/* incompletely received msgs cannot be unrecv'ed */		fprintf(tc, "\t\t}\n");		fprintf(tc, "\t\tbreak;\n");	}	ntimes(tc, 0, 1, Addq5);	for (q = qtab; q; q = q->nxt)	fprintf(tc, "	case %d: j = sizeof(Q%d); break;\n",		q->qid, q->qid);	ntimes(tc, 0, 1, R8b);	ntimes(th, 0, 1, Proto);	/* tag on function prototypes */	fprintf(th, "void qsend(int, int");	for (j = 0; j < Mpars; j++)		fprintf(th, ", int");	fprintf(th, ", int);\n");	fprintf(th, "#define Addproc(x)	addproc(x");	for (j = 0; j < Npars; j++)		fprintf(th, ", 0");	fprintf(th, ")\n");}

⌨️ 快捷键说明

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