]> granicus.if.org Git - onig/blob - sample/bug_fix.c
remove include windows.h from oniguruma.h
[onig] / sample / bug_fix.c
1 /*
2  * bug_fix.c
3  */
4 #include <stdio.h>
5 #include "oniguruma.h"
6
7 static OnigCaseFoldType CF = ONIGENC_CASE_FOLD_MIN;
8
9 static int
10 search(regex_t* reg, unsigned char* str, unsigned char* end)
11 {
12   int r;
13   unsigned char *start, *range;
14   OnigRegion *region;
15
16   region = onig_region_new();
17
18   start = str;
19   range = end;
20   r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
21   if (r >= 0) {
22     int i;
23
24     fprintf(stderr, "match at %d  (%s)\n", r,
25             ONIGENC_NAME(onig_get_encoding(reg)));
26     for (i = 0; i < region->num_regs; i++) {
27       fprintf(stderr, "%d: (%d-%d)\n", i, region->beg[i], region->end[i]);
28     }
29   }
30   else if (r == ONIG_MISMATCH) {
31     fprintf(stderr, "search fail (%s)\n",
32             ONIGENC_NAME(onig_get_encoding(reg)));
33   }
34   else { /* error */
35     char s[ONIG_MAX_ERROR_MESSAGE_LEN];
36     onig_error_code_to_str(s, r);
37     fprintf(stderr, "ERROR: %s\n", s);
38     fprintf(stderr, "  (%s)\n", ONIGENC_NAME(onig_get_encoding(reg)));
39     return -1;
40   }
41
42   onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
43   return 0;
44 }
45
46 static int
47 exec_deluxe(OnigEncoding pattern_enc, OnigEncoding str_enc,
48             OnigOptionType options, char* apattern, char* astr)
49 {
50   int r;
51   unsigned char *end;
52   regex_t* reg;
53   OnigCompileInfo ci;
54   OnigErrorInfo einfo;
55   UChar* pattern = (UChar* )apattern;
56   UChar* str     = (UChar* )astr;
57
58   onig_initialize(&str_enc, 1);
59
60   ci.num_of_elements = 5;
61   ci.pattern_enc = pattern_enc;
62   ci.target_enc  = str_enc;
63   ci.syntax      = ONIG_SYNTAX_DEFAULT;
64   ci.option      = options;
65   ci.case_fold_flag  = CF;
66
67   r = onig_new_deluxe(&reg, pattern,
68                       pattern + onigenc_str_bytelen_null(pattern_enc, pattern),
69                       &ci, &einfo);
70   if (r != ONIG_NORMAL) {
71     char s[ONIG_MAX_ERROR_MESSAGE_LEN];
72     onig_error_code_to_str(s, r, &einfo);
73     fprintf(stderr, "ERROR: %s\n", s);
74     return -1;
75   }
76
77   end = str + onigenc_str_bytelen_null(str_enc, str);
78   r = search(reg, str, end);
79
80   onig_free(reg);
81   onig_end();
82   return 0;
83 }
84
85 static int
86 exec(OnigEncoding enc, OnigOptionType options, char* apattern, char* astr)
87 {
88   int r;
89   unsigned char *end;
90   regex_t* reg;
91   OnigErrorInfo einfo;
92   UChar* pattern = (UChar* )apattern;
93   UChar* str     = (UChar* )astr;
94
95   onig_initialize(&enc, 1);
96
97   r = onig_new(&reg, pattern,
98                pattern + onigenc_str_bytelen_null(enc, pattern),
99                options, enc, ONIG_SYNTAX_DEFAULT, &einfo);
100   if (r != ONIG_NORMAL) {
101     char s[ONIG_MAX_ERROR_MESSAGE_LEN];
102     onig_error_code_to_str(s, r, &einfo);
103     fprintf(stderr, "ERROR: %s\n", s);
104     return -1;
105   }
106
107   end = str + onigenc_str_bytelen_null(enc, str);
108   r = search(reg, str, end);
109
110   onig_free(reg);
111   onig_end();
112   return 0;
113 }
114
115
116
117 extern int main(int argc, char* argv[])
118 {
119   /* fix ignore case in look-behind
120      commit: 3340ec2cc5627172665303fe248c9793354d2251 */
121   exec_deluxe(ONIG_ENCODING_UTF8, ONIG_ENCODING_UTF8,
122               ONIG_OPTION_IGNORECASE,
123               "(?<=\305\211)a", "\312\274na"); /* \u{0149}a  \u{02bc}na */
124
125   exec(ONIG_ENCODING_UTF8, ONIG_OPTION_NONE, "(\\2)(\\1)", "aa"); /* fail. */
126
127   exec(ONIG_ENCODING_UTF8, ONIG_OPTION_FIND_LONGEST,
128        "a*", "aa aaa aaaa aaaaa "); /* match 12-17 */
129
130   return 0;
131 }