|
|
1.1 ! root 1: #include "compact.h" ! 2: ! 3: ! 4: insert (ch) ! 5: int ch; ! 6: { ! 7: register struct node *pp; ! 8: register int c; ! 9: union cio d; ! 10: register struct index *qt, *wt; ! 11: ! 12: c = ch; ! 13: wt = NEW; ! 14: pp = bottom++; ! 15: bottom -> fath . fp = pp; ! 16: in [c] . flags = (SEEN | FBIT); ! 17: d . integ = bottom -> sp [0] . ch = pp -> sp [1] . ch; ! 18: in [c] . fp = in [d . integ] . fp = pp -> sp [1] . p = wt -> pt = bottom; ! 19: bottom -> fath . flags = (LLEAF | RLEAF | FBIT); ! 20: pp -> fath . flags &= ~RLEAF; ! 21: in [d . integ] . flags = SEEN; ! 22: ! 23: bottom -> count [0] = pp -> count [1]; ! 24: qt = pp -> top [1]; ! 25: bottom -> top [0] = qt; ! 26: bottom -> sp [1] . ch = c; ! 27: bottom -> count [1] = 0; ! 28: bottom -> top [1] = qt -> next = wt; ! 29: wt -> next = NULL; ! 30: } ! 31: ! 32: uptree (ch) ! 33: int ch; ! 34: { ! 35: register struct node *r; ! 36: union treep q, s; ! 37: int rs, qs, ss, ts; ! 38: longint rc, qc, sc; ! 39: struct node *t; ! 40: register struct index *rt, *qt, *st; ! 41: ! 42: r = in [ch] . fp; ! 43: rs = in [ch] . flags & FBIT; ! 44: ! 45: do { ! 46: (r -> count [rs])++; ! 47: rc = r -> count [rs]; ! 48: rt = r -> top [rs]; ! 49: ! 50: for ( ; ; ) { ! 51: qs = ss = 1 - rs; ! 52: s . p = r + rs; ! 53: sc = (s . p) -> count [ss]; ! 54: st = (s . p) -> top [ss]; ! 55: ! 56: if (rs) ! 57: if (r == bottom) { ! 58: sc = rc - 2; ! 59: st = NULL; ! 60: } ! 61: else; ! 62: else if (r == dict) { ! 63: qc = rc + 1; ! 64: qt = head; ! 65: break; ! 66: } ! 67: ! 68: q . p = r - qs; ! 69: qc = (q . p) -> count [qs]; ! 70: qt = (q . p) -> top [qs]; ! 71: if (rc <= qc) break; ! 72: ! 73: t = qt -> pt; ! 74: ts = (rc <= t -> count [0] ? 1 : 0); ! 75: ! 76: /* exchange pointers of (t, ts) and (r, rs) */ ! 77: ! 78: q . ch = t -> sp [ts] . ch; /* { */ ! 79: s . ch = r -> sp [rs] . ch; /* { */ ! 80: t -> sp [ts] . ch = s . ch; /* { */ ! 81: r -> sp [rs] . ch = q . ch; /* { change code when Cory gets v. 7 */ ! 82: /* { */ ! 83: exch (t, ts, q . ch, r, rs); /* { */ ! 84: exch (r, rs, s . ch, t, ts); /* { */ ! 85: ! 86: qs = (rs ? RLEAF : LLEAF); ! 87: ss = (ts ? RLEAF : LLEAF); ! 88: if (((r -> fath . flags & qs) << rs) ^ ((t -> fath . flags & ss) << ts)) { ! 89: r -> fath . flags ^= qs; ! 90: t -> fath . flags ^= ss; ! 91: } ! 92: ! 93: (t -> count [ts])++; ! 94: (r -> count [rs])--; ! 95: (qt -> pt) += ts; ! 96: r = t; ! 97: rs = ts; ! 98: } ! 99: ! 100: if (rc == qc) { ! 101: r -> top [rs] = qt; ! 102: if (rc > sc + 1) { ! 103: qt -> next = st; ! 104: ! 105: /* dispose of rt */ ! 106: ! 107: rt -> next = flist; ! 108: flist = rt; ! 109: } ! 110: else st -> pt = s . p; ! 111: } ! 112: ! 113: else if (rc == sc + 1) { ! 114: ! 115: /* create new index at rt */ ! 116: ! 117: rt = NEW; ! 118: rt -> next = st; ! 119: rt -> pt = r; ! 120: qt -> next = rt; ! 121: if (st) st -> pt = s . p; ! 122: r -> top [rs] = rt; ! 123: } ! 124: ! 125: rs = r -> fath . flags & FBIT; ! 126: r = r -> fath . fp; ! 127: ! 128: } while (r); ! 129: dirp = head -> next; ! 130: dirq = dirp -> next; ! 131: } ! 132: ! 133: exch (v, vs, x, w, ws) ! 134: struct node *v, *w; ! 135: union treep x; ! 136: int vs, ws; ! 137: { ! 138: ! 139: if (v -> fath . flags & (vs ? RLEAF : LLEAF)) { ! 140: in [x . ch] . fp = w; ! 141: in [x . ch] . flags &= ~01; ! 142: if (ws) in [x . ch] . flags |= ws; ! 143: } ! 144: else { ! 145: (x . p) -> fath . fp = w; ! 146: (x . p) -> fath . flags &= ~01; ! 147: if (ws) (x . p) -> fath . flags |= ws; ! 148: } ! 149: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.