4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as
8 * published by the Free Software Foundation; either version 2.1 of the
9 * License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
21 * Copyright (c) 2014, 2017, Intel Corporation.
24 * Amir Shehata <amir.shehata@intel.com>
33 enum cYAML_object_type {
44 /* next/prev allow you to walk array/object chains. */
45 struct cYAML *cy_next, *cy_prev;
46 /* An array or object item will have a child pointer pointing
47 to a chain of the items in the array/object. */
48 struct cYAML *cy_child;
49 /* The type of the item, as above. */
50 enum cYAML_object_type cy_type;
52 /* The item's string, if type==CYAML_TYPE_STRING */
54 /* The item's number, if type==CYAML_TYPE_NUMBER */
56 /* The item's number, if type==CYAML_TYPE_NUMBER */
57 double cy_valuedouble;
58 /* The item's name string, if this item is the child of,
59 or is in the list of subitems of an object. */
61 /* user data which might need to be tracked per object */
65 typedef void (*cYAML_user_data_free_cb)(void *);
69 * Callback called when recursing through the tree
71 * cYAML* - pointer to the node currently being visitied
72 * void* - user data passed to the callback.
73 * void** - output value from the callback
75 * Returns true to continue recursing. false to stop recursing
77 typedef bool (*cYAML_walk_cb)(struct cYAML *, void *, void**);
81 * Build a tree representation of the YAML formatted text in file.
83 * file - YAML file to parse and build tree representation
85 struct cYAML *cYAML_load(FILE *file, struct cYAML **err_rc, bool debug);
89 * Build a tree representation of the YAML formatted text passed in.
91 * path - YAML file to parse and build tree representation
92 * yaml_blk - blk of YAML. yaml_file takes precedence if both
94 * yaml_blk_size - length of the yaml block (obtained via strlen)
96 struct cYAML *cYAML_build_tree(char *path, const char *yaml_blk,
98 struct cYAML **err_str, bool debug);
102 * Print the textual representation of a YAML tree to stderr
104 * node - Node where you want to start printing
106 void cYAML_print_tree(struct cYAML *node);
109 * cYAML_print_tree2file
110 * Print the textual representation of a YAML tree to file
112 * f - file to print to
113 * node - Node where you want to start printing
115 void cYAML_print_tree2file(FILE *f, struct cYAML *node);
119 * dump YAML to a buffer and return the pointer of the buffer
121 void cYAML_dump(struct cYAML *node, char **buf);
125 * Free the cYAML tree returned as part of the cYAML_build_tree
127 * node - root of the tree to be freed
129 void cYAML_free_tree(struct cYAML *node);
132 * cYAML_get_object_item
133 * Returns the cYAML object which key correspods to the name passed in
134 * This function searches only through the current level.
136 * parent - is the parent object on which you want to conduct the search
137 * name - key name of the object you want to find.
139 struct cYAML *cYAML_get_object_item(struct cYAML *parent,
143 * cYAML_get_next_seq_item
144 * Returns the next item in the YAML sequence. This function uses the
145 * itm parameter to keep track of its position in the sequence. If the
146 * itm parameter is reset to NULL between calls that resets and returns
147 * the first item in the sequence.
148 * This function returns NULL when there are no more items in the
151 * seq - is the head node of the YAML sequence
152 * itm - [OUT] next sequence item to continue looking from next time.
155 struct cYAML *cYAML_get_next_seq_item(struct cYAML *seq,
160 * Returns 1 if the node provided is an ARRAY 0 otherwise
162 * node - the node to examine
165 bool cYAML_is_sequence(struct cYAML *node);
169 * Returns the cYAML object which key correspods to the name passed in
170 * this function searches the entire tree.
172 * root - is the root of the tree on which you want to conduct the search
173 * name - key name of the object you want to find.
175 struct cYAML *cYAML_find_object(struct cYAML *root, const char *key);
178 * cYAML_clean_usr_data
179 * walks the tree and for each node with some user data it calls the
180 * free_cb with the user data as a parameter.
182 * node: node to start the walk from
183 * free_cb: cb to call to cleanup the user data
185 void cYAML_clean_usr_data(struct cYAML *node,
186 cYAML_user_data_free_cb free_cb);
189 * cYAML_create_object
190 * Creates a CYAML of type OBJECT
192 * parent - parent node
195 struct cYAML *cYAML_create_object(struct cYAML *parent, char *key);
199 * Creates a CYAML of type ARRAY
200 * Once this is created, more sequence items can be added.
202 * parent - parent node
205 struct cYAML *cYAML_create_seq(struct cYAML *parent, char *key);
208 * cYAML_create_object
209 * Create a sequence item, which can have more entites added underneath
212 * parent - parent node
214 struct cYAML *cYAML_create_seq_item(struct cYAML *seq);
217 * cYAML_create_string
218 * Creates a cYAML node of type STRING
220 * parent - parent node
222 * value - value of node
224 struct cYAML *cYAML_create_string(struct cYAML *parent, char *key,
228 * cYAML_create_string
229 * Creates a cYAML node of type STRING
231 * parent - parent node
233 * value - value of node
235 struct cYAML *cYAML_create_number(struct cYAML *parent, char *key,
239 * cYAML_insert_sibling
240 * inserts one cYAML object as a sibling to another
242 * root - root node to have a sibling added to
243 * sibling - sibling to be added
245 void cYAML_insert_sibling(struct cYAML *root, struct cYAML *sibling);
249 * inserts one cYAML object as a child to another
251 * parent - parent node to have a child added to
252 * child - child to be added
254 void cYAML_insert_child(struct cYAML *parent, struct cYAML *node);
258 * Build a YAML error message given:
260 * rc - return code to add in the error
261 * seq_no - a sequence number to add in the error
262 * cmd - the command that failed.
263 * entity - command entity that failed.
264 * err_str - error string to add in the error
265 * root - the root to which to add the YAML error
267 void cYAML_build_error(int rc, int seq_no, char *cmd,
268 char *entity, char *err_str,
269 struct cYAML **root);