about summary refs log tree commit diff
path: root/Completion/Core/_funcall
diff options
context:
space:
mode:
Diffstat (limited to 'Completion/Core/_funcall')
-rw-r--r--Completion/Core/_funcall32
1 files changed, 32 insertions, 0 deletions
diff --git a/Completion/Core/_funcall b/Completion/Core/_funcall
new file mode 100644
index 000000000..540f8ae83
--- /dev/null
+++ b/Completion/Core/_funcall
@@ -0,0 +1,32 @@
+#autoload
+
+# Utility function to call a function if it exists.
+#
+# Usage: _funcall <return> <name> [ <args> ... ]
+#
+# If a function named <name> is defined (or defined to be autoloaded),
+# it is called. If <return> is given not the string `-' or empty, it is
+# taken as the name of a parameter and the return status of the function
+# called is stored in this parameter. All other arguments are given
+# to the function called.
+# The return value of this function is zero if the function was
+# called and non-zero otherwise.
+
+local _name _ret
+
+[[ "$1" != (|-) ]] && _name="$1"
+
+shift
+
+if (( $+functions[$1] )); then
+  "$@"
+  _ret="$?"
+
+  [[ -n "$_name" ]] && eval "${_name}=${_ret}"
+
+  compstate[restore]=''
+
+  return 0
+fi
+
+return 1