]> granicus.if.org Git - onig/commitdiff
add set_parent_node_trav()
authorK.Kosako <kkosako0@gmail.com>
Sat, 24 Aug 2019 08:10:22 +0000 (17:10 +0900)
committerK.Kosako <kkosako0@gmail.com>
Sat, 24 Aug 2019 08:10:22 +0000 (17:10 +0900)
src/regcomp.c

index 80ca23868caa5a74d9f1df36b9139444ca650de3..d5d605839b97a99897c66e17f0a36040feb01009 100644 (file)
@@ -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