]> granicus.if.org Git - onig/commitdiff
add NST_BACKREF flag
authorK.Kosako <kosako@sofnec.co.jp>
Thu, 29 Jun 2017 07:13:38 +0000 (16:13 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Thu, 29 Jun 2017 07:13:38 +0000 (16:13 +0900)
src/regcomp.c
src/regparse.h

index 01a30c752937d6c7d039b0b8b15a4d2a4715ccbb..a1a63d5245f707f0cfb864484640f5aedcb1a73e 100644 (file)
@@ -2801,10 +2801,13 @@ check_backrefs(Node* node, ScanEnv* env)
       int i;
       BRefNode* br = BREF_(node);
       int* backs = BACKREFS_P(br);
+      MemEnv* mem_env = SCANENV_MEMENV(env);
 
       for (i = 0; i < br->back_num; i++) {
         if (backs[i] > env->num_mem)
           return ONIGERR_INVALID_BACKREF;
+
+        NODE_STATUS_ADD(mem_env[backs[i]].node, NST_BACKREF);
       }
       r = 0;
     }
index 4a821db262c739180394d5db6ef50004b1291cff..6c17d9fb39e4ef9a7fb597bad7b9a516a144812e 100644 (file)
@@ -135,6 +135,7 @@ typedef enum {
 #define NST_NEST_LEVEL            (1<<13)
 #define NST_BY_NUMBER             (1<<14) /* {n,m} */
 #define NST_BY_NAME               (1<<15) /* backref by name */
+#define NST_BACKREF               (1<<16)
 
 
 #define NODE_STATUS(node)           (((Node* )node)->u.base.status)
@@ -156,6 +157,7 @@ typedef enum {
 #define NODE_IS_MARK2(node)           ((NODE_STATUS(node) & NST_MARK2)       != 0)
 #define NODE_IS_NEST_LEVEL(node)      ((NODE_STATUS(node) & NST_NEST_LEVEL)  != 0)
 #define NODE_IS_BY_NAME(node)         ((NODE_STATUS(node) & NST_BY_NAME)     != 0)
+#define NODE_IS_BACKREF(node)         ((NODE_STATUS(node) & NST_BACKREF)     != 0)
 #define NODE_IS_STOP_BT_SIMPLE_REPEAT(node) \
     ((NODE_STATUS(node) & NST_STOP_BT_SIMPLE_REPEAT) != 0)