331
331
(msa).region = (arg_region);\
332
332
(msa).start = (arg_start);\
333
333
(msa).best_len = ONIG_MISMATCH;\
336
336
#define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start) do {\
337
337
(msa).stack_p = (void* )0;\
338
338
(msa).options = (arg_option);\
339
339
(msa).region = (arg_region);\
340
340
(msa).start = (arg_start);\
344
344
#ifdef USE_COMBINATION_EXPLOSION_CHECK
367
367
(msa).state_check_buff = (void* )0;\
368
368
(msa).state_check_buff_size = 0;\
372
372
#define MATCH_ARG_FREE(msa) do {\
373
373
if ((msa).stack_p) xfree((msa).stack_p);\
374
374
if ((msa).state_check_buff_size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) { \
375
375
if ((msa).state_check_buff) xfree((msa).state_check_buff);\
379
379
#define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num)
380
380
#define MATCH_ARG_FREE(msa) if ((msa).stack_p) xfree((msa).stack_p)
1045
1045
if (n <= ONIG_MAX_CAPTURE_HISTORY_GROUP &&
1046
1046
BIT_STATUS_AT(reg->capture_history, n) != 0) {
1047
1047
child = history_node_new();
1048
CHECK_NULL_RETURN_VAL(child, ONIGERR_MEMORY);
1048
CHECK_NULL_RETURN_MEMERR(child);
1049
1049
child->group = n;
1050
1050
child->beg = (int )(k->u.mem.pstr - str);
1051
1051
r = history_tree_add_child(node, child);
1174
1174
static int OpPrevTarget = OP_FAIL;
1175
1175
static int MaxStackDepth = 0;
1177
#define STAT_OP_IN(opcode) do {\
1177
#define MOP_IN(opcode) do {\
1178
1178
if (opcode == OpPrevTarget) OpPrevCounter[OpCurr]++;\
1179
1179
OpCurr = opcode;\
1180
1180
OpCounter[opcode]++;\
1184
#define STAT_OP_OUT do {\
1184
#define MOP_OUT do {\
1186
1186
OpTime[OpCurr] += TIMEDIFF(te, ts);\
1190
1190
onig_statistics_init(void)
1213
1213
if (stk - stk_base > MaxStackDepth) \
1214
1214
MaxStackDepth = stk - stk_base;\
1218
1218
#define STACK_INC stk++
1220
#define STAT_OP_IN(opcode)
1220
#define MOP_IN(opcode)
1225
onig_is_in_code_range(const UChar* p, OnigCodePoint code)
1227
OnigCodePoint n, *data;
1228
OnigCodePoint low, high, x;
1230
GET_CODE_POINT(n, p);
1231
data = (OnigCodePoint* )p;
1234
for (low = 0, high = n; low < high; ) {
1235
x = (low + high) >> 1;
1236
if (code > data[x * 2 + 1])
1242
return ((low < n && code >= data[low * 2]) ? 1 : 0);
1246
is_code_in_cc(int enclen, OnigCodePoint code, CClassNode* cc)
1250
if (enclen > 1 || (code >= SINGLE_BYTE_SIZE)) {
1251
if (IS_NULL(cc->mbuf)) {
1255
found = (onig_is_in_code_range(cc->mbuf->p, code) != 0 ? 1 : 0);
1259
found = (BITSET_AT(cc->bs, code) == 0 ? 0 : 1);
1262
if (IS_CCLASS_NOT(cc))
1269
onig_is_code_in_cc(OnigEncoding enc, OnigCodePoint code, CClassNode* cc)
1273
if (ONIGENC_MBC_MINLEN(enc) > 1) {
1277
len = ONIGENC_CODE_TO_MBCLEN(enc, code);
1279
return is_code_in_cc(len, code, cc);
1283
1225
/* matching region of POSIX API */
1284
1226
typedef int regoff_t;
1489
1431
if (*p != *s++) goto fail;
1490
1432
DATA_ENSURE(0);
1495
case OP_EXACT1_IC: STAT_OP_IN(OP_EXACT1_IC);
1437
case OP_EXACT1_IC: MOP_IN(OP_EXACT1_IC);
1498
UChar *q, *ss, *sp, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
1440
UChar *q, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
1500
1442
DATA_ENSURE(1);
1504
1443
len = ONIGENC_MBC_CASE_FOLD(encode,
1505
1444
/* DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag), */
1506
1445
case_fold_flag,
1569
1508
if (*p != *s) goto fail;
1576
case OP_EXACTN: STAT_OP_IN(OP_EXACTN);
1515
case OP_EXACTN: MOP_IN(OP_EXACTN);
1577
1516
GET_LENGTH_INC(tlen, p);
1578
1517
DATA_ENSURE(tlen);
1579
1518
while (tlen-- > 0) {
1580
1519
if (*p++ != *s++) goto fail;
1587
case OP_EXACTN_IC: STAT_OP_IN(OP_EXACTN_IC);
1526
case OP_EXACTN_IC: MOP_IN(OP_EXACTN_IC);
1590
UChar *ss, *sp, *q, *endp, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
1529
UChar *q, *endp, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
1592
1531
GET_LENGTH_INC(tlen, p);
1593
1532
endp = p + tlen;
1700
1636
sprev = s - tlen;
1705
case OP_CCLASS: STAT_OP_IN(OP_CCLASS);
1641
case OP_CCLASS: MOP_IN(OP_CCLASS);
1706
1642
DATA_ENSURE(1);
1707
1643
if (BITSET_AT(((BitSetRef )p), *s) == 0) goto fail;
1708
1644
p += SIZE_BITSET;
1709
1645
s += enc_len(encode, s); /* OP_CCLASS can match mb-code. \D, \S */
1713
case OP_CCLASS_MB: STAT_OP_IN(OP_CCLASS_MB);
1649
case OP_CCLASS_MB: MOP_IN(OP_CCLASS_MB);
1714
1650
if (! ONIGENC_IS_MBC_HEAD(encode, s)) goto fail;
1839
1775
DATA_ENSURE(0);
1840
1776
code = ONIGENC_MBC_TO_CODE(encode, ss, s);
1841
if (is_code_in_cc(mb_len, code, node) == 0) goto fail;
1777
if (onig_is_code_in_cc_len(mb_len, code, node) == 0) goto fail;
1846
case OP_ANYCHAR: STAT_OP_IN(OP_ANYCHAR);
1782
case OP_ANYCHAR: MOP_IN(OP_ANYCHAR);
1847
1783
DATA_ENSURE(1);
1848
1784
n = enc_len(encode, s);
1849
1785
DATA_ENSURE(n);
1850
1786
if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1855
case OP_ANYCHAR_ML: STAT_OP_IN(OP_ANYCHAR_ML);
1791
case OP_ANYCHAR_ML: MOP_IN(OP_ANYCHAR_ML);
1856
1792
DATA_ENSURE(1);
1857
1793
n = enc_len(encode, s);
1858
1794
DATA_ENSURE(n);
1863
case OP_ANYCHAR_STAR: STAT_OP_IN(OP_ANYCHAR_STAR);
1864
while (DATA_ENSURE_CHECK1) {
1865
STACK_PUSH_ALT(p, s, sprev);
1866
n = enc_len(encode, s);
1868
if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1875
case OP_ANYCHAR_ML_STAR: STAT_OP_IN(OP_ANYCHAR_ML_STAR);
1876
while (DATA_ENSURE_CHECK1) {
1877
STACK_PUSH_ALT(p, s, sprev);
1878
n = enc_len(encode, s);
1892
case OP_ANYCHAR_STAR_PEEK_NEXT: STAT_OP_IN(OP_ANYCHAR_STAR_PEEK_NEXT);
1893
while (DATA_ENSURE_CHECK1) {
1895
STACK_PUSH_ALT(p + 1, s, sprev);
1897
n = enc_len(encode, s);
1899
if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1907
case OP_ANYCHAR_ML_STAR_PEEK_NEXT:STAT_OP_IN(OP_ANYCHAR_ML_STAR_PEEK_NEXT);
1908
while (DATA_ENSURE_CHECK1) {
1910
STACK_PUSH_ALT(p + 1, s, sprev);
1912
n = enc_len(encode, s);
1799
case OP_ANYCHAR_STAR: MOP_IN(OP_ANYCHAR_STAR);
1800
while (DATA_ENSURE_CHECK1) {
1801
STACK_PUSH_ALT(p, s, sprev);
1802
n = enc_len(encode, s);
1804
if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1811
case OP_ANYCHAR_ML_STAR: MOP_IN(OP_ANYCHAR_ML_STAR);
1812
while (DATA_ENSURE_CHECK1) {
1813
STACK_PUSH_ALT(p, s, sprev);
1814
n = enc_len(encode, s);
1828
case OP_ANYCHAR_STAR_PEEK_NEXT: MOP_IN(OP_ANYCHAR_STAR_PEEK_NEXT);
1829
while (DATA_ENSURE_CHECK1) {
1831
STACK_PUSH_ALT(p + 1, s, sprev);
1833
n = enc_len(encode, s);
1835
if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1843
case OP_ANYCHAR_ML_STAR_PEEK_NEXT:MOP_IN(OP_ANYCHAR_ML_STAR_PEEK_NEXT);
1844
while (DATA_ENSURE_CHECK1) {
1846
STACK_PUSH_ALT(p + 1, s, sprev);
1848
n = enc_len(encode, s);
1927
1863
#ifdef USE_COMBINATION_EXPLOSION_CHECK
1928
case OP_STATE_CHECK_ANYCHAR_STAR: STAT_OP_IN(OP_STATE_CHECK_ANYCHAR_STAR);
1864
case OP_STATE_CHECK_ANYCHAR_STAR: MOP_IN(OP_STATE_CHECK_ANYCHAR_STAR);
1929
1865
GET_STATE_CHECK_NUM_INC(mem, p);
1930
1866
while (DATA_ENSURE_CHECK1) {
1931
1867
STATE_CHECK_VAL(scv, mem);
1966
1902
#endif /* USE_COMBINATION_EXPLOSION_CHECK */
1968
case OP_WORD: STAT_OP_IN(OP_WORD);
1904
case OP_WORD: MOP_IN(OP_WORD);
1969
1905
DATA_ENSURE(1);
1970
1906
if (! ONIGENC_IS_MBC_WORD(encode, s, end))
1973
1909
s += enc_len(encode, s);
1977
case OP_NOT_WORD: STAT_OP_IN(OP_NOT_WORD);
1913
case OP_NOT_WORD: MOP_IN(OP_NOT_WORD);
1978
1914
DATA_ENSURE(1);
1979
1915
if (ONIGENC_IS_MBC_WORD(encode, s, end))
1982
1918
s += enc_len(encode, s);
1986
case OP_WORD_BOUND: STAT_OP_IN(OP_WORD_BOUND);
1922
case OP_WORD_BOUND: MOP_IN(OP_WORD_BOUND);
1987
1923
if (ON_STR_BEGIN(s)) {
1988
1924
DATA_ENSURE(1);
1989
1925
if (! ONIGENC_IS_MBC_WORD(encode, s, end))
2016
1952
!= ONIGENC_IS_MBC_WORD(encode, sprev, end))
2023
1959
#ifdef USE_WORD_BEGIN_END
2024
case OP_WORD_BEGIN: STAT_OP_IN(OP_WORD_BEGIN);
1960
case OP_WORD_BEGIN: MOP_IN(OP_WORD_BEGIN);
2025
1961
if (DATA_ENSURE_CHECK1 && ONIGENC_IS_MBC_WORD(encode, s, end)) {
2026
1962
if (ON_STR_BEGIN(s) || !ONIGENC_IS_MBC_WORD(encode, sprev, end)) {
2034
case OP_WORD_END: STAT_OP_IN(OP_WORD_END);
1970
case OP_WORD_END: MOP_IN(OP_WORD_END);
2035
1971
if (!ON_STR_BEGIN(s) && ONIGENC_IS_MBC_WORD(encode, sprev, end)) {
2036
1972
if (ON_STR_END(s) || !ONIGENC_IS_MBC_WORD(encode, s, end)) {
2045
case OP_BEGIN_BUF: STAT_OP_IN(OP_BEGIN_BUF);
1981
case OP_BEGIN_BUF: MOP_IN(OP_BEGIN_BUF);
2046
1982
if (! ON_STR_BEGIN(s)) goto fail;
2052
case OP_END_BUF: STAT_OP_IN(OP_END_BUF);
1988
case OP_END_BUF: MOP_IN(OP_END_BUF);
2053
1989
if (! ON_STR_END(s)) goto fail;
2059
case OP_BEGIN_LINE: STAT_OP_IN(OP_BEGIN_LINE);
1995
case OP_BEGIN_LINE: MOP_IN(OP_BEGIN_LINE);
2060
1996
if (ON_STR_BEGIN(s)) {
2061
1997
if (IS_NOTBOL(msa->options)) goto fail;
2065
2001
else if (ONIGENC_IS_MBC_NEWLINE(encode, sprev, end) && !ON_STR_END(s)) {
2072
case OP_END_LINE: STAT_OP_IN(OP_END_LINE);
2008
case OP_END_LINE: MOP_IN(OP_END_LINE);
2073
2009
if (ON_STR_END(s)) {
2074
2010
#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
2075
2011
if (IS_EMPTY_STR || !ONIGENC_IS_MBC_NEWLINE(encode, sprev, end)) {
2077
2013
if (IS_NOTEOL(msa->options)) goto fail;
2080
2016
#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
2084
2020
else if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) {
2088
2024
#ifdef USE_CRNL_AS_LINE_TERMINATOR
2089
2025
else if (ONIGENC_IS_MBC_CRNL(encode, s, end)) {
2097
case OP_SEMI_END_BUF: STAT_OP_IN(OP_SEMI_END_BUF);
2033
case OP_SEMI_END_BUF: MOP_IN(OP_SEMI_END_BUF);
2098
2034
if (ON_STR_END(s)) {
2099
2035
#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
2100
2036
if (IS_EMPTY_STR || !ONIGENC_IS_MBC_NEWLINE(encode, sprev, end)) {
2102
if (IS_NOTEOL(msa->options)) goto fail; /* Is it needed? */
2038
if (IS_NOTEOL(msa->options)) goto fail;
2105
2041
#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
2109
2045
else if (ONIGENC_IS_MBC_NEWLINE(encode, s, end) &&
2110
2046
ON_STR_END(s + enc_len(encode, s))) {
2114
2050
#ifdef USE_CRNL_AS_LINE_TERMINATOR
2115
2051
else if (ONIGENC_IS_MBC_CRNL(encode, s, end)) {
2116
2052
UChar* ss = s + enc_len(encode, s);
2117
if (ON_STR_END(ss + enc_len(encode, ss))) {
2053
ss += enc_len(encode, ss);
2054
if (ON_STR_END(ss)) {
2126
case OP_BEGIN_POSITION: STAT_OP_IN(OP_BEGIN_POSITION);
2063
case OP_BEGIN_POSITION: MOP_IN(OP_BEGIN_POSITION);
2127
2064
if (s != msa->start)
2134
case OP_MEMORY_START_PUSH: STAT_OP_IN(OP_MEMORY_START_PUSH);
2071
case OP_MEMORY_START_PUSH: MOP_IN(OP_MEMORY_START_PUSH);
2135
2072
GET_MEMNUM_INC(mem, p);
2136
2073
STACK_PUSH_MEM_START(mem, s);
2141
case OP_MEMORY_START: STAT_OP_IN(OP_MEMORY_START);
2078
case OP_MEMORY_START: MOP_IN(OP_MEMORY_START);
2142
2079
GET_MEMNUM_INC(mem, p);
2143
2080
mem_start_stk[mem] = (OnigStackIndex )((void* )s);
2148
case OP_MEMORY_END_PUSH: STAT_OP_IN(OP_MEMORY_END_PUSH);
2085
case OP_MEMORY_END_PUSH: MOP_IN(OP_MEMORY_END_PUSH);
2149
2086
GET_MEMNUM_INC(mem, p);
2150
2087
STACK_PUSH_MEM_END(mem, s);
2155
case OP_MEMORY_END: STAT_OP_IN(OP_MEMORY_END);
2092
case OP_MEMORY_END: MOP_IN(OP_MEMORY_END);
2156
2093
GET_MEMNUM_INC(mem, p);
2157
2094
mem_end_stk[mem] = (OnigStackIndex )((void* )s);
2162
2099
#ifdef USE_SUBEXP_CALL
2163
case OP_MEMORY_END_PUSH_REC: STAT_OP_IN(OP_MEMORY_END_PUSH_REC);
2100
case OP_MEMORY_END_PUSH_REC: MOP_IN(OP_MEMORY_END_PUSH_REC);
2164
2101
GET_MEMNUM_INC(mem, p);
2165
2102
STACK_GET_MEM_START(mem, stkp); /* should be before push mem-end. */
2166
2103
STACK_PUSH_MEM_END(mem, s);
2167
2104
mem_start_stk[mem] = GET_STACK_INDEX(stkp);
2172
case OP_MEMORY_END_REC: STAT_OP_IN(OP_MEMORY_END_REC);
2109
case OP_MEMORY_END_REC: MOP_IN(OP_MEMORY_END_REC);
2173
2110
GET_MEMNUM_INC(mem, p);
2174
2111
mem_end_stk[mem] = (OnigStackIndex )((void* )s);
2175
2112
STACK_GET_MEM_START(mem, stkp);
2180
2117
mem_start_stk[mem] = (OnigStackIndex )((void* )stkp->u.mem.pstr);
2182
2119
STACK_PUSH_MEM_END_MARK(mem);
2188
case OP_BACKREF1: STAT_OP_IN(OP_BACKREF1);
2125
case OP_BACKREF1: MOP_IN(OP_BACKREF1);
2193
case OP_BACKREF2: STAT_OP_IN(OP_BACKREF2);
2130
case OP_BACKREF2: MOP_IN(OP_BACKREF2);
2198
case OP_BACKREFN: STAT_OP_IN(OP_BACKREFN);
2135
case OP_BACKREFN: MOP_IN(OP_BACKREFN);
2199
2136
GET_MEMNUM_INC(mem, p);
2370
case OP_SET_OPTION_PUSH: STAT_OP_IN(OP_SET_OPTION_PUSH);
2307
#if 0 /* no need: IS_DYNAMIC_OPTION() == 0 */
2308
case OP_SET_OPTION_PUSH: MOP_IN(OP_SET_OPTION_PUSH);
2371
2309
GET_OPTION_INC(option, p);
2372
2310
STACK_PUSH_ALT(p, s, sprev);
2373
2311
p += SIZE_OP_SET_OPTION + SIZE_OP_FAIL;
2378
case OP_SET_OPTION: STAT_OP_IN(OP_SET_OPTION);
2316
case OP_SET_OPTION: MOP_IN(OP_SET_OPTION);
2379
2317
GET_OPTION_INC(option, p);
2384
case OP_NULL_CHECK_START: STAT_OP_IN(OP_NULL_CHECK_START);
2323
case OP_NULL_CHECK_START: MOP_IN(OP_NULL_CHECK_START);
2385
2324
GET_MEMNUM_INC(mem, p); /* mem: null check id */
2386
2325
STACK_PUSH_NULL_CHECK_START(mem, s);
2391
case OP_NULL_CHECK_END: STAT_OP_IN(OP_NULL_CHECK_END);
2330
case OP_NULL_CHECK_END: MOP_IN(OP_NULL_CHECK_END);
2467
2406
STACK_PUSH_NULL_CHECK_END(mem);
2475
case OP_JUMP: STAT_OP_IN(OP_JUMP);
2414
case OP_JUMP: MOP_IN(OP_JUMP);
2476
2415
GET_RELADDR_INC(addr, p);
2479
2418
CHECK_INTERRUPT_IN_MATCH_AT;
2483
case OP_PUSH: STAT_OP_IN(OP_PUSH);
2422
case OP_PUSH: MOP_IN(OP_PUSH);
2484
2423
GET_RELADDR_INC(addr, p);
2485
2424
STACK_PUSH_ALT(p + addr, s, sprev);
2490
2429
#ifdef USE_COMBINATION_EXPLOSION_CHECK
2491
case OP_STATE_CHECK_PUSH: STAT_OP_IN(OP_STATE_CHECK_PUSH);
2430
case OP_STATE_CHECK_PUSH: MOP_IN(OP_STATE_CHECK_PUSH);
2492
2431
GET_STATE_CHECK_NUM_INC(mem, p);
2493
2432
STATE_CHECK_VAL(scv, mem);
2494
2433
if (scv) goto fail;
2496
2435
GET_RELADDR_INC(addr, p);
2497
2436
STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem);
2502
case OP_STATE_CHECK_PUSH_OR_JUMP: STAT_OP_IN(OP_STATE_CHECK_PUSH_OR_JUMP);
2441
case OP_STATE_CHECK_PUSH_OR_JUMP: MOP_IN(OP_STATE_CHECK_PUSH_OR_JUMP);
2503
2442
GET_STATE_CHECK_NUM_INC(mem, p);
2504
2443
GET_RELADDR_INC(addr, p);
2505
2444
STATE_CHECK_VAL(scv, mem);
2510
2449
STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem);
2516
case OP_STATE_CHECK: STAT_OP_IN(OP_STATE_CHECK);
2455
case OP_STATE_CHECK: MOP_IN(OP_STATE_CHECK);
2517
2456
GET_STATE_CHECK_NUM_INC(mem, p);
2518
2457
STATE_CHECK_VAL(scv, mem);
2519
2458
if (scv) goto fail;
2521
2460
STACK_PUSH_STATE_CHECK(s, mem);
2525
2464
#endif /* USE_COMBINATION_EXPLOSION_CHECK */
2527
case OP_POP: STAT_OP_IN(OP_POP);
2466
case OP_POP: MOP_IN(OP_POP);
2533
case OP_PUSH_OR_JUMP_EXACT1: STAT_OP_IN(OP_PUSH_OR_JUMP_EXACT1);
2472
case OP_PUSH_OR_JUMP_EXACT1: MOP_IN(OP_PUSH_OR_JUMP_EXACT1);
2534
2473
GET_RELADDR_INC(addr, p);
2535
2474
if (*p == *s && DATA_ENSURE_CHECK1) {
2537
2476
STACK_PUSH_ALT(p + addr, s, sprev);
2541
2480
p += (addr + 1);
2546
case OP_PUSH_IF_PEEK_NEXT: STAT_OP_IN(OP_PUSH_IF_PEEK_NEXT);
2485
case OP_PUSH_IF_PEEK_NEXT: MOP_IN(OP_PUSH_IF_PEEK_NEXT);
2547
2486
GET_RELADDR_INC(addr, p);
2548
2487
if (*p == *s) {
2550
2489
STACK_PUSH_ALT(p + addr, s, sprev);
2559
case OP_REPEAT: STAT_OP_IN(OP_REPEAT);
2498
case OP_REPEAT: MOP_IN(OP_REPEAT);
2561
2500
GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2562
2501
GET_RELADDR_INC(addr, p);
2609
2548
p = stkp->u.repeat.pcode;
2611
2550
STACK_PUSH_REPEAT_INC(si);
2613
2552
CHECK_INTERRUPT_IN_MATCH_AT;
2617
case OP_REPEAT_INC_SG: STAT_OP_IN(OP_REPEAT_INC_SG);
2556
case OP_REPEAT_INC_SG: MOP_IN(OP_REPEAT_INC_SG);
2618
2557
GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2619
2558
STACK_GET_REPEAT(mem, stkp);
2620
2559
si = GET_STACK_INDEX(stkp);
2621
2560
goto repeat_inc;
2624
case OP_REPEAT_INC_NG: STAT_OP_IN(OP_REPEAT_INC_NG);
2563
case OP_REPEAT_INC_NG: MOP_IN(OP_REPEAT_INC_NG);
2625
2564
GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2626
2565
si = repeat_stk[mem];
2627
2566
stkp = STACK_AT(si);
2643
2582
else if (stkp->u.repeat.count == reg->repeat_range[mem].upper) {
2644
2583
STACK_PUSH_REPEAT_INC(si);
2647
2586
CHECK_INTERRUPT_IN_MATCH_AT;
2651
case OP_REPEAT_INC_NG_SG: STAT_OP_IN(OP_REPEAT_INC_NG_SG);
2590
case OP_REPEAT_INC_NG_SG: MOP_IN(OP_REPEAT_INC_NG_SG);
2652
2591
GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2653
2592
STACK_GET_REPEAT(mem, stkp);
2654
2593
si = GET_STACK_INDEX(stkp);
2655
2594
goto repeat_inc_ng;
2658
case OP_PUSH_POS: STAT_OP_IN(OP_PUSH_POS);
2597
case OP_PUSH_POS: MOP_IN(OP_PUSH_POS);
2659
2598
STACK_PUSH_POS(s, sprev);
2664
case OP_POP_POS: STAT_OP_IN(OP_POP_POS);
2603
case OP_POP_POS: MOP_IN(OP_POP_POS);
2666
2605
STACK_POS_END(stkp);
2667
2606
s = stkp->u.state.pstr;
2668
2607
sprev = stkp->u.state.pstr_prev;
2674
case OP_PUSH_POS_NOT: STAT_OP_IN(OP_PUSH_POS_NOT);
2613
case OP_PUSH_POS_NOT: MOP_IN(OP_PUSH_POS_NOT);
2675
2614
GET_RELADDR_INC(addr, p);
2676
2615
STACK_PUSH_POS_NOT(p + addr, s, sprev);
2681
case OP_FAIL_POS: STAT_OP_IN(OP_FAIL_POS);
2620
case OP_FAIL_POS: MOP_IN(OP_FAIL_POS);
2682
2621
STACK_POP_TIL_POS_NOT;
2686
case OP_PUSH_STOP_BT: STAT_OP_IN(OP_PUSH_STOP_BT);
2625
case OP_PUSH_STOP_BT: MOP_IN(OP_PUSH_STOP_BT);
2687
2626
STACK_PUSH_STOP_BT;
2692
case OP_POP_STOP_BT: STAT_OP_IN(OP_POP_STOP_BT);
2631
case OP_POP_STOP_BT: MOP_IN(OP_POP_STOP_BT);
2693
2632
STACK_STOP_BT_END;
2698
case OP_LOOK_BEHIND: STAT_OP_IN(OP_LOOK_BEHIND);
2637
case OP_LOOK_BEHIND: MOP_IN(OP_LOOK_BEHIND);
2699
2638
GET_LENGTH_INC(tlen, p);
2700
2639
s = (UChar* )ONIGENC_STEP_BACK(encode, str, s, (int )tlen);
2701
2640
if (IS_NULL(s)) goto fail;
2702
2641
sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s);
2707
case OP_PUSH_LOOK_BEHIND_NOT: STAT_OP_IN(OP_PUSH_LOOK_BEHIND_NOT);
2646
case OP_PUSH_LOOK_BEHIND_NOT: MOP_IN(OP_PUSH_LOOK_BEHIND_NOT);
2708
2647
GET_RELADDR_INC(addr, p);
2709
2648
GET_LENGTH_INC(tlen, p);
2710
2649
q = (UChar* )ONIGENC_STEP_BACK(encode, str, s, (int )tlen);
2720
2659
sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s);
2726
case OP_FAIL_LOOK_BEHIND_NOT: STAT_OP_IN(OP_FAIL_LOOK_BEHIND_NOT);
2665
case OP_FAIL_LOOK_BEHIND_NOT: MOP_IN(OP_FAIL_LOOK_BEHIND_NOT);
2727
2666
STACK_POP_TIL_LOOK_BEHIND_NOT;
2731
2670
#ifdef USE_SUBEXP_CALL
2732
case OP_CALL: STAT_OP_IN(OP_CALL);
2671
case OP_CALL: MOP_IN(OP_CALL);
2733
2672
GET_ABSADDR_INC(addr, p);
2734
2673
STACK_PUSH_CALL_FRAME(p);
2735
2674
p = reg->p + addr;
2740
case OP_RETURN: STAT_OP_IN(OP_RETURN);
2679
case OP_RETURN: MOP_IN(OP_RETURN);
2741
2680
STACK_RETURN(p);
2742
2681
STACK_PUSH_RETURN;
3239
3178
case ANCHOR_END_LINE:
3240
3179
if (ON_STR_END(p)) {
3180
#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
3241
3181
prev = (UChar* )onigenc_get_prev_char_head(reg->enc,
3242
3182
(pprev ? pprev : str), p);
3243
3183
if (prev && ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end))
3244
3184
goto retry_gate;
3246
3187
else if (! ONIGENC_IS_MBC_NEWLINE(reg->enc, p, end)
3247
3188
#ifdef USE_CRNL_AS_LINE_TERMINATOR
3361
3302
case ANCHOR_END_LINE:
3362
3303
if (ON_STR_END(p)) {
3304
#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
3363
3305
prev = onigenc_get_prev_char_head(reg->enc, adjrange, p);
3364
3306
if (IS_NULL(prev)) goto fail;
3365
3307
if (ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end)) {
3370
3313
else if (! ONIGENC_IS_MBC_NEWLINE(reg->enc, p, end)
3371
3314
#ifdef USE_CRNL_AS_LINE_TERMINATOR
3570
3513
max_semi_end = (UChar* )end;
3571
3514
if (ONIGENC_IS_MBC_NEWLINE(reg->enc, pre_end, end)) {
3572
3515
min_semi_end = pre_end;
3517
#ifdef USE_CRNL_AS_LINE_TERMINATOR
3518
pre_end = ONIGENC_STEP_BACK(reg->enc, str, pre_end, 1);
3519
if (IS_NOT_NULL(pre_end) &&
3520
ONIGENC_IS_MBC_CRNL(reg->enc, pre_end, end)) {
3521
min_semi_end = pre_end;
3573
3524
if (min_semi_end > str && start <= min_semi_end) {