[augeas-devel] augeas: master - * src/augeas.c: remove some internal uses of pathx_parse

David Lutterkort lutter at fedoraproject.org
Fri Mar 20 18:10:17 UTC 2009


Gitweb:        http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=ff4286b6c5d15a41d17a1ee309c9e59993035728
Commit:        ff4286b6c5d15a41d17a1ee309c9e59993035728
Parent:        2ec6ba63fe018cafb90f9ac0fe9209fdfad2f123
Author:        David Lutterkort <lutter at redhat.com>
AuthorDate:    Thu Mar 19 20:57:33 2009 -0700
Committer:     David Lutterkort <lutter at redhat.com>
CommitterDate: Thu Mar 19 20:57:33 2009 -0700

* src/augeas.c: remove some internal uses of pathx_parse

---
 src/augeas.c |  108 ++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 63 insertions(+), 45 deletions(-)

diff --git a/src/augeas.c b/src/augeas.c
index 6d55d80..60460ba 100644
--- a/src/augeas.c
+++ b/src/augeas.c
@@ -31,8 +31,13 @@
 #include <argz.h>
 #include <string.h>
 
-/* We always have a toplevel entry for P_ROOT */
-#define P_ROOT   "augeas"
+/* Some popular labels that we use in /augeas */
+static const char *const s_augeas = "augeas";
+static const char *const s_files  = "files";
+static const char *const s_load   = "load";
+static const char *const s_pathx  = "pathx";
+static const char *const s_error  = "error";
+static const char *const s_pos    = "pos";
 
 #define TREE_HIDDEN(tree) ((tree)->label == NULL)
 
@@ -88,37 +93,57 @@ static struct tree *tree_child_cr(struct tree *tree, const char *label) {
     return child;
 }
 
