aboutsummaryrefslogtreecommitdiff
path: root/src/join.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-05-07 01:47:16 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-05-07 01:49:38 +0300
commit72b77743f20f909e83eacca3b47558d943ac2fcb (patch)
tree51cb9c4a5ba7324fa8525fb04cda9603c21897e1 /src/join.c
parented39daa568d162617a183497010d70a55a38ae73 (diff)
downloadgrecs-72b77743f20f909e83eacca3b47558d943ac2fcb.tar.gz
grecs-72b77743f20f909e83eacca3b47558d943ac2fcb.tar.bz2
Implement tree join.
* src/join.c: New file. * src/Make.am: Add join.c * src/grecs.h (grecs_tree_join): New function. * tests/gcffmt.c (main): If several files are given, process them all and join the resulting trees. * tests/join.at: New testcase. * tests/testsuite.at: Include join.at. * tests/Makefile.am: Add join.at.
Diffstat (limited to 'src/join.c')
-rw-r--r--src/join.c68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/join.c b/src/join.c
new file mode 100644
index 0000000..fd7c3ad
--- /dev/null
+++ b/src/join.c
@@ -0,0 +1,68 @@
+/* grecs - Gray's Extensible Configuration System
+ Copyright (C) 2007-2011 Sergey Poznyakoff
+
+ Grecs is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 3 of the License, or (at your
+ option) any later version.
+
+ Grecs 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with Grecs. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+#include <stdlib.h>
+#include <errno.h>
+#include "grecs.h"
+
+static enum grecs_tree_recurse_res
+reset_locus(enum grecs_tree_recurse_op op, struct grecs_node *node, void *data)
+{
+ struct grecs_symtab *st = data;
+ switch (op) {
+ case grecs_tree_recurse_set:
+ case grecs_tree_recurse_pre:
+ if (node->locus.file) {
+ struct grecs_syment *ent, key;
+ int install = 1;
+ key.name = (char*) node->locus.file;
+ ent = grecs_symtab_lookup_or_install(st, &key,
+ &install);
+ if (!ent)
+ grecs_alloc_die();
+ node->locus.file = ent->name;
+ }
+ break;
+ default:
+ break;
+ }
+ return grecs_tree_recurse_ok;
+
+}
+
+int
+grecs_tree_join(struct grecs_node *dst, struct grecs_node *src)
+{
+ struct grecs_node *p;
+
+ if (dst->type != grecs_node_root || src->type != grecs_node_root)
+ return 1;
+ grecs_node_bind(dst, src->down, 1);
+ for (p = src->down; p; p = p->next)
+ p->up = dst;
+ if (!src->v.texttab) {
+ dst->v.texttab = src->v.texttab;
+ } else {
+ grecs_tree_recurse(src->down, reset_locus, dst->v.texttab);
+ grecs_symtab_free(src->v.texttab);
+ }
+ src->v.texttab = NULL;
+ src->down = NULL;
+ return 0;
+}

Return to:

Send suggestions and report system problems to the System administrator.