diff options
-rw-r--r-- | inftrees.c | 18 |
1 files changed, 8 insertions, 10 deletions
@@ -54,7 +54,7 @@ unsigned short FAR *work; | |||
54 | code FAR *next; /* next available space in table */ | 54 | code FAR *next; /* next available space in table */ |
55 | const unsigned short FAR *base; /* base value table to use */ | 55 | const unsigned short FAR *base; /* base value table to use */ |
56 | const unsigned short FAR *extra; /* extra bits table to use */ | 56 | const unsigned short FAR *extra; /* extra bits table to use */ |
57 | int end; /* use base and extra for symbol > end */ | 57 | unsigned match; /* use base and extra for symbol >= match */ |
58 | unsigned short count[MAXBITS+1]; /* number of codes of each length */ | 58 | unsigned short count[MAXBITS+1]; /* number of codes of each length */ |
59 | unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ | 59 | unsigned short offs[MAXBITS+1]; /* offsets in table for each length */ |
60 | static const unsigned short lbase[31] = { /* Length codes 257..285 base */ | 60 | static const unsigned short lbase[31] = { /* Length codes 257..285 base */ |
@@ -181,19 +181,17 @@ unsigned short FAR *work; | |||
181 | switch (type) { | 181 | switch (type) { |
182 | case CODES: | 182 | case CODES: |
183 | base = extra = work; /* dummy value--not used */ | 183 | base = extra = work; /* dummy value--not used */ |
184 | end = 19; | 184 | match = 20; |
185 | break; | 185 | break; |
186 | case LENS: | 186 | case LENS: |
187 | base = lbase; | 187 | base = lbase; |
188 | base -= 257; | ||
189 | extra = lext; | 188 | extra = lext; |
190 | extra -= 257; | 189 | match = 257; |
191 | end = 256; | ||
192 | break; | 190 | break; |
193 | default: /* DISTS */ | 191 | default: /* DISTS */ |
194 | base = dbase; | 192 | base = dbase; |
195 | extra = dext; | 193 | extra = dext; |
196 | end = -1; | 194 | match = 0; |
197 | } | 195 | } |
198 | 196 | ||
199 | /* initialize state for loop */ | 197 | /* initialize state for loop */ |
@@ -216,13 +214,13 @@ unsigned short FAR *work; | |||
216 | for (;;) { | 214 | for (;;) { |
217 | /* create table entry */ | 215 | /* create table entry */ |
218 | here.bits = (unsigned char)(len - drop); | 216 | here.bits = (unsigned char)(len - drop); |
219 | if ((int)(work[sym]) < end) { | 217 | if (work[sym] + 1 < match) { |
220 | here.op = (unsigned char)0; | 218 | here.op = (unsigned char)0; |
221 | here.val = work[sym]; | 219 | here.val = work[sym]; |
222 | } | 220 | } |
223 | else if ((int)(work[sym]) > end) { | 221 | else if (work[sym] >= match) { |
224 | here.op = (unsigned char)(extra[work[sym]]); | 222 | here.op = (unsigned char)(extra[work[sym] - match]); |
225 | here.val = base[work[sym]]; | 223 | here.val = base[work[sym] - match]; |
226 | } | 224 | } |
227 | else { | 225 | else { |
228 | here.op = (unsigned char)(32 + 64); /* end of block */ | 226 | here.op = (unsigned char)(32 + 64); /* end of block */ |