Version 0 of overloading file handling functions

Updated 2001-09-25 20:25:40

# overloading of open and close #

 # rename the "official commands
 rename open __open
 rename close __close
 # rename fconfigure __fconfigure
 # rename file __file

 # overloaded open which registers file and fid info
 # for files
 proc open { args } {
      if { [ llength $args ] == 1 } {
         set args [ lindex $args 0 ]
      }
      set fid [ eval __open $args ]
      set file [ lindex $args 0 ]
      lappend ::open_files_array(fid,$fid) $file
      lappend ::open_files_array(file,$file) $fid
      return $fid
 }

 # overloaded close which lets you close a file i.d.,
 # a socket i.d., or all the file i.d.'s associated
 # with a file name.
 proc close { args } {

      if { [ llength $args ] == 1 } {
         set args [ lindex $args 0 ]
      }   

      foreach arg $args {
         set type [ list ]

         if { [ regexp {^(sock|file)\d+$} $arg -> type ] } {
            __close $arg
         }

         if { [ catch {
            switch -exact $type {
                  file {
                       set file [ managearray $arg [ fid2file $arg ] ]
                       }
                  sock {
                       }
               default {
                       set fids [ file2fid $arg ]
                       after 10 close $fids
                       }               
            }  
         } err ] } {
            return -code error "$arg not found"
         }
      }
      if { [ info exists file ] } {
         return $file
      }
 }     

 # proc file { args } {
 # your code here!
 # }

 # proc fconfigure { args } {
 # your code here!
 # } 

 # helper functions

 # given a fid, return the filename
 proc fid2file { fid } {
      return $::open_files_array(fid,$fid)
 }

 # given a filename return all open fids
 proc file2fid { file } {
      return $::open_files_array(file,$file)
 }

 # manage the arrays
 proc managearray { fid file } {
      unset ::open_files_array(fid,$fid)
      set i [ lsearch $::open_files_array(file,$file) $fid ]
      set ::open_files_array(file,$file) \
          [ lreplace $::open_files_array(file,$file) $i $i ]
      if { ! [ llength $::open_files_array(file,$file) ] } {
            unset ::open_files_array(file,$file)
         }
      return $file
 }