changes for tip#72
authorVince Darley <vincentdarley@sourceforge.net>
Mon, 18 Feb 2002 13:01:37 +0000 (13:01 +0000)
committerVince Darley <vincentdarley@sourceforge.net>
Mon, 18 Feb 2002 13:01:37 +0000 (13:01 +0000)
ChangeLog
generic/vfs.c
library/ftpvfs.tcl
library/mk4vfs.tcl

index 87e05c16ecfe1409061ab483728926492bfc1fd6..61b81819d77b13dd6d473a77ed6e4e470a256321 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        * examples/simpleExamples.tcl: a demo
        * doc/vfslib.n: some documentation on the 'library' code.
        
+2002-02-17  Vince Darley <vincentdarley@sourceforge.net>
+       * generic/vfs.c: updated for TIP#72 application to cvs head.
+       The 'file stat' implementation now deals with files of size
+       greater than a 32 bit representation.
+
 2001-10-29  Vince Darley <vincentdarley@sourceforge.net>
         * win/makefile.vc: installation is better.
        * library/vfsUrl.tcl: improved urltype mounting.  The following
index 070669df18b029fb2eae2d7aaa8226df5bb498e0..b9ea6e5aa8533e4b15cdd33b25e5a8425eb9b7b5 100644 (file)
@@ -6,6 +6,9 @@
  *     virtual file system support, and therefore allows 
  *     vfs's to be implemented in Tcl.
  *     
+ *     Some of this file could be used as a basis for a hard-coded
+ *     vfs implemented in C (e.g. a zipvfs).
+ *     
  *     The code is thread-safe.  Although under normal use only
  *     one interpreter will be used to add/remove mounts and volumes,
  *     it does cope with multiple interpreters in multiple threads.
@@ -921,7 +924,7 @@ VfsFilesystemSeparator(Tcl_Obj* pathObjPtr) {
 static int
 VfsStat(pathPtr, bufPtr)
     Tcl_Obj *pathPtr;          /* Path of file to stat (in current CP). */
-    struct stat *bufPtr;       /* Filled with results of stat call. */
+    Tcl_StatBuf *bufPtr;       /* Filled with results of stat call. */
 {
     Tcl_Obj *mountCmd = NULL;
     Tcl_SavedResult savedResult;
@@ -1001,8 +1004,8 @@ VfsStat(pathPtr, bufPtr)
                    }
                    bufPtr->st_gid = (short)v;
                } else if (!strcmp(fieldName,"size")) {
-                   long v;
-                   if (Tcl_GetLongFromObj(interp, val, &v) != TCL_OK) {
+                   Tcl_WideInt v;
+                   if (Tcl_GetWideIntFromObj(interp, val, &v) != TCL_OK) {
                        returnVal = TCL_ERROR;
                        break;
                    }
index 67faec7fc52aa0bf0581b65627adb8578b64ae61..6a20495a3b514ac79fedb39bb30b9095862af8ef 100644 (file)
@@ -199,23 +199,42 @@ proc vfs::ftp::_parseListLine {line} {
 
 proc vfs::ftp::matchindirectory {fd path actualpath pattern type} {
     ::vfs::log "matchindirectory $path $pattern $type"
-    set ftpList [ftp::List $fd $path]
-    ::vfs::log "ftpList: $ftpList"
     set res [list]
-
-    foreach p $ftpList {
-       foreach {name perms} [_parseListLine $p] {}
-       if {[::vfs::matchDirectories $type]} {
+    if {![string length $pattern]} {
+       # matching a single file
+       set ftpInfo [_findFtpInfo $fd $path]
+       if {$ftpInfo != ""} {
+           # Now check if types match
+           set perms [lindex $ftpInfo 0]
            if {[string index $perms 0] == "d"} {
-               lappend res "$actualpath$name"
+               if {[::vfs::matchDirectories $type]} {
+                   lappend res $actualpath
+               }
+           } else {
+               if {[::vfs::matchFiles $type]} {
+                   lappend res $actualpath
+               }
            }
        }
-       if {[::vfs::matchFiles $type]} {
-           if {[string index $perms 0] != "d"} {
-               lappend res "$actualpath$name"
+    } else {
+       # matching all files in the given directory
+       set ftpList [ftp::List $fd $path]
+       ::vfs::log "ftpList: $ftpList"
+
+       foreach p $ftpList {
+           foreach {name perms} [_parseListLine $p] {}
+           if {[::vfs::matchDirectories $type]} {
+               if {[string index $perms 0] == "d"} {
+                   lappend res "$actualpath$name"
+               }
+           }
+           if {[::vfs::matchFiles $type]} {
+               if {[string index $perms 0] != "d"} {
+                   lappend res "$actualpath$name"
+               }
            }
+           
        }
-       
     }
  
     return $res
index 70092f963b91568f81cdc4eb02f4ec1ff8e6d4a6..32a18e923e7c8017e3f053387b4ae9de72ae000e 100644 (file)
@@ -146,9 +146,14 @@ proc vfs::mk4::utime {db path actime modtime} {
 
 proc vfs::mk4::matchindirectory {db path actualpath pattern type} {
     #::vfs::log [list matchindirectory $path $actualpath $pattern $type]
-    set res [::mk4vfs::getdir $db $path $pattern]
-    #::vfs::log "got $res"
     set newres [list]
+    if {![string length $pattern]} {
+       # check single file
+       set res [list $path]
+    } else {
+       set res [::mk4vfs::getdir $db $path $pattern]
+    }
+    #::vfs::log "got $res"
     foreach p [::vfs::matchCorrectTypes $type $res $actualpath] {
        lappend newres "$actualpath$p"
     }