-h- aareadme.1st Fri Mar 14 09:51:25 1986 ARISIA$DRC0:[003001.TMP5]AAREADME.1ST;3 Lempel-Ziv-Welch Compress/Decompress These files are sources modified (VERY slightly) for PDP11. One timer routine was dummied out and the C files were passed through CPP to handle the macros. To compile just do XCC file XAS -d file for all .CC files. (e.g., XCC lzcmp1.cc xas -d lzcmp1 and so on. Files are: LZCMP1.CC, LZCMP2.CC,LZCMP3.CC,LZIO.CC,LZDCM1.CC,LZDCM2.CC, and LZDCM3.CC.) Then link as follows: TKB>LZC/CP/FP=LZCMP1,LZCMP2,LZCMP3,LZIO,[1,1]C/LB TKB>/ ENTER OPTIONS: TKB>STACK=3000 TKB>TASK=...LZC TKB>/ TKB>LZD/CP/FP=LZDCM1,LZDCM2,LZDCM3,LZIO,[1,1]C/LB TKB>/ ENTER OPTIONS: TKB>TASK=...LZD TKB>STACK=3000 TKB>// It may not be necessary to have the huge stack; try omitting if desired. It works this way however. For P/OS be sure the directory for C.OLB is right; it is likely to be [1,5] there. The resulting files will decompress the *.%Z% files here. -h- lz.h Fri Mar 14 09:51:33 1986 ARISIA$DRC0:[003001.TMP5]LZ.H;76 /* * Header file for all lz compression/decompression routines. * Version used for PDP11... */ #define decus #define pdp11 #include #include #include #ifndef decus # include /* * Arguments to signal(): */ extern int abort(); /* Debugging interrupt trap */ extern int interrupt(); /* Non-debugging interrupt trap */ extern int address_error(); /* "Segment" violation */ #endif #ifndef TRUE # define FALSE 0 # define TRUE 1 #endif #ifndef EOS # define EOS '\0' #endif #define streq(a, b) (strcmp((a), (b)) == 0) #define min(a,b) ((a) > (b)) ? (b) : (a)) #ifndef SACREDMEM # define SACREDMEM 0 #endif /* * Set machine-specific parameters */ #ifdef vax # ifdef unix # define vax_asm TRUE /* If asm() supported on vax */ # endif #endif #ifndef vax_asm # define vax_asm FALSE #endif #ifdef pdp11 # define BITS 12 /* max bits/code for 16-bit machine */ # define USERMEM 0 /* Force no user memory */ # define UCHAR FALSE /* TRUE if compiler supports unsigned char */ # define MAXIO 512 /* Buffer size for PDP-11 I/O buffers */ #endif /* * Set default values for some parameters. */ #ifndef DEBUG # define DEBUG FALSE #endif #ifdef interdata # define SIGNED_COMPARE_SLOW TRUE #endif #ifndef SIGNED_COMPARE_SLOW # define SIGNED_COMPARE_SLOW FALSE #endif #ifndef USERMEM # define USERMEM 750000 /* default user memory */ #endif #ifndef UCHAR # define UCHAR TRUE /* Compiler supports unsigned char */ #endif #ifndef MAXIO # define MAXIO 2048 /* I/O buffer size */ #endif /* * Set derived tuning parameters. */ #ifndef USERMEM # define USERMEM 0 #endif #if USERMEM >= (433484 + SACREDMEM) # define PBITS 16 #else # if USERMEM >= (229600 + SACREDMEM) # define PBITS 15 # else # if USERMEM >= (127536 + SACREDMEM) # define PBITS 14 # else # if USERMEM >= ( 73464 + SACREDMEM) # define PBITS 13 # else /* Smaller systems */ # define PBITS 12 # endif # endif # endif #endif #ifndef BITS # define BITS PBITS #endif #ifdef M_XENIX # if BITS >= 16 # define XENIX_16 /* Enable special vector access macros */ # else # if BITS > 13 # undef BITS # define BITS 13 /* Code only handles BITS = 12, 13, 16 */ # endif # endif #endif /* * HSIZE is the size of the hash lookup table. It is set to * 1 << BITS + fudge factor, rounded up to a prime number. * If it is too big, the "clear the hash" routine will take * too long. The same numbers are replicated in the getsize() * routine's data table. */ #if BITS == 16 # define HSIZE 69001 /* 95% occupancy */ #endif #if BITS == 15 # define HSIZE 35023 /* 94% occupancy */ #endif #if BITS == 14 # define HSIZE 18013 /* 91% occupancy */ #endif #if BITS == 13 # define HSIZE 9001 /* 91% occupancy */ #endif #if BITS <= 12 # define HSIZE 5003 /* 80% occupancy */ #endif /* * typedef's -- somewhat machine specific. */ /* * a code_int must be able to hold 2**BITS values of type int, and also -1 */ #if BITS > 15 typedef long int code_int; #else typedef int code_int; #endif /* * A count_int must hold ((2**BITS)-1) + (255<> #endif #define LZ_CLEAR (NBR_CHAR) /* Clear code */ #define LZ_SOH (LZ_CLEAR + 1) /* Start of header block */ #define LZ_STX (LZ_SOH + 1) /* Start of text block */ #define LZ_EOR (LZ_STX + 1) /* End of text record */ #define LZ_ETX (LZ_EOR + 1) /* End of header/text block */ #define LZ_FIRST (LZ_ETX + 1) /* First user (data) code */ #ifdef vms #include errno #include ssdef #include stsdef #define IO_SUCCESS (SS$_NORMAL | STS$M_INHIB_MSG) #define IO_ERROR (SS$_ABORT) #define VMS_V4 L_cuserid >= 16 /* Enable new stuff */ #else #define VMS_V4 0 /* Disable new stuff */ extern int errno; #ifdef decus #define errno $$ferr #endif #endif /* * Define exit() codes. */ #ifndef IO_SUCCESS #define IO_SUCCESS 0 /* Normal exit */ #define IO_ERROR 1 /* Error exit */ #endif typedef struct STREAM { char_type *bp; /* Next character to get/put */ char_type *bend; /* -> end of stream buffer */ char_type *bstart; /* Start of stream buffer */ short bsize; /* Stream buffer size */ int (*func)(); /* Read/write a buffer function */ } STREAM; #if UCHAR #define GET(s) \ (((s)->bp < (s)->bend) ? *(s)->bp++ : (*(s)->func)(s)) #else #define GET(s) \ (((s)->bp < (s)->bend) ? *(s)->bp++ & 0xFF : (*(s)->func)(s)) #endif #define PUT(c, s) \ ((((s)->bp >= (s)->bend) ? (*(s)->func)(s) : 0), *(s)->bp++ = (c)) extern int lz_fill(); extern int lz_flush(); extern int lz_eof(); extern int lz_fail(); extern int lz_dummy(); #if DEBUG extern readonly char *lz_names[]; /* "LZ_CLEAR" etc. */ #endif /* * Options and globals. */ #if VMS_V4 #define ATT_NAME "vms$attributes " #define ATT_SIZE 15 /* strlen(ATT_NAME) */ extern int fdl_status; /* Error code from fdl library */ #endif extern flag binary; /* -b Readable text file if FALSE */ extern flag noheader; /* -x3 No magic header if TRUE */ extern flag export; /* -x (non-zero) Supress vms private */ extern flag block_compress; /* -x2 */ extern flag verbose; /* -v (non-zero) Verbose logging */ extern readonly flag is_compress; /* TRUE if compress, FALSE if decomp. */ extern char *infilename; /* For error printouts */ extern char *outfilename; /* For more error printouts */ extern short n_bits; /* Current # of bits in compressed file */ extern int firstcode; /* First value past signals */ extern jmp_buf failure; /* For longjmp() return */ -h- lzcmp1.cc Fri Mar 14 09:51:43 1986 ARISIA$DRC0:[003001.TMP5]LZCMP1.CC;1 # 1 "lzcmp1.c" # 1 # 126 "C:stdio.h" typedef struct IOV { int _cnt; char *_ptr; char *_base; int _flag; int io_wflag; char *io_wild; int io_rbsz; # 166 } FILE; extern FILE *$$luns[]; # 242 extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; extern char *fgets(); extern int $$ferr; extern int $$exst; # 71 "C:ctype.h" extern char _ctype_ []; # 29 "C:setjmp.h" typedef int jmp_buf[6]; # 186 "lz.h" typedef int code_int; # 203 typedef long int count_int; # 209 typedef char char_type; typedef unsigned U_short; # 223 typedef short flag; # 315 extern int errno; # 346 typedef struct STREAM { char_type *bp; char_type *bend; char_type *bstart; short bsize; int (*func)(); } STREAM; # 369 extern int lz_fill(); extern int lz_flush(); extern int lz_eof(); extern int lz_fail(); extern int lz_dummy(); # 388 extern flag binary; extern flag noheader; extern flag export; extern flag block_compress; extern flag verbose; extern flag is_compress; extern char *infilename; extern char *outfilename; extern short n_bits; extern int firstcode; extern jmp_buf failure; # 283 "lzcmp1.c" short maxbits = 12; code_int maxmaxcode = 1 << 12; code_int hsize = 5003; # 293 flag export = 1; flag block_compress = 1; flag binary = 0; flag noheader = 0; flag verbose = 0; flag background = 0; flag is_compress = 1; long fsize; char *infilename = (0); char *outfilename = (0); int firstcode; count_int tot_incount = 0; count_int tot_outcount = 0; extern count_int in_count; extern count_int out_count; static long start_time; extern long cputime(); STREAM instream; STREAM outstream; char_type inbuffer[512]; char_type outbuffer[512]; static STREAM mem_stream; jmp_buf failure; # 329 main(argc, argv) int argc; char *argv[]; # 335 { # 352 if (setjmp(failure) == 0) { setup(argc, argv); openinput(); getfilesize(); gethashsize(); initialize(); openoutput(); if (verbose > 0) start_time = cputime(); put_magic_header(); init_compress(1); compress(&instream); # 372 if (block_compress) { outputcode((code_int) (256)); outputcode((code_int) (256)); } outputcode((code_int) -1); # 384 fclose(stdout); if (verbose > 0) { start_time = cputime() - start_time; tot_incount += in_count; tot_outcount += out_count; fprintf(stderr, "%ld chars in, %ld bytes out, ", tot_incount, tot_outcount); if (tot_outcount > 0) { divout("compression ratio: ", (long) tot_incount, (long) tot_outcount, ""); divout(" (", ((long) tot_incount - (long) tot_outcount) * 100, (long) tot_incount, "%)\n"); } fprintf(stderr, "%ld.%02ld seconds (process time) for compression.\n", start_time / 1000L, (start_time % 1000L) / 10L); if (start_time > 0) { divout(" ", (long) tot_incount * 10L, (start_time + 50L) / 100L, " input bytes per second.\n"); } } exit(0); } else { fprintf(stderr, "Error when compressing \"%s\" to \"%s\"\n", (infilename == (0)) ? "" : infilename, (outfilename == (0)) ? "" : outfilename); if ($$ferr != 0) perror("lzcomp fatal error"); exit(1); } } divout(leader, numer, denom, trailer) char *leader; long numer; long denom; char *trailer; # 430 { fprintf(stderr, "%s%ld.%02ld%s", leader, numer / denom, ((numer % denom) * 100L) / denom, trailer); } static initialize() # 440 { if (maxbits < 9) maxbits = 9; if (maxbits > 12) maxbits = 12; maxmaxcode = 1 << maxbits; if (export == 0) firstcode = ((((((256) + 1) + 1) + 1) + 1) + 1); else if (block_compress) firstcode = (256) + 1; else firstcode = 256; } put_magic_header() # 458 { if (export && !noheader) { ((((&outstream)->bp >= (&outstream)->bend) ? (*(&outstream)->func)(&outstream) : 0), *(&outstream)->bp++ = (0x1F)); ((((&outstream)->bp >= (&outstream)->bend) ? (*(&outstream)->func)(&outstream) : 0), *(&outstream)->bp++ = (0x9D)); ((((&outstream)->bp >= (&outstream)->bend) ? (*(&outstream)->func)(&outstream) : 0), *(&outstream)->bp++ = (maxbits | ((block_compress) ? 0x80 : 0))); # 465 } # 495 } mem_compress(datum, length) char_type *datum; int length; # 503 { mem_stream.bp = mem_stream.bstart = datum; mem_stream.bsize = length; mem_stream.bend = datum + length; mem_stream.func = lz_eof; compress(&mem_stream); } # 517 typedef struct TUNETAB { long fsize; code_int hsize; } TUNETAB; static TUNETAB tunetab[] = { # 533 { 1 << 15, 35023 }, { 47000, 50021 }, { 0, 0 }, }; static gethashsize() # 546 { register TUNETAB *tunep; hsize = 5003; if (fsize > 0) { for (tunep = tunetab; tunep->fsize != 0; tunep++) { if (fsize < tunep->fsize) { hsize = tunep->hsize; break; } } } } static getfilesize() # 566 { # 609 } static char *helptext[] = { "The following options are valid:", "-B\tBinary file (important on VMS/RSX, ignored on Unix)", "-M val\tExplicitly set the maximum number of code bits", "-V val\tPrint status information (or debugging) to stderr", "-X val\tSet export (compatiblity) mode:", # 620 " -X 1\t(default if -X specified, output format is compatible", "\twith Unix compress V3.0", " -X 2\tCompatible with Unix compress 3.0, block compression", "\tsupressed.", # 627 (0), }; static setup(argc, argv) int argc; char *argv[]; # 637 { register char *ap; register int c; char **hp; auto int i; int j; # 647 for (i = j = 1; i < argc; i++) { ap = argv[i]; if (*ap++ != '-' || *ap == 0) argv[j++] = argv[i]; else { while ((c = *ap++) != 0) { if ((_ctype_[(c)&0177]&0002)) c = toupper(c); switch (c) { case 'B': binary = 1; break; case 'M': maxbits = getvalue(ap, &i, argv); if (maxbits < 9) { fprintf(stderr, "Illegal -M value\n"); goto usage; } break; case 'V': verbose = getvalue(ap, &i, argv); break; case 'X': export = getvalue(ap, &i, argv); if (export < 0 || export > 3) { fprintf(stderr, "Illegal -X value: %d\n", export); goto usage; } block_compress = "\1\1\0\0"[export]; noheader = "\0\0\0\1"[export]; export = "\0\1\1\1"[export]; break; default: fprintf(stderr, "Unknown option '%c' in \"%s\"\n", *ap, argv[i]); usage: for (hp = helptext; *hp != (0); hp++) fprintf(stderr, "%s\n", *hp); longjmp(failure, 1);; } } } } switch (j) { case 3: if (!(strcmp((argv[2]), ("-")) == 0)) outfilename = argv[2]; case 2: if (!(strcmp((argv[1]), ("-")) == 0)) { infilename = argv[1]; } break; case 0: case 1: break; default: fprintf(stderr, "Too many file arguments\n"); longjmp(failure, 1);; } } static int getvalue(ap, ip, argv) register char *ap; int *ip; char *argv[]; # 737 { register int result; register int i; i = *ip + 1; if ((_ctype_[(*ap)&0177]&0004)) { result = atoi(ap); *ap = 0; } else if (*ap == 0 && argv[i] != (0) && (_ctype_[(argv[i][0])&0177]&0004)) { result = atoi(argv[i]); *ip = i; } else { result = 1; } return (result); } openinput() { if (infilename == (0)) { infilename = malloc(256 + 1); fgetname(stdin, infilename); infilename = realloc(infilename, strlen(infilename) + 1); } else { if (freopen(infilename, (binary) ? "rn" : "r", stdin) == (0)) { perror(infilename); longjmp(failure, 1);; } } # 832 opened: instream.bp = instream.bend = (0); instream.bstart = inbuffer; instream.bsize = sizeof inbuffer; instream.func = lz_fill; } openoutput() # 843 { if (outfilename == (0)) { # 872 outfilename = malloc(256 + 1); fgetname(stdout, outfilename); outfilename = realloc(outfilename, strlen(outfilename) + 1); # 880 } else { # 902 if (freopen(outfilename, "wn", stdout) == (0)) { perror(outfilename); longjmp(failure, 1);; } # 913 } if (stdout != (0) && isatty(fileno(stdout))) { fprintf(stderr, "%s: is a terminal. We object.\n", outfilename); longjmp(failure, 1);; } outstream.bp = outstream.bstart = outbuffer; outstream.bend = outbuffer + sizeof outbuffer; outstream.bsize = sizeof outbuffer; outstream.func = lz_flush; } -h- lzcmp2.cc Fri Mar 14 09:51:43 1986 ARISIA$DRC0:[003001.TMP5]LZCMP2.CC;1 # 1 "lzcmp2.c" # 1 # 126 "C:stdio.h" typedef struct IOV { int _cnt; char *_ptr; char *_base; int _flag; int io_wflag; char *io_wild; int io_rbsz; # 166 } FILE; extern FILE *$$luns[]; # 242 extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; extern char *fgets(); extern int $$ferr; extern int $$exst; # 71 "C:ctype.h" extern char _ctype_ []; # 29 "C:setjmp.h" typedef int jmp_buf[6]; # 186 "lz.h" typedef int code_int; # 203 typedef long int count_int; # 209 typedef char char_type; typedef unsigned U_short; # 223 typedef short flag; # 315 extern int errno; # 346 typedef struct STREAM { char_type *bp; char_type *bend; char_type *bstart; short bsize; int (*func)(); } STREAM; # 369 extern int lz_fill(); extern int lz_flush(); extern int lz_eof(); extern int lz_fail(); extern int lz_dummy(); # 388 extern flag binary; extern flag noheader; extern flag export; extern flag block_compress; extern flag verbose; extern flag is_compress; extern char *infilename; extern char *outfilename; extern short n_bits; extern int firstcode; extern jmp_buf failure; # 44 "lzcmp2.c" long int in_count; long int out_count; static flag first_clear = 1; code_int next_code; static count_int checkpoint = 10000; static long ratio = 0; # 54 extern short maxbits; extern short block_compress; extern code_int maxmaxcode; extern long tot_incount; extern long tot_outcount; extern code_int hsize; # 88 count_int hashtab[5003]; U_short codetab[5003]; # 115 compress(in) STREAM *in; # 126 { register long hash_code; register code_int i; register int c; register code_int code; register int displacement; register code_int hsize_reg; register int hshift; if ((code = (((in)->bp < (in)->bend) ? *(in)->bp++ & 0xFF : (*(in)->func)(in))) == (-1)) return; in_count++; hsize_reg = hsize; # 142 hshift = 0; for (hash_code = (long) hsize; hash_code < 65536L; hash_code <<= 1) hshift++; hshift = 8 - hshift; while ((c = (((in)->bp < (in)->bend) ? *(in)->bp++ & 0xFF : (*(in)->func)(in))) != (unsigned) (-1)) { in_count++; hash_code = (long) (((long) c << maxbits) + code); i = (c << hshift) ^ code; if (hashtab[i] == hash_code) { code = codetab[i]; continue; } else if ((long) hashtab[i] < 0) goto nomatch; displacement = hsize_reg - i; if (i == 0) displacement = 1; probe: if ((i -= displacement) < 0) i += hsize_reg; if (hashtab[i] == hash_code) { code = codetab[i]; continue; } else if ((long) hashtab[i] > 0) goto probe; nomatch: # 174 outputcode((code_int) code); if (next_code < maxmaxcode) { codetab[i] = next_code++; hashtab[i] = hash_code; } else if (block_compress && (count_int) in_count >= checkpoint) { clear(); } code = c; } # 192 outputcode((code_int) code); } clear() # 203 { register long int rat; checkpoint = in_count + 10000; # 214 if (in_count > 0x007FFFFL) { rat = out_count >> 8; if (rat == 0) rat = 0x7FFFFFFFL; else { rat = in_count / rat; } } else { rat = (in_count << 8) / out_count; } if (rat > ratio) ratio = rat; else { # 238 outputcode((code_int) (256)); } } init_compress(full_init) flag full_init; # 249 { # 286 register count_int *hp; register code_int n; hp = &hashtab[0]; n = hsize >> 4; switch (hsize & 15) { case 15: *hp++ = -1; case 14: *hp++ = -1; case 13: *hp++ = -1; case 12: *hp++ = -1; case 11: *hp++ = -1; case 10: *hp++ = -1; case 9: *hp++ = -1; case 8: *hp++ = -1; case 7: *hp++ = -1; case 6: *hp++ = -1; case 5: *hp++ = -1; case 4: *hp++ = -1; case 3: *hp++ = -1; case 2: *hp++ = -1; case 1: *hp++ = -1; } while (--n >= 0) { *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; *hp++ = -1; } if (full_init) { tot_incount += in_count; tot_outcount += out_count; in_count = 0; out_count = 0; ratio = 0; } first_clear = 0; next_code = firstcode; } -h- lzcmp3.cc Fri Mar 14 09:51:43 1986 ARISIA$DRC0:[003001.TMP5]LZCMP3.CC;1 # 1 "lzcmp3.c" # 1 # 126 "C:stdio.h" typedef struct IOV { int _cnt; char *_ptr; char *_base; int _flag; int io_wflag; char *io_wild; int io_rbsz; # 166 } FILE; extern FILE *$$luns[]; # 242 extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; extern char *fgets(); extern int $$ferr; extern int $$exst; # 71 "C:ctype.h" extern char _ctype_ []; # 29 "C:setjmp.h" typedef int jmp_buf[6]; # 186 "lz.h" typedef int code_int; # 203 typedef long int count_int; # 209 typedef char char_type; typedef unsigned U_short; # 223 typedef short flag; # 315 extern int errno; # 346 typedef struct STREAM { char_type *bp; char_type *bend; char_type *bstart; short bsize; int (*func)(); } STREAM; # 369 extern int lz_fill(); extern int lz_flush(); extern int lz_eof(); extern int lz_fail(); extern int lz_dummy(); # 388 extern flag binary; extern flag noheader; extern flag export; extern flag block_compress; extern flag verbose; extern flag is_compress; extern char *infilename; extern char *outfilename; extern short n_bits; extern int firstcode; extern jmp_buf failure; # 7 "lzcmp3.c" extern STREAM outstream; extern code_int next_code; extern code_int maxmaxcode; extern short maxbits; extern count_int out_count; static char_type buf[12]; static int offset; static short n_bits = 9; static short n_bits8 = 9 << 3; static code_int maxcode = ((1 << (9)) - 1); static char_type lmask[9] = { 0xFF, 0xFE, 0xFC, 0xF8, 0xF0, 0xE0, 0xC0, 0x80, 0x00 }; static char_type rmask[9] = { 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF }; # 33 outputcode(code) code_int code; # 65 { # 70 register int r_off, bits; register char_type *bp; register code_int r_code; r_off = offset; bits = n_bits; bp = buf; if (code >= 0) { # 109 bp += (r_off >> 3); r_off &= 7; # 115 r_code = code; *bp = (*bp & rmask[r_off]) | (r_code << r_off) & lmask[r_off]; bp++; bits -= (8 - r_off); r_code >>= 8 - r_off; # 123 if (bits >= 8) { *bp++ = r_code; r_code >>= 8; bits -= 8; } if (bits != 0) *bp = r_code; offset += n_bits; if (offset == n_bits8) { out_count += n_bits; lz_putbuf(buf, n_bits, &outstream); # 141 offset = 0; } # 150 if (next_code > maxcode) { if (offset > 0) { lz_putbuf(buf, n_bits, &outstream); out_count += n_bits; offset = 0; # 161 } n_bits++; n_bits8 += (1 << 3); if (n_bits == maxbits) maxcode = maxmaxcode; else maxcode = ((1 << (n_bits)) - 1); # 177 } if (code >= (256) && code < firstcode) { switch (code) { case ((256) + 1): case (((256) + 1) + 1): case (256): if (offset > 0) { lz_putbuf(buf, n_bits, &outstream); out_count += n_bits; offset = 0; # 193 } n_bits = 9; n_bits8 = 9 << 3; maxcode = ((1 << (9)) - 1); init_compress(code != (256)); # 208 break; case ((((256) + 1) + 1) + 1): case (((((256) + 1) + 1) + 1) + 1): break; default: abort(); } } } else { # 223 if ((r_off = offset) > 0) { r_off += 7; r_off >>= 3; lz_putbuf(buf, r_off, &outstream); out_count += r_off; # 234 } offset = 0; lz_flush(&outstream); # 243 } } -h- lzdcm1.cc Fri Mar 14 09:51:43 1986 ARISIA$DRC0:[003001.TMP5]LZDCM1.CC;1 # 1 "lzdcm1.c" # 1 # 126 "C:stdio.h" typedef struct IOV { int _cnt; char *_ptr; char *_base; int _flag; int io_wflag; char *io_wild; int io_rbsz; # 166 } FILE; extern FILE *$$luns[]; # 242 extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; extern char *fgets(); extern int $$ferr; extern int $$exst; # 71 "C:ctype.h" extern char _ctype_ []; # 29 "C:setjmp.h" typedef int jmp_buf[6]; # 186 "lz.h" typedef int code_int; # 203 typedef long int count_int; # 209 typedef char char_type; typedef unsigned U_short; # 223 typedef short flag; # 315 extern int errno; # 346 typedef struct STREAM { char_type *bp; char_type *bend; char_type *bstart; short bsize; int (*func)(); } STREAM; # 369 extern int lz_fill(); extern int lz_flush(); extern int lz_eof(); extern int lz_fail(); extern int lz_dummy(); # 388 extern flag binary; extern flag noheader; extern flag export; extern flag block_compress; extern flag verbose; extern flag is_compress; extern char *infilename; extern char *outfilename; extern short n_bits; extern int firstcode; extern jmp_buf failure; # 55 "lzdcm1.c" short maxbits = 12; code_int maxmaxcode = 1 << 12; # 65 flag export = 1; flag binary = 0; flag block_compress = 1; flag noheader = 0; flag verbose = 0; flag background = 0; flag is_compress = 0; char *infilename = (0); char *outfilename = (0); int firstcode; static long start_time; extern long cputime(); jmp_buf failure; STREAM instream; STREAM outstream; char_type inbuffer[512]; char_type outbuffer[512]; static STREAM mem_stream; # 94 main(argc, argv) int argc; char *argv[]; # 100 { int result; # 119 if (setjmp(failure) == 0) { setup(argc, argv); openinput(); get_magic_header(); openoutput(); if (verbose > 0) start_time = cputime(); init_decompress(); result = decompress(&outstream); if (!export && result != (((((256) + 1) + 1) + 1) + 1) && getcode() != (code_int) (((((256) + 1) + 1) + 1) + 1)) { fprintf(stderr, "Decompress didn't finish correctly.\n"); goto fail; } lz_flush(&outstream); # 139 if (verbose > 0) { start_time = cputime() - start_time; fprintf(stderr, "%ld.%02ld seconds (process time) for decompression.\n", start_time / 1000L, (start_time % 1000L) / 10L); } exit(0); } else { fail: fprintf(stderr, "Error when decompressing \"%s\" to \"%s\"\n", (infilename == (0)) ? "" : infilename, (outfilename == (0)) ? "" : outfilename); if ($$ferr != 0) perror("lzdcmp fatal error"); exit(1); } } static get_magic_header() { int head1; int head2; int head3; head2 = 0; if (export != 2) { if ((head1 = (((&instream)->bp < (&instream)->bend) ? *(&instream)->bp++ & 0xFF : (*(&instream)->func)(&instream))) != 0x1F) { fprintf(stderr, "Incorrect first header byte 0x%X\n", head1); longjmp(failure, 1);; } head2 = (((&instream)->bp < (&instream)->bend) ? *(&instream)->bp++ & 0xFF : (*(&instream)->func)(&instream)); head3 = (((&instream)->bp < (&instream)->bend) ? *(&instream)->bp++ & 0xFF : (*(&instream)->func)(&instream)); switch (head2) { case 0x9D: export = 1; break; case 0x9E: export = 0; break; default: fprintf(stderr, "Incorrect second header byte 0x%X\n", head2); longjmp(failure, 1);; } maxbits = head3 & 0x1F; block_compress = ((head3 & 0x80) != 0) ? 1 : 0; # 199 } if (maxbits > 12) { fprintf(stderr, "%s: compressed with %d bits,", infilename, maxbits); fprintf(stderr, " lzdcmp can only handle %d bits\n", 12); longjmp(failure, 1);; } maxmaxcode = 1 << maxbits; if (export == 0) firstcode = (((&instream)->bp < (&instream)->bend) ? *(&instream)->bp++ & 0xFF : (*(&instream)->func)(&instream)) + 0x100; else if (block_compress) firstcode = (256) + 1; else firstcode = 256; # 253 } int mem_decompress(buffer, size) char_type *buffer; int size; # 262 { int result; mem_stream.bp = mem_stream.bstart = buffer; mem_stream.bend = buffer + size; mem_stream.bsize = size; mem_stream.func = lz_fail; if ((result = decompress(&mem_stream)) == ((((256) + 1) + 1) + 1) || result == (((((256) + 1) + 1) + 1) + 1)) return (mem_stream.bp - buffer); else { fprintf(stderr, "Decompress to memory failed.\n"); longjmp(failure, 1);; } return (-1); } static char *helptext[] = { "The following options are valid:", "-B\tBinary file (important on VMS/RSX, ignored on Unix)", "-M val\tSet the maximum number of code bits (unless header present)", "-V val\tPrint status information or debugging data.", "-X val\tSet export (compatibility) mode:", "-X 0\tVMS private mode", "-X 1\tCompatibility with Unix compress", "-X 2\tDo not read a header, disable \"block-compress\" mode", "\t(If a header is present, lzdcmp will properly configure itself,", "\toverriding the -X, -B and -M flag values.", (0), }; static setup(argc, argv) int argc; char *argv[]; # 300 { register char *ap; register int c; char **hp; auto int i; int j; # 310 for (i = j = 1; i < argc; i++) { ap = argv[i]; if (*ap++ != '-' || *ap == 0) argv[j++] = argv[i]; else { while ((c = *ap++) != 0) { if ((_ctype_[(c)&0177]&0002)) c = toupper(c); switch (c) { case 'B': binary = 1; break; case 'M': maxbits = getvalue(ap, &i, argv); if (maxbits < 9) { fprintf(stderr, "Illegal -M value\n"); goto usage; } break; case 'V': verbose = getvalue(ap, &i, argv); break; case 'X': export = getvalue(ap, &i, argv); if (export < 0 || export > 3) { fprintf(stderr, "Illegal -X value: %d\n", export); goto usage; } block_compress = (export < 2); noheader = (export == 3); break; default: fprintf(stderr, "Unknown option '%c' in \"%s\"\n", *ap, argv[i]); usage: for (hp = helptext; *hp != (0); hp++) fprintf(stderr, "%s\n", *hp); longjmp(failure, 1);; } } } } switch (j) { case 3: if (!(strcmp((argv[2]), ("-")) == 0)) outfilename = argv[2]; case 2: if (!(strcmp((argv[1]), ("-")) == 0)) { infilename = argv[1]; } break; case 0: case 1: break; default: fprintf(stderr, "Too many file arguments\n"); longjmp(failure, 1);; } } static int getvalue(ap, ip, argv) register char *ap; int *ip; char *argv[]; # 399 { register int result; register int i; i = *ip + 1; if ((_ctype_[(*ap)&0177]&0004)) { result = atoi(ap); *ap = 0; } else if (*ap == 0 && argv[i] != (0) && (_ctype_[(argv[i][0])&0177]&0004)) { result = atoi(argv[i]); *ip = i; } else { result = 1; } return (result); } openinput() { if (infilename == (0)) { infilename = malloc(257); fgetname(stdin, infilename); infilename = realloc(infilename, strlen(infilename) + 1); } if (freopen(infilename, "rn", stdin) == (0)) { perror(infilename); longjmp(failure, 1);; } # 472 instream.bp = instream.bend = (0); instream.bstart = inbuffer; instream.bsize = sizeof inbuffer; instream.func = lz_fill; } openoutput() { # 531 if (outfilename == (0)) { outfilename = malloc(256 + 1); fgetname(stdout, outfilename); outfilename = realloc(outfilename, strlen(outfilename) + 1); if (binary) { if (freopen(outfilename, "wn", stdout) == (0)) { perror(outfilename); longjmp(failure, 1);; } } } else { if (freopen(outfilename, (binary) ? "wn" : "w", stdout) == (0)) { perror(outfilename); longjmp(failure, 1);; } } # 559 outstream.bp = outstream.bstart = outbuffer; outstream.bend = outbuffer + sizeof outbuffer; outstream.bsize = sizeof outbuffer; outstream.func = lz_flush; } -h- lzdcm2.cc Fri Mar 14 09:51:43 1986 ARISIA$DRC0:[003001.TMP5]LZDCM2.CC;1 # 1 "lzdcm2.c" # 1 # 126 "C:stdio.h" typedef struct IOV { int _cnt; char *_ptr; char *_base; int _flag; int io_wflag; char *io_wild; int io_rbsz; # 166 } FILE; extern FILE *$$luns[]; # 242 extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; extern char *fgets(); extern int $$ferr; extern int $$exst; # 71 "C:ctype.h" extern char _ctype_ []; # 29 "C:setjmp.h" typedef int jmp_buf[6]; # 186 "lz.h" typedef int code_int; # 203 typedef long int count_int; # 209 typedef char char_type; typedef unsigned U_short; # 223 typedef short flag; # 315 extern int errno; # 346 typedef struct STREAM { char_type *bp; char_type *bend; char_type *bstart; short bsize; int (*func)(); } STREAM; # 369 extern int lz_fill(); extern int lz_flush(); extern int lz_eof(); extern int lz_fail(); extern int lz_dummy(); # 388 extern flag binary; extern flag noheader; extern flag export; extern flag block_compress; extern flag verbose; extern flag is_compress; extern char *infilename; extern char *outfilename; extern short n_bits; extern int firstcode; extern jmp_buf failure; # 13 "lzdcm2.c" extern short maxbits; extern code_int maxmaxcode; static flag first_clear = 1; # 22 static char_type stack[8000]; static U_short tab_prefix[1 << 12]; static char_type tab_suffix[1 << 12]; code_int next_code; # 38 int decompress(out) STREAM *out; # 47 { register char_type *stp; register code_int code, oldcode, incode; register int final; extern code_int getcode(); stp = (&stack[8000]); final = oldcode = getcode(); ((((out)->bp >= (out)->bend) ? (*(out)->func)(out) : 0), *(out)->bp++ = ((char) final)); while ((code = getcode()) >= 0) { test: if (code >= (256) && code < firstcode) { lz_putbuf(stp, (&stack[8000]) - stp, out); stp = (&stack[8000]); switch (code) { case (((((256) + 1) + 1) + 1) + 1): case ((((256) + 1) + 1) + 1): goto finish; case ((256) + 1): case (((256) + 1) + 1): default: fprintf(stderr, "\nUnexpected control 0x%X\n", code); longjmp(failure, 1);; case (256): init_decompress(); if ((code = getcode()) < 0 || (export && code == (256))) goto finish; else { # 89 next_code--; goto test; } } } incode = code; # 98 if (code >= next_code) { ; *--stp = final; code = oldcode; } # 109 while (code >= 256) { ; *--stp = tab_suffix[code]; code = tab_prefix[code]; } ; *--stp = final = tab_suffix[code]; # 120 lz_putbuf(stp, (&stack[8000]) - stp, out); stp = (&stack[8000]); # 125 if ((code = next_code) < maxmaxcode) { tab_prefix[code] = (U_short) oldcode; tab_suffix[code] = final; next_code++; } # 133 oldcode = incode; } finish: return (code); } init_decompress() # 143 { register char_type *cp; register U_short *up; register int code; if (first_clear) { for (cp = &tab_suffix[0], code = 0; cp < &tab_suffix[256];) *cp++ = code++; first_clear = 0; } else { # 157 for (up = &tab_prefix[0]; up < &tab_prefix[256];) { *up++ = 0; *up++ = 0; *up++ = 0; *up++ = 0; *up++ = 0; *up++ = 0; *up++ = 0; *up++ = 0; } } next_code = firstcode; } -h- lzdcm3.cc Fri Mar 14 09:51:43 1986 ARISIA$DRC0:[003001.TMP5]LZDCM3.CC;1 # 1 "lzdcm3.c" # 1 # 126 "C:stdio.h" typedef struct IOV { int _cnt; char *_ptr; char *_base; int _flag; int io_wflag; char *io_wild; int io_rbsz; # 166 } FILE; extern FILE *$$luns[]; # 242 extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; extern char *fgets(); extern int $$ferr; extern int $$exst; # 71 "C:ctype.h" extern char _ctype_ []; # 29 "C:setjmp.h" typedef int jmp_buf[6]; # 186 "lz.h" typedef int code_int; # 203 typedef long int count_int; # 209 typedef char char_type; typedef unsigned U_short; # 223 typedef short flag; # 315 extern int errno; # 346 typedef struct STREAM { char_type *bp; char_type *bend; char_type *bstart; short bsize; int (*func)(); } STREAM; # 369 extern int lz_fill(); extern int lz_flush(); extern int lz_eof(); extern int lz_fail(); extern int lz_dummy(); # 388 extern flag binary; extern flag noheader; extern flag export; extern flag block_compress; extern flag verbose; extern flag is_compress; extern char *infilename; extern char *outfilename; extern short n_bits; extern int firstcode; extern jmp_buf failure; # 11 "lzdcm3.c" static char_type rmask[9] = { 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF }; # 30 extern code_int next_code; extern STREAM instream; extern code_int maxmaxcode; extern short maxbits; static short n_bits = 9; static code_int maxcode = ((1 << (9)) - 1); # 41 static char_type buf[12]; static int offset = 0; static int size = 0; code_int getcode() { # 52 register code_int code; register int r_off, bits; register char_type *bp; bp = buf; if (next_code > maxcode) { n_bits++; if (n_bits == maxbits) maxcode = maxmaxcode; else { maxcode = ((1 << (n_bits)) - 1); } size = 0; # 71 } if (offset >= size) { size = lz_getbuf(buf, n_bits, &instream); # 81 if (size <= 0) return (-1); offset = 0; # 88 size = (size << 3) - (n_bits - 1); } r_off = offset; bits = n_bits; # 98 bp += (r_off >> 3); r_off &= 7; # 109 code = ((*bp++ >> r_off) & rmask[8 - r_off]) & 0xFF; bits -= (8 - r_off); r_off = 8 - r_off; # 116 if (bits >= 8) { code |= (*bp++ & 0xFF) << r_off; r_off += 8; bits -= 8; } code |= (*bp & rmask[bits]) << r_off; # 135 offset += n_bits; if (code >= (256) && code < firstcode) { switch (code) { case ((256) + 1): case (((256) + 1) + 1): case (256): size = 0; n_bits = 9; maxcode = ((1 << (9)) - 1); # 151 break; } } # 165 return (code); } -h- lzio.cc Fri Mar 14 09:51:43 1986 ARISIA$DRC0:[003001.TMP5]LZIO.CC;1 # 1 "lzio.c" # 1 # 126 "C:stdio.h" typedef struct IOV { int _cnt; char *_ptr; char *_base; int _flag; int io_wflag; char *io_wild; int io_rbsz; # 166 } FILE; extern FILE *$$luns[]; # 242 extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; extern char *fgets(); extern int $$ferr; extern int $$exst; # 71 "C:ctype.h" extern char _ctype_ []; # 29 "C:setjmp.h" typedef int jmp_buf[6]; # 186 "lz.h" typedef int code_int; # 203 typedef long int count_int; # 209 typedef char char_type; typedef unsigned U_short; # 223 typedef short flag; # 315 extern int errno; # 346 typedef struct STREAM { char_type *bp; char_type *bend; char_type *bstart; short bsize; int (*func)(); } STREAM; # 369 extern int lz_fill(); extern int lz_flush(); extern int lz_eof(); extern int lz_fail(); extern int lz_dummy(); # 388 extern flag binary; extern flag noheader; extern flag export; extern flag block_compress; extern flag verbose; extern flag is_compress; extern char *infilename; extern char *outfilename; extern short n_bits; extern int firstcode; extern jmp_buf failure; # 28 "lzio.c" int lz_fill(s) register STREAM *s; { register int i; extern char *infilename; # 56 i = fread((char *) s->bstart, 1, s->bsize, stdin); if (ferror(stdin)) { perror(infilename); exit(1); } if (i <= 0) return ((-1)); else { s->bp = s->bstart; s->bend = &s->bstart[i]; return (*s->bp++ & 0xFF); } } lz_flush(s) register STREAM *s; { register int count; extern char *outfilename; count = s->bp - s->bstart; # 118 fwrite((char *) s->bstart, 1, count, stdout); if (ferror(stdout)) { perror(outfilename); longjmp(failure, 1);; } s->bp = s->bstart; } int lz_getbuf(buffer, count, s) char_type *buffer; int count; register STREAM *s; # 137 { register char_type *bp; register char_type *ip; register char_type *ep; register int remaining; int datum; if (count == 0) return (0); bp = buffer; while (--count >= 0) { if ((datum = (((s)->bp < (s)->bend) ? *(s)->bp++ & 0xFF : (*(s)->func)(s))) == (-1)) break; *bp++ = datum; remaining = s->bend - (ip = s->bp); if (remaining > count) remaining = count; ep = &ip[remaining]; while (ip < ep) *bp++ = *ip++; count -= remaining; s->bp = ip; } return ((bp == buffer) ? -1 : bp - buffer); } int lz_putbuf(bp, count, s) register char_type *bp; int count; register STREAM *s; # 171 { register char_type *op; register char_type *ep; register int remaining; while (--count >= 0) { ((((s)->bp >= (s)->bend) ? (*(s)->func)(s) : 0), *(s)->bp++ = (*bp++)); remaining = s->bend - (op = s->bp); if (remaining > count) remaining = count; ep = &op[remaining]; while (op < ep) *op++ = *bp++; count -= remaining; s->bp = op; } } int lz_eof(s) STREAM *s; # 195 { return (s, (-1)); } int lz_fail(s) STREAM *s; # 205 { fprintf(stderr, "Memory buffer [%d bytes] filled -- fatal.\n", s->bsize); longjmp(failure, 1);; } int lz_dummy(s) STREAM *s; # 217 { s->bp = s->bstart; } # 334 int col; char *lz_names[] = { "LZ_CLEAR", "LZ_SOH", "LZ_STX", "LZ_EOR", "LZ_ETX", "???" }; dumphex(buffer, count, fd) register char_type *buffer; register int count; FILE *fd; { if (col > 0) { putc('\n', fd); col = 0; } fprintf(fd, "%2d:", count); while (--count >= 0) { fprintf(fd, " %02x", *buffer++ & 0xFF); } fprintf(fd, "\n"); } dumptext(buffer, count, fd) register char_type *buffer; int count; FILE *fd; { extern char *dumpchar(); putc('"', fd); while (--count >= 0) fputs(dumpchar((int) *buffer++), fd); fputs("\"\n", fd); } char * dumpchar(c) register int c; # 375 { static char dump_buffer[8]; c &= 0xFF; if (((unsigned)(c)<=0177) && (_ctype_[(c)&0177]&(0027|0200))) { dump_buffer[0] = c; dump_buffer[1] = 0; } else { switch (c) { case '\n': return ("\\n"); case '\t': return ("\\t"); case '\b': return ("\\b"); case '\f': return ("\\f"); case '\r': return ("\\r"); } sprintf(dump_buffer, "", c); } return (dump_buffer); } # 44 "C:timeb.h" struct timeb { long time; unsigned millitm; short timezone; short dstflag; }; # 405 "lzio.c" long cputime() { struct timeb buf; static struct timeb origin; long result; int msec; if (origin.time == 0) ftime(&origin); ftime(&buf); result = (buf.time - origin.time) * 1000; msec = ((int) buf.msec) - ((int) origin.msec); return (result + ((long) msec)); }