home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / filehandle.tcl < prev    next >
Text File  |  1997-10-15  |  7KB  |  270 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)filehandle.tcl    /main/titanic/14
  6. #      Author:         <generated>
  7. #      Description:
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)filehandle.tcl    /main/titanic/14   15 Oct 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. require cgen_msg.tcl
  13. require machdep.tcl
  14. # End user added include file section
  15.  
  16.  
  17. # This class does generic file handling.
  18.  
  19. Class FileHandler : {GCObject} {
  20.     constructor
  21.     method destructor
  22.     method getFileName
  23.     method getFsFileName
  24.     method openFile
  25.     method closeFile
  26.     method checkUniqueFiles
  27.     method writeSectionToFile
  28.     method writeSectionToNamedFile
  29.     method sourceTclFiles
  30.     method sourceAllTclFilesInSystem
  31.     method importExternal
  32.     method findExternalSource
  33.     method setImpFrom
  34. }
  35.  
  36. constructor FileHandler {class this} {
  37.     set this [GCObject::constructor $class $this]
  38.     # Start constructor user section
  39.     # End constructor user section
  40.     return $this
  41. }
  42.  
  43. method FileHandler::destructor {this} {
  44.     # Start destructor user section
  45.     # End destructor user section
  46. }
  47.  
  48.  
  49. # Returns file name for <class> with type <fileType>.
  50. #
  51. method FileHandler::getFileName {this class fileType} {
  52.     return "[$class getName].$fileType"
  53. }
  54.  
  55. method FileHandler::getFsFileName {this class fileType} {
  56.     set fileV ""
  57.     return [fstorage::getFilePath fileV "[$class getName].$fileType"]
  58. }
  59.  
  60.  
  61. # Opens the file for <class> with type <fileType>.
  62. # Returns a file descriptor on success,
  63. # the empty string on failure.
  64. #
  65. method FileHandler::openFile {this class fileType} {
  66.     set fileName [$this getFileName $class $fileType]
  67.     if [catch {set fd [fstorage::open $fileName r]}] {
  68.     return ""
  69.     }
  70.     return $fd
  71. }
  72.  
  73.  
  74. # Closes a file that was opened
  75. # by openFile
  76. #
  77. method FileHandler::closeFile {this fileDesc} {
  78.     if {$fileDesc != ""} {
  79.         fstorage::close $fileDesc
  80.     }
  81. }
  82.  
  83.  
  84. # Checks whether the classes in the current
  85. # system map to different file names.
  86. # If this is not the case, an error is generated.
  87. #
  88. method FileHandler::checkUniqueFiles {this classList} {
  89.     set fileToClass [Dictionary new]
  90.     # any type will do for this check
  91.     set aType [[$this getFileTypes] index 0]
  92.  
  93.     $classList foreach class {
  94.     set fileName [$this getFileName $class $aType]
  95.     if [$class isExternal] {
  96.         continue
  97.     }
  98.     set className [$class getName]
  99.     if [$fileToClass exists $fileName] {
  100.         error "Classes '$className' and '[$fileToClass set $fileName]' map to the same file name" "" ERR_UNIQUE_FILENAME
  101.     }
  102.     $fileToClass set $fileName $className
  103.     }
  104. }
  105.  
  106.  
  107. # Writes the contents of <section> to the file for
  108. # <class> with type <fileType>. If
  109. # - the file existed already and has not changed or 
  110. # - the section is empty or
  111. # - there were checking errors
  112. # the file is not written and 0 is returned.
  113. # Otherwise 1 is returned.
  114. #
  115. method FileHandler::writeSectionToFile {this section class fileType} {
  116.     if { [$section contents] == "" } {
  117.     return 0
  118.     }
  119.  
  120.     set fileName [$this getFileName $class $fileType]
  121.  
  122.     if [section_equals_file $section $fileName] {
  123.     puts "$fileName has not changed: file not written"
  124.     return 0
  125.     }
  126.  
  127.     if {[M4CheckManager::getErrorCount] > 0} {
  128.     puts "Not saving $fileName because of previous errors"
  129.     return 0
  130.     }
  131.  
  132.     puts stdout "Creating $fileName"
  133.  
  134.     if [catch {set fd [fstorage::open $fileName w]} reason] {
  135.     puts stderr $reason
  136.     m4_error $E_FILE_OPEN_WRITE $fileName
  137.     return 0
  138.     } else {
  139.     if [catch {$this setImpFrom $fileName $class} reason] {
  140.         puts stderr $reason
  141.     }
  142.  
  143.     $section write $fd
  144.     fstorage::close $fd
  145.     }
  146.  
  147.     return 1
  148. }
  149.  
  150.  
  151. # Writes the contents of <section> to file <fileName>.
  152. #
  153. method FileHandler::writeSectionToNamedFile {this section fileName} {
  154.     if [catch {set fd [fstorage::open $fileName w]} reason] {
  155.         puts stderr $reason
  156.         m4_error $E_FILE_OPEN_WRITE $fileName
  157.         return
  158.     }
  159.  
  160.     $section write $fd
  161.     fstorage::close $fd
  162. }
  163.  
  164.  
  165. # Sources tcl files in the current system,
  166. # and tcl files in the system called Tcl if it exists.
  167. #
  168. method FileHandler::sourceTclFiles {this} {
  169.     set cc [ClientContext::global]
  170.  
  171.     set thisSystem [$cc levelNameAt System]
  172.  
  173.     if {![catch {fstorage::goto_system Tcl.system} msg]} {
  174.     $this sourceAllTclFilesInSystem
  175.     fstorage::goto_system $thisSystem
  176.     }
  177.  
  178.     $this sourceAllTclFilesInSystem
  179. }
  180.  
  181.  
  182. # Sources all Tcl files in the current system.
  183. #
  184. method FileHandler::sourceAllTclFilesInSystem {this} {
  185.     foreach fileName [fstorage::dir tcl] {
  186.     regsub -all {\\} [fstorage::get_uenv_path $fileName absolute] \
  187.         {\\\\} absoluteFileName
  188.  
  189.     if [catch {uplevel #0 source $absoluteFileName}] {
  190.         m4_error $E_USER_TCL $absoluteFileName
  191.         puts stderr $errorInfo
  192.     }
  193.     }
  194. }
  195.  
  196.  
  197. # Imports the external file <fileName> in the file
  198. # for <class> with type <fileType>,
  199. # if <fileName> exists. This is a legacy 
  200. # method with old code.
  201. #
  202. method FileHandler::importExternal {this class fileType fileName} {
  203.     set class_name [$class getName]
  204.     set newFileName [$this getFileName $class $fileType]
  205.  
  206.     set absoluteFileName [$this findExternalSource $fileName]
  207.     if {$absoluteFileName == ""} {
  208.     puts -nonewline "ERROR: class '[$class getName]': "
  209.     puts "external class source file '$fileName' not found"
  210.     return
  211.     }
  212.  
  213.     puts "Importing external '$absoluteFileName'"
  214.     puts "Creating $newFileName"
  215.  
  216.     if [catch {set out [fstorage::open $newFileName w]} reason] {
  217.     puts stderr $reason
  218.     m4_error $E_FILE_OPEN_WRITE $newFileName
  219.     return
  220.     }
  221.  
  222.     if [catch {fstorage::set_imp_from $newFileName [$class getName]} reason] {
  223.     puts stderr $reason
  224.     }
  225.  
  226.     set max 8092
  227.     set in [open $absoluteFileName r]
  228.     while {[set result [read $in $max]] != ""} {
  229.     puts -nonewline $out $result
  230.     }
  231.  
  232.     close $in
  233.     fstorage::close $out
  234. }
  235.  
  236.  
  237. # Looks for a file named <fileName> in the current
  238. # directory and in all directories specified by the
  239. # global exsrc_searchpath. Returns the absolute
  240. # file name on success, the empty string otherwise.
  241. #
  242. method FileHandler::findExternalSource {this fileName} {
  243.     if [file exists $fileName] {
  244.     return $fileName
  245.     }
  246.  
  247.     global exsrc_searchpath
  248.     if {! [info exists exsrc_searchpath]} {
  249.     return ""
  250.     }
  251.  
  252.     set sep [searchPathSeparator]
  253.     foreach dirName [split $exsrc_searchpath $sep] {
  254.     set absoluteFileName [path_name concat $dirName $fileName]
  255.     if [file exists $absoluteFileName] {
  256.         return $absoluteFileName
  257.     }
  258.     }
  259.     return ""
  260. }
  261.  
  262. method FileHandler::setImpFrom {this fileName class} {
  263.     return [fstorage::set_imp_from $fileName [$class getName]]
  264. }
  265.  
  266. # Do not delete this line -- regeneration end marker
  267.  
  268.