}
/* we now need to add an overrideable proc */
- const char *override_name = alloc_printf("proc %s {args} {"
- "if {[catch {eval ocd_%s $args}] == 0} "
- "{return \"\"} else {return -code error}}",
+ const char *override_name = alloc_printf(
+ "proc %s {args} {eval ocd_bouncer %s $args}",
full_name, full_name);
if (NULL == override_name)
goto free_full_name;
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 command type $cmd $args]
+ if {$type == "native"} {
+ return [eval $cmd $args]
+ } else {if {$type == "simple"} {
+ if {[catch {eval $cmd $args}] == 0} {
+ return ""
+ } else {
+ set errmsg "Command handler execution failed"
+ }
+ } else {if {$type == "group"} {
+ catch {eval help $name $args}
+ set errmsg [format "%s: command requires more arguments" \
+ [concat $name " " $args]]
+ } else {
+ set errmsg [format "Unknown command type: %s" $type]
+ }}}
+ return -code error $errmsg
+}
+
# Try flipping / and \ to find file if the filename does not
# match the precise spelling
proc find {filename} {