Annotation of researchv10no/cmd/gre/egcanon.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 Expr **proot;
                      8: 
                      9: #define        PURE(e)         (!(e)->backref && !(e)->parens)
                     10: #define        PROC(kid)       if(ee = proc(kid)){ ee->parent = (kid)->parent; free((char *)kid); kid = ee; }
                     11: 
                     12: static Expr *
                     13: proc(Expr *e)
                     14: {
                     15:        Expr *ee;
                     16: 
                     17:        if(e->type == Cat){
                     18:                if(PURE(e->l)){
                     19:                        if(proot){
                     20:                                *proot = eg_newexpr(Cat, 0, *proot, e->l);
                     21:                                return((ee = proc(e->r))? ee:e->r);
                     22:                        } else
                     23:                                proot = &e->l;
                     24:                } else {
                     25:                        PROC(e->l)
                     26:                }
                     27:                if(PURE(e->r)){
                     28:                        if(proot){
                     29:                                *proot = eg_newexpr(Cat, 0, *proot, e->r);
                     30:                                return(e->l);
                     31:                        } else
                     32:                                proot = &e->r;
                     33:                } else {
                     34:                        PROC(e->r)
                     35:                }
                     36:                return(0);
                     37:        }
                     38:        proot = 0;
                     39:        switch(e->type)
                     40:        {
                     41:        case Alternate:
                     42:                PROC(e->l)
                     43:                proot = 0;
                     44:                PROC(e->r)
                     45:                break;
                     46:        case Star:
                     47:        case Plus:
                     48:        case Quest:
                     49:        case EOP:
                     50:        case Group:
                     51:                PROC(e->l)
                     52:                break;
                     53:        }
                     54:        proot = 0;
                     55:        return(0);
                     56: }
                     57: 
                     58: void
                     59: egcanon(Expr *e)
                     60: {
                     61: #ifdef DEBUG
                     62:        char before[EPRINTSIZE], after[EPRINTSIZE];
                     63: #endif
                     64: 
                     65: #ifdef DEBUG
                     66:        eg_epr(e, before, 0);
                     67:        if(TRACE(3)){
                     68:                PR "egcanon(%s):\n", before);
                     69:        }
                     70: #endif
                     71:        proot = 0;
                     72:        if(!PURE(e))
                     73:                proc(e);
                     74: #ifdef DEBUG
                     75:        eg_epr(e, after, 0);
                     76:        if(TRACE(3)){
                     77:                PR "egcanon returns %s\n", after);
                     78:        }
                     79:        if(strcmp(before, after)){
                     80:                EPR "URK! egcanon did not preserve!\nbefore=%s\n after=%s\n", before, after);
                     81:                exit(1);
                     82:        }
                     83: #endif
                     84: }

unix.superglobalmegacorp.com

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