1 /*
2  * regset.c
3  */
4 #include <stdio.h>
5 #include <string.h>
6 #include "oniguruma.h"
7 
main(int argc,char * argv[])8 extern int main(int argc, char* argv[])
9 {
10   int r;
11   int i, n;
12   int match_pos;
13   unsigned char *start, *range, *end;
14   OnigRegSet* set;
15   OnigRegSetLead lead;
16   regex_t* reg;
17   OnigErrorInfo einfo;
18   char ebuf[ONIG_MAX_ERROR_MESSAGE_LEN];
19   OnigEncoding use_encs[1];
20 
21   static UChar* str = (UChar* )"aaaaaaaaaaaaaaaaaaaaaaca";
22 
23   static char* pat[] = {
24     "a(.*)b|a(.)c",
25     "^(abc)",
26     "a(.....)c"
27   };
28 
29   use_encs[0] = ONIG_ENCODING_UTF8;
30   onig_initialize(use_encs, sizeof(use_encs)/sizeof(use_encs[0]));
31 
32   r = onig_regset_new(&set, 0, NULL);
33   if (r != ONIG_NORMAL) {
34     onig_error_code_to_str((UChar* )ebuf, r);
35     fprintf(stderr, "ERROR: %s\n", ebuf);
36     onig_end();
37     return -1;
38   }
39 
40   n = sizeof(pat) / sizeof(pat[0]);
41 
42   for (i = 0; i < n; i++) {
43     r = onig_new(&reg, (UChar* )pat[i], (UChar* )(pat[i] + strlen(pat[i])),
44                  ONIG_OPTION_DEFAULT, ONIG_ENCODING_UTF8, ONIG_SYNTAX_DEFAULT,
45                  &einfo);
46     if (r != ONIG_NORMAL) {
47       onig_error_code_to_str((UChar* )ebuf, r, &einfo);
48       fprintf(stderr, "ERROR: %s\n", ebuf);
49       onig_regset_free(set);
50       onig_end();
51       return -1;
52     }
53 
54     r = onig_regset_add(set, reg);
55     if (r != ONIG_NORMAL) {
56       onig_free(reg);
57       onig_regset_free(set);
58       onig_end();
59       return -1;
60     }
61   }
62 
63   end   = str + strlen((char* )str);
64   start = str;
65   range = end;
66   lead = ONIG_REGSET_POSITION_LEAD;
67   //lead = ONIG_REGSET_PRIORITY_TO_REGEX_ORDER;
68   r = onig_regset_search(set, str, end, start, range, lead, ONIG_OPTION_NONE,
69                          &match_pos);
70   if (r >= 0) {
71     OnigRegion *region;
72 
73     fprintf(stderr, "match regex index: %d\n", r);
74     fprintf(stderr, "match position: %d\n", match_pos);
75 
76     region = onig_regset_get_region(set, r);
77     for (i = 0; i < region->num_regs; i++) {
78       fprintf(stderr, "%d: (%d-%d)\n", i, region->beg[i], region->end[i]);
79     }
80   }
81   else if (r == ONIG_MISMATCH) {
82     fprintf(stderr, "search fail\n");
83   }
84   else { /* error */
85     onig_error_code_to_str((UChar* )ebuf, r);
86     fprintf(stderr, "ERROR: %s\n", ebuf);
87     onig_regset_free(set);
88     onig_end();
89     return -1;
90   }
91 
92   onig_regset_free(set);
93   onig_end();
94   return 0;
95 }
96