OSDN Git Service

Merge pull request #11 from yoheie/fix_path_compare
[lha/lha.git] / src / extract.c
1 /* ------------------------------------------------------------------------ */
2 /* LHa for UNIX                                                             */
3 /*              extract.c -- extrcat from archive                           */
4 /*                                                                          */
5 /*      Modified                Nobutaka Watazaki                           */
6 /*                                                                          */
7 /*  Ver. 1.14   Source All chagned              1995.01.14  N.Watazaki      */
8 /* ------------------------------------------------------------------------ */
9 #include "lha.h"
10
11 int
12 decode_lzhuf(infp, outfp, original_size, packed_size, name, method, read_sizep)
13     FILE           *infp;
14     FILE           *outfp;
15     off_t           original_size;
16     off_t           packed_size;
17     char           *name;
18     int             method;
19     off_t          *read_sizep;
20 {
21     unsigned int crc;
22     struct interfacing interface;
23
24     interface.method = method;
25     interface.infile = infp;
26     interface.outfile = outfp;
27     interface.original = original_size;
28     interface.packed = packed_size;
29     interface.read_size = 0;
30
31     switch (method) {
32     case LZHUFF0_METHOD_NUM:    /* -lh0- */
33         interface.dicbit = LZHUFF0_DICBIT;
34         break;
35     case LZHUFF1_METHOD_NUM:    /* -lh1- */
36         interface.dicbit = LZHUFF1_DICBIT;
37         break;
38     case LZHUFF2_METHOD_NUM:    /* -lh2- */
39         interface.dicbit = LZHUFF2_DICBIT;
40         break;
41     case LZHUFF3_METHOD_NUM:    /* -lh2- */
42         interface.dicbit = LZHUFF3_DICBIT;
43         break;
44     case LZHUFF4_METHOD_NUM:    /* -lh4- */
45         interface.dicbit = LZHUFF4_DICBIT;
46         break;
47     case LZHUFF5_METHOD_NUM:    /* -lh5- */
48         interface.dicbit = LZHUFF5_DICBIT;
49         break;
50     case LZHUFF6_METHOD_NUM:    /* -lh6- */
51         interface.dicbit = LZHUFF6_DICBIT;
52         break;
53     case LZHUFF7_METHOD_NUM:    /* -lh7- */
54         interface.dicbit = LZHUFF7_DICBIT;
55         break;
56     case LARC_METHOD_NUM:       /* -lzs- */
57         interface.dicbit = LARC_DICBIT;
58         break;
59     case LARC5_METHOD_NUM:      /* -lz5- */
60         interface.dicbit = LARC5_DICBIT;
61         break;
62     case LARC4_METHOD_NUM:      /* -lz4- */
63         interface.dicbit = LARC4_DICBIT;
64         break;
65     case PMARC0_METHOD_NUM:     /* -pm0- */
66         interface.dicbit = PMARC0_DICBIT;
67         break;
68     case PMARC2_METHOD_NUM:     /* -pm2- */
69         interface.dicbit = PMARC2_DICBIT;
70         break;
71     default:
72         warning("unknown method %d", method);
73         interface.dicbit = LZHUFF5_DICBIT; /* for backward compatibility */
74         break;
75     }
76
77     if (interface.dicbit == 0) { /* LZHUFF0_DICBIT or LARC4_DICBIT or PMARC0_DICBIT*/
78         start_indicator(name,
79                         original_size,
80                         verify_mode ? "Testing " : "Melting ",
81                         2048);
82
83         if (dump_lzss)
84             printf("no use slide\n");
85
86         *read_sizep = copyfile(infp, (verify_mode ? NULL : outfp),
87                                original_size, 2, &crc);
88     }
89     else {
90         start_indicator(name,
91                         original_size,
92                         verify_mode ? "Testing " : "Melting ",
93                         1 << interface.dicbit);
94         if (dump_lzss)
95             printf("\n");
96
97         crc = decode(&interface);
98         *read_sizep = interface.read_size;
99     }
100
101     finish_indicator(name, verify_mode ? "Tested  " : "Melted  ");
102
103     return crc;
104 }