Annotation of 40BSD/cmd/struct/3.loop.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include "def.h"
                      3: #include "3.def.h"
                      4: 
                      5: #define ARCCOUNT(v)    REACH(v)
                      6: 
                      7: 
                      8: fixhd(v,hd,head)
                      9: VERT v,hd,*head;
                     10:        {
                     11:        VERT w,newhd;
                     12:        int i;
                     13:        head[v] = hd;
                     14:        newhd = (NTYPE(v) == ITERVX) ? v : hd;
                     15:        for (i = 0; i < CHILDNUM(v); ++i)
                     16:                for (w = LCHILD(v,i); DEFINED(w); w = RSIB(w))
                     17:                        fixhd(w,newhd,head);
                     18:        }
                     19: 
                     20: getloop()
                     21:        {
                     22:        cntarcs();
                     23:        fixloop(START);
                     24:        }
                     25: 
                     26: 
                     27: cntarcs()      /* count arcs entering each node */
                     28:        {
                     29:        VERT w,v;
                     30:        int i;
                     31:        for (v = 0; v < nodenum; ++v)
                     32:                ARCCOUNT(v) = 0;
                     33:        for (v = 0; v < nodenum; ++v)
                     34:                for (i = 0; i < ARCNUM(v); ++i)
                     35:                        {
                     36:                        w = ARC(v,i);
                     37:                        if (!DEFINED(w)) continue;
                     38:                        ++ARCCOUNT(w);
                     39:                        }
                     40:        }
                     41: 
                     42: 
                     43: fixloop(v)             /* find WHILE loops  */
                     44: VERT v;
                     45:        {
                     46:        int recvar;
                     47:        if (NTYPE(v) == LOOPVX)
                     48:                {
                     49:                ASSERT(DEFINED(ARC(v,0)),fixloop);
                     50:                NXT(ARC(v,0)) = ARC(v,0);
                     51:                if (!getwh(v))
                     52:                        getun(v);
                     53:                }
                     54:        else if (NTYPE(v) == IFVX && arbcase)
                     55:                getswitch(v);
                     56:        else if (NTYPE(v)==DOVX)
                     57:                {
                     58:                ASSERT(DEFINED(ARC(v,0)),fixloop);
                     59:                NXT(ARC(v,0))=ARC(v,0);
                     60:                }
                     61:        RECURSE(fixloop,v,recvar);
                     62:        }
                     63: 
                     64: 
                     65: getwh(v)
                     66: VERT v;
                     67:        {
                     68:        VERT vchild, vgrand,vgreat;
                     69:        ASSERT(NTYPE(v) == LOOPVX,getwh);
                     70:        vchild = LCHILD(v,0);
                     71:        ASSERT(DEFINED(vchild),getwh);
                     72:        ASSERT(NTYPE(vchild) == ITERVX,getwh);
                     73:        vgrand = LCHILD(vchild,0);
                     74:        if (!DEFINED(vgrand) || !IFTHEN(vgrand) )
                     75:                return(FALSE);
                     76:        vgreat = LCHILD(vgrand,THEN);
                     77:        if (DEFINED(vgreat) && NTYPE(vgreat) == GOVX && ARC(vgreat,0) == BRK(vchild))
                     78:                {
                     79:                /* turn into WHILE */
                     80:                NTYPE(v) = WHIVX;
                     81:                NEG(vgrand) = !NEG(vgrand);
                     82:                LPRED(vchild) = vgrand; 
                     83:                LCHILD(vchild,0) = RSIB(vgrand);
                     84:                RSIB(vgrand) = UNDEFINED;
                     85:                return(TRUE);
                     86:                }
                     87:        return(FALSE);
                     88:        }
                     89: 
                     90: 
                     91: 
                     92: getun(v)               /* change loop to REPEAT UNTIL if possible */
                     93: VERT v;
                     94:        {
                     95:        VERT vchild, vgrand,  vgreat, before, ch;
                     96:        ASSERT(NTYPE(v) == LOOPVX,getun);
                     97:        vchild = LCHILD(v,0);
                     98:        ASSERT(DEFINED(vchild), getun);
                     99:        if (ARCCOUNT(vchild) > 2) 
                    100:                return(FALSE);          /* loop can be iterated without passing through predicate of UNTIL */
                    101:        vgrand = ARC(vchild,0);
                    102:        if (!DEFINED(vgrand))
                    103:                return(FALSE);
                    104:        for (ch = vgrand,before = UNDEFINED; DEFINED(RSIB(ch)); ch = RSIB(ch))
                    105:                before = ch;
                    106:        if (!IFTHEN(ch))
                    107:                return(FALSE);
                    108:        vgreat = LCHILD(ch,THEN);
                    109:        if (DEFINED(vgreat) && NTYPE(vgreat) == GOVX && ARC(vgreat,0) == BRK(vchild))
                    110:                {
                    111:                /* create  UNTIL node */
                    112:                NTYPE(v) = UNTVX;
                    113:                NXT(vchild) = ch;
                    114:                LPRED(vchild)=ch;
                    115:                RSIB(before) = UNDEFINED;
                    116:                return(TRUE);
                    117:                }
                    118:        return(FALSE);
                    119:        }
                    120: 
                    121: 
                    122: #define FORMCASE(w)    (DEFINED(w) && !DEFINED(RSIB(w)) && NTYPE(w) == IFVX && ARCCOUNT(w) == 1)
                    123: 
                    124: getswitch(v)
                    125: VERT v;
                    126:        {
                    127:        VERT ch, grand, temp;
                    128:        /* must be of form if ... else if ... else if ... */
                    129:        if (NTYPE(v) != IFVX) return(FALSE);
                    130:        ch = LCHILD(v,ELSE);
                    131:        if (!FORMCASE(ch)) return(FALSE);
                    132:        grand = LCHILD(ch,ELSE);
                    133:        if (!FORMCASE(grand)) return(FALSE);
                    134: 
                    135:        temp = create(SWCHVX,0);
                    136:        exchange(&graph[temp],&graph[v]);       /* want arcs to enter switch, not first case*/
                    137:        BEGCOM(v) = UNDEFINED;
                    138:        RSIB(v) = RSIB(temp);           /* statements which followed IFVX should follow switch */
                    139:        EXP(v) = UNDEFINED;
                    140:        LCHILD(v,0) = temp;
                    141:        NTYPE(temp) = ACASVX;
                    142:        for (ch = LCHILD(temp,ELSE); FORMCASE(ch); )
                    143:                {
                    144:                LCHILD(temp,ELSE) = UNDEFINED;
                    145:                RSIB(temp) = ch;
                    146:                NTYPE(ch) = ACASVX;
                    147:                temp = ch;
                    148:                ch = LCHILD(temp,ELSE);
                    149:                }
                    150:        ASSERT(!DEFINED(RSIB(temp)),getswitch);
                    151:        return(TRUE);
                    152:        }

unix.superglobalmegacorp.com

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