summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/helper/command.h42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/helper/command.h b/src/helper/command.h
index ded76fee..236dabbe 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -80,6 +80,48 @@ typedef struct command_context_s
void *output_handler_priv;
} command_context_t;
+
+/**
+ * Command handlers may be defined with more parameters than the base
+ * set provided by command.c. This macro uses C99 magic to allow
+ * defining all such derivative types using this macro.
+ */
+#define __COMMAND_HANDLER(name, extra...) \
+ int name(struct command_context_s *cmd_ctx, \
+ char *cmd, char **args, int argc, ##extra)
+
+/**
+ * Use this to macro to call a command helper (or a nested handler).
+ * It provides command handler authors protection against reordering or
+ * removal of unused parameters.
+ *
+ * @b Note: This macro uses lexical capture to provide some arguments.
+ * As a result, this macro should be used @b only within functions
+ * defined by the COMMAND_HANDLER or COMMAND_HELPER macros. Those
+ * macros provide the expected lexical context captured by this macro.
+ * Furthermore, it should be used only from the top-level of handler or
+ * helper function, or care must be taken to avoid redefining the same
+ * variables in intervening scope(s) by accident.
+ */
+#define CALL_COMMAND_HANDLER(name, extra...) \
+ name(cmd_ctx, cmd, args, argc, ##extra)
+
+/**
+ * Always use this macro to define new command handler functions.
+ * It ensures the parameters are ordered, typed, and named properly, so
+ * they be can be used by other macros (e.g. COMMAND_PARSE_NUMBER).
+ * All command handler functions must be defined as static in scope.
+ */
+#define COMMAND_HANDLER(name) static __COMMAND_HANDLER(name)
+
+/**
+ * Similar to COMMAND_HANDLER, except some parameters are expected.
+ * A helper is globally-scoped because it may be shared between several
+ * source files (e.g. the s3c24xx device command helper).
+ */
+#define COMMAND_HELPER(name, extra...) __COMMAND_HANDLER(name, extra)
+
+
typedef struct command_s
{
char *name;