|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "pret.h" ! 3: ! 4: struct FORMALS { ! 5: char name[MAXNAME]; ! 6: int typefs; /* qset or pvar (default) */ ! 7: int tag; /* id */ ! 8: char used; /* reference count */ ! 9: char reset; /* default type overwritten */ ! 10: struct FORMALS *nxtpar; ! 11: }; ! 12: ! 13: struct { ! 14: char name[MAXNAME]; ! 15: int status; ! 16: int nrparams; ! 17: int nrstates; ! 18: int unreach; ! 19: struct FORMALS *params; /* formal parameters */ ! 20: } reftable[MAXPROC]; ! 21: ! 22: int nrrefs = 0; ! 23: ! 24: extern int anyerror, pid, rid, assertion, inertion; ! 25: extern char qsetname[MAXNAME]; ! 26: ! 27: refsize(n, m, k) ! 28: { reftable[n].nrstates = m; ! 29: reftable[n].unreach = k; ! 30: } ! 31: ! 32: reorder() ! 33: { int i, j, N, M; ! 34: struct FORMALS * hook; ! 35: ! 36: if (rid == NONE) ! 37: return; ! 38: /* ! 39: * make sure that formal msg parameters ! 40: * are numbered in the order in which they ! 41: * will be pushed onto the call stack in trace.c ! 42: */ ! 43: ! 44: j = reftable[rid].nrparams; ! 45: hook = reftable[rid].params; ! 46: ! 47: for (i = N = M = 0; i < j; i++) ! 48: { if (hook->typefs == ISQ || hook->typefs == ISQN) ! 49: N = renumqset(hook->tag, N); ! 50: else ! 51: hook->tag = M++; ! 52: ! 53: hook = hook->nxtpar; ! 54: } ! 55: } ! 56: ! 57: newreftask(str, mask) ! 58: char *str; ! 59: { register int i; ! 60: ! 61: for (i = 0; i < nrrefs; i++) ! 62: if (strcmp(str, reftable[i].name) == 0) ! 63: break; ! 64: if (i == nrrefs) ! 65: { if (nrrefs >= MAXPROC) ! 66: whoops("too many procedures"); ! 67: if (mask == RFR) ! 68: yyerror("undeclared procedure, %s", str); ! 69: ! 70: reftable[i].status = 0; ! 71: reftable[i].nrparams = 0; ! 72: reftable[i].nrstates = 0; ! 73: reftable[i].unreach = 0; ! 74: strcpy(reftable[nrrefs++].name, str); ! 75: } else ! 76: { if (mask == DCL && (reftable[i].status & DCL)) ! 77: yyerror("procedure redeclared, %s", str); ! 78: if (mask == RFR && rid == i) ! 79: yyerror("recursive procedure, %s", str); ! 80: } ! 81: reftable[i].status |= mask; ! 82: ! 83: return i; ! 84: } ! 85: ! 86: struct FORMALS * ! 87: newparunit(str, nn, tp, ins) ! 88: char *str; ! 89: { struct FORMALS * try = (struct FORMALS *) ! 90: Emalloc ( sizeof(struct FORMALS) ); ! 91: ! 92: try->used = 0; ! 93: try->reset = 0; ! 94: ! 95: strcpy(try->name, str); ! 96: ! 97: try->typefs = tp; ! 98: try->nxtpar = NULL; ! 99: ! 100: try->tag = nn; ! 101: if (!ins) ! 102: yyerror("unspecified parameter, %s", str); ! 103: ! 104: return try; ! 105: } ! 106: ! 107: addFpar(to, stri, n, vt, ins) ! 108: char *stri; ! 109: { struct FORMALS *hook; ! 110: int N = reftable[to].nrparams; ! 111: int i = N; ! 112: ! 113: if (N == 0) ! 114: { reftable[to].params = newparunit(stri, n, vt, ins); ! 115: reftable[to].nrparams++; ! 116: } else ! 117: { hook = reftable[to].params; ! 118: for (i = 0; i < N; i++, hook = hook->nxtpar) ! 119: { if (strcmp(hook->name, stri) == 0) ! 120: { if (ins || hook->reset == 1) ! 121: yyerror("name clash, %s", stri); ! 122: ! 123: hook->tag = n; ! 124: hook->typefs = vt; ! 125: hook->reset = 1; ! 126: break; ! 127: } ! 128: if (hook->nxtpar == NULL) ! 129: { hook->nxtpar = newparunit(stri, n, vt, ins); ! 130: reftable[to].nrparams++; ! 131: i++; ! 132: break; ! 133: } } } ! 134: ! 135: return i; ! 136: } ! 137: ! 138: Fparname(str, which, vt, hit, how, qind) ! 139: char *str; ! 140: { int i, j, k; ! 141: struct FORMALS * hook = reftable[which].params; ! 142: ! 143: for (i = 0, j = reftable[which].nrparams; i < j; i++) ! 144: { if (strcmp(str, hook->name) == 0 && hook->typefs == vt) ! 145: break; ! 146: if (hook->typefs == ISQ || hook->typefs == ISQN) ! 147: { switch (vt) { ! 148: case ISM: ! 149: if (hook->tag == hit ! 150: && (k = inqset(hook->tag, str, how, qind)) != -1) ! 151: return k; ! 152: break; ! 153: case ISQ: ! 154: if (matchowner(hook->tag, str, how, qind)) ! 155: return hook->tag; /* id of qset */ ! 156: break; ! 157: } } ! 158: hook = hook->nxtpar; ! 159: } ! 160: if (i == j || (vt == ISM && hook->tag != hit)) ! 161: return -1; ! 162: ! 163: hook->used |= how; ! 164: ! 165: if (vt == ISV) ! 166: return hook->tag; ! 167: ! 168: return i; ! 169: } ! 170: ! 171: checkrefs() ! 172: { int i; ! 173: if (nrrefs == 0) ! 174: return; ! 175: for (i = 0; i < nrrefs; i++) ! 176: if (reftable[i].status == DCL) ! 177: { if (strcmp(reftable[i].name, " assert") != 0 ! 178: && strcmp(reftable[i].name, " error") != 0) ! 179: printf("%s: unused procedure\n", reftable[i].name); ! 180: } else if (reftable[i].status == RFR) ! 181: printf("%s: undeclared procedure\n", reftable[i].name); ! 182: } ! 183: ! 184: numrefs(fd) ! 185: FILE *fd; ! 186: { extern int linecode; ! 187: fprintf(fd, "%d linecode\n", linecode); ! 188: fprintf(fd, "%d procedures ", nrrefs); ! 189: fprintf(fd, "(assert %d/%d)\n", assertion, inertion); ! 190: } ! 191: ! 192: parrefs(n, m) ! 193: { int i; ! 194: if ((i = reftable[m].nrparams - n) == 0) ! 195: return; ! 196: if (i > 0) ! 197: yyerror("missing parameters, %s", reftable[m].name); ! 198: else ! 199: yyerror("too many parameters, %s", reftable[m].name); ! 200: } ! 201: ! 202: isdigit(c) { return (c >= '0' && c <= '9'); } ! 203: ! 204: addAspecial(val, which, pn) ! 205: { struct FORMALS * hook = reftable[which].params; ! 206: int i; ! 207: ! 208: if (pn >= reftable[which].nrparams || pn < 0) ! 209: return; ! 210: ! 211: for (i = 0; i < pn; i++) ! 212: if ((hook = hook->nxtpar) == NULL) ! 213: whoops("cannot happen - addAspecial"); ! 214: ! 215: switch (hook->typefs) ! 216: { case ISQN: ! 217: case ISQ: yyerror("mismatched parameter, %s", "queue or qset"); ! 218: break; ! 219: case ISV: callentry(ISV, val); ! 220: break; ! 221: default : whoops("cannot happen - addAspecial"); ! 222: } ! 223: } ! 224: ! 225: addApars(what, which, pn, index) ! 226: char *what; ! 227: { struct FORMALS * hook = reftable[which].params; ! 228: int val, hit, x; ! 229: ! 230: if (pn >= reftable[which].nrparams || pn < 0) ! 231: return; ! 232: ! 233: for (x = 0; x < pn; x++) ! 234: if ((hook = hook->nxtpar) == NULL) ! 235: whoops("cannot happen - formals"); ! 236: ! 237: switch (hook->typefs) ! 238: { case ISQN: ! 239: val = newqset(what, what, 0, index); ! 240: x = matchset(val, hook->tag); ! 241: hit = qsetowner(val, x); /* find queue-id */ ! 242: callentry(ISQ, hit); /* enter queue-id */ ! 243: callist(val, hit); /* enter messages */ ! 244: break; ! 245: case ISQ: val = newqset(what, "", RFR, index); ! 246: x = matchset(val, hook->tag); ! 247: hit = qsetowner(val, x); /* find queue-id */ ! 248: callentry(ISQ, hit); /* enter queue-id */ ! 249: callist(val, hit); /* enter messages */ ! 250: break; ! 251: case ISV: val = addvarname(what, RFR, NONE, index, 0); ! 252: callentry(ISV, val); ! 253: break; ! 254: default : whoops("cannot happen - addApars"); ! 255: } ! 256: } ! 257: ! 258: listrefs() ! 259: { int i, k; ! 260: ! 261: for (i = 0; i < nrrefs; i++) ! 262: { printf("\t%2d\t%s, ", i+1, reftable[i].name); ! 263: for (k = strlen(reftable[i].name)+1; k < 10; k++) ! 264: putchar(' '); ! 265: k = reftable[i].nrstates; ! 266: printf("%d state%s", k, (k!=1)?"s":""); ! 267: if ((k = reftable[i].unreach) > 0) ! 268: printf(" (%d unreachable state%s)", k, (k>1)?"s":""); ! 269: putchar('\n'); ! 270: } ! 271: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.