1 /*
2 * names.c -- example of group name callback.
3 */
4 #include <stdio.h>
5 #include <string.h>
6 #include "oniguruma.h"
7
8 static int
name_callback(const UChar * name,const UChar * name_end,int ngroup_num,int * group_nums,regex_t * reg,void * arg)9 name_callback(const UChar* name, const UChar* name_end,
10 int ngroup_num, int* group_nums,
11 regex_t* reg, void* arg)
12 {
13 int i, gn, ref;
14 char* s;
15 OnigRegion *region = (OnigRegion* )arg;
16
17 for (i = 0; i < ngroup_num; i++) {
18 gn = group_nums[i];
19 ref = onig_name_to_backref_number(reg, name, name_end, region);
20 s = (ref == gn ? "*" : "");
21 fprintf(stderr, "%s (%d): ", name, gn);
22 fprintf(stderr, "(%d-%d) %s\n", region->beg[gn], region->end[gn], s);
23 }
24 return 0; /* 0: continue */
25 }
26
main(int argc,char * argv[])27 extern int main(int argc, char* argv[])
28 {
29 int r;
30 unsigned char *start, *range, *end;
31 regex_t* reg;
32 OnigErrorInfo einfo;
33 OnigRegion *region;
34 OnigEncoding use_encs[1];
35
36 static UChar* pattern = (UChar* )"(?<foo>a*)(?<bar>b*)(?<foo>c*)";
37 static UChar* str = (UChar* )"aaabbbbcc";
38
39 use_encs[0] = ONIG_ENCODING_ASCII;
40 onig_initialize(use_encs, sizeof(use_encs)/sizeof(use_encs[0]));
41
42 r = onig_new(®, pattern, pattern + strlen((char* )pattern),
43 ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);
44 if (r != ONIG_NORMAL) {
45 char s[ONIG_MAX_ERROR_MESSAGE_LEN];
46 onig_error_code_to_str((UChar* )s, r, &einfo);
47 fprintf(stderr, "ERROR: %s\n", s);
48 return -1;
49 }
50
51 fprintf(stderr, "number of names: %d\n", onig_number_of_names(reg));
52
53 region = onig_region_new();
54
55 end = str + strlen((char* )str);
56 start = str;
57 range = end;
58 r = onig_search(reg, str, end, start, range, region, ONIG_OPTION_NONE);
59 if (r >= 0) {
60 fprintf(stderr, "match at %d\n\n", r);
61 r = onig_foreach_name(reg, name_callback, (void* )region);
62 }
63 else if (r == ONIG_MISMATCH) {
64 fprintf(stderr, "search fail\n");
65 }
66 else { /* error */
67 char s[ONIG_MAX_ERROR_MESSAGE_LEN];
68 onig_error_code_to_str((UChar* )s, r);
69 onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
70 onig_free(reg);
71 onig_end();
72 return -1;
73 }
74
75 onig_region_free(region, 1 /* 1:free self, 0:free contents only */);
76 onig_free(reg);
77 onig_end();
78 return 0;
79 }
80