a82bcf1338
git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@2661 8092fc87-c524-0410-9efc-e669fe64eaf9
95 lines
2.8 KiB
C
95 lines
2.8 KiB
C
/*************************************************************************
|
|
LZ packer/unpacker
|
|
|
|
Code is mostly from lzhuf.c found at
|
|
http://www.cs.umu.se/~isak/Snippets
|
|
|
|
***********Original Comment***********************************************
|
|
lzhuf.c
|
|
written by Haruyasu Yoshizaki 1988/11/20
|
|
some minor changes 1989/04/06
|
|
comments translated by Haruhiko Okumura 1989/04/07
|
|
getbit and getbyte modified 1990/03/23 by Paul Edwards
|
|
so that they would work on machines where integers are
|
|
not necessarily 16 bits (although ANSI guarantees a
|
|
minimum of 16). This program has compiled and run with
|
|
no errors under Turbo C 2.0, Power C, and SAS/C 4.5
|
|
(running on an IBM mainframe under MVS/XA 2.2). Could
|
|
people please use YYYY/MM/DD date format so that everyone
|
|
in the world can know what format the date is in?
|
|
external storage of filesize changed 1990/04/18 by Paul Edwards to
|
|
Intel's "little endian" rather than a machine-dependant style so
|
|
that files produced on one machine with lzhuf can be decoded on
|
|
any other. "little endian" style was chosen since lzhuf
|
|
originated on PC's, and therefore they should dictate the
|
|
standard.
|
|
initialization of something predicting spaces changed 1990/04/22 by
|
|
Paul Edwards so that when the compressed file is taken somewhere
|
|
else, it will decode properly, without changing ascii spaces to
|
|
ebcdic spaces. This was done by changing the ' ' (space literal)
|
|
to 0x20 (which is the far most likely character to occur, if you
|
|
don't know what environment it will be running on.
|
|
*************************************************************************/
|
|
|
|
//#include <sys/types.h>
|
|
//#include <sys/stat.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
//#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
//#include <errno.h>
|
|
#include <malloc.h>
|
|
#if defined(WIN32) && defined(_MSC_VER)
|
|
# define inline __inline
|
|
#elif defined(__GNUC__)
|
|
# define inline __inline__
|
|
#endif
|
|
#include "lzhuf.h"
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
char* s;
|
|
lzhuf_session_t sess;
|
|
FILE* infile;
|
|
FILE* outfile;
|
|
int ret;
|
|
|
|
if (argc != 4)
|
|
{
|
|
fprintf(stderr,
|
|
"'lz e file1 file2' encodes file1 into file2.\n"
|
|
"'lz d file2 file1' decodes file2 into file1.\n");
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
if ((s = argv[1], s[1] || strchr("DEde", s[0]) == NULL)
|
|
|| (s = argv[2], (infile = fopen(s, "rb")) == NULL)
|
|
|| (s = argv[3], (outfile = fopen(s, "wb")) == NULL))
|
|
{
|
|
fprintf(stderr, "??? %s\n", s);
|
|
return EXIT_FAILURE;
|
|
}
|
|
|
|
lzhuf_startSession(&sess, LZHUF_STDIO);
|
|
sess.infile = infile;
|
|
sess.outfile = outfile;
|
|
|
|
if (toupper(*argv[1]) == 'E')
|
|
ret = lzhuf_encode(&sess);
|
|
else
|
|
ret = lzhuf_decode(&sess);
|
|
|
|
lzhuf_endSession(&sess);
|
|
|
|
if (ret != 0)
|
|
return EXIT_FAILURE;
|
|
|
|
fclose(infile);
|
|
fclose(outfile);
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|