[comp.binaries.ibm.pc] v02i042: C source for lharc's LZHuff compression algorithm

c31293%tansei.cc.u-tokyo.ac.jp@RELAY.CS.NET (Kenji Rikitake) (04/06/89)

Checksum: 4042323451  (Verify with "brik -cv")
Posting-number: Volume 02, Issue 042
Originally-from: Haruhiko Okumura, Haruyasu Yoshizaki, & Kenji Rikitake
Submitted-by: Kenji Rikitake <c31293%tansei.cc.u-tokyo.ac.jp@RELAY.CS.NET>
Archive-name: lharc/lzhsrc10.uue

[ US users should note that the cost of international email is usually
borne by the non-US recipient or sender.  -- R.D. ]

Following is a source code of single-file compression/uncompresssion
program. It has the same compression algorithm with LHarc.  I have got
a permission to post this to the USENET community from Haruyasu
Yoshizaki.
-- Kenji

[
From the source:

    * LZHUF.C English version 1.0
    * Based on Japanese version 29-NOV-1988
    * LZSS coded by Haruhiko OKUMURA
    * Adaptive Huffman Coding coded by Haruyasu YOSHIZAKI
    * Edited and translated to English by Kenji RIKITAKE

The source is fairly generic but has a few ANSI-specific features such
as memmove() and function prototypes.

It compiles with Turbo C 1.0.  The resulting program is quite fast,
considering it is written purely in C.  It seems to compress exactly as
well as lharc itself.  I did not try to compile it on any other
system.

This would have been the perfect text posting except that there are
some control characters in the source, so I archived it.

Checksums obtained with the 4.3BSD "sum" or System V "sum -r" command.

checksum     size (bytes)  file (between BEGIN--cut and END--cut lines)
   31099         9715      lzhsrc10.uue

checksum     size (bytes)  file
   32520         7028      lzhsrc10.arc

-- R.D.
]

lharc part01/01
BEGIN--cut here--cut here
begin 644 lzhsrc10.arc
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
(8!!""@4%&@!6
`
end
END--cut here--cut here