[augeas-devel] [PATCH 2/8] * src/augeas.c (tree_unlink): remove and free a subtree
David Lutterkort
lutter at redhat.com
Wed Feb 25 21:58:32 UTC 2009
---
src/augeas.c | 27 ++++++++++++++-------------
src/internal.h | 1 +
2 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/src/augeas.c b/src/augeas.c
index 7262ac2..5d6a599 100644
--- a/src/augeas.c
+++ b/src/augeas.c
@@ -412,6 +412,17 @@ int free_tree(struct tree *tree) {
return cnt;
}
+int tree_unlink(struct tree *tree) {
+ int result = 0;
+
+ assert (tree->parent != NULL);
+ list_remove(tree, tree->parent->children);
+ tree->parent->dirty = 1;
+ result = free_tree(tree->children) + 1;
+ free_tree_node(tree);
+ return result;
+}
+
int tree_rm(struct pathx *p) {
struct tree *tree, **del;
int cnt = 0, ndel = 0, i;
@@ -436,13 +447,8 @@ int tree_rm(struct pathx *p) {
i += 1;
}
- for (i = 0; i < ndel; i++) {
- assert (del[i]->parent != NULL);
- list_remove(del[i], del[i]->parent->children);
- del[i]->parent->dirty = 1;
- cnt += free_tree(del[i]->children) + 1;
- free_tree_node(del[i]);
- }
+ for (i = 0; i < ndel; i++)
+ cnt += tree_unlink(del[i]);
free(del);
return cnt;
@@ -531,14 +537,9 @@ int aug_mv(struct augeas *aug, const char *src, const char *dst) {
ts->value = NULL;
ts->children = NULL;
-
- list_remove(ts, ts->parent->children);
-
- ts->parent->dirty = 1;
+ tree_unlink(ts);
td->dirty = 1;
- free_tree(ts);
-
ret = 0;
done:
free_pathx(s);
diff --git a/src/internal.h b/src/internal.h
index 582cbd4..7c69211 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -313,6 +313,7 @@ struct tree *make_tree_origin(struct tree *root);
int tree_replace(struct tree *origin, const char *path, struct tree *sub);
int tree_rm(struct pathx *p);
+int tree_unlink(struct tree *tree);
struct tree *tree_set(struct pathx *p, const char *value);
int tree_insert(struct pathx *p, const char *label, int before);
int free_tree(struct tree *tree);
--
1.6.0.6
More information about the augeas-devel
mailing list