diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2016-08-31 03:42:07 +0200 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2016-08-31 03:42:07 +0200 |
commit | 75ed3a79bf4fdcb71dd709495de544cb6cef17b3 (patch) | |
tree | 67e4b404206c31d3d7d52673c12eb9f756db5c64 /sample/scan.c | |
parent | c752981613de81bfa2723749b79e80bf0008f27c (diff) | |
parent | a76fa337cc657dbe669ffb8dbdac606d4d6616f1 (diff) |
Merge tag 'upstream/6.1.0'
Upstream version 6.1.0
Diffstat (limited to 'sample/scan.c')
-rw-r--r-- | sample/scan.c | 88 |
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(®, 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; +} |