*/
#define __COMMAND_HANDLER(name, extra...) \
int name(struct command_context_s *cmd_ctx, \
- char *cmd, char **args, int argc, ##extra)
+ const char *args[], unsigned argc, ##extra)
/**
* Use this to macro to call a command helper (or a nested handler).
* variables in intervening scope(s) by accident.
*/
#define CALL_COMMAND_HANDLER(name, extra...) \
- name(cmd_ctx, cmd, args, argc, ##extra)
+ name(cmd_ctx, args, argc, ##extra)
/**
* Always use this macro to define new command handler functions.
*/
#define COMMAND_HELPER(name, extra...) __COMMAND_HANDLER(name, extra)
+/**
+ * Use this macro to access the name of the command being handled,
+ * rather than accessing the variable directly. It may be moved.
+ */
+#define CMD_NAME args[-1]
+
+
+/// The type signature for commands' handler functions.
+typedef __COMMAND_HANDLER((*command_handler_t));
typedef struct command_s
{
char *name;
struct command_s *parent;
struct command_s *children;
- int (*handler)(struct command_context_s *context, char* name, char** args, int argc);
+ command_handler_t handler;
enum command_mode mode;
struct command_s *next;
} command_t;
char *command_name(struct command_s *c, char delim);
command_t* register_command(command_context_t *context,
- command_t *parent, char *name,
- int (*handler)(struct command_context_s *context,
- char* name, char** args, int argc),
+ command_t *parent, char *name, command_handler_t handler,
enum command_mode mode, char *help);
int unregister_command(command_context_t *context, char *name);