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