aboutsummaryrefslogtreecommitdiff
path: root/contrib/bluegnu2.0.3/lib/Types.itcl
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bluegnu2.0.3/lib/Types.itcl')
-rw-r--r--contrib/bluegnu2.0.3/lib/Types.itcl216
1 files changed, 216 insertions, 0 deletions
diff --git a/contrib/bluegnu2.0.3/lib/Types.itcl b/contrib/bluegnu2.0.3/lib/Types.itcl
new file mode 100644
index 0000000..e2ef2b4
--- /dev/null
+++ b/contrib/bluegnu2.0.3/lib/Types.itcl
@@ -0,0 +1,216 @@
+# -*-Tcl-*-
+#
+# This [incr Tcl] library script contains type definitions
+#
+#
+# Type super class
+#
+
+if {[string length [info commands debug]] == 0} {
+ proc debug {args} {}
+}
+
+class Type {
+ variable _value
+ variable _valueSaved
+ variable _voidPtr
+ variable _bVoid
+ protected variable _currentNamespace
+ protected variable _lProc
+ protected variable _upLevel
+
+ constructor args {
+ debug {======= Constructor: [info class] $this $args} 3
+ # Go up in the inheritance tree
+ debug { Go up inheritance tree} 4
+ set level 1
+ if {[string compare [info class] ::Type] != 0} {
+ debug { level set to >1<} 5
+ while {[string compare [info class] \
+ [uplevel $level {namespace current}]] != 0} {
+ debug {>[info class]< != >[uplevel $level\
+ {namespace current}]<} 5
+ incr level
+ debug { level incrmented to >$level<} 5
+ }
+ debug {>[info class]< == >[uplevel $level\
+ {namespace current}]<} 5
+ incr level
+ regsub {^::} [uplevel $level {namespace current}] "" currentNamespace
+ } else {
+ regsub {^::} [uplevel {namespace current}] "" currentNamespace
+ }
+ set upLevel [expr [info level] - $level]
+ set lProc [info level $upLevel]
+ debug { Called from level: >$upLevel<} 4
+ debug { Called from : >$lProc<} 4
+ debug { Current namespace: >$currentNamespace<} 4
+ #catch {puts " [uplevel "info body [lindex $lProc 0]"]"}
+ set _bVoid 0
+ set _voidPtr 0
+ if {[llength $args] > 0} {
+ set _value [lindex $args 0]
+ } else {
+ set _value ""
+ }
+ if {$upLevel == 0} {
+ debug {Called from global} 4
+ set $this $_value
+ debug {this variable: [set $this]} 4
+ trace variable $this rwu traceType
+ } elseif {[string length $currentNamespace] && \
+ [string length $lProc]} {
+ debug {Called from procedure in namespace} 4
+ debug { this: >$this<} 4
+ debug {set $this >$_value<}
+ catch {
+ uplevel #$upLevel set [namespace tail $this] \"$_value\"
+ uplevel #$upLevel trace variable [namespace tail $this] \
+ rwu traceType
+ } szErrMsg; debug { szErrMsg: >$szErrMsg<} 4
+ } elseif {[string length $currentNamespace]} {
+ debug {Called from namespace} 4
+ debug {set $this >$_value<}
+ catch {
+ namespace eval ${currentNamespace} "set $this \"$_value\"\n\
+ trace variable $this rwu traceType"
+ } szErrMsg
+ debug { TRACE set} 4
+ debug { szErrMsg: >$szErrMsg<} 4
+ } else {
+ debug {Called from procedure} 4
+ set var [namespace tail $this]
+ uplevel "set $var $_value"
+ debug {this variable: [uplevel "set $var"]} 4
+ uplevel "trace variable $var rwu traceType"
+ }
+ }
+
+ destructor {
+ debug {======= destructor $this} 3
+ set calledFrom [lindex [split [info level [expr [info level] - 1]]] 0]
+ debug { calledFrom: >$calledFrom<} 4
+ debug { >[info level [expr [info level] - 1]]<} 4
+ # just return when called from traceType
+ if {[string compare $calledFrom "traceType"] != 0} {
+ set var [namespace tail $this]
+ debug { var: >$var<} 4
+ debug { >[join [trace vinfo $var]]<} 4
+ debug { >[uplevel [join [trace vinfo $var]]]<} 4
+ debug { >[join [uplevel "trace vinfo $var"]]<} 4
+ catch {
+ debug {eval uplevel \"trace vdelete $var [join [uplevel "trace vinfo $var"]]\"} 4
+ eval uplevel "trace vdelete $var [join [uplevel "trace vinfo $var"]]"
+ uplevel unset $var
+ } szErrMsg; debug { #### szErrMsg: >$szErrMsg<} 4
+ }
+ }
+
+ public method value {args} {
+ if {[llength $args] > 0} {
+ set _value [lindex $args 0]
+ }
+ return $_value
+ }
+
+ public method setNull {{ptr 0}} {
+ set _voidPtr $ptr
+ set _bVoid 1
+ }
+
+ public method unsetNull {} {
+ set _bVoid 0
+ }
+
+ public method isNull {} {
+ return $_bVoid
+ }
+
+ public method getNull {} {
+ return $_voidPtr
+ }
+}
+
+proc traceType {name1 name2 ops} {
+ debug {======= traceType >$name1< >$name2< >$ops<} 3
+ upvar $name1 var
+ set upLevel [expr [info level] - 1]
+ set lProc [info level $upLevel]
+ regsub {^::} [uplevel {namespace current}] "" currentNamespace
+ debug { Called from level: >$upLevel<} 4
+ debug { level namespace : >[uplevel #$upLevel namespace current]<} 4
+ debug { Called from : >$lProc<} 4
+ debug { Current namespace: >$currentNamespace<} 4
+ if {$upLevel == 0} {
+ debug {Called from global} 4
+ switch $ops {
+ r {
+ set var [uplevel $name1 value]
+ }
+ w {
+ if [catch {$name1 value [set var]}] {
+ uplevel "$name1 value [set var]"
+ }
+ }
+ u {
+ uplevel delete object $name1
+ }
+ }
+ } elseif {[string length $currentNamespace] && \
+ [string length $lProc]} {
+ debug {Called from procedure in namespace} 4
+ set var [uplevel ::itcl::find objects $name1]
+ debug { $name1 ->$var< = ><} 4
+ switch $ops {
+ r {
+ uplevel set $name1 [uplevel $var value]
+ }
+ w {
+ if [catch {uplevel $var value [uplevel set $name1]} szErrMsg] {
+ debug {####### Error: $szErrMsg} 4
+
+ }
+ }
+ u {
+ uplevel delete object $name1
+ }
+ }
+ } elseif {[string length $currentNamespace]} {
+ debug {Called from namespace} 4
+ set var [uplevel "namespace which -variable $name1"]
+ debug { $name1 ->$var< = ><} 4
+ switch $ops {
+ r {
+ set $var [$var value]
+ }
+ w {
+ if [catch {$var value [set $var]} szErrMsg] {
+ debug {####### Error: $szErrMsg} 4
+
+ }
+ }
+ u {
+ debug {Deleting >$name1<} 4
+ debug { [namespace current]} 4
+ catch {delete object $name1}
+ debug { DONE!} 4
+ }
+ }
+ } else {
+ debug {Called from procedure} 4
+ switch $ops {
+ r {
+ set $name1 [$name1 value]
+ }
+ w {
+ if [catch {$name1 value [uplevel set $name1]}] {
+ uplevel "$name1 value [set $name1]"
+ }
+ }
+ u {
+ delete object $name1
+ }
+ }
+ }
+}
+