home *** CD-ROM | disk | FTP | other *** search
/ Garbo / Garbo.cdr / pc / source / shark.lzh / rev.hst < prev    next >
Text File  |  1990-11-12  |  11KB  |  242 lines

  1. /* $@(#) compress rev.hst,v 4.3 90/01/06 08:00:00 don Release ^
  2.  * compress.c - File compression ala IEEE Computer, June 1984.
  3.  *
  4.  * Authors:
  5.  *      Spencer W. Thomas   (decvax!harpo!utah-cs!utah-gr!thomas)
  6.  *      Jim McKie           (decvax!mcvax!jim)
  7.  *      Steve Davies        (decvax!vax135!petsd!peora!srd)
  8.  *      Ken Turkowski       (decvax!decwrl!turtlevax!ken)
  9.  *      James A. Woods      (decvax!ihnp4!ames!jaw)
  10.  *      Joe Orost           (decvax!vax135!petsd!joe)
  11.  *      Don Gloistein via:  (!rutgers!princeton!mccc!pjh)
  12.  *      Don Gloistein       (Compuserve,Unixforum 76010,474)
  13.  *      Lyle Rains          (Compuserve,Unixforum 72150,324)
  14.  *
  15.  * $Header: compress.c,v 4.3c 90/01/06 08:00:00 don Release $
  16.  * $Log:    compress.c,v $
  17.  *
  18.  * Revision 4.3c  90/01/06 08:00:00 don
  19.  *
  20.  * Fixed dereferenced pointer in error message. 
  21.  * Changed some defines because some 68000 systems with some compilers used
  22.  * sign extension on pointers. See README4.3 for more information.
  23.  *
  24.  * Revision 4.3   89/10/25  08:00:00 don
  25.  *
  26.  * Changed some cosmetics. Revised version() function to clean it up.
  27.  * Revised testing for links. Now done in beginning rather than after a
  28.  * compress. Put all the utility scripts and atob v4 back in so the
  29.  * distributed package now has all the old release 4.0 files.
  30.  *
  31.  * Revision 4.3   89/05/20  08:00:00  don
  32.  *
  33.  * Added changes submitted by Dale Schumacher for Minix version port. One
  34.  * change that affected the rest of the code was the addition of the
  35.  * get_one() function. A somewhat cleaner way of getting console input.
  36.  *
  37.  * Revision 4.3   88/12/26  08:00:00  don
  38.  *
  39.  * Fixed bug with output file always going to the default directory even if
  40.  * filename was fully qualified. Fixed bug with file name > 12 characters.
  41.  * Fixed problem with Atari ST desktop not reading program name properly.
  42.  * Added -B option, same as -b option.
  43.  *
  44.  * Revision 4.2   88/12/18  08:00:00  don
  45.  *
  46.  * Fixed problems with various xenix compilers. Now compiles properly with
  47.  * included makefile.xen in the large model. Fixed error in compusi.uni that
  48.  * tested for the wrong program name. More compatibility changes. Fixed
  49.  * problem with os/2 operating system. Streams now closed before unlinks.
  50.  *
  51.  * Replaced adaptive reset of tables as an option in the code. This will
  52.  * result with smaller compressed files at a sacrifice of some processing
  53.  * speed. It is smaller only on files that push compress to 16 bits.
  54.  *
  55.  * Revision 4.1e  88/12/11  22:00:00  don
  56.  *
  57.  * Re-established unix defaults for all versions; i.e., it now will unlink
  58.  * input file on success and operates as full unix filter. Changed some
  59.  * defines and constructs to allow it to compile on more compilers. Cleaned
  60.  * up some casts.
  61.  *
  62.  * Revision 4.1d  88/11/28  00:00:00  don
  63.  *
  64.  * Changed compusi.dos module to force lower case program name and compare.
  65.  * Modified allocation routines to be defined in header file. One place to
  66.  * change the function name. Fixed some typos, added some more compiler
  67.  * dependent defines.
  68.  *
  69.  * Revision 4.1c  88/11/04  09:00:00  don
  70.  *
  71.  * More cleaning up. Changed some allocation functions to avoid longs. Changed
  72.  * signal() to be optional. Added some libc.a functions for compilers without
  73.  * some newer string functions. Cleaned up more logic. First release out of
  74.  * beta.
  75.  *
  76.  * Revision 4.10b 88/11/01  09:10:00  don
  77.  *
  78.  * More cleaning up. Now will compile in small model with near heap with
  79.  * 12 bits. Cleaned up declarations. Added some other MsDos compiler
  80.  * defines. Fixed bugs with finding the path and file name. Fixed bugs with
  81.  * inpath and outpath and where the files would be placed.
  82.  *
  83.  * Revision 4.10a 88/10/30  13:00:00  don
  84.  *
  85.  * No longer needs huge pointers. Did more cleaning up on the code. Future
  86.  * changes will revolve around supporting other compilers/operating systems.
  87.  * See COMPRESS.H for the various defines you need for your system.
  88.  * Because of the changes in the algorithm, it no longer uses adaptive
  89.  * reset of the block. It just assumes to do it. This decision was made in
  90.  * the interests of speed. The original compress code compressed a 220k byte
  91.  * file on my machine in about 4 minutes. It now takes less than 45 seconds.
  92.  *
  93.  * Revision 4.10  88/10/08  13:00:00  don
  94.  *
  95.  * Changed compress() decompress() functions to use far *arrays and stay
  96.  * within a segment.  Code changes courtesy of Lyle V. Rains. Now should
  97.  * compile on Xenix properly. See makefile and .lnk files for compiling and
  98.  * linking information.  Compiles in small memory model now.
  99.  *
  100.  ******** BELOW KEPT FOR HISTORICAL PURPOSES. ALGORITHM CHANGED WITH 4.1 ****
  101.  ******** New compress() and decompress() compatible with current        ****
  102.  ******** version 4.0 joe release, including command options             ****
  103.  *
  104.  * Revision 4.01  88/09/04  22:00:00  don
  105.  *
  106.  * revised the files to now have compress.c compusi.c and compapi.c. The
  107.  * globals are in compress.h and the prototypes are in compress.fns.
  108.  *
  109.  * revised some msdos code, adapted for 16 bit compression, Microsoft C
  110.  * compiler version 5.1.  Must compile in compact model. Compiler must support
  111.  * huge pointers. Now uses about 447929 bytes to load.  Debug version is not
  112.  * supported under 16 bit compression. More work on the argv[0] and the use of
  113.  * three letter extensions for naming the compressed files. Now works with
  114.  * swichchar set to dash. Debug version will compile to 16 bits, but is too
  115.  * large to load.
  116.  *
  117.  * Fixed irrationality of the ^C interupt.  If interupted while decompressing
  118.  * to the console, it would unlink a file if it also existed on the disk.
  119.  *
  120.  * Added in and out path parameters. More realistic on specified extension for
  121.  * MsDos, eg:  uncomp program.exe  will search for program.exz and call it
  122.  * program.exe instead of dropping final letter. If uncomp program.exz is
  123.  * the command line, the z is dropped and no adjustment is made.
  124.  *
  125.  * Revision 4.0  87/09/09  09:00:00  don
  126.  * added MSDOS if defined's to adapt for pcxt and msdos. As written it
  127.  * will compile with Microsoft C version 4 compiler.  Revised code for
  128.  * file names, argv[0] checking, added option -k to kill the source file
  129.  * after compress.  Changed the default to keep the source. Fixed bug with
  130.  * filename/pathname.
  131.  *
  132.  * Revision 4.0  85/07/30  12:50:00  joe
  133.  * Removed ferror() calls in output routine on every output except first.
  134.  * Prepared for release to the world.
  135.  *
  136.  * Revision 3.6  85/07/04  01:22:21  joe
  137.  * Remove much wasted storage by overlaying hash table with the tables
  138.  * used by decompress: tab_suffix[1<<BITS], stack[8000].  Updated USERMEM
  139.  * computations.  Fixed dump_tab() DEBUG routine.
  140.  *
  141.  * Revision 3.5  85/06/30  20:47:21  jaw
  142.  * Change hash function to use exclusive-or.  Rip out hash cache.  These
  143.  * speedups render the megamemory version defunct, for now.  Make decoder
  144.  * stack global.  Parts of the RCS trunks 2.7, 2.6, and 2.1 no longer apply.
  145.  *
  146.  * Revision 3.4  85/06/27  12:00:00  ken
  147.  * Get rid of all floating-point calculations by doing all compression ratio
  148.  * calculations in fixed point.
  149.  *
  150.  * Revision 3.3  85/06/24  21:53:24  joe
  151.  * Incorporate portability suggestion for M_XENIX.  Got rid of text on #else
  152.  * and #endif lines.  Cleaned up #ifdefs for vax and interdata.
  153.  *
  154.  * Revision 3.2  85/06/06  21:53:24  jaw
  155.  * Incorporate portability suggestions for Z8000, IBM PC/XT from mailing list.
  156.  * Default to "quiet" output (no compression statistics).
  157.  *
  158.  * Revision 3.1  85/05/12  18:56:13  jaw
  159.  * Integrate decompress() stack speedups (from early pointer mods by McKie).
  160.  * Repair multi-file USERMEM gaffe.  Unify 'force' flags to mimic semantics
  161.  * of SVR2 'pack'.  Streamline block-compress table clear logic.  Increase
  162.  * output byte count by magic number size.
  163.  *
  164.  * Revision 3.0   84/11/27  11:50:00  petsd!joe
  165.  * Set HSIZE depending on BITS.  Set BITS depending on USERMEM.  Unrolled
  166.  * loops in clear routines.  Added "-C" flag for 2.0 compatibility.  Used
  167.  * unsigned compares on Perkin-Elmer.  Fixed foreground check.
  168.  *
  169.  * Revision 2.7   84/11/16  19:35:39  ames!jaw
  170.  * Cache common hash codes based on input statistics; this improves
  171.  * performance for low-density raster images.  Pass on #ifdef bundle
  172.  * from Turkowski.
  173.  *
  174.  * Revision 2.6   84/11/05  19:18:21  ames!jaw
  175.  * Vary size of hash tables to reduce time for small files.
  176.  * Tune PDP-11 hash function.
  177.  *
  178.  * Revision 2.5   84/10/30  20:15:14  ames!jaw
  179.  * Junk chaining; replace with the simpler (and, on the VAX, faster)
  180.  * double hashing, discussed within.  Make block compression standard.
  181.  *
  182.  * Revision 2.4   84/10/16  11:11:11  ames!jaw
  183.  * Introduce adaptive reset for block compression, to boost the rate
  184.  * another several percent.  (See mailing list notes.)
  185.  *
  186.  * Revision 2.3   84/09/22  22:00:00  petsd!joe
  187.  * Implemented "-B" block compress.  Implemented REVERSE sorting of tab_next.
  188.  * Bug fix for last bits.  Changed fwrite to putchar loop everywhere.
  189.  *
  190.  * Revision 2.2   84/09/18  14:12:21  ames!jaw
  191.  * Fold in news changes, small machine typedef from thomas,
  192.  * #ifdef interdata from joe.
  193.  *
  194.  * Revision 2.1   84/09/10  12:34:56  ames!jaw
  195.  * Configured fast table lookup for 32-bit machines.
  196.  * This cuts user time in half for b <= FBITS, and is useful for news batching
  197.  * from VAX to PDP sites.  Also sped up decompress() [fwrite->putc] and
  198.  * added signal catcher [plus beef in writeerr()] to delete effluvia.
  199.  *
  200.  * Revision 2.0   84/08/28  22:00:00  petsd!joe
  201.  * Add check for foreground before prompting user.  Insert maxbits into
  202.  * compressed file.  Force file being uncompressed to end with ".Z".
  203.  * Added "-c" flag and "zcat".  Prepared for release.
  204.  *
  205.  * Revision 1.10  84/08/24  18:28:00  turtlevax!ken
  206.  * Will only compress regular files (no directories), added a magic number
  207.  * header (plus an undocumented -n flag to handle old files without headers),
  208.  * added -f flag to force overwriting of possibly existing destination file,
  209.  * otherwise the user is prompted for a response.  Will tack on a .Z to a
  210.  * filename if it doesn't have one when decompressing.  Will only replace
  211.  * file if it was compressed.
  212.  *
  213.  * Revision 1.9  84/08/16  17:28:00  turtlevax!ken
  214.  * Removed scanargs(), getopt(), added .Z extension and unlimited number of
  215.  * filenames to compress.  Flags may be clustered (-Ddvb12) or separated
  216.  * (-D -d -v -b 12), or combination thereof.  Modes and other status is
  217.  * copied with copystat().  -O bug for 4.2 seems to have disappeared with
  218.  * 1.8.
  219.  *
  220.  * Revision 1.8  84/08/09  23:15:00  joe
  221.  * Made it compatible with vax version, installed jim's fixes/enhancements
  222.  *
  223.  * Revision 1.6  84/08/01  22:08:00  joe
  224.  * Sped up algorithm significantly by sorting the compress chain.
  225.  *
  226.  * Revision 1.5  84/07/13  13:11:00  srd
  227.  * Added C version of vax asm routines.  Changed structure to arrays to
  228.  * save much memory.  Do unsigned compares where possible (faster on
  229.  * Perkin-Elmer)
  230.  *
  231.  * Revision 1.4  84/07/05  03:11:11  thomas
  232.  * Clean up the code a little and lint it.  (Lint complains about all
  233.  * the regs used in the asm, but I'm not going to "fix" this.)
  234.  *
  235.  * Revision 1.3  84/07/05  02:06:54  thomas
  236.  * Minor fixes.
  237.  *
  238.  * Revision 1.2  84/07/05  00:27:27  thomas
  239.  * Add variable bit length output.
  240.  *
  241.  */
  242.