openocd/src/helper/startup.tcl
Paul Fertser 19f219f731 Tcl exception codes cleanup, shutdown command amendments
This patch might influence openocd Tcl commands behaviour in subtle
ways, please give it a nice testing.

The idea is that if an OpenOCD Tcl command returns an error, an
exception is raised, and then the return code is propogated all the
way up (or to the "catch" if present). This allows to detect
"shutdown" which is not actually an error but has to raise an
exception to stop execution of the commands that follow it in the
script.

openocd_thread special-cases shutdown because it should then terminate
OpenOCD with a success error code, unless shutdown was called with an
optional "error" argument which means terminate with a non-zero exit
code.

Change-Id: I7b6fa8a2e24c947dc45d8def0008b4b007c478b3
Signed-off-by: Paul Fertser <fercerpav@gmail.com>
Reviewed-on: http://openocd.zylin.com/2600
Tested-by: jenkins
Reviewed-by: Juha Niskanen <juha.niskanen@haltian.com>
Reviewed-by: Jens Bauer <jens@gpio.dk>
Reviewed-by: Oleksij Rempel <linux@rempel-privat.de>
2015-04-14 12:11:48 +01:00

67 lines
1.8 KiB
Tcl

# Defines basic Tcl procs that must exist for OpenOCD scripts to work.
#
# Embedded into OpenOCD executable
#
# We need to explicitly redirect this to the OpenOCD command
# as Tcl defines the exit proc
proc exit {} {
ocd_throw exit
}
# All commands are registered with an 'ocd_' prefix, while the "real"
# command is a wrapper that calls this function. Its primary purpose is
# to discard 'handler' command output,
proc ocd_bouncer {name args} {
set cmd [format "ocd_%s" $name]
set type [eval ocd_command type $cmd $args]
set errcode error
if {$type == "native"} {
return [eval $cmd $args]
} else {if {$type == "simple"} {
set errcode [catch {eval $cmd $args}]
if {$errcode == 0} {
return ""
} else {
# 'classic' commands output error message as part of progress output
set errmsg ""
}
} else {if {$type == "group"} {
catch {eval ocd_usage $name $args}
set errmsg [format "%s: command requires more arguments" \
[concat $name " " $args]]
} else {
set errmsg [format "invalid subcommand \"%s\"" $args]
}}}
return -code $errcode $errmsg
}
# Try flipping / and \ to find file if the filename does not
# match the precise spelling
proc find {filename} {
if {[catch {ocd_find $filename} t]==0} {
return $t
}
if {[catch {ocd_find [string map {\ /} $filename} t]==0} {
return $t
}
if {[catch {ocd_find [string map {/ \\} $filename} t]==0} {
return $t
}
# make sure error message matches original input string
return -code error "Can't find $filename"
}
add_usage_text find "<file>"
add_help_text find "print full path to file according to OpenOCD search rules"
# Find and run a script
proc script {filename} {
uplevel #0 [list source [find $filename]]
}
add_help_text script "filename of OpenOCD script (tcl) to run"
add_usage_text script "<file>"
#########