123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- # -*- mode: TCL; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
- #
- # $Id: fs.tcl,v 1.6 2004/03/28 02:44:57 hobbs Exp $
- #
- # File system routines to handle some file system variations
- # and how that interoperates with the Tix widgets (mainly HList).
- #
- # Copyright (c) 2004 ActiveState
- ##
- ## Cross-platform
- ##
- proc tixFSSep {} { return "/" }
- proc tixFSNormalize {path} {
- # possibly use tixFSTilde ?
- return [file normalize $path]
- }
- proc tixFSVolumes {} {
- return [file volumes]
- }
- proc tixFSAncestors {path} {
- return [file split [file normalize $path]]
- }
- # how a filename should be displayed
- proc tixFSDisplayFileName {path} {
- if {$path eq [file dirname $path]} {
- return $path
- } else {
- return [file tail $path]
- }
- }
- # dir: Make a listing of this directory
- # showSubDir: Want to list the subdirectories?
- # showFile: Want to list the non-directory files in this directory?
- # showPrevDir: Want to list ".." as well?
- # showHidden: Want to list the hidden files?
- #
- # return value: a list of files and/or subdirectories
- #
- proc tixFSListDir {dir showSubDir showFile showPrevDir \
- showHidden {pattern ""}} {
- if {$pattern eq ""} { set pattern [list "*"] }
- if {$::tcl_platform(platform) eq "unix"
- && $showHidden && $pattern eq "*"} { lappend pattern ".*" }
- if {[catch {eval [list glob -nocomplain -directory $dir] \
- $pattern} files]} {
- # The user has entered an invalid or unreadable directory
- # %% todo: prompt error, go back to last succeed directory
- return ""
- }
- set list ""
- foreach f [lsort -dictionary $files] {
- set tail [file tail $f]
- # file tail handles this automatically
- #if {[string match ~* $tail]} { set tail ./$tail }
- if {[file isdirectory $f]} {
- if {$tail eq "."} { continue }
- if {$showSubDir} {
- if {$tail eq ".." && !$showPrevDir} { continue }
- lappend list $tail
- }
- } else {
- if {$showFile} { lappend list $tail }
- }
- }
- return $list
- }
- # in: internal name
- # out: native name
- proc tixFSNativeNorm {path} {
- return [tixFSNative [tixFSNormalize $path]]
- }
- # tixFSDisplayName --
- #
- # Returns the name of a normalized path which is usually displayed by
- # the OS
- #
- proc tixFSDisplayName {path} {
- return [tixFSNative $path]
- }
- proc tixFSTilde {path} {
- # verify that paths with leading ~ are files or real users
- if {[string match ~* $path]} {
- # The following will report if the user doesn't exist
- if {![file isdirectory $path]} {
- set path ./$path
- } else {
- set path [file normalize $path]
- }
- }
- return $path
- }
- proc tixFSJoin {dir sub} {
- return [tixFSNative [file join $dir [tixFSTilde $sub]]]
- }
- proc tixFSNative {path} {
- return $path
- }
- if {$::tcl_platform(platform) eq "windows"} {
- ##
- ## WINDOWS
- ##
- # is an absoulte path only if it starts with a baclskash
- # or starts with "<drive letter>:"
- #
- # in: nativeName
- #
- proc tixFSIsAbsPath {nativeName} {
- set ptype [file pathtype $nativename]
- return [expr {$ptype eq "absolute" || $ptype eq "volumerelative"}]
- }
- # tixFSIsValid --
- #
- # Checks whether a native pathname contains invalid characters.
- #
- proc tixFSIsValid {path} {
- #if {$::tcl_platform(platform) eq "windows"} {set bad "\\/:*?\"<>|\0"}
- return 1
- }
- proc tixFSExternal {path} {
- # Avoid normalization on root adding unwanted volumerelative pwd
- if {[string match -nocase {[A-Z]:} $path]} {
- return $path/
- }
- return [file normalize $path]
- }
- proc tixFSInternal {path} {
- # Only need to watch for ^[A-Z]:/$, but this does the trick
- return [string trimright [file normalize $path] /]
- }
- } else {
- ##
- ## UNIX
- ##
- proc tixFSIsAbsPath {path} {
- return [string match {[~/]*} $path]
- }
- # tixFSIsValid --
- #
- # Checks whether a native pathname contains invalid characters.
- #
- proc tixFSIsValid {path} { return 1 }
- proc tixFSExternal {path} { return $path }
- proc tixFSInternal {path} { return $path }
- }
|