diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-11-10 09:50:27 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-11-10 09:50:27 +0200 |
commit | b1258b6d6e9e0482b37e86977ffc779e14c75b9f (patch) | |
tree | e84c46aaa6675fbd574013e50b854866df734ce6 | |
parent | 6020d6243c7fdf657da768b3fb2efa1244665d51 (diff) | |
download | grecs-b1258b6d6e9e0482b37e86977ffc779e14c75b9f.tar.gz grecs-b1258b6d6e9e0482b37e86977ffc779e14c75b9f.tar.bz2 |
Fix 5938aedc.
* src/tree.c (grecs_node_unlink): Partially revert 5938aedc.
(node_merge_block): Fix prev link.
-rw-r--r-- | src/tree.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -117,22 +117,23 @@ grecs_node_bind(struct grecs_node *master, struct grecs_node *node, int dn) } } int grecs_node_unlink(struct grecs_node *node) { - if (node->up && node->up->down == node) - node->up->down = node->prev; if (node->prev) node->prev->next = node->next; + else if (node->up) + node->up->down = node->next; + else + return 1; if (node->next) node->next->prev = node->prev; node->up = node->prev = node->next = NULL; return 0; } - static void listel_dispose(void *el) { grecs_free(el); } @@ -1086,13 +1087,16 @@ node_merge_block(struct grecs_node *to_node, struct grecs_node *from_node, return; for (sp = from_node->down; ; sp = sp->next) { sp->up = to_node; if (!sp->next) break; } + sp->next = to_node->down; + to_node->down->prev = sp; + to_node->down = from_node->down; from_node->down = NULL; } static int node_reduce(struct grecs_node *node, struct grecs_keyword *kwp, int flags) |