#// objective: tests processing of commands inside brackets [], only references/referencedby relations are relevant
#// check: 058__bracket__recursion_8tcl.xml
#// config: REFERENCED_BY_RELATION = yes
#// config: REFERENCES_RELATION = yes
#// config: EXTRACT_ALL = yes
#// config: INLINE_SOURCES = yes
##
# \brief should be reference by every proc below
proc Invoked args {
puts "Procedure \"Invoked\" is invoked indeed. Ok."
return $args
}
##
# \brief must not be reference by every proc below
proc NotInvoked args {
puts "Procedure \"NotInvoked\" is invoked. Not Ok!"
return $args
}
#
# check if call references work at all
proc a args {
Invoked NotInvoked
return
}
#
# check brackets with various quoting, bracing
proc b args {
set r [Invoked]
set r [list \[NotInvoked \]]
return
}
proc c args {
set r \{[Invoked]\}
set r {[NotInvoked]}
return
}
proc d args {
set r "[Invoked]"
set r "\[NotInvoked \]"
return
}
proc e args {
set r [list \[NotInvoked [Invoked]\]]
return
}
proc f args {
set r [list [Invoked \[NotInvoked \]]]
return
}
proc g args {
set r "{[Invoked]}"
set r "{\[NotInvoked \]}"
return
}
proc h args {
[Invoked set] r {[NotInvoked]}
return
}
# check brackets in tcl commands containing script arguments
#
# example generated according to
# https://groups.google.com/d/msg/comp.lang.tcl/G5-mc3GiIyY/e-AVD9t7xMkJ
proc i args {
foreach item [Invoked] {
return
}
}
proc j args {
foreach [Invoked item] [list one two three] {
}
return
}
proc k args {
while {[Invoked 0]} {
}
}
proc l args {
for {} {[Invoked 0]} {} {
}
}
proc m args {
if {[Invoked 1]} {
}
}
proc n args {
if [Invoked 1] {
}
}
proc o args {
if {0} {
} elseif {[Invoked 0]} {
}
}
# these are really nasty examples
# they shows, that the condition argument may not be parsed as a script
set NotInvoked \$NotInvoked
proc $NotInvoked args {
puts "Procedure \"\$NotInvoked\" is invoked. Not Ok!"
return $args
}
proc p args {
set NotInvoked \$NotInvoked
if {$NotInvoked eq [Invoked 1]} {
}
return
}
proc q args {
set NotInvoked \$NotInvoked
if {0} {
} elseif {$NotInvoked eq [Invoked 1]} {
}
return
}
proc r args {
set NotInvoked \$NotInvoked
while {$NotInvoked eq [Invoked 1]} {
}
return
}
proc s args {
set NotInvoked \$NotInvoked
for {} {$NotInvoked eq [Invoked 1]} {} {
}
return
}
# dangling open brackets should not confuse the scanner
proc t args {
set foo ]]]][Invoked]
return
}
# Example according to
# https://bugzilla.gnome.org/show_bug.cgi?id=729135
# |
# Note the subtle difference in this | whitespace
# V
proc y {} {
set classifier_state {{bphy} }
if { ($classifier_state == {{bphy} }) } {
Invoked
}
}
proc z {} {
set classifier_state {{bphy} }
if { ($classifier_state == {{bphy} } ) } {
Invoked
}
}
#
# call all single letter procs
# let tcl check what is called and what is not called
foreach p [info procs ?] {
puts "Check procedure \"$p\""
$p
}
exit