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