Refactor "conf_schema.h" to fix compile warnings

In STRUCT() and ARRAY() declarations, change the optional "validator"
arg from taking a bare function name to enclose the function name in
VALIDATOR(function)
This commit is contained in:
Andrew Bettison 2014-08-14 16:40:30 +09:30
parent d2015a44b9
commit ccece93309
3 changed files with 57 additions and 35 deletions

35
conf.h
View File

@ -110,10 +110,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* field set to 0 if the node contains the option's default value, or 1 if the option's value
* differed from the default.
*
* If a STRUCT(NAME, VALIDATOR) or ARRAY(NAME, FLAGS, VALIDATOR) schema declaration is given a
* validator function, then the function must have the following signature:
* If a STRUCT(NAME) or ARRAY(NAME, FLAGS) schema declaration contains a VALIDATOR(VALIDATOR_FUNC)
* declaration, then the function must have the following signature:
*
* - int VALIDATOR(struct config_NAME *dest, int orig_result);
* - int VALIDATOR_FUNC(struct config_NAME *dest, int orig_result);
*
* A C function which validates the contents of the given C structure (struct or array) as
* defined in the schema. This function is invoked by the cf_opt_config_NAME() parser function
@ -344,7 +344,7 @@ struct pattern_list {
#define PATTERN_LIST_EMPTY ((struct pattern_list){.patc = 0})
// Generate config struct definitions, struct config_NAME.
#define STRUCT(__name, __validator...) \
#define STRUCT(__name, __validators...) \
struct config_##__name {
#define NODE(__type, __element, __default, __repr, __flags, __comment) \
__type __element;
@ -367,7 +367,7 @@ struct pattern_list {
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __validators...) \
struct config_##__name { \
unsigned ac; \
struct config_##__name##__element {
@ -414,7 +414,7 @@ struct pattern_list {
#undef END_ARRAY
// Generate config function prototypes, cf_dfl_config_NAME(), cf_sch_config_NAME(), cf_cpy_config_NAME().
#define STRUCT(__name, __validator...) \
#define STRUCT(__name, __validators...) \
int cf_dfl_config_##__name(struct config_##__name *); \
int cf_dfl_config_##__name##_cf_(struct config_##__name *); \
int cf_sch_config_##__name(struct cf_om_node **parentp);
@ -435,7 +435,7 @@ struct pattern_list {
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __validators...) \
int cf_dfl_config_##__name(struct config_##__name *); \
int cf_sch_config_##__name(struct cf_om_node **parentp);
#define KEY_ATOM(__type, __keyrepr)
@ -472,15 +472,17 @@ struct pattern_list {
#undef END_ARRAY
// Generate config parser function prototypes: cf_opt_REPR(), cf_fmt_REPR(), cf_cmp_REPR()
#define __VALIDATOR(__name, __validator...) \
#define VALIDATOR(__validator...) \
, __validator
#define __VALIDATOR(__name, __validators...) \
typedef int __validator_func__config_##__name##__t(const struct cf_om_node *, struct config_##__name *, int); \
__validator_func__config_##__name##__t __dummy__validator_func__config_##__name, ##__validator;
#define STRUCT(__name, __validator...) \
__validator_func__config_##__name##__t __dummy__validator_func__config_##__name __validators;
#define STRUCT(__name, __validators...) \
int cf_opt_config_##__name(struct config_##__name *, const struct cf_om_node *); \
int cf_fmt_config_##__name(struct cf_om_node **, const struct config_##__name *); \
int cf_xfmt_config_##__name(struct cf_om_node **, const struct config_##__name *, const struct config_##__name *); \
int cf_cmp_config_##__name(const struct config_##__name *, const struct config_##__name *); \
__VALIDATOR(__name, ##__validator)
__VALIDATOR(__name, ##__validators)
#define NODE(__type, __element, __default, __repr, __flags, __comment) \
int cf_opt_##__repr(__type *, const struct cf_om_node *); \
int cf_fmt_##__repr(struct cf_om_node **, const __type *); \
@ -511,12 +513,12 @@ struct pattern_list {
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __validators...) \
int cf_opt_config_##__name(struct config_##__name *, const struct cf_om_node *); \
int cf_fmt_config_##__name(struct cf_om_node **, const struct config_##__name *); \
int cf_xfmt_config_##__name(struct cf_om_node **, const struct config_##__name *, const struct config_##__name *); \
int cf_cmp_config_##__name(const struct config_##__name *, const struct config_##__name *); \
__VALIDATOR(__name, ##__validator)
__VALIDATOR(__name, ##__validators)
#define KEY_ATOM(__type, __keyrepr) \
int cf_opt_##__keyrepr(__type *, const char *); \
int cf_fmt_##__keyrepr(const char **, const __type *); \
@ -550,6 +552,7 @@ struct pattern_list {
#define END_ARRAY(__size)
#include "conf_schema.h"
#undef __VALIDATOR
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM
@ -575,7 +578,8 @@ struct pattern_list {
#undef END_ARRAY
// Generate config array search-by-key function prototypes.
#define STRUCT(__name, __validator...)
#define VALIDATOR(__validator...)
#define STRUCT(__name, __validators...)
#define NODE(__type, __element, __default, __repr, __flags, __comment)
#define ATOM(__type, __element, __default, __repr, __flags, __comment)
#define STRING(__size, __element, __default, __repr, __flags, __comment)
@ -589,7 +593,7 @@ struct pattern_list {
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __validators...) \
int config_##__name##__get(const struct config_##__name *,
#define KEY_ATOM(__type, __keyrepr) \
const __type *);
@ -602,6 +606,7 @@ struct pattern_list {
#define VALUE_NODE_STRUCT(__structname, __eltrepr)
#define END_ARRAY(__size)
#include "conf_schema.h"
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM

View File

@ -25,7 +25,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "conf.h"
// Generate config set-default function definitions, cf_dfl_config_NAME().
#define STRUCT(__name, __validator...) \
#define VALIDATOR(__validator)
#define STRUCT(__name, __options...) \
int cf_dfl_config_##__name(struct config_##__name *s) { \
return cf_dfl_config_##__name##_cf_(s); \
} \
@ -59,7 +60,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define END_STRUCT_DEFAULT \
return CFOK; \
}
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __options...) \
int cf_dfl_config_##__name(struct config_##__name *s) { \
return cf_dfl_config_##__name##_cf_(s); \
} \
@ -76,6 +77,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define VALUE_NODE_STRUCT(__structname, __eltrepr)
#define END_ARRAY(__size)
#include "conf_schema.h"
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM
@ -101,7 +103,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#undef END_ARRAY
// Generate config assign function definitions, cf_cpy_config_NAME().
#define STRUCT(__name, __validator...) \
#define VALIDATOR(__validator)
#define STRUCT(__name, __options...) \
__attribute__((unused)) static void __cf_unused_2_##__name(struct config_##__name *dst, const struct config_##__name *src) {
#define END_STRUCT \
}
@ -124,7 +127,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...)
#define ARRAY(__name, __flags, __options...)
#define KEY_ATOM(__type, __keyrepr)
#define KEY_STRING(__strsize, __keyrepr)
#define VALUE_ATOM(__type, __eltrepr)
@ -134,6 +137,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define VALUE_NODE_STRUCT(__structname, __eltrepr)
#define END_ARRAY(__size)
#include "conf_schema.h"
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM
@ -171,9 +175,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define NO_DUPLICATES |__NO_DUPLICATES
// Generate parsing functions, cf_opt_config_SECTION()
#define STRUCT(__name, __validator...) \
#define VALIDATOR(__validator) \
validator = (__validator);
#define STRUCT(__name, __options...) \
int cf_opt_config_##__name(struct config_##__name *strct, const struct cf_om_node *node) { \
int (*validator)(const struct cf_om_node *, struct config_##__name *, int) = (NULL, ##__validator); \
int (*validator)(const struct cf_om_node *, struct config_##__name *, int) = NULL; \
__options \
int result = CFEMPTY; \
char used[node->nodc]; \
memset(used, 0, node->nodc * sizeof used[0]);
@ -243,11 +250,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __options...) \
int cf_opt_config_##__name(struct config_##__name *array, const struct cf_om_node *node) { \
int flags = (0 __flags); \
int (*keycmp)(const void *, const void *) = NULL; \
int (*validator)(const struct cf_om_node *, struct config_##__name *, int) = (NULL, ##__validator); \
int (*validator)(const struct cf_om_node *, struct config_##__name *, int) = NULL; \
__options \
int result = CFOK; \
unsigned i, n; \
for (n = 0, i = 0; i < node->nodc && n < NELS(array->av); ++i) { \
@ -322,6 +330,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define VALUE_NODE_STRUCT(__structname, __eltrepr) \
__ARRAY_VALUE(cf_dfl_config_##__structname(&array->av[n].value), cf_opt_##__eltrepr(&array->av[n].value, child))
#include "conf_schema.h"
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM
@ -349,7 +358,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#undef END_ARRAY
// Generate config array search-by-key functions.
#define STRUCT(__name, __validator...)
#define VALIDATOR(__validator)
#define STRUCT(__name, __options...)
#define NODE(__type, __element, __default, __repr, __flags, __comment)
#define ATOM(__type, __element, __default, __repr, __flags, __comment)
#define STRING(__size, __element, __default, __repr, __flags, __comment)
@ -363,7 +373,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __options...) \
int config_##__name##__get(const struct config_##__name *array,
#define KEY_ATOM(__type, __keyrepr) \
const __type *key) { \
@ -388,6 +398,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define VALUE_NODE_STRUCT(__structname, __eltrepr)
#define END_ARRAY(__size)
#include "conf_schema.h"
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM
@ -413,7 +424,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#undef END_ARRAY
// Generate config schema dump functions, cf_sch_config_NAME().
#define STRUCT(__name, __validator...) \
#define VALIDATOR(__validator)
#define STRUCT(__name, __options...) \
int cf_sch_config_##__name(struct cf_om_node **rootp) { \
int i; \
struct cf_om_node **childp;
@ -460,7 +472,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __options...) \
int cf_sch_config_##__name(struct cf_om_node **rootp) { \
int i; \
struct cf_om_node **childp;
@ -489,6 +501,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#undef __ADD_CHILD
#undef __ATOM
#undef __STRUCT
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM
@ -514,7 +527,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#undef END_ARRAY
// Generate formatting functions, cf_fmt_config_SECTION()
#define STRUCT(__name, __validator...) \
#define VALIDATOR(__validator)
#define STRUCT(__name, __options...) \
int cf_fmt_config_##__name(struct cf_om_node **parentp, const struct config_##__name *strct) { \
return cf_xfmt_config_##__name(parentp, strct, NULL); \
} \
@ -621,7 +635,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __options...) \
int cf_xfmt_config_##__name(struct cf_om_node **parentp, const struct config_##__name *array, const struct config_##__name *UNUSED(dflt)) { \
return cf_fmt_config_##__name(parentp, array); \
} \
@ -694,6 +708,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
ret = cf_fmt_##__eltrepr(&(*parentp)->nodv[(unsigned)n], &array->av[i].value); \
__ARRAY_VALUE(cf_fmt_##__eltrepr)
#include "conf_schema.h"
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM
@ -725,7 +740,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#undef END_ARRAY
// Generate comparison functions, cf_cmp_config_SECTION()
#define STRUCT(__name, __validator...) \
#define VALIDATOR(__validator)
#define STRUCT(__name, __options...) \
int cf_cmp_config_##__name(const struct config_##__name *a, const struct config_##__name *b) { \
int c;
#define NODE(__type, __element, __default, __repr, __flags, __comment) \
@ -757,7 +773,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#define STRING_DEFAULT(__element, __default)
#define SUB_STRUCT_DEFAULT(__name, __element, __dfllabel...)
#define END_STRUCT_DEFAULT
#define ARRAY(__name, __flags, __validator...) \
#define ARRAY(__name, __flags, __options...) \
int cf_cmp_config_##__name(const struct config_##__name *a, const struct config_##__name *b) { \
int c; \
unsigned i; \
@ -788,6 +804,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
return (a->ac < b->ac) ? -1 : (a->ac > b->ac) ? 1 : 0; \
}
#include "conf_schema.h"
#undef VALIDATOR
#undef STRUCT
#undef NODE
#undef ATOM

View File

@ -90,7 +90,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* A schema definition is composed from the following STRUCT and ARRAY definitions:
*
* STRUCT(name [, validatorfunc])
* STRUCT(name) [ VALIDATOR(validatorfunc) ]
* element-declaration
* element-declaration
* ...
@ -104,7 +104,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* SUB_STRUCT(structname, element, flags [, default_label])
* NODE_STRUCT(structname, element, repr, flags [, default_label])
*
* ARRAY(name, flags [, validatorfunc])
* ARRAY(name, flags) [ VALIDATOR(validatorfunc) ]
* key-declaration
* value-declaration
* END_ARRAY(size)
@ -355,7 +355,7 @@ ATOM(uint16_t, remote_port, 4130, uint16_nonzero,, "Remote port num
ATOM(uint16_t, local_port, 4131, uint16_nonzero,, "Local port number")
END_STRUCT
ARRAY(argv, NO_DUPLICATES, vld_argv)
ARRAY(argv, NO_DUPLICATES, VALIDATOR(vld_argv))
KEY_ATOM(unsigned short, ushort_nonzero)
VALUE_STRING(128, str)
END_ARRAY(16)
@ -445,7 +445,7 @@ KEY_ATOM(sid_t, sid)
VALUE_SUB_STRUCT(host)
END_ARRAY(32)
STRUCT(network_interface, vld_network_interface)
STRUCT(network_interface, VALIDATOR(vld_network_interface))
ATOM(bool_t, exclude, 0, boolean,, "If true, do not use matching interfaces")
ATOM(struct pattern_list, match, PATTERN_LIST_EMPTY, pattern_list,, "Names that match network interface")
ATOM(short, socket_type, SOCK_UNSPECIFIED, socket_type,, "Type of network socket; stream, dgram or file")