#include "zutil.h"
#include "inftrees.h"
#include "inflate.h"
#include "inffast.h"
Go to the source code of this file.
|
#define | OFF 1 |
|
#define | PUP(a) *++(a) |
|
Definition at line 67 of file inffast.cc.
70 z_const
unsigned char FAR *in;
71 z_const
unsigned char FAR *
last;
72 unsigned char FAR *out;
73 unsigned char FAR *beg;
74 unsigned char FAR *end;
84 code const FAR *lcode;
85 code const FAR *dcode;
93 unsigned char FAR *from;
97 in = strm->next_in -
OFF;
98 last = in + (strm->avail_in - 5);
99 out = strm->next_out -
OFF;
100 beg = out - (start - strm->avail_out);
101 end = out + (strm->avail_out - 257);
102 #ifdef INFLATE_STRICT
105 wsize = state->
wsize;
106 whave = state->
whave;
107 wnext = state->
wnext;
113 lmask = (1U << state->
lenbits) - 1;
114 dmask = (1U << state->
distbits) - 1;
120 hold += (
unsigned long)(
PUP(in)) << bits;
122 hold += (
unsigned long)(
PUP(in)) << bits;
125 here = lcode[hold & lmask];
127 op = (unsigned)(here.
bits);
130 op = (unsigned)(here.
op);
133 "inflate: literal '%c'\n" :
134 "inflate: literal 0x%02x\n", here.
val));
135 PUP(out) = (
unsigned char)(here.
val);
138 len = (unsigned)(here.
val);
142 hold += (
unsigned long)(
PUP(in)) << bits;
145 len += (unsigned)hold & ((1U << op) - 1);
149 Tracevv((stderr,
"inflate: length %u\n", len));
151 hold += (
unsigned long)(
PUP(in)) << bits;
153 hold += (
unsigned long)(
PUP(in)) << bits;
156 here = dcode[hold & dmask];
158 op = (unsigned)(here.
bits);
161 op = (unsigned)(here.
op);
163 dist = (unsigned)(here.
val);
166 hold += (
unsigned long)(
PUP(in)) << bits;
169 hold += (
unsigned long)(
PUP(in)) << bits;
173 dist += (unsigned)hold & ((1U << op) - 1);
174 #ifdef INFLATE_STRICT
176 strm->msg = (
char *)
"invalid distance too far back";
183 Tracevv((stderr,
"inflate: distance %u\n", dist));
184 op = (unsigned)(out - beg);
190 (
char *)
"invalid distance too far back";
194 #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
195 if (len <= op - whave) {
204 }
while (--op > whave);
225 else if (wnext < op) {
226 from += wsize + wnext - op;
281 else if ((op & 64) == 0) {
282 here = dcode[here.
val + (hold & ((1U << op) - 1))];
286 strm->msg = (
char *)
"invalid distance code";
291 else if ((op & 64) == 0) {
292 here = lcode[here.
val + (hold & ((1U << op) - 1))];
296 Tracevv((stderr,
"inflate: end of block\n"));
301 strm->msg = (
char *)
"invalid literal/length code";
305 }
while (in < last && out < end);
311 hold &= (1U <<
bits) - 1;
314 strm->next_in = in +
OFF;
315 strm->next_out = out +
OFF;
316 strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in -
last));
317 strm->avail_out = (unsigned)(out < end ?
318 257 + (end - out) : 257 - (out - end));
code const FAR * distcode
unsigned char FAR * window