[augeas-devel] augeas: master - Tree functions to find/create a node with a path expression

David Lutterkort lutter at fedoraproject.org
Thu Jan 7 20:40:25 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=d2a4672a9178d00194664a5e596894c242dd46c7
Commit:        d2a4672a9178d00194664a5e596894c242dd46c7
Parent:        41fd642104b7e254c6ff950dc30d1dd0afcf61a9
Author:        David Lutterkort <lutter at redhat.com>
AuthorDate:    Thu Jan 7 11:17:57 2010 -0800
Committer:     David Lutterkort <lutter at redhat.com>
CommitterDate: Thu Jan 7 11:45:04 2010 -0800

Tree functions to find/create a node with a path expression

Internal counterparts to aug_get and aug_set

  * src/internal.h (tree_find, tree_find_cr): new prototypes
  * src/augeas.c (tree_find, tree_find_cr): new functions
---
 src/augeas.c   |   35 +++++++++++++++++++++++++++++++++++
 src/internal.h |   11 +++++++++++
 2 files changed, 46 insertions(+), 0 deletions(-)

diff --git a/src/augeas.c b/src/augeas.c
index 1fb7842..2f4b788 100644
--- a/src/augeas.c
+++ b/src/augeas.c
@@ -120,6 +120,41 @@ struct tree *tree_path_cr(struct tree *tree, int n, ...) {
     return tree;
 }
 
+struct tree *tree_find(struct augeas *aug, const char *path) {
+    struct pathx *p = NULL;
+    struct tree *result = NULL;
+    int r;
+
+    pathx_parse(aug->origin, aug->error, path, true, aug->symtab, &p);
+    ERR_BAIL(aug);
+
+    r = pathx_find_one(p, &result);
+    BUG_ON(r > 1, aug,
+           "Multiple matches for %s when only one was expected",
+           path);
+ done:
+    free_pathx(p);
+    return result;
+ error:
+    result = NULL;
+    goto done;
+}
+
+struct tree *tree_find_cr(struct augeas *aug, const char *path) {
+    struct pathx *p = NULL;
+    struct tree *result = NULL;
+    int r;
+
+    pathx_parse(aug->origin, aug->error, path, true, aug->symtab, &p);
+    ERR_BAIL(aug);
+
+    r = pathx_expand_tree(p, &result);
+    ERR_BAIL(aug);
+ error:
+    free_pathx(p);
+    return result;
+}
+
 int tree_set_value(struct tree *tree, const char *value) {
     if (tree->value != NULL) {
         free(tree->value);
diff --git a/src/internal.h b/src/internal.h
index 5189a83..7daa43a 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -388,6 +388,17 @@ struct tree *tree_path_cr(struct tree *tree, int n, ...);
 int tree_set_value(struct tree *tree, const char *value);
 /* Cleanly remove all children of TREE, but leave TREE itself unchanged */
 void tree_unlink_children(struct augeas *aug, struct tree *tree);
+/* Find the node matching PATH.
+ * Returns the node or NULL on error
+ * Errors: EMMATCH - more than one node matches PATH
+ *         ENOMEM  - allocation error
+ */
+struct tree *tree_find(struct augeas *aug, const char *path);
+/* Find the node matching PATH. Expand the tree to contain such a node if
+ * none exists.
+ * Returns the node or NULL on error
+ */
+struct tree *tree_find_cr(struct augeas *aug, const char *path);
 
 /* Struct: memstream
  * Wrappers to simulate OPEN_MEMSTREAM where that's not available. The




More information about the augeas-devel mailing list