2025-02-16 12:16:19 +01:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
2025-02-16 11:09:01 +01:00
|
|
|
/*
|
|
|
|
* Stage 1
|
|
|
|
*
|
|
|
|
* Define function prototypes.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#undef NAME
|
2025-02-16 12:11:43 +01:00
|
|
|
#define NAME(n, d, v)
|
2025-02-16 11:09:01 +01:00
|
|
|
|
|
|
|
#undef ENTRY
|
|
|
|
#define ENTRY(n, h, f, ...) \
|
|
|
|
static int f(int argc, char **argv, struct command *command, struct plugin *plugin);
|
|
|
|
|
|
|
|
#undef COMMAND_LIST
|
|
|
|
#define COMMAND_LIST(args...) args
|
|
|
|
|
|
|
|
#undef PLUGIN
|
|
|
|
#define PLUGIN(name, cmds) cmds
|
|
|
|
|
|
|
|
#include CMD_INCLUDE(CMD_INC_FILE)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Stage 2
|
|
|
|
*
|
|
|
|
* Define command structures.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#undef NAME
|
2025-02-16 12:11:43 +01:00
|
|
|
#define NAME(n, d, v)
|
2025-02-16 11:09:01 +01:00
|
|
|
|
|
|
|
#undef ENTRY_W_ALIAS
|
|
|
|
#define ENTRY_W_ALIAS(n, h, f, a) \
|
|
|
|
static struct command f ## _cmd = { \
|
|
|
|
.name = n, \
|
|
|
|
.help = h, \
|
|
|
|
.fn = f, \
|
|
|
|
.alias = a, \
|
|
|
|
};
|
|
|
|
|
|
|
|
#undef ENTRY_WO_ALIAS
|
|
|
|
#define ENTRY_WO_ALIAS(n, h, f) \
|
|
|
|
ENTRY_W_ALIAS(n, h, f, NULL)
|
|
|
|
|
|
|
|
#undef ENTRY_SEL
|
|
|
|
#define ENTRY_SEL(n, h, f, a, CMD, ...) CMD
|
|
|
|
|
|
|
|
#undef ENTRY
|
|
|
|
#define ENTRY(...) \
|
|
|
|
ENTRY_SEL(__VA_ARGS__, ENTRY_W_ALIAS, ENTRY_WO_ALIAS)(__VA_ARGS__)
|
|
|
|
|
|
|
|
#undef COMMAND_LIST
|
|
|
|
#define COMMAND_LIST(args...) args
|
|
|
|
|
|
|
|
#undef PLUGIN
|
|
|
|
#define PLUGIN(name, cmds) cmds
|
|
|
|
|
|
|
|
#include CMD_INCLUDE(CMD_INC_FILE)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Stage 3
|
|
|
|
*
|
|
|
|
* Generate list of commands for the plugin.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#undef NAME
|
2025-02-16 12:11:43 +01:00
|
|
|
#define NAME(n, d, v)
|
2025-02-16 11:09:01 +01:00
|
|
|
|
|
|
|
#undef ENTRY
|
|
|
|
#define ENTRY(n, h, f, ...) &f ## _cmd,
|
|
|
|
|
|
|
|
#undef COMMAND_LIST
|
|
|
|
#define COMMAND_LIST(args...) \
|
|
|
|
static struct command *commands[] = { \
|
|
|
|
args \
|
|
|
|
NULL, \
|
|
|
|
};
|
|
|
|
|
|
|
|
#undef PLUGIN
|
|
|
|
#define PLUGIN(name, cmds) cmds
|
|
|
|
|
|
|
|
#include CMD_INCLUDE(CMD_INC_FILE)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Stage 4
|
|
|
|
*
|
|
|
|
* Define and register plugin
|
|
|
|
*/
|
|
|
|
|
|
|
|
#undef NAME
|
2025-02-16 12:11:43 +01:00
|
|
|
#define NAME(n, d, v) .name = n, .desc = d, .version = v,
|
2025-02-16 11:09:01 +01:00
|
|
|
|
|
|
|
#undef COMMAND_LIST
|
|
|
|
#define COMMAND_LIST(args...)
|
|
|
|
|
|
|
|
#undef PLUGIN
|
|
|
|
#define PLUGIN(name, cmds) \
|
|
|
|
static struct plugin plugin = { \
|
|
|
|
name \
|
|
|
|
.commands = commands \
|
|
|
|
}; \
|
|
|
|
\
|
|
|
|
static void init(void) __attribute__((constructor)); \
|
|
|
|
static void init(void) \
|
|
|
|
{ \
|
|
|
|
register_extension(&plugin); \
|
|
|
|
}
|
|
|
|
|
|
|
|
#include CMD_INCLUDE(CMD_INC_FILE)
|