12 #include <sys/types.h>
15 #define __WVRE_REG(n) __wvre_r##n
16 #define __WVRE_DECL_FORM(n) WvString &__WVRE_REG(n) = WvRegex::__wvre_null_reg
17 #define WVREGEX_REGS_DECL \
18 __WVRE_DECL_FORM( 0), __WVRE_DECL_FORM( 1), \
19 __WVRE_DECL_FORM( 2), __WVRE_DECL_FORM( 3), \
20 __WVRE_DECL_FORM( 4), __WVRE_DECL_FORM( 5), \
21 __WVRE_DECL_FORM( 6), __WVRE_DECL_FORM( 7), \
22 __WVRE_DECL_FORM( 8), __WVRE_DECL_FORM( 9), \
23 __WVRE_DECL_FORM(10), __WVRE_DECL_FORM(11), \
24 __WVRE_DECL_FORM(12), __WVRE_DECL_FORM(13), \
25 __WVRE_DECL_FORM(14), __WVRE_DECL_FORM(15), \
26 __WVRE_DECL_FORM(16), __WVRE_DECL_FORM(17), \
27 __WVRE_DECL_FORM(18), __WVRE_DECL_FORM(19)
28 #define __WVRE_CALL_FORM(n) __WVRE_REG(n)
29 #define WVREGEX_REGS_CALL \
30 __WVRE_CALL_FORM( 0), __WVRE_CALL_FORM( 1), \
31 __WVRE_CALL_FORM( 2), __WVRE_CALL_FORM( 3), \
32 __WVRE_CALL_FORM( 4), __WVRE_CALL_FORM( 5), \
33 __WVRE_CALL_FORM( 6), __WVRE_CALL_FORM( 7), \
34 __WVRE_CALL_FORM( 8), __WVRE_CALL_FORM( 9), \
35 __WVRE_CALL_FORM(10), __WVRE_CALL_FORM(11), \
36 __WVRE_CALL_FORM(12), __WVRE_CALL_FORM(13), \
37 __WVRE_CALL_FORM(14), __WVRE_CALL_FORM(15), \
38 __WVRE_CALL_FORM(16), __WVRE_CALL_FORM(17), \
39 __WVRE_CALL_FORM(18), __WVRE_CALL_FORM(19)
53 bool match(WvStringParm
string,
int eflags,
54 size_t nmatch, regmatch_t pmatch[])
const;
56 virtual void seterr(
int _errnum);
58 bool _match(WvStringParm
string,
int eflags,
59 int &match_start,
int &match_end, WVREGEX_REGS_DECL)
const
61 regmatch_t pmatch[21];
64 #define __WVRE_COUNT_REGS(n) \
65 if ( &__WVRE_REG(n) != &__wvre_null_reg) ++nmatch
67 __WVRE_COUNT_REGS( 0); __WVRE_COUNT_REGS( 1);
68 __WVRE_COUNT_REGS( 2); __WVRE_COUNT_REGS( 3);
69 __WVRE_COUNT_REGS( 4); __WVRE_COUNT_REGS( 5);
70 __WVRE_COUNT_REGS( 6); __WVRE_COUNT_REGS( 7);
71 __WVRE_COUNT_REGS( 8); __WVRE_COUNT_REGS( 9);
72 __WVRE_COUNT_REGS(10); __WVRE_COUNT_REGS(11);
73 __WVRE_COUNT_REGS(12); __WVRE_COUNT_REGS(13);
74 __WVRE_COUNT_REGS(14); __WVRE_COUNT_REGS(15);
75 __WVRE_COUNT_REGS(16); __WVRE_COUNT_REGS(17);
76 __WVRE_COUNT_REGS(18); __WVRE_COUNT_REGS(19);
78 if (!match(
string, eflags, nmatch, pmatch))
return false;
80 match_start = pmatch[0].rm_so;
81 match_end = pmatch[0].rm_eo;
83 #define __WVRE_STORE_REGS(n) \
84 if (&__WVRE_REG(n) != &__wvre_null_reg \
85 && pmatch[n+1].rm_so != -1 && pmatch[n+1].rm_eo != -1) \
87 int len = pmatch[n+1].rm_eo-pmatch[n+1].rm_so; \
88 __WVRE_REG(n).setsize(len+1); \
89 memcpy(__WVRE_REG(n).edit(), &string[pmatch[n+1].rm_so], len); \
90 __WVRE_REG(n).edit()[len] = '\0'; \
93 __WVRE_STORE_REGS( 0); __WVRE_STORE_REGS( 1);
94 __WVRE_STORE_REGS( 2); __WVRE_STORE_REGS( 3);
95 __WVRE_STORE_REGS( 4); __WVRE_STORE_REGS( 5);
96 __WVRE_STORE_REGS( 6); __WVRE_STORE_REGS( 7);
97 __WVRE_STORE_REGS( 8); __WVRE_STORE_REGS( 9);
98 __WVRE_STORE_REGS(10); __WVRE_STORE_REGS(11);
99 __WVRE_STORE_REGS(12); __WVRE_STORE_REGS(13);
100 __WVRE_STORE_REGS(14); __WVRE_STORE_REGS(15);
101 __WVRE_STORE_REGS(16); __WVRE_STORE_REGS(17);
102 __WVRE_STORE_REGS(18); __WVRE_STORE_REGS(19);
116 EXTENDED = REG_EXTENDED,
122 NEWLINE = REG_NEWLINE
124 static const int default_cflags;
137 static const int default_eflags;
156 WvRegex(WvStringParm regex,
int cflags = default_cflags) : have_preg(false)
157 {
set(regex, cflags); }
167 bool set(WvStringParm regex,
int cflags = default_cflags);
183 bool match(WvStringParm
string, WVREGEX_REGS_DECL)
const
185 int match_start, match_end;
186 return _match(
string, default_eflags,
187 match_start, match_end, WVREGEX_REGS_CALL);
197 bool match(WvStringParm
string,
int eflags, WVREGEX_REGS_DECL)
const
199 int match_start, match_end;
200 return _match(
string, eflags,
201 match_start, match_end, WVREGEX_REGS_CALL);
231 int &match_start,
int &match_end,
232 WVREGEX_REGS_DECL)
const
234 return _match(
string, default_eflags,
235 match_start, match_end, WVREGEX_REGS_CALL);
251 int &match_start,
int &match_end,
252 WVREGEX_REGS_DECL)
const
254 return _match(
string, eflags,
255 match_start, match_end, WVREGEX_REGS_CALL);
259 #endif // __WVREGEX_H