diff options
Diffstat (limited to 'inffast.c')
-rw-r--r-- | inffast.c | 47 |
1 files changed, 30 insertions, 17 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* inffast.c -- process literals and length/distance pairs fast | 1 | /* inffast.c -- process literals and length/distance pairs fast |
2 | * Copyright (C) 1995-1998 Mark Adler | 2 | * Copyright (C) 1995-2002 Mark Adler |
3 | * For conditions of distribution and use, see copyright notice in zlib.h | 3 | * For conditions of distribution and use, see copyright notice in zlib.h |
4 | */ | 4 | */ |
5 | 5 | ||
@@ -93,28 +93,41 @@ z_streamp z; | |||
93 | 93 | ||
94 | /* do the copy */ | 94 | /* do the copy */ |
95 | m -= c; | 95 | m -= c; |
96 | if ((uInt)(q - s->window) >= d) /* offset before dest */ | 96 | r = q - d; |
97 | { /* just copy */ | 97 | if (r < s->window) /* wrap if needed */ |
98 | r = q - d; | ||
99 | *q++ = *r++; c--; /* minimum count is three, */ | ||
100 | *q++ = *r++; c--; /* so unroll loop a little */ | ||
101 | } | ||
102 | else /* else offset after destination */ | ||
103 | { | 98 | { |
104 | e = d - (uInt)(q - s->window); /* bytes from offset to end */ | 99 | do { |
105 | r = s->end - e; /* pointer to offset */ | 100 | r += s->end - s->window; /* force pointer in window */ |
106 | if (c > e) /* if source crosses, */ | 101 | } while (r < s->window); /* covers invalid distances */ |
102 | e = s->end - r; | ||
103 | if (c > e) | ||
107 | { | 104 | { |
108 | c -= e; /* copy to end of window */ | 105 | c -= e; /* wrapped copy */ |
109 | do { | 106 | do { |
110 | *q++ = *r++; | 107 | *q++ = *r++; |
111 | } while (--e); | 108 | } while (--e); |
112 | r = s->window; /* copy rest from start of window */ | 109 | r = s->window; |
110 | do { | ||
111 | *q++ = *r++; | ||
112 | } while (--c); | ||
113 | } | 113 | } |
114 | else /* normal copy */ | ||
115 | { | ||
116 | *q++ = *r++; c--; | ||
117 | *q++ = *r++; c--; | ||
118 | do { | ||
119 | *q++ = *r++; | ||
120 | } while (--c); | ||
121 | } | ||
122 | } | ||
123 | else /* normal copy */ | ||
124 | { | ||
125 | *q++ = *r++; c--; | ||
126 | *q++ = *r++; c--; | ||
127 | do { | ||
128 | *q++ = *r++; | ||
129 | } while (--c); | ||
114 | } | 130 | } |
115 | do { /* copy all or what's left */ | ||
116 | *q++ = *r++; | ||
117 | } while (--c); | ||
118 | break; | 131 | break; |
119 | } | 132 | } |
120 | else if ((e & 64) == 0) | 133 | else if ((e & 64) == 0) |