summaryrefslogtreecommitdiff
path: root/sample/scan.c
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2016-08-31 03:42:07 +0200
committerJörg Frings-Fürst <debian@jff-webhosting.net>2016-08-31 03:42:07 +0200
commit75ed3a79bf4fdcb71dd709495de544cb6cef17b3 (patch)
tree67e4b404206c31d3d7d52673c12eb9f756db5c64 /sample/scan.c
parentc752981613de81bfa2723749b79e80bf0008f27c (diff)
parenta76fa337cc657dbe669ffb8dbdac606d4d6616f1 (diff)
Merge tag 'upstream/6.1.0'
Upstream version 6.1.0
Diffstat (limited to 'sample/scan.c')
-rw-r--r--sample/scan.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/sample/scan.c b/sample/scan.c
new file mode 100644
index 0000000..ad5ae74
--- /dev/null
+++ b/sample/scan.c
@@ -0,0 +1,88 @@
+/*
+ * scan.c
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include "oniguruma.h"
+
+static int
+scan_callback(int n, int r, OnigRegion* region, void* arg)
+{
+ int i;
+
+ fprintf(stdout, "scan: %d\n", n);
+
+ fprintf(stdout, "match at %d\n", r);
+ for (i = 0; i < region->num_regs; i++) {
+ fprintf(stdout, "%d: (%d-%d)\n", i, region->beg[i], region->end[i]);
+ }
+
+ return 0;
+}
+
+static int
+scan(regex_t* reg, unsigned char* str, unsigned char* end)
+{
+ int r;
+ OnigRegion *region;
+
+ region = onig_region_new();
+
+ r = onig_scan(reg, str, end, region, ONIG_OPTION_NONE, scan_callback, NULL);
+ if (r >= 0) {
+ fprintf(stdout, "total: %d match\n", r);
+ }
+ else { /* error */
+ char s[ONIG_MAX_ERROR_MESSAGE_LEN];
+ onig_error_code_to_str((OnigUChar* )s, r);
+ fprintf(stderr, "ERROR: %s\n", s);
+ return -1;
+ }
+
+ onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
+ return 0;
+}
+
+static int
+exec(OnigEncoding enc, OnigOptionType options, char* apattern, char* astr)
+{
+ int r;
+ unsigned char *end;
+ regex_t* reg;
+ OnigErrorInfo einfo;
+ UChar* pattern_end;
+ UChar* pattern = (UChar* )apattern;
+ UChar* str = (UChar* )astr;
+
+ onig_initialize(&enc, 1);
+
+ pattern_end = pattern + onigenc_str_bytelen_null(enc, pattern);
+
+ r = onig_new(&reg, pattern, pattern_end, options, enc, ONIG_SYNTAX_DEFAULT, &einfo);
+ if (r != ONIG_NORMAL) {
+ char s[ONIG_MAX_ERROR_MESSAGE_LEN];
+ onig_error_code_to_str((OnigUChar* )s, r, &einfo);
+ fprintf(stderr, "ERROR: %s\n", s);
+ return -1;
+ }
+
+ end = str + onigenc_str_bytelen_null(enc, str);
+ r = scan(reg, str, end);
+
+ onig_free(reg);
+ onig_end();
+ return 0;
+}
+
+
+extern int main(int argc, char* argv[])
+{
+ exec(ONIG_ENCODING_UTF8, ONIG_OPTION_NONE,
+ "\\Ga+\\s*", "a aa aaa baaa");
+
+ fprintf(stdout, "\n");
+ exec(ONIG_ENCODING_UTF8, ONIG_OPTION_NONE,
+ "a+\\s*", "a aa aaa baaa");
+
+ return 0;
+}