Annotation of researchv10dc/cmd/gre/egbr.c, revision 1.1.1.1

1.1       root        1: #include       "re.h"
                      2: #include       "lre.h"
                      3: #include       "hdr.h"
                      4: 
                      5: #define        DEBUG
                      6: 
                      7: static Br *seq(Expr *);
                      8: static Br *spew(Br_type, Expr*, int);
                      9: 
                     10: static Expr *eop;
                     11: 
                     12: static char tabs[] = { '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t',
                     13:        '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', '\t', 0
                     14: };
                     15: #define        SPACE(d)        (&tabs[sizeof tabs - (d) - 1])
                     16: 
                     17: static void
                     18: init1(register Br *br, re_re *r)
                     19: {
                     20:        switch(br->type)
                     21:        {
                     22:        case br_re:
                     23:                br->r = (re_re *)egmalloc(sizeof(re_re), "egbr");
                     24: #ifdef DEBUG
                     25:                if(TRACE(3))
                     26:                        PR "b@%ld->r = %ld\n", br, br->r);
                     27: #endif
                     28:                if(!br->r)
                     29:                        return;
                     30:                memcpy((char *)br->r, (char *)r, sizeof(*r));
                     31:                if(br->e->type != EOP)
                     32:                        br->e = eg_newexpr(EOP, '#', br->e, (Expr *)0);
                     33:                br->r->root = br->e;
                     34:                br->e->id = eop->id;
                     35:                br->r->br = br;
                     36:                br->r->backref = br->r->root->backref;
                     37:                br->r->parens = br->r->root->parens;
                     38:                eginit(br->r, br == r->br);
                     39:                break;
                     40:        case br_star:
                     41:        case br_plus:
                     42:        case br_quest:
                     43:        case br_group:
                     44:                init1(br->lb, r);
                     45:                break;
                     46:        case br_cat:
                     47:        case br_alt:
                     48:                init1(br->lb, r);
                     49:                init1(br->rb, r);
                     50:                break;
                     51:        }
                     52: }
                     53: 
                     54: void
                     55: egbr(re_re *r)
                     56: {
                     57:        eop = 0;
                     58: /*
                     59: #ifdef DEBUG
                     60:        if(1||TRACE(3)){
                     61:                char buf[EPRINTSIZE];
                     62: 
                     63:                eg_epr(r->root, buf, 0);
                     64:                PR "egbr(%s) ->\n", buf);
                     65:                eg_brpr(seq(r->root));
                     66:        }
                     67: #endif
                     68: /**/
                     69:        egcanon(r->root);
                     70:        r->br = seq(r->root);
                     71: #ifdef DEBUG
                     72:        if(TRACE(3)){
                     73:                char buf[EPRINTSIZE];
                     74: 
                     75:                eg_epr(r->root, buf, 0);
                     76:                PR "egbr(%s) ->\n", buf);
                     77:                eg_brpr(r->br);
                     78:        }
                     79: #endif
                     80:        init1(r->br, r);
                     81: }
                     82: 
                     83: #ifdef DEBUG
                     84: static void
                     85: brpr1(Br *b, int depth)
                     86: {
                     87:        char buf[EPRINTSIZE];
                     88: 
                     89:        PR "%s%d@", SPACE(depth), (int)b);
                     90:        switch(b->type)
                     91:        {
                     92:        case br_br:
                     93:                PR "BR %d\n", b->group);
                     94:                break;
                     95:        case br_re:
                     96:                eg_epr((Expr *)b->e, buf, 0);
                     97:                if(((Expr *)b->e)->backref) PR "X");
                     98:                if(((Expr *)b->e)->parens) PR "()");
                     99:                PR "RE/%s/%d\n", buf, (int)b->r);
                    100:                break;
                    101:        case br_group:
                    102:                PR "GROUP %d\n", b->group);
                    103:                brpr1(b->lb, depth+1);
                    104:                break;
                    105:        case br_quest:
                    106:                PR "BR?");
                    107:                brpr1(b->lb, depth+1);
                    108:                break;
                    109:        case br_plus:
                    110:                PR "BR+\n");
                    111:                brpr1(b->lb, depth+1);
                    112:                break;
                    113:        case br_star:
                    114:                PR "BR*\n");
                    115:                brpr1(b->lb, depth+1);
                    116:                break;
                    117:        case br_cat:
                    118:                PR "BR CAT\n");
                    119:                brpr1(b->lb, depth+1);
                    120:                brpr1(b->rb, depth+1);
                    121:                break;
                    122:        case br_alt:
                    123:                PR "BR |\n");
                    124:                brpr1(b->lb, depth+1);
                    125:                brpr1(b->rb, depth+1);
                    126:                break;
                    127:        default:
                    128:                PR "BADTYPE/%d/\n", b->type);
                    129:                break;
                    130:        }
                    131: }
                    132: 
                    133: void
                    134: eg_brpr(Br *br)
                    135: {
                    136:        brpr1(br, 0);
                    137: }
                    138: #endif
                    139: 
                    140: static Br *
                    141: seq(Expr *e)
                    142: {
                    143:        Br *br;
                    144: 
                    145:        if(e->type == EOP)
                    146:                eop = e;
                    147:        if(!e->backref && !e->parens)
                    148:                return(spew(br_re, e, -1));
                    149:        switch(e->type)
                    150:        {
                    151:        case Cat:
                    152:                br = spew(br_cat, (Expr *)0, -1);
                    153:                br->lb = seq(e->l);
                    154:                br->rb = seq(e->r);
                    155:                return(br);
                    156:        case Alternate:
                    157:                br = spew(br_alt, (Expr *)0, -1);
                    158:                br->lb = seq(e->l);
                    159:                br->rb = seq(e->r);
                    160:                return(br);
                    161:        case Star:
                    162:                br = spew(br_star, (Expr *)0, -1);
                    163:                br->lb = seq(e->l);
                    164:                return(br);
                    165:        case Plus:
                    166:                br = spew(br_plus, (Expr *)0, -1);
                    167:                br->lb = seq(e->l);
                    168:                return(br);
                    169:        case Quest:
                    170:                br = spew(br_quest, (Expr *)0, -1);
                    171:                br->lb = seq(e->l);
                    172:                return(br);
                    173:        case Group:
                    174:                br = spew(br_group, (Expr *)0, e->lit);
                    175:                br->lb = seq(e->l);
                    176:                return(br);
                    177:        case Backref:
                    178:                return(spew(br_br, e->l, e->lit));
                    179:        case EOP:
                    180:                return(seq(e->l));
                    181:        default:
                    182:                return(spew(br_re, e, -1));
                    183:        }
                    184: }
                    185: 
                    186: static Br *
                    187: spew(Br_type t, Expr *d, int g)
                    188: {
                    189:        Br *b;
                    190: 
                    191:        b = (Br *)egmalloc(sizeof(Br), "back ref malloc");
                    192:        if(!b)
                    193:                return(0);
                    194:        b->type = t;
                    195:        b->e = d;
                    196:        b->group = g;
                    197:        b->r = 0;
                    198:        b->rb = b->lb = 0;
                    199:        return(b);
                    200: }

unix.superglobalmegacorp.com

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