home *** CD-ROM | disk | FTP | other *** search
/ PC World 1998 October / PCWorld_1998-10_cd.bin / software / prehled / komix / DATA.Z / corbagen.tcl < prev    next >
Text File  |  1997-12-01  |  6KB  |  219 lines

  1. #---------------------------------------------------------------------------
  2. #
  3. # Copyright (c) 1997 by Cayenne Software, Inc.
  4. #
  5. # This software is furnished under a license and may be used only in
  6. # accordance with the terms of such license and with the inclusion of
  7. # the above copyright notice. This software or any other copies thereof
  8. # may not be provided or otherwise made available to any other person.
  9. # No title to and ownership of the software is hereby transferred.
  10. #
  11. # The information in this software is subject to change without notice
  12. # and should not be construed as a commitment by Cayenne Software, Inc.
  13. #
  14. #---------------------------------------------------------------------------
  15. #
  16. #       File            : corbagen.tcl
  17. #       Author          : 
  18. #       Original date   : November 1997
  19. #       Description     : Classes for generating CORBA IDL code
  20. #
  21. #---------------------------------------------------------------------------
  22.  
  23. #---------------------------------------------------------------------------
  24. #      File:           @(#)idfilehand.tcl    /main/titanic/1
  25. #---------------------------------------------------------------------------
  26.  
  27. # Start user added include file section
  28. # End user added include file section
  29.  
  30. require "filehandle.tcl"
  31.  
  32. Class IDFileHandler : {FileHandler} {
  33.     constructor
  34.     method destructor
  35.     method getSpecialFiles
  36.     method getFileTypes
  37.     attribute fileType
  38. }
  39.  
  40. constructor IDFileHandler {class this} {
  41.     set this [FileHandler::constructor $class $this]
  42.     # Start constructor user section
  43.     $this fileType "idl"
  44.     # End constructor user section
  45.     return $this
  46. }
  47.  
  48. method IDFileHandler::destructor {this} {
  49.     # Start destructor user section
  50.     # End destructor user section
  51.     $this FileHandler::destructor
  52. }
  53.  
  54. method IDFileHandler::getSpecialFiles {this} {
  55.     return [List new]
  56. }
  57.  
  58. method IDFileHandler::getFileTypes {this} {
  59.     set list [List new]
  60.     $list append [$this fileType]
  61.     return $list
  62. }
  63.  
  64. # Do not delete this line -- regeneration end marker
  65.  
  66. #---------------------------------------------------------------------------
  67. #      File:           @(#)idgenerato.tcl    /main/titanic/5
  68. #---------------------------------------------------------------------------
  69.  
  70. # Start user added include file section
  71. # End user added include file section
  72.  
  73. require "generator.tcl"
  74.  
  75. Class IDGenerator : {Generator} {
  76.     constructor
  77.     method destructor
  78.     method generate
  79.     method check
  80.     method writeFile
  81.     attribute fileHandler
  82. }
  83.  
  84. constructor IDGenerator {class this} {
  85.     set this [Generator::constructor $class $this]
  86.     # Start constructor user section
  87.     $this fileHandler [IDFileHandler new]
  88.     # End constructor user section
  89.     return $this
  90. }
  91.  
  92. method IDGenerator::destructor {this} {
  93.     # Start destructor user section
  94.     # End destructor user section
  95.     $this Generator::destructor
  96. }
  97.  
  98. method IDGenerator::generate {this classList} {
  99.     set sectMgr [IDGDataMgr::getMgr]
  100.     set systemName [getCurrentSystemName]
  101.  
  102.     set sect [$sectMgr getSect fileHeader]
  103.     expandHeaderIntoSection $systemName.idl corba $sect
  104.     $sect append "#ifndef ${systemName}_IDL_\n#define ${systemName}_IDL_\n\n"
  105.  
  106.     [$sectMgr getSect fileTrailer] append "\n#endif /* ${systemName}_IDL_ */\n"
  107.  
  108.     if {$systemName != ""} {
  109.     [$sectMgr getSect header] append "module $systemName \{\n"
  110.     [$sectMgr getSect trailer] append "\};\n"
  111.     } else {
  112.     [$sectMgr sectNameSet] foreach sect {
  113.         [$sectMgr getSect $sect] indent -
  114.     }
  115.     }
  116.  
  117.     set classess {}
  118.     $classList foreach class {
  119.     if {[$class getPropertyValue external_source] != ""} {
  120.         set includes [split [$class getPropertyValue external_source] ","]
  121.         foreach incl $includes {
  122.         $sectMgr addInclude "<[string trim $incl]>" 0
  123.         }
  124.         continue
  125.     }
  126.     if {[$class isExternal]} {
  127.         set system [$class definingSystem]
  128.         if {$system == ""} {
  129.         m4_error $E_NOT_DEFINED [$class getName]
  130.         continue
  131.         }
  132.         $sectMgr addInclude $system
  133.         continue
  134.     }
  135.     if {[$class getName] == ""} {
  136.         m4_error $E_NO_NAME Class
  137.         continue
  138.     }
  139.     lappend classess [$class getName]
  140.         
  141.     $class generate
  142.     }
  143.  
  144.     regexp ".(.)." [location h g] dummy sep
  145.     set sect [$sectMgr getSect includes]
  146.     [$sectMgr includeSet] foreach incl {
  147.     set hasGuard [expr {![regexp "^<" $incl]}]
  148.     if {$hasGuard} {
  149.         $sect append "#ifndef [lindex [split $incl $sep] 1]_IDL_\n"
  150.     }
  151.     $sect append "#include $incl\n"
  152.     if {$hasGuard} {
  153.         $sect append "#endif\n"
  154.     }
  155.     }
  156.     $sect append "\n"
  157.  
  158.     set sect [$sectMgr getSect forwardDecl]
  159.     [$sectMgr forwardSet] foreach forw {
  160.     $sect append "interface $forw;\n"
  161.     }
  162.     $sect append "\n"
  163.  
  164.     if {$classess != {}} {
  165.     $this writeFile $classess ${systemName}.idl
  166.     }
  167.  
  168.     $sectMgr delMgr
  169.     return [Dictionary new]
  170. }
  171.  
  172. method IDGenerator::check {this classList} {
  173.     # we check by setting 'checkOnly' on and then generate as usual
  174.     #
  175.     [IDGDataMgr::getMgr] checkOnly 1
  176.     $classList foreach class {
  177.     $class generate
  178.     }
  179. }
  180.  
  181. method IDGenerator::writeFile {this classList name} {
  182.     puts stdout ""
  183.  
  184.     if {[M4CheckManager::getErrorCount] != 0} {
  185.     puts stderr "Not saving $name because of previous errors."
  186.     return 0
  187.     }
  188.  
  189.     set cmpSect [TextSection new]
  190.     set idlMgr [IDGDataMgr::getMgr]
  191.     [$idlMgr sectNameSet] foreach sect {
  192.     $cmpSect appendSect [$idlMgr getSect $sect]
  193.     }
  194.  
  195.     if {[section_equals_file $cmpSect $name]} {
  196.     puts stderr "$name has not changed: file not written"
  197.     return 0
  198.     }
  199.  
  200.     puts stdout "Generating $name"
  201.     if {[catch {set fd [fstorage::open $name w]} reason]} {
  202.     puts stderr $reason
  203.     m4_error $E_FILE_OPEN_WRITE $name
  204.     return 0
  205.     }
  206.  
  207.     if {[catch {fstorage::set_imp_from $name $classList} reason]} {
  208.     puts stderr $reason
  209.     }
  210.  
  211.     $cmpSect write $fd
  212.     fstorage::close $fd
  213.     
  214.     return 1
  215. }
  216.  
  217. # Do not delete this line -- regeneration end marker
  218.  
  219.