|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "1.incl.h" ! 3: #include "def.h" ! 4: ! 5: ! 6: recognize(type, ifflag) /* if ifflag = 1, statement is if()type; otherwise is type */ ! 7: int type, ifflag; /* do whatever is needed for this statement */ ! 8: { ! 9: int *arctype, i, sp; ! 10: VERT num, num1, nest, loophead; ! 11: extern long label(); ! 12: long *arclab; ! 13: if (nlabs > 3) sp = nlabs; else sp = 3; ! 14: arctype = challoc(sizeof(*arctype) * sp); arclab = challoc(sizeof(*arclab) * sp); ! 15: for( i=0; i < endbuf; i++) {if (buffer[i] == '~') buffer[i] = ' ';} ! 16: loophead = nest = innerdo(label(0)); ! 17: if (DEFINED(nest)) ! 18: { ! 19: /* this statement is last line of do loop */ ! 20: nest = ARC(nest,0); /* nest is ITERVX of the innermost do ending here */ ! 21: } ! 22: ! 23: ! 24: if (ifflag) ! 25: { ! 26: if (type == ungo) ! 27: { ! 28: arctype[0] = -2; ! 29: arclab[0] = label(1); ! 30: } ! 31: else ! 32: arctype[0] = 0; ! 33: ! 34: arctype[1] = (nest >= 0) ? nest : -2; ! 35: arclab[1] = implicit; ! 36: num1 = makenode(IFVX,TRUE,TRUE,label(0),2,arctype,arclab); ! 37: PRED(num1) = pred; ! 38: } ! 39: ! 40: arctype[0] = (nest >= 0) ? nest : -2; ! 41: arclab[0] = implicit; ! 42: ! 43: switch(type) ! 44: { ! 45: case ungo: ! 46: if (!ifflag) ! 47: { ! 48: connect(label(1),implicit); ! 49: if (label(0) != implicit) connect(label(1),label(0)); ! 50: } ! 51: break; ! 52: case RETVX: ! 53: case STOPVX: ! 54: if (type == RETVX) ! 55: { ! 56: if (retvert == UNDEFINED) ! 57: retvert = makenode(type,FALSE,FALSE,implicit,0,arctype,arclab); ! 58: num = retvert; ! 59: } ! 60: else ! 61: { ! 62: if (stopvert == UNDEFINED) ! 63: stopvert = makenode(type,FALSE,FALSE,implicit,0,arctype,arclab); ! 64: num = stopvert; ! 65: } ! 66: if (!ifflag) ! 67: { ! 68: fixvalue(implicit,num); ! 69: clear(implicit); ! 70: if (label(0) != implicit) fixvalue(label(0),num); ! 71: } ! 72: break; ! 73: ! 74: ! 75: case contst: ! 76: contin(label(0),loophead); ! 77: break; ! 78: ! 79: case FMTVX: ! 80: num = makenode(FMTVX,FALSE,TRUE,implicit,0,arctype,arclab); ! 81: BEGCODE(num) = comchar + 1 - rtnbeg; ! 82: ONDISK(num) = endline - endcom; ! 83: if (label(0) != implicit) ! 84: fixvalue(label(0),num); ! 85: FMTLST = append(num,FMTLST); ! 86: break; ! 87: case STLNVX: ! 88: if (DEFINED(stflag) && !ifflag && (label(0) == implicit)) ! 89: { ! 90: ++CODELINES(stflag); ! 91: ONDISK(stflag) += endline - begline + 1; ! 92: } ! 93: else ! 94: { ! 95: num = makenode(STLNVX,!ifflag,!ifflag,label(0),1,arctype,arclab); ! 96: if (!ifflag) ! 97: { ! 98: stflag = num; ! 99: BEGCODE(num) = comchar + 1 - rtnbeg; ! 100: ONDISK(num) = endline - endcom; ! 101: CODELINES(num) = 1; ! 102: } ! 103: else ! 104: { ! 105: BEGCODE(num) = stcode; ! 106: ONDISK(num) = FALSE; ! 107: CODELINES(num) = 1; ! 108: } ! 109: } ! 110: break; ! 111: ! 112: case DOVX: ! 113: if (arctype[0] != -2) ! 114: { ! 115: error("illegal do range, ","",""); ! 116: fprintf(stderr," between lines %d and %d\n",begline, endline); ! 117: exit(1); ! 118: } ! 119: arctype[1] = UNDEFINED; ! 120: num1 = makenode(DOVX,TRUE,TRUE,label(0),2,arctype,arclab); ! 121: if (++doptr >= maxdo) ! 122: { ! 123: faterr("in parsing:\n","do loops nested deeper than allowed",""); ! 124: } ! 125: dostack[doptr] = label(1); ! 126: doloc[doptr] = num1; /* stack link to node after loop */ ! 127: INC(num1) = inc; ! 128: num = makenode(ITERVX,TRUE,FALSE,implicit,1,arctype,arclab); ! 129: ARC(num1,0) = num; ! 130: FATH(num) = UNDEFINED; /* number of DOVX can change so leave UNDEFINED until later */ ! 131: break; ! 132: case arithif: ! 133: if (label(1) == label(2) || label(1) == 0L) ! 134: makeif(1,label(0),concat(pred," > 0"),label(3),label(2)); ! 135: else if (label(1) == label(3) || label(3) == 0L) ! 136: makeif(1,label(0),concat(pred," == 0"),label(2),label(1)); ! 137: else if (label(2) == label(3) || label(2) == 0L) ! 138: makeif(1,label(0),concat(pred," < 0"),label(1),label(3)); ! 139: else ! 140: { ! 141: makeif(1,label(0),concat(pred," < 0"),label(1),implicit); ! 142: makeif(1,implicit,concat(pred," == 0"),label(2),label(3)); ! 143: } ! 144: break; ! 145: ! 146: case IOVX: ! 147: if (endlab) ! 148: { ! 149: arctype[1] = -2; ! 150: arclab[1] = endlab->labelt; ! 151: } ! 152: else ! 153: arctype[1] = UNDEFINED; ! 154: if (errlab) ! 155: { ! 156: arctype[2] = -2; ! 157: arclab[2] = errlab->labelt; ! 158: } ! 159: else ! 160: arctype[2] = UNDEFINED; ! 161: num = makenode(IOVX,!ifflag,!ifflag,label(0),3,arctype,arclab); ! 162: PRERW(num) = prerw; ! 163: POSTRW(num) = postrw; ! 164: if (reflab) ! 165: addref(reflab->labelt, &FMTREF(num)); ! 166: else ! 167: FMTREF(num) = UNDEFINED; ! 168: break; ! 169: ! 170: case COMPVX: ! 171: if (intcase) ! 172: { ! 173: num = compcase(ifflag); ! 174: break; ! 175: } ! 176: case ASGOVX: ! 177: for (i = 0; i < nlabs - 1; i++) ! 178: { ! 179: arctype[i] = -2; ! 180: arclab[i] = label(nlabs-i-1); ! 181: } ! 182: num = makenode(type,!ifflag,!ifflag,label(0),nlabs - 1, arctype, arclab); ! 183: EXP(num) = exp; ! 184: break; ! 185: case ASVX: ! 186: num = makenode(ASVX,!ifflag,!ifflag,label(0),1,arctype,arclab); ! 187: EXP(num) = exp; ! 188: addref(label(1),&LABREF(num)); ! 189: break; ! 190: case entry: ! 191: num = makenode(STLNVX,FALSE,TRUE,label(0),1,arctype,arclab); ! 192: BEGCODE(num) = comchar + 1 - rtnbeg; ! 193: ONDISK(num) = endline - endcom; ! 194: CODELINES(num) = 1; ! 195: ENTLST = append(num,ENTLST); ! 196: break; ! 197: } ! 198: if (ifflag && type != ungo) ! 199: { ! 200: ARC(num1,0) = num; ! 201: } ! 202: if (DEFINED(loophead)) nesteddo(label(0), loophead); ! 203: if (ifflag || DEFINED(loophead) || type != STLNVX) stflag = UNDEFINED; ! 204: ! 205: ! 206: chfree(arctype,sizeof(*arctype) * sp); chfree(arclab,sizeof(*arclab) * sp); ! 207: if (debug) ! 208: { ! 209: fprintf(debfd,"line %d: ", begline); ! 210: if (ifflag) fprintf(debfd,"if() "); ! 211: switch(type) ! 212: {case RETVX: fprintf(debfd,"return"); break; ! 213: case STOPVX: fprintf(debfd,"stop"); break; ! 214: case contst: fprintf(debfd,"continue"); break; ! 215: case ungo: fprintf(debfd,"uncond. goto"); break; ! 216: case COMPVX: fprintf(debfd,"comp. goto"); break; ! 217: case ASGOVX: fprintf(debfd,"ass. goto, labs"); break; ! 218: case ASVX: fprintf(debfd,"label assignment"); break; ! 219: case STLNVX: fprintf(debfd,"simple statement"); break; ! 220: case arithif: fprintf(debfd,"arith if"); break; ! 221: case DOVX: fprintf(debfd,"do "); break; ! 222: case FMTVX: fprintf(debfd,"format st"); break; ! 223: case IOVX: fprintf(debfd,"IOVX statement "); break; ! 224: case entry: fprintf(debfd,"entry statement "); break; ! 225: } ! 226: fprintf(debfd,"\n%s\n", buffer); ! 227: } ! 228: } ! 229: ! 230: ! 231: ! 232: makeif(first,labe,test,arc1,arc2) /* construct IFVX with arcs to labels arc1,arc2 */ ! 233: int first; ! 234: long labe, arc1,arc2; ! 235: char *test; ! 236: { ! 237: int num, arctype[2]; ! 238: long arclab[2]; ! 239: arctype[0] = arctype[1] = -2; ! 240: arclab[0] = arc1; ! 241: arclab[1] = arc2; ! 242: num = makenode(IFVX,first,first,labe,2,arctype,arclab); ! 243: PRED(num) = test; ! 244: return(num); ! 245: } ! 246: ! 247: ! 248: innerdo(labe) /* return number of DOVX associated with labe, or UNDEFINED */ ! 249: long labe; ! 250: { ! 251: if (DEFINED(doptr)) ! 252: {if (dostack[doptr] == labe) ! 253: return(doloc[doptr--]); ! 254: } ! 255: return(UNDEFINED); ! 256: } ! 257: ! 258: ! 259: ! 260: ! 261: contin(labe,nest) /* handle continue statements */ ! 262: long labe; ! 263: int nest; ! 264: { ! 265: VERT y; ! 266: ! 267: if (!DEFINED(nest)) ! 268: { /* not nested */ ! 269: if (labe != implicit) connect(implicit,labe); /* labe pts to next node */ ! 270: } ! 271: else ! 272: { /* nested */ ! 273: y = ARC(nest,0); ! 274: fixvalue(labe,y); /* labe pts to ITERVX */ ! 275: fixvalue(implicit, y); /* implicit links pt to ITERVX */ ! 276: clear(implicit); ! 277: } ! 278: } ! 279: ! 280: ! 281: ! 282: ! 283: nesteddo(labe,v) ! 284: /* if multiple do's end on same label, add arc from inner DOVX ! 285: to enclosing DOVX; ! 286: add implicit link out of outermost DOVX with this label */ ! 287: long labe; ! 288: int v; ! 289: { ! 290: ! 291: while (DEFINED(doptr) && dostack[doptr] == labe) ! 292: { ! 293: ARC(v,1) = ARC(doloc[doptr],0); /*set inner DOVX to point to outer ITERVX */ ! 294: v = doloc[doptr--]; ! 295: } ! 296: addref(implicit, &ARC(v,1)); ! 297: } ! 298: ! 299: ! 300: ! 301: compcase(ifflag) /* turn computed goto into case statement */ ! 302: LOGICAL ifflag; ! 303: { ! 304: int *arctype, i, num, d, arct; ! 305: extern long label(); ! 306: long *arclab; ! 307: char *str; ! 308: arctype = challoc(sizeof(*arctype) * nlabs); ! 309: arclab = challoc (sizeof(*arclab) * nlabs); ! 310: ! 311: d = distinct(linelabs->nxtlab,arctype,arclab,nlabs-1); ! 312: /* puts distinct labels in arclab, count of each in arctype */ ! 313: arct = -2; ! 314: for (i = 0; i < d; ++i) ! 315: arctype[i] = makenode(ICASVX,FALSE,FALSE,implicit,1,&arct,&arclab[i]); ! 316: num = makenode(SWCHVX,!ifflag,!ifflag,label(0),d,arctype,arclab); ! 317: EXP(num) = exp; ! 318: ! 319: str = challoc(6*(nlabs-1)); /* 5 digits + , or \0 per label */ ! 320: for (i = 0; i < d; ++i) /* construct list of values for each label */ ! 321: EXP(arctype[i]) = stralloc(str,accum(str,linelabs->nxtlab,arclab[i])); ! 322: chfree(str,6*(nlabs-1)); ! 323: chfree(arctype,sizeof(*arctype) * nlabs); chfree(arclab,sizeof(*arclab) * nlabs); ! 324: return(num); ! 325: } ! 326: ! 327: ! 328: accum(str,vlist,f) /* build string of indices in compnode corr. to label f */ ! 329: char *str; long f; struct lablist *vlist; ! 330: { ! 331: int s,j; struct lablist *p; ! 332: ! 333: s = 0; ! 334: j = 1; ! 335: for (p = vlist; p ; p = p->nxtlab) /* search for occurrences of f */ ! 336: { ! 337: if (p->labelt ==f) ! 338: { ! 339: if (s) ! 340: { ! 341: str[s] = ','; ! 342: ++s; ! 343: } ! 344: sprintf(&str[s],"%d",j); ! 345: while (str[s] != '\0') ++s; ! 346: } ! 347: ++j; ! 348: } ! 349: return(s+1); ! 350: } ! 351: ! 352: ! 353: distinct(vlist,count,dlist,size) /* make dlist into list of distinct labels in vlist */ ! 354: struct lablist *vlist; long dlist[]; /*count[] gets count of each label; d distinct labels */ ! 355: int count[],size; ! 356: {int d,i; ! 357: d = 0; ! 358: for(i = 0; i < size; i++) count[i] = 0; ! 359: ! 360: for (;vlist && vlist->labelt != 0L; vlist = vlist ->nxtlab) ! 361: { ! 362: for (i = 0; ;i++) ! 363: { ! 364: if (i == d) dlist[d++] = vlist->labelt; ! 365: if (dlist[i] == vlist->labelt) ! 366: { ! 367: ++count[i]; break; ! 368: } ! 369: } ! 370: } ! 371: return(d); ! 372: } ! 373: ! 374:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.