Whamcloud - gitweb
LU-2456 lnet: DLC user space Configuration library
[fs/lustre-release.git] / lnet / utils / cyaml / cyaml.h
diff --git a/lnet/utils/cyaml/cyaml.h b/lnet/utils/cyaml/cyaml.h
new file mode 100644 (file)
index 0000000..f0b7993
--- /dev/null
@@ -0,0 +1,257 @@
+/*
+ * LGPL HEADER START
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of the
+ * License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * LGPL HEADER END
+ *
+ * Copyright (c) 2013, Intel Corporation.
+ *
+ * Author:
+ *   Amir Shehata <amir.shehata@intel.com>
+ */
+
+#ifndef CYAML_H
+#define CYAML_H
+
+#include <stdbool.h>
+
+enum cYAML_object_type {
+       CYAML_TYPE_FALSE = 0,
+       CYAML_TYPE_TRUE,
+       CYAML_TYPE_NULL,
+       CYAML_TYPE_NUMBER,
+       CYAML_TYPE_STRING,
+       CYAML_TYPE_ARRAY,
+       CYAML_TYPE_OBJECT
+};
+
+struct cYAML {
+       /* next/prev allow you to walk array/object chains. */
+       struct cYAML *cy_next, *cy_prev;
+       /* An array or object item will have a child pointer pointing
+          to a chain of the items in the array/object. */
+       struct cYAML *cy_child;
+       /* The type of the item, as above. */
+       enum cYAML_object_type cy_type;
+
+       /* The item's string, if type==CYAML_TYPE_STRING */
+       char *cy_valuestring;
+       /* The item's number, if type==CYAML_TYPE_NUMBER */
+       int cy_valueint;
+       /* The item's number, if type==CYAML_TYPE_NUMBER */
+       double cy_valuedouble;
+       /* The item's name string, if this item is the child of,
+          or is in the list of subitems of an object. */
+       char *cy_string;
+       /* user data which might need to be tracked per object */
+       void *cy_user_data;
+};
+
+typedef void (*cYAML_user_data_free_cb)(void *);
+
+/*
+ * cYAML_walk_cb
+ *   Callback called when recursing through the tree
+ *
+ *   cYAML* - pointer to the node currently being visitied
+ *   void* - user data passed to the callback.
+ *   void** - output value from the callback
+ *
+ * Returns true to continue recursing.  false to stop recursing
+ */
+typedef bool (*cYAML_walk_cb)(struct cYAML *, void *, void**);
+
+/*
+ * cYAML_build_tree
+ *   Build a tree representation of the YAML formated text passed in.
+ *
+ *   yaml_file - YAML file to parse and build tree representation
+ *   yaml_blk - blk of YAML.  yaml_file takes precedence if both
+ *   are defined.
+ *   yaml_blk_size - length of the yaml block (obtained via strlen)
+ */
+struct cYAML *cYAML_build_tree(char *yaml_file, const char *yaml_blk,
+                               size_t yaml_blk_size,
+                               struct cYAML **err_str);
+
+/*
+ * cYAML_print_tree
+ *   Print the textual representation of a YAML tree to stderr
+ *
+ *   node - Node where you want to start printing
+ */
+void cYAML_print_tree(struct cYAML *node);
+
+/*
+ * cYAML_print_tree2file
+ *   Print the textual representation of a YAML tree to file
+ *
+ *   f - file to print to
+ *   node - Node where you want to start printing
+ */
+void cYAML_print_tree2file(FILE *f, struct cYAML *node);
+
+/*
+ * cYAML_free_tree
+ *   Free the cYAML tree returned as part of the cYAML_build_tree
+ *
+ *   node - root of the tree to be freed
+ */
+void cYAML_free_tree(struct cYAML *node);
+
+/*
+ * cYAML_get_object_item
+ *   Returns the cYAML object which key correspods to the name passed in
+ *   This function searches only through the current level.
+ *
+ *   parent - is the parent object on which you want to conduct the search
+ *   name - key name of the object you want to find.
+ */
+struct cYAML *cYAML_get_object_item(struct cYAML *parent,
+                                   const char *name);
+
+/*
+ * cYAML_get_next_seq_item
+ *   Returns the next item in the YAML sequence.  This function uses the
+ *   itm parameter to keep track of its position in the sequence.  If the
+ *   itm parameter is reset to NULL between calls that resets and returns
+ *   the first item in the sequence.
+ *   This function returns NULL when there are no more items in the
+ *   sequence.
+ *
+ *   seq - is the head node of the YAML sequence
+ *   itm - [OUT] next sequence item to continue looking from next time.
+ *
+ */
+struct cYAML *cYAML_get_next_seq_item(struct cYAML *seq,
+                                     struct cYAML **itm);
+
+/*
+ * cYAML_is_seq
+ *   Returns 1 if the node provided is an ARRAY 0 otherwise
+ *
+ *   node - the node to examine
+ *
+ */
+bool cYAML_is_sequence(struct cYAML *node);
+
+/*
+ * cYAML_find_object
+ *   Returns the cYAML object which key correspods to the name passed in
+ *   this function searches the entire tree.
+ *
+ *   root - is the root of the tree on which you want to conduct the search
+ *   name - key name of the object you want to find.
+ */
+struct cYAML *cYAML_find_object(struct cYAML *root, const char *key);
+
+/*
+ * cYAML_clean_usr_data
+ *   walks the tree and for each node with some user data it calls the
+ *   free_cb with the user data as a parameter.
+ *
+ *   node: node to start the walk from
+ *   free_cb: cb to call to cleanup the user data
+ */
+void cYAML_clean_usr_data(struct cYAML *node,
+                         cYAML_user_data_free_cb free_cb);
+
+/*
+ * cYAML_create_object
+ *  Creates a CYAML of type OBJECT
+ *
+ *  parent - parent node
+ *  key - node key
+ */
+struct cYAML *cYAML_create_object(struct cYAML *parent, char *key);
+
+/*
+ * cYAML_create_seq
+ *  Creates a CYAML of type ARRAY
+ *  Once this is created, more sequence items can be added.
+ *
+ *  parent - parent node
+ *  key - node key
+ */
+struct cYAML *cYAML_create_seq(struct cYAML *parent, char *key);
+
+/*
+ * cYAML_create_object
+ *  Create a sequence item, which can have more entites added underneath
+ *  it
+ *
+ *  parent - parent node
+ */
+struct cYAML *cYAML_create_seq_item(struct cYAML *seq);
+
+/*
+ * cYAML_create_string
+ *   Creates a cYAML node of type STRING
+ *
+ *   parent - parent node
+ *   key - node key
+ *   value - value of node
+ */
+struct cYAML *cYAML_create_string(struct cYAML *parent, char *key,
+                                 char *value);
+
+/*
+ * cYAML_create_string
+ *   Creates a cYAML node of type STRING
+ *
+ *   parent - parent node
+ *   key - node key
+ *   value - value of node
+ */
+struct cYAML *cYAML_create_number(struct cYAML *parent, char *key,
+                                 double value);
+
+/*
+ * cYAML_insert_sibling
+ *   inserts one cYAML object as a sibling to another
+ *
+ *   root - root node to have a sibling added to
+ *   sibling - sibling to be added
+ */
+void cYAML_insert_sibling(struct cYAML *root, struct cYAML *sibling);
+
+/*
+ * cYAML_insert_child
+ *   inserts one cYAML object as a child to another
+ *
+ *   parent - parent node to have a child added to
+ *   child - child to be added
+ */
+void cYAML_insert_child(struct cYAML *parent, struct cYAML *node);
+
+/*
+ * cYAML_build_error
+ *   Build a YAML error message given:
+ *
+ *   rc - return code to add in the error
+ *   seq_no - a sequence number to add in the error
+ *   cmd - the command that failed.
+ *   entity - command entity that failed.
+ *   err_str - error string to add in the error
+ *   root - the root to which to add the YAML error
+ */
+void cYAML_build_error(int rc, int seq_no, char *cmd,
+                       char *entity, char *err_str,
+                       struct cYAML **root);
+
+
+#endif /* CYAML_H */