aboutsummaryrefslogtreecommitdiff
path: root/inffast.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2011-09-09 23:22:37 -0700
committerMark Adler <madler@alumni.caltech.edu>2011-09-09 23:22:37 -0700
commit4b5a43a219d51066c01ff2ab86af18b967f2d0dd (patch)
tree4dcaf0cd18751d04cf638a9a6ec521990d4f2e90 /inffast.c
parent086e982175da84b3db958191031380794315f95f (diff)
downloadzlib-4b5a43a219d51066c01ff2ab86af18b967f2d0dd.tar.gz
zlib-4b5a43a219d51066c01ff2ab86af18b967f2d0dd.tar.bz2
zlib-4b5a43a219d51066c01ff2ab86af18b967f2d0dd.zip
zlib 1.2.0.5v1.2.0.5
Diffstat (limited to 'inffast.c')
-rw-r--r--inffast.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/inffast.c b/inffast.c
index 59a8af8..513b1af 100644
--- a/inffast.c
+++ b/inffast.c
@@ -8,6 +8,8 @@
8#include "inflate.h" 8#include "inflate.h"
9#include "inffast.h" 9#include "inffast.h"
10 10
11#ifndef ASMINF
12
11/* Allow machine dependent optimization for post-increment or pre-increment. 13/* Allow machine dependent optimization for post-increment or pre-increment.
12 Based on testing to date, 14 Based on testing to date,
13 Pre-increment preferred for: 15 Pre-increment preferred for:
@@ -72,6 +74,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
72 unsigned char FAR *beg; /* inflate()'s initial strm->next_out */ 74 unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
73 unsigned char FAR *end; /* while out < end, enough space available */ 75 unsigned char FAR *end; /* while out < end, enough space available */
74 unsigned wsize; /* window size or zero if not using window */ 76 unsigned wsize; /* window size or zero if not using window */
77 unsigned whave; /* valid bytes in the window */
75 unsigned write; /* window write index */ 78 unsigned write; /* window write index */
76 unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ 79 unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
77 unsigned long hold; /* local strm->hold */ 80 unsigned long hold; /* local strm->hold */
@@ -95,6 +98,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
95 beg = out - (start - strm->avail_out); 98 beg = out - (start - strm->avail_out);
96 end = out + (strm->avail_out - 257); 99 end = out + (strm->avail_out - 257);
97 wsize = state->wsize; 100 wsize = state->wsize;
101 whave = state->whave;
98 write = state->write; 102 write = state->write;
99 window = state->window; 103 window = state->window;
100 hold = state->hold; 104 hold = state->hold;
@@ -167,13 +171,13 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
167 Tracevv((stderr, "inflate: distance %u\n", dist)); 171 Tracevv((stderr, "inflate: distance %u\n", dist));
168 op = (unsigned)(out - beg); /* max distance in output */ 172 op = (unsigned)(out - beg); /* max distance in output */
169 if (dist > op) { /* see if copy from window */ 173 if (dist > op) { /* see if copy from window */
170 if (dist > wsize) { 174 op = dist - op; /* distance back in window */
175 if (op > whave) {
171 strm->msg = (char *)"invalid distance too far back"; 176 strm->msg = (char *)"invalid distance too far back";
172 state->mode = BAD; 177 state->mode = BAD;
173 break; 178 break;
174 } 179 }
175 from = window - OFF; 180 from = window - OFF;
176 op = dist - op; /* distance back in window */
177 if (write == 0) { /* very common case */ 181 if (write == 0) { /* very common case */
178 from += wsize - op; 182 from += wsize - op;
179 if (op < len) { /* some from window */ 183 if (op < len) { /* some from window */
@@ -296,3 +300,5 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
296 - Larger unrolled copy loops (three is about right) 300 - Larger unrolled copy loops (three is about right)
297 - Moving len -= 3 statement into middle of loop 301 - Moving len -= 3 statement into middle of loop
298 */ 302 */
303
304#endif /* !ASMINF */