|
|
1.1 ! root 1: /* ! 2: * Uncompact adaptive Huffman code input to output ! 3: * ! 4: * On - line algorithm ! 5: * ! 6: * Input file does not contain decoding tree ! 7: * ! 8: * Written by Colin L. Mc Master (UCB) February 14, 1979 ! 9: */ ! 10: ! 11: #include "compact.h" ! 12: ! 13: ! 14: main (argc, argv) ! 15: short argc; ! 16: char *argv [ ]; ! 17: { ! 18: register short i; ! 19: register struct node *p; ! 20: register short j; ! 21: register int m; ! 22: union cio c, d; ! 23: char b; ! 24: longint ic, n; ! 25: char fname [LNAME], *cp; ! 26: ! 27: dir [513] . next = NULL; ! 28: for (head = dir + (j = 513); j--; ) { ! 29: dirp = head--; ! 30: head -> next = dirp; ! 31: } ! 32: bottom = dirp -> pt = dict; ! 33: dict [0] . top [0] = dict [0] . top [1] = dirp; ! 34: dirq = dirp -> next; ! 35: in [EF] . flags = FBIT | SEEN; ! 36: ! 37: for (i = 1; ; i++) { ! 38: ic = oc = 0; ! 39: (bottom -> top [1]) -> next = flist; ! 40: bottom -> top [1] = dirp; ! 41: flist = dirq; ! 42: if (i >= argc) { ! 43: uncfp = stdout; ! 44: cfp = stdin; ! 45: } ! 46: else { ! 47: m = -1; ! 48: cp = fname; ! 49: for (j = 0; j < (LNAME - 3) && (*cp = argv [i][j]); j++) ! 50: if (*cp++ == '/') m = j; ! 51: if (cp [-1] == 'C' && cp [-2] == '.') cp [-2] = 0; ! 52: else { ! 53: fprintf (stderr, "%s: File name must end with \".C\"\n", argv [i]); ! 54: if (i == argc - 1) break; ! 55: continue; ! 56: } ! 57: if (j >= (LNAME - 3) || (j - m) > 15) { ! 58: fprintf (stderr, "File name too long -- %s\n", argv [i]); ! 59: if (i == argc - 1) break; ! 60: continue; ! 61: } ! 62: if ((cfp = fopen (argv [i], "r")) == NULL) { ! 63: perror (argv [i]); ! 64: if (i == argc - 1) break; ! 65: continue; ! 66: } ! 67: if ((uncfp = fopen (fname, "w")) == NULL) { ! 68: perror (fname); ! 69: fclose (cfp); ! 70: if (i == argc - 1) break; ! 71: continue; ! 72: } ! 73: fstat (fileno (cfp), &status); ! 74: chmod (fname, status.st_mode & 07777); ! 75: } ! 76: ! 77: if ((c . integ = getc (cfp)) != EOF) { ! 78: if ((d . integ = getc (cfp)) != EOF) { ! 79: c . chars . hib = d . integ & 0377; ! 80: c . integ &= 0177777; ! 81: if (c . integ != COMPACTED) goto notcompact; ! 82: if ((c . integ = getc (cfp)) != EOF) { ! 83: putc (c . chars . lob, uncfp); ! 84: ic = 3; ! 85: ! 86: in [NC] . fp = in [EF] . fp = dict [0] . sp [0] . p = bottom = dict + 1; ! 87: bottom -> count [0] = bottom -> count [1] = dict [0] . count [1] = 1; ! 88: dirp -> next = dict [0] . top [1] = bottom -> top [0] = bottom -> top [1] = dirq = NEW; ! 89: dirq -> next = NULL; ! 90: dict [0] . fath . fp = NULL; ! 91: dirq -> pt = bottom -> fath . fp = in [c . integ] . fp = dict; ! 92: in [c . integ] . flags = (FBIT | SEEN); ! 93: in [NC] . flags = SEEN; ! 94: dict [0] . fath . flags = RLEAF; ! 95: bottom -> fath . flags = (LLEAF | RLEAF); ! 96: dict [0] . count [0] = 2; ! 97: ! 98: dict [0] . sp [1] . ch = c . integ; ! 99: bottom -> sp [0] . ch = NC; ! 100: bottom -> sp [1] . ch = EF; ! 101: ! 102: p = dict; ! 103: while ((c . integ = getc (cfp)) != EOF) { ! 104: ic++; ! 105: for (m = 0200; m; ) { ! 106: b = (m & c . integ ? 1 : 0); ! 107: m >>= 1; ! 108: if (p -> fath . flags & (b ? RLEAF : LLEAF)) { ! 109: d . integ = p -> sp [b] . ch; ! 110: if (d . integ == EF) break; ! 111: if (d . integ == NC) { ! 112: uptree (NC); ! 113: d . integ = 0; ! 114: for (j = 8; j--; m >>= 1) { ! 115: if (m == 0) { ! 116: c . integ = getc (cfp); ! 117: ic++; ! 118: m = 0200; ! 119: } ! 120: d . integ <<= 1; ! 121: if (m & c . integ) d . integ++; ! 122: } ! 123: insert (d . integ); ! 124: } ! 125: uptree (d . integ); ! 126: putc (d . chars . lob, uncfp); ! 127: oc++; ! 128: p = dict; ! 129: } ! 130: else p = p -> sp [b] . p; ! 131: } ! 132: } ! 133: } ! 134: } ! 135: else goto notcompact; ! 136: } ! 137: else { ! 138: notcompact : if (i < argc) { ! 139: fprintf (stderr, "%s: ", argv [i]); ! 140: unlink (fname); ! 141: } ! 142: if (c . integ == PACKED) fprintf (stderr, "File is packed. Use unpack.\n"); ! 143: else fprintf (stderr, "Not a compacted file.\n"); ! 144: if (i >= argc) break; ! 145: goto closeboth; ! 146: } ! 147: ! 148: if (ferror (uncfp) || ferror (cfp)) ! 149: if (i < argc) { ! 150: if (ferror (uncfp)) ! 151: perror (fname); ! 152: else ! 153: perror (argv [i]); ! 154: fprintf (stderr, "Unable to uncompact %s\n", argv [i]); ! 155: unlink (fname); ! 156: goto closeboth; ! 157: } ! 158: if (i >= argc) break; ! 159: fprintf (stderr, "%s uncompacted to %s\n", argv [i], fname); ! 160: unlink (argv [i]); ! 161: closeboth : fclose (cfp); ! 162: closein : fclose (uncfp); ! 163: if (i == argc - 1) break; ! 164: for (j = 256; j--; ) in [j] . flags = 0; ! 165: continue; ! 166: fail : fprintf (stderr, "Unsuccessful uncompact of standard input to standard output.\n"); ! 167: break; ! 168: } ! 169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.