OSDN Git Service

possible to extract 4G over files
[lha/lha.git] / src / extract.c
index 931308a..814df7f 100644 (file)
@@ -1,71 +1,91 @@
 /* ------------------------------------------------------------------------ */
-/* 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;
+}