106 void inflate_fast(strm, start)
110 struct inflate_state FAR *state;
112 void inffas8664fnc(
struct inffast_ar * par);
116 #if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64)) 117 #define PAD_AVAIL_IN 6
118 #define PAD_AVAIL_OUT 258
120 #define PAD_AVAIL_IN 5
121 #define PAD_AVAIL_OUT 257
125 state = (
struct inflate_state FAR *)strm->state;
127 ar.in = strm->next_in;
128 ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN);
129 ar.out = strm->next_out;
130 ar.beg = ar.out - (start - strm->avail_out);
131 ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT);
132 ar.wsize = state->wsize;
133 ar.write = state->wnext;
134 ar.window = state->window;
135 ar.hold = state->hold;
136 ar.bits = state->bits;
137 ar.lcode = state->lencode;
138 ar.dcode = state->distcode;
139 ar.lmask = (1U << state->lenbits) - 1;
140 ar.dmask = (1U << state->distbits) - 1;
146 while (((size_t)(
void *)ar.in & (
sizeof(ar.hold) / 2 - 1)) != 0) {
147 ar.hold += (
unsigned long)*ar.in++ << ar.bits;
155 strm->msg =
"invalid literal/length code";
156 else if (ar.status == 3)
157 strm->msg =
"invalid distance code";
159 strm->msg =
"invalid distance too far back";
162 else if ( ar.status == 1 ) {
167 ar.len = ar.bits >> 3;
169 ar.bits -= ar.len << 3;
170 ar.hold &= (1U << ar.bits) - 1;
173 strm->next_in = ar.in;
174 strm->next_out = ar.out;
175 strm->avail_in = (
unsigned)(ar.in < ar.last ?
176 PAD_AVAIL_IN + (ar.last - ar.in) :
177 PAD_AVAIL_IN - (ar.in - ar.last));
178 strm->avail_out = (
unsigned)(ar.out < ar.end ?
179 PAD_AVAIL_OUT + (ar.end - ar.out) :
180 PAD_AVAIL_OUT - (ar.out - ar.end));
181 state->hold = (
unsigned long)ar.hold;
182 state->bits = ar.bits;
unsigned char FAR * window