|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.