Changeset 331 for EcnlProtoTool/trunk/onigmo-6.1.3/src/regcomp.c
- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/onigmo-6.1.3
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/onigmo-6.1.3/src/regcomp.c
r321 r331 4 4 /*- 5 5 * Copyright (c) 2002-2013 K.Kosako <sndgk393 AT ybb DOT ne DOT jp> 6 * Copyright (c) 2011-201 4K.Takata <kentkt AT csc DOT jp>6 * Copyright (c) 2011-2016 K.Takata <kentkt AT csc DOT jp> 7 7 * All rights reserved. 8 8 * … … 31 31 #include "regparse.h" 32 32 33 #if defined(USE_MULTI_THREAD_SYSTEM) \34 && defined(USE_DEFAULT_MULTI_THREAD_SYSTEM)35 #ifdef _WIN3236 CRITICAL_SECTION gOnigMutex;37 #else38 pthread_mutex_t gOnigMutex;39 #endif40 #endif41 42 33 OnigCaseFoldType OnigDefaultCaseFoldFlag = ONIGENC_CASE_FOLD_MIN; 43 34 … … 264 255 } 265 256 257 #if 0 266 258 static int 267 259 add_pointer(regex_t* reg, void* addr) … … 272 264 return 0; 273 265 } 266 #endif 274 267 275 268 static int … … 483 476 484 477 p = prev = sn->s; 485 prev_len = enclen(enc, p );478 prev_len = enclen(enc, p, sn->end); 486 479 p += prev_len; 487 480 blen = prev_len; … … 489 482 490 483 for (; p < sn->end; ) { 491 len = enclen(enc, p );484 len = enclen(enc, p, sn->end); 492 485 if (len == prev_len || ambig) { 493 486 blen += len; … … 532 525 533 526 p = prev = sn->s; 534 prev_len = enclen(enc, p );527 prev_len = enclen(enc, p, end); 535 528 p += prev_len; 536 529 blen = prev_len; 537 530 538 531 for (; p < end; ) { 539 len = enclen(enc, p );532 len = enclen(enc, p, end); 540 533 if (len == prev_len || ambig) { 541 534 blen += len; … … 592 585 int len; 593 586 594 if (IS_NCCLASS_SHARE(cc)) {595 len = SIZE_OPCODE + SIZE_POINTER;596 return len;597 }598 599 587 if (IS_NULL(cc->mbuf)) { 600 588 len = SIZE_OPCODE + SIZE_BITSET; … … 621 609 { 622 610 int r; 623 624 if (IS_NCCLASS_SHARE(cc)) {625 add_opcode(reg, OP_CCLASS_NODE);626 r = add_pointer(reg, cc);627 return r;628 }629 611 630 612 if (IS_NULL(cc->mbuf)) { … … 639 621 if (ONIGENC_MBC_MINLEN(reg->enc) > 1 || bitset_is_empty(cc->bs)) { 640 622 if (IS_NCCLASS_NOT(cc)) 641 623 add_opcode(reg, OP_CCLASS_MB_NOT); 642 624 else 643 625 add_opcode(reg, OP_CCLASS_MB); 644 626 645 627 r = add_multi_byte_cclass(cc->mbuf, reg); … … 647 629 else { 648 630 if (IS_NCCLASS_NOT(cc)) 649 631 add_opcode(reg, OP_CCLASS_MIX_NOT); 650 632 else 651 633 add_opcode(reg, OP_CCLASS_MIX); 652 634 653 635 r = add_bitset(reg, cc->bs); … … 761 743 if (qn->greedy && infinite) { 762 744 if (IS_NOT_NULL(qn->next_head_exact) && !CKN_ON) 763 745 return SIZE_OP_ANYCHAR_STAR_PEEK_NEXT + tlen * qn->lower + cklen; 764 746 else 765 747 return SIZE_OP_ANYCHAR_STAR + tlen * qn->lower + cklen; 766 748 } 767 749 } … … 990 972 if (qn->greedy && infinite) { 991 973 if (IS_NOT_NULL(qn->next_head_exact)) 992 974 return SIZE_OP_ANYCHAR_STAR_PEEK_NEXT + tlen * qn->lower; 993 975 else 994 976 return SIZE_OP_ANYCHAR_STAR + tlen * qn->lower; 995 977 } 996 978 } … … 1011 993 1012 994 if (qn->greedy) { 995 #ifdef USE_OP_PUSH_OR_JUMP_EXACT 1013 996 if (IS_NOT_NULL(qn->head_exact)) 1014 997 len += SIZE_OP_PUSH_OR_JUMP_EXACT1 + mod_tlen + SIZE_OP_JUMP; 1015 else if (IS_NOT_NULL(qn->next_head_exact)) 998 else 999 #endif 1000 if (IS_NOT_NULL(qn->next_head_exact)) 1016 1001 len += SIZE_OP_PUSH_IF_PEEK_NEXT + mod_tlen + SIZE_OP_JUMP; 1017 1002 else … … 1079 1064 if (qn->lower == 1 && tlen > QUANTIFIER_EXPAND_LIMIT_SIZE) { 1080 1065 if (qn->greedy) { 1066 #ifdef USE_OP_PUSH_OR_JUMP_EXACT 1081 1067 if (IS_NOT_NULL(qn->head_exact)) 1082 1068 r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_PUSH_OR_JUMP_EXACT1); 1083 else if (IS_NOT_NULL(qn->next_head_exact)) 1069 else 1070 #endif 1071 if (IS_NOT_NULL(qn->next_head_exact)) 1084 1072 r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_PUSH_IF_PEEK_NEXT); 1085 1073 else … … 1097 1085 1098 1086 if (qn->greedy) { 1087 #ifdef USE_OP_PUSH_OR_JUMP_EXACT 1099 1088 if (IS_NOT_NULL(qn->head_exact)) { 1100 1089 r = add_opcode_rel_addr(reg, OP_PUSH_OR_JUMP_EXACT1, … … 1107 1096 -(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH_OR_JUMP_EXACT1)); 1108 1097 } 1109 else if (IS_NOT_NULL(qn->next_head_exact)) { 1098 else 1099 #endif 1100 if (IS_NOT_NULL(qn->next_head_exact)) { 1110 1101 r = add_opcode_rel_addr(reg, OP_PUSH_IF_PEEK_NEXT, 1111 1102 mod_tlen + SIZE_OP_JUMP); … … 1244 1235 ? SIZE_OP_MEMORY_END_REC : SIZE_OP_MEMORY_END); 1245 1236 } 1237 else if (IS_ENCLOSE_RECURSION(node)) { 1238 len = SIZE_OP_MEMORY_START_PUSH; 1239 len += tlen + (BIT_STATUS_AT(reg->bt_mem_end, node->regnum) 1240 ? SIZE_OP_MEMORY_END_PUSH_REC : SIZE_OP_MEMORY_END_REC); 1241 } 1246 1242 else 1247 1243 #endif … … 1289 1285 return ONIGERR_PARSER_BUG; 1290 1286 } 1287 break; 1288 1289 case ENCLOSE_ABSENT: 1290 len = SIZE_OP_PUSH_ABSENT_POS + SIZE_OP_ABSENT + tlen + SIZE_OP_ABSENT_END; 1291 1291 break; 1292 1292 … … 1355 1355 r = add_opcode(reg, OP_RETURN); 1356 1356 } 1357 else if (IS_ENCLOSE_RECURSION(node)) { 1358 if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum)) 1359 r = add_opcode(reg, OP_MEMORY_END_PUSH_REC); 1360 else 1361 r = add_opcode(reg, OP_MEMORY_END_REC); 1362 if (r) return r; 1363 r = add_mem_num(reg, node->regnum); 1364 } 1357 1365 else 1358 1366 #endif … … 1427 1435 break; 1428 1436 1437 case ENCLOSE_ABSENT: 1438 len = compile_length_tree(node->target, reg); 1439 if (len < 0) return len; 1440 1441 r = add_opcode(reg, OP_PUSH_ABSENT_POS); 1442 if (r) return r; 1443 r = add_opcode_rel_addr(reg, OP_ABSENT, len + SIZE_OP_ABSENT_END); 1444 if (r) return r; 1445 r = compile_tree(node->target, reg); 1446 if (r) return r; 1447 r = add_opcode(reg, OP_ABSENT_END); 1448 break; 1449 1429 1450 default: 1430 1451 return ONIGERR_TYPE_BUG; … … 1480 1501 case ANCHOR_SEMI_END_BUF: r = add_opcode(reg, OP_SEMI_END_BUF); break; 1481 1502 case ANCHOR_BEGIN_POSITION: r = add_opcode(reg, OP_BEGIN_POSITION); break; 1482 1483 /* used for implicit anchor optimization: /.*a/ ==> /(?:^|\G).*a/ */1484 case ANCHOR_ANYCHAR_STAR: r = add_opcode(reg, OP_BEGIN_POS_OR_LINE); break;1485 1503 1486 1504 case ANCHOR_WORD_BOUND: … … 1590 1608 len = 0; 1591 1609 do { 1592 1593 1594 1595 1610 r = compile_length_tree(NCAR(node), reg); 1611 if (r < 0) return r; 1612 len += r; 1613 n++; 1596 1614 } while (IS_NOT_NULL(node = NCDR(node))); 1597 1615 r = len; … … 1622 1640 #ifdef USE_BACKREF_WITH_LEVEL 1623 1641 if (IS_BACKREF_NEST_LEVEL(br)) { 1624 1642 r = SIZE_OPCODE + SIZE_OPTION + SIZE_LENGTH + 1625 1643 SIZE_LENGTH + (SIZE_MEMNUM * br->back_num); 1626 1644 } … … 1786 1804 int* p; 1787 1805 1788 1789 1790 1791 1792 1793 1806 if (IS_IGNORECASE(reg->options)) { 1807 r = add_opcode(reg, OP_BACKREF_MULTI_IC); 1808 } 1809 else { 1810 r = add_opcode(reg, OP_BACKREF_MULTI); 1811 } 1794 1812 if (r) return r; 1795 1813 … … 1885 1903 1886 1904 case NT_ANCHOR: 1887 { 1888 AnchorNode* an = NANCHOR(node); 1889 switch (an->type) { 1890 case ANCHOR_PREC_READ: 1891 case ANCHOR_PREC_READ_NOT: 1892 case ANCHOR_LOOK_BEHIND: 1893 case ANCHOR_LOOK_BEHIND_NOT: 1894 r = noname_disable_map(&(an->target), map, counter); 1895 break; 1896 } 1897 } 1905 if (NANCHOR(node)->target) 1906 r = noname_disable_map(&(NANCHOR(node)->target), map, counter); 1898 1907 break; 1899 1908 … … 1952 1961 EncloseNode* en = NENCLOSE(node); 1953 1962 if (en->type == ENCLOSE_CONDITION) 1954 1963 en->regnum = map[en->regnum].new_val; 1955 1964 r = renumber_by_map(en->target, map); 1956 1965 } … … 1962 1971 1963 1972 case NT_ANCHOR: 1964 { 1965 AnchorNode* an = NANCHOR(node); 1966 switch (an->type) { 1967 case ANCHOR_PREC_READ: 1968 case ANCHOR_PREC_READ_NOT: 1969 case ANCHOR_LOOK_BEHIND: 1970 case ANCHOR_LOOK_BEHIND_NOT: 1971 r = renumber_by_map(an->target, map); 1972 break; 1973 } 1974 } 1973 if (NANCHOR(node)->target) 1974 r = renumber_by_map(NANCHOR(node)->target, map); 1975 1975 break; 1976 1976 … … 2006 2006 break; 2007 2007 2008 case NT_ANCHOR: 2009 if (NANCHOR(node)->target) 2010 r = numbered_ref_check(NANCHOR(node)->target); 2011 break; 2012 2008 2013 default: 2009 2014 break; … … 2014 2019 2015 2020 static int 2016 disable_noname_group_capture _(Node** root, regex_t* reg, ScanEnv* env, GroupNumRemap* map)2021 disable_noname_group_capture(Node** root, regex_t* reg, ScanEnv* env) 2017 2022 { 2018 2023 int r, i, pos, counter; 2019 2024 BitStatusType loc; 2020 2025 GroupNumRemap* map; 2026 2027 map = (GroupNumRemap* )xalloca(sizeof(GroupNumRemap) * (env->num_mem + 1)); 2021 2028 CHECK_NULL_RETURN_MEMERR(map); 2022 2029 for (i = 1; i <= env->num_mem; i++) { … … 2049 2056 2050 2057 return onig_renumber_name_table(reg, map); 2051 }2052 2053 static int2054 disable_noname_group_capture(Node** root, regex_t* reg, ScanEnv* env)2055 {2056 GroupNumRemap* map = (GroupNumRemap*)xmalloc(sizeof(GroupNumRemap) * (env->num_mem + 1));2057 int ret = disable_noname_group_capture_(root, reg, env, map);2058 xfree(map);2059 return ret;2060 2058 } 2061 2059 #endif /* USE_NAMED_GROUP */ … … 2099 2097 break; 2100 2098 2101 # ifdef USE_SUBEXP_CALL2099 # ifdef USE_SUBEXP_CALL 2102 2100 case NT_CALL: 2103 2101 if (IS_CALL_RECURSION(NCALL(node))) { … … 2107 2105 r = quantifiers_memory_node_info(NCALL(node)->target); 2108 2106 break; 2109 # endif2107 # endif 2110 2108 2111 2109 case NT_QTFR: … … 2129 2127 case ENCLOSE_STOP_BACKTRACK: 2130 2128 case ENCLOSE_CONDITION: 2129 case ENCLOSE_ABSENT: 2131 2130 r = quantifiers_memory_node_info(en->target); 2132 2131 break; … … 2246 2245 switch (en->type) { 2247 2246 case ENCLOSE_MEMORY: 2248 #ifdef USE_SUBEXP_CALL 2249 if (IS_ENCLOSE_MIN_FIXED(en)) 2250 *min = en->min_len; 2251 else { 2252 r = get_min_match_length(en->target, min, env); 2253 if (r == 0) { 2254 en->min_len = *min; 2255 SET_ENCLOSE_STATUS(node, NST_MIN_FIXED); 2247 if (IS_ENCLOSE_MIN_FIXED(en)) 2248 *min = en->min_len; 2249 else { 2250 if (IS_ENCLOSE_MARK1(NENCLOSE(node))) 2251 *min = 0; /* recursive */ 2252 else { 2253 SET_ENCLOSE_STATUS(node, NST_MARK1); 2254 r = get_min_match_length(en->target, min, env); 2255 CLEAR_ENCLOSE_STATUS(node, NST_MARK1); 2256 if (r == 0) { 2257 en->min_len = *min; 2258 SET_ENCLOSE_STATUS(node, NST_MIN_FIXED); 2259 } 2256 2260 } 2257 2258 2259 #endif 2261 } 2262 break; 2263 2260 2264 case ENCLOSE_OPTION: 2261 2265 case ENCLOSE_STOP_BACKTRACK: 2262 2266 case ENCLOSE_CONDITION: 2263 2267 r = get_min_match_length(en->target, min, env); 2268 break; 2269 2270 case ENCLOSE_ABSENT: 2264 2271 break; 2265 2272 } … … 2364 2371 switch (en->type) { 2365 2372 case ENCLOSE_MEMORY: 2366 #ifdef USE_SUBEXP_CALL2367 2373 if (IS_ENCLOSE_MAX_FIXED(en)) 2368 2374 *max = en->max_len; 2369 2375 else { 2370 r = get_max_match_length(en->target, max, env); 2371 if (r == 0) { 2372 en->max_len = *max; 2373 SET_ENCLOSE_STATUS(node, NST_MAX_FIXED); 2376 if (IS_ENCLOSE_MARK1(NENCLOSE(node))) 2377 *max = ONIG_INFINITE_DISTANCE; 2378 else { 2379 SET_ENCLOSE_STATUS(node, NST_MARK1); 2380 r = get_max_match_length(en->target, max, env); 2381 CLEAR_ENCLOSE_STATUS(node, NST_MARK1); 2382 if (r == 0) { 2383 en->max_len = *max; 2384 SET_ENCLOSE_STATUS(node, NST_MAX_FIXED); 2385 } 2374 2386 } 2375 2387 } 2376 2388 break; 2377 #endif 2389 2378 2390 case ENCLOSE_OPTION: 2379 2391 case ENCLOSE_STOP_BACKTRACK: 2380 2392 case ENCLOSE_CONDITION: 2381 2393 r = get_max_match_length(en->target, max, env); 2394 break; 2395 2396 case ENCLOSE_ABSENT: 2382 2397 break; 2383 2398 } … … 2445 2460 UChar *s = sn->s; 2446 2461 while (s < sn->end) { 2447 s += enclen(reg->enc, s );2462 s += enclen(reg->enc, s, sn->end); 2448 2463 (*len)++; 2449 2464 } … … 2504 2519 r = get_char_length_tree1(en->target, reg, len, level); 2505 2520 break; 2521 case ENCLOSE_ABSENT: 2506 2522 default: 2507 2523 break; … … 2630 2646 v = BITSET_AT(xc->bs, i); 2631 2647 if ((v != 0 && !IS_NCCLASS_NOT(xc)) || 2632 2648 (v == 0 && IS_NCCLASS_NOT(xc))) { 2633 2649 v = BITSET_AT(yc->bs, i); 2634 2650 if ((v != 0 && !IS_NCCLASS_NOT(yc)) || 2635 2651 (v == 0 && IS_NCCLASS_NOT(yc))) 2636 2652 return 0; 2637 2653 } … … 2683 2699 2684 2700 case NT_CCLASS: 2685 2686 2687 2688 2689 2690 2691 2692 2701 { 2702 CClassNode* cc = NCCLASS(y); 2703 2704 code = ONIGENC_MBC_TO_CODE(reg->enc, xs->s, 2705 xs->s + ONIGENC_MBC_MAXLEN(reg->enc)); 2706 return (onig_is_code_in_cc(reg->enc, code, cc) != 0 ? 0 : 1); 2707 } 2708 break; 2693 2709 2694 2710 case NT_STR: 2695 2696 2697 2698 2699 2700 2701 2702 2711 { 2712 UChar *q; 2713 StrNode* ys = NSTR(y); 2714 len = NSTRING_LEN(x); 2715 if (len > NSTRING_LEN(y)) len = NSTRING_LEN(y); 2716 if (NSTRING_IS_AMBIG(x) || NSTRING_IS_AMBIG(y)) { 2717 /* tiny version */ 2718 return 0; 2703 2719 } 2704 2720 else { … … 2711 2727 2712 2728 default: 2713 2729 break; 2714 2730 } 2715 2731 } … … 2768 2784 QtfrNode* qn = NQTFR(node); 2769 2785 if (qn->lower > 0) { 2786 #ifdef USE_OP_PUSH_OR_JUMP_EXACT 2770 2787 if (IS_NOT_NULL(qn->head_exact)) 2771 2788 n = qn->head_exact; 2772 2789 else 2790 #endif 2773 2791 n = get_head_value_node(qn->target, exact, reg); 2774 2792 } … … 2795 2813 n = get_head_value_node(en->target, exact, reg); 2796 2814 break; 2815 2816 case ENCLOSE_ABSENT: 2817 break; 2797 2818 } 2798 2819 } … … 2862 2883 #ifdef USE_SUBEXP_CALL 2863 2884 2864 # define RECURSION_EXIST 12865 # define RECURSION_INFINITE 22885 # define RECURSION_EXIST 1 2886 # define RECURSION_INFINITE 2 2866 2887 2867 2888 static int … … 3063 3084 subexp_recursive_check_trav(Node* node, ScanEnv* env) 3064 3085 { 3065 # define FOUND_CALLED_NODE 13086 # define FOUND_CALLED_NODE 1 3066 3087 3067 3088 int type; … … 3164 3185 int gnum = cn->group_num; 3165 3186 3166 # ifdef USE_NAMED_GROUP3187 # ifdef USE_NAMED_GROUP 3167 3188 if (env->num_named > 0 && 3168 3189 IS_SYNTAX_BV(env->syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) && … … 3170 3191 return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED; 3171 3192 } 3172 # endif3193 # endif 3173 3194 if (gnum > env->num_mem) { 3174 3195 onig_scan_env_set_error_string(env, … … 3177 3198 } 3178 3199 3179 # ifdef USE_NAMED_GROUP3200 # ifdef USE_NAMED_GROUP 3180 3201 set_call_attr: 3181 # endif3202 # endif 3182 3203 cn->target = nodes[cn->group_num]; 3183 3204 if (IS_NULL(cn->target)) { … … 3190 3211 cn->unset_addr_list = env->unset_addr_list; 3191 3212 } 3192 # ifdef USE_NAMED_GROUP3193 # ifdef USE_PERL_SUBEXP_CALL3213 # ifdef USE_NAMED_GROUP 3214 # ifdef USE_PERL_SUBEXP_CALL 3194 3215 else if (cn->name == cn->name_end) { 3195 3216 goto set_call_attr; 3196 3217 } 3197 # endif3218 # endif 3198 3219 else { 3199 3220 int *refs; … … 3217 3238 } 3218 3239 } 3219 # endif3240 # endif 3220 3241 } 3221 3242 break; … … 3300 3321 3301 3322 static int 3302 next_setup(Node* node, Node* next_node, int in_root,regex_t* reg)3323 next_setup(Node* node, Node* next_node, regex_t* reg) 3303 3324 { 3304 3325 int type; … … 3334 3355 } 3335 3356 } 3336 3337 #ifndef ONIG_DONT_OPTIMIZE3338 if (NTYPE(node) == NT_QTFR && /* the type may be changed by above block */3339 in_root && /* qn->lower == 0 && */3340 NTYPE(qn->target) == NT_CANY &&3341 ! IS_MULTILINE(reg->options)) {3342 /* implicit anchor: /.*a/ ==> /(?:^|\G).*a/ */3343 Node *np;3344 np = onig_node_new_list(NULL_NODE, NULL_NODE);3345 CHECK_NULL_RETURN_MEMERR(np);3346 swap_node(node, np);3347 NCDR(node) = onig_node_new_list(np, NULL_NODE);3348 if (IS_NULL(NCDR(node))) {3349 onig_node_free(np);3350 return ONIGERR_MEMORY;3351 }3352 np = onig_node_new_anchor(ANCHOR_ANYCHAR_STAR); /* (?:^|\G) */3353 CHECK_NULL_RETURN_MEMERR(np);3354 NCAR(node) = np;3355 }3356 #endif3357 3357 } 3358 3358 } 3359 3359 else if (type == NT_ENCLOSE) { 3360 3360 EncloseNode* en = NENCLOSE(node); 3361 in_root = 0;3362 3361 if (en->type == ENCLOSE_MEMORY) { 3363 3362 node = en->target; … … 3516 3515 3517 3516 if (q < end) { 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3517 r = expand_case_fold_make_rem_string(&rem, q, end, reg); 3518 if (r != 0) { 3519 onig_node_free(an); 3520 goto mem_err2; 3521 } 3522 3523 xnode = onig_node_list_add(NULL_NODE, snode); 3524 if (IS_NULL(xnode)) { 3525 onig_node_free(an); 3526 onig_node_free(rem); 3527 goto mem_err2; 3528 } 3529 if (IS_NULL(onig_node_list_add(xnode, rem))) { 3530 onig_node_free(an); 3531 onig_node_free(xnode); 3532 onig_node_free(rem); 3533 goto mem_err; 3534 } 3535 3536 NCAR(an) = xnode; 3538 3537 } 3539 3538 else { 3540 3539 NCAR(an) = snode; 3541 3540 } 3542 3541 … … 3592 3591 } 3593 3592 3594 len = enclen(reg->enc, p );3593 len = enclen(reg->enc, p, end); 3595 3594 3596 3595 varlen = is_case_fold_variable_len(n, items, len); … … 3715 3714 #ifdef USE_COMBINATION_EXPLOSION_CHECK 3716 3715 3717 # define CEC_THRES_NUM_BIG_REPEAT 5123718 # define CEC_INFINITE_NUM 0x7fffffff3719 3720 # define CEC_IN_INFINITE_REPEAT (1<<0)3721 # define CEC_IN_FINITE_REPEAT (1<<1)3722 # define CEC_CONT_BIG_REPEAT (1<<2)3716 # define CEC_THRES_NUM_BIG_REPEAT 512 3717 # define CEC_INFINITE_NUM 0x7fffffff 3718 3719 # define CEC_IN_INFINITE_REPEAT (1<<0) 3720 # define CEC_IN_FINITE_REPEAT (1<<1) 3721 # define CEC_CONT_BIG_REPEAT (1<<2) 3723 3722 3724 3723 static int … … 3836 3835 break; 3837 3836 3838 # ifdef USE_SUBEXP_CALL3837 # ifdef USE_SUBEXP_CALL 3839 3838 case NT_CALL: 3840 3839 if (IS_CALL_RECURSION(NCALL(node))) … … 3843 3842 r = setup_comb_exp_check(NCALL(node)->target, state, env); 3844 3843 break; 3845 # endif3844 # endif 3846 3845 3847 3846 default: … … 3857 3856 #define IN_REPEAT (1<<2) 3858 3857 #define IN_VAR_REPEAT (1<<3) 3859 #define IN_ROOT (1<<4) 3858 #define IN_CALL (1<<4) 3859 #define IN_RECCALL (1<<5) 3860 3860 3861 3861 /* setup_tree does the following work. … … 3872 3872 int type; 3873 3873 int r = 0; 3874 int in_root = state & IN_ROOT; 3875 3876 state &= ~IN_ROOT; 3874 3877 3875 restart: 3878 3876 type = NTYPE(node); … … 3881 3879 { 3882 3880 Node* prev = NULL_NODE; 3883 int prev_in_root = 0;3884 state |= in_root;3885 3881 do { 3886 3882 r = setup_tree(NCAR(node), reg, state, env); 3887 3883 if (IS_NOT_NULL(prev) && r == 0) { 3888 r = next_setup(prev, NCAR(node), prev_in_root,reg);3884 r = next_setup(prev, NCAR(node), reg); 3889 3885 } 3890 3886 prev = NCAR(node); 3891 prev_in_root = state & IN_ROOT;3892 state &= ~IN_ROOT;3893 3887 } while (r == 0 && IS_NOT_NULL(node = NCDR(node))); 3894 3888 } … … 3947 3941 3948 3942 if ((state & IN_REPEAT) != 0) { 3949 3943 qn->state |= NST_IN_REPEAT; 3950 3944 } 3951 3945 … … 4054 4048 { 4055 4049 OnigOptionType options = reg->options; 4056 state |= in_root;4057 4050 reg->options = NENCLOSE(node)->option; 4058 4051 r = setup_tree(NENCLOSE(node)->target, reg, state, env); … … 4062 4055 4063 4056 case ENCLOSE_MEMORY: 4064 if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT )) != 0) {4057 if ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT | IN_CALL)) != 0) { 4065 4058 BIT_STATUS_ON_AT(env->bt_mem_start, en->regnum); 4066 4059 /* SET_ENCLOSE_STATUS(node, NST_MEM_IN_ALT_NOT); */ 4067 4060 } 4068 r = setup_tree(en->target, reg, state, env); 4069 break; 4061 if (IS_ENCLOSE_CALLED(en)) 4062 state |= IN_CALL; 4063 if (IS_ENCLOSE_RECURSION(en)) 4064 state |= IN_RECCALL; 4065 else if ((state & IN_RECCALL) != 0) 4066 SET_CALL_RECURSION(node); 4067 r = setup_tree(en->target, reg, state, env); 4068 break; 4070 4069 4071 4070 case ENCLOSE_STOP_BACKTRACK: … … 4094 4093 } 4095 4094 #endif 4095 if (NENCLOSE(node)->regnum > env->num_mem) 4096 return ONIGERR_INVALID_BACKREF; 4097 r = setup_tree(NENCLOSE(node)->target, reg, state, env); 4098 break; 4099 4100 case ENCLOSE_ABSENT: 4096 4101 r = setup_tree(NENCLOSE(node)->target, reg, state, env); 4097 4102 break; … … 4137 4142 if (r < 0) return r; 4138 4143 if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN; 4139 r = setup_look_behind(node, reg, env);4140 if (r != 0) return r;4141 4144 if (NTYPE(node) != NT_ANCHOR) goto restart; 4142 4145 r = setup_tree(an->target, reg, state, env); 4146 if (r != 0) return r; 4147 r = setup_look_behind(node, reg, env); 4143 4148 } 4144 4149 break; … … 4150 4155 if (r < 0) return r; 4151 4156 if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN; 4152 r = setup_look_behind(node, reg, env);4153 if (r != 0) return r;4154 4157 if (NTYPE(node) != NT_ANCHOR) goto restart; 4155 4158 r = setup_tree(an->target, reg, (state | IN_NOT), env); 4159 if (r != 0) return r; 4160 r = setup_look_behind(node, reg, env); 4156 4161 } 4157 4162 break; … … 4189 4194 n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag, 4190 4195 p, end, items); 4191 clen = enclen(enc, p); 4196 clen = enclen(enc, p, end); 4197 if (p + clen > end) 4198 clen = (int )(end - p); 4192 4199 4193 4200 for (j = 0; j < n; j++) { … … 4207 4214 } 4208 4215 else { 4216 # if OPT_EXACT_MAXLEN < ONIG_CHAR_TABLE_SIZE 4217 /* This should not happen. */ 4218 return ONIGERR_TYPE_BUG; 4219 # else 4209 4220 if (IS_NULL(*int_skip)) { 4210 4221 *int_skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE); … … 4219 4230 n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag, 4220 4231 p, end, items); 4221 clen = enclen(enc, p); 4232 clen = enclen(enc, p, end); 4233 if (p + clen > end) 4234 clen = (int )(end - p); 4222 4235 4223 4236 for (j = 0; j < n; j++) { … … 4235 4248 } 4236 4249 } 4250 # endif 4237 4251 } 4238 4252 return 0; … … 4262 4276 n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag, 4263 4277 p, end, items); 4264 clen = enclen(enc, p); 4278 clen = enclen(enc, p, end); 4279 if (p + clen > end) 4280 clen = (int )(end - p); 4265 4281 4266 4282 for (j = 0; j < n; j++) { … … 4280 4296 } 4281 4297 else { 4298 # if OPT_EXACT_MAXLEN < ONIG_CHAR_TABLE_SIZE 4299 /* This should not happen. */ 4300 return ONIGERR_TYPE_BUG; 4301 # else 4282 4302 if (IS_NULL(*int_skip)) { 4283 4303 *int_skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE); … … 4292 4312 n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag, 4293 4313 p, end, items); 4294 clen = enclen(enc, p); 4314 clen = enclen(enc, p, end); 4315 if (p + clen > end) 4316 clen = (int )(end - p); 4295 4317 4296 4318 for (j = 0; j < n; j++) { … … 4308 4330 } 4309 4331 } 4332 # endif 4310 4333 } 4311 4334 return 0; 4312 4335 } 4313 4336 #endif /* USE_SUNDAY_QUICK_SEARCH */ 4314 4315 #define OPT_EXACT_MAXLEN 244316 4337 4317 4338 typedef struct { … … 4604 4625 end = p + add->len; 4605 4626 for (i = to->len; p < end; ) { 4606 len = enclen(enc, p );4627 len = enclen(enc, p, end); 4607 4628 if (i + len > OPT_EXACT_MAXLEN) break; 4608 4629 for (j = 0; j < len && p < end; j++) … … 4626 4647 4627 4648 for (i = to->len, p = s; p < end && i < OPT_EXACT_MAXLEN; ) { 4628 len = enclen(enc, p );4649 len = enclen(enc, p, end); 4629 4650 if (i + len > OPT_EXACT_MAXLEN) break; 4630 4651 for (j = 0; j < len && p < end; j++) … … 4652 4673 for (i = 0; i < to->len && i < add->len; ) { 4653 4674 if (to->s[i] != add->s[i]) break; 4654 len = enclen(env->enc, to->s + i );4675 len = enclen(env->enc, to->s + i, to->s + to->len); 4655 4676 4656 4677 for (j = 1; j < len; j++) { … … 4984 5005 add_char_opt_map_info(&opt->map, *(sn->s), env->enc); 4985 5006 } 4986 5007 set_mml(&opt->len, slen, slen); 4987 5008 } 4988 5009 else { 4989 5010 OnigDistance max; 4990 5011 4991 5012 if (NSTRING_IS_DONT_GET_OPT_INFO(node)) { 4992 4993 5013 int n = onigenc_strlen(env->enc, sn->s, sn->end); 5014 max = ONIGENC_MBC_MAXLEN_DIST(env->enc) * n; 4994 5015 } 4995 5016 else { … … 5007 5028 } 5008 5029 5009 5030 set_mml(&opt->len, slen, max); 5010 5031 } 5011 5032 … … 5023 5044 5024 5045 if (IS_NOT_NULL(cc->mbuf) || IS_NCCLASS_NOT(cc)) { 5025 5046 OnigDistance min = ONIGENC_MBC_MINLEN(env->enc); 5026 5047 OnigDistance max = ONIGENC_MBC_MAXLEN_DIST(env->enc); 5027 5048 … … 5029 5050 } 5030 5051 else { 5031 5032 5033 5034 5035 5036 5052 for (i = 0; i < SINGLE_BYTE_SIZE; i++) { 5053 z = BITSET_AT(cc->bs, i); 5054 if ((z && !IS_NCCLASS_NOT(cc)) || (!z && IS_NCCLASS_NOT(cc))) { 5055 add_char_opt_map_info(&opt->map, (UChar )i, env->enc); 5056 } 5057 } 5037 5058 set_mml(&opt->len, 1, 1); 5038 5059 } … … 5048 5069 5049 5070 if (max == 1) { 5050 5071 min = 1; 5051 5072 5052 5073 maxcode = NCTYPE(node)->ascii_range ? 0x80 : SINGLE_BYTE_SIZE; … … 5071 5092 } 5072 5093 else { 5073 5094 min = ONIGENC_MBC_MINLEN(env->enc); 5074 5095 } 5075 5096 set_mml(&opt->len, min, max); … … 5190 5211 if (nopt.exb.reach_end) { 5191 5212 for (i = 2; i <= qn->lower && 5192 5213 ! is_full_opt_exact_info(&opt->exb); i++) { 5193 5214 concat_opt_exact_info(&opt->exb, &nopt.exb, env->enc); 5194 5215 } … … 5261 5282 r = optimize_node_left(en->target, opt, env); 5262 5283 break; 5284 5285 case ENCLOSE_ABSENT: 5286 set_mml(&opt->len, 0, ONIG_INFINITE_DISTANCE); 5287 break; 5263 5288 } 5264 5289 } … … 5312 5337 if (e->len >= 3 || (e->len >= 2 && allow_reverse)) { 5313 5338 r = set_bm_skip(reg->exact, reg->exact_end, reg, 5314 reg->map, &(reg->int_map), 0); 5315 if (r) return r; 5316 5317 reg->optimize = (allow_reverse != 0 5339 reg->map, &(reg->int_map), 0); 5340 if (r == 0) { 5341 reg->optimize = (allow_reverse != 0 5318 5342 ? ONIG_OPTIMIZE_EXACT_BM : ONIG_OPTIMIZE_EXACT_BM_NOT_REV); 5343 } 5344 else { 5345 reg->optimize = ONIG_OPTIMIZE_EXACT; 5346 } 5319 5347 } 5320 5348 else { … … 5381 5409 ANCHOR_BEGIN_POSITION | ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML | 5382 5410 ANCHOR_LOOK_BEHIND); 5411 5412 if ((opt.anc.left_anchor & (ANCHOR_LOOK_BEHIND | ANCHOR_PREC_READ_NOT)) != 0) 5413 reg->anchor &= ~ANCHOR_ANYCHAR_STAR_ML; 5383 5414 5384 5415 reg->anchor |= opt.anc.right_anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF | … … 5455 5486 } 5456 5487 5457 p += enclen(enc, p );5488 p += enclen(enc, p, end); 5458 5489 } 5459 5490 } … … 5574 5605 for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) { 5575 5606 if (reg->map[i] != 0) { 5576 5577 5578 5579 5580 5581 5582 5583 5607 if (c > 0) fputs(", ", f); 5608 c++; 5609 if (ONIGENC_MBC_MAXLEN(reg->enc) == 1 && 5610 ONIGENC_IS_CODE_PRINT(reg->enc, (OnigCodePoint )i)) 5611 fputc(i, f); 5612 else 5613 fprintf(f, "%d", i); 5614 } 5584 5615 } 5585 5616 fprintf(f, "]\n"); … … 5616 5647 } 5617 5648 5649 #ifdef RUBY 5618 5650 size_t 5619 5651 onig_memsize(const regex_t *reg) … … 5639 5671 return size; 5640 5672 } 5673 #endif 5641 5674 5642 5675 #define REGEX_TRANSFER(to,from) do {\ 5643 (to)->state = ONIG_STATE_MODIFY;\5644 5676 onig_free_body(to);\ 5645 5677 xmemcpy(to, from, sizeof(regex_t));\ … … 5647 5679 } while (0) 5648 5680 5681 #if 0 5649 5682 extern void 5650 5683 onig_transfer(regex_t* to, regex_t* from) 5651 5684 { 5652 THREAD_ATOMIC_START;5653 5685 REGEX_TRANSFER(to, from); 5654 THREAD_ATOMIC_END; 5655 } 5656 5657 #define REGEX_CHAIN_HEAD(reg) do {\ 5658 while (IS_NOT_NULL((reg)->chain)) {\ 5659 (reg) = (reg)->chain;\ 5660 }\ 5661 } while (0) 5662 5663 extern void 5664 onig_chain_link_add(regex_t* to, regex_t* add) 5665 { 5666 THREAD_ATOMIC_START; 5667 REGEX_CHAIN_HEAD(to); 5668 to->chain = add; 5669 THREAD_ATOMIC_END; 5670 } 5671 5672 extern void 5673 onig_chain_reduce(regex_t* reg) 5674 { 5675 regex_t *head, *prev; 5676 5677 prev = reg; 5678 head = prev->chain; 5679 if (IS_NOT_NULL(head)) { 5680 reg->state = ONIG_STATE_MODIFY; 5681 while (IS_NOT_NULL(head->chain)) { 5682 prev = head; 5683 head = head->chain; 5684 } 5685 prev->chain = (regex_t* )NULL; 5686 REGEX_TRANSFER(reg, head); 5687 } 5688 } 5686 } 5687 #endif 5689 5688 5690 5689 #ifdef ONIG_DEBUG_COMPILE 5691 static void print_compiled_byte_code_list P_((FILE* f, regex_t* reg));5690 static void print_compiled_byte_code_list(FILE* f, regex_t* reg); 5692 5691 #endif 5693 5692 #ifdef ONIG_DEBUG_PARSE_TREE 5694 static void print_tree P_((FILE* f, Node* node)); 5695 #endif 5696 5693 static void print_tree(FILE* f, Node* node); 5694 #endif 5695 5696 #ifdef RUBY 5697 5697 extern int 5698 5698 onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end, 5699 OnigErrorInfo* einfo) 5699 OnigErrorInfo* einfo) 5700 { 5701 return onig_compile_ruby(reg, pattern, pattern_end, einfo, NULL, 0); 5702 } 5703 #endif 5704 5705 #ifdef RUBY 5706 extern int 5707 onig_compile_ruby(regex_t* reg, const UChar* pattern, const UChar* pattern_end, 5708 OnigErrorInfo* einfo, const char *sourcefile, int sourceline) 5709 #else 5710 extern int 5711 onig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end, 5712 OnigErrorInfo* einfo) 5713 #endif 5700 5714 { 5701 5715 #define COMPILE_INIT_SIZE 20 … … 5711 5725 if (IS_NOT_NULL(einfo)) einfo->par = (UChar* )NULL; 5712 5726 5713 reg->state = ONIG_STATE_COMPILING; 5727 #ifdef RUBY 5728 scan_env.sourcefile = sourcefile; 5729 scan_env.sourceline = sourceline; 5730 #endif 5714 5731 5715 5732 #ifdef ONIG_DEBUG … … 5737 5754 r = onig_parse_make_tree(&root, pattern, pattern_end, reg, &scan_env); 5738 5755 if (r != 0) goto err; 5756 5757 #ifdef ONIG_DEBUG_PARSE_TREE 5758 # if 0 5759 fprintf(stderr, "ORIGINAL PARSE TREE:\n"); 5760 print_tree(stderr, root); 5761 # endif 5762 #endif 5739 5763 5740 5764 #ifdef USE_NAMED_GROUP … … 5770 5794 #endif 5771 5795 5772 r = setup_tree(root, reg, IN_ROOT, &scan_env);5796 r = setup_tree(root, reg, 0, &scan_env); 5773 5797 if (r != 0) goto err_unset; 5774 5798 … … 5789 5813 #ifdef USE_COMBINATION_EXPLOSION_CHECK 5790 5814 if (scan_env.backrefed_mem == 0 5791 # ifdef USE_SUBEXP_CALL5815 # ifdef USE_SUBEXP_CALL 5792 5816 || scan_env.num_call == 0 5793 # endif5817 # endif 5794 5818 ) { 5795 5819 setup_comb_exp_check(root, 0, &scan_env); 5796 # ifdef USE_SUBEXP_CALL5820 # ifdef USE_SUBEXP_CALL 5797 5821 if (scan_env.has_recursion != 0) { 5798 5822 scan_env.num_comb_exp_check = 0; 5799 5823 } 5800 5824 else 5801 # endif5825 # endif 5802 5826 if (scan_env.comb_exp_max_regnum > 0) { 5803 5827 int i; … … 5853 5877 5854 5878 #ifdef ONIG_DEBUG_COMPILE 5855 # ifdef USE_NAMED_GROUP5879 # ifdef USE_NAMED_GROUP 5856 5880 onig_print_names(stderr, reg); 5857 # endif5881 # endif 5858 5882 print_compiled_byte_code_list(stderr, reg); 5859 5883 #endif 5860 5884 5861 5885 end: 5862 reg->state = ONIG_STATE_NORMAL;5863 5886 return r; 5864 5887 … … 5884 5907 } 5885 5908 5886 #ifdef USE_RECOMPILE_API5887 extern int5888 onig_recompile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,5889 OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,5890 OnigErrorInfo* einfo)5891 {5892 int r;5893 regex_t *new_reg;5894 5895 r = onig_new(&new_reg, pattern, pattern_end, option, enc, syntax, einfo);5896 if (r) return r;5897 if (ONIG_STATE(reg) == ONIG_STATE_NORMAL) {5898 onig_transfer(reg, new_reg);5899 }5900 else {5901 onig_chain_link_add(reg, new_reg);5902 }5903 return 0;5904 }5905 #endif5906 5907 5909 static int onig_inited = 0; 5908 5910 … … 5910 5912 onig_reg_init(regex_t* reg, OnigOptionType option, 5911 5913 OnigCaseFoldType case_fold_flag, 5912 OnigEncoding enc, OnigSyntaxType* syntax)5914 OnigEncoding enc, const OnigSyntaxType* syntax) 5913 5915 { 5914 5916 if (! onig_inited) … … 5925 5927 return ONIGERR_INVALID_COMBINATION_OF_OPTIONS; 5926 5928 } 5927 5928 (reg)->state = ONIG_STATE_MODIFY;5929 5929 5930 5930 if ((option & ONIG_OPTION_NEGATE_SINGLELINE) != 0) { … … 5956 5956 onig_new_without_alloc(regex_t* reg, const UChar* pattern, 5957 5957 const UChar* pattern_end, OnigOptionType option, OnigEncoding enc, 5958 OnigSyntaxType* syntax, OnigErrorInfo* einfo)5958 const OnigSyntaxType* syntax, OnigErrorInfo* einfo) 5959 5959 { 5960 5960 int r; … … 5969 5969 extern int 5970 5970 onig_new(regex_t** reg, const UChar* pattern, const UChar* pattern_end, 5971 OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,5971 OnigOptionType option, OnigEncoding enc, const OnigSyntaxType* syntax, 5972 5972 OnigErrorInfo* einfo) 5973 5973 { … … 5989 5989 } 5990 5990 5991 extern int 5992 onig_initialize(OnigEncoding encodings[] ARG_UNUSED, int n ARG_UNUSED) 5993 { 5994 return onig_init(); 5995 } 5991 5996 5992 5997 extern int … … 5996 6001 return 0; 5997 6002 5998 THREAD_SYSTEM_INIT;5999 THREAD_ATOMIC_START;6000 6001 6003 onig_inited = 1; 6004 6005 #if defined(ONIG_DEBUG_MEMLEAK) && defined(_MSC_VER) 6006 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 6007 #endif 6002 6008 6003 6009 onigenc_init(); … … 6008 6014 #endif 6009 6015 6010 THREAD_ATOMIC_END;6011 6016 return 0; 6012 6017 } … … 6047 6052 onig_end(void) 6048 6053 { 6049 THREAD_ATOMIC_START;6050 6051 6054 exec_end_call_list(); 6052 6055 … … 6055 6058 #endif 6056 6059 6057 #ifdef USE_SHARED_CCLASS_TABLE 6058 onig_free_shared_cclass_table(); 6059 #endif 6060 6061 #ifdef USE_PARSE_TREE_NODE_RECYCLE 6062 onig_free_node_list(); 6060 #if defined(ONIG_DEBUG_MEMLEAK) && defined(_MSC_VER) 6061 _CrtDumpMemoryLeaks(); 6063 6062 #endif 6064 6063 6065 6064 onig_inited = 0; 6066 6065 6067 THREAD_ATOMIC_END;6068 THREAD_SYSTEM_END;6069 6066 return 0; 6070 6067 } … … 6132 6129 6133 6130 /* arguments type */ 6134 # define ARG_SPECIAL -16135 # define ARG_NON 06136 # define ARG_RELADDR 16137 # define ARG_ABSADDR 26138 # define ARG_LENGTH 36139 # define ARG_MEMNUM 46140 # define ARG_OPTION 56141 # define ARG_STATE_CHECK 66131 # define ARG_SPECIAL -1 6132 # define ARG_NON 0 6133 # define ARG_RELADDR 1 6134 # define ARG_ABSADDR 2 6135 # define ARG_LENGTH 3 6136 # define ARG_MEMNUM 4 6137 # define ARG_OPTION 5 6138 # define ARG_STATE_CHECK 6 6142 6139 6143 6140 OnigOpInfoType OnigOpInfo[] = { … … 6164 6161 { OP_CCLASS_MB_NOT, "cclass-mb-not", ARG_SPECIAL }, 6165 6162 { OP_CCLASS_MIX_NOT, "cclass-mix-not", ARG_SPECIAL }, 6166 { OP_CCLASS_NODE, "cclass-node", ARG_SPECIAL },6167 6163 { OP_ANYCHAR, "anychar", ARG_NON }, 6168 6164 { OP_ANYCHAR_ML, "anychar-ml", ARG_NON }, … … 6189 6185 { OP_SEMI_END_BUF, "semi-end-buf", ARG_NON }, 6190 6186 { OP_BEGIN_POSITION, "begin-position", ARG_NON }, 6191 { OP_BEGIN_POS_OR_LINE, "begin-pos-or-line", ARG_NON },6192 6187 { OP_BACKREF1, "backref1", ARG_NON }, 6193 6188 { OP_BACKREF2, "backref2", ARG_NON }, … … 6231 6226 { OP_PUSH_LOOK_BEHIND_NOT, "push-look-behind-not", ARG_SPECIAL }, 6232 6227 { OP_FAIL_LOOK_BEHIND_NOT, "fail-look-behind-not", ARG_NON }, 6228 { OP_PUSH_ABSENT_POS, "push-absent-pos", ARG_NON }, 6229 { OP_ABSENT, "absent", ARG_RELADDR }, 6230 { OP_ABSENT_END, "absent-end", ARG_NON }, 6233 6231 { OP_CALL, "call", ARG_ABSADDR }, 6234 6232 { OP_RETURN, "return", ARG_NON }, … … 6267 6265 } 6268 6266 6269 # ifdef ONIG_DEBUG_PARSE_TREE6267 # ifdef ONIG_DEBUG_PARSE_TREE 6270 6268 static void 6271 6269 Indent(FILE* f, int indent) … … 6274 6272 for (i = 0; i < indent; i++) putc(' ', f); 6275 6273 } 6276 # endif /* ONIG_DEBUG_PARSE_TREE */6274 # endif /* ONIG_DEBUG_PARSE_TREE */ 6277 6275 6278 6276 static void … … 6293 6291 6294 6292 extern void 6295 onig_print_compiled_byte_code(FILE* f, UChar* bp, UChar* * nextp,6293 onig_print_compiled_byte_code(FILE* f, UChar* bp, UChar* bpend, UChar** nextp, 6296 6294 OnigEncoding enc) 6297 6295 { … … 6313 6311 case ARG_RELADDR: 6314 6312 GET_RELADDR_INC(addr, bp); 6315 fprintf(f, ":( +%d)", addr);6313 fprintf(f, ":(%s%d)", (addr >= 0) ? "+" : "", addr); 6316 6314 break; 6317 6315 case ARG_ABSADDR: … … 6392 6390 6393 6391 case OP_EXACT1_IC: 6394 len = enclen(enc, bp );6392 len = enclen(enc, bp, bpend); 6395 6393 p_string(f, len, bp); 6396 6394 bp += len; … … 6418 6416 GET_LENGTH_INC(len, bp); 6419 6417 q = bp; 6420 # ifndef PLATFORM_UNALIGNED_WORD_ACCESS6418 # ifndef PLATFORM_UNALIGNED_WORD_ACCESS 6421 6419 ALIGNMENT_RIGHT(q); 6422 # endif6420 # endif 6423 6421 GET_CODE_POINT(code, q); 6424 6422 bp += len; … … 6432 6430 GET_LENGTH_INC(len, bp); 6433 6431 q = bp; 6434 # ifndef PLATFORM_UNALIGNED_WORD_ACCESS6432 # ifndef PLATFORM_UNALIGNED_WORD_ACCESS 6435 6433 ALIGNMENT_RIGHT(q); 6436 # endif6434 # endif 6437 6435 GET_CODE_POINT(code, q); 6438 6436 bp += len; 6439 6437 fprintf(f, ":%d:%d:%d", n, (int )code, len); 6440 break;6441 6442 case OP_CCLASS_NODE:6443 {6444 CClassNode *cc;6445 6446 GET_POINTER_INC(cc, bp);6447 n = bitset_on_num(cc->bs);6448 fprintf(f, ":%"PRIuPTR":%d", (uintptr_t )cc, n);6449 }6450 6438 break; 6451 6439 … … 6502 6490 addr = *((RelAddrType* )bp); 6503 6491 bp += SIZE_RELADDR; 6504 fprintf(f, ":(% d)", addr);6492 fprintf(f, ":(%s%d)", (addr >= 0) ? "+" : "", addr); 6505 6493 p_string(f, 1, bp); 6506 6494 bp += 1; … … 6515 6503 GET_RELADDR_INC(addr, bp); 6516 6504 GET_LENGTH_INC(len, bp); 6517 fprintf(f, ":%d:(% d)", len, addr);6505 fprintf(f, ":%d:(%s%d)", len, (addr >= 0) ? "+" : "", addr); 6518 6506 break; 6519 6507 … … 6524 6512 addr = *((RelAddrType* )bp); 6525 6513 bp += SIZE_RELADDR; 6526 fprintf(f, ":%d:(% d)", scn, addr);6514 fprintf(f, ":%d:(%s%d)", scn, (addr >= 0) ? "+" : "", addr); 6527 6515 break; 6528 6516 … … 6530 6518 GET_MEMNUM_INC(mem, bp); 6531 6519 GET_RELADDR_INC(addr, bp); 6532 fprintf(f, ":%d:(% d)", mem, addr);6520 fprintf(f, ":%d:(%s%d)", mem, (addr >= 0) ? "+" : "", addr); 6533 6521 break; 6534 6522 6535 6523 default: 6536 6524 fprintf(stderr, "onig_print_compiled_byte_code: undefined code %d\n", 6537 *--bp);6525 bp[-1]); 6538 6526 } 6539 6527 } … … 6542 6530 } 6543 6531 6544 # ifdef ONIG_DEBUG_COMPILE6532 # ifdef ONIG_DEBUG_COMPILE 6545 6533 static void 6546 6534 print_compiled_byte_code_list(FILE* f, regex_t* reg) … … 6559 6547 else 6560 6548 fprintf(f, " %ld:", bp - reg->p); 6561 onig_print_compiled_byte_code(f, bp, &bp, reg->enc);6549 onig_print_compiled_byte_code(f, bp, end, &bp, reg->enc); 6562 6550 } 6563 6551 6564 6552 fprintf(f, "\n"); 6565 6553 } 6566 # endif /* ONIG_DEBUG_COMPILE */6567 6568 # ifdef ONIG_DEBUG_PARSE_TREE6554 # endif /* ONIG_DEBUG_COMPILE */ 6555 6556 # ifdef ONIG_DEBUG_PARSE_TREE 6569 6557 static void 6570 6558 print_indent_tree(FILE* f, Node* node, int indent) … … 6613 6601 case NT_CCLASS: 6614 6602 fprintf(f, "<cclass:%"PRIxPTR">", (intptr_t )node); 6615 if (IS_NCCLASS_NOT(NCCLASS(node))) fputs(" not", f);6603 if (IS_NCCLASS_NOT(NCCLASS(node))) fputs("not ", f); 6616 6604 if (NCCLASS(node)->mbuf) { 6617 6605 BBuf* bbuf = NCCLASS(node)->mbuf; 6618 for (i = 0; i < (int )bbuf->used; i++) { 6619 if (i > 0) fprintf(f, ","); 6620 fprintf(f, "%0x", bbuf->p[i]); 6606 OnigCodePoint* data = (OnigCodePoint* )bbuf->p; 6607 OnigCodePoint* end = (OnigCodePoint* )(bbuf->p + bbuf->used); 6608 fprintf(f, "%d", *data++); 6609 for (; data < end; data+=2) { 6610 fprintf(f, ","); 6611 fprintf(f, "%04x-%04x", data[0], data[1]); 6621 6612 } 6622 6613 } … … 6652 6643 case ANCHOR_SEMI_END_BUF: fputs("semi end buf", f); break; 6653 6644 case ANCHOR_BEGIN_POSITION: fputs("begin position", f); break; 6654 case ANCHOR_ANYCHAR_STAR: fputs("begin position/line", f); break;6655 6645 6656 6646 case ANCHOR_WORD_BOUND: fputs("word bound", f); break; 6657 6647 case ANCHOR_NOT_WORD_BOUND: fputs("not word bound", f); break; 6658 # ifdef USE_WORD_BEGIN_END6648 # ifdef USE_WORD_BEGIN_END 6659 6649 case ANCHOR_WORD_BEGIN: fputs("word begin", f); break; 6660 6650 case ANCHOR_WORD_END: fputs("word end", f); break; 6661 # endif6651 # endif 6662 6652 case ANCHOR_PREC_READ: fputs("prec read", f); container_p = TRUE; break; 6663 6653 case ANCHOR_PREC_READ_NOT: fputs("prec read not", f); container_p = TRUE; break; … … 6685 6675 break; 6686 6676 6687 # ifdef USE_SUBEXP_CALL6677 # ifdef USE_SUBEXP_CALL 6688 6678 case NT_CALL: 6689 6679 { … … 6693 6683 } 6694 6684 break; 6695 # endif6685 # endif 6696 6686 6697 6687 case NT_QTFR: … … 6717 6707 fprintf(f, "condition:%d", NENCLOSE(node)->regnum); 6718 6708 break; 6709 case ENCLOSE_ABSENT: 6710 fprintf(f, "absent"); 6711 break; 6719 6712 6720 6713 default: … … 6744 6737 print_indent_tree(f, node, 0); 6745 6738 } 6746 # endif /* ONIG_DEBUG_PARSE_TREE */6739 # endif /* ONIG_DEBUG_PARSE_TREE */ 6747 6740 #endif /* ONIG_DEBUG */
Note:
See TracChangeset
for help on using the changeset viewer.