David Lutterkort b220a3
From 0695bdd057b2cbfc6146ac498179c0f162ee889f Mon Sep 17 00:00:00 2001
David Lutterkort b220a3
From: David Lutterkort <lutter@redhat.com>
David Lutterkort b220a3
Date: Tue, 29 Jun 2010 15:46:53 -0700
David Lutterkort b220a3
Subject: [PATCH 8/9] Add utility tree_store_value to avoid unnecessary strdup's
David Lutterkort b220a3
David Lutterkort b220a3
  * src/internal.h (tree_store_value): add prototype
David Lutterkort b220a3
  * src/augeas.c (tree_store_value): new function; (tree_set_value): use
David Lutterkort b220a3
    tree_store_value
David Lutterkort b220a3
---
David Lutterkort b220a3
 src/augeas.c   |   18 ++++++++++++++----
David Lutterkort b220a3
 src/internal.h |    5 ++++-
David Lutterkort b220a3
 2 files changed, 18 insertions(+), 5 deletions(-)
David Lutterkort b220a3
David Lutterkort b220a3
diff --git a/src/augeas.c b/src/augeas.c
David Lutterkort b220a3
index 5ca1789..744b699 100644
David Lutterkort b220a3
--- a/src/augeas.c
David Lutterkort b220a3
+++ b/src/augeas.c
David Lutterkort b220a3
@@ -156,17 +156,27 @@ struct tree *tree_find_cr(struct augeas *aug, const char *path) {
David Lutterkort b220a3
     return result;
David Lutterkort b220a3
 }
David Lutterkort b220a3
 
David Lutterkort b220a3
-int tree_set_value(struct tree *tree, const char *value) {
David Lutterkort b220a3
+void tree_store_value(struct tree *tree, char **value) {
David Lutterkort b220a3
     if (tree->value != NULL) {
David Lutterkort b220a3
         free(tree->value);
David Lutterkort b220a3
         tree->value = NULL;
David Lutterkort b220a3
     }
David Lutterkort b220a3
+    if (*value != NULL) {
David Lutterkort b220a3
+        tree->value = *value;
David Lutterkort b220a3
+        *value = NULL;
David Lutterkort b220a3
+    }
David Lutterkort b220a3
+    tree_mark_dirty(tree);
David Lutterkort b220a3
+}
David Lutterkort b220a3
+
David Lutterkort b220a3
+int tree_set_value(struct tree *tree, const char *value) {
David Lutterkort b220a3
+    char *v = NULL;
David Lutterkort b220a3
+
David Lutterkort b220a3
     if (value != NULL) {
David Lutterkort b220a3
-        tree->value = strdup(value);
David Lutterkort b220a3
-        if (tree->value == NULL)
David Lutterkort b220a3
+        v = strdup(value);
David Lutterkort b220a3
+        if (v == NULL)
David Lutterkort b220a3
             return -1;
David Lutterkort b220a3
     }
David Lutterkort b220a3
-    tree_mark_dirty(tree);
David Lutterkort b220a3
+    tree_store_value(tree, &v);
David Lutterkort b220a3
     return 0;
David Lutterkort b220a3
 }
David Lutterkort b220a3
 
David Lutterkort b220a3
diff --git a/src/internal.h b/src/internal.h
David Lutterkort b220a3
index f1e6f3a..7513d47 100644
David Lutterkort b220a3
--- a/src/internal.h
David Lutterkort b220a3
+++ b/src/internal.h
David Lutterkort b220a3
@@ -389,7 +389,10 @@ struct tree *tree_child_cr(struct tree *tree, const char *label);
David Lutterkort b220a3
 /* Create a path in the tree; nodes along the path are looked up with
David Lutterkort b220a3
  * tree_child_cr */
David Lutterkort b220a3
 struct tree *tree_path_cr(struct tree *tree, int n, ...);
David Lutterkort b220a3
-/* Set the value of TREE and update dirty flags */
David Lutterkort b220a3
+/* Store VALUE directly as the value of TREE and set VALUE to NULL.
David Lutterkort b220a3
+ * Update dirty flags */
David Lutterkort b220a3
+void tree_store_value(struct tree *tree, char **value);
David Lutterkort b220a3
+/* Set the value of TREE to a copy of VALUE and update dirty flags */
David Lutterkort b220a3
 int tree_set_value(struct tree *tree, const char *value);
David Lutterkort b220a3
 /* Cleanly remove all children of TREE, but leave TREE itself unchanged */
David Lutterkort b220a3
 void tree_unlink_children(struct augeas *aug, struct tree *tree);
David Lutterkort b220a3
-- 
David Lutterkort b220a3
1.6.6.1
David Lutterkort b220a3