diff options
-rw-r--r-- | inffast.c | 81 |
1 files changed, 31 insertions, 50 deletions
@@ -10,25 +10,6 @@ | |||
10 | 10 | ||
11 | #ifndef ASMINF | 11 | #ifndef ASMINF |
12 | 12 | ||
13 | /* Allow machine dependent optimization for post-increment or pre-increment. | ||
14 | Based on testing to date, | ||
15 | Pre-increment preferred for: | ||
16 | - PowerPC G3 (Adler) | ||
17 | - MIPS R5000 (Randers-Pehrson) | ||
18 | Post-increment preferred for: | ||
19 | - none | ||
20 | No measurable difference: | ||
21 | - Pentium III (Anderson) | ||
22 | - M68060 (Nikl) | ||
23 | */ | ||
24 | #ifdef POSTINC | ||
25 | # define OFF 0 | ||
26 | # define PUP(a) *(a)++ | ||
27 | #else | ||
28 | # define OFF 1 | ||
29 | # define PUP(a) *++(a) | ||
30 | #endif | ||
31 | |||
32 | /* | 13 | /* |
33 | Decode literal, length, and distance codes and write out the resulting | 14 | Decode literal, length, and distance codes and write out the resulting |
34 | literal and match bytes until either not enough input or output is | 15 | literal and match bytes until either not enough input or output is |
@@ -96,9 +77,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
96 | 77 | ||
97 | /* copy state to local variables */ | 78 | /* copy state to local variables */ |
98 | state = (struct inflate_state FAR *)strm->state; | 79 | state = (struct inflate_state FAR *)strm->state; |
99 | in = strm->next_in - OFF; | 80 | in = strm->next_in; |
100 | last = in + (strm->avail_in - 5); | 81 | last = in + (strm->avail_in - 5); |
101 | out = strm->next_out - OFF; | 82 | out = strm->next_out; |
102 | beg = out - (start - strm->avail_out); | 83 | beg = out - (start - strm->avail_out); |
103 | end = out + (strm->avail_out - 257); | 84 | end = out + (strm->avail_out - 257); |
104 | #ifdef INFLATE_STRICT | 85 | #ifdef INFLATE_STRICT |
@@ -119,9 +100,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
119 | input data or output space */ | 100 | input data or output space */ |
120 | do { | 101 | do { |
121 | if (bits < 15) { | 102 | if (bits < 15) { |
122 | hold += (unsigned long)(PUP(in)) << bits; | 103 | hold += (unsigned long)(*in++) << bits; |
123 | bits += 8; | 104 | bits += 8; |
124 | hold += (unsigned long)(PUP(in)) << bits; | 105 | hold += (unsigned long)(*in++) << bits; |
125 | bits += 8; | 106 | bits += 8; |
126 | } | 107 | } |
127 | here = lcode[hold & lmask]; | 108 | here = lcode[hold & lmask]; |
@@ -134,14 +115,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
134 | Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? | 115 | Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? |
135 | "inflate: literal '%c'\n" : | 116 | "inflate: literal '%c'\n" : |
136 | "inflate: literal 0x%02x\n", here.val)); | 117 | "inflate: literal 0x%02x\n", here.val)); |
137 | PUP(out) = (unsigned char)(here.val); | 118 | *out++ = (unsigned char)(here.val); |
138 | } | 119 | } |
139 | else if (op & 16) { /* length base */ | 120 | else if (op & 16) { /* length base */ |
140 | len = (unsigned)(here.val); | 121 | len = (unsigned)(here.val); |
141 | op &= 15; /* number of extra bits */ | 122 | op &= 15; /* number of extra bits */ |
142 | if (op) { | 123 | if (op) { |
143 | if (bits < op) { | 124 | if (bits < op) { |
144 | hold += (unsigned long)(PUP(in)) << bits; | 125 | hold += (unsigned long)(*in++) << bits; |
145 | bits += 8; | 126 | bits += 8; |
146 | } | 127 | } |
147 | len += (unsigned)hold & ((1U << op) - 1); | 128 | len += (unsigned)hold & ((1U << op) - 1); |
@@ -150,9 +131,9 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
150 | } | 131 | } |
151 | Tracevv((stderr, "inflate: length %u\n", len)); | 132 | Tracevv((stderr, "inflate: length %u\n", len)); |
152 | if (bits < 15) { | 133 | if (bits < 15) { |
153 | hold += (unsigned long)(PUP(in)) << bits; | 134 | hold += (unsigned long)(*in++) << bits; |
154 | bits += 8; | 135 | bits += 8; |
155 | hold += (unsigned long)(PUP(in)) << bits; | 136 | hold += (unsigned long)(*in++) << bits; |
156 | bits += 8; | 137 | bits += 8; |
157 | } | 138 | } |
158 | here = dcode[hold & dmask]; | 139 | here = dcode[hold & dmask]; |
@@ -165,10 +146,10 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
165 | dist = (unsigned)(here.val); | 146 | dist = (unsigned)(here.val); |
166 | op &= 15; /* number of extra bits */ | 147 | op &= 15; /* number of extra bits */ |
167 | if (bits < op) { | 148 | if (bits < op) { |
168 | hold += (unsigned long)(PUP(in)) << bits; | 149 | hold += (unsigned long)(*in++) << bits; |
169 | bits += 8; | 150 | bits += 8; |
170 | if (bits < op) { | 151 | if (bits < op) { |
171 | hold += (unsigned long)(PUP(in)) << bits; | 152 | hold += (unsigned long)(*in++) << bits; |
172 | bits += 8; | 153 | bits += 8; |
173 | } | 154 | } |
174 | } | 155 | } |
@@ -196,30 +177,30 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
196 | #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR | 177 | #ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR |
197 | if (len <= op - whave) { | 178 | if (len <= op - whave) { |
198 | do { | 179 | do { |
199 | PUP(out) = 0; | 180 | *out++ = 0; |
200 | } while (--len); | 181 | } while (--len); |
201 | continue; | 182 | continue; |
202 | } | 183 | } |
203 | len -= op - whave; | 184 | len -= op - whave; |
204 | do { | 185 | do { |
205 | PUP(out) = 0; | 186 | *out++ = 0; |
206 | } while (--op > whave); | 187 | } while (--op > whave); |
207 | if (op == 0) { | 188 | if (op == 0) { |
208 | from = out - dist; | 189 | from = out - dist; |
209 | do { | 190 | do { |
210 | PUP(out) = PUP(from); | 191 | *out++ = *from++; |
211 | } while (--len); | 192 | } while (--len); |
212 | continue; | 193 | continue; |
213 | } | 194 | } |
214 | #endif | 195 | #endif |
215 | } | 196 | } |
216 | from = window - OFF; | 197 | from = window; |
217 | if (wnext == 0) { /* very common case */ | 198 | if (wnext == 0) { /* very common case */ |
218 | from += wsize - op; | 199 | from += wsize - op; |
219 | if (op < len) { /* some from window */ | 200 | if (op < len) { /* some from window */ |
220 | len -= op; | 201 | len -= op; |
221 | do { | 202 | do { |
222 | PUP(out) = PUP(from); | 203 | *out++ = *from++; |
223 | } while (--op); | 204 | } while (--op); |
224 | from = out - dist; /* rest from output */ | 205 | from = out - dist; /* rest from output */ |
225 | } | 206 | } |
@@ -230,14 +211,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
230 | if (op < len) { /* some from end of window */ | 211 | if (op < len) { /* some from end of window */ |
231 | len -= op; | 212 | len -= op; |
232 | do { | 213 | do { |
233 | PUP(out) = PUP(from); | 214 | *out++ = *from++; |
234 | } while (--op); | 215 | } while (--op); |
235 | from = window - OFF; | 216 | from = window; |
236 | if (wnext < len) { /* some from start of window */ | 217 | if (wnext < len) { /* some from start of window */ |
237 | op = wnext; | 218 | op = wnext; |
238 | len -= op; | 219 | len -= op; |
239 | do { | 220 | do { |
240 | PUP(out) = PUP(from); | 221 | *out++ = *from++; |
241 | } while (--op); | 222 | } while (--op); |
242 | from = out - dist; /* rest from output */ | 223 | from = out - dist; /* rest from output */ |
243 | } | 224 | } |
@@ -248,35 +229,35 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
248 | if (op < len) { /* some from window */ | 229 | if (op < len) { /* some from window */ |
249 | len -= op; | 230 | len -= op; |
250 | do { | 231 | do { |
251 | PUP(out) = PUP(from); | 232 | *out++ = *from++; |
252 | } while (--op); | 233 | } while (--op); |
253 | from = out - dist; /* rest from output */ | 234 | from = out - dist; /* rest from output */ |
254 | } | 235 | } |
255 | } | 236 | } |
256 | while (len > 2) { | 237 | while (len > 2) { |
257 | PUP(out) = PUP(from); | 238 | *out++ = *from++; |
258 | PUP(out) = PUP(from); | 239 | *out++ = *from++; |
259 | PUP(out) = PUP(from); | 240 | *out++ = *from++; |
260 | len -= 3; | 241 | len -= 3; |
261 | } | 242 | } |
262 | if (len) { | 243 | if (len) { |
263 | PUP(out) = PUP(from); | 244 | *out++ = *from++; |
264 | if (len > 1) | 245 | if (len > 1) |
265 | PUP(out) = PUP(from); | 246 | *out++ = *from++; |
266 | } | 247 | } |
267 | } | 248 | } |
268 | else { | 249 | else { |
269 | from = out - dist; /* copy direct from output */ | 250 | from = out - dist; /* copy direct from output */ |
270 | do { /* minimum length is three */ | 251 | do { /* minimum length is three */ |
271 | PUP(out) = PUP(from); | 252 | *out++ = *from++; |
272 | PUP(out) = PUP(from); | 253 | *out++ = *from++; |
273 | PUP(out) = PUP(from); | 254 | *out++ = *from++; |
274 | len -= 3; | 255 | len -= 3; |
275 | } while (len > 2); | 256 | } while (len > 2); |
276 | if (len) { | 257 | if (len) { |
277 | PUP(out) = PUP(from); | 258 | *out++ = *from++; |
278 | if (len > 1) | 259 | if (len > 1) |
279 | PUP(out) = PUP(from); | 260 | *out++ = *from++; |
280 | } | 261 | } |
281 | } | 262 | } |
282 | } | 263 | } |
@@ -313,8 +294,8 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ | |||
313 | hold &= (1U << bits) - 1; | 294 | hold &= (1U << bits) - 1; |
314 | 295 | ||
315 | /* update state and return */ | 296 | /* update state and return */ |
316 | strm->next_in = in + OFF; | 297 | strm->next_in = in; |
317 | strm->next_out = out + OFF; | 298 | strm->next_out = out; |
318 | strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); | 299 | strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last)); |
319 | strm->avail_out = (unsigned)(out < end ? | 300 | strm->avail_out = (unsigned)(out < end ? |
320 | 257 + (end - out) : 257 - (out - end)); | 301 | 257 + (end - out) : 257 - (out - end)); |