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