|
|
b8876f |
From 0c7af9e6cb05b436505e7f46ef49dcb6f791f30a Mon Sep 17 00:00:00 2001
|
|
|
b8876f |
From: =?UTF-8?q?Petr=20P=C3=ADsa=C5=99?= <ppisar@redhat.com>
|
|
|
b8876f |
Date: Fri, 17 Feb 2017 11:00:21 +0100
|
|
|
b8876f |
Subject: [PATCH] Adapt to zlib-1.2.11
|
|
|
b8876f |
MIME-Version: 1.0
|
|
|
b8876f |
Content-Type: text/plain; charset=UTF-8
|
|
|
b8876f |
Content-Transfer-Encoding: 8bit
|
|
|
b8876f |
|
|
|
b8876f |
This is a fix ported from Compress-Raw-Zlib-2.072 that restores
|
|
|
b8876f |
compatibility with zlib-1.2.11.
|
|
|
b8876f |
|
|
|
b8876f |
CPAN RT#119762
|
|
|
b8876f |
|
|
|
b8876f |
Signed-off-by: Petr Písař <ppisar@redhat.com>
|
|
|
b8876f |
---
|
|
|
b8876f |
Zlib.xs | 220 +++++++++++++++++++++++++++++++++++++++++++++++--------------
|
|
|
b8876f |
t/02zlib.t | 11 +++-
|
|
|
b8876f |
2 files changed, 178 insertions(+), 53 deletions(-)
|
|
|
b8876f |
|
|
|
b8876f |
diff --git a/Zlib.xs b/Zlib.xs
|
|
|
b8876f |
index d379f78..83d1423 100644
|
|
|
b8876f |
--- a/Zlib.xs
|
|
|
b8876f |
+++ b/Zlib.xs
|
|
|
b8876f |
@@ -74,6 +74,10 @@
|
|
|
b8876f |
# define AT_LEAST_ZLIB_1_2_8
|
|
|
b8876f |
#endif
|
|
|
b8876f |
|
|
|
b8876f |
+#if defined(ZLIB_VERNUM) && ZLIB_VERNUM >= 0x1290
|
|
|
b8876f |
+# define AT_LEAST_ZLIB_1_2_9
|
|
|
b8876f |
+#endif
|
|
|
b8876f |
+
|
|
|
b8876f |
#ifdef USE_PPPORT_H
|
|
|
b8876f |
# define NEED_sv_2pvbyte
|
|
|
b8876f |
# define NEED_sv_2pv_nolen
|
|
|
b8876f |
@@ -134,12 +138,13 @@ typedef struct di_stream {
|
|
|
b8876f |
uLong dict_adler ;
|
|
|
b8876f |
int last_error ;
|
|
|
b8876f |
bool zip_mode ;
|
|
|
b8876f |
-#define SETP_BYTE
|
|
|
b8876f |
+/* #define SETP_BYTE */
|
|
|
b8876f |
#ifdef SETP_BYTE
|
|
|
b8876f |
+ /* SETP_BYTE only works with zlib up to 1.2.8 */
|
|
|
b8876f |
bool deflateParams_out_valid ;
|
|
|
b8876f |
Bytef deflateParams_out_byte;
|
|
|
b8876f |
#else
|
|
|
b8876f |
-#define deflateParams_BUFFER_SIZE 0x4000
|
|
|
b8876f |
+#define deflateParams_BUFFER_SIZE 0x40000
|
|
|
b8876f |
uLong deflateParams_out_length;
|
|
|
b8876f |
Bytef* deflateParams_out_buffer;
|
|
|
b8876f |
#endif
|
|
|
b8876f |
@@ -636,6 +641,103 @@ char * string ;
|
|
|
b8876f |
return sv ;
|
|
|
b8876f |
}
|
|
|
b8876f |
|
|
|
b8876f |
+#if 0
|
|
|
b8876f |
+int
|
|
|
b8876f |
+flushToBuffer(di_stream* s, int flush)
|
|
|
b8876f |
+{
|
|
|
b8876f |
+ dTHX;
|
|
|
b8876f |
+ int ret ;
|
|
|
b8876f |
+ z_stream * strm = &s->stream;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ Bytef* output = s->deflateParams_out_buffer ;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ strm->next_in = NULL;
|
|
|
b8876f |
+ strm->avail_in = 0;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ uLong total_output = 0;
|
|
|
b8876f |
+ uLong have = 0;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ do
|
|
|
b8876f |
+ {
|
|
|
b8876f |
+ if (output)
|
|
|
b8876f |
+ output = (unsigned char *)saferealloc(output, total_output + s->bufsize);
|
|
|
b8876f |
+ else
|
|
|
b8876f |
+ output = (unsigned char *)safemalloc(s->bufsize);
|
|
|
b8876f |
+
|
|
|
b8876f |
+ strm->next_out = output + total_output;
|
|
|
b8876f |
+ strm->avail_out = s->bufsize;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ ret = deflate(strm, flush); /* no bad return value */
|
|
|
b8876f |
+ //assert(ret != Z_STREAM_ERROR); /* state not clobbered */
|
|
|
b8876f |
+ if(ret == Z_STREAM_ERROR)
|
|
|
b8876f |
+ {
|
|
|
b8876f |
+ safefree(output);
|
|
|
b8876f |
+ return ret;
|
|
|
b8876f |
+ }
|
|
|
b8876f |
+ have = s->bufsize - strm->avail_out;
|
|
|
b8876f |
+ total_output += have;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ //fprintf(stderr, "FLUSH %s %d, return %d\n", flush_flags[flush], have, ret);
|
|
|
b8876f |
+
|
|
|
b8876f |
+ } while (strm->avail_out == 0);
|
|
|
b8876f |
+
|
|
|
b8876f |
+ s->deflateParams_out_buffer = output;
|
|
|
b8876f |
+ s->deflateParams_out_length = total_output;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ return Z_OK;
|
|
|
b8876f |
+}
|
|
|
b8876f |
+#endif
|
|
|
b8876f |
+
|
|
|
b8876f |
+#ifndef SETP_BYTE
|
|
|
b8876f |
+int
|
|
|
b8876f |
+flushParams(di_stream* s)
|
|
|
b8876f |
+{
|
|
|
b8876f |
+ dTHX;
|
|
|
b8876f |
+ int ret ;
|
|
|
b8876f |
+ z_stream * strm = &s->stream;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ strm->next_in = NULL;
|
|
|
b8876f |
+ strm->avail_in = 0;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ Bytef* output = s->deflateParams_out_buffer ;
|
|
|
b8876f |
+ uLong total_output = s->deflateParams_out_length;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ uLong have = 0;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ do
|
|
|
b8876f |
+ {
|
|
|
b8876f |
+ if (output)
|
|
|
b8876f |
+ output = (unsigned char *)saferealloc(output, total_output + s->bufsize);
|
|
|
b8876f |
+ else
|
|
|
b8876f |
+ output = (unsigned char *)safemalloc(s->bufsize);
|
|
|
b8876f |
+
|
|
|
b8876f |
+ strm->next_out = output + total_output;
|
|
|
b8876f |
+ strm->avail_out = s->bufsize;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ ret = deflateParams(&(s->stream), s->Level, s->Strategy);
|
|
|
b8876f |
+ /* fprintf(stderr, "deflateParams %d %s %lu\n", ret,
|
|
|
b8876f |
+ GetErrorString(ret), s->bufsize - strm->avail_out); */
|
|
|
b8876f |
+
|
|
|
b8876f |
+ if (ret == Z_STREAM_ERROR)
|
|
|
b8876f |
+ break;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ have = s->bufsize - strm->avail_out;
|
|
|
b8876f |
+ total_output += have;
|
|
|
b8876f |
+
|
|
|
b8876f |
+
|
|
|
b8876f |
+ } while (ret == Z_BUF_ERROR) ;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ if(ret == Z_STREAM_ERROR)
|
|
|
b8876f |
+ safefree(output);
|
|
|
b8876f |
+ else
|
|
|
b8876f |
+ {
|
|
|
b8876f |
+ s->deflateParams_out_buffer = output;
|
|
|
b8876f |
+ s->deflateParams_out_length = total_output;
|
|
|
b8876f |
+ }
|
|
|
b8876f |
+
|
|
|
b8876f |
+ return ret;
|
|
|
b8876f |
+}
|
|
|
b8876f |
+#endif /* ! SETP_BYTE */
|
|
|
b8876f |
|
|
|
b8876f |
#include "constants.h"
|
|
|
b8876f |
|
|
|
b8876f |
@@ -991,20 +1093,24 @@ deflate (s, buf, output)
|
|
|
b8876f |
/* Check for saved output from deflateParams */
|
|
|
b8876f |
if (s->deflateParams_out_length) {
|
|
|
b8876f |
uLong plen = s->deflateParams_out_length ;
|
|
|
b8876f |
- /* printf("Copy %d bytes saved data\n", plen);*/
|
|
|
b8876f |
+ /* printf("Copy %lu bytes saved data\n", plen); */
|
|
|
b8876f |
if (s->stream.avail_out < plen) {
|
|
|
b8876f |
- /*printf("GROW from %d to %d\n", s->stream.avail_out,
|
|
|
b8876f |
- SvLEN(output) + plen - s->stream.avail_out); */
|
|
|
b8876f |
- Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ;
|
|
|
b8876f |
+ /* printf("GROW from %d to %lu\n", s->stream.avail_out,
|
|
|
b8876f |
+ SvLEN(output) + plen - s->stream.avail_out); */
|
|
|
b8876f |
+ s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ;
|
|
|
b8876f |
+ s->stream.next_out += cur_length;
|
|
|
b8876f |
}
|
|
|
b8876f |
|
|
|
b8876f |
- Copy(s->stream.next_out, s->deflateParams_out_buffer, plen, Bytef) ;
|
|
|
b8876f |
- cur_length = cur_length + plen;
|
|
|
b8876f |
+ Copy(s->deflateParams_out_buffer, s->stream.next_out, plen, Bytef) ;
|
|
|
b8876f |
+ cur_length += plen;
|
|
|
b8876f |
SvCUR_set(output, cur_length);
|
|
|
b8876f |
- s->stream.next_out += plen ;
|
|
|
b8876f |
- s->stream.avail_out = SvLEN(output) - cur_length ;
|
|
|
b8876f |
- increment = s->stream.avail_out;
|
|
|
b8876f |
- s->deflateParams_out_length = 0;
|
|
|
b8876f |
+ s->stream.next_out += plen ;
|
|
|
b8876f |
+ s->stream.avail_out = SvLEN(output) - cur_length ;
|
|
|
b8876f |
+ increment = s->stream.avail_out;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ s->deflateParams_out_length = 0;
|
|
|
b8876f |
+ Safefree(s->deflateParams_out_buffer);
|
|
|
b8876f |
+ s->deflateParams_out_buffer = NULL;
|
|
|
b8876f |
}
|
|
|
b8876f |
#endif
|
|
|
b8876f |
RETVAL = Z_OK ;
|
|
|
b8876f |
@@ -1027,6 +1133,12 @@ deflate (s, buf, output)
|
|
|
b8876f |
}
|
|
|
b8876f |
|
|
|
b8876f |
RETVAL = deflate(&(s->stream), Z_NO_FLUSH);
|
|
|
b8876f |
+ if (RETVAL != Z_STREAM_ERROR) {
|
|
|
b8876f |
+ int done = increment - s->stream.avail_out ;
|
|
|
b8876f |
+ /* printf("std DEFLATEr returned %d '%s' avail in %d, out %d wrote %d\n", RETVAL,
|
|
|
b8876f |
+ GetErrorString(RETVAL), s->stream.avail_in,
|
|
|
b8876f |
+s->stream.avail_out, done); */
|
|
|
b8876f |
+ }
|
|
|
b8876f |
|
|
|
b8876f |
if (trace) {
|
|
|
b8876f |
printf("DEFLATE returned %d %s, avail in %d, out %d\n", RETVAL,
|
|
|
b8876f |
@@ -1080,7 +1192,6 @@ flush(s, output, f=Z_FINISH)
|
|
|
b8876f |
CODE:
|
|
|
b8876f |
bufinc = s->bufsize;
|
|
|
b8876f |
|
|
|
b8876f |
- s->stream.avail_in = 0; /* should be zero already anyway */
|
|
|
b8876f |
|
|
|
b8876f |
/* retrieve the output buffer */
|
|
|
b8876f |
output = deRef_l(output, "flush") ;
|
|
|
b8876f |
@@ -1108,20 +1219,24 @@ flush(s, output, f=Z_FINISH)
|
|
|
b8876f |
/* Check for saved output from deflateParams */
|
|
|
b8876f |
if (s->deflateParams_out_length) {
|
|
|
b8876f |
uLong plen = s->deflateParams_out_length ;
|
|
|
b8876f |
- /* printf("Copy %d bytes saved data\n", plen); */
|
|
|
b8876f |
+ /* printf("Copy %lu bytes saved data\n", plen); */
|
|
|
b8876f |
if (s->stream.avail_out < plen) {
|
|
|
b8876f |
- /* printf("GROW from %d to %d\n", s->stream.avail_out,
|
|
|
b8876f |
+ /* printf("GROW from %d to %lu\n", s->stream.avail_out,
|
|
|
b8876f |
SvLEN(output) + plen - s->stream.avail_out); */
|
|
|
b8876f |
- Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ;
|
|
|
b8876f |
+ s->stream.next_out = (Bytef*) Sv_Grow(output, SvLEN(output) + plen - s->stream.avail_out) ;
|
|
|
b8876f |
+ s->stream.next_out += cur_length;
|
|
|
b8876f |
}
|
|
|
b8876f |
|
|
|
b8876f |
- Copy(s->stream.next_out, s->deflateParams_out_buffer, plen, Bytef) ;
|
|
|
b8876f |
- cur_length = cur_length + plen;
|
|
|
b8876f |
+ Copy(s->deflateParams_out_buffer, s->stream.next_out, plen, Bytef) ;
|
|
|
b8876f |
+ cur_length += plen;
|
|
|
b8876f |
SvCUR_set(output, cur_length);
|
|
|
b8876f |
- s->stream.next_out += plen ;
|
|
|
b8876f |
- s->stream.avail_out = SvLEN(output) - cur_length ;
|
|
|
b8876f |
- increment = s->stream.avail_out;
|
|
|
b8876f |
- s->deflateParams_out_length = 0;
|
|
|
b8876f |
+ s->stream.next_out += plen ;
|
|
|
b8876f |
+ s->stream.avail_out = SvLEN(output) - cur_length ;
|
|
|
b8876f |
+ increment = s->stream.avail_out;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ s->deflateParams_out_length = 0;
|
|
|
b8876f |
+ Safefree(s->deflateParams_out_buffer);
|
|
|
b8876f |
+ s->deflateParams_out_buffer = NULL;
|
|
|
b8876f |
}
|
|
|
b8876f |
#endif
|
|
|
b8876f |
|
|
|
b8876f |
@@ -1145,9 +1260,15 @@ flush(s, output, f=Z_FINISH)
|
|
|
b8876f |
}
|
|
|
b8876f |
|
|
|
b8876f |
RETVAL = deflate(&(s->stream), f);
|
|
|
b8876f |
+ if (RETVAL != Z_STREAM_ERROR) {
|
|
|
b8876f |
+ int done = availableout - s->stream.avail_out ;
|
|
|
b8876f |
+ /* printf("flush DEFLATEr returned %d '%s' avail in %d, out %d wrote %d\n", RETVAL,
|
|
|
b8876f |
+ GetErrorString(RETVAL), s->stream.avail_in,
|
|
|
b8876f |
+s->stream.avail_out, done); */
|
|
|
b8876f |
+ }
|
|
|
b8876f |
|
|
|
b8876f |
if (trace) {
|
|
|
b8876f |
- printf("flush DEFLATE returned %d %s, avail in %d, out %d\n", RETVAL,
|
|
|
b8876f |
+ printf("flush DEFLATE returned %d '%s', avail in %d, out %d\n", RETVAL,
|
|
|
b8876f |
GetErrorString(RETVAL), s->stream.avail_in, s->stream.avail_out);
|
|
|
b8876f |
DispStream(s, "AFTER");
|
|
|
b8876f |
}
|
|
|
b8876f |
@@ -1184,41 +1305,38 @@ _deflateParams(s, flags, level, strategy, bufsize)
|
|
|
b8876f |
int level
|
|
|
b8876f |
int strategy
|
|
|
b8876f |
uLong bufsize
|
|
|
b8876f |
+ bool changed = FALSE;
|
|
|
b8876f |
CODE:
|
|
|
b8876f |
- /* printf("_deflateParams(Flags %d Level %d Strategy %d Bufsize %d)\n", flags, level, strategy, bufsize);
|
|
|
b8876f |
- printf("Before -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize); */
|
|
|
b8876f |
- if (flags & 1)
|
|
|
b8876f |
- s->Level = level ;
|
|
|
b8876f |
- if (flags & 2)
|
|
|
b8876f |
- s->Strategy = strategy ;
|
|
|
b8876f |
- if (flags & 4) {
|
|
|
b8876f |
+ /* printf("_deflateParams(Flags %d Level %d Strategy %d Bufsize %d)\n", flags, level, strategy, bufsize);
|
|
|
b8876f |
+ printf("Before -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize); */
|
|
|
b8876f |
+ if (flags & 1 && level != s->Level) {
|
|
|
b8876f |
+ s->Level = level ;
|
|
|
b8876f |
+ changed = TRUE;
|
|
|
b8876f |
+ }
|
|
|
b8876f |
+ if (flags & 2 && strategy != s->Strategy) {
|
|
|
b8876f |
+ s->Strategy = strategy ;
|
|
|
b8876f |
+ changed = TRUE;
|
|
|
b8876f |
+ }
|
|
|
b8876f |
+ if (flags & 4)
|
|
|
b8876f |
s->bufsize = bufsize;
|
|
|
b8876f |
- }
|
|
|
b8876f |
- /* printf("After -- Level %d, Strategy %d, Bufsize %d\n", s->Level, s->Strategy, s->bufsize);*/
|
|
|
b8876f |
+ if (changed) {
|
|
|
b8876f |
#ifdef SETP_BYTE
|
|
|
b8876f |
- s->stream.avail_in = 0;
|
|
|
b8876f |
- s->stream.next_out = &(s->deflateParams_out_byte) ;
|
|
|
b8876f |
- s->stream.avail_out = 1;
|
|
|
b8876f |
- RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy);
|
|
|
b8876f |
- s->deflateParams_out_valid =
|
|
|
b8876f |
- (RETVAL == Z_OK && s->stream.avail_out == 0) ;
|
|
|
b8876f |
- /* printf("RETVAL %d, avail out %d, byte %c\n", RETVAL, s->stream.avail_out, s->deflateParams_out_byte); */
|
|
|
b8876f |
+ s->stream.avail_in = 0;
|
|
|
b8876f |
+ s->stream.next_out = &(s->deflateParams_out_byte) ;
|
|
|
b8876f |
+ s->stream.avail_out = 1;
|
|
|
b8876f |
+ RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy);
|
|
|
b8876f |
+ s->deflateParams_out_valid =
|
|
|
b8876f |
+ (RETVAL == Z_OK && s->stream.avail_out == 0) ;
|
|
|
b8876f |
#else
|
|
|
b8876f |
- /* printf("Level %d Strategy %d, Prev Len %d\n",
|
|
|
b8876f |
+ /* printf("Level %d Strategy %d, Prev Len %d\n",
|
|
|
b8876f |
s->Level, s->Strategy, s->deflateParams_out_length); */
|
|
|
b8876f |
- s->stream.avail_in = 0;
|
|
|
b8876f |
- if (s->deflateParams_out_buffer == NULL)
|
|
|
b8876f |
- s->deflateParams_out_buffer = safemalloc(deflateParams_BUFFER_SIZE);
|
|
|
b8876f |
- s->stream.next_out = s->deflateParams_out_buffer ;
|
|
|
b8876f |
- s->stream.avail_out = deflateParams_BUFFER_SIZE;
|
|
|
b8876f |
-
|
|
|
b8876f |
- RETVAL = deflateParams(&(s->stream), s->Level, s->Strategy);
|
|
|
b8876f |
- s->deflateParams_out_length = deflateParams_BUFFER_SIZE - s->stream.avail_out;
|
|
|
b8876f |
- /* printf("RETVAL %d, length out %d, avail %d\n",
|
|
|
b8876f |
- RETVAL, s->deflateParams_out_length, s->stream.avail_out ); */
|
|
|
b8876f |
+ RETVAL = flushParams(s);
|
|
|
b8876f |
#endif
|
|
|
b8876f |
+ }
|
|
|
b8876f |
+ else
|
|
|
b8876f |
+ RETVAL = Z_OK;
|
|
|
b8876f |
OUTPUT:
|
|
|
b8876f |
- RETVAL
|
|
|
b8876f |
+ RETVAL
|
|
|
b8876f |
|
|
|
b8876f |
|
|
|
b8876f |
int
|
|
|
b8876f |
diff --git a/t/02zlib.t b/t/02zlib.t
|
|
|
b8876f |
index 2c9aad6..5d024a9 100644
|
|
|
b8876f |
--- a/t/02zlib.t
|
|
|
b8876f |
+++ b/t/02zlib.t
|
|
|
b8876f |
@@ -27,7 +27,7 @@ BEGIN
|
|
|
b8876f |
$count = 232 ;
|
|
|
b8876f |
}
|
|
|
b8876f |
elsif ($] >= 5.006) {
|
|
|
b8876f |
- $count = 317 ;
|
|
|
b8876f |
+ $count = 320 ;
|
|
|
b8876f |
}
|
|
|
b8876f |
else {
|
|
|
b8876f |
$count = 275 ;
|
|
|
b8876f |
@@ -559,6 +559,13 @@ SKIP:
|
|
|
b8876f |
is $x->get_Level(), Z_BEST_SPEED;
|
|
|
b8876f |
is $x->get_Strategy(), Z_HUFFMAN_ONLY;
|
|
|
b8876f |
|
|
|
b8876f |
+ # change both Level & Strategy again without any calls to deflate
|
|
|
b8876f |
+ $status = $x->deflateParams(-Level => Z_DEFAULT_COMPRESSION, -Strategy => Z_DEFAULT_STRATEGY, -Bufsize => 1234) ;
|
|
|
b8876f |
+ cmp_ok $status, '==', Z_OK ;
|
|
|
b8876f |
+
|
|
|
b8876f |
+ is $x->get_Level(), Z_DEFAULT_COMPRESSION;
|
|
|
b8876f |
+ is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
|
|
|
b8876f |
+
|
|
|
b8876f |
$status = $x->deflate($goodbye, $Answer) ;
|
|
|
b8876f |
cmp_ok $status, '==', Z_OK ;
|
|
|
b8876f |
$input .= $goodbye;
|
|
|
b8876f |
@@ -568,7 +575,7 @@ SKIP:
|
|
|
b8876f |
cmp_ok $status, '==', Z_OK ;
|
|
|
b8876f |
|
|
|
b8876f |
is $x->get_Level(), Z_NO_COMPRESSION;
|
|
|
b8876f |
- is $x->get_Strategy(), Z_HUFFMAN_ONLY;
|
|
|
b8876f |
+ is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
|
|
|
b8876f |
|
|
|
b8876f |
$status = $x->deflate($goodbye, $Answer) ;
|
|
|
b8876f |
cmp_ok $status, '==', Z_OK ;
|
|
|
b8876f |
--
|
|
|
b8876f |
2.7.4
|
|
|
b8876f |
|