home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / programy / komix / DATA.Z / methodextr.tcl < prev    next >
Text File  |  1997-03-18  |  4KB  |  149 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. #      (c)     Cayenne Software Inc.    1997
  4. #
  5. #      File:           @(#)methodextr.tcl    /main/hindenburg/3
  6. #      Author:         <generated>
  7. #      Description:    VCM integration file
  8. #---------------------------------------------------------------------------
  9. # SccsId = @(#)methodextr.tcl    /main/hindenburg/3   18 Mar 1997 Copyright 1997 Cayenne Software Inc.
  10.  
  11. # Start user added include file section
  12. # End user added include file section
  13.  
  14.  
  15. # This class can parse a OO Tcl input file,
  16. # and extract specified methods to an output file.
  17.  
  18. Class MethodExtracter : {GCObject} {
  19.     constructor
  20.     method destructor
  21.     method parseArgs
  22.     method usage
  23.     method openFiles
  24.     method closeFiles
  25.     method parse
  26.     method isSpecifiedMethodHeader
  27.     method extract
  28.  
  29.     # File descriptor for the input file.
  30.     #
  31.     attribute inputFileDesc
  32.  
  33.     # File descriptor for the output file.
  34.     #
  35.     attribute outputFileDesc
  36.  
  37.     # List of methods that must be extracted
  38.     # (specified without class name.
  39.     #
  40.     attribute methods
  41. }
  42.  
  43. constructor MethodExtracter {class this} {
  44.     set this [GCObject::constructor $class $this]
  45.     # Start constructor user section
  46.     # End constructor user section
  47.     return $this
  48. }
  49.  
  50. method MethodExtracter::destructor {this} {
  51.     # Start destructor user section
  52.     # End destructor user section
  53. }
  54.  
  55. method MethodExtracter::parseArgs {this arguments} {
  56.     set inputFile [lindex $arguments 0]
  57.     set outputFile [lindex $arguments 1]
  58.     $this openFiles $inputFile $outputFile
  59.     foreach method [lrange $arguments 2 end] {
  60.     $this methods "[$this methods] $method"
  61.     }
  62. }
  63.  
  64. method MethodExtracter::usage {this} {
  65.     puts "Usage: extract <infile> <outfile> <method> \[<method>\] \[<method>\]..."
  66. }
  67.  
  68.  
  69. # Open inputFile for reading, 
  70. # outputFile for writing and store in 
  71. # instance variables.
  72. #
  73. method MethodExtracter::openFiles {this inputFile outputFile} {
  74.     $this inputFileDesc [open $inputFile r]
  75.     if { [$this inputFileDesc] == "" } {
  76.     error "Could not open $inputFile for reading"
  77.     }
  78.  
  79.     $this outputFileDesc [open $outputFile w]
  80.     if { [$this outputFileDesc] == "" } {
  81.     error "Could not open $outputFile for writing"
  82.     }
  83. }
  84.  
  85.  
  86. # Close file descriptors.
  87. #
  88. method MethodExtracter::closeFiles {this} {
  89.     close [$this inputFileDesc]
  90.     close [$this outputFileDesc]
  91. }
  92.  
  93.  
  94. # Do the actual parsing.
  95. #
  96. method MethodExtracter::parse {this} {
  97.     # read input file, toggling inSpecifiedMethod state.
  98.     # if it is on, write output file, if it is not, don't.
  99.     # Assume that a not indented brace marks the end of a method
  100.     set inSpecifiedMethod 0
  101.     while { [gets [$this inputFileDesc] line] >= 0 } {
  102.     if [$this isSpecifiedMethodHeader $line] {
  103.         set inSpecifiedMethod 1
  104.     }
  105.     if $inSpecifiedMethod {
  106.         puts [$this outputFileDesc] $line
  107.         if [regexp {^\}} $line] {
  108.         set inSpecifiedMethod 0
  109.         puts [$this outputFileDesc] ""
  110.         }
  111.     }
  112.     }
  113. }
  114.  
  115.  
  116. # Returns whether line contains the header of one
  117. # of the methods in 'methods'.
  118. #
  119. method MethodExtracter::isSpecifiedMethodHeader {this line} {
  120.     if [regexp {^method[     ]*[^:]*::([^      ]*)} $line dummy method] {
  121.     if [regexp $method [$this methods]] {
  122.         return 1
  123.     }
  124.     }
  125.     if [regexp {^proc[     ]*[^:]*::([^     ]*)} $line dummy method] {
  126.     if [regexp $method [$this methods]] {
  127.         return 1
  128.     }
  129.     }
  130.     return 0
  131. }
  132.  
  133.  
  134. # Entry point: do the extraction.
  135. #
  136. method MethodExtracter::extract {this arguments} {
  137.     if { [llength $arguments] < 3 } {
  138.     $this usage
  139.     return
  140.     }
  141.  
  142.     $this parseArgs $arguments
  143.     $this parse
  144.     $this closeFiles
  145. }
  146.  
  147. # Do not delete this line -- regeneration end marker
  148.  
  149.