home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 1998 October
/
PCWorld_1998-10_cd.bin
/
software
/
prehled
/
komix
/
DATA.Z
/
import.tcl
< prev
next >
Wrap
Text File
|
1997-11-28
|
7KB
|
285 lines
#---------------------------------------------------------------------------
#
# Copyright (c) 1997 by Cayenne Software, Inc.
#
# This software is furnished under a license and may be used only in
# accordance with the terms of such license and with the inclusion of
# the above copyright notice. This software or any other copies thereof
# may not be provided or otherwise made available to any other person.
# No title to and ownership of the software is hereby transferred.
#
# The information in this software is subject to change without notice
# and should not be construed as a commitment by Cadre Technologies Inc.
#
#---------------------------------------------------------------------------
#
# File : @(#)import.tcl /main/titanic/3
# Original date : January 1997
# Description : Import front end
#
#---------------------------------------------------------------------------
#
OTShRegister::codeGeneration
source [m4_path_name tcl cginit.tcl]
require caynutil.tcl
require wmt_util.tcl
require a83genmsg.tcl
require legacy.tcl
require machdep.tcl
require fstorage.tcl
require subimport.tcl
set cc [ClientContext::global]
global import_new; set import_new 0
global import_sel; set import_sel 0
global ooplClassFilter; set ooplClassFilter ""
global ooplExclClassFilter; set ooplExclClassFilter ""
#
# Boolean options understood by import.tcl.
#
# The first element of each sublist will cause the second element to be
# made "global" and set to either 0 or 1, depending on whether the first
# element was specified as an argument to 'otsh' after the "--".
#
# The third element in each sublist gives the default value for the option,
# i.e. the value it will get if the option was not specified.
#
global boolean_options
set boolean_options { {-trace tracing 0} \
{-debug debug 0} \
{-time timing 0} }
#
# See if any boolean options were specified, set the appropriate
# variables, and remove any options from argv.
#
proc parse_options {} {
global boolean_options argv
foreach opt $boolean_options {
set i [lsearch $argv [lindex $opt 0]]
set optvar [lindex $opt 1]
eval "global $optvar"
if {$i == -1} {
set optdef [lindex $opt 2]
eval "set $optvar $optdef"
} else {
set argv [lreplace $argv $i $i]
eval "set $optvar 1"
}
}
}
# Import files: handles both import-new and import-selected by
# loading the model and by "sourcing" gensql.tcl and/or gen${t_lang}.tcl
#
proc import {} {
global oomodel do_struct_file
set t_lang ada83
set do_struct_file 0
# remove sql as src_object for languages without persistent code
# generation
if ![supportPersistentCodeGen] {
regsub -all "sql" $src_objects "" new_src_objects
set src_objects $new_src_objects
}
if {![loadomt $t_lang]} {
return
}
if [lempty $tgt_objects] {
global import_new
set import_new 1
if [lempty $src_objects] {
if [supportPersistentCodeGen] {
require_with_reload gensql.tcl
}
require_with_reload gen${t_lang}.tcl
return
}
# Always generate struct file if Import New + OOPL + SQL
# generation, because struct file may have changed if new
# persistent classes are imported.
#
set do_struct_file [expr {$t_lang == "cpp" &&
[lsearch $src_objects "oopl"] != -1 &&
[lsearch $src_objects "sql"] != -1}]
set post_require_files {}
foreach imp_model $src_objects {
case $imp_model in {
{oopl} {lappend post_require_files gen${t_lang}.tcl}
{sql} {require_with_reload gensql.tcl}
}
}
foreach prf $post_require_files {
require_with_reload $prf
}
return
}
#
# Import selected: Generate the selected target files
#
global import_sel
set import_sel 1
set oopl_files ""
set sql_files ""
foreach file $tgt_objects {
set type [nt_get_type $file]
if {[lsearch [getOoplTypesToGenerateFor] $type] != -1} {
lappend oopl_files $file
continue
}
if [supportPersistentCodeGen] {
if {"$type" == "$sql_type"} {
lappend sql_files $file
continue
}
}
m4_warning $W_UNKNOWN_FILE $file
}
global tool_tgt_objs
if {![lempty $sql_files]} {
set tool_tgt_objs $sql_files
require_with_reload gensql.tcl
}
if {![lempty $oopl_files]} {
set tool_tgt_objs $oopl_files
require_with_reload gen${t_lang}.tcl
}
$oomodel delete
}
proc loadomt {t_lang} {
global oomodel
if [lempty $tgt_objects] {
set types_list [getOoplTypesToGenerateFor]
set cl_files [fstorage::dir $types_list]
global ooplExclClassFilter
set ooplExclClassFilter [get_class_list $cl_files]
} else {
global ooplClassFilter
set ooplClassFilter [get_class_list $tgt_objects]
}
set cc [ClientContext::global]
set systemNameType [$cc levelNameAt System]
set phaseNameType [$cc levelNameAt Phase]
set prevPhaseV [[$cc currentPhase] previous [$cc currentConfig]]
if [$prevPhaseV isNil] {
m4_error $E_NO_PREV_PHASE $phaseNameType
return 0
}
set prevPhase [$prevPhaseV phase]
set prevPhaseNameType [$prevPhase name].[$prevPhase type]
if {[$prevPhase type] != "ObjectDesign"} {
m4_error $E_WRONG_PREV_PHASE $prevPhaseNameType
return 0
}
if {[catch {fstorage::goto_system $systemNameType $prevPhaseNameType} reason]} {
puts stderr $reason
return 0
}
set oomodel [OOModel::createModel]
fstorage::goto_system $systemNameType $phaseNameType
if {[$oomodel error] > 0} {
##m4_error $E_LOAD_MODEL
puts stdout "Loading OOPL model failed due to previous errors"
$oomodel delete
return 0
}
return 1
}
#
# Make a list of classes out of a list of files
#
proc get_class_list {file_list} {
set result ""
foreach file $file_list {
set type [nt_get_type $file]
if {[lsearch [getOoplTypesToGenerateFor] $type] != -1} {
if [catch {set names [fstorage::get_imp_from $file]} reason] {
puts stderr $reason
set names ""
}
if {"$names" == ""} {
set nm [nt_get_name $file]
if {[lsearch [getNamesNotToGenerateFor] $nm] != -1} {
continue
}
m4_warning $W_IMPFROM_NOT_SET $file $nm
}
foreach nm $names {
if {[lsearch $result $nm] == -1} {
lappend result $nm
}
}
}
}
return $result
}
#
# Parse options and make sure argv does not contain them anymore.
#
parse_options
#
# Save src/tgt objects
#
global src_objects; set src_objects [CommandLineInterface::getSourceObjects]
global tgt_objects; set tgt_objects [CommandLineInterface::getTargetObjects]
#
# Now reimplement them
#
proc get_tgt_objs {} {
global tool_tgt_objs
return [get tool_tgt_objs]
}
#
# Just call import
#
if [catch {import} msg] {
switch $errorCode {
ERR_CPP_CONFIG {puts stderr "ERROR: $msg"}
ERR_UNIQUE_FILENAME {puts stderr "ERROR: $msg"}
default {puts stderr $errorInfo}
}
}