summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2012-04-29 07:18:30 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2012-04-29 07:18:30 (GMT)
commit6dc349d4991d4514c4419c39e9918cf4c7998cfd (patch)
treee286556de6a20c057d0577d78b88e5ffb4ee0197
parentf8900a54702510fa7e6068221cba71c5f8920f01 (diff)
downloadtcl-6dc349d4991d4514c4419c39e9918cf4c7998cfd.zip
tcl-6dc349d4991d4514c4419c39e9918cf4c7998cfd.tar.gz
tcl-6dc349d4991d4514c4419c39e9918cf4c7998cfd.tar.bz2
Differentiate what options may be set by format type.
-rw-r--r--generic/tclZlib.c26
-rw-r--r--tests/zlib.test20
2 files changed, 41 insertions, 5 deletions
diff --git a/generic/tclZlib.c b/generic/tclZlib.c
index 51d6beb..a1b8afc 100644
--- a/generic/tclZlib.c
+++ b/generic/tclZlib.c
@@ -83,6 +83,9 @@ typedef struct {
* for compression on output, or
* TCL_ZLIB_STREAM_INFLATE for decompression
* on input. */
+ int format; /* What format of data is going on the wire.
+ * Needed so that the correct [fconfigure]
+ * options can be enabled. */
z_stream inStream; /* Structure used by zlib for decompression of
* input. */
z_stream outStream; /* Structure used by zlib for compression of
@@ -1985,7 +1988,6 @@ ZlibStreamSubcmd(
{ NULL, NULL }
};
const OptDescriptor gzipOpts[] = {
- { "-dictionary", &compDictObj },
{ "-header", &gzipHeaderObj },
{ "-level", &levelObj },
{ NULL, NULL }
@@ -2038,7 +2040,7 @@ ZlibStreamSubcmd(
format = TCL_ZLIB_FORMAT_GZIP;
break;
case FMT_GUNZIP:
- desc = expansionOpts;
+ desc = expansionOpts; // FIXME - get header, not set compDict
mode = TCL_ZLIB_STREAM_INFLATE;
format = TCL_ZLIB_FORMAT_GZIP;
break;
@@ -2258,6 +2260,12 @@ ZlibPushSubcmd(
Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", NULL);
return TCL_ERROR;
}
+ if (format == TCL_ZLIB_FORMAT_GZIP) {
+ Tcl_AppendResult(interp, "a compression dictionary may not "
+ "be set in the gzip format", NULL);
+ Tcl_SetErrorCode(interp, "TCL", "ZIP", "BADOPT", NULL);
+ return TCL_ERROR;
+ }
compDictObj = objv[i];
break;
}
@@ -2748,9 +2756,11 @@ ZlibTransformSetOption( /* not used */
Tcl_DriverSetOptionProc *setOptionProc =
Tcl_ChannelSetOptionProc(Tcl_GetChannelType(cd->parent));
static const char *chanOptions = "dictionary flush";
+ static const char *gzipChanOptions = "flush";
int haveFlushOpt = (cd->mode == TCL_ZLIB_STREAM_DEFLATE);
- if (optionName && strcmp(optionName, "-dictionary") == 0) {
+ if (optionName && (strcmp(optionName, "-dictionary") == 0)
+ && (cd->format != TCL_ZLIB_FORMAT_GZIP)) {
Tcl_Obj *compDictObj;
TclNewStringObj(compDictObj, value, strlen(value));
@@ -2809,7 +2819,11 @@ ZlibTransformSetOption( /* not used */
}
if (setOptionProc == NULL) {
- return Tcl_BadChannelOption(interp, optionName, chanOptions);
+ if (cd->format == TCL_ZLIB_FORMAT_GZIP) {
+ return Tcl_BadChannelOption(interp, optionName, gzipChanOptions);
+ } else {
+ return Tcl_BadChannelOption(interp, optionName, chanOptions);
+ }
}
return setOptionProc(Tcl_GetChannelInstanceData(cd->parent), interp,
@@ -2854,7 +2868,8 @@ ZlibTransformGetOption(
}
}
- if (optionName == NULL || strcmp(optionName, "-dictionary") == 0) {
+ if ((cd->format != TCL_ZLIB_FORMAT_GZIP) &&
+ (optionName == NULL || strcmp(optionName, "-dictionary") == 0)) {
/*
* Embedded NUL bytes are ok; they'll be C080-encoded.
*/
@@ -3051,6 +3066,7 @@ ZlibStackChannelTransform(
memset(cd, 0, sizeof(ZlibChannelData));
cd->mode = mode;
+ cd->format = format;
if (format == TCL_ZLIB_FORMAT_GZIP || format == TCL_ZLIB_FORMAT_AUTO) {
if (mode == TCL_ZLIB_STREAM_DEFLATE) {
diff --git a/tests/zlib.test b/tests/zlib.test
index 3aaca29..017243b 100644
--- a/tests/zlib.test
+++ b/tests/zlib.test
@@ -168,6 +168,26 @@ test zlib-8.4 {transformation and flushing: Bug 3517696} -setup {
catch {close $fd}
removeFile $file
} -result {}
+test zlib-8.5 {transformation and fconfigure} -setup {
+ set file [makeFile {} test.z]
+ set fd [open $file wb]
+} -constraints zlib -body {
+ list [fconfigure $fd] [zlib push compress $fd; fconfigure $fd] \
+ [chan pop $fd; fconfigure $fd]
+} -cleanup {
+ catch {close $fd}
+ removeFile $file
+} -result {{-blocking 1 -buffering full -buffersize 4096 -encoding binary -eofchar {} -translation lf} {-blocking 1 -buffering full -buffersize 4096 -encoding binary -eofchar {} -translation lf -checksum 1 -dictionary {}} {-blocking 1 -buffering full -buffersize 4096 -encoding binary -eofchar {} -translation lf}}
+test zlib-8.6 {transformation and fconfigure} -setup {
+ set file [makeFile {} test.gz]
+ set fd [open $file wb]
+} -constraints zlib -body {
+ list [fconfigure $fd] [zlib push gzip $fd; fconfigure $fd] \
+ [chan pop $fd; fconfigure $fd]
+} -cleanup {
+ catch {close $fd}
+ removeFile $file
+} -result {{-blocking 1 -buffering full -buffersize 4096 -encoding binary -eofchar {} -translation lf} {-blocking 1 -buffering full -buffersize 4096 -encoding binary -eofchar {} -translation lf -checksum 0} {-blocking 1 -buffering full -buffersize 4096 -encoding binary -eofchar {} -translation lf}}
test zlib-9.1 "check fcopy with push" -constraints zlib -setup {
set sfile [makeFile {} testsrc.gz]