Annotation of 43BSD/contrib/B/src/bed/wide.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
                      2: static char rcsid[] = "$Header: wide.c,v 2.3 84/07/19 12:01:37 guido Exp $";
                      3: 
                      4: /*
                      5:  * B editor -- Commands to make the focus larger and smaller in various ways.
                      6:  */
                      7: 
                      8: #include "b.h"
                      9: #include "bobj.h"
                     10: #include "node.h"
                     11: #include "supr.h"
                     12: #include "gram.h"
                     13: 
                     14: 
                     15: /*
                     16:  * Widen -- make the focus larger.
                     17:  */
                     18: 
                     19: Visible bool
                     20: widen(ep)
                     21:        register environ *ep;
                     22: {
                     23:        register node n;
                     24:        register int sym;
                     25:        register int ich;
                     26: 
                     27:        higher(ep);
                     28:        grow(ep);
                     29: 
                     30:        n = tree(ep->focus);
                     31:        sym = symbol(n);
                     32:        if (ep->mode == VHOLE && (ep->s1&1))
                     33:                ep->mode = FHOLE;
                     34:                
                     35:        switch (ep->mode) {
                     36: 
                     37:        case ATBEGIN:
                     38:        case ATEND:
                     39:                /* Shouldn't occur after grow(ep) */
                     40:                ep->mode = WHOLE;
                     41:                return Yes;
                     42: 
                     43:        case VHOLE:
                     44:                if (ep->s2 >= lenitem(ep))
                     45:                        --ep->s2;
                     46:                ep->mode = SUBRANGE;
                     47:                ep->s3 = ep->s2;
                     48:                return Yes;
                     49: 
                     50:        case FHOLE:
                     51:                if (ep->s2 >= lenitem(ep)) {
                     52:                        if (ep->s2 > 0)
                     53:                                --ep->s2;
                     54:                        else {
                     55:                                leftvhole(ep);
                     56:                                switch (ep->mode) {
                     57:                                case ATBEGIN:
                     58:                                case ATEND:
                     59:                                        ep->mode = WHOLE;
                     60:                                        return Yes;
                     61:                                case VHOLE:
                     62:                                case FHOLE:
                     63:                                        if (ep->s2 >= lenitem(ep)) {
                     64:                                                if (ep->s2 == 0) {
                     65: #ifndef NDEBUG
                     66:                                                        debug("[Desperate in widen]");
                     67: #endif NDEBUG
                     68:                                                        ep->mode = SUBSET;
                     69:                                                        ep->s2 = ep->s1;
                     70:                                                        return widen(ep);
                     71:                                                }
                     72:                                                --ep->s2;
                     73:                                        }
                     74:                                        ep->mode = SUBRANGE;
                     75:                                        ep->s3 = ep->s2;
                     76:                                        return Yes;
                     77:                                }
                     78:                                Abort();
                     79:                        }
                     80:                }
                     81:                ep->mode = SUBRANGE;
                     82:                ep->s3 = ep->s2;
                     83:                return Yes;
                     84: 
                     85:        case SUBRANGE:
                     86:                ep->mode = SUBSET;
                     87:                ep->s2 = ep->s1;
                     88:                return Yes;
                     89:                        
                     90:        case SUBSET:
                     91:                if (!issublist(sym) || width(lastchild(n)) == 0) {
                     92:                        ep->mode = WHOLE;
                     93:                        return Yes;
                     94:                }
                     95:                if (ep->s2 < 2*nchildren(n)) {
                     96:                        ep->mode = SUBLIST;
                     97:                        ep->s3 = 1;
                     98:                        return Yes;
                     99:                }
                    100:                /* Fall through */
                    101:        case SUBLIST:
                    102:                for (;;) {
                    103:                        ich = ichild(ep->focus);
                    104:                        if (!up(&ep->focus)) {
                    105:                                ep->mode = WHOLE;
                    106:                                return Yes;
                    107:                        }
                    108:                        higher(ep);
                    109:                        n = tree(ep->focus);
                    110:                        if (ich != nchildren(n) || !samelevel(sym, symbol(n))) {
                    111:                                ep->mode = SUBSET;
                    112:                                ep->s1 = ep->s2 = 2*ich;
                    113:                                return Yes;
                    114:                        }
                    115:                }
                    116:                /* Not reached */
                    117:                        
                    118:        case WHOLE:
                    119:                ich = ichild(ep->focus);
                    120:                if (!up(&ep->focus))
                    121:                        return No;
                    122:                n = tree(ep->focus);
                    123:                if (issublist(symbol(n)) && ich < nchildren(n)) {
                    124:                        ep->mode = SUBLIST;
                    125:                        ep->s3 = 1;
                    126:                }
                    127:                return Yes;
                    128: 
                    129:        default:
                    130:                Abort();
                    131:                /* NOTREACHED */
                    132:        }
                    133:        /* Not reached */
                    134: }
                    135: 
                    136: 
                    137: /*
                    138:  * Narrow -- make the focus smaller.
                    139:  */
                    140: 
                    141: Visible bool
                    142: narrow(ep)
                    143:        register environ *ep;
                    144: {
                    145:        register node n;
                    146:        register int sym;
                    147:        register int nch;
                    148:        register string repr;
                    149:        
                    150:        higher(ep);
                    151: 
                    152:        shrink(ep);
                    153:        n = tree(ep->focus);
                    154:        sym = symbol(n);
                    155: 
                    156:        switch (ep->mode) {
                    157:                
                    158:        case ATBEGIN:
                    159:        case ATEND:
                    160:        case VHOLE:
                    161:        case FHOLE:
                    162:                return No;
                    163:        
                    164:        case SUBRANGE:
                    165:                if (ep->s3 > ep->s2)
                    166:                        ep->s3 = ep->s2;
                    167:                else
                    168:                        ep->mode = (ep->s1&1) ? FHOLE : VHOLE;
                    169:                return Yes;
                    170:                
                    171:        case SUBSET:
                    172:                if (ep->s1 <= 2) {
                    173:                        nch = nchildren(n);     
                    174:                        if (ep->s2 >= 2*nch && issublist(symbol(n))) {
                    175:                                if (ep->s1 <= 1) {
                    176:                                        ep->s2 = 2*nch - 1;
                    177:                                        return Yes;
                    178:                                }
                    179:                                repr = noderepr(n)[0];
                    180:                                if (!Fw_positive(repr)) {
                    181:                                        ep->s2 = 2*nch - 1;
                    182:                                        return Yes;
                    183:                                }
                    184:                        }
                    185:                }
                    186:                ep->s2 = ep->s1;
                    187:                return Yes;
                    188:                
                    189:        case SUBLIST:
                    190:                Assert(ep->s3 > 1);
                    191:                ep->s3 = 1;
                    192:                return Yes;
                    193:                
                    194:        case WHOLE:
                    195:                Assert(sym == Hole || sym == Optional);
                    196:                return No;
                    197:                
                    198:        default:
                    199:                Abort();
                    200:                /* NOTREACHED */
                    201:        }
                    202: }
                    203: 
                    204: 
                    205: Visible bool
                    206: extend(ep)
                    207:        register environ *ep;
                    208: {
                    209:        register node n;
                    210:        register int i;
                    211:        register int len;
                    212:        register int s1save;
                    213: 
                    214:        grow(ep);
                    215:        higher(ep);
                    216:        switch (ep->mode) {
                    217: 
                    218:        case VHOLE:
                    219:        case FHOLE:
                    220:        case ATBEGIN:
                    221:        case ATEND:
                    222:                return widen(ep);
                    223: 
                    224:        case SUBRANGE:
                    225:                len = lenitem(ep);
                    226:                if (ep->s3 < len-1)
                    227:                        ++ep->s3;
                    228:                else if (ep->s2 > 0)
                    229:                        --ep->s2;
                    230:                else {
                    231:                        ep->mode = SUBSET;
                    232:                        ep->s2 = ep->s1;
                    233:                        return extend(ep); /* Recursion! */
                    234:                }
                    235:                return Yes;
                    236: 
                    237:        case SUBSET:
                    238:                s1save = ep->s1;
                    239:                ep->s1 = ep->s2;
                    240:                if (nextnnitem(ep)) {
                    241:                        ep->s2 = ep->s1;
                    242:                        ep->s1 = s1save;
                    243:                }
                    244:                else {
                    245:                        ep->s1 = s1save;
                    246:                        prevnnitem(ep) || Abort();
                    247:                }
                    248:                return Yes;
                    249: 
                    250:        case WHOLE:
                    251:                return up(&ep->focus);
                    252: 
                    253:        case SUBLIST:
                    254:                n = tree(ep->focus);
                    255:                for (i = ep->s3; i > 1; --i)
                    256:                        n = lastchild(n);
                    257:                if (samelevel(symbol(n), symbol(lastchild(n)))) {
                    258:                        ++ep->s3;
                    259:                        return Yes;
                    260:                }
                    261:                ep->mode = WHOLE;
                    262:                if (symbol(lastchild(n)) != Optional)
                    263:                        return Yes;
                    264:                return extend(ep); /* Recursion! */
                    265: 
                    266:        default:
                    267:                Abort();
                    268:                /* NOTREACHED */
                    269:        }
                    270: }
                    271: 
                    272: 
                    273: /*
                    274:  * Right-Narrow -- make the focus smaller, going to the last item of a list.
                    275:  */
                    276: 
                    277: Visible bool
                    278: rnarrow(ep)
                    279:        register environ *ep;
                    280: {
                    281:        register node n;
                    282:        register int i;
                    283:        register int sym;
                    284:        
                    285:        higher(ep);
                    286: 
                    287:        shrink(ep);
                    288:        n = tree(ep->focus);
                    289:        sym = symbol(n);
                    290:        if (sym == Optional || sym == Hole)
                    291:                return No;
                    292: 
                    293:        switch (ep->mode) {
                    294:                
                    295:        case ATBEGIN:
                    296:        case ATEND:
                    297:        case VHOLE:
                    298:        case FHOLE:
                    299:                return No;
                    300:        
                    301:        case SUBRANGE:
                    302:                if (ep->s3 > ep->s2)
                    303:                        ep->s2 = ep->s3;
                    304:                else {
                    305:                        ++ep->s2;
                    306:                        ep->mode = (ep->s1&1) ? FHOLE : VHOLE;
                    307:                }
                    308:                return Yes;
                    309:                
                    310:        case SUBSET:
                    311:                if (issublist(sym) && ep->s2 >= 2*nchildren(n)) {
                    312:                        do {
                    313:                                sym = symbol(n);
                    314:                                s_downrite(ep);
                    315:                                n = tree(ep->focus);
                    316:                        } while (samelevel(sym, symbol(n))
                    317:                                && width(lastchild(n)) != 0);
                    318:                        ep->mode = WHOLE;
                    319:                        return Yes;
                    320:                }
                    321:                ep->s1 = ep->s2;
                    322:                return Yes;
                    323:                
                    324:        case SUBLIST:
                    325:                Assert(ep->s3 > 1);
                    326:                for (i = ep->s3; i > 1; --i)
                    327:                        s_downi(ep, nchildren(tree(ep->focus)));
                    328:                ep->s3 = 1;
                    329:                return Yes;
                    330:                
                    331:        case WHOLE:
                    332:                Assert(sym == Hole || sym == Optional);
                    333:                return No;
                    334:                
                    335:        default:
                    336:                Abort();
                    337:                /* NOTREACHED */
                    338:        }
                    339: }

unix.superglobalmegacorp.com

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