Annotation of researchv10no/cmd/gre/egcomp.c, revision 1.1.1.1

1.1       root        1: #include       "re.h"
                      2: #include       "lre.h"
                      3: #include       "hdr.h"
                      4: 
                      5: static Exprtype toktype;
                      6: static int toklit;
                      7: static char *beg, *end;
                      8: static int maxid;
                      9: static Expr *e0(void);
                     10: static Expr *d0(void);
                     11: static Expr *r18(void);
                     12: static void err(char*);
                     13: static int parno;
                     14: static jmp_buf gohome;
                     15: static unsigned char *mymap;
                     16: 
                     17: void
                     18: egpost(re_re *r)
                     19: {
                     20:        r->maxid = maxid;
                     21:        r->backref = r->root->backref;
                     22:        r->parens = r->root->parens;
                     23: }
                     24: 
                     25: Expr *
                     26: eg_newexpr(Exprtype t, int l, Expr *left, Expr *right)
                     27: {
                     28:        register Expr *e = (Expr *)egmalloc(sizeof(Expr), "eg_newexpr");
                     29: 
                     30:        if (!e)
                     31:                return 0;
                     32:        e->type = t;
                     33:        e->parent = 0;
                     34:        e->lit = l;
                     35:        if(e->lit)
                     36:                e->id = maxid++;
                     37:        else
                     38:                e->id = 0;
                     39:        e->backref = 0;
                     40:        e->parens = 0;
                     41:        if(e->l = left){
                     42:                left->parent = e;
                     43:                if(left->backref) e->backref = 1;
                     44:                if(left->parens) e->parens = 1;
                     45:        }
                     46:        if(e->r = right){
                     47:                right->parent = e;
                     48:                if(right->backref) e->backref = 1;
                     49:                if(right->parens) e->parens = 1;
                     50:        }
                     51:        e->follow = 0;
                     52:        e->flen = 0;
                     53:        e->reallit = 0;
                     54:        return(e);
                     55: }
                     56: 
                     57: void
                     58: eg_lexinit(char *b, char *e)
                     59: {
                     60:        beg = b;
                     61:        end = e;
                     62:        maxid = 1;
                     63:        parno = 1;
                     64: }
                     65: 
                     66: void
                     67: eg_lex(void)
                     68: {
                     69:        if(beg == end){
                     70:                toktype = EOP;
                     71:                toklit = -1;
                     72:        } else switch(toklit = *beg++)
                     73:        {
                     74:        case '.':       toktype = Dot; break;
                     75:        case '*':       toktype = Star; break;
                     76:        case '+':       toktype = Plus; break;
                     77:        case '?':       toktype = Quest; break;
                     78:        case '^':       toktype = Carat; break;
                     79:        case '$':       toktype = Dollar; break;
                     80:        case '[':       toktype = Charclass; break;
                     81:        case '\n':
                     82:        case '|':       toktype = Alternate; break;
                     83:        case '(':       toktype = Lpar; break;
                     84:        case ')':       toktype = Rpar; break;
                     85:        case '\\':      toktype = Backslash;
                     86:                        if(beg == end)
                     87:                                err("bad \\");
                     88:                        else
                     89:                                toklit = *beg++;
                     90:                        break;
                     91:        default:        toktype = Literal; break;
                     92:        }
                     93: }
                     94: 
                     95: void
                     96: eg_epr(register Expr *e, char *res, int doset)
                     97: {
                     98:        char r1[EPRINTSIZE], r2[EPRINTSIZE], rid[EPRINTSIZE];
                     99:        int ids = 0;            /* sort of a debugging flag */
                    100: 
                    101:        if(e == 0){
                    102:                SPR res, "!0!");
                    103:                return;
                    104:        }
                    105:        r1[0] = 0;
                    106:        if(ids)
                    107:                SPR rid, "%d:", e->id);
                    108:        else
                    109:                rid[0] = 0;
                    110:        switch(e->type)
                    111:        {
                    112:        case Literal:
                    113:                if(doset)
                    114:                        eg_spr(e->flen, e->follow, r1);
                    115:                SPR res, "%s'%c'%s", rid, e->lit, r1);
                    116:                break;
                    117:        case Dot:
                    118:        case Carat:
                    119:        case Dollar:
                    120:                if(doset)
                    121:                        eg_spr(e->flen, e->follow, r1);
                    122:                SPR res, "%s%c%s", rid, e->lit, r1);
                    123:                break;
                    124:        case Compcharclass:
                    125:        case Charclass:
                    126:                *res++ = '[';
                    127:                if(e->type == Compcharclass)
                    128:                        *res++ = '^';
                    129:                memmove(res, (char *)e->r, (int)e->l);
                    130:                res += (int)e->l;
                    131:                *res++ = ']';
                    132:                *res = 0;
                    133:                break;
                    134:        case Cat:
                    135:                eg_epr(e->l, r1, doset);
                    136:                eg_epr(e->r, r2, doset);
                    137:                SPR res, "%s%s%s", rid, r1, r2);
                    138:                break;
                    139:        case Alternate:
                    140:                eg_epr(e->l, r1, doset);
                    141:                eg_epr(e->r, r2, doset);
                    142:                SPR res, "%s(%s|%s)", rid, r1, r2);
                    143:                break;
                    144:        case Star:
                    145:                eg_epr(e->l, r1, doset);
                    146:                SPR res, "%s(%s)*", rid, r1);
                    147:                break;
                    148:        case Plus:
                    149:                eg_epr(e->l, r1, doset);
                    150:                SPR res, "%s(%s)+", rid, r1);
                    151:                break;
                    152:        case Quest:
                    153:                eg_epr(e->l, r1, doset);
                    154:                SPR res, "%s(%s)?", rid, r1);
                    155:                break;
                    156:        case Group:
                    157:                eg_epr(e->l, r1, doset);
                    158:                SPR res, "%sG<%s>", rid, r1);
                    159:                break;
                    160:        case EOP:
                    161:                eg_epr(e->l, r1, doset);
                    162:                SPR res, "%s%s<EOP>", rid, r1);
                    163:                break;
                    164:        case Backref:
                    165:                SPR res, "%s\\%d", rid, e->lit);
                    166:                break;
                    167:        default:
                    168:                SPR res, "<undef type %d>", e->type);
                    169:                err(res);
                    170:                break;
                    171:        }
                    172: }
                    173: 
                    174: static void
                    175: ccl(int *count, char **str, int oldrange)
                    176: {
                    177:        register n;
                    178:        int cnt;
                    179:        char tab[256], *s;
                    180:        int range, lastc, i;
                    181: 
                    182: #define        TSET(b) {if(tab[n = mymap[(b)]] == 0){ tab[n] = 1; cnt++; } }
                    183: 
                    184:        cnt = 0;
                    185:        memset(tab, 0, sizeof tab);
                    186:        lastc = -1;
                    187:        range = 0;
                    188:        /* scan for chars */
                    189:        for(; (beg < end); beg++){
                    190:                toklit = *beg;
                    191:                if(*beg == ']'){
                    192:                        if(!oldrange)
                    193:                                break;
                    194:                        if(lastc >= 0)
                    195:                                break;
                    196:                }
                    197:                if(*beg == '-'){
                    198:                        if(lastc < 0){
                    199:                                TSET('-')
                    200:                                lastc = *(unsigned char *)beg;
                    201:                        } else
                    202:                                range = 1;
                    203:                        continue;
                    204:                }
                    205:                if(*beg == '\\'){
                    206:                        if(++beg >= end){
                    207:                                err("unexpected eop after \\ in char class");
                    208:                                beg--;
                    209:                        }
                    210:                }
                    211:                if(range){
                    212:                        for(i = *(unsigned char *)beg; i >= lastc; i--)
                    213:                                TSET(i)
                    214:                        range = 0;
                    215:                } else
                    216:                        TSET(*(unsigned char *)beg)
                    217:                lastc = *(unsigned char *)beg;
                    218:        }
                    219:        if(range){
                    220:                if(oldrange)
                    221:                        TSET('-')
                    222:                else
                    223:                        err("unterminated range in []");
                    224:        }
                    225:        if(beg < end)
                    226:                beg++;
                    227:        else
                    228:                err("eop during ccl");
                    229:        if(cnt == 0)
                    230:                err("empty charclass");
                    231:        eg_lex();
                    232:        *count = cnt;
                    233:        *str = s = (char *)egmalloc(cnt, "charclass defn");
                    234:        if (!s)
                    235:                return;
                    236:        for(n = 0; n < 256; n++)
                    237:                if(tab[n])
                    238:                        *s++ = n;
                    239: }
                    240: 
                    241: /*
                    242:        gre patterns:
                    243: 
                    244:        e0:     e1 { '|' e1 }*
                    245:        e1:     e2 { e2 }*
                    246:        e2:     e3 { '*' | '?' | '+' | \{ m,n \} }*
                    247:        e3:     lit | '.' | '^' | '$' | '(' e0 ')'
                    248: */
                    249: 
                    250: static Expr *
                    251: e3(void)
                    252: {
                    253:        Expr *e;
                    254:        Exprtype t;
                    255:        int cnt;
                    256:        char *s;
                    257: 
                    258:        switch(toktype)
                    259:        {
                    260:        case Backslash:
                    261:                if((toklit >= '1') && (toklit <= '9')){
                    262:                        e = eg_newexpr(Backref, toklit-'0', (Expr *)0, (Expr *)0);
                    263:                        e->backref = 1;
                    264:                } else
                    265:                        e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
                    266:                eg_lex();
                    267:                break;
                    268:        case Literal:
                    269:                e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
                    270:                eg_lex();
                    271:                break;
                    272:        case Dot:
                    273:                e = eg_newexpr(Dot, '.', (Expr *)0, (Expr *)0);
                    274:                eg_lex();
                    275:                break;
                    276:        case Carat:
                    277:                e = eg_newexpr(Carat, '^', (Expr *)0, (Expr *)0);
                    278:                eg_lex();
                    279:                break;
                    280:        case Dollar:
                    281:                e = eg_newexpr(Dollar, '$', (Expr *)0, (Expr *)0);
                    282:                eg_lex();
                    283:                break;
                    284:        case Charclass:
                    285:                t = toktype;
                    286:                if(*beg == '^'){
                    287:                        t = Compcharclass;
                    288:                        beg++;
                    289:                }
                    290:                ccl(&cnt, &s, 0);
                    291:                e = eg_newexpr(t, '[', (Expr *)0, (Expr *)0);
                    292:                e->l = (Expr *)cnt;     /* num of chars */
                    293:                e->r = (Expr *)s;       /* chars */
                    294:                break;
                    295:        case Lpar:
                    296:                eg_lex();
                    297:                cnt = parno++;
                    298:                e = e0();
                    299:                if(toktype == Rpar)
                    300:                        eg_lex();
                    301:                else
                    302:                        err("expected a ')'");
                    303:                e = eg_newexpr(Group, cnt, e, (Expr *)0);
                    304:                e->parens = 1;
                    305:                return(e);
                    306:        case EOP:
                    307:        default:
                    308:                err("expected a lit or '('");
                    309:                e = 0;
                    310:        }
                    311:        return(e);
                    312: }
                    313: 
                    314: static int
                    315: integer(void)
                    316: {
                    317:        int n;
                    318: 
                    319:        n = 0;
                    320:        while((toktype == Literal) && (toklit >= '0') && (toklit <= '9')){
                    321:                n = 10*n + toklit-'0';
                    322:                eg_lex();
                    323:        }
                    324:        return(n);
                    325: }
                    326: 
                    327: static Expr *
                    328: ecopy(Expr *e)
                    329: {
                    330:        Expr *ee;
                    331:        char res[256];
                    332: 
                    333:        if(e == 0)
                    334:                return(e);
                    335:        switch(e->type)
                    336:        {
                    337:        case Literal:
                    338:        case Dot:
                    339:        case Carat:
                    340:        case Dollar:
                    341:        case Backref:
                    342:                return(eg_newexpr(e->type, e->lit, (Expr *)0, (Expr *)0));
                    343:        case Compcharclass:
                    344:        case Charclass:
                    345:                ee = eg_newexpr(e->type, e->lit, (Expr *)0, (Expr *)0);
                    346:                ee->r = (Expr *)egmalloc((int)e->l, "expr copy");
                    347:                if (!ee->r)
                    348:                        return 0;
                    349:                ee->l = e->l;
                    350:                memmove((char *)ee->r, (char *)e->r, (int)e->l);
                    351:                return(ee);
                    352:        case Cat:
                    353:        case Alternate:
                    354:                return(eg_newexpr(e->type, e->lit, ecopy(e->l), ecopy(e->r)));
                    355:        case Star:
                    356:        case Plus:
                    357:        case Quest:
                    358:        case Group:
                    359:        case EOP:
                    360:                return(eg_newexpr(e->type, e->lit, ecopy(e->l), (Expr *)0));
                    361:        default:
                    362:                SPR res, "<undef type %d>", e->type);
                    363:                err(res);
                    364:                return((Expr *)0);
                    365:        }
                    366: }
                    367: 
                    368: static Expr *
                    369: edup(Expr *expr, int n, int opt)
                    370: {
                    371:        if(n == 1){
                    372:                expr = ecopy(expr);
                    373:                if(opt)
                    374:                        expr = eg_newexpr(Quest, 0, expr, (Expr *)0);
                    375:                return(expr);
                    376:        }
                    377:        return(eg_newexpr(Cat, 0, edup(expr, n-n/2, opt), edup(expr, n/2, opt)));
                    378: }
                    379: 
                    380: static Expr *
                    381: range(Expr *expr)
                    382: {
                    383:        int beg, end;
                    384:        Expr *e, *e1;
                    385: 
                    386:        if((toktype == Literal) && (toklit >= '0') && (toklit <= '9'))
                    387:                beg = integer();
                    388:        else
                    389:                err("expected a number in range");
                    390:        if((toktype == Literal) && (toklit == ',')){
                    391:                end = -1;
                    392:                eg_lex();
                    393:        } else
                    394:                end = -2;
                    395:        if((toktype == Literal) && (toklit >= '0') && (toklit <= '9'))
                    396:                end = integer();
                    397:        if((toktype == Backslash) && (toklit == '}'))
                    398:                eg_lex();
                    399:        else
                    400:                err("expected \\} in range");
                    401:        e1 = edup(expr, beg, 0);
                    402:        if(end == -2)
                    403:                e = e1;
                    404:        else if(end == -1)
                    405:                e = eg_newexpr(Cat, 0, e1, eg_newexpr(Star, 0, expr, (Expr *)0));
                    406:        else {
                    407:                if(end < beg)
                    408:                        err("bad range specification");
                    409:                e = (end > beg)? eg_newexpr(Cat, 0, e1, edup(expr, end-beg, 1)) : e1;
                    410:        }
                    411:        return(e);
                    412: }
                    413: 
                    414: static Expr *
                    415: e2(void)
                    416: {
                    417:        Expr *e;
                    418:        Exprtype t;
                    419: 
                    420:        e = e3();
                    421:        while((toktype == Star) || (toktype == Plus) || (toktype == Quest)
                    422:                        || ((toktype == Backslash) && (toklit == '{'))){
                    423:                if((toktype == Backslash) && (toklit == '{')){
                    424:                        eg_lex();
                    425:                        e = range(e);
                    426:                } else {
                    427:                        t = toktype;
                    428:                        eg_lex();
                    429:                        e = eg_newexpr(t, 0, e, (Expr *)0);
                    430:                }
                    431:        }
                    432:        return(e);
                    433: }
                    434: 
                    435: static Expr *
                    436: e1(void)
                    437: {
                    438:        Expr *e, *f;
                    439: 
                    440:        e = e2();
                    441:        while((toktype == Literal) || (toktype == Dot) || (toktype == Lpar)
                    442:                        || (toktype == Backslash) || (toktype == Dollar)
                    443:                        || (toktype == Carat) || (toktype == Charclass)){
                    444:                f = e2();
                    445:                e = eg_newexpr(Cat, 0, e, f);
                    446:        }
                    447:        return(e);
                    448: }
                    449: 
                    450: static Expr *
                    451: e0(void)
                    452: {
                    453:        Expr *e, *f;
                    454: 
                    455:        e = e1();
                    456:        while(toktype == Alternate){
                    457:                eg_lex();
                    458:                if(toktype == EOP)
                    459:                        continue;
                    460:                f = e1();
                    461:                e = eg_newexpr(Alternate, 0, e, f);
                    462:        }
                    463:        return(e);
                    464: }
                    465: 
                    466: /*
                    467:        egrep patterns:
                    468: 
                    469:        d0:     d1 { '|' d1 }*
                    470:        d1:     d2 { d2 }*
                    471:        d2:     d3 { '*' | '?' | '+' }
                    472:        d3:     lit | '.' | '^' | '$' | '(' d0 ')'
                    473: */
                    474: 
                    475: static Expr *
                    476: d3(void)
                    477: {
                    478:        Expr *e;
                    479:        Exprtype t;
                    480:        int cnt;
                    481:        char *s;
                    482: 
                    483:        switch(toktype)
                    484:        {
                    485:        case Backslash:
                    486:        case Literal:
                    487:                e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
                    488:                eg_lex();
                    489:                break;
                    490:        case Dot:
                    491:                e = eg_newexpr(Dot, '.', (Expr *)0, (Expr *)0);
                    492:                eg_lex();
                    493:                break;
                    494:        case Carat:
                    495:                e = eg_newexpr(Carat, '^', (Expr *)0, (Expr *)0);
                    496:                eg_lex();
                    497:                break;
                    498:        case Dollar:
                    499:                e = eg_newexpr(Dollar, '$', (Expr *)0, (Expr *)0);
                    500:                eg_lex();
                    501:                break;
                    502:        case Charclass:
                    503:                t = toktype;
                    504:                if(*beg == '^'){
                    505:                        t = Compcharclass;
                    506:                        beg++;
                    507:                }
                    508:                ccl(&cnt, &s, 1);
                    509:                e = eg_newexpr(t, '[', (Expr *)0, (Expr *)0);
                    510:                e->l = (Expr *)cnt;     /* num of chars */
                    511:                e->r = (Expr *)s;       /* chars */
                    512:                break;
                    513:        case Lpar:
                    514:                eg_lex();
                    515:                e = d0();
                    516:                if(toktype == Rpar)
                    517:                        eg_lex();
                    518:                else
                    519:                        err("expected a ')'");
                    520:                return(e);
                    521:        default:
                    522:                err("expected a lit or '('");
                    523:                e = 0;
                    524:        }
                    525:        return(e);
                    526: }
                    527: 
                    528: static Expr *
                    529: d2(void)
                    530: {
                    531:        Expr *e;
                    532:        Exprtype t;
                    533: 
                    534:        e = d3();
                    535:        while((toktype == Star) || (toktype == Plus) || (toktype == Quest)){
                    536:                t = toktype;
                    537:                eg_lex();
                    538:                e = eg_newexpr(t, 0, e, (Expr *)0);
                    539:        }
                    540:        return(e);
                    541: }
                    542: 
                    543: static Expr *
                    544: d1(void)
                    545: {
                    546:        Expr *e, *f;
                    547: 
                    548:        e = d2();
                    549:        while((toktype == Literal) || (toktype == Dot) || (toktype == Lpar)
                    550:                        || (toktype == Dollar) || (toktype == Backslash)
                    551:                        || (toktype == Carat) || (toktype == Charclass)){
                    552:                f = d2();
                    553:                e = eg_newexpr(Cat, 0, e, f);
                    554:        }
                    555:        return(e);
                    556: }
                    557: 
                    558: static Expr *
                    559: d0(void)
                    560: {
                    561:        Expr *e, *f;
                    562: 
                    563:        e = d1();
                    564:        while(toktype == Alternate){
                    565:                eg_lex();
                    566:                if(toktype == EOP)
                    567:                        continue;
                    568:                f = d1();
                    569:                e = eg_newexpr(Alternate, 0, e, f);
                    570:        }
                    571:        return(e);
                    572: }
                    573: 
                    574: /*
                    575:        grep patterns:
                    576: 
                    577:        r0:     r18 | '^' r18 | '^' r18 '$' | r18 '$'
                    578:        r18:    r17 { r17 }*
                    579:        r17:    r14 | r14 '*' | '\(' r18 '\)'
                    580:        r14:    lit | '.' | '*' | '\' d
                    581: */
                    582: 
                    583: static Expr *
                    584: r14(void)
                    585: {
                    586:        Expr *e;
                    587:        Exprtype t;
                    588:        int cnt;
                    589:        char *s;
                    590: 
                    591:        switch(toktype)
                    592:        {
                    593:        case Alternate:
                    594:        case Plus:
                    595:        case Quest:
                    596:        case Star:
                    597:        case Lpar:
                    598:        case Rpar:
                    599:        case Dollar:
                    600:        case Carat:
                    601:        case Literal:
                    602:                e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
                    603:                eg_lex();
                    604:                break;
                    605:        case Backslash:
                    606:                if((toklit >= '1') && (toklit <= '9')){
                    607:                        e = eg_newexpr(Backref, toklit-'0', (Expr *)0, (Expr *)0);
                    608:                        e->backref = 1;
                    609:                } else {
                    610:                        e = eg_newexpr(Literal, toklit, (Expr *)0, (Expr *)0);
                    611:                        e->reallit = 1;
                    612:                }
                    613:                eg_lex();
                    614:                break;
                    615:        case Dot:
                    616:                e = eg_newexpr(Dot, '.', (Expr *)0, (Expr *)0);
                    617:                eg_lex();
                    618:                break;
                    619:        case Charclass:
                    620:                t = toktype;
                    621:                if(*beg == '^'){
                    622:                        t = Compcharclass;
                    623:                        beg++;
                    624:                }
                    625:                ccl(&cnt, &s, 1);
                    626:                e = eg_newexpr(t, '[', (Expr *)0, (Expr *)0);
                    627:                e->l = (Expr *)cnt;     /* num of chars */
                    628:                e->r = (Expr *)s;       /* chars */
                    629:                break;
                    630:        default:
                    631:                err("expected a one-char RE");
                    632:                eg_lex();               /* make sure we don't loop */
                    633:                e = 0;
                    634:        }
                    635:        return(e);
                    636: }
                    637: 
                    638: static Expr *
                    639: r17(void)
                    640: {
                    641:        Expr *e;
                    642:        int cnt;
                    643: 
                    644:        if((toktype == Backslash) && (toklit == '(')){
                    645:                eg_lex();
                    646:                cnt = parno++;
                    647:                e = r18();
                    648:                if((toktype == Backslash) && (toklit == ')'))
                    649:                        eg_lex();
                    650:                else
                    651:                        err("expected a closing \\)");
                    652:                e = eg_newexpr(Group, cnt, e, (Expr *)0);
                    653:                e->parens = 1;
                    654:        } else {
                    655:                e = r14();
                    656:                if(toktype == Star){
                    657:                        e = eg_newexpr(Star, 0, e, (Expr *)0);
                    658:                        eg_lex();
                    659:                }
                    660:        }
                    661:        return(e);
                    662: }
                    663: 
                    664: static Expr *
                    665: r18(void)
                    666: {
                    667:        Expr *e, *f;
                    668: 
                    669:        e = r17();
                    670:        while(toktype != EOP){
                    671:                if((toktype == Backslash) && (toklit == ')'))
                    672:                        break;
                    673:                f = r17();
                    674:                e = eg_newexpr(Cat, 0, e, f);
                    675:        }
                    676:        return(e);
                    677: }
                    678: 
                    679: static Expr *
                    680: r0(void)
                    681: {
                    682:        Expr *e, *e1;
                    683: 
                    684:        if(toktype == Carat){
                    685:                e1 = eg_newexpr(Carat, '^', (Expr *)0, (Expr *)0);
                    686:                eg_lex();
                    687:        } else
                    688:                e1 = 0;
                    689:        if(toktype == EOP)
                    690:                e = e1;
                    691:        else {
                    692:                e = r18();
                    693:                /* did we see a dollar that is not a literal? */
                    694:                if(e && (toktype == EOP)){
                    695:                        /* singleton dollar */
                    696:                        if((e->type == Literal) && (e->lit == '$'))
                    697:                                e->type = Dollar;
                    698:                        /* any other dollar */
                    699:                        if((e->type == Cat) && !e->r->reallit && (e->r->type == Literal)
                    700:                                        && (e->r->lit == '$'))
                    701:                                e->r->type = Dollar;
                    702:                }
                    703:                if(e1){
                    704:                        if(e)
                    705:                                e = eg_newexpr(Cat, 0, e1, e);
                    706:                        else
                    707:                                e = e1;
                    708:                }
                    709:        }
                    710:        if(toktype == Dollar){
                    711:                if(e)
                    712:                        e = eg_newexpr(Cat, 0, e, eg_newexpr(Dollar, '$', (Expr *)0, (Expr *)0));
                    713:                else
                    714:                        e = eg_newexpr(Dollar, '$', (Expr *)0, (Expr *)0);
                    715:                eg_lex();
                    716:        }
                    717:        return(e);
                    718: }
                    719: 
                    720: Expr *
                    721: eg_eall(enum Parsetype type, unsigned char *map)
                    722: {
                    723:        Expr *e;
                    724: 
                    725:        mymap = map;
                    726:        if(setjmp(gohome) == 0){
                    727:                if(type == egrepparse)
                    728:                        while(toktype == Alternate)     /* bogus but user-friendly */
                    729:                                eg_lex();
                    730:                switch(type)
                    731:                {
                    732:                case greparse:          e = e0(); break;
                    733:                case grepparse:         e = r0(); break;
                    734:                case egrepparse:        e = d0(); break;
                    735:                }
                    736:                if(type == egrepparse)
                    737:                        while(toktype == Alternate)     /* bogus but user-friendly */
                    738:                                eg_lex();
                    739:                if(toktype != EOP)
                    740:                        err("expected end of pattern");
                    741:        } else
                    742:                e = 0;
                    743: /*{char buf1[4096]; e, buf1, 0); print("e='%s'\n", buf1);}/**/
                    744:        return(e);
                    745: }
                    746: 
                    747: void
                    748: eg_spr(long c, int *p, register char *buf)
                    749: {
                    750:        if(c > 0){
                    751:                *buf++ = '{';
                    752:                *buf = 0;
                    753:                while(--c > 0){
                    754:                        SPR buf, "%d,", *p++);
                    755:                        buf = strchr(buf, 0);
                    756:                }
                    757:                SPR buf, "%d}", *p);
                    758:        } else
                    759:                SPR buf, "{}");
                    760: }
                    761: 
                    762: static void
                    763: err(char *s)
                    764: {
                    765:        char buf[4096];
                    766: 
                    767:        if(toklit < 0)
                    768:                SPR buf, "expression error: %s but got end of expression", s);
                    769:        else
                    770:                SPR buf, "expression error: %s near '%c'", s, toklit);
                    771:        re_error(buf);
                    772:        longjmp(gohome, 1);
                    773: }

unix.superglobalmegacorp.com

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