]> granicus.if.org Git - onig/commitdiff
add onig_scan() (NEW API)
authorK.Kosako <kkosako0@gmail.com>
Wed, 17 Aug 2016 20:23:35 +0000 (05:23 +0900)
committerK.Kosako <kkosako0@gmail.com>
Wed, 17 Aug 2016 20:23:35 +0000 (05:23 +0900)
src/oniguruma.h
src/regexec.c

index 47605c4cede56124946a27a158003631eb62eb92..b14c4157150adbff9cc0cf784f64fe237d6a3a61 100644 (file)
@@ -737,6 +737,8 @@ void onig_free P_((OnigRegex));
 ONIG_EXTERN
 void onig_free_body P_((OnigRegex));
 ONIG_EXTERN
+int onig_scan(regex_t* reg, const UChar* str, const UChar* end, OnigRegion* region, OnigOptionType option, int (*scan_callback)(int, int, OnigRegion*, void*), void* callback_arg);
+ONIG_EXTERN
 int onig_search P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegion* region, OnigOptionType option));
 ONIG_EXTERN
 int onig_match P_((OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* at, OnigRegion* region, OnigOptionType option));
index 282343dfa448664b713e5da38b89cf192d9bb645..87b4b877ea14a328f6ab323e3f5de3e9dbc759aa 100644 (file)
@@ -3736,6 +3736,46 @@ onig_search(regex_t* reg, const UChar* str, const UChar* end,
   return s - str;
 }
 
+extern int
+onig_scan(regex_t* reg, const UChar* str, const UChar* end,
+         OnigRegion* region, OnigOptionType option,
+         int (*scan_callback)(int, int, OnigRegion*, void*),
+         void* callback_arg)
+{
+  int r;
+  int n;
+  int rs;
+  const UChar* start;
+
+  n = 0;
+  start = str;
+  while (1) {
+    r = onig_search(reg, str, end, start, end, region, option);
+    if (r >= 0) {
+      rs = scan_callback(n, r, region, callback_arg);
+      n++;
+      if (rs != 0)
+       return rs;
+
+      if (region->end[0] == start - str)
+       start++;
+      else
+       start = str + region->end[0];
+
+      if (start > end)
+       break;
+    }
+    else if (r == ONIG_MISMATCH) {
+      break;
+    }
+    else { /* error */
+      return r;
+    }
+  }
+
+  return n;
+}
+
 extern OnigEncoding
 onig_get_encoding(regex_t* reg)
 {