📄 pangen1.c
字号:
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 + -