1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
| /*
| * crnl.c 2007/05/30 K.Kosako
| *
| * !!! You should enable USE_CRNL_AS_LINE_TERMINATOR. !!!
| *
| * USE_CRNL_AS_LINE_TERMINATOR config test program.
| */
| #include <stdio.h>
| #include <string.h>
| #include "oniguruma.h"
|
| static int nfail = 0;
|
| static void result(int no, int from, int to,
| int expected_from, int expected_to)
| {
| fprintf(stderr, "%3d: ", no);
| if (from == expected_from && to == expected_to) {
| fprintf(stderr, "Success\n");
| }
| else {
| fprintf(stderr, "Fail: expected: (%d-%d), result: (%d-%d)\n",
| expected_from, expected_to, from, to);
|
| nfail++;
| }
| }
|
| static int
| x(int no, char* pattern_arg, char* str_arg,
| int expected_from, int expected_to)
| {
| int r;
| unsigned char *start, *range, *end;
| regex_t* reg;
| OnigErrorInfo einfo;
| OnigRegion *region;
| UChar *pattern, *str;
|
| pattern = (UChar* )pattern_arg;
| str = (UChar* )str_arg;
|
| r = onig_new(®, pattern, pattern + strlen((char* )pattern),
| ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, 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;
| }
|
| region = onig_region_new();
|
| end = str + strlen((char* )str);
| start = str;
| range = end;
| r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
| if (r >= 0 || r == ONIG_MISMATCH) {
| result(no, region->beg[0], region->end[0], expected_from, expected_to);
| }
| else if (r == ONIG_MISMATCH) {
| result(no, r, -1, expected_from, expected_to);
| }
| else { /* error */
| char s[ONIG_MAX_ERROR_MESSAGE_LEN];
| onig_error_code_to_str(s, r);
| fprintf(stderr, "ERROR: %s\n", s);
| onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
| onig_free(reg);
| return -1;
| }
|
| onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
| onig_free(reg);
| return 0;
| }
|
| static int
| f(int no, char* pattern_arg, char* str_arg)
| {
| return x(no, pattern_arg, str_arg, -1, -1);
| }
|
| extern int main(int argc, char* argv[])
| {
| x( 1, "", "\r\n", 0, 0);
| x( 2, ".", "\r\n", 0, 1);
| f( 3, "..", "\r\n");
| x( 4, "^", "\r\n", 0, 0);
| x( 5, "\\n^", "\r\nf", 1, 2);
| x( 6, "\\n^a", "\r\na", 1, 3);
| x( 7, "$", "\r\n", 0, 0);
| x( 8, "T$", "T\r\n", 0, 1);
| x( 9, "T$", "T\raT\r\n", 3, 4);
| x(10, "\\z", "\r\n", 2, 2);
| f(11, "a\\z", "a\r\n");
| x(12, "\\Z", "\r\n", 0, 0);
| x(13, "\\Z", "\r\na", 3, 3);
| x(14, "\\Z", "\r\n\r\n\n", 4, 4);
| x(15, "\\Z", "\r\n\r\nX", 5, 5);
| x(16, "a\\Z", "a\r\n", 0, 1);
| x(17, "aaaaaaaaaaaaaaa\\Z", "aaaaaaaaaaaaaaa\r\n", 0, 15);
| x(18, "a|$", "b\r\n", 1, 1);
| x(19, "$|b", "\rb", 1, 2);
| x(20, "a$|ab$", "\r\nab\r\n", 2, 4);
|
| x(21, "a|\\Z", "b\r\n", 1, 1);
| x(22, "\\Z|b", "\rb", 1, 2);
| x(23, "a\\Z|ab\\Z", "\r\nab\r\n", 2, 4);
| x(24, "(?=a$).", "a\r\n", 0, 1);
| f(25, "(?=a$).", "a\r");
| x(26, "(?!a$)..", "a\r", 0, 2);
| x(27, "(?<=a$).\\n", "a\r\n", 1, 3);
| f(28, "(?<!a$).\\n", "a\r\n");
| x(29, "(?=a\\Z).", "a\r\n", 0, 1);
| f(30, "(?=a\\Z).", "a\r");
| x(31, "(?!a\\Z)..", "a\r", 0, 2);
|
| onig_end();
|
| if (nfail > 0) {
| fprintf(stderr, "\n");
| fprintf(stderr, "!!! You have to enable USE_CRNL_AS_LINE_TERMINATOR\n");
| fprintf(stderr, "!!! in regenc.h for this test program.\n");
| fprintf(stderr, "\n");
| }
|
| return 0;
| }
|
|