1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright 2018, Olivier MATZ <zer0@droids-corp.org>
12 #ifndef EC_COUNT_OF //XXX
13 #define EC_COUNT_OF(x) ((sizeof(x)/sizeof(0[x])) / \
14 ((size_t)(!(sizeof(x) % sizeof(0[x])))))
21 * The type identifier for a config value.
24 EC_CONFIG_TYPE_NONE = 0,
27 EC_CONFIG_TYPE_UINT64,
28 EC_CONFIG_TYPE_STRING,
35 * Structure describing the format of a configuration value.
37 * This structure is used in a const array which is referenced by a
38 * struct ec_config. Each entry of the array represents a key/value
39 * storage of the configuration dictionary.
41 struct ec_config_schema {
42 const char *key; /**< The key string (NULL for list elts). */
43 const char *desc; /**< A description of the value. */
44 enum ec_config_type type; /**< Type of the value */
46 /** If type is dict or list, the schema of the dict or list
47 * elements. Else must be NULL. */
48 const struct ec_config_schema *subschema;
50 /** The subschema array len in case of dict (> 0) or list (set
51 * to 1). Else must be 0. */
56 TAILQ_HEAD(ec_config_list, ec_config);
59 * Structure storing the configuration data.
62 /** type of value stored in the union */
63 enum ec_config_type type;
66 bool boolean; /** Boolean value */
67 int64_t i64; /** Signed integer value */
68 uint64_t u64; /** Unsigned integer value */
69 char *string; /** String value */
70 struct ec_node *node; /** Node value */
71 struct ec_keyval *dict; /** Hash table value */
72 struct ec_config_list list; /** List value */
76 * Next in list, only valid if type is list.
78 TAILQ_ENTRY(ec_config) next;
84 * Validate a configuration schema array.
87 * Pointer to the first element of the schema array.
89 * Length of the schema array.
91 * 0 if the schema is valid, or -1 on error (errno is set).
93 int ec_config_schema_validate(const struct ec_config_schema *schema,
97 * Dump a configuration schema array.
100 * Output stream on which the dump will be sent.
102 * Pointer to the first element of the schema array.
104 * Length of the schema array.
106 void ec_config_schema_dump(FILE *out, const struct ec_config_schema *schema,
113 * Create a boolean configuration value.
116 * The boolean value to be set.
118 * The configuration object, or NULL on error (errno is set).
120 struct ec_config *ec_config_bool(bool boolean);
123 * Create a signed integer configuration value.
126 * The signed integer value to be set.
128 * The configuration object, or NULL on error (errno is set).
130 struct ec_config *ec_config_i64(int64_t i64);
133 * Create an unsigned configuration value.
136 * The unsigned integer value to be set.
138 * The configuration object, or NULL on error (errno is set).
140 struct ec_config *ec_config_u64(uint64_t u64);
143 * Create a string configuration value.
146 * The string value to be set. The string is copied into the
147 * configuration object.
149 * The configuration object, or NULL on error (errno is set).
151 struct ec_config *ec_config_string(const char *string);
154 * Create a node configuration value.
157 * The node pointer to be set. The node is "consumed" by
158 * the function and should not be used by the caller, even
159 * on error. The caller can use ec_node_clone() to keep a
160 * reference on the node.
162 * The configuration object, or NULL on error (errno is set).
164 struct ec_config *ec_config_node(struct ec_node *node);
167 * Create a hash table configuration value.
170 * A configuration object containing an empty hash table, or NULL on
171 * error (errno is set).
173 struct ec_config *ec_config_dict(void);
176 * Create a list configuration value.
179 * The configuration object containing an empty list, or NULL on
180 * error (errno is set).
182 struct ec_config *ec_config_list(void);
185 * Add a config object into a list.
188 * The list configuration in which the value will be added.
190 * The value configuration to add in the list. The value object
191 * will be freed when freeing the list object. On error, the
192 * value object is also freed.
194 * 0 on success, else -1 (errno is set).
196 int ec_config_list_add(struct ec_config *list, struct ec_config *value);
199 * Remove an element from a list.
201 * The element is freed and should not be accessed.
204 * The list configuration.
206 * The element to remove from the list.
208 * 0 on success, -1 on error (errno is set).
210 int ec_config_list_del(struct ec_config *list, struct ec_config *config);
213 * Validate a configuration.
216 * A hash table configuration to validate.
218 * Pointer to the first element of the schema array.
220 * Length of the schema array.
222 * 0 on success, -1 on error (errno is set).
224 int ec_config_validate(const struct ec_config *dict,
225 const struct ec_config_schema *schema,
229 * Set a value in a hash table configuration
232 * A hash table configuration to validate.
236 * The value to set. The value object will be freed when freeing the
237 * dict object. On error, the value object is also freed.
239 * 0 on success, -1 on error (errno is set).
241 int ec_config_dict_set(struct ec_config *dict, const char *key,
242 struct ec_config *value);
245 * Remove an element from a hash table configuration.
247 * The element is freed and should not be accessed.
250 * A hash table configuration to validate.
252 * The key of the configuration to delete.
254 * 0 on success, -1 on error (errno is set).
256 int ec_config_dict_del(struct ec_config *config, const char *key);
259 * Compare two configurations.
261 int ec_config_cmp(const struct ec_config *config1,
262 const struct ec_config *config2);
265 * Get configuration value.
267 struct ec_config *ec_config_dict_get(const struct ec_config *config,
271 * Get the first element of a list.
274 * for (config = ec_config_list_iter(list);
276 * config = ec_config_list_next(list, config)) {
281 * The list configuration to iterate.
283 * The first configuration element, or NULL on error (errno is set).
285 struct ec_config *ec_config_list_first(struct ec_config *list);
288 * Get next element in list.
291 * The list configuration beeing iterated.
293 * The current configuration element.
295 * The next configuration element, or NULL if there is no more element.
298 ec_config_list_next(struct ec_config *list, struct ec_config *config);
301 * Free a configuration.
304 * The element to free.
306 void ec_config_free(struct ec_config *config);
309 * Compare two configurations.
312 * 0 if the configurations are equal, else -1.
314 int ec_config_cmp(const struct ec_config *value1,
315 const struct ec_config *value2);
318 * Duplicate a configuration.
321 * The configuration to duplicate.
323 * The duplicated configuration, or NULL on error (errno is set).
326 ec_config_dup(const struct ec_config *config);
329 * Dump a configuration.
332 * Output stream on which the dump will be sent.
334 * The configuration to dump.
336 void ec_config_dump(FILE *out, const struct ec_config *config);