|
|
1.1 ! root 1: /* @(#)sno3.c 1.1 */ ! 2: #include "sno.h" ! 3: ! 4: /* ! 5: * sno3 ! 6: */ ! 7: ! 8: ! 9: int ! 10: bextend (str, last) ! 11: struct node *str, *last; ! 12: { ! 13: register struct node *a, *s; ! 14: register int b; ! 15: struct node *cc; ! 16: int c, d; ! 17: ! 18: s = str; ! 19: if ((cc = s->p1) == 0) ! 20: goto bad; ! 21: b = d = 0; ! 22: a = s->p2; ! 23: if (a == 0) { ! 24: a = cc; ! 25: goto eb2; ! 26: } ! 27: eb1: ! 28: if (a == last) ! 29: goto bad; ! 30: a = a->p1; ! 31: eb2: ! 32: d++; ! 33: c = class (a->ch); ! 34: if (c == 1) { /* rp */ ! 35: if (b == 0) ! 36: goto bad; ! 37: b--; ! 38: goto eb3; ! 39: } ! 40: if (c == 2) { /* lp */ ! 41: b++; ! 42: goto eb1; ! 43: } ! 44: eb3: ! 45: if (b == 0) { ! 46: s->p2= a; ! 47: return (d); ! 48: } ! 49: goto eb1; ! 50: bad: ! 51: return (0); ! 52: } ! 53: ! 54: int ! 55: ubextend (str, last) ! 56: struct node *str, *last; ! 57: { ! 58: register struct node *a, *b, *s; ! 59: ! 60: s = str; ! 61: a = s->p1; ! 62: if (a == 0) ! 63: goto bad; ! 64: b = s->p2; ! 65: if (b == 0) ! 66: goto good; ! 67: if (b == last) ! 68: goto bad; ! 69: a = b->p1; ! 70: good: ! 71: s->p2 = a; ! 72: return (1); ! 73: bad: ! 74: return (0); ! 75: } ! 76: ! 77: struct node * ! 78: search (arg, r) ! 79: struct node *arg, *r; ! 80: { ! 81: struct node *list, *back, *str, ! 82: *etc, *next, *last, *base, *e; ! 83: register struct node *a, *b, *var; ! 84: int c, d; ! 85: ! 86: a = arg->p2; ! 87: list = base = salloc(); ! 88: last = next = 0; ! 89: goto badv1; ! 90: badvanc: ! 91: a = a->p1; ! 92: if (a->typ == 0) { ! 93: list->p1 = 0; ! 94: if (rfail == 1) { ! 95: a = 0; ! 96: goto fail; ! 97: } ! 98: list = base; ! 99: if (r == 0) ! 100: next = last = 0; ! 101: else { ! 102: next = r->p1; ! 103: last = r->p2; ! 104: } ! 105: goto adv1; ! 106: } ! 107: b = salloc(); ! 108: list->p1 = b; ! 109: list = b; ! 110: badv1: ! 111: list->p2 = back = salloc(); ! 112: back->p1 = last; ! 113: b = a->p2; ! 114: c = a->typ; ! 115: list->typ = c; ! 116: if (c < 2) { ! 117: back->p2 = eval (b, 1); ! 118: goto badvanc; ! 119: } ! 120: last = list; ! 121: str = salloc(); ! 122: etc = salloc(); ! 123: back->p2 = var = salloc(); ! 124: var->typ = b->typ; ! 125: var->p1 = str; ! 126: var->p2 = etc; ! 127: e = b->p1; ! 128: if (e == 0) ! 129: etc->p1 = 0; ! 130: else ! 131: etc->p1 = eval (e, 0); ! 132: e = b->p2; ! 133: if (e == 0) ! 134: etc->p2 = 0; ! 135: else { ! 136: e = eval (e, 1); ! 137: etc->p2 = (struct node *) strbin (e); ! 138: delete (e); ! 139: } ! 140: goto badvanc; ! 141: ! 142: retard: ! 143: a = back->p1; ! 144: if (a == 0) { ! 145: rfail = 1; ! 146: goto fail; ! 147: } ! 148: list = a; ! 149: back = list->p2; ! 150: var = back->p2; ! 151: str = var->p1; ! 152: etc = var->p2; ! 153: if (etc->p2) ! 154: goto retard; ! 155: if (var->typ == 1) { ! 156: if (bextend (str, last) == 0) ! 157: goto retard; ! 158: goto adv0; ! 159: } ! 160: if (ubextend (str, last) == 0) ! 161: goto retard; ! 162: adv0: ! 163: a = str->p2; ! 164: adv01: ! 165: if (a == last) ! 166: next = 0; ! 167: else ! 168: next = a->p1; ! 169: advanc: ! 170: a = list->p1; ! 171: if (a == 0) { ! 172: a = salloc(); ! 173: if (r == 0) { ! 174: a->p1 = a->p2 = 0; ! 175: goto fail; ! 176: } ! 177: b = r->p1; ! 178: a->p1 = b; ! 179: if (next == 0) { ! 180: a->p2 = r->p2; ! 181: goto fail; ! 182: } ! 183: while (1) { ! 184: e = b->p1; ! 185: if (e == next) { ! 186: a->p2 = b; ! 187: goto fail; ! 188: } ! 189: b = e; ! 190: } ! 191: } ! 192: list = a; ! 193: adv1: ! 194: back = list->p2; ! 195: var = back->p2; ! 196: d = list->typ; ! 197: if (d < 2) { ! 198: if (var == 0) ! 199: goto advanc; ! 200: if (next == 0) ! 201: goto retard; ! 202: a = next; ! 203: b = var->p1; ! 204: e = var->p2; ! 205: while (1) { ! 206: if (a->ch != b->ch) ! 207: goto retard; ! 208: if (b == e) ! 209: goto adv01; ! 210: if (a == last) ! 211: goto retard; ! 212: a = a->p1; ! 213: b = b->p1; ! 214: } ! 215: } ! 216: str = var->p1; ! 217: etc = var->p2; ! 218: str->p1 = next; ! 219: str->p2 = 0; ! 220: c = (int) etc->p2; ! 221: if (var->typ == 1) { ! 222: d = bextend (str, last); ! 223: if (d == 0) ! 224: goto retard; ! 225: if (c == 0) ! 226: goto adv0; ! 227: while (1) { ! 228: c -= d; ! 229: if (c == 0) ! 230: goto adv0; ! 231: if (c < 0) ! 232: goto retard; ! 233: d = bextend (str, last); ! 234: if (d == 0) ! 235: goto retard; ! 236: } ! 237: } ! 238: if (c == 0) { ! 239: if (d==3 && next!=0) { ! 240: str->p2 = last; ! 241: goto adv0; ! 242: } ! 243: goto advanc; ! 244: } ! 245: while (c--) ! 246: if (ubextend (str, last) == 0) ! 247: goto retard; ! 248: goto adv0; ! 249: ! 250: fail: ! 251: list = base; ! 252: goto f1; ! 253: fadv: ! 254: sfree (back); ! 255: b = list->p1; ! 256: sfree (list); ! 257: if (b == 0) ! 258: return (a); ! 259: list = b; ! 260: f1: ! 261: back = list->p2; ! 262: var = back->p2; ! 263: if (list->typ < 2) { ! 264: delete (var); ! 265: goto fadv; ! 266: } ! 267: str = var->p1; ! 268: etc = var->p2; ! 269: if (a != 0 && etc->p1 != 0) { ! 270: if (str->p2 == 0) { ! 271: sfree (str); ! 272: str = 0; ! 273: } ! 274: assign (etc->p1, copy (str)); ! 275: } ! 276: if (str) ! 277: sfree (str); ! 278: sfree (etc); ! 279: sfree (var); ! 280: goto fadv; ! 281: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.