aboutsummaryrefslogtreecommitdiff
path: root/jim-subcmd.h
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2009-07-27 10:44:46 +1000
committerSteve Bennett <steveb@workware.net.au>2010-10-15 10:11:01 +1000
commit63011a2556161f26605f125eac5b9f25676112a7 (patch)
tree3838e67318740921868e2ad18bb50192df33eb9f /jim-subcmd.h
parent7f683b890f5575999bfae65988079c227735822d (diff)
downloadjimtcl-63011a2556161f26605f125eac5b9f25676112a7.zip
jimtcl-63011a2556161f26605f125eac5b9f25676112a7.tar.gz
jimtcl-63011a2556161f26605f125eac5b9f25676112a7.tar.bz2
Add file and exec (along with subcmd support)
Diffstat (limited to 'jim-subcmd.h')
-rw-r--r--jim-subcmd.h68
1 files changed, 68 insertions, 0 deletions
diff --git a/jim-subcmd.h b/jim-subcmd.h
new file mode 100644
index 0000000..973d80c
--- /dev/null
+++ b/jim-subcmd.h
@@ -0,0 +1,68 @@
+/* Provides a common approach to implementing Tcl commands
+ * which implement subcommands
+ */
+#ifndef JIM_SUBCMD_H
+#define JIM_SUBCMD_H
+
+#include <jim.h>
+
+#define JIM_MODFLAG_HIDDEN 0x0001 /* Don't show the subcommand in usage or commands */
+
+/* Custom flags start at 0x0100 */
+
+/**
+ * Returns JIM_OK if OK, JIM_ERR (etc.) on error, break, continue, etc.
+ * Returns -1 if invalid args.
+ */
+typedef int tclmod_cmd_function(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
+
+typedef struct {
+ const char *cmd; /* Name of the (sub)command */
+ const char *args; /* Textual description of allowed args */
+ tclmod_cmd_function *function; /* Function implementing the subcommand */
+ short minargs; /* Minimum required arguments */
+ short maxargs; /* Maximum allowed arguments or -1 if no limit */
+ unsigned flags; /* JIM_MODFLAG_... plus custom flags */
+ const char *description; /* Description of the subcommand */
+} jim_subcmd_type;
+
+/**
+ * Looks up the appropriate subcommand in the given command table and return
+ * the command function which implements the subcommand.
+ * NULL will be returned and an appropriate error will be set if the subcommand or
+ * arguments are invalid.
+ *
+ * Typical usage is:
+ * {
+ * const jim_subcmd_type *ct = Jim_ParseSubCmd(interp, command_table, argc, argv);
+ *
+ * return Jim_CallSubCmd(interp, ct, argc, argv);
+ * }
+ *
+ */
+const jim_subcmd_type *
+Jim_ParseSubCmd(Jim_Interp *interp, const jim_subcmd_type *command_table, int argc, Jim_Obj *const *argv);
+
+/**
+ * Parses the args against the given command table and executes the subcommand if found
+ * or sets an appropriate error if the subcommand or arguments is invalid.
+ *
+ * Can be used directly with Jim_CreateCommand() where the ClientData is the command table.
+ *
+ * e.g. Jim_CreateCommand(interp, "mycmd", Jim_SubCmdProc, command_table, NULL);
+ */
+int Jim_SubCmdProc(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
+
+/**
+ * Invokes the given subcmd with the given args as returned
+ * by Jim_ParseSubCmd()
+ *
+ * If ct is NULL, returns JIM_ERR, leaving any message.
+ * Otherwise invokes ct->function
+ *
+ * If ct->function returns -1, sets an error message and returns JIM_ERR.
+ * Otherwise returns the result of ct->function.
+ */
+int Jim_CallSubCmd(Jim_Interp *interp, const jim_subcmd_type *ct, int argc, Jim_Obj *const *argv);
+
+#endif