+static struct tree *tree_path_cr(struct tree *tree, int n, ...) {
+    va_list ap;
+
+    va_start(ap, n);
+    for (int i=0; i < n; i++) {
+        const char *l = va_arg(ap, const char *);
+        tree = tree_child_cr(tree, l);
+    }
+    va_end(ap);
+    return tree;
+}
+
+static int tree_set_value(struct tree *tree, const char *value) {
+    if (tree->value != NULL) {
+        free(tree->value);
+        tree->value = NULL;
+    }
+    if (value != NULL) {
+        tree->value = strdup(value);
+        if (tree->value == NULL)
+            return -1;
+    }
+    tree_mark_dirty(tree);
+    return 0;
+}
+
 /* Parse a path expression. Report errors in /augeas/pathx/error */
 static struct pathx *parse_user_pathx(const struct augeas *aug,
                                       const char *path) {
     struct pathx *result;
-    struct pathx *err;
     int    pos;
 
     if (pathx_parse(aug->origin, path, &result) == PATHX_NOERROR)
         return result;
 
-    if (pathx_parse(aug->origin, AUGEAS_META_PATHX "/error", &err)
-        != PATHX_NOERROR) {
-        free_pathx(result);
+    struct tree *error =
+        tree_path_cr(aug->origin, 3, s_augeas, s_pathx, s_error);
+    if (error == NULL)
         return NULL;
+    tree_set_value(error, pathx_error(result, NULL, &pos));
+
+    struct tree *tpos = tree_child_cr(error, s_pos);
+    if (tpos == NULL)
+        return NULL;
+
+    free(tpos->value);
+    if (ALLOC_N(tpos->value, strlen(path) + 4) >= 0) {
+        strncpy(tpos->value, path, pos);
+        strcat(tpos->value, "|=|");
+        strcat(tpos->value, path + pos);
     }
-    tree_set(err, pathx_error(result, NULL, &pos));
-    free_pathx(err);
-
-    if (pathx_parse(aug->origin, AUGEAS_META_PATHX "/error/pos", &err)
-        == PATHX_NOERROR) {
-        char *msg;
-        if (ALLOC_N(msg, strlen(path) + 4) >= 0) {
-            strncpy(msg, path, pos);
-            strcat(msg, "|=|");
-            strcat(msg, path + pos);
-            tree_set(err, msg);
-            free(msg);
-        }
-    }
-    free_pathx(err);
-    free_pathx(result);
     return NULL;
 }
 
@@ -153,14 +178,14 @@ struct tree *tree_append(struct tree *parent,
 static struct tree *tree_from_transform(struct augeas *aug,
                                         const char *modname,
                                         struct transform *xfm) {
-    struct tree *meta = tree_child_cr(aug->origin, "augeas");
+    struct tree *meta = tree_child_cr(aug->origin, s_augeas);
     struct tree *load = NULL, *txfm = NULL;
     char *m = NULL, *q = NULL;
 
     if (meta == NULL)
         goto error;
 
-    load = tree_child_cr(meta, "load");
+    load = tree_child_cr(meta, s_load);
     if (load == NULL)
             goto error;
     if (modname != NULL) {
@@ -210,7 +235,7 @@ struct augeas *aug_init(const char *root, const char *loadpath,
 
     result->root = init_root(root);
 
-    result->origin->children->label = strdup(P_ROOT);
+    result->origin->children->label = strdup(s_augeas);
 
     result->modpathz = NULL;
     result->nmodpath = 0;
@@ -298,10 +323,10 @@ static void tree_unlink_children(struct tree *tree) {
 }
 
 int aug_load(struct augeas *aug) {
-    struct tree *meta = tree_child_cr(aug->origin, "augeas");
-    struct tree *meta_files = tree_child_cr(meta, "files");
-    struct tree *files = tree_child_cr(aug->origin, "files");
-    struct tree *load = tree_child_cr(meta, "load");
+    struct tree *meta = tree_child_cr(aug->origin, s_augeas);
+    struct tree *meta_files = tree_child_cr(meta, s_files);
+    struct tree *files = tree_child_cr(aug->origin, s_files);
+    struct tree *load = tree_child_cr(meta, s_load);
 
     if (load == NULL)
         return -1;
@@ -345,16 +370,9 @@ struct tree *tree_set(struct pathx *p, const char *value) {
     if (r == -1)
         return NULL;
 
-    if (tree->value != NULL) {
-        free(tree->value);
-        tree->value = NULL;
-    }
-    if (value != NULL) {
-        tree->value = strdup(value);
-        if (tree->value == NULL)
-            return NULL;
-    }
-    tree_mark_dirty(tree);
+    r = tree_set_value(tree, value);
+    if (r < 0)
+        return NULL;
     return tree;
 }
 
@@ -659,8 +677,8 @@ int aug_match(const struct augeas *aug, const char *pathin, char ***matches) {
 static int tree_save(struct augeas *aug, struct tree *tree,
                      const char *path) {
     int result = 0;
-    struct tree *meta = tree_child_cr(aug->origin, "augeas");
-    struct tree *load = tree_child_cr(meta, "load");
+    struct tree *meta = tree_child_cr(aug->origin, s_augeas);
+    struct tree *load = tree_child_cr(meta, s_load);
 
     // FIXME: We need to detect subtrees that aren't saved by anything
 
@@ -765,10 +783,10 @@ static int unlink_removed_files(struct augeas *aug,
 
 int aug_save(struct augeas *aug) {
     int ret = 0;
-    struct tree *meta = tree_child_cr(aug->origin, "augeas");
-    struct tree *meta_files = tree_child_cr(meta, "files");
-    struct tree *files = tree_child_cr(aug->origin, "files");
-    struct tree *load = tree_child_cr(meta, "load");
+    struct tree *meta = tree_child_cr(aug->origin, s_augeas);
+    struct tree *meta_files = tree_child_cr(meta, s_files);
+    struct tree *files = tree_child_cr(aug->origin, s_files);
+    struct tree *load = tree_child_cr(meta, s_load);
 
     if (update_save_flags(aug) < 0)
         return -1;




More information about the augeas-devel mailing list