From: K.Kosako Date: Sat, 24 Aug 2019 08:10:22 +0000 (+0900) Subject: add set_parent_node_trav() X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a08bd64f2a4ed2b7fcad988570fb6b839d730602;p=onig add set_parent_node_trav() --- diff --git a/src/regcomp.c b/src/regcomp.c index 80ca238..d5d6058 100644 --- a/src/regcomp.c +++ b/src/regcomp.c @@ -3237,7 +3237,8 @@ set_empty_repeat_node_trav(Node* node, Node* empty, ScanEnv* env) break; case NODE_BAG: - r = set_empty_repeat_node_trav(NODE_BODY(node), empty, env); + if (IS_NOT_NULL(NODE_BODY(node))) + r = set_empty_repeat_node_trav(NODE_BODY(node), empty, env); { BagNode* en = BAG_(node); @@ -3268,6 +3269,49 @@ set_empty_repeat_node_trav(Node* node, Node* empty, ScanEnv* env) return r; } +static void +set_parent_node_trav(Node* node, Node* parent) +{ + NODE_PARENT(node) = parent; + + switch (NODE_TYPE(node)) { + case NODE_LIST: + case NODE_ALT: + do { + set_parent_node_trav(NODE_CAR(node), node); + } while (IS_NOT_NULL(node = NODE_CDR(node))); + break; + + case NODE_ANCHOR: + if (! ANCHOR_HAS_BODY(ANCHOR_(node))) break; + set_parent_node_trav(NODE_BODY(node), node); + break; + + case NODE_QUANT: + set_parent_node_trav(NODE_BODY(node), node); + break; + + case NODE_BAG: + if (IS_NOT_NULL(NODE_BODY(node))) + set_parent_node_trav(NODE_BODY(node), node); + { + BagNode* en = BAG_(node); + + if (en->type == BAG_IF_ELSE) { + if (IS_NOT_NULL(en->te.Then)) + set_parent_node_trav(en->te.Then, node); + if (IS_NOT_NULL(en->te.Else)) { + set_parent_node_trav(en->te.Else, node); + } + } + } + break; + + default: + break; + } +} + #ifdef USE_CALL