summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2012-06-06 10:34:12 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2012-06-06 10:34:12 (GMT)
commit4d5127aca4d12e8af41904d360af28fe728defc1 (patch)
treeafbb04093fafe0319e79521a038cdad18d2fbf16
parentb49f1ffb1b107a3fccc849aa2bbd378a2348e6db (diff)
downloadtcl-4d5127aca4d12e8af41904d360af28fe728defc1.zip
tcl-4d5127aca4d12e8af41904d360af28fe728defc1.tar.gz
tcl-4d5127aca4d12e8af41904d360af28fe728defc1.tar.bz2
making the -dictionary option work with streams
-rw-r--r--generic/tclZlib.c48
-rw-r--r--tests/zlib.test4
2 files changed, 40 insertions, 12 deletions
diff --git a/generic/tclZlib.c b/generic/tclZlib.c
index 22ab061..63d2aca 100644
--- a/generic/tclZlib.c
+++ b/generic/tclZlib.c
@@ -2339,7 +2339,7 @@ ZlibStreamCmd(
{
Tcl_ZlibStream zstream = cd;
int command, index, count, code, buffersize = -1, flush = -1, i;
- Tcl_Obj *obj;
+ Tcl_Obj *obj, *compDictObj = NULL;
static const char *const cmds[] = {
"add", "checksum", "close", "eof", "finalize", "flush",
"fullflush", "get", "header", "put", "reset",
@@ -2404,7 +2404,7 @@ ZlibStreamCmd(
Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", NULL);
return TCL_ERROR;
}
- if (Tcl_GetIntFromObj(interp, objv[i+1],
+ if (Tcl_GetIntFromObj(interp, objv[++i],
&buffersize) != TCL_OK) {
return TCL_ERROR;
}
@@ -2417,10 +2417,15 @@ ZlibStreamCmd(
}
break;
case ao_dictionary:
- Tcl_AppendResult(interp,
- "\"-dictionary\" option not implemented", NULL);
- Tcl_SetErrorCode(interp, "TCL", "ZIP", "BADOPT", NULL);
- return TCL_ERROR;
+ if (i == objc-2) {
+ Tcl_AppendResult(interp, "\"-dictionary\" option must be "
+ "followed by compression dictionary bytes",
+ NULL);
+ Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", NULL);
+ return TCL_ERROR;
+ }
+ compDictObj = objv[++i];
+ break;
}
if (flush == -2) {
@@ -2434,6 +2439,15 @@ ZlibStreamCmd(
flush = 0;
}
+ if (compDictObj != NULL) {
+ int len;
+
+ (void) Tcl_GetByteArrayFromObj(compDictObj, &len);
+ if (len == 0) {
+ compDictObj = NULL;
+ }
+ Tcl_ZlibStreamSetCompressionDictionary(zstream, compDictObj);
+ }
if (Tcl_ZlibStreamPut(zstream, objv[objc-1], flush) != TCL_OK) {
return TCL_ERROR;
}
@@ -2481,10 +2495,15 @@ ZlibStreamCmd(
Tcl_SetErrorCode(interp, "TCL", "ZIP", "BADOPT", NULL);
return TCL_ERROR;
case ao_dictionary:
- Tcl_AppendResult(interp,
- "\"-dictionary\" option not implemented", NULL);
- Tcl_SetErrorCode(interp, "TCL", "ZIP", "BADOPT", NULL);
- return TCL_ERROR;
+ if (i == objc-2) {
+ Tcl_AppendResult(interp, "\"-dictionary\" option must be "
+ "followed by compression dictionary bytes",
+ NULL);
+ Tcl_SetErrorCode(interp, "TCL", "ZIP", "NOVAL", NULL);
+ return TCL_ERROR;
+ }
+ compDictObj = objv[++i];
+ break;
}
if (flush == -2) {
Tcl_AppendResult(interp, "\"-flush\", \"-fullflush\" and "
@@ -2496,6 +2515,15 @@ ZlibStreamCmd(
if (flush == -1) {
flush = 0;
}
+ if (compDictObj != NULL) {
+ int len;
+
+ (void) Tcl_GetByteArrayFromObj(compDictObj, &len);
+ if (len == 0) {
+ compDictObj = NULL;
+ }
+ Tcl_ZlibStreamSetCompressionDictionary(zstream, compDictObj);
+ }
return Tcl_ZlibStreamPut(zstream, objv[objc-1], flush);
case zs_get: /* $strm get ?count? */
diff --git a/tests/zlib.test b/tests/zlib.test
index cfde1be..18b6f55 100644
--- a/tests/zlib.test
+++ b/tests/zlib.test
@@ -259,7 +259,7 @@ test zlib-8.9 {transformtion and fconfigure} -setup {
catch {close $outSide}
catch {close $inSide}
catch {$strm close}
-} -result {260 222}
+} -result {358 358}
test zlib-8.10 {transformtion and fconfigure} -setup {
lassign [chan pipe] inSide outSide
} -constraints zlib -body {
@@ -292,7 +292,7 @@ test zlib-8.11 {transformtion and fconfigure} -setup {
catch {close $outSide}
catch {close $inSide}
catch {$strm close}
-} -result {260 222}
+} -result {358 358}
test zlib-9.1 "check fcopy with push" -constraints zlib -setup {
set sfile [makeFile {} testsrc.gz]