From: Olivier Matz Date: Thu, 9 Aug 2018 14:07:20 +0000 (+0200) Subject: export schema lookup X-Git-Url: http://git.droids-corp.org/?p=protos%2Flibecoli.git;a=commitdiff_plain;h=d8c60a316b5c2a8b959f6191274504d433cf64f0 export schema lookup --- diff --git a/lib/ecoli_config.c b/lib/ecoli_config.c index ff4b27d..63b5725 100644 --- a/lib/ecoli_config.c +++ b/lib/ecoli_config.c @@ -360,15 +360,14 @@ ec_config_list(void) return value; } -static const struct ec_config_schema * +const struct ec_config_schema * ec_config_schema_lookup(const struct ec_config_schema *schema, - const char *key, enum ec_config_type type) + const char *key) { size_t i; for (i = 0; schema[i].type != EC_CONFIG_TYPE_NONE; i++) { - if (!strcmp(key, schema[i].key) && - type == schema[i].type) + if (!strcmp(key, schema[i].key)) return &schema[i]; } @@ -536,12 +535,11 @@ ec_config_dict_validate(const struct ec_keyval *dict, key = ec_keyval_iter_get_key(iter); value = ec_keyval_iter_get_val(iter); - sch = ec_config_schema_lookup(schema, key, value->type); - if (sch == NULL) { + sch = ec_config_schema_lookup(schema, key); + if (sch == NULL || sch->type != value->type) { errno = EBADMSG; goto fail; } - if (value->type == EC_CONFIG_TYPE_LIST) { if (ec_config_list_validate(&value->list, sch->subschema) < 0) diff --git a/lib/ecoli_config.h b/lib/ecoli_config.h index 8ceddf5..706af79 100644 --- a/lib/ecoli_config.h +++ b/lib/ecoli_config.h @@ -98,6 +98,21 @@ int ec_config_schema_validate(const struct ec_config_schema *schema); */ void ec_config_schema_dump(FILE *out, const struct ec_config_schema *schema); +/** + * Find a schema entry matching the key. + * + * Browse the schema array and lookup for the given key. + * + * @param schema + * Pointer to the first element of the schema array. The array + * must be terminated by a sentinel entry (type == EC_CONFIG_TYPE_NONE). + * @return + * The schema entry if it matches a key, or NULL if not found. + */ +const struct ec_config_schema * +ec_config_schema_lookup(const struct ec_config_schema *schema, + const char *key); + /** * Check if a key name is reserved in a config dict. *