/* ------------------------------------------------------------------------ */
-/* LHa for UNIX */
-/* extract.c -- extrcat from archive */
-/* */
-/* Modified Nobutaka Watazaki */
-/* */
-/* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
+/* LHa for UNIX */
+/* extract.c -- extrcat from archive */
+/* */
+/* Modified Nobutaka Watazaki */
+/* */
+/* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
/* ------------------------------------------------------------------------ */
#include "lha.h"
int
-decode_lzhuf(infp, outfp, original_size, packed_size, name, method)
- FILE *infp;
- FILE *outfp;
- long original_size;
- long packed_size;
- char *name;
- int method;
+decode_lzhuf(infp, outfp, original_size, packed_size, name, method, read_sizep)
+ FILE *infp;
+ FILE *outfp;
+ off_t original_size;
+ off_t packed_size;
+ char *name;
+ int method;
+ off_t *read_sizep;
{
- interface.method = method;
- interface.dicbit = 13; /* method + 8; -lh5- */
- interface.infile = infp;
- interface.outfile = outfp;
- interface.original = original_size;
- interface.packed = packed_size;
+ unsigned int crc;
+ struct interfacing interface;
- switch (method) {
- case LZHUFF0_METHOD_NUM:
- case LARC4_METHOD_NUM:
- start_indicator(name, original_size
- ,verify_mode ? "Testing " : "Melting ", 2048);
- copyfile(infp, (verify_mode ? NULL : outfp), original_size, 2);
- break;
- case LARC_METHOD_NUM: /* -lzs- */
- interface.dicbit = 11;
- start_indicator(name, original_size
- ,verify_mode ? "Testing " : "Melting "
- ,1 << interface.dicbit);
- decode(&interface);
- break;
- case LZHUFF1_METHOD_NUM: /* -lh1- */
- case LZHUFF4_METHOD_NUM: /* -lh4- */
- case LARC5_METHOD_NUM: /* -lz5- */
- interface.dicbit = 12;
- start_indicator(name, original_size
- ,verify_mode ? "Testing " : "Melting "
- ,1 << interface.dicbit);
- decode(&interface);
- break;
- case LZHUFF6_METHOD_NUM: /* -lh6- */ /* Added N.Watazaki (^_^) */
-#ifdef SUPPORT_LH7
- case LZHUFF7_METHOD_NUM: /* -lh7- */
-#endif
- interface.dicbit = (method - LZHUFF6_METHOD_NUM) + 15;
-
- default:
- start_indicator(name, original_size
- ,verify_mode ? "Testing " : "Melting "
- ,1 << interface.dicbit);
- decode(&interface);
- }
- finish_indicator(name, verify_mode ? "Tested " : "Melted ");
+ interface.method = method;
+ interface.infile = infp;
+ interface.outfile = outfp;
+ interface.original = original_size;
+ interface.packed = packed_size;
+ interface.read_size = 0;
- return crc;
-}
+ switch (method) {
+ case LZHUFF0_METHOD_NUM: /* -lh0- */
+ interface.dicbit = LZHUFF0_DICBIT;
+ break;
+ case LZHUFF1_METHOD_NUM: /* -lh1- */
+ interface.dicbit = LZHUFF1_DICBIT;
+ break;
+ case LZHUFF2_METHOD_NUM: /* -lh2- */
+ interface.dicbit = LZHUFF2_DICBIT;
+ break;
+ case LZHUFF3_METHOD_NUM: /* -lh2- */
+ interface.dicbit = LZHUFF3_DICBIT;
+ break;
+ case LZHUFF4_METHOD_NUM: /* -lh4- */
+ interface.dicbit = LZHUFF4_DICBIT;
+ break;
+ case LZHUFF5_METHOD_NUM: /* -lh5- */
+ interface.dicbit = LZHUFF5_DICBIT;
+ break;
+ case LZHUFF6_METHOD_NUM: /* -lh6- */
+ interface.dicbit = LZHUFF6_DICBIT;
+ break;
+ case LZHUFF7_METHOD_NUM: /* -lh7- */
+ interface.dicbit = LZHUFF7_DICBIT;
+ break;
+ case LARC_METHOD_NUM: /* -lzs- */
+ interface.dicbit = LARC_DICBIT;
+ break;
+ case LARC5_METHOD_NUM: /* -lz5- */
+ interface.dicbit = LARC5_DICBIT;
+ break;
+ case LARC4_METHOD_NUM: /* -lz4- */
+ interface.dicbit = LARC4_DICBIT;
+ break;
+ default:
+ warning("unknown method %d", method);
+ interface.dicbit = LZHUFF5_DICBIT; /* for backward compatibility */
+ break;
+ }
+
+ if (interface.dicbit == 0) { /* LZHUFF0_DICBIT or LARC4_DICBIT */
+ start_indicator(name,
+ original_size,
+ verify_mode ? "Testing " : "Melting ",
+ 2048);
+ *read_sizep = copyfile(infp, (verify_mode ? NULL : outfp),
+ original_size, 2, &crc);
+ }
+ else {
+ start_indicator(name,
+ original_size,
+ verify_mode ? "Testing " : "Melting ",
+ 1 << interface.dicbit);
+ crc = decode(&interface);
+ *read_sizep = interface.read_size;
+ }
-/* Local Variables: */
-/* mode:c */
-/* tab-width:4 */
-/* End: */
-/* vi: set tabstop=4: */
+ finish_indicator(name, verify_mode ? "Tested " : "Melted ");
+
+ return crc;
+}