Fix vfs::ztream to support 8.6 core zlib
authorPat Thoyts <patthoyts@users.sourceforge.net>
Mon, 22 Dec 2008 01:19:34 +0000 (01:19 +0000)
committerPat Thoyts <patthoyts@users.sourceforge.net>
Mon, 22 Dec 2008 01:19:34 +0000 (01:19 +0000)
ChangeLog
library/mk4vfs.tcl
library/vfslib.tcl

index 634d09726f589b334b406fcf1cea79e1811d8a84..3bbf1c437393716477a7e0bb9f17c70bc6472f72 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-12-22  Pat Thoyts  <patthoyts@users.sourceforge.net>
+
+       * library/mk4vfs.tcl: Fix vfs::ztream to support 8.6 core zlib
+       * library/vfslib.tcl:
+
 2008-12-12  Pat Thoyts  <patthoyts@users.sourceforge.net>
 
        * library/zipvfs.tcl: Cleaned up the zip stream read function to
index 8e7bbcfbf690404d62e141c854a2604116d7734c..0ac16dba71490682db323e506e4f65bf569f1ede 100644 (file)
@@ -168,7 +168,6 @@ namespace eval vfs::mk4 {
                if { $sb(csize) != $sb(size) } {
                    if {$::mk4vfs::zstreamed} {
                      set fd [mk::channel $sb(ino) contents r]
-                     fconfigure $fd -translation binary
                      set fd [vfs::zstream decompress $fd $sb(csize) $sb(size)]
                    } else {
                      set fd [vfs::memchan]
index 63408037956b5651db1aa301d30209f201bcf0cb..64f293921975f2e0803f367a6e0985c5d82da55e 100644 (file)
@@ -132,13 +132,33 @@ if {[info command rechan] != "" || ![catch {load "" rechan}]} {
     }
 
     variable ::vfs::zseq 0     ;# used to generate temp zstream cmd names
-    proc vfs::zstream {mode ifd clen ilen} {
-       set cname _zstream_[incr ::vfs::zseq]
-       zlib s$mode $cname
-       set cmd [list ::vfs::zstream_handler $cname $ifd $clen $ilen s$mode]
-       set fd [rechan $cmd 2]
-       set ::vfs::_zstream_pos($fd) 0
-       return $fd
+
+    # vfs::zstream --
+    #  wrapper to manage a stacked zlib channel. If we have the core
+    #  zlib implementation then make use of that. Otherwise we can use
+    #  rechan and the tclkit zlib package to do the same thing.
+    #
+    #    mode - compress or decompress
+    #    ifd  - input channel (should be binary)
+    #    clen - size of compressed data in bytes
+    #    ilen - size of decompressed data in bytes
+    # Result:
+    #  A stacked channel then handles compression for us.
+    #
+    if {[package vsatisfies [package provide Tcl] 8.6]} {
+        proc vfs::zstream {mode ifd clen ilen} {
+            return [zlib push $mode $ifd]
+        }
+    } else {
+        proc vfs::zstream {mode ifd clen ilen} {
+            set cname _zstream_[incr ::vfs::zseq]
+            zlib s$mode $cname
+            fconfigure $fd -translation binary
+            set cmd [list ::vfs::zstream_handler $cname $ifd $clen $ilen s$mode]
+            set fd [rechan $cmd 2]
+            set ::vfs::_zstream_pos($fd) 0
+            return $fd
+        }
     }
 }