33 #define WARN_BUFSIZE 256
35 #define CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS
84 #ifdef DEFAULT_WARN_FUNCTION
85 static OnigWarnFunc
onig_warn = (OnigWarnFunc )DEFAULT_WARN_FUNCTION;
90 #ifdef DEFAULT_VERB_WARN_FUNCTION
91 static OnigWarnFunc
onig_verb_warn = (OnigWarnFunc )DEFAULT_VERB_WARN_FUNCTION;
126 if (r != 0)
return r;
132 #define BACKREF_REL_TO_ABS(rel_no, env) \
133 ((env)->num_mem + 1 + (rel_no))
135 #define ONOFF(v,f,negative) (negative) ? ((v) &= ~(f)) : ((v) |= (f))
137 #define MBCODE_START_POS(enc) \
138 (OnigCodePoint )(ONIGENC_MBC_MINLEN(enc) > 1 ? 0 : 0x80)
140 #define SET_ALL_MULTI_BYTE_RANGE(enc, pbuf) \
141 add_code_range_to_buf(pbuf, env, MBCODE_START_POS(enc), ONIG_LAST_CODE_POINT)
143 #define ADD_ALL_MULTI_BYTE_RANGE(enc, mbuf) do {\
144 if (! ONIGENC_IS_SINGLEBYTE(enc)) {\
145 r = SET_ALL_MULTI_BYTE_RANGE(enc, &(mbuf));\
151 #define BITSET_SET_BIT_CHKDUP(bs, pos) do { \
152 if (BITSET_AT(bs, pos)) CC_DUP_WARN(env); \
153 BS_ROOM(bs, pos) |= BS_BIT(pos); \
156 #define BITSET_IS_EMPTY(bs,empty) do {\
159 for (i = 0; i < BITSET_SIZE; i++) {\
188 for (i = 0; i <
BITSET_SIZE; i++) { bs[i] = ~(bs[i]); }
195 for (i = 0; i <
BITSET_SIZE; i++) { to[i] = ~(from[i]); }
202 for (i = 0; i <
BITSET_SIZE; i++) { dest[i] &= bs[i]; }
209 for (i = 0; i <
BITSET_SIZE; i++) { dest[i] |= bs[i]; }
216 for (i = 0; i <
BITSET_SIZE; i++) { dest[i] = bs[i]; }
234 ptrdiff_t len = end - src;
237 dest[len] = (
UChar )0;
241 #ifdef USE_NAMED_GROUP
256 for (i = 0; i < term_len; i++)
257 r[slen + i] = (
UChar )0;
268 #define PFETCH_READY UChar* pfetch_prev = NULL; (void)pfetch_prev
270 #define PFETCH_READY UChar* pfetch_prev
272 #define PEND (p < end ? 0 : 1)
273 #define PUNFETCH p = pfetch_prev
276 p += enclen(enc, p, end); \
278 #define PFETCH(c) do { \
279 c = ((enc->max_enc_len == 1) ? *p : ONIGENC_MBC_TO_CODE(enc, p, end)); \
281 p += enclen(enc, p, end); \
284 #define PPEEK (p < end ? ONIGENC_MBC_TO_CODE(enc, p, end) : PEND_VALUE)
285 #define PPEEK_IS(c) (PPEEK == (OnigCodePoint )c)
288 strcat_capa(UChar* dest, UChar* dest_end,
const UChar* src,
const UChar* src_end,
306 const UChar* src,
const UChar* src_end,
size_t capa)
318 #ifdef USE_ST_LIBRARY
336 if ((x->
end - x->
s) != (y->
end - y->
s))
342 c = (int )*p - (
int )*q;
343 if (c != 0)
return c;
360 val = val * 997 + (int )*p++;
363 return val + (val >> 5);
398 key->
s = (
UChar* )str_key;
410 #ifdef USE_NAMED_GROUP
412 #define INIT_NAME_BACKREFS_ALLOC_NUM 8
423 #ifdef USE_ST_LIBRARY
435 fprintf(fp,
"%s: ", e->
name);
442 if (i > 0) fprintf(fp,
", ");
456 fprintf(fp,
"name table\n");
538 int (*
func)(
const UChar*,
const UChar*,
int,
int*,
regex_t*,
void*),
void*
arg)
596 #define INIT_NAMES_ALLOC_NUM 8
613 fprintf(fp,
"name table\n");
614 for (i = 0; i < t->num; i++) {
616 fprintf(fp,
"%s: ", e->
name);
625 if (j > 0) fprintf(fp,
", ");
645 for (i = 0; i < t->num; i++) {
689 len = name_end -
name;
690 for (i = 0; i < t->num; i++) {
701 int (*
func)(
const UChar*,
const UChar*,
int,
int*,
regex_t*,
void*),
void*
arg)
708 for (i = 0; i < t->num; i++) {
713 if (r != 0)
return r;
739 if (name_end - name <= 0)
744 #ifdef USE_ST_LIBRARY
760 e->name_len = name_end -
name;
763 e->back_refs = (
int* )
NULL;
768 alloc = INIT_NAMES_ALLOC_NUM;
769 t = (NameTable* )
xmalloc(
sizeof(NameTable));
784 else if (t->num == t->alloc) {
788 alloc = t->alloc * 2;
795 for (i = t->num; i < t->alloc; i++) {
797 t->e[i].name_len = 0;
798 t->e[i].back_num = 0;
799 t->e[i].back_alloc = 0;
800 t->e[i].back_refs = (
int* )
NULL;
807 e->name_len = name_end -
name;
849 const UChar* name_end,
int** nums)
884 for (i = n - 1; i >= 0; i--) {
897 const UChar* name_end,
int** nums)
911 int (*
func)(
const UChar*,
const UChar*,
int,
int*,
regex_t*,
void*),
void* arg)
929 #ifdef USE_NAMED_GROUP
941 #define INIT_SCANENV_MEMNODES_ALLOC_SIZE 16
956 #ifdef USE_NAMED_GROUP
965 #ifdef USE_COMBINATION_EXPLOSION_CHECK
966 env->num_comb_exp_check = 0;
967 env->comb_exp_max_regnum = 0;
968 env->curr_max_regnum = 0;
969 env->has_recursion = 0;
997 for (i = env->
num_mem + 1; i < alloc; i++)
1020 #ifdef USE_PARSE_TREE_NODE_RECYCLE
1034 switch (
NTYPE(node)) {
1036 if (
NSTR(node)->capa != 0 &&
1048 #ifdef USE_PARSE_TREE_NODE_RECYCLE
1076 if (
NQTFR(node)->target)
1096 #ifdef USE_PARSE_TREE_NODE_RECYCLE
1110 #ifdef USE_PARSE_TREE_NODE_RECYCLE
1119 FreeNodeList = FreeNodeList->
next;
1132 #ifdef USE_PARSE_TREE_NODE_RECYCLE
1135 node = (
Node* )FreeNodeList;
1136 FreeNodeList = FreeNodeList->
next;
1186 for (i = 0; i < n; i++) {
1189 if (j >= sb_out)
goto sb_end;
1205 if (n == 0)
goto is_null;
1209 bbuf->
alloc = n + 1;
1211 bbuf->
p = (
UChar* )((
void* )ranges);
1228 NCTYPE(node)->ascii_range = ascii_range;
1300 NANCHOR(node)->ascii_range = 0;
1307 int exist_level,
int nest_level,
1317 NBREF(node)->state = 0;
1318 NBREF(node)->back_num = back_num;
1319 NBREF(node)->back_dynamic = (
int* )
NULL;
1323 #ifdef USE_BACKREF_WITH_LEVEL
1324 if (exist_level != 0) {
1326 NBREF(node)->nest_level = nest_level;
1330 for (i = 0; i < back_num; i++) {
1331 if (backrefs[i] <= env->num_mem &&
1339 for (i = 0; i < back_num; i++)
1340 NBREF(node)->back_static[i] = backrefs[i];
1343 int* p = (
int* )
xmalloc(
sizeof(
int) * back_num);
1348 NBREF(node)->back_dynamic = p;
1349 for (i = 0; i < back_num; i++)
1355 #ifdef USE_SUBEXP_CALL
1363 NCALL(node)->state = 0;
1366 NCALL(node)->name_end = name_end;
1367 NCALL(node)->group_num = gnum;
1379 NQTFR(node)->state = 0;
1381 NQTFR(node)->lower = lower;
1382 NQTFR(node)->upper = upper;
1383 NQTFR(node)->greedy = 1;
1387 NQTFR(node)->is_refered = 0;
1391 #ifdef USE_COMBINATION_EXPLOSION_CHECK
1392 NQTFR(node)->comb_exp_check_num = 0;
1429 #ifdef USE_SUBEXP_CALL
1447 ptrdiff_t addlen = end - s;
1450 ptrdiff_t len =
NSTR(node)->end -
NSTR(node)->s;
1456 if (capa <=
NSTR(node)->capa) {
1468 NSTR(node)->capa = (int )capa;
1474 NSTR(node)->end =
NSTR(node)->s + len + addlen;
1501 if (num < 0)
return num;
1509 NSTR(node)->flag = flag;
1510 NSTR(node)->capa = 0;
1518 if (
NSTR(node)->capa != 0 &&
1523 NSTR(node)->capa = 0;
1524 NSTR(node)->flag = 0;
1536 NSTR(node)->capa = 0;
1537 NSTR(node)->flag = 0;
1583 if (sn->
end > sn->
s) {
1585 if (p && p > sn->
s) {
1598 if (sn->
end > sn->
s) {
1599 return ((
enclen(enc, sn->
s, sn->
end) < sn->
end - sn->
s) ? 1 : 0);
1604 #ifdef USE_PAD_TO_SHORT_BYTE_CHAR
1606 node_str_head_pad(
StrNode* sn,
int num, UChar val)
1611 len = sn->
end - sn->
s;
1616 for (i = 0; i < num; i++) {
1625 unsigned int num, val;
1638 num = num * 10 + val;
1654 unsigned int num, val;
1659 restlen = maxlen - minlen;
1661 while (!
PEND && maxlen-- != 0) {
1675 if (maxlen > restlen)
1686 unsigned int num, val;
1691 while (!
PEND && maxlen-- != 0) {
1698 num = (num << 3) + val;
1710 #define BBUF_WRITE_CODE_POINT(bbuf,pos,code) \
1711 BBUF_WRITE(bbuf, pos, &(code), SIZE_CODE_POINT)
1720 #define INIT_MULTI_BYTE_RANGE_SIZE (SIZE_CODE_POINT * 5)
1745 n = from; from = to; to = n;
1761 bound = (from == 0) ? 0 : n;
1762 for (low = 0; low < bound; ) {
1763 x = (low + bound) >> 1;
1764 if (from - 1 > data[x*2 + 1])
1771 for (bound = n; high < bound; ) {
1772 x = (high + bound) >> 1;
1773 if (to + 1 >= data[x*2])
1782 inc_n = low + 1 - high;
1787 if (checkdup && from <= data[low*2+1]
1788 && (data[low*2] <= from || data[low*2+1] <= to))
1790 if (from > data[low*2])
1792 if (to < data[(high - 1)*2 + 1])
1793 to = data[(high - 1)*2 + 1];
1861 if (n <= 0)
goto set_all;
1865 for (i = 0; i < n; i++) {
1868 if (pre <= from - 1) {
1870 if (r != 0)
return r;
1881 #define SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2) do {\
1884 tnot = not1; not1 = not2; not2 = tnot; \
1885 tbuf = bbuf1; bbuf1 = bbuf2; bbuf2 = tbuf; \
1898 if (not1 != 0 || not2 != 0)
1928 if (not2 == 0 && not1 == 0) {
1931 else if (not1 == 0) {
1934 if (r != 0)
return r;
1936 for (i = 0; i < n1; i++) {
1940 if (r != 0)
return r;
1952 for (i = 0; i < n; i++) {
1955 if (from2 < from1) {
1956 if (to2 < from1)
continue;
1961 else if (from2 <= to1) {
1963 if (from1 <= from2 - 1) {
1965 if (r != 0)
return r;
1976 if (from1 > to1)
break;
1980 if (r != 0)
return r;
2014 if (not2 == 0 && not1 == 0) {
2015 for (i = 0; i < n1; i++) {
2018 for (j = 0; j < n2; j++) {
2021 if (from2 > to1)
break;
2022 if (to2 < from1)
continue;
2023 from =
MAX(from1, from2);
2026 if (r != 0)
return r;
2030 else if (not1 == 0) {
2031 for (i = 0; i < n1; i++) {
2035 if (r != 0)
return r;
2047 BBuf *buf1, *buf2, *pbuf = 0;
2067 if (bsr1 != dest->
bs) {
2076 if (not1 != 0 && not2 != 0) {
2081 if (r == 0 && not1 != 0) {
2105 BBuf *buf1, *buf2, *pbuf = 0;
2125 if (bsr1 != dest->
bs) {
2134 if (not1 != 0 && not2 != 0) {
2139 if (r == 0 && not1 != 0) {
2166 case 'n':
return '\n';
2167 case 't':
return '\t';
2168 case 'r':
return '\r';
2169 case 'f':
return '\f';
2170 case 'a':
return '\007';
2171 case 'b':
return '\010';
2172 case 'e':
return '\033';
2179 if ((
'a' <= c && c <=
'z') || (
'A' <= c && c <=
'Z'))
2187 #ifdef USE_NO_INVALID_QUANTIFIER
2188 #define is_invalid_quantifier_target(node) 0
2193 switch (
NTYPE(node)) {
2228 if (q->
lower == 0) {
2229 if (q->
upper == 1)
return 0;
2232 else if (q->
lower == 1) {
2237 if (q->
lower == 0) {
2238 if (q->
upper == 1)
return 3;
2241 else if (q->
lower == 1) {
2278 if (pnum < 0 || cnum < 0)
return ;
2280 switch (ReduceTypeTable[cnum][pnum]) {
2374 #ifdef USE_BACKREF_WITH_LEVEL
2396 int low, up, syn_allow, non_low = 0;
2414 if (c ==
')' || c ==
'(' || c ==
'|') {
2434 if (
PEND)
goto invalid;
2458 if (
PEND)
goto invalid;
2464 if (c !=
'}')
goto invalid;
2506 if (v < 0)
return v;
2509 c = ((c & 0xff) | 0x80);
2536 if (v < 0)
return v;
2574 #ifdef USE_NAMED_GROUP
2575 #ifdef USE_BACKREF_WITH_LEVEL
2583 UChar** rname_end,
ScanEnv* env,
2584 int* rback_num,
int* rlevel)
2586 int r, sign, is_num, exist_level;
2596 is_num = exist_level = 0;
2615 else if (c ==
'-') {
2628 if (c == end_code || c ==
')' || c ==
'+' || c ==
'-') {
2647 if (r == 0 && c != end_code) {
2648 if (c ==
'+' || c ==
'-') {
2650 int flag = (c ==
'-' ? -1 : 1);
2657 *rlevel = (level * flag);
2675 else if (*rback_num == 0)
goto err;
2680 *rname_end = name_end;
2682 return (exist_level ? 1 : 0);
2697 UChar** rname_end,
ScanEnv* env,
int* rback_num,
int ref)
2699 int r, is_num, sign;
2733 else if (c ==
'-') {
2753 if (c == end_code || c ==
')') {
2778 if (c != end_code) {
2786 else if (*rback_num == 0) {
2794 *rname_end = name_end;
2802 if (c == end_code || c ==
')')
2816 UChar** rname_end,
ScanEnv* env,
int* rback_num,
int ref)
2818 int r, is_num, sign;
2831 *rname_end = name_end = end;
2848 else if (c ==
'-') {
2862 if (c == end_code || c ==
')')
break;
2866 if (r == 0 && c != end_code) {
2874 else if (*rback_num == 0) {
2880 *rname_end = name_end;
2893 UChar* pat, UChar* pat_end,
const UChar *fmt, va_list args);
2900 va_start(args, fmt);
2903 (
const UChar *)fmt, args);
2962 q = p +
enclen(enc, p, to);
2964 for (i = 1; i < n && q < to; i++) {
2966 if (x != s[i])
break;
2967 q += enclen(enc, q, to);
2997 q = p +
enclen(enc, p, to);
2999 for (i = 1; i < n && q < to; i++) {
3001 if (x != s[i])
break;
3002 q += enclen(enc, q, to);
3004 if (i >= n)
return 1;
3005 p += enclen(enc, p, to);
3009 if (x == bad)
return 0;
3010 else if (x ==
MC_ESC(syn)) in_esc = 1;
3043 else if (c ==
'-') {
3046 else if (c ==
MC_ESC(syn)) {
3059 tok->
u.
prop.not = 0;
3064 tok->
u.
prop.not = 1;
3069 tok->
u.
prop.not = 0;
3074 tok->
u.
prop.not = 1;
3079 tok->
u.
prop.not = 0;
3084 tok->
u.
prop.not = 1;
3090 tok->
u.
prop.not = 0;
3096 tok->
u.
prop.not = 1;
3106 tok->
u.
prop.not = (c ==
'P' ? 1 : 0);
3111 tok->
u.
prop.not = (tok->
u.
prop.not == 0 ? 1 : 0);
3177 case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
3195 if (num < 0)
return num;
3196 if (tok->
u.
c != num) {
3203 else if (c ==
'[') {
3227 else if (c ==
'&') {
3240 #ifdef USE_NAMED_GROUP
3255 #ifdef USE_BACKREF_WITH_LEVEL
3258 env, &back_num, &tok->
u.
backref.level);
3259 if (r == 1) tok->
u.
backref.exist_level = 1;
3260 else tok->
u.
backref.exist_level = 0;
3262 r =
fetch_name(&p, end, &name_end, env, &back_num, 1);
3264 if (r < 0)
return r;
3266 if (back_num != 0) {
3274 if (back_num > env->
num_mem ||
3292 for (i = 0; i < num; i++) {
3293 if (backs[i] > env->
num_mem ||
3395 if (r < 0)
return r;
3396 if (r == 0)
goto greedy_check;
3399 goto possessive_check;
3425 tok->
u.
prop.not = 0;
3432 tok->
u.
prop.not = 1;
3451 #ifdef USE_WORD_BEGIN_END
3471 tok->
u.
prop.not = 0;
3478 tok->
u.
prop.not = 1;
3485 tok->
u.
prop.not = 0;
3492 tok->
u.
prop.not = 1;
3499 tok->
u.
prop.not = 0;
3506 tok->
u.
prop.not = 1;
3597 case '1':
case '2':
case '3':
case '4':
3598 case '5':
case '6':
case '7':
case '8':
case '9':
3607 (num <= env->num_mem || num <= 9)) {
3617 #ifdef USE_BACKREF_WITH_LEVEL
3624 if (c ==
'8' || c ==
'9') {
3644 else if (c !=
'0') {
3649 #ifdef USE_NAMED_GROUP
3653 if (c ==
'<' || c ==
'\'') {
3655 if (r < 0)
return r;
3665 #if defined(USE_SUBEXP_CALL) || defined(USE_NAMED_GROUP)
3667 #ifdef USE_NAMED_GROUP
3672 if (r < 0)
return r;
3678 #ifdef USE_SUBEXP_CALL
3681 if (c ==
'<' || c ==
'\'') {
3682 int gnum = -1, rel = 0;
3695 else if (cnext ==
'+') {
3702 if (r < 0)
return r;
3706 tok->
u.
call.name = prev;
3707 tok->
u.
call.name_end = name_end;
3708 tok->
u.
call.gnum = gnum;
3709 tok->
u.
call.rel = rel;
3732 tok->
u.
prop.not = (c ==
'P' ? 1 : 0);
3737 tok->
u.
prop.not = (tok->
u.
prop.not == 0 ? 1 : 0);
3769 if (num < 0)
return num;
3771 if (tok->
u.
c != num) {
3785 #ifdef USE_VARIABLE_META_CHARS
3793 goto zero_or_one_time;
3795 goto one_or_more_time;
3806 #ifdef USE_VARIABLE_META_CHARS
3814 #ifdef USE_VARIABLE_META_CHARS
3825 #ifdef USE_VARIABLE_META_CHARS
3836 #ifdef USE_VARIABLE_META_CHARS
3848 if (r < 0)
return r;
3849 if (r == 0)
goto greedy_check;
3852 goto possessive_check;
3877 if (c ==
')')
break;
3882 #ifdef USE_PERL_SUBEXP_CALL
3892 if (c ==
'R' || c ==
'0') {
3896 name_end = name = p;
3907 if (r < 0)
return r;
3912 tok->
u.
call.name_end = name_end;
3913 tok->
u.
call.gnum = gnum;
3914 tok->
u.
call.rel = 0;
3917 else if ((c ==
'-' || c ==
'+') &&
3932 if (r < 0)
return r;
3936 tok->
u.
call.name_end = name_end;
3937 tok->
u.
call.gnum = gnum;
3938 tok->
u.
call.rel = 1;
3943 #ifdef USE_CAPITAL_P_NAMED_GROUP
3955 if (r < 0)
return r;
3958 else if (c ==
'>') {
3961 if (r < 0)
return r;
3965 tok->
u.
call.name_end = name_end;
3966 tok->
u.
call.gnum = gnum;
3967 tok->
u.
call.rel = 0;
4021 case ' ':
case '\t':
case '\n':
case '\r':
case '\f':
4032 #ifdef USE_VARIABLE_META_CHARS
4050 for (i = 0; i < n; i++) {
4057 if (r != 0)
return r;
4068 for ( ; i < n; i++) {
4072 if (r != 0)
return r;
4078 for (i = 0; i < n; i++) {
4088 for (j = prev; j < sb_out; j++) {
4095 for (i = 0; i < n; i++) {
4099 if (r != 0)
return r;
4103 if (prev < 0x7fffffff) {
4105 if (r != 0)
return r;
4115 int maxcode, ascii_range;
4203 for (c = 0; c < maxcode; c++) {
4214 for (c = 0; c < maxcode; c++) {
4242 #define POSIX_BRACKET_CHECK_LIMIT_LENGTH 20
4243 #define POSIX_BRACKET_NAME_MIN_LEN 4
4278 goto not_posix_bracket;
4289 if (r != 0)
return r;
4300 while (!
PEND && ((c =
PPEEK) !=
':') && c !=
']') {
4304 if (c ==
':' && !
PEND) {
4322 UChar *prev, *start, *p = *src;
4338 else if (c ==
'(' || c ==
')' || c ==
'{' || c ==
'|') {
4356 if (ctype < 0)
return ctype;
4362 if (r != 0)
return r;
4396 if (r < 0)
return r;
4407 int* vs_israw,
int v_israw,
4419 if (r < 0)
return r;
4424 if (intype == *type) {
4426 if (*vs > 0xff || v > 0xff)
4439 if (r < 0)
return r;
4454 if (r < 0)
return r;
4474 *vs_israw = v_israw;
4492 if (ignore_escaped && in_esc) {
4497 if (code == c)
return 1;
4508 int r,
neg, len, fetched, and_start;
4517 int val_israw, in_israw;
4530 if (r < 0)
return r;
4574 int i, base = tok->
base;
4579 if (r < 0)
goto err;
4599 for (i = 1; i < len; i++) {
4634 r =
next_state_val(cc, &vs, v, &val_israw, in_israw, in_type, &val_type,
4636 if (r != 0)
goto err;
4641 if (r < 0)
goto err;
4654 if (r != 0)
return r;
4658 if (r != 0)
goto err;
4666 if (ctype < 0)
return ctype;
4668 if (r != 0)
return r;
4676 if (r < 0)
goto err;
4696 if (r < 0)
goto err;
4710 if (r < 0)
goto err;
4738 if (r != 0)
goto err;
4746 &val_type, &state, env);
4747 if (r != 0)
goto err;
4755 if (r != 0)
goto err;
4780 if (r < 0)
goto err;
4786 &val_type, &state, env);
4787 if (r != 0)
goto err;
4792 if (r != 0)
goto err;
4809 if (is_empty == 0) {
4810 #define NEWLINE_CODE 0x0a
4817 if (r < 0)
goto err;
4832 UChar** src, UChar* end,
ScanEnv* env);
4844 #ifdef USE_NAMED_GROUP
4865 if (r < 0)
return r;
4867 if (r < 0)
return r;
4882 #ifdef USE_NAMED_GROUP
4891 #ifdef USE_CAPITAL_P_NAMED_GROUP
4895 if (c ==
'<')
goto named_group1;
4908 #ifdef USE_NAMED_GROUP
4923 if (r < 0)
return r;
4926 if (num < 0)
return num;
4931 if (r != 0)
return r;
4935 if (list_capture != 0)
4952 #ifdef USE_NAMED_GROUP
4955 if (c ==
'<' || c ==
'\'') {
4989 if (r < 0)
return r;
5001 #ifdef USE_NAMED_GROUP
5002 else if (c ==
'<' || c ==
'\'') {
5008 if (r < 0)
return r;
5020 for (i = 0; i < nums; i++) {
5021 if (backs[i] > env->
num_mem ||
5076 #ifdef USE_POSIXLINE_OPTION
5079 case '-':
case 'i':
case 'm':
case 's':
case 'x':
5080 case 'a':
case 'd':
case 'l':
case 'u':
5090 case '-': neg = 1;
break;
5111 #ifdef USE_POSIXLINE_OPTION
5174 else if (c ==
':') {
5179 if (r < 0)
return r;
5182 if (r < 0)
return r;
5207 if (num < 0)
return num;
5213 if (r < 0)
return r;
5221 NANCHOR(*np)->target = target;
5227 if (r != 0)
return r;
5255 "?",
"*",
"+",
"??",
"*?",
"+?"
5259 "",
"",
"*",
"*?",
"??",
"+ and ??",
"+? and ?"
5272 switch (
NTYPE(target)) {
5293 #ifdef USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR
5296 switch (ReduceTypeTable[targetq_num][nestq_num]) {
5302 onig_syntax_warn(env,
"regular expression has redundant nested repeat operator '%s'",
5303 PopularQStr[targetq_num]);
5310 onig_syntax_warn(env,
"nested repeat operator '%s' and '%s' was replaced with '%s' in regular expression",
5311 PopularQStr[targetq_num], PopularQStr[nestq_num],
5312 ReduceQStr[ReduceTypeTable[targetq_num][nestq_num]]);
5321 if (targetq_num >= 0) {
5322 if (nestq_num >= 0) {
5326 else if (targetq_num == 1 || targetq_num == 2) {
5346 #ifdef USE_SHARED_CCLASS_TABLE
5348 #define THRESHOLD_RANGE_NUM_FOR_SHARE_CCLASS 8
5361 if (x->
enc != y->
enc)
return 1;
5362 if (x->
not != y->
not)
return 1;
5374 for (i = 0; i < (int )
sizeof(key->
enc); i++) {
5375 val = val * 997 + (int )*p++;
5379 for (i = 0; i < (int )
sizeof(key->
type); i++) {
5380 val = val * 997 + (int )*p++;
5384 return val + (val >> 5);
5415 OnigTypeCClassTable =
NULL;
5425 #ifndef CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS
5437 if (r != 0)
return r;
5459 int to_len,
void* arg)
5473 #ifdef CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS
5509 for (i = 0; i < to_len; i++) {
5551 if (num1 < 0)
return num1;
5553 if (num2 < 0)
return num2;
5609 #ifdef USE_UNICODE_PROPERTIES
5616 propname, propname + 1);
5623 if (r != 0)
goto err;
5631 if (r != 0)
goto err;
5635 NQTFR(qn)->target = np2;
5681 bits = (bits & 0x55555555) + ((bits >> 1) & 0x55555555);
5682 bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333);
5683 bits = (bits & 0x0f0f0f0f) + ((bits >> 4) & 0x0f0f0f0f);
5684 bits = (bits & 0x00ff00ff) + ((bits >> 8) & 0x00ff00ff);
5685 return (bits & 0x0000ffff) + ((bits >>16) & 0x0000ffff);
5703 if ((n == 1) && (data[0] == data[1])) {
5720 if (((b1 & (b1 - 1)) == 0) && (c == not_found)) {
5728 if (c != not_found) {
5740 UChar** src, UChar* end,
ScanEnv* env)
5742 int r, len, group = 0;
5750 switch (tok->
type) {
5760 if (r < 0)
return r;
5761 if (r == 1) group = 1;
5768 if (r < 0)
return r;
5784 if (tok->
escaped)
goto tk_raw_byte;
5790 if (r < 0)
return r;
5795 if (r < 0)
return r;
5812 if (r < 0)
return r;
5816 #ifndef NUMBERED_CHAR_IS_NOT_CASE_AMBIG
5824 if (r < 0)
return r;
5849 if (r < 0)
return r;
5852 #ifdef USE_PAD_TO_SHORT_BYTE_CHAR
5856 (void )node_str_head_pad(
NSTR(*np), rem, (
UChar )0);
5867 if (r < 0)
return r;
5879 if (r != 0)
return r;
5880 #ifdef NUMBERED_CHAR_IS_NOT_CASE_AMBIG
5891 UChar *qstart, *qend, *nextp;
5908 switch (tok->
u.
prop.ctype) {
5921 #ifdef USE_SHARED_CCLASS_TABLE
5940 if (
IS_NULL(OnigTypeCClassTable)) {
5943 if (
IS_NULL(OnigTypeCClassTable)) {
5978 if (r != 0)
return r;
5980 #ifdef USE_SHARED_CCLASS_TABLE
5995 if (r != 0)
return r;
6004 if (r != 0)
return r;
6012 if (r != 0)
return r;
6051 NQTFR(qn)->target = *np;
6068 #ifdef USE_SUBEXP_CALL
6071 int gnum = tok->
u.
call.gnum;
6073 if (gnum < 0 || tok->u.call.rel != 0) {
6074 if (gnum > 0) gnum--;
6115 if (r < 0)
return r;
6132 if (tok->
u.
repeat.possessive != 0) {
6162 targetp = &(
NCAR(tmp));
6173 UChar** src, UChar* end,
ScanEnv* env)
6176 Node *node, **headp;
6179 r =
parse_exp(&node, tok, term, src, end, env);
6190 headp = &(
NCDR(*top));
6192 r =
parse_exp(&node, tok, term, src, end, env);
6201 headp = &(
NCDR(node));
6205 headp = &(
NCDR(*headp));
6216 UChar** src, UChar* end,
ScanEnv* env)
6219 Node *node, **headp;
6233 headp = &(
NCDR(*top));
6236 if (r < 0)
return r;
6244 headp = &(
NCDR(*headp));
6269 if (r < 0)
return r;
6271 if (r < 0)
return r;
6273 #ifdef USE_SUBEXP_CALL
6283 if (r != 0)
return r;
6297 #ifdef USE_NAMED_GROUP
6311 p = (
UChar* )pattern;
6319 UChar* arg, UChar* arg_end)