Annotation of researchv10no/cmd/struct/1.recog.c, revision 1.1

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:                        if((unsigned)(BEGCODE(num))!=comchar+1-rtnbeg)
        !            83:                                faterr("program too long","","");
        !            84:                        ONDISK(num) = endline - endcom;
        !            85:                        if (label(0) != implicit)
        !            86:                                fixvalue(label(0),num);
        !            87:                        FMTLST = append(num,FMTLST);
        !            88:                        break;
        !            89:                case STLNVX:
        !            90:                        if (DEFINED(stflag) && !ifflag && (label(0) == implicit))
        !            91:                                {
        !            92:                                ++CODELINES(stflag);
        !            93:                                ONDISK(stflag) += endline - begline + 1;
        !            94:                                }
        !            95:                        else
        !            96:                                {
        !            97:                                num = makenode(STLNVX,!ifflag,!ifflag,label(0),1,arctype,arclab);
        !            98:                                if (!ifflag)
        !            99:                                        {
        !           100:                                        stflag = num;
        !           101:                                        BEGCODE(num) = comchar + 1 - rtnbeg;
        !           102:                                        if((unsigned)(BEGCODE(num))!=comchar+1-rtnbeg)
        !           103:                                                faterr("program too long","","");
        !           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:                        if((unsigned)(BEGCODE(num))!=comchar+1-rtnbeg)
        !           198:                                faterr("program too long","","");
        !           199:                        ONDISK(num) = endline - endcom;
        !           200:                        CODELINES(num) = 1;
        !           201:                        ENTLST = append(num,ENTLST);
        !           202:                        break;
        !           203:                }
        !           204:        if (ifflag && type != ungo)
        !           205:                {
        !           206:                ARC(num1,0) = num;
        !           207:                }
        !           208:        if (DEFINED(loophead))  nesteddo(label(0), loophead);
        !           209:        if (ifflag || DEFINED(loophead) || type != STLNVX)  stflag = UNDEFINED;
        !           210: 
        !           211: 
        !           212:        chfree(arctype,sizeof(*arctype) * sp);  chfree(arclab,sizeof(*arclab) * sp);
        !           213:        if (debug)
        !           214:                {
        !           215:                fprintf(debfd,"line %d:  ", begline);
        !           216:                if (ifflag) fprintf(debfd,"if()  ");
        !           217:                switch(type)
        !           218:                        {case RETVX:    fprintf(debfd,"return");        break;
        !           219:                        case STOPVX:    fprintf(debfd,"stop");  break;
        !           220:                        case contst:    fprintf(debfd,"continue");      break;
        !           221:                        case ungo:      fprintf(debfd,"uncond. goto");  break;
        !           222:                        case COMPVX:    fprintf(debfd,"comp. goto");    break;
        !           223:                        case ASGOVX:    fprintf(debfd,"ass. goto, labs");       break;
        !           224:                        case ASVX:      fprintf(debfd,"label assignment");      break;
        !           225:                        case STLNVX:    fprintf(debfd,"simple statement");      break;
        !           226:                        case arithif:   fprintf(debfd,"arith if");      break;
        !           227:                        case DOVX:      fprintf(debfd,"do ");   break;
        !           228:                        case FMTVX:  fprintf(debfd,"format st");  break;
        !           229:                        case IOVX:  fprintf(debfd,"IOVX statement ");  break;
        !           230: case entry:    fprintf(debfd,"entry statement ");  break;
        !           231:                        }
        !           232:                fprintf(debfd,"\n%s\n", buffer);
        !           233:                }
        !           234:        }
        !           235: 
        !           236: 
        !           237: 
        !           238: makeif(first,labe,test,arc1,arc2)                      /* construct IFVX with arcs to labels arc1,arc2 */
        !           239: int first;
        !           240: long labe, arc1,arc2;
        !           241: char *test;
        !           242:        {
        !           243:        int num, arctype[2];
        !           244:        long arclab[2];
        !           245:        arctype[0] = arctype[1] = -2;
        !           246:        arclab[0] = arc1;
        !           247:        arclab[1] = arc2;
        !           248:        num = makenode(IFVX,first,first,labe,2,arctype,arclab);
        !           249:        PRED(num) = test;
        !           250:        return(num);
        !           251:        }
        !           252: 
        !           253: 
        !           254: innerdo(labe)          /* return number of DOVX associated with labe, or UNDEFINED */
        !           255: long labe;
        !           256:        {
        !           257:        if (DEFINED(doptr))
        !           258:                {if (dostack[doptr] == labe)
        !           259:                        return(doloc[doptr--]);
        !           260:                }
        !           261:        return(UNDEFINED);
        !           262:        }
        !           263: 
        !           264: 
        !           265: 
        !           266: 
        !           267: contin(labe,nest)              /* handle continue statements */
        !           268: long labe;
        !           269: int nest;
        !           270:        {
        !           271:        VERT y;
        !           272:        
        !           273:        if (!DEFINED(nest))
        !           274:                {               /* not nested */
        !           275:                if (labe != implicit) connect(implicit,labe);   /* labe pts to next node */
        !           276:                }
        !           277:        else
        !           278:                {               /* nested */
        !           279:                y = ARC(nest,0);
        !           280:                fixvalue(labe,y);                       /* labe pts to ITERVX */
        !           281:                fixvalue(implicit, y);          /* implicit links pt to ITERVX */
        !           282:                clear(implicit);
        !           283:                }
        !           284:        }
        !           285: 
        !           286: 
        !           287: 
        !           288: 
        !           289: nesteddo(labe,v)
        !           290:                        /* if multiple do's end on same label, add arc from inner DOVX
        !           291:                                to enclosing DOVX;
        !           292:                        add implicit link out of outermost DOVX with this label */
        !           293: long labe;
        !           294: int v;
        !           295:        {
        !           296:        
        !           297:        while (DEFINED(doptr) && dostack[doptr] == labe)
        !           298:                {
        !           299:                ARC(v,1) = ARC(doloc[doptr],0);         /*set inner DOVX to point to outer ITERVX */
        !           300:                v = doloc[doptr--];
        !           301:                }
        !           302:        addref(implicit, &ARC(v,1));
        !           303:        }
        !           304: 
        !           305: 
        !           306: 
        !           307: compcase(ifflag)               /* turn computed goto into case statement */
        !           308: LOGICAL ifflag;
        !           309:        {
        !           310:        int *arctype, i, num, d, arct;
        !           311:        extern long label();
        !           312:        long *arclab;
        !           313:        char *str;
        !           314:        arctype = challoc(sizeof(*arctype) * nlabs);
        !           315:        arclab = challoc (sizeof(*arclab) * nlabs);
        !           316: 
        !           317:        d = distinct(linelabs->nxtlab,arctype,arclab,nlabs-1);
        !           318:                        /* puts distinct labels in arclab, count of each in arctype */
        !           319:        arct = -2;
        !           320:        for (i = 0; i < d; ++i)
        !           321:                arctype[i] = makenode(ICASVX,FALSE,FALSE,implicit,1,&arct,&arclab[i]);
        !           322:        num = makenode(SWCHVX,!ifflag,!ifflag,label(0),d,arctype,arclab);
        !           323:        EXP(num) = exp;
        !           324: 
        !           325:        str = challoc(6*nlabs); /* 5 digits + , or \0 per label */
        !           326:        for (i = 0; i < d; ++i)         /* construct list of values for each label */
        !           327:                EXP(arctype[i]) = stralloc(str,accum(str,linelabs->nxtlab,arclab[i]));
        !           328:        chfree(str,6*nlabs);
        !           329:        chfree(arctype,sizeof(*arctype) * nlabs);  chfree(arclab,sizeof(*arclab) * nlabs);
        !           330:        return(num);
        !           331:        }
        !           332: 
        !           333: 
        !           334: accum(str,vlist,f)             /* build string of indices in compnode  corr. to label f */
        !           335: char *str;  long f;  struct lablist *vlist;
        !           336:        {
        !           337:        int s,j;  struct lablist  *p;
        !           338: 
        !           339:        s = 0;
        !           340:        j = 1;
        !           341:        for (p = vlist; p ; p = p->nxtlab)              /* search for occurrences of f */
        !           342:                {
        !           343:                if (p->labelt ==f)
        !           344:                        {
        !           345:                        if (s)
        !           346:                                {
        !           347:                                str[s] = ',';
        !           348:                                ++s;
        !           349:                                }
        !           350:                        sprintf(&str[s],"%d",j);
        !           351:                        while (str[s] != '\0') ++s;
        !           352:                        }
        !           353:                ++j;
        !           354:                }
        !           355:        return(s+1);
        !           356:        }
        !           357: 
        !           358: 
        !           359: distinct(vlist,count,dlist,size)               /* make dlist into list of distinct labels in vlist */
        !           360: struct lablist *vlist;  long dlist[];          /*count[] gets count of each label;  d distinct labels */
        !           361: int count[],size;
        !           362:        {int d,i;
        !           363:        d = 0;
        !           364:        for(i = 0; i <= size; i++)  count[i] = 0;
        !           365: 
        !           366:        for (;vlist && vlist->labelt != 0L; vlist = vlist ->nxtlab)
        !           367:                {
        !           368:                for (i = 0; ;i++)
        !           369:                        {
        !           370:                        if (i == d)  dlist[d++] = vlist->labelt;
        !           371:                        if (dlist[i] == vlist->labelt)
        !           372:                                {
        !           373:                                ++count[i];  break;
        !           374:                                }
        !           375:                        }
        !           376:                }
        !           377:        return(d);
        !           378:        }
        !           379: 
        !           380: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.