Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: third_party/zlib/gzread.c

Issue 2084863002: Update Zlib to version 1.2.8 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/zlib/gzlib.c ('k') | third_party/zlib/gzwrite.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* gzread.c -- zlib functions for reading gzip files 1 /* gzread.c -- zlib functions for reading gzip files
2 * Copyright (C) 2004, 2005, 2010 Mark Adler 2 * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 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
6 #include "gzguts.h" 6 #include "gzguts.h"
7 7
8 /* Local functions */ 8 /* Local functions */
9 local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *)); 9 local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
10 local int gz_avail OF((gz_statep)); 10 local int gz_avail OF((gz_statep));
11 local int gz_next4 OF((gz_statep, unsigned long *)); 11 local int gz_look OF((gz_statep));
12 local int gz_head OF((gz_statep));
13 local int gz_decomp OF((gz_statep)); 12 local int gz_decomp OF((gz_statep));
14 local int gz_make OF((gz_statep)); 13 local int gz_fetch OF((gz_statep));
15 local int gz_skip OF((gz_statep, z_off64_t)); 14 local int gz_skip OF((gz_statep, z_off64_t));
16 15
17 /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from 16 /* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
18 state->fd, and update state->eof, state->err, and state->msg as appropriate. 17 state->fd, and update state->eof, state->err, and state->msg as appropriate.
19 This function needs to loop on read(), since read() is not guaranteed to 18 This function needs to loop on read(), since read() is not guaranteed to
20 read the number of bytes requested, depending on the type of descriptor. */ 19 read the number of bytes requested, depending on the type of descriptor. */
21 local int gz_load(state, buf, len, have) 20 local int gz_load(state, buf, len, have)
22 gz_statep state; 21 gz_statep state;
23 unsigned char *buf; 22 unsigned char *buf;
24 unsigned len; 23 unsigned len;
(...skipping 14 matching lines...) Expand all
39 } 38 }
40 if (ret == 0) 39 if (ret == 0)
41 state->eof = 1; 40 state->eof = 1;
42 return 0; 41 return 0;
43 } 42 }
44 43
45 /* Load up input buffer and set eof flag if last data loaded -- return -1 on 44 /* Load up input buffer and set eof flag if last data loaded -- return -1 on
46 error, 0 otherwise. Note that the eof flag is set when the end of the input 45 error, 0 otherwise. Note that the eof flag is set when the end of the input
47 file is reached, even though there may be unused data in the buffer. Once 46 file is reached, even though there may be unused data in the buffer. Once
48 that data has been used, no more attempts will be made to read the file. 47 that data has been used, no more attempts will be made to read the file.
49 gz_avail() assumes that strm->avail_in == 0. */ 48 If strm->avail_in != 0, then the current data is moved to the beginning of
49 the input buffer, and then the remainder of the buffer is loaded with the
50 available data from the input file. */
50 local int gz_avail(state) 51 local int gz_avail(state)
51 gz_statep state; 52 gz_statep state;
52 { 53 {
54 unsigned got;
53 z_streamp strm = &(state->strm); 55 z_streamp strm = &(state->strm);
54 56
55 if (state->err != Z_OK) 57 if (state->err != Z_OK && state->err != Z_BUF_ERROR)
56 return -1; 58 return -1;
57 if (state->eof == 0) { 59 if (state->eof == 0) {
58 if (gz_load(state, state->in, state->size, 60 if (strm->avail_in) { /* copy what's there to the start */
59 (unsigned *)&(strm->avail_in)) == -1) 61 unsigned char *p = state->in;
62 unsigned const char *q = strm->next_in;
63 unsigned n = strm->avail_in;
64 do {
65 *p++ = *q++;
66 } while (--n);
67 }
68 if (gz_load(state, state->in + strm->avail_in,
69 state->size - strm->avail_in, &got) == -1)
60 return -1; 70 return -1;
71 strm->avail_in += got;
61 strm->next_in = state->in; 72 strm->next_in = state->in;
62 } 73 }
63 return 0; 74 return 0;
64 } 75 }
65 76
66 /* Get next byte from input, or -1 if end or error. */ 77 /* Look for gzip header, set up for inflate or copy. state->x.have must be 0.
67 #define NEXT() ((strm->avail_in == 0 && gz_avail(state) == -1) ? -1 : \
68 (strm->avail_in == 0 ? -1 : \
69 (strm->avail_in--, *(strm->next_in)++)))
70
71 /* Get a four-byte little-endian integer and return 0 on success and the value
72 in *ret. Otherwise -1 is returned and *ret is not modified. */
73 local int gz_next4(state, ret)
74 gz_statep state;
75 unsigned long *ret;
76 {
77 int ch;
78 unsigned long val;
79 z_streamp strm = &(state->strm);
80
81 val = NEXT();
82 val += (unsigned)NEXT() << 8;
83 val += (unsigned long)NEXT() << 16;
84 ch = NEXT();
85 if (ch == -1)
86 return -1;
87 val += (unsigned long)ch << 24;
88 *ret = val;
89 return 0;
90 }
91
92 /* Look for gzip header, set up for inflate or copy. state->have must be zero.
93 If this is the first time in, allocate required memory. state->how will be 78 If this is the first time in, allocate required memory. state->how will be
94 left unchanged if there is no more input data available, will be set to COPY 79 left unchanged if there is no more input data available, will be set to COPY
95 if there is no gzip header and direct copying will be performed, or it will 80 if there is no gzip header and direct copying will be performed, or it will
96 be set to GZIP for decompression, and the gzip header will be skipped so 81 be set to GZIP for decompression. If direct copying, then leftover input
97 that the next available input data is the raw deflate stream. If direct 82 data from the input buffer will be copied to the output buffer. In that
98 copying, then leftover input data from the input buffer will be copied to 83 case, all further file reads will be directly to either the output buffer or
99 the output buffer. In that case, all further file reads will be directly to 84 a user buffer. If decompressing, the inflate state will be initialized.
100 either the output buffer or a user buffer. If decompressing, the inflate 85 gz_look() will return 0 on success or -1 on failure. */
101 state and the check value will be initialized. gz_head() will return 0 on 86 local int gz_look(state)
102 success or -1 on failure. Failures may include read errors or gzip header
103 errors. */
104 local int gz_head(state)
105 gz_statep state; 87 gz_statep state;
106 { 88 {
107 z_streamp strm = &(state->strm); 89 z_streamp strm = &(state->strm);
108 int flags;
109 unsigned len;
110 90
111 /* allocate read buffers and inflate memory */ 91 /* allocate read buffers and inflate memory */
112 if (state->size == 0) { 92 if (state->size == 0) {
113 /* allocate buffers */ 93 /* allocate buffers */
114 state->in = malloc(state->want); 94 state->in = (unsigned char *)malloc(state->want);
115 state->out = malloc(state->want << 1); 95 state->out = (unsigned char *)malloc(state->want << 1);
116 if (state->in == NULL || state->out == NULL) { 96 if (state->in == NULL || state->out == NULL) {
117 if (state->out != NULL) 97 if (state->out != NULL)
118 free(state->out); 98 free(state->out);
119 if (state->in != NULL) 99 if (state->in != NULL)
120 free(state->in); 100 free(state->in);
121 gz_error(state, Z_MEM_ERROR, "out of memory"); 101 gz_error(state, Z_MEM_ERROR, "out of memory");
122 return -1; 102 return -1;
123 } 103 }
124 state->size = state->want; 104 state->size = state->want;
125 105
126 /* allocate inflate memory */ 106 /* allocate inflate memory */
127 state->strm.zalloc = Z_NULL; 107 state->strm.zalloc = Z_NULL;
128 state->strm.zfree = Z_NULL; 108 state->strm.zfree = Z_NULL;
129 state->strm.opaque = Z_NULL; 109 state->strm.opaque = Z_NULL;
130 state->strm.avail_in = 0; 110 state->strm.avail_in = 0;
131 state->strm.next_in = Z_NULL; 111 state->strm.next_in = Z_NULL;
132 if (inflateInit2(&(state->strm), -15) != Z_OK) { /* raw inflate */ 112 if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */
133 free(state->out); 113 free(state->out);
134 free(state->in); 114 free(state->in);
135 state->size = 0; 115 state->size = 0;
136 gz_error(state, Z_MEM_ERROR, "out of memory"); 116 gz_error(state, Z_MEM_ERROR, "out of memory");
137 return -1; 117 return -1;
138 } 118 }
139 } 119 }
140 120
141 /* get some data in the input buffer */ 121 /* get at least the magic bytes in the input buffer */
142 if (strm->avail_in == 0) { 122 if (strm->avail_in < 2) {
143 if (gz_avail(state) == -1) 123 if (gz_avail(state) == -1)
144 return -1; 124 return -1;
145 if (strm->avail_in == 0) 125 if (strm->avail_in == 0)
146 return 0; 126 return 0;
147 } 127 }
148 128
149 /* look for the gzip magic header bytes 31 and 139 */ 129 /* look for gzip magic bytes -- if there, do gzip decoding (note: there is
150 if (strm->next_in[0] == 31) { 130 a logical dilemma here when considering the case of a partially written
151 strm->avail_in--; 131 gzip file, to wit, if a single 31 byte is written, then we cannot tell
152 strm->next_in++; 132 whether this is a single-byte file, or just a partially written gzip
153 if (strm->avail_in == 0 && gz_avail(state) == -1) 133 file -- for here we assume that if a gzip file is being written, then
154 return -1; 134 the header will be written in a single operation, so that reading a
155 if (strm->avail_in && strm->next_in[0] == 139) { 135 single byte is sufficient indication that it is not a gzip file) */
156 /* we have a gzip header, woo hoo! */ 136 if (strm->avail_in > 1 &&
157 strm->avail_in--; 137 strm->next_in[0] == 31 && strm->next_in[1] == 139) {
158 strm->next_in++; 138 inflateReset(strm);
159 139 state->how = GZIP;
160 /* skip rest of header */ 140 state->direct = 0;
161 if (NEXT() != 8) { /* compression method */ 141 return 0;
162 gz_error(state, Z_DATA_ERROR, "unknown compression method");
163 return -1;
164 }
165 flags = NEXT();
166 if (flags & 0xe0) { /* reserved flag bits */
167 gz_error(state, Z_DATA_ERROR, "unknown header flags set");
168 return -1;
169 }
170 NEXT(); /* modification time */
171 NEXT();
172 NEXT();
173 NEXT();
174 NEXT(); /* extra flags */
175 NEXT(); /* operating system */
176 if (flags & 4) { /* extra field */
177 len = (unsigned)NEXT();
178 len += (unsigned)NEXT() << 8;
179 while (len--)
180 if (NEXT() < 0)
181 break;
182 }
183 if (flags & 8) /* file name */
184 while (NEXT() > 0)
185 ;
186 if (flags & 16) /* comment */
187 while (NEXT() > 0)
188 ;
189 if (flags & 2) { /* header crc */
190 NEXT();
191 NEXT();
192 }
193 /* an unexpected end of file is not checked for here -- it will be
194 noticed on the first request for uncompressed data */
195
196 /* set up for decompression */
197 inflateReset(strm);
198 strm->adler = crc32(0L, Z_NULL, 0);
199 state->how = GZIP;
200 state->direct = 0;
201 return 0;
202 }
203 else {
204 /* not a gzip file -- save first byte (31) and fall to raw i/o */
205 state->out[0] = 31;
206 state->have = 1;
207 }
208 } 142 }
209 143
210 /* doing raw i/o, save start of raw data for seeking, copy any leftover 144 /* no gzip header -- if we were decoding gzip before, then this is trailing
211 input to output -- this assumes that the output buffer is larger than 145 garbage. Ignore the trailing garbage and finish. */
212 the input buffer, which also assures space for gzungetc() */ 146 if (state->direct == 0) {
213 state->raw = state->pos; 147 strm->avail_in = 0;
214 state->next = state->out; 148 state->eof = 1;
149 state->x.have = 0;
150 return 0;
151 }
152
153 /* doing raw i/o, copy any leftover input to output -- this assumes that
154 the output buffer is larger than the input buffer, which also assures
155 space for gzungetc() */
156 state->x.next = state->out;
215 if (strm->avail_in) { 157 if (strm->avail_in) {
216 memcpy(state->next + state->have, strm->next_in, strm->avail_in); 158 memcpy(state->x.next, strm->next_in, strm->avail_in);
217 state->have += strm->avail_in; 159 state->x.have = strm->avail_in;
218 strm->avail_in = 0; 160 strm->avail_in = 0;
219 } 161 }
220 state->how = COPY; 162 state->how = COPY;
221 state->direct = 1; 163 state->direct = 1;
222 return 0; 164 return 0;
223 } 165 }
224 166
225 /* Decompress from input to the provided next_out and avail_out in the state. 167 /* Decompress from input to the provided next_out and avail_out in the state.
226 If the end of the compressed data is reached, then verify the gzip trailer 168 On return, state->x.have and state->x.next point to the just decompressed
227 check value and length (modulo 2^32). state->have and state->next are set 169 data. If the gzip stream completes, state->how is reset to LOOK to look for
228 to point to the just decompressed data, and the crc is updated. If the 170 the next gzip stream or raw data, once state->x.have is depleted. Returns 0
229 trailer is verified, state->how is reset to LOOK to look for the next gzip 171 on success, -1 on failure. */
230 stream or raw data, once state->have is depleted. Returns 0 on success, -1
231 on failure. Failures may include invalid compressed data or a failed gzip
232 trailer verification. */
233 local int gz_decomp(state) 172 local int gz_decomp(state)
234 gz_statep state; 173 gz_statep state;
235 { 174 {
236 int ret; 175 int ret = Z_OK;
237 unsigned had; 176 unsigned had;
238 unsigned long crc, len;
239 z_streamp strm = &(state->strm); 177 z_streamp strm = &(state->strm);
240 178
241 /* fill output buffer up to end of deflate stream */ 179 /* fill output buffer up to end of deflate stream */
242 had = strm->avail_out; 180 had = strm->avail_out;
243 do { 181 do {
244 /* get more input for inflate() */ 182 /* get more input for inflate() */
245 if (strm->avail_in == 0 && gz_avail(state) == -1) 183 if (strm->avail_in == 0 && gz_avail(state) == -1)
246 return -1; 184 return -1;
247 if (strm->avail_in == 0) { 185 if (strm->avail_in == 0) {
248 gz_error(state, Z_DATA_ERROR, "unexpected end of file"); 186 gz_error(state, Z_BUF_ERROR, "unexpected end of file");
249 return -1; 187 break;
250 } 188 }
251 189
252 /* decompress and handle errors */ 190 /* decompress and handle errors */
253 ret = inflate(strm, Z_NO_FLUSH); 191 ret = inflate(strm, Z_NO_FLUSH);
254 if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) { 192 if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
255 gz_error(state, Z_STREAM_ERROR, 193 gz_error(state, Z_STREAM_ERROR,
256 "internal error: inflate stream corrupt"); 194 "internal error: inflate stream corrupt");
257 return -1; 195 return -1;
258 } 196 }
259 if (ret == Z_MEM_ERROR) { 197 if (ret == Z_MEM_ERROR) {
260 gz_error(state, Z_MEM_ERROR, "out of memory"); 198 gz_error(state, Z_MEM_ERROR, "out of memory");
261 return -1; 199 return -1;
262 } 200 }
263 if (ret == Z_DATA_ERROR) { /* deflate stream invalid */ 201 if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
264 gz_error(state, Z_DATA_ERROR, 202 gz_error(state, Z_DATA_ERROR,
265 strm->msg == NULL ? "compressed data error" : strm->msg); 203 strm->msg == NULL ? "compressed data error" : strm->msg);
266 return -1; 204 return -1;
267 } 205 }
268 } while (strm->avail_out && ret != Z_STREAM_END); 206 } while (strm->avail_out && ret != Z_STREAM_END);
269 207
270 /* update available output and crc check value */ 208 /* update available output */
271 state->have = had - strm->avail_out; 209 state->x.have = had - strm->avail_out;
272 state->next = strm->next_out - state->have; 210 state->x.next = strm->next_out - state->x.have;
273 strm->adler = crc32(strm->adler, state->next, state->have);
274 211
275 /* check gzip trailer if at end of deflate stream */ 212 /* if the gzip stream completed successfully, look for another */
276 if (ret == Z_STREAM_END) { 213 if (ret == Z_STREAM_END)
277 if (gz_next4(state, &crc) == -1 || gz_next4(state, &len) == -1) { 214 state->how = LOOK;
278 gz_error(state, Z_DATA_ERROR, "unexpected end of file");
279 return -1;
280 }
281 if (crc != strm->adler) {
282 gz_error(state, Z_DATA_ERROR, "incorrect data check");
283 return -1;
284 }
285 if (len != (strm->total_out & 0xffffffffL)) {
286 gz_error(state, Z_DATA_ERROR, "incorrect length check");
287 return -1;
288 }
289 state->how = LOOK; /* ready for next stream, once have is 0 (leave
290 state->direct unchanged to remember how) */
291 }
292 215
293 /* good decompression */ 216 /* good decompression */
294 return 0; 217 return 0;
295 } 218 }
296 219
297 /* Make data and put in the output buffer. Assumes that state->have == 0. 220 /* Fetch data and put it in the output buffer. Assumes state->x.have is 0.
298 Data is either copied from the input file or decompressed from the input 221 Data is either copied from the input file or decompressed from the input
299 file depending on state->how. If state->how is LOOK, then a gzip header is 222 file depending on state->how. If state->how is LOOK, then a gzip header is
300 looked for (and skipped if found) to determine wither to copy or decompress. 223 looked for to determine whether to copy or decompress. Returns -1 on error,
301 Returns -1 on error, otherwise 0. gz_make() will leave state->have as COPY 224 otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the
302 or GZIP unless the end of the input file has been reached and all data has 225 end of the input file has been reached and all data has been processed. */
303 been processed. */ 226 local int gz_fetch(state)
304 local int gz_make(state)
305 gz_statep state; 227 gz_statep state;
306 { 228 {
307 z_streamp strm = &(state->strm); 229 z_streamp strm = &(state->strm);
308 230
309 if (state->how == LOOK) { /* look for gzip header */ 231 do {
310 if (gz_head(state) == -1) 232 switch(state->how) {
311 return -1; 233 case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */
312 if (state->have) /* got some data from gz_head() */ 234 if (gz_look(state) == -1)
235 return -1;
236 if (state->how == LOOK)
237 return 0;
238 break;
239 case COPY: /* -> COPY */
240 if (gz_load(state, state->out, state->size << 1, &(state->x.have))
241 == -1)
242 return -1;
243 state->x.next = state->out;
313 return 0; 244 return 0;
314 } 245 case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */
315 if (state->how == COPY) { /* straight copy */ 246 strm->avail_out = state->size << 1;
316 if (gz_load(state, state->out, state->size << 1, &(state->have)) == -1) 247 strm->next_out = state->out;
317 return -1; 248 if (gz_decomp(state) == -1)
318 state->next = state->out; 249 return -1;
319 } 250 }
320 else if (state->how == GZIP) { /* decompress */ 251 } while (state->x.have == 0 && (!state->eof || strm->avail_in));
321 strm->avail_out = state->size << 1;
322 strm->next_out = state->out;
323 if (gz_decomp(state) == -1)
324 return -1;
325 }
326 return 0; 252 return 0;
327 } 253 }
328 254
329 /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */ 255 /* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
330 local int gz_skip(state, len) 256 local int gz_skip(state, len)
331 gz_statep state; 257 gz_statep state;
332 z_off64_t len; 258 z_off64_t len;
333 { 259 {
334 unsigned n; 260 unsigned n;
335 261
336 /* skip over len bytes or reach end-of-file, whichever comes first */ 262 /* skip over len bytes or reach end-of-file, whichever comes first */
337 while (len) 263 while (len)
338 /* skip over whatever is in output buffer */ 264 /* skip over whatever is in output buffer */
339 if (state->have) { 265 if (state->x.have) {
340 n = GT_OFF(state->have) || (z_off64_t)state->have > len ? 266 n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
341 (unsigned)len : state->have; 267 (unsigned)len : state->x.have;
342 state->have -= n; 268 state->x.have -= n;
343 state->next += n; 269 state->x.next += n;
344 state->pos += n; 270 state->x.pos += n;
345 len -= n; 271 len -= n;
346 } 272 }
347 273
348 /* output buffer empty -- return if we're at the end of the input */ 274 /* output buffer empty -- return if we're at the end of the input */
349 else if (state->eof && state->strm.avail_in == 0) 275 else if (state->eof && state->strm.avail_in == 0)
350 break; 276 break;
351 277
352 /* need more data to skip -- load up output buffer */ 278 /* need more data to skip -- load up output buffer */
353 else { 279 else {
354 /* get more output, looking for header if required */ 280 /* get more output, looking for header if required */
355 if (gz_make(state) == -1) 281 if (gz_fetch(state) == -1)
356 return -1; 282 return -1;
357 } 283 }
358 return 0; 284 return 0;
359 } 285 }
360 286
361 /* -- see zlib.h -- */ 287 /* -- see zlib.h -- */
362 int ZEXPORT gzread(file, buf, len) 288 int ZEXPORT gzread(file, buf, len)
363 gzFile file; 289 gzFile file;
364 voidp buf; 290 voidp buf;
365 unsigned len; 291 unsigned len;
366 { 292 {
367 unsigned got, n; 293 unsigned got, n;
368 gz_statep state; 294 gz_statep state;
369 z_streamp strm; 295 z_streamp strm;
370 296
371 /* get internal structure */ 297 /* get internal structure */
372 if (file == NULL) 298 if (file == NULL)
373 return -1; 299 return -1;
374 state = (gz_statep)file; 300 state = (gz_statep)file;
375 strm = &(state->strm); 301 strm = &(state->strm);
376 302
377 /* check that we're reading and that there's no error */ 303 /* check that we're reading and that there's no (serious) error */
378 if (state->mode != GZ_READ || state->err != Z_OK) 304 if (state->mode != GZ_READ ||
305 (state->err != Z_OK && state->err != Z_BUF_ERROR))
379 return -1; 306 return -1;
380 307
381 /* since an int is returned, make sure len fits in one, otherwise return 308 /* since an int is returned, make sure len fits in one, otherwise return
382 with an error (this avoids the flaw in the interface) */ 309 with an error (this avoids the flaw in the interface) */
383 if ((int)len < 0) { 310 if ((int)len < 0) {
384 gz_error(state, Z_BUF_ERROR, "requested length does not fit in int"); 311 gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
385 return -1; 312 return -1;
386 } 313 }
387 314
388 /* if len is zero, avoid unnecessary operations */ 315 /* if len is zero, avoid unnecessary operations */
389 if (len == 0) 316 if (len == 0)
390 return 0; 317 return 0;
391 318
392 /* process a skip request */ 319 /* process a skip request */
393 if (state->seek) { 320 if (state->seek) {
394 state->seek = 0; 321 state->seek = 0;
395 if (gz_skip(state, state->skip) == -1) 322 if (gz_skip(state, state->skip) == -1)
396 return -1; 323 return -1;
397 } 324 }
398 325
399 /* get len bytes to buf, or less than len if at the end */ 326 /* get len bytes to buf, or less than len if at the end */
400 got = 0; 327 got = 0;
401 do { 328 do {
402 /* first just try copying data from the output buffer */ 329 /* first just try copying data from the output buffer */
403 if (state->have) { 330 if (state->x.have) {
404 n = state->have > len ? len : state->have; 331 n = state->x.have > len ? len : state->x.have;
405 memcpy(buf, state->next, n); 332 memcpy(buf, state->x.next, n);
406 state->next += n; 333 state->x.next += n;
407 state->have -= n; 334 state->x.have -= n;
408 } 335 }
409 336
410 /* output buffer empty -- return if we're at the end of the input */ 337 /* output buffer empty -- return if we're at the end of the input */
411 else if (state->eof && strm->avail_in == 0) 338 else if (state->eof && strm->avail_in == 0) {
339 state->past = 1; /* tried to read past end */
412 break; 340 break;
341 }
413 342
414 /* need output data -- for small len or new stream load up our output 343 /* need output data -- for small len or new stream load up our output
415 buffer */ 344 buffer */
416 else if (state->how == LOOK || len < (state->size << 1)) { 345 else if (state->how == LOOK || len < (state->size << 1)) {
417 /* get more output, looking for header if required */ 346 /* get more output, looking for header if required */
418 if (gz_make(state) == -1) 347 if (gz_fetch(state) == -1)
419 return -1; 348 return -1;
420 continue; /* no progress yet -- go back to memcpy() above */ 349 continue; /* no progress yet -- go back to copy above */
421 /* the copy above assures that we will leave with space in the 350 /* the copy above assures that we will leave with space in the
422 output buffer, allowing at least one gzungetc() to succeed */ 351 output buffer, allowing at least one gzungetc() to succeed */
423 } 352 }
424 353
425 /* large len -- read directly into user buffer */ 354 /* large len -- read directly into user buffer */
426 else if (state->how == COPY) { /* read directly */ 355 else if (state->how == COPY) { /* read directly */
427 if (gz_load(state, buf, len, &n) == -1) 356 if (gz_load(state, (unsigned char *)buf, len, &n) == -1)
428 return -1; 357 return -1;
429 } 358 }
430 359
431 /* large len -- decompress directly into user buffer */ 360 /* large len -- decompress directly into user buffer */
432 else { /* state->how == GZIP */ 361 else { /* state->how == GZIP */
433 strm->avail_out = len; 362 strm->avail_out = len;
434 strm->next_out = buf; 363 strm->next_out = (unsigned char *)buf;
435 if (gz_decomp(state) == -1) 364 if (gz_decomp(state) == -1)
436 return -1; 365 return -1;
437 n = state->have; 366 n = state->x.have;
438 state->have = 0; 367 state->x.have = 0;
439 } 368 }
440 369
441 /* update progress */ 370 /* update progress */
442 len -= n; 371 len -= n;
443 buf = (char *)buf + n; 372 buf = (char *)buf + n;
444 got += n; 373 got += n;
445 state->pos += n; 374 state->x.pos += n;
446 } while (len); 375 } while (len);
447 376
448 /* return number of bytes read into user buffer (will fit in int) */ 377 /* return number of bytes read into user buffer (will fit in int) */
449 return (int)got; 378 return (int)got;
450 } 379 }
451 380
452 /* -- see zlib.h -- */ 381 /* -- see zlib.h -- */
382 #ifdef Z_PREFIX_SET
383 # undef z_gzgetc
384 #else
385 # undef gzgetc
386 # ifdef MOZZCONF_H
387 # define gzgetc MOZ_Z_gzgetc
388 # endif
389 #endif
390
453 int ZEXPORT gzgetc(file) 391 int ZEXPORT gzgetc(file)
454 gzFile file; 392 gzFile file;
455 { 393 {
456 int ret; 394 int ret;
457 unsigned char buf[1]; 395 unsigned char buf[1];
458 gz_statep state; 396 gz_statep state;
459 397
460 /* get internal structure */ 398 /* get internal structure */
461 if (file == NULL) 399 if (file == NULL)
462 return -1; 400 return -1;
463 state = (gz_statep)file; 401 state = (gz_statep)file;
464 402
465 /* check that we're reading and that there's no error */ 403 /* check that we're reading and that there's no (serious) error */
466 if (state->mode != GZ_READ || state->err != Z_OK) 404 if (state->mode != GZ_READ ||
405 (state->err != Z_OK && state->err != Z_BUF_ERROR))
467 return -1; 406 return -1;
468 407
469 /* try output buffer (no need to check for skip request) */ 408 /* try output buffer (no need to check for skip request) */
470 if (state->have) { 409 if (state->x.have) {
471 state->have--; 410 state->x.have--;
472 state->pos++; 411 state->x.pos++;
473 return *(state->next)++; 412 return *(state->x.next)++;
474 } 413 }
475 414
476 /* nothing there -- try gzread() */ 415 /* nothing there -- try gzread() */
477 ret = gzread(file, buf, 1); 416 ret = gzread(file, buf, 1);
478 return ret < 1 ? -1 : buf[0]; 417 return ret < 1 ? -1 : buf[0];
479 } 418 }
480 419
420 int ZEXPORT gzgetc_(file)
421 gzFile file;
422 {
423 return gzgetc(file);
424 }
425
481 /* -- see zlib.h -- */ 426 /* -- see zlib.h -- */
482 int ZEXPORT gzungetc(c, file) 427 int ZEXPORT gzungetc(c, file)
483 int c; 428 int c;
484 gzFile file; 429 gzFile file;
485 { 430 {
486 gz_statep state; 431 gz_statep state;
487 432
488 /* get internal structure */ 433 /* get internal structure */
489 if (file == NULL) 434 if (file == NULL)
490 return -1; 435 return -1;
491 state = (gz_statep)file; 436 state = (gz_statep)file;
492 437
493 /* check that we're reading and that there's no error */ 438 /* check that we're reading and that there's no (serious) error */
494 if (state->mode != GZ_READ || state->err != Z_OK) 439 if (state->mode != GZ_READ ||
440 (state->err != Z_OK && state->err != Z_BUF_ERROR))
495 return -1; 441 return -1;
496 442
497 /* process a skip request */ 443 /* process a skip request */
498 if (state->seek) { 444 if (state->seek) {
499 state->seek = 0; 445 state->seek = 0;
500 if (gz_skip(state, state->skip) == -1) 446 if (gz_skip(state, state->skip) == -1)
501 return -1; 447 return -1;
502 } 448 }
503 449
504 /* can't push EOF */ 450 /* can't push EOF */
505 if (c < 0) 451 if (c < 0)
506 return -1; 452 return -1;
507 453
508 /* if output buffer empty, put byte at end (allows more pushing) */ 454 /* if output buffer empty, put byte at end (allows more pushing) */
509 if (state->have == 0) { 455 if (state->x.have == 0) {
510 state->have = 1; 456 state->x.have = 1;
511 state->next = state->out + (state->size << 1) - 1; 457 state->x.next = state->out + (state->size << 1) - 1;
512 state->next[0] = c; 458 state->x.next[0] = c;
513 state->pos--; 459 state->x.pos--;
460 state->past = 0;
514 return c; 461 return c;
515 } 462 }
516 463
517 /* if no room, give up (must have already done a gzungetc()) */ 464 /* if no room, give up (must have already done a gzungetc()) */
518 if (state->have == (state->size << 1)) { 465 if (state->x.have == (state->size << 1)) {
519 gz_error(state, Z_BUF_ERROR, "out of room to push characters"); 466 gz_error(state, Z_DATA_ERROR, "out of room to push characters");
520 return -1; 467 return -1;
521 } 468 }
522 469
523 /* slide output data if needed and insert byte before existing data */ 470 /* slide output data if needed and insert byte before existing data */
524 if (state->next == state->out) { 471 if (state->x.next == state->out) {
525 unsigned char *src = state->out + state->have; 472 unsigned char *src = state->out + state->x.have;
526 unsigned char *dest = state->out + (state->size << 1); 473 unsigned char *dest = state->out + (state->size << 1);
527 while (src > state->out) 474 while (src > state->out)
528 *--dest = *--src; 475 *--dest = *--src;
529 state->next = dest; 476 state->x.next = dest;
530 } 477 }
531 state->have++; 478 state->x.have++;
532 state->next--; 479 state->x.next--;
533 state->next[0] = c; 480 state->x.next[0] = c;
534 state->pos--; 481 state->x.pos--;
482 state->past = 0;
535 return c; 483 return c;
536 } 484 }
537 485
538 /* -- see zlib.h -- */ 486 /* -- see zlib.h -- */
539 char * ZEXPORT gzgets(file, buf, len) 487 char * ZEXPORT gzgets(file, buf, len)
540 gzFile file; 488 gzFile file;
541 char *buf; 489 char *buf;
542 int len; 490 int len;
543 { 491 {
544 unsigned left, n; 492 unsigned left, n;
545 char *str; 493 char *str;
546 unsigned char *eol; 494 unsigned char *eol;
547 gz_statep state; 495 gz_statep state;
548 496
549 /* check parameters and get internal structure */ 497 /* check parameters and get internal structure */
550 if (file == NULL || buf == NULL || len < 1) 498 if (file == NULL || buf == NULL || len < 1)
551 return NULL; 499 return NULL;
552 state = (gz_statep)file; 500 state = (gz_statep)file;
553 501
554 /* check that we're reading and that there's no error */ 502 /* check that we're reading and that there's no (serious) error */
555 if (state->mode != GZ_READ || state->err != Z_OK) 503 if (state->mode != GZ_READ ||
504 (state->err != Z_OK && state->err != Z_BUF_ERROR))
556 return NULL; 505 return NULL;
557 506
558 /* process a skip request */ 507 /* process a skip request */
559 if (state->seek) { 508 if (state->seek) {
560 state->seek = 0; 509 state->seek = 0;
561 if (gz_skip(state, state->skip) == -1) 510 if (gz_skip(state, state->skip) == -1)
562 return NULL; 511 return NULL;
563 } 512 }
564 513
565 /* copy output bytes up to new line or len - 1, whichever comes first -- 514 /* copy output bytes up to new line or len - 1, whichever comes first --
566 append a terminating zero to the string (we don't check for a zero in 515 append a terminating zero to the string (we don't check for a zero in
567 the contents, let the user worry about that) */ 516 the contents, let the user worry about that) */
568 str = buf; 517 str = buf;
569 left = (unsigned)len - 1; 518 left = (unsigned)len - 1;
570 if (left) do { 519 if (left) do {
571 /* assure that something is in the output buffer */ 520 /* assure that something is in the output buffer */
572 if (state->have == 0) { 521 if (state->x.have == 0 && gz_fetch(state) == -1)
573 if (gz_make(state) == -1) 522 return NULL; /* error */
574 return NULL; /* error */ 523 if (state->x.have == 0) { /* end of file */
575 if (state->have == 0) { /* end of file */ 524 state->past = 1; /* read past end */
576 if (buf == str) /* got bupkus */ 525 break; /* return what we have */
577 return NULL;
578 break; /* got something -- return it */
579 }
580 } 526 }
581 527
582 /* look for end-of-line in current output buffer */ 528 /* look for end-of-line in current output buffer */
583 n = state->have > left ? left : state->have; 529 n = state->x.have > left ? left : state->x.have;
584 eol = memchr(state->next, '\n', n); 530 eol = (unsigned char *)memchr(state->x.next, '\n', n);
585 if (eol != NULL) 531 if (eol != NULL)
586 n = (unsigned)(eol - state->next) + 1; 532 n = (unsigned)(eol - state->x.next) + 1;
587 533
588 /* copy through end-of-line, or remainder if not found */ 534 /* copy through end-of-line, or remainder if not found */
589 memcpy(buf, state->next, n); 535 memcpy(buf, state->x.next, n);
590 state->have -= n; 536 state->x.have -= n;
591 state->next += n; 537 state->x.next += n;
592 state->pos += n; 538 state->x.pos += n;
593 left -= n; 539 left -= n;
594 buf += n; 540 buf += n;
595 } while (left && eol == NULL); 541 } while (left && eol == NULL);
596 542
597 /* found end-of-line or out of space -- terminate string and return it */ 543 /* return terminated string, or if nothing, end of file */
544 if (buf == str)
545 return NULL;
598 buf[0] = 0; 546 buf[0] = 0;
599 return str; 547 return str;
600 } 548 }
601 549
602 /* -- see zlib.h -- */ 550 /* -- see zlib.h -- */
603 int ZEXPORT gzdirect(file) 551 int ZEXPORT gzdirect(file)
604 gzFile file; 552 gzFile file;
605 { 553 {
606 gz_statep state; 554 gz_statep state;
607 555
608 /* get internal structure */ 556 /* get internal structure */
609 if (file == NULL) 557 if (file == NULL)
610 return 0; 558 return 0;
611 state = (gz_statep)file; 559 state = (gz_statep)file;
612 560
613 /* check that we're reading */
614 if (state->mode != GZ_READ)
615 return 0;
616
617 /* if the state is not known, but we can find out, then do so (this is 561 /* if the state is not known, but we can find out, then do so (this is
618 mainly for right after a gzopen() or gzdopen()) */ 562 mainly for right after a gzopen() or gzdopen()) */
619 if (state->how == LOOK && state->have == 0) 563 if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
620 (void)gz_head(state); 564 (void)gz_look(state);
621 565
622 /* return 1 if reading direct, 0 if decompressing a gzip stream */ 566 /* return 1 if transparent, 0 if processing a gzip stream */
623 return state->direct; 567 return state->direct;
624 } 568 }
625 569
626 /* -- see zlib.h -- */ 570 /* -- see zlib.h -- */
627 int ZEXPORT gzclose_r(file) 571 int ZEXPORT gzclose_r(file)
628 gzFile file; 572 gzFile file;
629 { 573 {
630 int ret; 574 int ret, err;
631 gz_statep state; 575 gz_statep state;
632 576
633 /* get internal structure */ 577 /* get internal structure */
634 if (file == NULL) 578 if (file == NULL)
635 return Z_STREAM_ERROR; 579 return Z_STREAM_ERROR;
636 state = (gz_statep)file; 580 state = (gz_statep)file;
637 581
638 /* check that we're reading */ 582 /* check that we're reading */
639 if (state->mode != GZ_READ) 583 if (state->mode != GZ_READ)
640 return Z_STREAM_ERROR; 584 return Z_STREAM_ERROR;
641 585
642 /* free memory and close file */ 586 /* free memory and close file */
643 if (state->size) { 587 if (state->size) {
644 inflateEnd(&(state->strm)); 588 inflateEnd(&(state->strm));
645 free(state->out); 589 free(state->out);
646 free(state->in); 590 free(state->in);
647 } 591 }
592 err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
648 gz_error(state, Z_OK, NULL); 593 gz_error(state, Z_OK, NULL);
649 free(state->path); 594 free(state->path);
650 ret = close(state->fd); 595 ret = close(state->fd);
651 free(state); 596 free(state);
652 return ret ? Z_ERRNO : Z_OK; 597 return ret ? Z_ERRNO : err;
653 } 598 }
OLDNEW
« no previous file with comments | « third_party/zlib/gzlib.c ('k') | third_party/zlib/gzwrite.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698