35 #ifdef USE_CRNL_AS_LINE_TERMINATOR 36 #define ONIGENC_IS_MBC_CRNL(enc,p,end) \ 37 (ONIGENC_MBC_TO_CODE(enc,p,end) == 13 && \ 38 ONIGENC_MBC_TO_CODE(enc,(p+enclen(enc,p,end)),end) == 10) 39 #define ONIGENC_IS_MBC_NEWLINE_EX(enc,p,start,end,option,check_prev) \ 40 is_mbc_newline_ex((enc),(p),(start),(end),(option),(check_prev)) 73 #define ONIGENC_IS_MBC_NEWLINE_EX(enc,p,start,end,option,check_prev) \ 74 ONIGENC_IS_MBC_NEWLINE((enc), (p), (end)) 77 #ifdef USE_CAPTURE_HISTORY 88 history_tree_free(node->
childs[i]);
106 history_tree_clear(node);
120 history_node_new(
void)
139 #define HISTORY_TREE_INIT_ALLOC_SIZE 8 145 n = HISTORY_TREE_INIT_ALLOC_SIZE;
157 history_tree_clear(parent);
162 for (i = parent->
allocated; i < n; i++) {
179 clone = history_node_new();
185 child = history_tree_clone(node->
childs[i]);
187 history_tree_free(clone);
190 r = history_tree_add_child(clone, child);
192 history_tree_free(child);
193 history_tree_free(clone);
213 for (i = 0; i < region->
num_regs; i++) {
216 #ifdef USE_CAPTURE_HISTORY 217 history_root_free(region);
231 if (region->
beg == 0)
235 if (region->
end == 0) {
273 if (r != 0)
return r;
288 region->
beg[at] = beg;
289 region->
end[at] = end;
323 #ifdef USE_CAPTURE_HISTORY 324 history_root_free(r);
326 if (free_self)
xfree(r);
333 #define RREGC_SIZE (sizeof(int) * from->num_regs) 336 if (to == from)
return;
341 for (i = 0; i < from->
num_regs; i++) {
342 to->
beg[i] = from->
beg[i];
343 to->
end[i] = from->
end[i];
347 #ifdef USE_CAPTURE_HISTORY 348 history_root_free(to);
358 #define INVALID_STACK_INDEX -1 362 #define STK_ALT 0x0001 363 #define STK_LOOK_BEHIND_NOT 0x0002 364 #define STK_POS_NOT 0x0003 366 #define STK_MEM_START 0x0100 367 #define STK_MEM_END 0x8200 368 #define STK_REPEAT_INC 0x0300 369 #define STK_STATE_CHECK_MARK 0x1000 371 #define STK_NULL_CHECK_START 0x3000 372 #define STK_NULL_CHECK_END 0x5000 373 #define STK_MEM_END_MARK 0x8400 374 #define STK_POS 0x0500 375 #define STK_STOP_BT 0x0600 376 #define STK_REPEAT 0x0700 377 #define STK_CALL_FRAME 0x0800 378 #define STK_RETURN 0x0900 379 #define STK_VOID 0x0a00 382 #define STK_MASK_POP_USED 0x00ff 383 #define STK_MASK_TO_VOID_TARGET 0x10ff 384 #define STK_MASK_MEM_END_OR_MARK 0x8000 386 #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 387 #define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos) do {\ 388 (msa).stack_p = (void* )0;\ 389 (msa).options = (arg_option);\ 390 (msa).region = (arg_region);\ 391 (msa).start = (arg_start);\ 392 (msa).gpos = (arg_gpos);\ 393 (msa).best_len = ONIG_MISMATCH;\ 396 #define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos) do {\ 397 (msa).stack_p = (void* )0;\ 398 (msa).options = (arg_option);\ 399 (msa).region = (arg_region);\ 400 (msa).start = (arg_start);\ 401 (msa).gpos = (arg_gpos);\ 405 #ifdef USE_COMBINATION_EXPLOSION_CHECK 407 #define STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE 16 409 #define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num) do { \ 410 if ((state_num) > 0 && str_len >= STATE_CHECK_STRING_THRESHOLD_LEN) {\ 411 unsigned int size = (unsigned int )(((str_len) + 1) * (state_num) + 7) >> 3;\ 412 offset = ((offset) * (state_num)) >> 3;\ 413 if (size > 0 && offset < size && size < STATE_CHECK_BUFF_MAX_SIZE) {\ 414 if (size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) {\ 415 (msa).state_check_buff = (void* )xmalloc(size);\ 416 CHECK_NULL_RETURN_MEMERR((msa).state_check_buff);\ 419 (msa).state_check_buff = (void* )xalloca(size);\ 420 xmemset(((char* )((msa).state_check_buff)+(offset)), 0, \ 421 (size_t )(size - (offset))); \ 422 (msa).state_check_buff_size = size;\ 425 (msa).state_check_buff = (void* )0;\ 426 (msa).state_check_buff_size = 0;\ 430 (msa).state_check_buff = (void* )0;\ 431 (msa).state_check_buff_size = 0;\ 435 #define MATCH_ARG_FREE(msa) do {\ 436 if ((msa).stack_p) xfree((msa).stack_p);\ 437 if ((msa).state_check_buff_size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) { \ 438 if ((msa).state_check_buff) xfree((msa).state_check_buff);\ 442 #define MATCH_ARG_FREE(msa) if ((msa).stack_p) xfree((msa).stack_p) 447 #define MAX_PTR_NUM 100 449 #define STACK_INIT(alloc_addr, heap_addr, ptr_num, stack_num) do {\ 450 if (ptr_num > MAX_PTR_NUM) {\ 451 alloc_addr = (char* )xmalloc(sizeof(OnigStackIndex) * (ptr_num));\ 452 heap_addr = alloc_addr;\ 454 stk_alloc = (OnigStackType* )(msa->stack_p);\ 455 stk_base = stk_alloc;\ 457 stk_end = stk_base + msa->stack_n;\ 459 stk_alloc = (OnigStackType* )xalloca(sizeof(OnigStackType) * (stack_num));\ 460 stk_base = stk_alloc;\ 462 stk_end = stk_base + (stack_num);\ 464 } else if (msa->stack_p) {\ 465 alloc_addr = (char* )xalloca(sizeof(OnigStackIndex) * (ptr_num));\ 467 stk_alloc = (OnigStackType* )(msa->stack_p);\ 468 stk_base = stk_alloc;\ 470 stk_end = stk_base + msa->stack_n;\ 473 alloc_addr = (char* )xalloca(sizeof(OnigStackIndex) * (ptr_num)\ 474 + sizeof(OnigStackType) * (stack_num));\ 476 stk_alloc = (OnigStackType* )(alloc_addr + sizeof(OnigStackIndex) * (ptr_num));\ 477 stk_base = stk_alloc;\ 479 stk_end = stk_base + (stack_num);\ 483 #define STACK_SAVE do{\ 484 if (stk_base != stk_alloc) {\ 485 msa->stack_p = stk_base;\ 486 msa->stack_n = stk_end - stk_base; \ 512 stk_base = *arg_stk_base;
513 stk_end = *arg_stk_end;
516 n = stk_end - stk_base;
529 if (limit_size != 0 && n > limit_size) {
530 if ((
unsigned int )(stk_end - stk_base) == limit_size)
541 *arg_stk = x + (stk - stk_base);
543 *arg_stk_end = x + n;
547 #define STACK_ENSURE(n) do {\ 548 if (stk_end - stk < (n)) {\ 549 int r = stack_double(&stk_base, &stk_end, &stk, stk_alloc, msa);\ 552 if (xmalloc_base) xfree(xmalloc_base);\ 558 #define STACK_AT(index) (stk_base + (index)) 559 #define GET_STACK_INDEX(stk) ((stk) - stk_base) 561 #define STACK_PUSH_TYPE(stack_type) do {\ 563 stk->type = (stack_type);\ 567 #define IS_TO_VOID_TARGET(stk) (((stk)->type & STK_MASK_TO_VOID_TARGET) != 0) 569 #ifdef USE_COMBINATION_EXPLOSION_CHECK 570 #define STATE_CHECK_POS(s,snum) \ 571 (((s) - str) * num_comb_exp_check + ((snum) - 1)) 572 #define STATE_CHECK_VAL(v,snum) do {\ 573 if (state_check_buff != NULL) {\ 574 int x = STATE_CHECK_POS(s,snum);\ 575 (v) = state_check_buff[x/8] & (1<<(x%8));\ 581 #define ELSE_IF_STATE_CHECK_MARK(stk) \ 582 else if ((stk)->type == STK_STATE_CHECK_MARK) { \ 583 int x = STATE_CHECK_POS(stk->u.state.pstr, stk->u.state.state_check);\ 584 state_check_buff[x/8] |= (1<<(x%8)); \ 587 #define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\ 589 stk->type = (stack_type);\ 590 stk->u.state.pcode = (pat);\ 591 stk->u.state.pstr = (s);\ 592 stk->u.state.pstr_prev = (sprev);\ 593 stk->u.state.state_check = 0;\ 594 stk->u.state.pkeep = (keep);\ 598 #define STACK_PUSH_ENSURED(stack_type,pat) do {\ 599 stk->type = (stack_type);\ 600 stk->u.state.pcode = (pat);\ 601 stk->u.state.state_check = 0;\ 605 #define STACK_PUSH_ALT_WITH_STATE_CHECK(pat,s,sprev,snum,keep) do {\ 607 stk->type = STK_ALT;\ 608 stk->u.state.pcode = (pat);\ 609 stk->u.state.pstr = (s);\ 610 stk->u.state.pstr_prev = (sprev);\ 611 stk->u.state.state_check = ((state_check_buff != NULL) ? (snum) : 0);\ 612 stk->u.state.pkeep = (keep);\ 616 #define STACK_PUSH_STATE_CHECK(s,snum) do {\ 617 if (state_check_buff != NULL) {\ 619 stk->type = STK_STATE_CHECK_MARK;\ 620 stk->u.state.pstr = (s);\ 621 stk->u.state.state_check = (snum);\ 628 #define ELSE_IF_STATE_CHECK_MARK(stk) 630 #define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\ 632 stk->type = (stack_type);\ 633 stk->u.state.pcode = (pat);\ 634 stk->u.state.pstr = (s);\ 635 stk->u.state.pstr_prev = (sprev);\ 636 stk->u.state.pkeep = (keep);\ 640 #define STACK_PUSH_ENSURED(stack_type,pat) do {\ 641 stk->type = (stack_type);\ 642 stk->u.state.pcode = (pat);\ 647 #define STACK_PUSH_ALT(pat,s,sprev,keep) STACK_PUSH(STK_ALT,pat,s,sprev,keep) 648 #define STACK_PUSH_POS(s,sprev,keep) STACK_PUSH(STK_POS,NULL_UCHARP,s,sprev,keep) 649 #define STACK_PUSH_POS_NOT(pat,s,sprev,keep) STACK_PUSH(STK_POS_NOT,pat,s,sprev,keep) 650 #define STACK_PUSH_STOP_BT STACK_PUSH_TYPE(STK_STOP_BT) 651 #define STACK_PUSH_LOOK_BEHIND_NOT(pat,s,sprev,keep) \ 652 STACK_PUSH(STK_LOOK_BEHIND_NOT,pat,s,sprev,keep) 654 #define STACK_PUSH_REPEAT(id, pat) do {\ 656 stk->type = STK_REPEAT;\ 657 stk->u.repeat.num = (id);\ 658 stk->u.repeat.pcode = (pat);\ 659 stk->u.repeat.count = 0;\ 663 #define STACK_PUSH_REPEAT_INC(sindex) do {\ 665 stk->type = STK_REPEAT_INC;\ 666 stk->u.repeat_inc.si = (sindex);\ 670 #define STACK_PUSH_MEM_START(mnum, s) do {\ 672 stk->type = STK_MEM_START;\ 673 stk->u.mem.num = (mnum);\ 674 stk->u.mem.pstr = (s);\ 675 stk->u.mem.start = mem_start_stk[mnum];\ 676 stk->u.mem.end = mem_end_stk[mnum];\ 677 mem_start_stk[mnum] = GET_STACK_INDEX(stk);\ 678 mem_end_stk[mnum] = INVALID_STACK_INDEX;\ 682 #define STACK_PUSH_MEM_END(mnum, s) do {\ 684 stk->type = STK_MEM_END;\ 685 stk->u.mem.num = (mnum);\ 686 stk->u.mem.pstr = (s);\ 687 stk->u.mem.start = mem_start_stk[mnum];\ 688 stk->u.mem.end = mem_end_stk[mnum];\ 689 mem_end_stk[mnum] = GET_STACK_INDEX(stk);\ 693 #define STACK_PUSH_MEM_END_MARK(mnum) do {\ 695 stk->type = STK_MEM_END_MARK;\ 696 stk->u.mem.num = (mnum);\ 700 #define STACK_GET_MEM_START(mnum, k) do {\ 703 while (k > stk_base) {\ 705 if ((k->type & STK_MASK_MEM_END_OR_MARK) != 0 \ 706 && k->u.mem.num == (mnum)) {\ 709 else if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\ 710 if (level == 0) break;\ 716 #define STACK_GET_MEM_RANGE(k, mnum, start, end) do {\ 719 if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\ 720 if (level == 0) (start) = k->u.mem.pstr;\ 723 else if (k->type == STK_MEM_END && k->u.mem.num == (mnum)) {\ 726 (end) = k->u.mem.pstr;\ 734 #define STACK_PUSH_NULL_CHECK_START(cnum, s) do {\ 736 stk->type = STK_NULL_CHECK_START;\ 737 stk->u.null_check.num = (cnum);\ 738 stk->u.null_check.pstr = (s);\ 742 #define STACK_PUSH_NULL_CHECK_END(cnum) do {\ 744 stk->type = STK_NULL_CHECK_END;\ 745 stk->u.null_check.num = (cnum);\ 749 #define STACK_PUSH_CALL_FRAME(pat) do {\ 751 stk->type = STK_CALL_FRAME;\ 752 stk->u.call_frame.ret_addr = (pat);\ 756 #define STACK_PUSH_RETURN do {\ 758 stk->type = STK_RETURN;\ 764 #define STACK_BASE_CHECK(p, at) \ 765 if ((p) < stk_base) {\ 766 fprintf(stderr, "at %s\n", at);\ 770 #define STACK_BASE_CHECK(p, at) 773 #define STACK_POP_ONE do {\ 775 STACK_BASE_CHECK(stk, "STACK_POP_ONE"); \ 778 #define STACK_POP do {\ 779 switch (pop_level) {\ 780 case STACK_POP_LEVEL_FREE:\ 783 STACK_BASE_CHECK(stk, "STACK_POP"); \ 784 if ((stk->type & STK_MASK_POP_USED) != 0) break;\ 785 ELSE_IF_STATE_CHECK_MARK(stk);\ 788 case STACK_POP_LEVEL_MEM_START:\ 791 STACK_BASE_CHECK(stk, "STACK_POP 2"); \ 792 if ((stk->type & STK_MASK_POP_USED) != 0) break;\ 793 else if (stk->type == STK_MEM_START) {\ 794 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 795 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 797 ELSE_IF_STATE_CHECK_MARK(stk);\ 803 STACK_BASE_CHECK(stk, "STACK_POP 3"); \ 804 if ((stk->type & STK_MASK_POP_USED) != 0) break;\ 805 else if (stk->type == STK_MEM_START) {\ 806 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 807 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 809 else if (stk->type == STK_REPEAT_INC) {\ 810 STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\ 812 else if (stk->type == STK_MEM_END) {\ 813 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 814 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 816 ELSE_IF_STATE_CHECK_MARK(stk);\ 822 #define STACK_POP_TIL_POS_NOT do {\ 825 STACK_BASE_CHECK(stk, "STACK_POP_TIL_POS_NOT"); \ 826 if (stk->type == STK_POS_NOT) break;\ 827 else if (stk->type == STK_MEM_START) {\ 828 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 829 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 831 else if (stk->type == STK_REPEAT_INC) {\ 832 STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\ 834 else if (stk->type == STK_MEM_END) {\ 835 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 836 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 838 ELSE_IF_STATE_CHECK_MARK(stk);\ 842 #define STACK_POP_TIL_LOOK_BEHIND_NOT do {\ 845 STACK_BASE_CHECK(stk, "STACK_POP_TIL_LOOK_BEHIND_NOT"); \ 846 if (stk->type == STK_LOOK_BEHIND_NOT) break;\ 847 else if (stk->type == STK_MEM_START) {\ 848 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 849 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 851 else if (stk->type == STK_REPEAT_INC) {\ 852 STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\ 854 else if (stk->type == STK_MEM_END) {\ 855 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 856 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 858 ELSE_IF_STATE_CHECK_MARK(stk);\ 862 #define STACK_POS_END(k) do {\ 866 STACK_BASE_CHECK(k, "STACK_POS_END"); \ 867 if (IS_TO_VOID_TARGET(k)) {\ 870 else if (k->type == STK_POS) {\ 877 #define STACK_STOP_BT_END do {\ 878 OnigStackType *k = stk;\ 881 STACK_BASE_CHECK(k, "STACK_STOP_BT_END"); \ 882 if (IS_TO_VOID_TARGET(k)) {\ 885 else if (k->type == STK_STOP_BT) {\ 892 #define STACK_NULL_CHECK(isnull,id,s) do {\ 893 OnigStackType* k = stk;\ 896 STACK_BASE_CHECK(k, "STACK_NULL_CHECK"); \ 897 if (k->type == STK_NULL_CHECK_START) {\ 898 if (k->u.null_check.num == (id)) {\ 899 (isnull) = (k->u.null_check.pstr == (s));\ 906 #define STACK_NULL_CHECK_REC(isnull,id,s) do {\ 908 OnigStackType* k = stk;\ 911 STACK_BASE_CHECK(k, "STACK_NULL_CHECK_REC"); \ 912 if (k->type == STK_NULL_CHECK_START) {\ 913 if (k->u.null_check.num == (id)) {\ 915 (isnull) = (k->u.null_check.pstr == (s));\ 921 else if (k->type == STK_NULL_CHECK_END) {\ 927 #define STACK_NULL_CHECK_MEMST(isnull,id,s,reg) do {\ 928 OnigStackType* k = stk;\ 931 STACK_BASE_CHECK(k, "STACK_NULL_CHECK_MEMST"); \ 932 if (k->type == STK_NULL_CHECK_START) {\ 933 if (k->u.null_check.num == (id)) {\ 934 if (k->u.null_check.pstr != (s)) {\ 942 if (k->type == STK_MEM_START) {\ 943 if (k->u.mem.end == INVALID_STACK_INDEX) {\ 944 (isnull) = 0; break;\ 946 if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\ 947 endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\ 949 endp = (UChar* )k->u.mem.end;\ 950 if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\ 951 (isnull) = 0; break;\ 953 else if (endp != s) {\ 966 #define STACK_NULL_CHECK_MEMST_REC(isnull,id,s,reg) do {\ 968 OnigStackType* k = stk;\ 971 STACK_BASE_CHECK(k, "STACK_NULL_CHECK_MEMST_REC"); \ 972 if (k->type == STK_NULL_CHECK_START) {\ 973 if (k->u.null_check.num == (id)) {\ 975 if (k->u.null_check.pstr != (s)) {\ 983 if (k->type == STK_MEM_START) {\ 984 if (k->u.mem.end == INVALID_STACK_INDEX) {\ 985 (isnull) = 0; break;\ 987 if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\ 988 endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\ 990 endp = (UChar* )k->u.mem.end;\ 991 if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\ 992 (isnull) = 0; break;\ 994 else if (endp != s) {\ 1008 else if (k->type == STK_NULL_CHECK_END) {\ 1009 if (k->u.null_check.num == (id)) level++;\ 1014 #define STACK_GET_REPEAT(id, k) do {\ 1019 STACK_BASE_CHECK(k, "STACK_GET_REPEAT"); \ 1020 if (k->type == STK_REPEAT) {\ 1022 if (k->u.repeat.num == (id)) {\ 1027 else if (k->type == STK_CALL_FRAME) level--;\ 1028 else if (k->type == STK_RETURN) level++;\ 1032 #define STACK_RETURN(addr) do {\ 1034 OnigStackType* k = stk;\ 1037 STACK_BASE_CHECK(k, "STACK_RETURN"); \ 1038 if (k->type == STK_CALL_FRAME) {\ 1040 (addr) = k->u.call_frame.ret_addr;\ 1045 else if (k->type == STK_RETURN)\ 1051 #define STRING_CMP(s1,s2,len) do {\ 1052 while (len-- > 0) {\ 1053 if (*s1++ != *s2++) goto fail;\ 1057 #define STRING_CMP_IC(case_fold_flag,s1,ps2,len,text_end) do {\ 1058 if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len, text_end) == 0) \ 1067 UChar *p1, *p2, *end1, *s2;
1075 if (len1 != len2)
return 0;
1078 while (len1-- > 0) {
1079 if (*p1 != *p2)
return 0;
1089 #define STRING_CMP_VALUE(s1,s2,len,is_fail) do {\ 1091 while (len-- > 0) {\ 1092 if (*s1++ != *s2++) {\ 1093 is_fail = 1; break;\ 1098 #define STRING_CMP_VALUE_IC(case_fold_flag,s1,ps2,len,text_end,is_fail) do {\ 1099 if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len, text_end) == 0) \ 1106 #define IS_EMPTY_STR (str == end) 1107 #define ON_STR_BEGIN(s) ((s) == str) 1108 #define ON_STR_END(s) ((s) == end) 1109 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 1110 #define DATA_ENSURE_CHECK1 (s < right_range) 1111 #define DATA_ENSURE_CHECK(n) (s + (n) <= right_range) 1112 #define DATA_ENSURE(n) if (s + (n) > right_range) goto fail 1114 #define DATA_ENSURE_CHECK1 (s < end) 1115 #define DATA_ENSURE_CHECK(n) (s + (n) <= end) 1116 #define DATA_ENSURE(n) if (s + (n) > end) goto fail 1120 #ifdef USE_CAPTURE_HISTORY 1129 while (k < stk_top) {
1134 child = history_node_new();
1137 child->
beg = k->
u.
mem.pstr - str;
1138 r = history_tree_add_child(node, child);
1140 history_tree_free(child);
1144 r = make_capture_history_tree(child, kp, stk_top, str, reg);
1145 if (r != 0)
return r;
1148 child->
end = k->
u.
mem.pstr - str;
1153 node->
end = k->
u.
mem.pstr - str;
1165 #ifdef USE_BACKREF_WITH_LEVEL 1171 for (i = 0; i < num; i++) {
1173 if (mem == (
int )m)
return 1;
1180 ,
int ignore_case,
int case_fold_flag
1190 while (k >= stk_base) {
1197 else if (
level == nest) {
1200 pstart = k->
u.
mem.pstr;
1202 if (pend - pstart > send - *s)
return 0;
1206 if (ignore_case != 0) {
1208 pstart, &ss, pend - pstart, send) == 0)
1213 if (*p++ != *ss++)
return 0;
1224 pend = k->
u.
mem.pstr;
1236 #ifdef ONIG_DEBUG_STATISTICS 1238 #define USE_TIMEOFDAY 1240 #ifdef USE_TIMEOFDAY 1241 #ifdef HAVE_SYS_TIME_H 1242 #include <sys/time.h> 1244 #ifdef HAVE_UNISTD_H 1248 #define GETTIME(t) gettimeofday(&(t), (struct timezone* )0) 1249 #define TIMEDIFF(te,ts) (((te).tv_usec - (ts).tv_usec) + \ 1250 (((te).tv_sec - (ts).tv_sec)*1000000)) 1252 #ifdef HAVE_SYS_TIMES_H 1253 #include <sys/times.h> 1255 static struct tms ts, te;
1256 #define GETTIME(t) times(&(t)) 1257 #define TIMEDIFF(te,ts) ((te).tms_utime - (ts).tms_utime) 1260 static int OpCounter[256];
1261 static int OpPrevCounter[256];
1262 static unsigned long OpTime[256];
1264 static int OpPrevTarget =
OP_FAIL;
1265 static int MaxStackDepth = 0;
1267 #define MOP_IN(opcode) do {\ 1268 if (opcode == OpPrevTarget) OpPrevCounter[OpCurr]++;\ 1270 OpCounter[opcode]++;\ 1274 #define MOP_OUT do {\ 1276 OpTime[OpCurr] += TIMEDIFF(te, ts);\ 1280 onig_statistics_init(
void)
1283 for (i = 0; i < 256; i++) {
1284 OpCounter[i] = OpPrevCounter[i] = 0; OpTime[i] = 0;
1290 onig_print_statistics(
FILE*
f)
1293 fprintf(
f,
" count prev time\n");
1294 for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {
1295 fprintf(
f,
"%8d: %8d: %10ld: %s\n",
1296 OpCounter[i], OpPrevCounter[i], OpTime[i], OnigOpInfo[i].
name);
1298 fprintf(
f,
"\nmax stack depth: %d\n", MaxStackDepth);
1301 #define STACK_INC do {\ 1303 if (stk - stk_base > MaxStackDepth) \ 1304 MaxStackDepth = stk - stk_base;\ 1308 #define STACK_INC stk++ 1310 #define MOP_IN(opcode) 1331 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
1332 const UChar* right_range,
1338 int i, num_mem, pop_level;
1339 ptrdiff_t n, best_len;
1346 UChar *s, *q, *sbegin;
1350 char *xmalloc_base =
NULL;
1356 #ifdef USE_COMBINATION_EXPLOSION_CHECK 1358 unsigned char* state_check_buff = msa->state_check_buff;
1362 #ifdef USE_SUBEXP_CALL 1372 mem_end_stk = mem_start_stk + (num_mem + 1);
1373 for (i = 0; i <= num_mem; i++) {
1386 mem_end_stk = mem_start_stk + num_mem;
1391 for (i = 1; i <= num_mem; i++) {
1396 #ifdef ONIG_DEBUG_MATCH 1397 fprintf(stderr,
"match_at: str: %"PRIdPTR
" (%p), end: %"PRIdPTR
" (%p), start: %"PRIdPTR
" (%p), sprev: %"PRIdPTR
" (%p)\n",
1399 fprintf(stderr,
"size: %d, start offset: %d\n",
1400 (
int )(end - str), (
int )(sstart - str));
1405 s = (
UChar* )sstart;
1406 pkeep = (
UChar* )sstart;
1408 #ifdef ONIG_DEBUG_MATCH 1412 fprintf(stderr,
"%4d> \"", (
int )(s - str));
1415 for (i = 0, q = s; i < 7 && q < end; i++) {
1416 len =
enclen(encode, q, end);
1417 while (len-- > 0) *
bp++ = *q++;
1420 if (q < end) {
xmemcpy(
bp,
"...\"", 4);
bp += 4; }
1423 fputs((
char* )
buf, stderr);
1424 for (i = 0; i < 20 - (
bp -
buf); i++) fputc(
' ', stderr);
1426 fprintf(stderr,
"\n");
1436 #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 1449 #ifdef USE_POSIX_API_REGION_OPTION 1453 rmt[0].
rm_so = (
regoff_t )(((pkeep > s) ? s : pkeep) - str);
1455 for (i = 1; i <= num_mem; i++) {
1463 ?
STACK_AT(mem_end_stk[i])->u.mem.pstr
1464 : (
UChar* )((
void* )mem_end_stk[i])) - str);
1473 region->
beg[0] = ((pkeep > s) ? s : pkeep) - str;
1474 region->
end[0] = s - str;
1475 for (i = 1; i <= num_mem; i++) {
1478 region->
beg[i] =
STACK_AT(mem_start_stk[i])->u.mem.pstr - str;
1480 region->
beg[i] = (
UChar* )((
void* )mem_start_stk[i]) - str;
1483 ?
STACK_AT(mem_end_stk[i])->u.mem.pstr
1484 : (
UChar* )((
void* )mem_end_stk[i])) - str;
1491 #ifdef USE_CAPTURE_HISTORY 1502 history_tree_clear(node);
1506 node->
beg = ((pkeep > s) ? s : pkeep) - str;
1507 node->
end = s - str;
1510 r = make_capture_history_tree(region->
history_root, &stkp,
1511 stk, (
UChar* )str, reg);
1518 #ifdef USE_POSIX_API_REGION_OPTION 1524 #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 1546 if (*p != *s)
goto fail;
1549 if (*p != *s++)
goto fail;
1579 if (*p != *s)
goto fail;
1581 if (*p != *s)
goto fail;
1590 if (*p != *s)
goto fail;
1592 if (*p != *s)
goto fail;
1594 if (*p != *s)
goto fail;
1603 if (*p != *s)
goto fail;
1605 if (*p != *s)
goto fail;
1607 if (*p != *s)
goto fail;
1609 if (*p != *s)
goto fail;
1618 if (*p != *s)
goto fail;
1620 if (*p != *s)
goto fail;
1622 if (*p != *s)
goto fail;
1624 if (*p != *s)
goto fail;
1626 if (*p != *s)
goto fail;
1636 while (tlen-- > 0) {
1637 if (*p++ != *s++)
goto fail;
1662 if (*p != *q)
goto fail;
1674 if (*p != *s)
goto fail;
1676 if (*p != *s)
goto fail;
1683 if (*p != *s)
goto fail;
1685 if (*p != *s)
goto fail;
1688 if (*p != *s)
goto fail;
1690 if (*p != *s)
goto fail;
1698 if (*p != *s)
goto fail;
1700 if (*p != *s)
goto fail;
1702 if (*p != *s)
goto fail;
1704 if (*p != *s)
goto fail;
1707 if (*p != *s)
goto fail;
1709 if (*p != *s)
goto fail;
1718 while (tlen-- > 0) {
1719 if (*p != *s)
goto fail;
1721 if (*p != *s)
goto fail;
1732 while (tlen-- > 0) {
1733 if (*p != *s)
goto fail;
1735 if (*p != *s)
goto fail;
1737 if (*p != *s)
goto fail;
1750 while (tlen2-- > 0) {
1751 if (*p != *s)
goto fail;
1763 s +=
enclen(encode, s, end);
1778 mb_len =
enclen(encode, s, end);
1784 #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 1818 s +=
enclen(encode, s, end);
1828 goto cc_mb_not_success;
1836 int mb_len =
enclen(encode, s, end);
1842 goto cc_mb_not_success;
1849 #ifdef PLATFORM_UNALIGNED_WORD_ACCESS 1890 mb_len =
enclen(encode, s, end);
1902 n =
enclen(encode, s, end);
1911 n =
enclen(encode, s, end);
1920 n =
enclen(encode, s, end);
1932 n =
enclen(encode, s, end);
1951 n =
enclen(encode, s, end);
1966 n =
enclen(encode, s, end);
1981 #ifdef USE_COMBINATION_EXPLOSION_CHECK 1985 STATE_CHECK_VAL(scv, mem);
1988 STACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem, pkeep);
1989 n =
enclen(encode, s, end);
2003 STATE_CHECK_VAL(scv, mem);
2006 STACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem, pkeep);
2007 n =
enclen(encode, s, end);
2027 s +=
enclen(encode, s, end);
2036 s +=
enclen(encode, s, end);
2045 s +=
enclen(encode, s, end);
2054 s +=
enclen(encode, s, end);
2132 #ifdef USE_WORD_BEGIN_END 2209 #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE 2215 #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE 2228 #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE 2234 #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE 2244 #ifdef USE_CRNL_AS_LINE_TERMINATOR 2247 ss +=
enclen(encode, ss, end);
2308 #ifdef USE_SUBEXP_CALL 2349 UChar *pstart, *pend;
2353 if (mem > num_mem)
goto fail;
2358 pstart =
STACK_AT(mem_start_stk[mem])->u.mem.pstr;
2360 pstart = (
UChar* )((
void* )mem_start_stk[mem]);
2363 ?
STACK_AT(mem_end_stk[mem])->u.mem.pstr
2364 : (
UChar* )((
void* )mem_end_stk[mem]));
2369 while (sprev + (len =
enclen(encode, sprev, end)) < s)
2381 UChar *pstart, *pend;
2385 if (mem > num_mem)
goto fail;
2390 pstart =
STACK_AT(mem_start_stk[mem])->u.mem.pstr;
2392 pstart = (
UChar* )((
void* )mem_start_stk[mem]);
2395 ?
STACK_AT(mem_end_stk[mem])->u.mem.pstr
2396 : (
UChar* )((
void* )mem_end_stk[mem]));
2401 while (sprev + (len =
enclen(encode, sprev, end)) < s)
2412 UChar *pstart, *pend, *swork;
2415 for (i = 0; i < tlen; i++) {
2422 pstart =
STACK_AT(mem_start_stk[mem])->u.mem.pstr;
2424 pstart = (
UChar* )((
void* )mem_start_stk[mem]);
2427 ?
STACK_AT(mem_end_stk[mem])->u.mem.pstr
2428 : (
UChar* )((
void* )mem_end_stk[mem]));
2434 if (is_fail)
continue;
2436 while (sprev + (len =
enclen(encode, sprev, end)) < s)
2442 if (i == tlen)
goto fail;
2451 UChar *pstart, *pend, *swork;
2454 for (i = 0; i < tlen; i++) {
2461 pstart =
STACK_AT(mem_start_stk[mem])->u.mem.pstr;
2463 pstart = (
UChar* )((
void* )mem_start_stk[mem]);
2466 ?
STACK_AT(mem_end_stk[mem])->u.mem.pstr
2467 : (
UChar* )((
void* )mem_end_stk[mem]));
2473 if (is_fail)
continue;
2475 while (sprev + (len =
enclen(encode, sprev, end)) < s)
2481 if (i == tlen)
goto fail;
2487 #ifdef USE_BACKREF_WITH_LEVEL 2500 , case_fold_flag, (
int )
level, (
int )tlen, p, &s, end)) {
2501 while (sprev + (len =
enclen(encode, sprev, end)) < s)
2546 #ifdef ONIG_DEBUG_MATCH 2547 fprintf(stderr,
"NULL_CHECK_END: skip id:%d, s:%"PRIdPTR
" (%p)\n",
2564 goto unexpected_bytecode_error;
2573 #ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT 2581 #ifdef ONIG_DEBUG_MATCH 2582 fprintf(stderr,
"NULL_CHECK_END_MEMST: skip id:%d, s:%"PRIdPTR
" (%p)\n",
2585 if (isnull == -1)
goto fail;
2586 goto null_check_found;
2594 #ifdef USE_SUBEXP_CALL 2601 #ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT 2607 #ifdef ONIG_DEBUG_MATCH 2608 fprintf(stderr,
"NULL_CHECK_END_MEMST_PUSH: skip id:%d, s:%"PRIdPTR
" (%p)\n",
2611 if (isnull == -1)
goto fail;
2612 goto null_check_found;
2638 #ifdef USE_COMBINATION_EXPLOSION_CHECK 2641 STATE_CHECK_VAL(scv, mem);
2645 STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem, pkeep);
2653 STATE_CHECK_VAL(scv, mem);
2658 STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem, pkeep);
2666 STATE_CHECK_VAL(scv, mem);
2669 STACK_PUSH_STATE_CHECK(s, mem);
2744 si = repeat_stk[mem];
2774 si = repeat_stk[mem];
2816 sprev = stkp->
u.
state.pstr_prev;
2879 #ifdef USE_SUBEXP_CALL 2899 if ((mem > num_mem) ||
2919 sprev = stk->
u.
state.pstr_prev;
2920 pkeep = stk->
u.
state.pkeep;
2922 #ifdef USE_COMBINATION_EXPLOSION_CHECK 2923 if (stk->
u.
state.state_check != 0) {
2934 goto bytecode_error;
2942 if (xmalloc_base)
xfree(xmalloc_base);
2948 if (xmalloc_base)
xfree(xmalloc_base);
2954 if (xmalloc_base)
xfree(xmalloc_base);
2957 unexpected_bytecode_error:
2959 if (xmalloc_base)
xfree(xmalloc_base);
2970 end = (
UChar* )text_end;
2971 end -= target_end - target - 1;
2972 if (end > text_range)
2981 if (*s == *target) {
2984 if (target_end ==
t ||
memcmp(
t, p, target_end -
t) == 0)
2992 if (*s == *target) {
2995 if (target_end ==
t ||
memcmp(
t, p, target_end -
t) == 0)
2998 s +=
enclen(enc, s, text_end);
3015 while (lowlen > 0) {
3016 if (*
t++ != *q++)
return 0;
3031 end = (
UChar* )text_end;
3032 end -= target_end - target - 1;
3033 if (end > text_range)
3043 s +=
enclen(enc, s, text_end);
3052 const UChar* text_end,
const UChar* text_start)
3056 s = (
UChar* )text_end;
3057 s -= (target_end - target);
3059 s = (
UChar* )text_start;
3064 if (*s == *target) {
3067 while (
t < target_end) {
3072 if (
t == target_end)
3085 const UChar* text_end,
const UChar* text_start)
3089 s = (
UChar* )text_end;
3090 s -= (target_end - target);
3092 s = (
UChar* )text_start;
3098 target, target_end, s, text_end))
3107 #ifndef USE_SUNDAY_QUICK_SEARCH 3112 const UChar* text_range)
3114 const UChar *s, *se, *
t, *p, *end;
3116 ptrdiff_t skip, tlen1;
3118 #ifdef ONIG_DEBUG_SEARCH 3119 fprintf(stderr,
"bm_search_notrev: text: %"PRIuPTR
" (%p), text_end: %"PRIuPTR
" (%p), text_range: %"PRIuPTR
" (%p)\n",
3120 text, text, text_end, text_end, text_range, text_range);
3123 tail = target_end - 1;
3124 tlen1 =
tail - target;
3126 if (end + tlen1 > text_end)
3127 end = text_end - tlen1;
3136 if (
t == target)
return (
UChar* )s;
3139 skip = reg->
map[*se];
3143 }
while ((s -
t) < skip && s < end);
3151 if (
t == target)
return (
UChar* )s;
3158 }
while ((s -
t) < skip && s < end);
3170 const UChar *s, *
t, *p, *end;
3173 #ifdef ONIG_DEBUG_SEARCH 3174 fprintf(stderr,
"bm_search: text: %"PRIuPTR
", text_end: %"PRIuPTR
", text_range: %"PRIuPTR
"\n",
3175 text, text_end, text_range);
3178 end = text_range + (target_end - target) - 1;
3182 tail = target_end - 1;
3183 s = text + (target_end - target) - 1;
3188 #ifdef ONIG_DEBUG_SEARCH 3189 fprintf(stderr,
"bm_search_loop: pos: %d %s\n",
3190 (
int)(s - text), s);
3193 if (
t == target)
return (
UChar* )p;
3204 if (
t == target)
return (
UChar* )p;
3217 const UChar* text_range)
3219 const UChar *s, *se, *
t, *end;
3221 ptrdiff_t skip, tlen1;
3225 #ifdef ONIG_DEBUG_SEARCH 3226 fprintf(stderr,
"bm_search_notrev_ic: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n",
3227 (
int )text, text, (
int )text_end, text_end, (
int )text_range, text_range);
3230 tail = target_end - 1;
3231 tlen1 =
tail - target;
3233 if (end + tlen1 > text_end)
3234 end = text_end - tlen1;
3244 skip = reg->
map[*se];
3248 }
while ((s -
t) < skip && s < end);
3261 }
while ((s -
t) < skip && s < end);
3273 const UChar *s, *p, *end;
3278 #ifdef ONIG_DEBUG_SEARCH 3279 fprintf(stderr,
"bm_search_ic: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n",
3280 (
int )text, text, (
int )text_end, text_end, (
int )text_range, text_range);
3283 end = text_range + (target_end - target) - 1;
3287 tail = target_end - 1;
3288 s = text + (target_end - target) - 1;
3291 p = s - (target_end - target) + 1;
3300 p = s - (target_end - target) + 1;
3316 const UChar* text_range)
3318 const UChar *s, *se, *
t, *p, *end;
3320 ptrdiff_t skip, tlen1;
3323 #ifdef ONIG_DEBUG_SEARCH 3324 fprintf(stderr,
"bm_search_notrev: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n",
3325 (
int )text, text, (
int )text_end, text_end, (
int )text_range, text_range);
3328 tail = target_end - 1;
3329 tlen1 =
tail - target;
3331 if (end + tlen1 > text_end)
3332 end = text_end - tlen1;
3341 if (
t == target)
return (
UChar* )s;
3344 if (s + 1 >= end)
break;
3345 skip = reg->
map[se[1]];
3348 s +=
enclen(enc, s, end);
3349 }
while ((s -
t) < skip && s < end);
3357 if (
t == target)
return (
UChar* )s;
3360 if (s + 1 >= end)
break;
3364 s +=
enclen(enc, s, end);
3365 }
while ((s -
t) < skip && s < end);
3377 const UChar *s, *
t, *p, *end;
3381 tail = target_end - 1;
3382 tlen1 =
tail - target;
3383 end = text_range + tlen1;
3393 if (
t == target)
return (
UChar* )p;
3396 if (s + 1 >= end)
break;
3397 s += reg->
map[s[1]];
3405 if (
t == target)
return (
UChar* )p;
3408 if (s + 1 >= end)
break;
3419 const UChar* text_range)
3421 const UChar *s, *se, *
t, *end;
3423 ptrdiff_t skip, tlen1;
3427 #ifdef ONIG_DEBUG_SEARCH 3428 fprintf(stderr,
"bm_search_notrev_ic: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n",
3429 (
int )text, text, (
int )text_end, text_end, (
int )text_range, text_range);
3432 tail = target_end - 1;
3433 tlen1 =
tail - target;
3435 if (end + tlen1 > text_end)
3436 end = text_end - tlen1;
3446 if (s + 1 >= end)
break;
3447 skip = reg->
map[se[1]];
3450 s +=
enclen(enc, s, end);
3451 }
while ((s -
t) < skip && s < end);
3460 if (s + 1 >= end)
break;
3464 s +=
enclen(enc, s, end);
3465 }
while ((s -
t) < skip && s < end);
3477 const UChar *s, *p, *end;
3483 #ifdef ONIG_DEBUG_SEARCH 3484 fprintf(stderr,
"bm_search_ic: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n",
3485 (
int )text, text, (
int )text_end, text_end, (
int )text_range, text_range);
3488 tail = target_end - 1;
3489 tlen1 =
tail - target;
3490 end = text_range + tlen1;
3501 if (s + 1 >= end)
break;
3502 s += reg->
map[s[1]];
3511 if (s + 1 >= end)
break;
3530 len = (int )(end - s);
3534 for (i = len - 1; i > 0; i--)
3543 const UChar* text_end,
const UChar* text_start)
3547 s = text_end - (target_end - target);
3556 while (
t < target_end && *p == *
t) {
3559 if (
t == target_end)
3573 const UChar *s = text;
3575 while (s < text_range) {
3576 if (map[*s])
return (
UChar* )s;
3578 s +=
enclen(enc, s, text_end);
3586 const UChar* text_start,
const UChar* text_end)
3588 const UChar *s = text_start;
3591 if (map[*s])
return (
UChar* )s;
3606 #if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM) 3632 #ifdef USE_COMBINATION_EXPLOSION_CHECK 3634 int offset = at - str;
3652 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
3669 #ifdef ONIG_DEBUG_SEARCH 3670 fprintf(stderr,
"forward_search_range: str: %"PRIuPTR
" (%p), end: %"PRIuPTR
" (%p), s: %"PRIuPTR
" (%p), range: %"PRIuPTR
" (%p)\n",
3675 if (reg->
dmin > 0) {
3681 while (p < q) p +=
enclen(reg->
enc, p, end);
3716 if (p && p <
range) {
3717 if (p - reg->
dmin < s) {
3731 (pprev ? pprev : str), p, end);
3739 #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE 3741 (pprev ? pprev : str), p);
3752 if (reg->
dmax == 0) {
3759 (pprev ? pprev : str), p, end);
3764 *low = p - reg->
dmax;
3767 *low, end, (
const UChar** )low_prev);
3768 if (low_prev &&
IS_NULL(*low_prev))
3770 (pprev ? pprev : s), *low, end);
3775 (pprev ? pprev : str), *low, end);
3780 *high = p - reg->
dmin;
3782 #ifdef ONIG_DEBUG_SEARCH 3784 "forward_search_range success: low: %d, high: %d, dmin: %d, dmax: %d\n",
3785 (
int )(*low - str), (
int )(*high - str), reg->
dmin, reg->
dmax);
3796 #define BM_BACKWARD_SEARCH_LENGTH_THRESHOLD 100 3814 range, adjrange, end, p);
3822 range, adjrange, end, p);
3861 #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE 3881 *low = p - reg->
dmax;
3882 *high = p - reg->
dmin;
3886 #ifdef ONIG_DEBUG_SEARCH 3887 fprintf(stderr,
"backward_search_range: low: %d, high: %d\n",
3888 (
int )(*low - str), (
int )(*high - str));
3894 #ifdef ONIG_DEBUG_SEARCH 3895 fprintf(stderr,
"backward_search_range: fail.\n");
3910 const UChar* global_pos,
3916 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 3917 const UChar *orig_start = start;
3921 #if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM) 3946 #ifdef ONIG_DEBUG_SEARCH 3948 "onig_search (entry point): str: %"PRIuPTR
" (%p), end: %"PRIuPTR
", start: %"PRIuPTR
", range: %"PRIuPTR
"\n",
3949 str, str, end - str, start - str,
range - str);
3958 if (r)
goto finish_no_msa;
3961 if (start > end || start < str)
goto mismatch_no_msa;
3964 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 3965 #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 3966 #define MATCH_AND_RETURN_CHECK(upper_range) \ 3967 r = match_at(reg, str, end, (upper_range), s, prev, &msa); \ 3968 if (r != ONIG_MISMATCH) {\ 3970 if (! IS_FIND_LONGEST(reg->options)) {\ 3977 #define MATCH_AND_RETURN_CHECK(upper_range) \ 3978 r = match_at(reg, str, end, (upper_range), s, prev, &msa); \ 3979 if (r != ONIG_MISMATCH) {\ 3987 #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 3988 #define MATCH_AND_RETURN_CHECK(none) \ 3989 r = match_at(reg, str, end, s, prev, &msa);\ 3990 if (r != ONIG_MISMATCH) {\ 3992 if (! IS_FIND_LONGEST(reg->options)) {\ 3999 #define MATCH_AND_RETURN_CHECK(none) \ 4000 r = match_at(reg, str, end, s, prev, &msa);\ 4001 if (r != ONIG_MISMATCH) {\ 4012 if (reg->
anchor != 0 && str < end) {
4013 UChar *min_semi_end, *max_semi_end;
4025 if (
range > start) {
4026 if (start != str)
goto mismatch_no_msa;
4035 goto mismatch_no_msa;
4039 min_semi_end = max_semi_end = (
UChar* )end;
4043 goto mismatch_no_msa;
4045 if (
range > start) {
4055 if (start >
range)
goto mismatch_no_msa;
4067 if (
range > start)
goto mismatch_no_msa;
4073 max_semi_end = (
UChar* )end;
4075 min_semi_end = pre_end;
4077 #ifdef USE_CRNL_AS_LINE_TERMINATOR 4082 min_semi_end = pre_end;
4085 if (min_semi_end > str && start <= min_semi_end) {
4090 min_semi_end = (
UChar* )end;
4096 goto begin_position;
4100 else if (str == end) {
4101 static const UChar address_for_empty_string[] =
"";
4103 #ifdef ONIG_DEBUG_SEARCH 4104 fprintf(stderr,
"onig_search: empty string.\n");
4108 start = end = str = address_for_empty_string;
4113 #ifdef USE_COMBINATION_EXPLOSION_CHECK 4114 msa.state_check_buff = (
void* )0;
4115 msa.state_check_buff_size = 0;
4120 goto mismatch_no_msa;
4123 #ifdef ONIG_DEBUG_SEARCH 4124 fprintf(stderr,
"onig_search(apply anchor): end: %d, start: %d, range: %d\n",
4125 (
int )(end - str), (
int )(start - str), (
int )(
range - str));
4129 #ifdef USE_COMBINATION_EXPLOSION_CHECK 4131 int offset = (
MIN(start,
range) - str);
4137 if (
range > start) {
4144 UChar *sch_range, *low, *high, *low_prev;
4147 if (reg->
dmax != 0) {
4149 sch_range = (
UChar* )end;
4151 sch_range += reg->
dmax;
4152 if (sch_range > end) sch_range = (
UChar* )end;
4162 &low, &high, &low_prev))
goto mismatch;
4172 }
while (s <
range);
4177 &low, &high, (
UChar** )
NULL))
goto mismatch;
4194 }
while (s <
range);
4204 }
while (s <
range);
4211 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 4212 if (orig_start < end)
4213 orig_start +=
enclen(reg->
enc, orig_start, end);
4217 UChar *low, *high, *adjrange, *sch_start;
4222 adjrange = (
UChar* )end;
4227 sch_start = s + reg->
dmax;
4228 if (sch_start > end) sch_start = (
UChar* )end;
4241 }
while (s >=
range);
4248 if (reg->
dmax != 0) {
4250 sch_start = (
UChar* )end;
4252 sch_start += reg->
dmax;
4253 if (sch_start > end) sch_start = (
UChar* )end;
4256 start, sch_start, end);
4260 &low, &high) <= 0)
goto mismatch;
4268 }
while (s >=
range);
4272 #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 4298 fprintf(stderr,
"onig_search: error %d\n", r);
4308 fprintf(stderr,
"onig_search: error %d\n", r);
4351 #ifdef USE_CAPTURE_HISTORY
#define STACK_PUSH_POS_NOT(pat, s, sprev, keep)
int onig_region_resize(OnigRegion *region, int n)
#define ANCHOR_ANYCHAR_STAR_ML
#define IS_POSIX_REGION(option)
#define BIT_STATUS_AT(stats, n)
static int mem_is_in_memp(int mem, int num, UChar *memp)
unsigned int OnigCodePoint
unsigned int onig_get_match_stack_limit_size(void)
#define STACK_RETURN(addr)
static UChar * slow_search_backward(OnigEncoding enc, UChar *target, UChar *target_end, const UChar *text, const UChar *adjust_text, const UChar *text_end, const UChar *text_start)
static int str_lower_case_match(OnigEncoding enc, int case_fold_flag, const UChar *t, const UChar *tend, const UChar *p, const UChar *end)
#define STACK_GET_MEM_START(mnum, k)
#define DATA_ENSURE_CHECK(n)
#define IS_NOTEOL(option)
#define STACK_PUSH_STOP_BT
size_t strlen(const char *)
#define STACK_PUSH_MEM_END_MARK(mnum)
static int forward_search_range(regex_t *reg, const UChar *str, const UChar *end, UChar *s, UChar *range, UChar **low, UChar **high, UChar **low_prev)
void onig_print_compiled_byte_code(FILE *f, UChar *bp, UChar *bpend, UChar **nextp, OnigEncoding enc)
#define ONIG_OPTIMIZE_EXACT
#define ONIGERR_STACK_BUG
#define ONIGENC_IS_MBC_NEWLINE(enc, p, end)
#define STACK_POP_TIL_POS_NOT
static int onig_region_resize_clear(OnigRegion *region, int n)
struct _OnigStackType::@135::@139 mem
UChar * onigenc_get_right_adjust_char_head(OnigEncoding enc, const UChar *start, const UChar *s, const UChar *end)
unsigned int OnigCaseFoldType
#define ONIGENC_MBC_CASE_FOLD(enc, flag, pp, end, buf)
#define STACK_PUSH_ENSURED(stack_type, pat)
#define ANCHOR_BEGIN_LINE
int onig_set_match_stack_limit_size(unsigned int size)
void onig_region_copy(OnigRegion *to, OnigRegion *from)
int onig_is_in_code_range(const UChar *p, OnigCodePoint code)
#define GET_STATE_CHECK_NUM_INC(num, p)
#define ONIG_REGION_NOTPOS
static int backref_match_at_nested_level(regex_t *reg, OnigStackType *top, OnigStackType *stk_base, int ignore_case, int case_fold_flag, int nest, int mem_num, UChar *memp, UChar **s, const UChar *send)
#define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos)
OnigOptionType onig_get_options(regex_t *reg)
struct _OnigStackType::@135::@136 state
static OnigPosition match_at(regex_t *reg, const UChar *str, const UChar *end, const UChar *sstart, UChar *sprev, OnigMatchArg *msa)
#define USE_POSIX_API_REGION_OPTION
#define STACK_PUSH_MEM_END(mnum, s)
static int set_bm_backward_skip(UChar *s, UChar *end, OnigEncoding enc ARG_UNUSED, int **skip)
void onig_region_clear(OnigRegion *region)
unsigned char map[ONIG_CHAR_TABLE_SIZE]
#define STACK_NULL_CHECK_MEMST(isnull, id, s, reg)
#define STACK_PUSH_NULL_CHECK_END(cnum)
#define ONIG_OPTIMIZE_EXACT_IC
#define MATCH_AND_RETURN_CHECK(none)
UChar * onigenc_get_right_adjust_char_head_with_prev(OnigEncoding enc, const UChar *start, const UChar *s, const UChar *end, const UChar **prev)
#define GET_OPTION_INC(option, p)
#define ANCHOR_BEGIN_POSITION
#define GET_LENGTH_INC(len, p)
unsigned int OnigOptionType
union _OnigStackType::@135 u
OnigCaptureTreeNode * history_root
int onig_number_of_captures(regex_t *reg)
unsigned int bt_mem_start
#define STACK_PUSH_LOOK_BEHIND_NOT(pat, s, sprev, keep)
#define INIT_MATCH_STACK_SIZE
#define STACK_STOP_BT_END
static UChar * map_search(OnigEncoding enc, UChar map[], const UChar *text, const UChar *text_range, const UChar *text_end)
#define STACK_GET_REPEAT(id, k)
#define MATCH_ARG_FREE(msa)
UChar * onigenc_get_prev_char_head(OnigEncoding enc, const UChar *start, const UChar *s, const UChar *end)
#define ONIGENC_STEP_BACK(enc, start, s, end, n)
static unsigned int MatchStackLimitSize
void onig_chain_reduce(regex_t *reg)
#define ONIGENC_IS_MBC_CRNL(enc, p, end)
OnigRepeatRange * repeat_range
#define GET_MEMNUM_INC(num, p)
#define ONIG_OPTIMIZE_EXACT_BM_NOT_REV_IC
#define THREAD_ATOMIC_END
int onig_region_set(OnigRegion *region, int at, int beg, int end)
void onig_region_init(OnigRegion *region)
#define CHECK_INTERRUPT_IN_MATCH_AT
OnigCaseFoldType case_fold_flag
static UChar * bm_search_notrev(regex_t *reg, const UChar *target, const UChar *target_end, const UChar *text, const UChar *text_end, const UChar *text_range)
#define ONIG_CHAR_TABLE_SIZE
#define IS_FIND_LONGEST(option)
#define ONIG_STATE_NORMAL
#define DATA_ENSURE_CHECK1
OnigEncoding onig_get_encoding(regex_t *reg)
#define ALIGNMENT_RIGHT(addr)
#define ONIGERR_UNEXPECTED_BYTECODE
#define BITSET_AT(bs, pos)
#define ONIGENC_IS_MBC_HEAD(enc, p, e)
#define CHECK_NULL_RETURN_MEMERR(p)
void onig_region_free(OnigRegion *r, int free_self)
#define ONIG_OPTIMIZE_MAP
#define GET_STACK_INDEX(stk)
#define range(low, item, hi)
static UChar * bm_search_ic(regex_t *reg, const UChar *target, const UChar *target_end, const UChar *text, const UChar *text_end, const UChar *text_range)
struct re_pattern_buffer * chain
#define DEFAULT_MATCH_STACK_LIMIT_SIZE
static int stack_double(OnigStackType **arg_stk_base, OnigStackType **arg_stk_end, OnigStackType **arg_stk, OnigStackType *stk_alloc, OnigMatchArg *msa)
static UChar * slow_search_ic(OnigEncoding enc, int case_fold_flag, UChar *target, UChar *target_end, const UChar *text, const UChar *text_end, UChar *text_range)
#define ONIG_OPTIMIZE_EXACT_BM_IC
#define STACK_PUSH_CALL_FRAME(pat)
OnigPosition onig_search_gpos(regex_t *reg, const UChar *str, const UChar *end, const UChar *global_pos, const UChar *start, const UChar *range, OnigRegion *region, OnigOptionType option)
#define THREAD_ATOMIC_START
#define ONIGENC_IS_MBC_WORD(enc, s, end)
#define ONIGENC_MBC_CASE_FOLD_MAXLEN
#define STRING_CMP_IC(case_fold_flag, s1, ps2, len, text_end)
#define STRING_CMP(s1, s2, len)
struct _OnigStackType::@135::@137 repeat
#define STACK_PUSH_RETURN
#define ONIGENC_IS_MBC_NEWLINE_EX(enc, p, start, end, option, check_prev)
unsigned char buf[MIME_BUF_SIZE]
#define THREAD_PASS_LIMIT_COUNT
#define ONIG_STATE_INC(reg)
#define STRING_CMP_VALUE(s1, s2, len, is_fail)
#define STACK_NULL_CHECK(isnull, id, s)
#define ONIGENC_IS_MBC_ASCII_WORD(enc, s, end)
#define ANCHOR_SEMI_END_BUF
#define ONIG_OPTIMIZE_NONE
int memcmp(const void *s1, const void *s2, size_t len)
#define STACK_PUSH_POS(s, sprev, keep)
#define ONIG_INFINITE_DISTANCE
static UChar * bm_search_backward(regex_t *reg, const UChar *target, const UChar *target_end, const UChar *text, const UChar *adjust_text, const UChar *text_end, const UChar *text_start)
#define ONIGENC_MBC_TO_CODE(enc, p, end)
#define ANCHOR_ANYCHAR_STAR
struct OnigCaptureTreeNodeStruct ** childs
#define CHECK_NULL_RETURN(p)
unsigned char * exact_end
static int backward_search_range(regex_t *reg, const UChar *str, const UChar *end, UChar *s, const UChar *range, UChar *adjrange, UChar **low, UChar **high)
#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s, end)
static UChar * map_search_backward(OnigEncoding enc, UChar map[], const UChar *text, const UChar *adjust_text, const UChar *text_start, const UChar *text_end)
OnigPosition onig_search(regex_t *reg, const UChar *str, const UChar *end, const UChar *start, const UChar *range, OnigRegion *region, OnigOptionType option)
#define STACK_PUSH_NULL_CHECK_START(cnum, s)
#define SIZE_OP_SET_OPTION
OnigPosition onig_match(regex_t *reg, const UChar *str, const UChar *end, const UChar *at, OnigRegion *region, OnigOptionType option)
#define GET_RELADDR_INC(addr, p)
#define ONIG_MAX_CAPTURE_HISTORY_GROUP
#define ANCHOR_PREC_READ_NOT
#define STACK_PUSH_MEM_START(mnum, s)
static UChar * bm_search(regex_t *reg, const UChar *target, const UChar *target_end, const UChar *text, const UChar *text_end, const UChar *text_range)
static UChar * slow_search(OnigEncoding enc, UChar *target, UChar *target_end, const UChar *text, const UChar *text_end, UChar *text_range)
#define IS_NEWLINE_CRLF(option)
unsigned int capture_history
int onig_number_of_capture_histories(regex_t *reg)
#define IS_FIND_CONDITION(option)
const OnigSyntaxType * syntax
void onig_copy_encoding(OnigEncoding to, OnigEncoding from)
OnigCaseFoldType onig_get_case_fold_flag(regex_t *reg)
#define STRING_CMP_VALUE_IC(case_fold_flag, s1, ps2, len, text_end, is_fail)
#define STACK_PUSH_ALT(pat, s, sprev, keep)
#define IS_NOTBOL(option)
#define ONIGERR_INVALID_ARGUMENT
int onig_is_code_in_cc_len(int elen, OnigCodePoint code, CClassNode *cc)
static UChar * slow_search_backward_ic(OnigEncoding enc, int case_fold_flag, UChar *target, UChar *target_end, const UChar *text, const UChar *adjust_text, const UChar *text_end, const UChar *text_start)
#define ONIGERR_UNDEFINED_BYTECODE
#define ONIG_OPTIMIZE_EXACT_BM_NOT_REV
#define ONIGERR_MATCH_STACK_LIMIT_OVER
#define STACK_INIT(alloc_addr, heap_addr, ptr_num, stack_num)
#define USE_CRNL_AS_LINE_TERMINATOR
OnigRegion * onig_region_new(void)
#define ANCHOR_LOOK_BEHIND
#define STACK_PUSH_REPEAT_INC(sindex)
#define GET_POINTER_INC(ptr, p)
static UChar * bm_search_notrev_ic(regex_t *reg, const UChar *target, const UChar *target_end, const UChar *text, const UChar *text_end, const UChar *text_range)
#define STK_STATE_CHECK_MARK
#define ONIGENC_IS_SINGLEBYTE(enc)
#define BM_BACKWARD_SEARCH_LENGTH_THRESHOLD
#define ONIG_OPTIMIZE_EXACT_BM
#define STACK_POP_TIL_LOOK_BEHIND_NOT
const OnigSyntaxType * onig_get_syntax(regex_t *reg)
#define INVALID_STACK_INDEX
stack
static int set_bm_backward_skip P_((UChar *s, UChar *end, OnigEncoding enc, int **skip))
#define STACK_NULL_CHECK_REC(isnull, id, s)
#define IS_FIND_NOT_EMPTY(option)
static int match(VALUE str, VALUE pat, VALUE hash, int(*cb)(VALUE, VALUE))
static int is_mbc_newline_ex(OnigEncoding enc, const UChar *p, const UChar *start, const UChar *end, OnigOptionType option, int check_prev)
static int string_cmp_ic(OnigEncoding enc, int case_fold_flag, UChar *s1, UChar **ps2, OnigDistance mblen, const UChar *text_end)
#define GET_ABSADDR_INC(addr, p)
#define enclen(enc, p, e)
#define STACK_PUSH_REPEAT(id, pat)
#define ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT
#define ONIG_STATE_DEC_THREAD(reg)
#define STACK_NULL_CHECK_MEMST_REC(isnull, id, s, reg)