The COMMAND_HANDLER and COMMAND_HELPER macros allow commands to be
defined in a manner that decouples them from the exact order and type of
their parameters.  Once converted, incremental changes to the command
handler type can be addressed in incremental patches that do not need to
touch the entire tree.

These macros' implementation, __COMMAND_HANDLER, is used to define the
new command_handler_t type, and additional patches will use it to derive
new macros to define extended command types (e.g. flash, nand, pld).
The CALL_COMMAND_HANDLER provides a means of calling helpers or nested
handlers from withing a command handler.

This patch uses C99 varadic macro expansion.  Please report compilers
that cannot handle this code.

Signed-off-by: Zachary T Welch <z...@superlucidity.net>
---
 src/helper/command.h |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/src/helper/command.h b/src/helper/command.h
index eed7ad9..7d03261 100644
--- a/src/helper/command.h
+++ b/src/helper/command.h
@@ -80,6 +80,39 @@ 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.
+ */
+#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.
+ * globally-scoped
+ */
+#define COMMAND_HELPER(name, extra...) __COMMAND_HANDLER(name, extra)
+
+
 typedef struct command_s
 {
        char *name;
-- 
1.6.4.4

_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to