diff options
Diffstat (limited to 'sample')
-rw-r--r-- | sample/.gitignore | 1 | ||||
-rw-r--r-- | sample/Makefile.am | 8 | ||||
-rw-r--r-- | sample/bug_fix.c | 131 | ||||
-rw-r--r-- | sample/scan.c | 88 |
4 files changed, 225 insertions, 3 deletions
diff --git a/sample/.gitignore b/sample/.gitignore index 963d2e4..79fab44 100644 --- a/sample/.gitignore +++ b/sample/.gitignore @@ -7,4 +7,5 @@ /sql /syntax /user_property +/bug_fix /log* diff --git a/sample/Makefile.am b/sample/Makefile.am index 53f0d08..6799ecd 100644 --- a/sample/Makefile.am +++ b/sample/Makefile.am @@ -6,9 +6,9 @@ LDADD = $(lib_onig) AM_LDFLAGS = -L$(prefix)/lib AM_CPPFLAGS = -I../src -I$(includedir) -TESTS = encode listcap names posix simple sql syntax user_property +TESTS = encode listcap names posix simple sql syntax user_property bug_fix -check_PROGRAMS = encode listcap names posix simple sql syntax user_property +check_PROGRAMS = encode listcap names posix simple sql syntax user_property bug_fix encode_SOURCES = encode.c listcap_SOURCES = listcap.c @@ -18,10 +18,11 @@ simple_SOURCES = simple.c sql_SOURCES = sql.c syntax_SOURCES = syntax.c user_property_SOURCES = user_property.c +bug_fix = bug_fix.c sampledir = . -test: encode listcap names posix simple sql syntax user_property +test: encode listcap names posix simple sql syntax user_property bug_fix $(sampledir)/encode $(sampledir)/listcap $(sampledir)/names @@ -30,3 +31,4 @@ test: encode listcap names posix simple sql syntax user_property $(sampledir)/sql $(sampledir)/syntax $(sampledir)/user_property + $(sampledir)/bug_fix diff --git a/sample/bug_fix.c b/sample/bug_fix.c new file mode 100644 index 0000000..9a45a78 --- /dev/null +++ b/sample/bug_fix.c @@ -0,0 +1,131 @@ +/* + * bug_fix.c + */ +#include <stdio.h> +#include "oniguruma.h" + +static OnigCaseFoldType CF = ONIGENC_CASE_FOLD_MIN; + +static int +search(regex_t* reg, unsigned char* str, unsigned char* end) +{ + int r; + unsigned char *start, *range; + OnigRegion *region; + + region = onig_region_new(); + + start = str; + range = end; + r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE); + if (r >= 0) { + int i; + + fprintf(stderr, "match at %d (%s)\n", r, + ONIGENC_NAME(onig_get_encoding(reg))); + for (i = 0; i < region->num_regs; i++) { + fprintf(stderr, "%d: (%d-%d)\n", i, region->beg[i], region->end[i]); + } + } + else if (r == ONIG_MISMATCH) { + fprintf(stderr, "search fail (%s)\n", + ONIGENC_NAME(onig_get_encoding(reg))); + } + else { /* error */ + char s[ONIG_MAX_ERROR_MESSAGE_LEN]; + onig_error_code_to_str(s, r); + fprintf(stderr, "ERROR: %s\n", s); + fprintf(stderr, " (%s)\n", ONIGENC_NAME(onig_get_encoding(reg))); + return -1; + } + + onig_region_free(region, 1 /* 1:free self, 0:free contents only */); + return 0; +} + +static int +exec_deluxe(OnigEncoding pattern_enc, OnigEncoding str_enc, + OnigOptionType options, char* apattern, char* astr) +{ + int r; + unsigned char *end; + regex_t* reg; + OnigCompileInfo ci; + OnigErrorInfo einfo; + UChar* pattern = (UChar* )apattern; + UChar* str = (UChar* )astr; + + onig_initialize(&str_enc, 1); + + ci.num_of_elements = 5; + ci.pattern_enc = pattern_enc; + ci.target_enc = str_enc; + ci.syntax = ONIG_SYNTAX_DEFAULT; + ci.option = options; + ci.case_fold_flag = CF; + + r = onig_new_deluxe(®, pattern, + pattern + onigenc_str_bytelen_null(pattern_enc, pattern), + &ci, &einfo); + if (r != ONIG_NORMAL) { + char s[ONIG_MAX_ERROR_MESSAGE_LEN]; + onig_error_code_to_str(s, r, &einfo); + fprintf(stderr, "ERROR: %s\n", s); + return -1; + } + + end = str + onigenc_str_bytelen_null(str_enc, str); + r = search(reg, str, end); + + onig_free(reg); + onig_end(); + 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 = (UChar* )apattern; + UChar* str = (UChar* )astr; + + onig_initialize(&enc, 1); + + r = onig_new(®, pattern, + pattern + onigenc_str_bytelen_null(enc, pattern), + options, enc, ONIG_SYNTAX_DEFAULT, &einfo); + if (r != ONIG_NORMAL) { + char s[ONIG_MAX_ERROR_MESSAGE_LEN]; + onig_error_code_to_str(s, r, &einfo); + fprintf(stderr, "ERROR: %s\n", s); + return -1; + } + + end = str + onigenc_str_bytelen_null(enc, str); + r = search(reg, str, end); + + onig_free(reg); + onig_end(); + return 0; +} + + + +extern int main(int argc, char* argv[]) +{ + /* fix ignore case in look-behind + commit: 3340ec2cc5627172665303fe248c9793354d2251 */ + exec_deluxe(ONIG_ENCODING_UTF8, ONIG_ENCODING_UTF8, + ONIG_OPTION_IGNORECASE, + "(?<=\305\211)a", "\312\274na"); /* \u{0149}a \u{02bc}na */ + + exec(ONIG_ENCODING_UTF8, ONIG_OPTION_NONE, "(\\2)(\\1)", "aa"); /* fail. */ + + exec(ONIG_ENCODING_UTF8, ONIG_OPTION_FIND_LONGEST, + "a*", "aa aaa aaaa aaaaa "); /* match 12-17 */ + + return 0; +} 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; +} |