]> granicus.if.org Git - onig/commitdiff
add sample/count.c
authorK.Kosako <kosako@sofnec.co.jp>
Mon, 26 Feb 2018 01:31:09 +0000 (10:31 +0900)
committerK.Kosako <kosako@sofnec.co.jp>
Mon, 26 Feb 2018 01:31:09 +0000 (10:31 +0900)
sample/.gitignore
sample/Makefile.am
sample/count.c [new file with mode: 0644]

index c85b047ee0f4fcd0c025da4e1f402c586acb7425..e2917e0f620d533561e8f3a983d7854771bc35a3 100644 (file)
@@ -8,5 +8,6 @@
 /syntax
 /user_property
 /callout
+/count
 /bug_fix
 /log*
index 6afae15b96303e93547fe03cce57d15a1112ad66..99486eeb2959f7d13803ad64bf07af59ac5254c9 100644 (file)
@@ -6,7 +6,7 @@ LDADD  = $(lib_onig)
 AM_LDFLAGS  = -L$(prefix)/lib
 AM_CPPFLAGS = -I$(top_srcdir)/src -I$(includedir)
 
-TESTS = encode listcap names posix simple sql syntax user_property callout bug_fix
+TESTS = encode listcap names posix simple sql syntax user_property callout count bug_fix
 
 check_PROGRAMS = $(TESTS)
 
@@ -19,6 +19,7 @@ sql_SOURCES     = sql.c
 syntax_SOURCES  = syntax.c
 user_property_SOURCES = user_property.c
 callout_SOURCES = callout.c
+count_SOURCES   = count.c
 bug_fix         = bug_fix.c
 
 sampledir = .
@@ -33,4 +34,5 @@ test: $(TESTS)
        $(sampledir)/syntax
        $(sampledir)/user_property
        $(sampledir)/callout
+       $(sampledir)/count
        $(sampledir)/bug_fix
diff --git a/sample/count.c b/sample/count.c
new file mode 100644 (file)
index 0000000..ac3b22c
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ * count.c
+ */
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "oniguruma.h"
+
+OnigEncoding ENC = ONIG_ENCODING_UTF8;
+
+static int
+test(char* in_pattern, char* in_str)
+{
+  int r;
+  unsigned char *start, *range, *end;
+  regex_t* reg;
+  OnigErrorInfo einfo;
+  OnigRegion *region;
+  OnigMatchParam* mp;
+  UChar* pattern;
+  UChar* str;
+
+  pattern = (UChar* )in_pattern;
+  str = (UChar* )in_str;
+
+  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),
+       ONIG_OPTION_DEFAULT, ENC, ONIG_SYNTAX_DEFAULT, &einfo);
+  if (r != ONIG_NORMAL) {
+    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
+    onig_error_code_to_str((UChar* )s, r, &einfo);
+    fprintf(stderr, "COMPILE ERROR: %d: %s\n", r, s);
+    return -1;
+  }
+
+  region = onig_region_new();
+  mp     = onig_new_match_param(reg);
+
+  end   = str + strlen((char* )str);
+  start = str;
+  range = end;
+  r = onig_search_with_param(reg, str, end, start, range, region,
+                             ONIG_OPTION_NONE, mp);
+  if (r >= 0) {
+    int slot;
+    OnigValue val;
+    char* tag;
+
+    fprintf(stderr, "match at %d\n", r);
+
+  show_count:
+    tag = "x";
+    slot = 0;
+    r = onig_get_callout_data_by_tag(reg, mp, tag, tag + strlen(tag), slot, 0, &val);
+    if (r != ONIG_NORMAL) goto err;
+
+    fprintf(stdout, "count: %ld\n", val.l);
+  }
+  else if (r == ONIG_MISMATCH) {
+    fprintf(stderr, "search fail\n");
+    goto show_count;
+  }
+  else { /* error */
+    char s[ONIG_MAX_ERROR_MESSAGE_LEN];
+  err:
+    onig_error_code_to_str((UChar* )s, r);
+    fprintf(stderr, "SEARCH ERROR: %d: %s\n", r, s);
+  }
+
+  onig_free_match_param(mp);
+  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
+  onig_free(reg);
+  return r;
+}
+
+extern int main(int argc, char* argv[])
+{
+  int r;
+  int id;
+  UChar* name;
+  OnigEncoding use_encs[1];
+  OnigType arg_types[4];
+  OnigValue opt_defaults[4];
+
+  use_encs[0] = ENC;
+
+  r = onig_initialize(use_encs, sizeof(use_encs)/sizeof(use_encs[0]));
+  if (r != ONIG_NORMAL) return -1;
+
+  r = onig_initialize_builtin_callouts();
+  if (r != ONIG_NORMAL) {
+    fprintf(stderr, "onig_initialize_builtin_callouts(): %d\n", r);
+    return -2;
+  }
+
+  test("abc(.(*COUNT[x]))*(*FAIL)", "abcdefg");
+  test("abc(.(*COUNT[_]))*(.(*COUNT[x]))*d", "abcdefg");
+
+  onig_end();
+  return 0;
+}