|
|
1.1 ! root 1: /*--------------------------------------------------------------------------- ! 2: ! 3: unzip.c ! 4: ! 5: Highly butchered minimum unzip code for inflate.c ! 6: ! 7: ---------------------------------------------------------------------------*/ ! 8: ! 9: #include "zunzip.h" /* includes, defines, and macros */ ! 10: ! 11: #define VERSION "v4.20p BETA of 2-18-92" ! 12: ! 13: /**********************/ ! 14: /* Global Variables */ ! 15: /**********************/ ! 16: ! 17: longint csize; /* used by list_files(), ReadByte(): must be signed */ ! 18: longint ucsize; /* used by list_files(), unReduce(), unImplode() */ ! 19: ! 20: ULONG mask_bits[] = ! 21: {0x00000000L, ! 22: 0x00000001L, 0x00000003L, 0x00000007L, 0x0000000fL, ! 23: 0x0000001fL, 0x0000003fL, 0x0000007fL, 0x000000ffL, ! 24: 0x000001ffL, 0x000003ffL, 0x000007ffL, 0x00000fffL, ! 25: 0x00001fffL, 0x00003fffL, 0x00007fffL, 0x0000ffffL, ! 26: 0x0001ffffL, 0x0003ffffL, 0x0007ffffL, 0x000fffffL, ! 27: 0x001fffffL, 0x003fffffL, 0x007fffffL, 0x00ffffffL, ! 28: 0x01ffffffL, 0x03ffffffL, 0x07ffffffL, 0x0fffffffL, ! 29: 0x1fffffffL, 0x3fffffffL, 0x7fffffffL, 0xffffffffL}; ! 30: ! 31: /*--------------------------------------------------------------------------- ! 32: Input file variables: ! 33: ---------------------------------------------------------------------------*/ ! 34: ! 35: byte *inbuf = NULL, *inptr; /* input buffer (any size is legal) and pointer */ ! 36: int incnt; ! 37: ! 38: ULONG bitbuf; ! 39: int bits_left; ! 40: boolean zipeof; ! 41: ! 42: int zipfd; /* zipfile file handle */ ! 43: ! 44: /*--------------------------------------------------------------------------- ! 45: Output stream variables: ! 46: ---------------------------------------------------------------------------*/ ! 47: ! 48: byte *outbuf; /* buffer for rle look-back */ ! 49: byte *outptr; ! 50: byte *outout; /* scratch pad for ASCII-native trans */ ! 51: longint outpos; /* absolute position in outfile */ ! 52: int outcnt; /* current position in outbuf */ ! 53: int outfd; ! 54: ! 55: /*--------------------------------------------------------------------------- ! 56: unzip.c static global variables (visible only within this file): ! 57: ---------------------------------------------------------------------------*/ ! 58: ! 59: static byte *hold; ! 60: ! 61: /*******************/ ! 62: /* Main unzip code */ ! 63: /*******************/ ! 64: ! 65: int unzip( FILE *inFile, FILE *outFile ) /* return PK-type error code (except under VMS) */ ! 66: { ! 67: outfd = fileno( outFile ); ! 68: zipfd = fileno( inFile ); ! 69: ! 70: if( inbuf == NULL ) ! 71: { ! 72: inbuf = (byte *) (malloc(INBUFSIZ + 4)); /* 4 extra for hold[] (below) */ ! 73: outbuf = (byte *) (malloc(OUTBUFSIZ + 1)); /* 1 extra for string termin. */ ! 74: outout = outbuf; /* else just point to outbuf */ ! 75: ! 76: if ((inbuf == NULL) || (outbuf == NULL) || (outout == NULL)) { ! 77: fprintf(stderr, "error: can't allocate unzip buffers\n"); ! 78: RETURN(4); /* 4-8: insufficient memory */ ! 79: } ! 80: hold = &inbuf[INBUFSIZ]; /* to check for boundary-spanning signatures */ ! 81: } ! 82: ! 83: bits_left = 0; ! 84: bitbuf = 0; ! 85: outpos = 0L; ! 86: outcnt = 0; ! 87: outptr = outbuf; ! 88: zipeof = 0; ! 89: ! 90: /* Set output buffer to initial value */ ! 91: memset(outbuf, 0, OUTBUFSIZ); ! 92: ! 93: /* Go from high- to low-level I/O */ ! 94: lseek( zipfd, ftell(inFile), SEEK_SET ); ! 95: ! 96: if ((incnt = read(zipfd,inbuf,INBUFSIZ)) <= 0) { ! 97: fprintf(stderr, "error: unexpected end if input"); ! 98: return(-1); /* can still do next file */ ! 99: } ! 100: inptr = inbuf; ! 101: ! 102: /* Read in implode information */ ! 103: csize = 1000L; /* Dummy size just to get input bits */ ! 104: ! 105: /* Get compressed, uncompressed file sizes */ ! 106: csize = ucsize = 1000000000L; /* Make sure we can read in anything */ ! 107: inflate(); /* Ftoomschk! */ ! 108: ! 109: /* Flush output buffer before returning */ ! 110: FlushOutput(); ! 111: return(0); ! 112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.