11local
int gz_init(gz_statep state) {
13 z_streamp strm = &(state->strm);
16 state->in = (
unsigned char *)malloc(state->want << 1);
17 if (state->in == NULL) {
18 gz_error(state, Z_MEM_ERROR,
"out of memory");
25 state->out = (
unsigned char *)malloc(state->want);
26 if (state->out == NULL) {
28 gz_error(state, Z_MEM_ERROR,
"out of memory");
33 strm->zalloc = Z_NULL;
35 strm->opaque = Z_NULL;
36 ret = deflateInit2(strm, state->level, Z_DEFLATED,
37 MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy);
41 gz_error(state, Z_MEM_ERROR,
"out of memory");
48 state->size = state->want;
52 strm->avail_out = state->size;
53 strm->next_out = state->out;
54 state->x.next = strm->next_out;
65local
int gz_comp(gz_statep state,
int flush) {
67 unsigned have, put, max = ((unsigned)-1 >> 2) + 1;
68 z_streamp strm = &(state->strm);
71 if (state->size == 0 && gz_init(state) == -1)
76 while (strm->avail_in) {
77 put = strm->avail_in > max ? max : strm->avail_in;
78 writ = write(state->fd, strm->next_in, put);
80 gz_error(state, Z_ERRNO, zstrerror());
83 strm->avail_in -= (unsigned)writ;
84 strm->next_in += writ;
92 if (strm->avail_in == 0)
103 if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
104 (flush != Z_FINISH || ret == Z_STREAM_END))) {
105 while (strm->next_out > state->x.next) {
106 put = strm->next_out - state->x.next > (int)max ? max :
107 (unsigned)(strm->next_out - state->x.next);
108 writ = write(state->fd, state->x.next, put);
110 gz_error(state, Z_ERRNO, zstrerror());
113 state->x.next += writ;
115 if (strm->avail_out == 0) {
116 strm->avail_out = state->size;
117 strm->next_out = state->out;
118 state->x.next = state->out;
123 have = strm->avail_out;
124 ret = deflate(strm, flush);
125 if (ret == Z_STREAM_ERROR) {
126 gz_error(state, Z_STREAM_ERROR,
127 "internal error: deflate stream corrupt");
130 have -= strm->avail_out;
134 if (flush == Z_FINISH)
143local
int gz_zero(gz_statep state, z_off64_t len) {
146 z_streamp strm = &(state->strm);
149 if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
155 n = GT_OFF(state->size) || (z_off64_t)state->size > len ?
156 (
unsigned)len : state->size;
158 memset(state->in, 0, n);
162 strm->next_in = state->in;
164 if (gz_comp(state, Z_NO_FLUSH) == -1)
173local z_size_t gz_write(gz_statep state, voidpc buf, z_size_t len) {
181 if (state->size == 0 && gz_init(state) == -1)
187 if (gz_zero(state, state->skip) == -1)
192 if (len < state->size) {
197 if (state->strm.avail_in == 0)
198 state->strm.next_in = state->in;
199 have = (unsigned)((state->strm.next_in + state->strm.avail_in) -
201 copy = state->size - have;
203 copy = (unsigned)len;
204 memcpy(state->in + have, buf, copy);
205 state->strm.avail_in += copy;
206 state->x.pos += copy;
207 buf = (
const char *)buf + copy;
209 if (len && gz_comp(state, Z_NO_FLUSH) == -1)
215 if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
219 state->strm.next_in = (z_const Bytef *)buf;
221 unsigned n = (unsigned)-1;
224 state->strm.avail_in = n;
226 if (gz_comp(state, Z_NO_FLUSH) == -1)
237int ZEXPORT gzwrite(gzFile file, voidpc buf,
unsigned len) {
243 state = (gz_statep)file;
246 if (state->mode != GZ_WRITE || state->err != Z_OK)
252 gz_error(state, Z_DATA_ERROR,
"requested length does not fit in int");
257 return (
int)gz_write(state, buf, len);
261z_size_t ZEXPORT gzfwrite(voidpc buf, z_size_t size, z_size_t nitems,
269 state = (gz_statep)file;
272 if (state->mode != GZ_WRITE || state->err != Z_OK)
277 if (size && len / size != nitems) {
278 gz_error(state, Z_STREAM_ERROR,
"request does not fit in a size_t");
283 return len ? gz_write(state, buf, len) / size : 0;
287int ZEXPORT gzputc(gzFile file,
int c) {
289 unsigned char buf[1];
296 state = (gz_statep)file;
297 strm = &(state->strm);
300 if (state->mode != GZ_WRITE || state->err != Z_OK)
306 if (gz_zero(state, state->skip) == -1)
313 if (strm->avail_in == 0)
314 strm->next_in = state->in;
315 have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
316 if (have < state->size) {
317 state->in[have] = (
unsigned char)c;
325 buf[0] = (
unsigned char)c;
326 if (gz_write(state, buf, 1) != 1)
332int ZEXPORT gzputs(gzFile file,
const char *s) {
339 state = (gz_statep)file;
342 if (state->mode != GZ_WRITE || state->err != Z_OK)
347 if ((
int)len < 0 || (
unsigned)len != len) {
348 gz_error(state, Z_STREAM_ERROR,
"string length does not fit in int");
351 put = gz_write(state, s, len);
352 return put < len ? -1 : (int)len;
355#if defined(STDC) || defined(Z_HAVE_STDARG_H)
359int ZEXPORTVA gzvprintf(gzFile file,
const char *format, va_list va) {
368 return Z_STREAM_ERROR;
369 state = (gz_statep)file;
370 strm = &(state->strm);
373 if (state->mode != GZ_WRITE || state->err != Z_OK)
374 return Z_STREAM_ERROR;
377 if (state->size == 0 && gz_init(state) == -1)
383 if (gz_zero(state, state->skip) == -1)
390 if (strm->avail_in == 0)
391 strm->next_in = state->in;
392 next = (
char *)(state->in + (strm->next_in - state->in) + strm->avail_in);
393 next[state->size - 1] = 0;
395# ifdef HAS_vsprintf_void
396 (void)vsprintf(next, format, va);
397 for (len = 0; len < state->size; len++)
398 if (next[len] == 0)
break;
400 len = vsprintf(next, format, va);
403# ifdef HAS_vsnprintf_void
404 (void)vsnprintf(next, state->size, format, va);
407 len = vsnprintf(next, state->size, format, va);
412 if (len == 0 || (
unsigned)len >= state->size || next[state->size - 1] != 0)
416 strm->avail_in += (unsigned)len;
418 if (strm->avail_in >= state->size) {
419 left = strm->avail_in - state->size;
420 strm->avail_in = state->size;
421 if (gz_comp(state, Z_NO_FLUSH) == -1)
423 memmove(state->in, state->in + state->size, left);
424 strm->next_in = state->in;
425 strm->avail_in = left;
430int ZEXPORTVA gzprintf(gzFile file,
const char *format, ...) {
434 va_start(va, format);
435 ret = gzvprintf(file, format, va);
443int ZEXPORTVA gzprintf(gzFile file,
const char *format,
int a1,
int a2,
int a3,
444 int a4,
int a5,
int a6,
int a7,
int a8,
int a9,
int a10,
445 int a11,
int a12,
int a13,
int a14,
int a15,
int a16,
446 int a17,
int a18,
int a19,
int a20) {
454 return Z_STREAM_ERROR;
455 state = (gz_statep)file;
456 strm = &(state->strm);
459 if (
sizeof(
int) !=
sizeof(
void *))
460 return Z_STREAM_ERROR;
463 if (state->mode != GZ_WRITE || state->err != Z_OK)
464 return Z_STREAM_ERROR;
467 if (state->size == 0 && gz_init(state) == -1)
473 if (gz_zero(state, state->skip) == -1)
480 if (strm->avail_in == 0)
481 strm->next_in = state->in;
482 next = (
char *)(strm->next_in + strm->avail_in);
483 next[state->size - 1] = 0;
485# ifdef HAS_sprintf_void
486 sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12,
487 a13, a14, a15, a16, a17, a18, a19, a20);
488 for (len = 0; len < size; len++)
492 len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
493 a12, a13, a14, a15, a16, a17, a18, a19, a20);
496# ifdef HAS_snprintf_void
497 snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9,
498 a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
501 len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8,
502 a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
507 if (len == 0 || len >= state->size || next[state->size - 1] != 0)
511 strm->avail_in += len;
513 if (strm->avail_in >= state->size) {
514 left = strm->avail_in - state->size;
515 strm->avail_in = state->size;
516 if (gz_comp(state, Z_NO_FLUSH) == -1)
518 memmove(state->in, state->in + state->size, left);
519 strm->next_in = state->in;
520 strm->avail_in = left;
528int ZEXPORT gzflush(gzFile file,
int flush) {
533 return Z_STREAM_ERROR;
534 state = (gz_statep)file;
537 if (state->mode != GZ_WRITE || state->err != Z_OK)
538 return Z_STREAM_ERROR;
541 if (flush < 0 || flush > Z_FINISH)
542 return Z_STREAM_ERROR;
547 if (gz_zero(state, state->skip) == -1)
552 (void)gz_comp(state, flush);
557int ZEXPORT gzsetparams(gzFile file,
int level,
int strategy) {
563 return Z_STREAM_ERROR;
564 state = (gz_statep)file;
565 strm = &(state->strm);
568 if (state->mode != GZ_WRITE || state->err != Z_OK || state->direct)
569 return Z_STREAM_ERROR;
572 if (level == state->level && strategy == state->strategy)
578 if (gz_zero(state, state->skip) == -1)
585 if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1)
587 deflateParams(strm, level, strategy);
589 state->level = level;
590 state->strategy = strategy;
595int ZEXPORT gzclose_w(gzFile file) {
601 return Z_STREAM_ERROR;
602 state = (gz_statep)file;
605 if (state->mode != GZ_WRITE)
606 return Z_STREAM_ERROR;
611 if (gz_zero(state, state->skip) == -1)
616 if (gz_comp(state, Z_FINISH) == -1)
619 if (!state->direct) {
620 (void)deflateEnd(&(state->strm));
625 gz_error(state, Z_OK, NULL);
627 if (close(state->fd) == -1)