That's much better that adding dummy functions manually.
On 15.05.2014 11:24, Holger Freyther wrote:
From: Holger Hans Peter Freyther holger@moiji-mobile.com
Certain attributes are read-only. Add a macro to make it more easy to define those.
--- a/openbsc/include/openbsc/control_cmd.h +++ b/openbsc/include/openbsc/control_cmd.h +#define CTRL_CMD_DEFINE_RO(cmdname, cmdstr) \ +static int get_##cmdname(struct ctrl_cmd *cmd, void *data); \ +static inline int set_##cmdname(struct ctrl_cmd *cmd, void *data) \
Why inline? We basically need the addresses of these functions.
+{ \
- cmd->reply = "Read Only attribute"; \
- return CTRL_CMD_ERROR; \
+} \ +static inline int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *data) \ +{ \
- cmd->reply = "Read Only attribute"; \
- return 1; \
+} \ +static struct ctrl_cmd_element cmd_##cmdname = { \
- .name = cmdstr, \
- .param = NULL, \
- .get = &get_##cmdname, \
- .set = &set_##cmdname, \
- .verify = &verify_##cmdname, \
+}
It's quite some code duplication. What about something like the following (even if the resulting 'forward' declarations are somewhat senseless). This would even work with the ';' in the 'calling' code:
#define CTRL_CMD_DEFINE_RO(cmdname, cmdstr) \ static int set_##cmdname(struct ctrl_cmd *cmd, void *data) \ { \ cmd->reply = "Read Only attribute"; \ return CTRL_CMD_ERROR; \ } \ static int verify_##cmdname(struct ctrl_cmd *cmd, const char *value, void *data) \ { \ cmd->reply = "Read Only attribute"; \ return 1; \ } \ CTRL_CMD_DEFINE(cmdname, cmdstr)
Jacob