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