aboutsummaryrefslogtreecommitdiff
path: root/src/format.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-05-06 11:58:47 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-05-06 13:00:06 +0300
commit52c12573a505bf29a0301a1c9553e88c3270713e (patch)
tree642047e5b3de469199b68a76064f756990a3b249 /src/format.c
parent8465fa7066d3c922b738346335f801cf9ea2243f (diff)
downloadgrecs-52c12573a505bf29a0301a1c9553e88c3270713e.tar.gz
grecs-52c12573a505bf29a0301a1c9553e88c3270713e.tar.bz2
Rewrite list support to keep doubly-linked lists. Implement tree reduction.
* src/format.c (grecs_format_node) (grecs_format_node_path): Handle grecs_node_root. * src/grecs-gram.y (input production): Create root node. * src/grecs.h (grecs_list_entry)<prev>: New member. (grecs_node_root): New node type. (grecs_node_eq): New proto. (grecs_list_add,grecs_tree_reduce): New protos. * src/list.c: Rewrite as a doubly-linked list. * src/tree.c (grecs_node_bind): Bugfix. (grecs_node_unlink): New function. (_tree_recurse): Allow for removal of the current node. (grecs_node_eq): New function. (grecs_tree_reduce): New function. (grecs_tree_process): Descend into the first subnode at once. * src/lookup.c (node_finder): Handle grecs_node_root. * tests/reduce00.at: New testcase. * tests/reduce01.at: New testcase. * tests/reduce02.at: New testcase. * tests/testsuite.at (GRECS_TEST): New macro. Include reduce0[0-2].at. * tests/gcffmt.c: New option -reduce. * tests/gcfpeek.c: Likewise. * tests/gcfset.c: Likewise.
Diffstat (limited to 'src/format.c')
-rw-r--r--src/format.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/src/format.c b/src/format.c
index 6e33521..4d4c126 100644
--- a/src/format.c
+++ b/src/format.c
@@ -197,6 +197,8 @@ grecs_format_node_path(struct grecs_node *node, int flags, FILE *fp)
int delim = flags & 0xff;
if (node->up)
grecs_format_node_path(node->up, flags, fp);
+ if (node->type == grecs_node_root)
+ return;
fputc(delim ? delim : '.', fp);
fprintf(fp, "%s", node->ident);
if (node->type == grecs_node_block &&
@@ -264,6 +266,7 @@ grecs_format_node(struct grecs_node *node, int flags, FILE *fp)
if (!flags)
flags = GRECS_NODE_FLAG_DEFAULT;
switch (node->type) {
+ case grecs_node_root:
case grecs_node_block:
for (node = node->down; node; node = node->next) {
grecs_format_node(node, flags, fp);

Return to:

Send suggestions and report system problems to the System administrator.