OSDN Git Service

00readme.autoconf: Added description for the -b switch which extract MacBinaries.
[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     default:
66         warning("unknown method %d", method);
67         interface.dicbit = LZHUFF5_DICBIT; /* for backward compatibility */
68         break;
69     }
70
71     if (interface.dicbit == 0) { /* LZHUFF0_DICBIT or LARC4_DICBIT */
72         start_indicator(name,
73                         original_size,
74                         verify_mode ? "Testing " : "Melting ",
75                         2048);
76         *read_sizep = copyfile(infp, (verify_mode ? NULL : outfp),
77                                original_size, 2, &crc);
78     }
79     else {
80         start_indicator(name,
81                         original_size,
82                         verify_mode ? "Testing " : "Melting ",
83                         1 << interface.dicbit);
84         crc = decode(&interface);
85         *read_sizep = interface.read_size;
86     }
87
88     finish_indicator(name, verify_mode ? "Tested  " : "Melted  ");
89
90     return crc;
91 }