assert.tcl

Go to the documentation of this file.
00001 /*  assert.tcl --*/
00002 /* */
00003 /*  The [assert] command of the package "control".*/
00004 /* */
00005 /*  RCS: @(#) $Id: assert.tcl,v 1.3 2004/01/15 06:36:12 andreas_kupries Exp $*/
00006 
00007 namespace ::control {
00008 
00009     namespace assert {
00010     namespace export EnabledAssert DisabledAssert
00011     variable CallbackCmd [list return -code error]
00012 
00013     namespace import [namespace parent]::no-op
00014     rename no-op DisabledAssert
00015 
00016     ret  EnabledAssert (type expr , type args) {
00017         variable CallbackCmd
00018 
00019         set code [catch {uplevel 1 [list expr $expr]} res]
00020         if {$code} {
00021         return -code $code $res
00022         }
00023         if {![string is boolean -strict $res]} {
00024         return -code error "invalid boolean expression: $expr"
00025         }
00026         if {$res} {return}
00027         if {[llength $args]} {
00028         set msg [join $args]
00029         } else {
00030         set msg "assertion failed: $expr"
00031         }
00032         # Might want to catch this
00033         namespace eval :: $CallbackCmd [list $msg]
00034     }
00035 
00036     ret  enabled (type args) {
00037         set n [llength $args]
00038         if {$n > 1} {
00039         return -code error "wrong # args: should be\
00040             \"[lindex [info level 0] 0] ?boolean?\""
00041         }
00042         if {$n} {
00043         set val [lindex $args 0]
00044         if {![string is boolean -strict $val]} {
00045             return -code error "invalid boolean value: $val"
00046         }
00047         if {$val} {
00048             [namespace parent]::AssertSwitch Disabled Enabled
00049         } else {
00050             [namespace parent]::AssertSwitch Enabled Disabled
00051         }
00052         } else {
00053         return [string equal [namespace origin EnabledAssert] \
00054             [namespace origin [namespace parent]::assert]]
00055         }
00056         return ""
00057     }
00058 
00059     ret  callback (type args) {
00060         set n [llength $args]
00061         if {$n > 1} {
00062         return -code error "wrong # args: should be\
00063             \"[lindex [info level 0] 0] ?command?\""
00064         }
00065         if {$n} {
00066             return [variable CallbackCmd [lindex $args 0]]
00067         }
00068         variable CallbackCmd
00069         return $CallbackCmd
00070     }
00071 
00072     }
00073 
00074     ret  AssertSwitch (type old , type new) {
00075     if {[string equal [namespace origin assert] \
00076         [namespace origin assert::${new}Assert]]} {return}
00077     rename assert ${old}Assert
00078     rename ${new}Assert assert
00079     }
00080 
00081     namespace import assert::DisabledAssert assert::EnabledAssert
00082 
00083     /*  For indexer*/
00084     ret  assert args #
00085     rename assert ()
00086 
00087     # Initial default: disabled asserts
00088     rename DisabledAssert assert
00089 
00090 }
00091 
00092 

Generated on 21 Sep 2010 for Gui by  doxygen 1.6.1