"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "lha-114i/src/shuf.c" of archive lha-114i.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 /* ------------------------------------------------------------------------ */
2 /* LHa for UNIX */
3 /* shuf.c -- extract static Huffman coding */
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 /* ------------------------------------------------------------------------ */
12 #undef NP
13 #undef NP2
14
15 #define NP (8 * 1024 / 64)
16 #define NP2 (NP * 2 - 1)
17 /* ------------------------------------------------------------------------ */
18 static unsigned int np;
19 int fixed[2][16] = {
20 {3, 0x01, 0x04, 0x0c, 0x18, 0x30, 0}, /* old compatible */
21 {2, 0x01, 0x01, 0x03, 0x06, 0x0D, 0x1F, 0x4E, 0} /* 8K buf */
22 };
23 /* ------------------------------------------------------------------------ */
24 void
25 decode_start_st0( /*void*/ )
26 {
27 n_max = 286;
28 maxmatch = MAXMATCH;
29 init_getbits();
30 #ifdef SUPPORT_LH7
31 np = 1 << (MAX_DICBIT - 7);
32 #endif
33 #ifndef SUPPORT_LH7
34 np = 1 << (MAX_DICBIT - 6);
35 #endif
36
37 }
38
39 /* ------------------------------------------------------------------------ */
40 void
41 encode_p_st0(j)
42 unsigned short j;
43 {
44 unsigned short i;
45
46 i = j >> 6;
47 putcode(pt_len[i], pt_code[i]);
48 putbits(6, j & 0x3f);
49 }
50
51 /* ------------------------------------------------------------------------ */
52 static void
53 ready_made(method)
54 int method;
55 {
56 int i, j;
57 unsigned int code, weight;
58 int *tbl;
59
60 tbl = fixed[method];
61 j = *tbl++;
62 weight = 1 << (16 - j);
63 code = 0;
64 for (i = 0; i < np; i++) {
65 while (*tbl == i) {
66 j++;
67 tbl++;
68 weight >>= 1;
69 }
70 pt_len[i] = j;
71 pt_code[i] = code;
72 code += weight;
73 }
74 }
75
76 /* ------------------------------------------------------------------------ */
77 void
78 encode_start_fix( /*void*/ )
79 {
80 n_max = 314;
81 maxmatch = 60;
82 np = 1 << (12 - 6);
83 init_putbits();
84 start_c_dyn();
85 ready_made(0);
86 }
87
88 /* ------------------------------------------------------------------------ */
89 static void
90 read_tree_c( /*void*/ )
91 { /* read tree from file */
92 int i, c;
93
94 i = 0;
95 while (i < N1) {
96 if (getbits(1))
97 c_len[i] = getbits(LENFIELD) + 1;
98 else
99 c_len[i] = 0;
100 if (++i == 3 && c_len[0] == 1 && c_len[1] == 1 && c_len[2] == 1) {
101 c = getbits(CBIT);
102 for (i = 0; i < N1; i++)
103 c_len[i] = 0;
104 for (i = 0; i < 4096; i++)
105 c_table[i] = c;
106 return;
107 }
108 }
109 make_table(N1, c_len, 12, c_table);
110 }
111
112 /* ------------------------------------------------------------------------ */
113 static void
114 read_tree_p(/*void*/)
115 { /* read tree from file */
116 int i, c;
117
118 i = 0;
119 while (i < NP) {
120 pt_len[i] = getbits(LENFIELD);
121 if (++i == 3 && pt_len[0] == 1 && pt_len[1] == 1 && pt_len[2] == 1) {
122 #ifdef SUPPORT_LH7
123 c = getbits(MAX_DICBIT - 7);
124 #else
125 c = getbits(MAX_DICBIT - 6);
126 #endif
127 for (i = 0; i < NP; i++)
128 c_len[i] = 0;
129 for (i = 0; i < 256; i++)
130 c_table[i] = c;
131 return;
132 }
133 }
134 }
135
136 /* ------------------------------------------------------------------------ */
137 void
138 decode_start_fix(/*void*/)
139 {
140 n_max = 314;
141 maxmatch = 60;
142 init_getbits();
143 np = 1 << (12 - 6);
144 start_c_dyn();
145 ready_made(0);
146 make_table(np, pt_len, 8, pt_table);
147 }
148
149 /* ------------------------------------------------------------------------ */
150 unsigned short
151 decode_c_st0(/*void*/)
152 {
153 int i, j;
154 static unsigned short blocksize = 0;
155
156 if (blocksize == 0) { /* read block head */
157 blocksize = getbits(BUFBITS); /* read block blocksize */
158 read_tree_c();
159 if (getbits(1)) {
160 read_tree_p();
161 }
162 else {
163 ready_made(1);
164 }
165 make_table(NP, pt_len, 8, pt_table);
166 }
167 blocksize--;
168 j = c_table[bitbuf >> 4];
169 if (j < N1)
170 fillbuf(c_len[j]);
171 else {
172 fillbuf(12);
173 i = bitbuf;
174 do {
175 if ((short) i < 0)
176 j = right[j];
177 else
178 j = left[j];
179 i <<= 1;
180 } while (j >= N1);
181 fillbuf(c_len[j] - 12);
182 }
183 if (j == N1 - 1)
184 j += getbits(EXTRABITS);
185 return j;
186 }
187
188 /* ------------------------------------------------------------------------ */
189 unsigned short
190 decode_p_st0(/*void*/)
191 {
192 int i, j;
193
194 j = pt_table[bitbuf >> 8];
195 if (j < np) {
196 fillbuf(pt_len[j]);
197 }
198 else {
199 fillbuf(8);
200 i = bitbuf;
201 do {
202 if ((short) i < 0)
203 j = right[j];
204 else
205 j = left[j];
206 i <<= 1;
207 } while (j >= np);
208 fillbuf(pt_len[j] - 8);
209 }
210 return (j << 6) + getbits(6);
211 }
212
213 /* Local Variables: */
214 /* mode:c */
215 /* tab-width:4 */
216 /* End: */