diff --git a/conf.h b/conf.h index 1cc24b12..dfe06097 100644 --- a/conf.h +++ b/conf.h @@ -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 diff --git a/conf_parse.c b/conf_parse.c index 721061ee..3475c1f5 100644 --- a/conf_parse.c +++ b/conf_parse.c @@ -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 diff --git a/conf_schema.h b/conf_schema.h index 15f49adb..57a226d8 100644 --- a/conf_schema.h +++ b/conf_schema.h @@ -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")