]> granicus.if.org Git - onig/commitdiff
add max_tag_num and tag_list member into RegexExt
authorK.Kosako <kosako@sofnec.co.jp>
Thu, 15 Feb 2018 07:34:51 +0000 (16:34 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Thu, 15 Feb 2018 07:34:51 +0000 (16:34 +0900)
src/regcomp.c
src/regint.h
src/regparse.c

index d3a768163c565c918105fb7fd7c93aef09371005..5355230bf523696edc366047287051906bc999a9 100644 (file)
@@ -5923,6 +5923,8 @@ onig_get_regex_ext(regex_t* reg)
     ext->pattern     = 0;
     ext->pattern_end = 0;
     ext->tag_table   = 0;
+    ext->max_tag_num = 0;
+    ext->tag_list    = 0;
 
     REG_EXTPL(reg) = (void* )ext;
   }
@@ -5940,6 +5942,9 @@ free_regex_ext(RegexExt* ext)
     if (IS_NOT_NULL(ext->tag_table))
       onig_callout_tag_table_free(ext->tag_table);
 
+    if (IS_NOT_NULL(ext->tag_list))
+      xfree(ext->tag_list);
+
     xfree(ext);
   }
 }
index 32005f4ba13e43e0d653ff58b9c54facfa757171..9b0df6892fb5cde2c21339afba790a09094cc7e7 100644 (file)
@@ -261,6 +261,8 @@ typedef struct {
   UChar* pattern;
   UChar* pattern_end;
   void*  tag_table;
+  int    max_tag_num;
+  int*   tag_list;    /* index: from 0 to max_tag_num */
 } RegexExt;
 
 #define REG_EXTP(reg)      ((RegexExt* )((reg)->chain))
index b199f48b742e7e2faf949c376c7e0f35d3392923..62be4358e4dbb00f7e938665b7c1851192dc8fd0 100644 (file)
@@ -1529,6 +1529,35 @@ onig_callout_names_free(void)
 typedef st_table   CalloutTagTable;
 typedef int        CalloutTagVal;
 
+#define CALLOUT_TAG_LIST_FLAG_TAG_EXIST     (1<<0)
+
+static int
+i_callout_tag_list_set(UChar* key, CalloutTagVal e, void* arg)
+{
+  RegexExt* ext = (RegexExt* )arg;
+
+  ext->tag_list[e] |= CALLOUT_TAG_LIST_FLAG_TAG_EXIST;
+  return ST_CONTINUE;
+}
+
+static void
+set_callout_tag_list_values(RegexExt* ext)
+{
+  onig_st_foreach((CalloutTagTable *)ext->tag_table, i_callout_tag_list_set,
+                  (st_data_t )ext);
+}
+
+extern int
+onig_callout_tag_is_exist_at_num(regex_t* reg, int callout_num)
+{
+  RegexExt* ext = REG_EXTP(reg);
+
+  if (IS_NULL(ext) || IS_NULL(ext->tag_list)) return 0;
+  if (callout_num > ext->max_tag_num) return 0;
+
+  return (ext->tag_list[callout_num] & CALLOUT_TAG_LIST_FLAG_TAG_EXIST) != 0 ? 1 : 0;
+}
+
 static int
 i_free_callout_tag_entry(UChar* key, CalloutTagVal e, void* arg ARG_UNUSED)
 {
@@ -7598,6 +7627,9 @@ onig_parse_tree(Node** root, const UChar* pattern, const UChar* end,
 {
   int r;
   UChar* p;
+#ifdef USE_CALLOUT
+  RegexExt* ext;
+#endif
 
   names_clear(reg);
 
@@ -7631,6 +7663,22 @@ onig_parse_tree(Node** root, const UChar* pattern, const UChar* end,
 #endif
 
   reg->num_mem = env->num_mem;
+
+#ifdef USE_CALLOUT
+  if (env->max_tag_num > 0) {
+    ext = onig_get_regex_ext(env->reg);
+    CHECK_NULL_RETURN_MEMERR(ext);
+
+    ext->max_tag_num = env->max_tag_num;
+
+    size_t n = sizeof(*(ext->tag_list)) * (ext->max_tag_num + 1);
+    ext->tag_list = xmalloc(n);
+    CHECK_NULL_RETURN_MEMERR(ext->tag_list);
+    xmemset(ext->tag_list, 0, n);
+    set_callout_tag_list_values(ext);
+  }
+#endif
+
   return r;
 }