Changeset 331 for EcnlProtoTool/trunk/onigmo-6.1.3/src/regexec.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/regexec.c
r321 r331 4 4 /*- 5 5 * Copyright (c) 2002-2008 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 "regint.h" 32 32 33 #define USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 34 35 #ifndef USE_DIRECT_THREADED_VM 33 #ifdef RUBY 34 # undef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 35 #else 36 # define USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 37 #endif 38 39 #ifndef USE_TOKEN_THREADED_VM 36 40 # ifdef __GNUC__ 37 # define USE_DIRECT_THREADED_VM 141 # define USE_TOKEN_THREADED_VM 1 38 42 # else 39 # define USE_DIRECT_THREADED_VM 043 # define USE_TOKEN_THREADED_VM 0 40 44 # endif 41 45 #endif 42 46 47 #ifdef RUBY 48 # define ENC_DUMMY_FLAG (1<<24) 49 static inline int 50 rb_enc_asciicompat(OnigEncoding enc) 51 { 52 return ONIGENC_MBC_MINLEN(enc)==1 && !((enc)->ruby_encoding_index & ENC_DUMMY_FLAG); 53 } 54 # undef ONIGENC_IS_MBC_ASCII_WORD 55 # define ONIGENC_IS_MBC_ASCII_WORD(enc,s,end) \ 56 (rb_enc_asciicompat(enc) ? (ISALNUM(*s) || *s=='_') : \ 57 onigenc_ascii_is_code_ctype( \ 58 ONIGENC_MBC_TO_CODE(enc,s,end),ONIGENC_CTYPE_WORD,enc)) 59 #endif /* RUBY */ 60 43 61 #ifdef USE_CRNL_AS_LINE_TERMINATOR 44 # define ONIGENC_IS_MBC_CRNL(enc,p,end) \62 # define ONIGENC_IS_MBC_CRNL(enc,p,end) \ 45 63 (ONIGENC_MBC_TO_CODE(enc,p,end) == 13 && \ 46 ONIGENC_MBC_TO_CODE(enc,(p+enclen(enc,p )),end) == 10)47 # define ONIGENC_IS_MBC_NEWLINE_EX(enc,p,start,end,option,check_prev) \64 ONIGENC_MBC_TO_CODE(enc,(p+enclen(enc,p,end)),end) == 10) 65 # define ONIGENC_IS_MBC_NEWLINE_EX(enc,p,start,end,option,check_prev) \ 48 66 is_mbc_newline_ex((enc),(p),(start),(end),(option),(check_prev)) 49 67 static int … … 54 72 if (ONIGENC_MBC_TO_CODE(enc, p, end) == 0x0a) { 55 73 if (check_prev) { 56 const UChar *prev = onigenc_get_prev_char_head(enc, start, p );74 const UChar *prev = onigenc_get_prev_char_head(enc, start, p, end); 57 75 if ((prev != NULL) && ONIGENC_MBC_TO_CODE(enc, prev, end) == 0x0d) 58 76 return 0; … … 64 82 } 65 83 else { 66 const UChar *pnext = p + enclen(enc, p );84 const UChar *pnext = p + enclen(enc, p, end); 67 85 if (pnext < end && 68 86 ONIGENC_MBC_TO_CODE(enc, p, end) == 0x0d && … … 79 97 } 80 98 #else /* USE_CRNL_AS_LINE_TERMINATOR */ 81 # define ONIGENC_IS_MBC_NEWLINE_EX(enc,p,start,end,option,check_prev) \99 # define ONIGENC_IS_MBC_NEWLINE_EX(enc,p,start,end,option,check_prev) \ 82 100 ONIGENC_IS_MBC_NEWLINE((enc), (p), (end)) 83 101 #endif /* USE_CRNL_AS_LINE_TERMINATOR */ … … 94 112 for (i = 0; i < node->num_childs; i++) { 95 113 if (IS_NOT_NULL(node->childs[i])) { 96 114 history_tree_free(node->childs[i]); 97 115 } 98 116 } … … 145 163 history_tree_add_child(OnigCaptureTreeNode* parent, OnigCaptureTreeNode* child) 146 164 { 147 # define HISTORY_TREE_INIT_ALLOC_SIZE 8165 # define HISTORY_TREE_INIT_ALLOC_SIZE 8 148 166 149 167 if (parent->num_childs >= parent->allocated) { … … 153 171 n = HISTORY_TREE_INIT_ALLOC_SIZE; 154 172 parent->childs = 155 173 (OnigCaptureTreeNode** )xmalloc(sizeof(OnigCaptureTreeNode*) * n); 156 174 CHECK_NULL_RETURN_MEMERR(parent->childs); 157 175 } … … 160 178 n = parent->allocated * 2; 161 179 tmp = 162 163 180 (OnigCaptureTreeNode** )xrealloc(parent->childs, 181 sizeof(OnigCaptureTreeNode*) * n); 164 182 if (tmp == 0) { 165 183 history_tree_clear(parent); … … 337 355 338 356 extern void 339 onig_region_copy(OnigRegion* to, OnigRegion* from)357 onig_region_copy(OnigRegion* to, const OnigRegion* from) 340 358 { 341 359 #define RREGC_SIZE (sizeof(int) * from->num_regs) … … 386 404 #define STK_RETURN 0x0900 387 405 #define STK_VOID 0x0a00 /* for fill a blank */ 406 #define STK_ABSENT_POS 0x0b00 /* for absent */ 407 #define STK_ABSENT 0x0c00 /* absent inner loop marker */ 388 408 389 409 /* stack type check mask */ … … 393 413 394 414 #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 395 # define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos) do {\415 # define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos) do {\ 396 416 (msa).stack_p = (void* )0;\ 397 417 (msa).options = (arg_option);\ … … 402 422 } while(0) 403 423 #else 404 # define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos) do {\424 # define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos) do {\ 405 425 (msa).stack_p = (void* )0;\ 406 426 (msa).options = (arg_option);\ … … 413 433 #ifdef USE_COMBINATION_EXPLOSION_CHECK 414 434 415 # define STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE 16416 417 # define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num) do { \435 # define STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE 16 436 437 # define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num) do { \ 418 438 if ((state_num) > 0 && str_len >= STATE_CHECK_STRING_THRESHOLD_LEN) {\ 419 439 unsigned int size = (unsigned int )(((str_len) + 1) * (state_num) + 7) >> 3;\ … … 441 461 } while(0) 442 462 443 # define MATCH_ARG_FREE(msa) do {\463 # define MATCH_ARG_FREE(msa) do {\ 444 464 if ((msa).stack_p) xfree((msa).stack_p);\ 445 465 if ((msa).state_check_buff_size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) { \ … … 448 468 } while(0) 449 469 #else /* USE_COMBINATION_EXPLOSION_CHECK */ 450 #define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num) 451 #define MATCH_ARG_FREE(msa) if ((msa).stack_p) xfree((msa).stack_p) 470 # define MATCH_ARG_FREE(msa) if ((msa).stack_p) xfree((msa).stack_p) 452 471 #endif /* USE_COMBINATION_EXPLOSION_CHECK */ 453 472 … … 466 485 stk_end = stk_base + msa->stack_n;\ 467 486 } else {\ 468 stk_alloc = (OnigStackType* )x malloc(sizeof(OnigStackType) * (stack_num));\487 stk_alloc = (OnigStackType* )xalloca(sizeof(OnigStackType) * (stack_num));\ 469 488 stk_base = stk_alloc;\ 470 489 stk = stk_base;\ … … 472 491 }\ 473 492 } else if (msa->stack_p) {\ 474 alloc_addr = (char* )x malloc(sizeof(OnigStackIndex) * (ptr_num));\493 alloc_addr = (char* )xalloca(sizeof(OnigStackIndex) * (ptr_num));\ 475 494 heap_addr = NULL;\ 476 495 stk_alloc = (OnigStackType* )(msa->stack_p);\ … … 480 499 }\ 481 500 else {\ 482 alloc_addr = (char* )x malloc(sizeof(OnigStackIndex) * (ptr_num)\501 alloc_addr = (char* )xalloca(sizeof(OnigStackIndex) * (ptr_num)\ 483 502 + sizeof(OnigStackType) * (stack_num));\ 484 503 heap_addr = NULL;\ … … 538 557 if (limit_size != 0 && n > limit_size) { 539 558 if ((unsigned int )(stk_end - stk_base) == limit_size) 540 559 return ONIGERR_MATCH_STACK_LIMIT_OVER; 541 560 else 542 561 n = limit_size; 543 562 } 544 563 x = (OnigStackType* )xrealloc(stk_base, sizeof(OnigStackType) * n); … … 577 596 578 597 #ifdef USE_COMBINATION_EXPLOSION_CHECK 579 # define STATE_CHECK_POS(s,snum) \598 # define STATE_CHECK_POS(s,snum) \ 580 599 (((s) - str) * num_comb_exp_check + ((snum) - 1)) 581 # define STATE_CHECK_VAL(v,snum) do {\600 # define STATE_CHECK_VAL(v,snum) do {\ 582 601 if (state_check_buff != NULL) {\ 583 602 int x = STATE_CHECK_POS(s,snum);\ … … 588 607 589 608 590 # define ELSE_IF_STATE_CHECK_MARK(stk) \609 # define ELSE_IF_STATE_CHECK_MARK(stk) \ 591 610 else if ((stk)->type == STK_STATE_CHECK_MARK) { \ 592 611 int x = STATE_CHECK_POS(stk->u.state.pstr, stk->u.state.state_check);\ … … 594 613 } 595 614 596 # define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\615 # define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\ 597 616 STACK_ENSURE(1);\ 598 617 stk->type = (stack_type);\ … … 605 624 } while(0) 606 625 607 # define STACK_PUSH_ENSURED(stack_type,pat) do {\626 # define STACK_PUSH_ENSURED(stack_type,pat) do {\ 608 627 stk->type = (stack_type);\ 609 628 stk->u.state.pcode = (pat);\ … … 612 631 } while(0) 613 632 614 # define STACK_PUSH_ALT_WITH_STATE_CHECK(pat,s,sprev,snum,keep) do {\633 # define STACK_PUSH_ALT_WITH_STATE_CHECK(pat,s,sprev,snum,keep) do {\ 615 634 STACK_ENSURE(1);\ 616 635 stk->type = STK_ALT;\ … … 623 642 } while(0) 624 643 625 # define STACK_PUSH_STATE_CHECK(s,snum) do {\644 # define STACK_PUSH_STATE_CHECK(s,snum) do {\ 626 645 if (state_check_buff != NULL) {\ 627 646 STACK_ENSURE(1);\ … … 635 654 #else /* USE_COMBINATION_EXPLOSION_CHECK */ 636 655 637 # define ELSE_IF_STATE_CHECK_MARK(stk)638 639 # define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\656 # define ELSE_IF_STATE_CHECK_MARK(stk) 657 658 # define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\ 640 659 STACK_ENSURE(1);\ 641 660 stk->type = (stack_type);\ … … 647 666 } while(0) 648 667 649 # define STACK_PUSH_ENSURED(stack_type,pat) do {\668 # define STACK_PUSH_ENSURED(stack_type,pat) do {\ 650 669 stk->type = (stack_type);\ 651 670 stk->u.state.pcode = (pat);\ … … 657 676 #define STACK_PUSH_POS(s,sprev,keep) STACK_PUSH(STK_POS,NULL_UCHARP,s,sprev,keep) 658 677 #define STACK_PUSH_POS_NOT(pat,s,sprev,keep) STACK_PUSH(STK_POS_NOT,pat,s,sprev,keep) 659 #define STACK_PUSH_STOP_BT STACK_PUSH_TYPE(STK_STOP_BT) 678 #define STACK_PUSH_ABSENT STACK_PUSH_TYPE(STK_ABSENT) 679 #define STACK_PUSH_STOP_BT STACK_PUSH_TYPE(STK_STOP_BT) 660 680 #define STACK_PUSH_LOOK_BEHIND_NOT(pat,s,sprev,keep) \ 661 681 STACK_PUSH(STK_LOOK_BEHIND_NOT,pat,s,sprev,keep) … … 769 789 } while(0) 770 790 791 #define STACK_PUSH_ABSENT_POS(start, end) do {\ 792 STACK_ENSURE(1);\ 793 stk->type = STK_ABSENT_POS;\ 794 stk->u.absent_pos.abs_pstr = (start);\ 795 stk->u.absent_pos.end_pstr = (end);\ 796 STACK_INC;\ 797 } while(0) 798 771 799 772 800 #ifdef ONIG_DEBUG 773 # define STACK_BASE_CHECK(p, at) \801 # define STACK_BASE_CHECK(p, at) \ 774 802 if ((p) < stk_base) {\ 775 803 fprintf(stderr, "at %s\n", at);\ … … 777 805 } 778 806 #else 779 # define STACK_BASE_CHECK(p, at)807 # define STACK_BASE_CHECK(p, at) 780 808 #endif 781 809 … … 867 895 ELSE_IF_STATE_CHECK_MARK(stk);\ 868 896 }\ 897 } while(0) 898 899 #define STACK_POP_TIL_ABSENT do {\ 900 while (1) {\ 901 stk--;\ 902 STACK_BASE_CHECK(stk, "STACK_POP_TIL_ABSENT"); \ 903 if (stk->type == STK_ABSENT) break;\ 904 else if (stk->type == STK_MEM_START) {\ 905 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 906 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 907 }\ 908 else if (stk->type == STK_REPEAT_INC) {\ 909 STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\ 910 }\ 911 else if (stk->type == STK_MEM_END) {\ 912 mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\ 913 mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\ 914 }\ 915 ELSE_IF_STATE_CHECK_MARK(stk);\ 916 }\ 917 } while(0) 918 919 #define STACK_POP_ABSENT_POS(start, end) do {\ 920 stk--;\ 921 STACK_BASE_CHECK(stk, "STACK_POP_ABSENT_POS"); \ 922 (start) = stk->u.absent_pos.abs_pstr;\ 923 (end) = stk->u.absent_pos.end_pstr;\ 869 924 } while(0) 870 925 … … 1064 1119 } while(0) 1065 1120 1066 #define STRING_CMP_IC(case_fold_flag,s1,ps2,len ) do {\1067 if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len ) == 0) \1121 #define STRING_CMP_IC(case_fold_flag,s1,ps2,len,text_end) do {\ 1122 if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len, text_end) == 0) \ 1068 1123 goto fail; \ 1069 1124 } while(0) 1070 1125 1071 1126 static int string_cmp_ic(OnigEncoding enc, int case_fold_flag, 1072 UChar* s1, UChar** ps2, OnigDistance mblen )1127 UChar* s1, UChar** ps2, OnigDistance mblen, const UChar* text_end) 1073 1128 { 1074 1129 UChar buf1[ONIGENC_MBC_CASE_FOLD_MAXLEN]; 1075 1130 UChar buf2[ONIGENC_MBC_CASE_FOLD_MAXLEN]; 1076 UChar *p1, *p2, *end1, *s2 , *end2;1131 UChar *p1, *p2, *end1, *s2; 1077 1132 int len1, len2; 1078 1133 1079 1134 s2 = *ps2; 1080 1135 end1 = s1 + mblen; 1081 end2 = s2 + mblen;1082 1136 while (s1 < end1) { 1083 len1 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s1, end1, buf1);1084 len2 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s2, end2, buf2);1137 len1 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s1, text_end, buf1); 1138 len2 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s2, text_end, buf2); 1085 1139 if (len1 != len2) return 0; 1086 1140 p1 = buf1; … … 1106 1160 } while(0) 1107 1161 1108 #define STRING_CMP_VALUE_IC(case_fold_flag,s1,ps2,len, is_fail) do {\1109 if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len ) == 0) \1162 #define STRING_CMP_VALUE_IC(case_fold_flag,s1,ps2,len,text_end,is_fail) do {\ 1163 if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len, text_end) == 0) \ 1110 1164 is_fail = 1; \ 1111 1165 else \ … … 1115 1169 1116 1170 #define IS_EMPTY_STR (str == end) 1117 #define ON_STR_BEGIN(s) ((s) == str)1118 #define ON_STR_END(s) ((s) == end)1171 #define ON_STR_BEGIN(s) ((s) == str) 1172 #define ON_STR_END(s) ((s) == end) 1119 1173 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 1120 #define DATA_ENSURE_CHECK1 (s < right_range) 1121 #define DATA_ENSURE_CHECK(n) (s + (n) <= right_range) 1122 #define DATA_ENSURE(n) if (s + (n) > right_range) goto fail 1174 # define DATA_ENSURE_CHECK1 (s < right_range) 1175 # define DATA_ENSURE_CHECK(n) (s + (n) <= right_range) 1176 # define DATA_ENSURE(n) if (s + (n) > right_range) goto fail 1177 # define ABSENT_END_POS right_range 1123 1178 #else 1124 #define DATA_ENSURE_CHECK1 (s < end) 1125 #define DATA_ENSURE_CHECK(n) (s + (n) <= end) 1126 #define DATA_ENSURE(n) if (s + (n) > end) goto fail 1179 # define DATA_ENSURE_CHECK1 (s < end) 1180 # define DATA_ENSURE_CHECK(n) (s + (n) <= end) 1181 # define DATA_ENSURE(n) if (s + (n) > end) goto fail 1182 # define ABSENT_END_POS end 1127 1183 #endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */ 1128 1184 … … 1141 1197 n = k->u.mem.num; 1142 1198 if (n <= ONIG_MAX_CAPTURE_HISTORY_GROUP && 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1199 BIT_STATUS_AT(reg->capture_history, n) != 0) { 1200 child = history_node_new(); 1201 CHECK_NULL_RETURN_MEMERR(child); 1202 child->group = n; 1203 child->beg = k->u.mem.pstr - str; 1204 r = history_tree_add_child(node, child); 1205 if (r != 0) { 1206 history_tree_free(child); 1207 return r; 1208 } 1209 *kp = (k + 1); 1210 r = make_capture_history_tree(child, kp, stk_top, str, reg); 1211 if (r != 0) return r; 1212 1213 k = *kp; 1214 child->end = k->u.mem.pstr - str; 1159 1215 } 1160 1216 } 1161 1217 else if (k->type == STK_MEM_END) { 1162 1218 if (k->u.mem.num == node->group) { 1163 1164 1165 1219 node->end = k->u.mem.pstr - str; 1220 *kp = k; 1221 return 0; 1166 1222 } 1167 1223 } … … 1186 1242 } 1187 1243 1188 static int backref_match_at_nested_level(regex_t* reg 1189 , OnigStackType* top, OnigStackType* stk_base1190 , int ignore_case, int case_fold_flag1191 ,int nest, int mem_num, UChar* memp, UChar** s, const UChar* send)1244 static int backref_match_at_nested_level(regex_t* reg, 1245 OnigStackType* top, OnigStackType* stk_base, 1246 int ignore_case, int case_fold_flag, 1247 int nest, int mem_num, UChar* memp, UChar** s, const UChar* send) 1192 1248 { 1193 1249 UChar *ss, *p, *pstart, *pend = NULL_UCHARP; … … 1216 1272 if (ignore_case != 0) { 1217 1273 if (string_cmp_ic(reg->enc, case_fold_flag, 1218 pstart, &ss, pend - pstart ) == 0)1274 pstart, &ss, pend - pstart, send) == 0) 1219 1275 return 0; /* or goto next_mem; */ 1220 1276 } … … 1246 1302 #ifdef ONIG_DEBUG_STATISTICS 1247 1303 1248 #define USE_TIMEOFDAY 1249 1250 #ifdef USE_TIMEOFDAY 1251 #ifdef HAVE_SYS_TIME_H 1252 #include <sys/time.h> 1253 #endif 1254 #ifdef HAVE_UNISTD_H 1255 #include <unistd.h> 1256 #endif 1304 # ifdef _WIN32 1305 # include <windows.h> 1306 static LARGE_INTEGER ts, te, freq; 1307 # define GETTIME(t) QueryPerformanceCounter(&(t)) 1308 # define TIMEDIFF(te,ts) (unsigned long )(((te).QuadPart - (ts).QuadPart) \ 1309 * 1000000 / freq.QuadPart) 1310 # else /* _WIN32 */ 1311 1312 # define USE_TIMEOFDAY 1313 1314 # ifdef USE_TIMEOFDAY 1315 # ifdef HAVE_SYS_TIME_H 1316 # include <sys/time.h> 1317 # endif 1318 # ifdef HAVE_UNISTD_H 1319 # include <unistd.h> 1320 # endif 1257 1321 static struct timeval ts, te; 1258 # define GETTIME(t)gettimeofday(&(t), (struct timezone* )0)1259 # define TIMEDIFF(te,ts)(((te).tv_usec - (ts).tv_usec) + \1260 (((te).tv_sec - (ts).tv_sec)*1000000))1261 # else /* USE_TIMEOFDAY */1262 # ifdef HAVE_SYS_TIMES_H1263 # include <sys/times.h>1264 # endif1322 # define GETTIME(t) gettimeofday(&(t), (struct timezone* )0) 1323 # define TIMEDIFF(te,ts) (((te).tv_usec - (ts).tv_usec) + \ 1324 (((te).tv_sec - (ts).tv_sec)*1000000)) 1325 # else /* USE_TIMEOFDAY */ 1326 # ifdef HAVE_SYS_TIMES_H 1327 # include <sys/times.h> 1328 # endif 1265 1329 static struct tms ts, te; 1266 #define GETTIME(t) times(&(t)) 1267 #define TIMEDIFF(te,ts) ((te).tms_utime - (ts).tms_utime) 1268 #endif /* USE_TIMEOFDAY */ 1330 # define GETTIME(t) times(&(t)) 1331 # define TIMEDIFF(te,ts) ((te).tms_utime - (ts).tms_utime) 1332 # endif /* USE_TIMEOFDAY */ 1333 1334 # endif /* _WIN32 */ 1269 1335 1270 1336 static int OpCounter[256]; … … 1275 1341 static int MaxStackDepth = 0; 1276 1342 1277 # define MOP_IN(opcode) do {\1343 # define MOP_IN(opcode) do {\ 1278 1344 if (opcode == OpPrevTarget) OpPrevCounter[OpCurr]++;\ 1279 1345 OpCurr = opcode;\ … … 1282 1348 } while(0) 1283 1349 1284 # define MOP_OUT do {\1350 # define MOP_OUT do {\ 1285 1351 GETTIME(te);\ 1286 1352 OpTime[OpCurr] += TIMEDIFF(te, ts);\ … … 1295 1361 } 1296 1362 MaxStackDepth = 0; 1363 # ifdef _WIN32 1364 QueryPerformanceFrequency(&freq); 1365 # endif 1297 1366 } 1298 1367 … … 1309 1378 } 1310 1379 1311 # define STACK_INC do {\1380 # define STACK_INC do {\ 1312 1381 stk++;\ 1313 1382 if (stk - stk_base > MaxStackDepth) \ … … 1316 1385 1317 1386 #else /* ONIG_DEBUG_STATISTICS */ 1318 # define STACK_INC stk++1319 1320 # define MOP_IN(opcode)1321 # define MOP_OUT1387 # define STACK_INC stk++ 1388 1389 # define MOP_IN(opcode) 1390 # define MOP_OUT 1322 1391 #endif /* ONIG_DEBUG_STATISTICS */ 1323 1392 1324 1393 1325 1326 /* matching region of POSIX API */ 1327 typedef int regoff_t; 1328 1329 typedef struct { 1330 regoff_t rm_so; 1331 regoff_t rm_eo; 1332 } posix_regmatch_t; 1394 #ifdef ONIG_DEBUG_MATCH 1395 static char * 1396 stack_type_str(int stack_type) 1397 { 1398 switch (stack_type) { 1399 case STK_ALT: return "Alt "; 1400 case STK_LOOK_BEHIND_NOT: return "LBNot "; 1401 case STK_POS_NOT: return "PosNot"; 1402 case STK_MEM_START: return "MemS "; 1403 case STK_MEM_END: return "MemE "; 1404 case STK_REPEAT_INC: return "RepInc"; 1405 case STK_STATE_CHECK_MARK: return "StChMk"; 1406 case STK_NULL_CHECK_START: return "NulChS"; 1407 case STK_NULL_CHECK_END: return "NulChE"; 1408 case STK_MEM_END_MARK: return "MemEMk"; 1409 case STK_POS: return "Pos "; 1410 case STK_STOP_BT: return "StopBt"; 1411 case STK_REPEAT: return "Rep "; 1412 case STK_CALL_FRAME: return "Call "; 1413 case STK_RETURN: return "Ret "; 1414 case STK_VOID: return "Void "; 1415 case STK_ABSENT_POS: return "AbsPos"; 1416 case STK_ABSENT: return "Absent"; 1417 default: return " "; 1418 } 1419 } 1420 #endif 1333 1421 1334 1422 /* match data(str - end) from position (sstart). */ 1335 1423 /* if sstart == str then set sprev to NULL. */ 1336 1424 static OnigPosition 1337 match_at _(regex_t* reg, const UChar* str, const UChar* end,1425 match_at(regex_t* reg, const UChar* str, const UChar* end, 1338 1426 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 1339 1427 const UChar* right_range, 1340 1428 #endif 1341 const UChar* sstart, UChar* sprev, OnigMatchArg* msa , char **palloca_base)1429 const UChar* sstart, UChar* sprev, OnigMatchArg* msa) 1342 1430 { 1343 1431 static const UChar FinishCode[] = { OP_FINISH }; … … 1354 1442 UChar *p = reg->p; 1355 1443 UChar *pkeep; 1444 char *alloca_base; 1356 1445 char *xmalloc_base = NULL; 1357 1446 OnigStackType *stk_alloc, *stk_base, *stk, *stk_end; … … 1366 1455 #endif 1367 1456 1368 #if USE_DIRECT_THREADED_VM 1369 #define VM_LOOP JUMP; 1370 #define VM_LOOP_END 1371 #define CASE(x) L_##x: sbegin = s; OPCODE_EXEC_HOOK; 1372 #define DEFAULT L_DEFAULT: 1373 #define NEXT sprev = sbegin; JUMP 1374 #define JUMP goto *oplabels[*p++] 1457 #if USE_TOKEN_THREADED_VM 1458 # define OP_OFFSET 1 1459 # define VM_LOOP JUMP; 1460 # define VM_LOOP_END 1461 # define CASE(x) L_##x: sbegin = s; OPCODE_EXEC_HOOK; 1462 # define DEFAULT L_DEFAULT: 1463 # define NEXT sprev = sbegin; JUMP 1464 # define JUMP goto *oplabels[*p++] 1375 1465 1376 1466 static const void *oplabels[] = { … … 1400 1490 &&L_OP_CCLASS_MB_NOT, 1401 1491 &&L_OP_CCLASS_MIX_NOT, 1402 &&L_OP_CCLASS_NODE, /* pointer to CClassNode node */1403 1492 1404 1493 &&L_OP_ANYCHAR, /* "." */ … … 1413 1502 &&L_OP_WORD_BOUND, 1414 1503 &&L_OP_NOT_WORD_BOUND, 1415 # ifdef USE_WORD_BEGIN_END1504 # ifdef USE_WORD_BEGIN_END 1416 1505 &&L_OP_WORD_BEGIN, 1417 1506 &&L_OP_WORD_END, 1418 # else1507 # else 1419 1508 &&L_DEFAULT, 1420 1509 &&L_DEFAULT, 1421 # endif1510 # endif 1422 1511 &&L_OP_ASCII_WORD, 1423 1512 &&L_OP_NOT_ASCII_WORD, 1424 1513 &&L_OP_ASCII_WORD_BOUND, 1425 1514 &&L_OP_NOT_ASCII_WORD_BOUND, 1426 # ifdef USE_WORD_BEGIN_END1515 # ifdef USE_WORD_BEGIN_END 1427 1516 &&L_OP_ASCII_WORD_BEGIN, 1428 1517 &&L_OP_ASCII_WORD_END, 1429 # else1518 # else 1430 1519 &&L_DEFAULT, 1431 1520 &&L_DEFAULT, 1432 # endif1521 # endif 1433 1522 1434 1523 &&L_OP_BEGIN_BUF, … … 1438 1527 &&L_OP_SEMI_END_BUF, 1439 1528 &&L_OP_BEGIN_POSITION, 1440 &&L_OP_BEGIN_POS_OR_LINE, /* used for implicit anchor optimization */1441 1529 1442 1530 &&L_OP_BACKREF1, … … 1446 1534 &&L_OP_BACKREF_MULTI, 1447 1535 &&L_OP_BACKREF_MULTI_IC, 1448 # ifdef USE_BACKREF_WITH_LEVEL1536 # ifdef USE_BACKREF_WITH_LEVEL 1449 1537 &&L_OP_BACKREF_WITH_LEVEL, /* \k<xxx+n>, \k<xxx-n> */ 1450 # else1538 # else 1451 1539 &&L_DEFAULT, 1452 # endif1540 # endif 1453 1541 &&L_OP_MEMORY_START, 1454 1542 &&L_OP_MEMORY_START_PUSH, /* push back-tracker to stack */ 1455 1543 &&L_OP_MEMORY_END_PUSH, /* push back-tracker to stack */ 1456 # ifdef USE_SUBEXP_CALL1544 # ifdef USE_SUBEXP_CALL 1457 1545 &&L_OP_MEMORY_END_PUSH_REC, /* push back-tracker to stack */ 1458 # else1546 # else 1459 1547 &&L_DEFAULT, 1460 # endif1548 # endif 1461 1549 &&L_OP_MEMORY_END, 1462 # ifdef USE_SUBEXP_CALL1550 # ifdef USE_SUBEXP_CALL 1463 1551 &&L_OP_MEMORY_END_REC, /* push marker to stack */ 1464 # else1552 # else 1465 1553 &&L_DEFAULT, 1466 # endif1554 # endif 1467 1555 1468 1556 &&L_OP_KEEP, … … 1472 1560 &&L_OP_PUSH, 1473 1561 &&L_OP_POP, 1562 # ifdef USE_OP_PUSH_OR_JUMP_EXACT 1474 1563 &&L_OP_PUSH_OR_JUMP_EXACT1, /* if match exact then push, else jump. */ 1564 # else 1565 &&L_DEFAULT, 1566 # endif 1475 1567 &&L_OP_PUSH_IF_PEEK_NEXT, /* if match exact then push, else none. */ 1476 1568 &&L_OP_REPEAT, /* {n,m} */ … … 1482 1574 &&L_OP_NULL_CHECK_START, /* null loop checker start */ 1483 1575 &&L_OP_NULL_CHECK_END, /* null loop checker end */ 1484 # ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT1576 # ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT 1485 1577 &&L_OP_NULL_CHECK_END_MEMST, /* null loop checker end (with capture status) */ 1486 # else1578 # else 1487 1579 &&L_DEFAULT, 1488 # endif1489 # ifdef USE_SUBEXP_CALL1580 # endif 1581 # ifdef USE_SUBEXP_CALL 1490 1582 &&L_OP_NULL_CHECK_END_MEMST_PUSH, /* with capture status and push check-end */ 1491 # else1583 # else 1492 1584 &&L_DEFAULT, 1493 # endif1585 # endif 1494 1586 1495 1587 &&L_OP_PUSH_POS, /* (?=...) start */ … … 1502 1594 &&L_OP_PUSH_LOOK_BEHIND_NOT, /* (?<!...) start */ 1503 1595 &&L_OP_FAIL_LOOK_BEHIND_NOT, /* (?<!...) end */ 1504 1505 #ifdef USE_SUBEXP_CALL 1596 &&L_OP_PUSH_ABSENT_POS, /* (?~...) start */ 1597 &&L_OP_ABSENT, /* (?~...) start of inner loop */ 1598 &&L_OP_ABSENT_END, /* (?~...) end */ 1599 1600 # ifdef USE_SUBEXP_CALL 1506 1601 &&L_OP_CALL, /* \g<name> */ 1507 1602 &&L_OP_RETURN, 1508 # else1603 # else 1509 1604 &&L_DEFAULT, 1510 1605 &&L_DEFAULT, 1511 # endif1606 # endif 1512 1607 &&L_OP_CONDITION, 1513 1608 1514 # ifdef USE_COMBINATION_EXPLOSION_CHECK1609 # ifdef USE_COMBINATION_EXPLOSION_CHECK 1515 1610 &&L_OP_STATE_CHECK_PUSH, /* combination explosion check and push */ 1516 1611 &&L_OP_STATE_CHECK_PUSH_OR_JUMP, /* check ok -> push, else jump */ 1517 1612 &&L_OP_STATE_CHECK, /* check only */ 1518 # else1613 # else 1519 1614 &&L_DEFAULT, 1520 1615 &&L_DEFAULT, 1521 1616 &&L_DEFAULT, 1522 # endif1523 # ifdef USE_COMBINATION_EXPLOSION_CHECK1617 # endif 1618 # ifdef USE_COMBINATION_EXPLOSION_CHECK 1524 1619 &&L_OP_STATE_CHECK_ANYCHAR_STAR, 1525 1620 &&L_OP_STATE_CHECK_ANYCHAR_ML_STAR, 1526 # else1621 # else 1527 1622 &&L_DEFAULT, 1528 1623 &&L_DEFAULT, 1529 # endif1624 # endif 1530 1625 /* no need: IS_DYNAMIC_OPTION() == 0 */ 1531 # if 0 /* no need: IS_DYNAMIC_OPTION() == 0 */1626 # if 0 /* no need: IS_DYNAMIC_OPTION() == 0 */ 1532 1627 &&L_OP_SET_OPTION_PUSH, /* set option and push recover option */ 1533 1628 &&L_OP_SET_OPTION /* set option */ 1534 # else1629 # else 1535 1630 &&L_DEFAULT, 1536 1631 &&L_DEFAULT 1537 # endif1632 # endif 1538 1633 }; 1539 #else 1540 1541 #define VM_LOOP \ 1634 #else /* USE_TOKEN_THREADED_VM */ 1635 1636 # define OP_OFFSET 0 1637 # define VM_LOOP \ 1542 1638 while (1) { \ 1543 1639 OPCODE_EXEC_HOOK; \ 1544 1640 sbegin = s; \ 1545 1641 switch (*p++) { 1546 # define VM_LOOP_END } sprev = sbegin; }1547 # define CASE(x) case x:1548 # define DEFAULT default:1549 # define NEXT break1550 # define JUMP continue; break1551 #endif 1642 # define VM_LOOP_END } sprev = sbegin; } 1643 # define CASE(x) case x: 1644 # define DEFAULT default: 1645 # define NEXT break 1646 # define JUMP continue; break 1647 #endif /* USE_TOKEN_THREADED_VM */ 1552 1648 1553 1649 1554 1650 #ifdef USE_SUBEXP_CALL 1555 /* Stack #0 is used to store the pattern itself and used for (?R), \g<0>, etc. */ 1556 n = reg->num_repeat + (reg->num_mem + 1) * 2; 1557 1558 STACK_INIT(*palloca_base, xmalloc_base, n, INIT_MATCH_STACK_SIZE); 1651 /* Stack #0 is used to store the pattern itself and used for (?R), \g<0>, 1652 etc. Additional space is required. */ 1653 # define ADD_NUMMEM 1 1654 #else 1655 /* Stack #0 not is used. */ 1656 # define ADD_NUMMEM 0 1657 #endif 1658 1659 n = reg->num_repeat + (reg->num_mem + ADD_NUMMEM) * 2; 1660 1661 STACK_INIT(alloca_base, xmalloc_base, n, INIT_MATCH_STACK_SIZE); 1559 1662 pop_level = reg->stack_pop_level; 1560 1663 num_mem = reg->num_mem; 1561 repeat_stk = (OnigStackIndex* ) *palloca_base;1664 repeat_stk = (OnigStackIndex* )alloca_base; 1562 1665 1563 1666 mem_start_stk = (OnigStackIndex* )(repeat_stk + reg->num_repeat); 1564 mem_end_stk = mem_start_stk + (num_mem + 1); 1565 #else /* USE_SUBEXP_CALL */ 1566 /* Stack #0 not is used. */ 1567 n = reg->num_repeat + reg->num_mem * 2; 1568 1569 STACK_INIT(*palloca_base, xmalloc_base, n, INIT_MATCH_STACK_SIZE); 1570 pop_level = reg->stack_pop_level; 1571 num_mem = reg->num_mem; 1572 repeat_stk = (OnigStackIndex* )*palloca_base; 1573 1574 mem_start_stk = (OnigStackIndex* )(repeat_stk + reg->num_repeat); 1575 mem_end_stk = mem_start_stk + num_mem; 1667 mem_end_stk = mem_start_stk + (num_mem + ADD_NUMMEM); 1668 { 1669 OnigStackIndex *pp = mem_start_stk; 1670 for (; pp < repeat_stk + n; pp += 2) { 1671 pp[0] = INVALID_STACK_INDEX; 1672 pp[1] = INVALID_STACK_INDEX; 1673 } 1674 } 1675 #ifndef USE_SUBEXP_CALL 1576 1676 mem_start_stk--; /* for index start from 1, 1577 1677 mem_start_stk[1]..mem_start_stk[num_mem] */ 1578 1678 mem_end_stk--; /* for index start from 1, 1579 1679 mem_end_stk[1]..mem_end_stk[num_mem] */ 1580 #endif /* USE_SUBEXP_CALL */ 1581 { 1582 OnigStackIndex *pp = mem_start_stk; 1583 for (; pp < (repeat_stk + n); pp+=2) { 1584 pp[0] = INVALID_STACK_INDEX; 1585 pp[1] = INVALID_STACK_INDEX; 1586 } 1587 } 1680 #endif 1588 1681 1589 1682 #ifdef ONIG_DEBUG_MATCH 1590 fprintf(stderr, "match_at: str: %"PRI dPTR" (%p), end: %"PRIdPTR" (%p), start: %"PRIdPTR" (%p), sprev: %"PRIdPTR" (%p)\n",1591 ( intptr_t )str, str, (intptr_t )end, end, (intptr_t )sstart, sstart, (intptr_t )sprev, sprev);1683 fprintf(stderr, "match_at: str: %"PRIuPTR" (%p), end: %"PRIuPTR" (%p), start: %"PRIuPTR" (%p), sprev: %"PRIuPTR" (%p)\n", 1684 (uintptr_t )str, str, (uintptr_t )end, end, (uintptr_t )sstart, sstart, (uintptr_t )sprev, sprev); 1592 1685 fprintf(stderr, "size: %d, start offset: %d\n", 1593 1686 (int )(end - str), (int )(sstart - str)); 1687 fprintf(stderr, "\n ofs> str stk:type addr:opcode\n"); 1594 1688 #endif 1595 1689 … … 1601 1695 1602 1696 #ifdef ONIG_DEBUG_MATCH 1603 # define OPCODE_EXEC_HOOK\1697 # define OPCODE_EXEC_HOOK \ 1604 1698 if (s) { \ 1605 1699 UChar *op, *q, *bp, buf[50]; \ 1606 1700 int len; \ 1607 op = p - 1;\1701 op = p - OP_OFFSET; \ 1608 1702 fprintf(stderr, "%4"PRIdPTR"> \"", (*op == OP_FINISH) ? (ptrdiff_t )-1 : s - str); \ 1609 1703 bp = buf; \ … … 1611 1705 if (*op != OP_FINISH) { /* s may not be a valid pointer if OP_FINISH. */ \ 1612 1706 for (i = 0; i < 7 && q < end; i++) { \ 1613 len = enclen(encode, q );\1707 len = enclen(encode, q, end); \ 1614 1708 while (len-- > 0) *bp++ = *q++; \ 1615 1709 } \ 1710 if (q < end) { xmemcpy(bp, "...", 3); bp += 3; } \ 1616 1711 } \ 1617 if (q < end) { xmemcpy(bp, "...\"", 4); bp += 4; } \ 1618 else { xmemcpy(bp, "\"", 1); bp += 1; } \ 1712 xmemcpy(bp, "\"", 1); bp += 1; \ 1619 1713 *bp = 0; \ 1620 1714 fputs((char* )buf, stderr); \ 1621 1715 for (i = 0; i < 20 - (bp - buf); i++) fputc(' ', stderr); \ 1622 fprintf(stderr, "%4"PRIdPTR":", (op == FinishCode) ? (ptrdiff_t )-1 : op - reg->p); \ 1623 onig_print_compiled_byte_code(stderr, op, NULL, encode); \ 1716 fprintf(stderr, "%4"PRIdPTR":%s %4"PRIdPTR":", \ 1717 stk - stk_base - 1, \ 1718 (stk > stk_base) ? stack_type_str(stk[-1].type) : " ", \ 1719 (op == FinishCode) ? (ptrdiff_t )-1 : op - reg->p); \ 1720 onig_print_compiled_byte_code(stderr, op, reg->p+reg->used, NULL, encode); \ 1624 1721 fprintf(stderr, "\n"); \ 1625 1722 } 1626 1723 #else 1627 # define OPCODE_EXEC_HOOK ((void) 0)1724 # define OPCODE_EXEC_HOOK ((void) 0) 1628 1725 #endif 1629 1726 … … 1642 1739 else 1643 1740 goto end_best_len; 1644 1741 } 1645 1742 #endif 1646 1743 best_len = n; 1647 1744 region = msa->region; 1648 1745 if (region) { 1649 #ifdef USE_POSIX_API_REGION_OPTION 1650 if (IS_POSIX_REGION(msa->options)) { 1651 posix_regmatch_t* rmt = (posix_regmatch_t* )region; 1652 1653 rmt[0].rm_so = (regoff_t )(((pkeep > s) ? s : pkeep) - str); 1654 rmt[0].rm_eo = (regoff_t )(s - str); 1655 for (i = 1; i <= num_mem; i++) { 1656 if (mem_end_stk[i] != INVALID_STACK_INDEX) { 1657 if (BIT_STATUS_AT(reg->bt_mem_start, i)) 1658 rmt[i].rm_so = (regoff_t )(STACK_AT(mem_start_stk[i])->u.mem.pstr - str); 1659 else 1660 rmt[i].rm_so = (regoff_t )((UChar* )((void* )(mem_start_stk[i])) - str); 1661 1662 rmt[i].rm_eo = (regoff_t )((BIT_STATUS_AT(reg->bt_mem_end, i) 1746 region->beg[0] = ((pkeep > s) ? s : pkeep) - str; 1747 region->end[0] = s - str; 1748 for (i = 1; i <= num_mem; i++) { 1749 if (mem_end_stk[i] != INVALID_STACK_INDEX) { 1750 if (BIT_STATUS_AT(reg->bt_mem_start, i)) 1751 region->beg[i] = STACK_AT(mem_start_stk[i])->u.mem.pstr - str; 1752 else 1753 region->beg[i] = (UChar* )((void* )mem_start_stk[i]) - str; 1754 1755 region->end[i] = (BIT_STATUS_AT(reg->bt_mem_end, i) 1663 1756 ? STACK_AT(mem_end_stk[i])->u.mem.pstr 1664 : (UChar* )((void* )mem_end_stk[i])) - str); 1665 } 1666 else { 1667 rmt[i].rm_so = rmt[i].rm_eo = ONIG_REGION_NOTPOS; 1668 } 1757 : (UChar* )((void* )mem_end_stk[i])) - str; 1758 } 1759 else { 1760 region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS; 1669 1761 } 1670 1762 } 1671 else { 1672 #endif /* USE_POSIX_API_REGION_OPTION */ 1673 region->beg[0] = ((pkeep > s) ? s : pkeep) - str; 1674 region->end[0] = s - str; 1675 for (i = 1; i <= num_mem; i++) { 1676 if (mem_end_stk[i] != INVALID_STACK_INDEX) { 1677 if (BIT_STATUS_AT(reg->bt_mem_start, i)) 1678 region->beg[i] = STACK_AT(mem_start_stk[i])->u.mem.pstr - str; 1679 else 1680 region->beg[i] = (UChar* )((void* )mem_start_stk[i]) - str; 1681 1682 region->end[i] = (BIT_STATUS_AT(reg->bt_mem_end, i) 1683 ? STACK_AT(mem_end_stk[i])->u.mem.pstr 1684 : (UChar* )((void* )mem_end_stk[i])) - str; 1685 } 1686 else { 1687 region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS; 1688 } 1763 1764 #ifdef USE_CAPTURE_HISTORY 1765 if (reg->capture_history != 0) { 1766 int r; 1767 OnigCaptureTreeNode* node; 1768 1769 if (IS_NULL(region->history_root)) { 1770 region->history_root = node = history_node_new(); 1771 CHECK_NULL_RETURN_MEMERR(node); 1689 1772 } 1690 1691 #ifdef USE_CAPTURE_HISTORY 1692 if (reg->capture_history != 0) { 1693 int r; 1694 OnigCaptureTreeNode* node; 1695 1696 if (IS_NULL(region->history_root)) { 1697 region->history_root = node = history_node_new(); 1698 CHECK_NULL_RETURN_MEMERR(node); 1699 } 1700 else { 1701 node = region->history_root; 1702 history_tree_clear(node); 1703 } 1704 1705 node->group = 0; 1706 node->beg = ((pkeep > s) ? s : pkeep) - str; 1707 node->end = s - str; 1708 1709 stkp = stk_base; 1710 r = make_capture_history_tree(region->history_root, &stkp, 1711 stk, (UChar* )str, reg); 1712 if (r < 0) { 1713 best_len = r; /* error code */ 1714 goto finish; 1715 } 1773 else { 1774 node = region->history_root; 1775 history_tree_clear(node); 1716 1776 } 1777 1778 node->group = 0; 1779 node->beg = ((pkeep > s) ? s : pkeep) - str; 1780 node->end = s - str; 1781 1782 stkp = stk_base; 1783 r = make_capture_history_tree(region->history_root, &stkp, 1784 stk, (UChar* )str, reg); 1785 if (r < 0) { 1786 best_len = r; /* error code */ 1787 goto finish; 1788 } 1789 } 1717 1790 #endif /* USE_CAPTURE_HISTORY */ 1718 #ifdef USE_POSIX_API_REGION_OPTION1719 } /* else IS_POSIX_REGION() */1720 #endif1721 1791 } /* if (region) */ 1722 1792 } /* n > best_len */ … … 1742 1812 1743 1813 CASE(OP_EXACT1) MOP_IN(OP_EXACT1); 1744 #if 01745 1814 DATA_ENSURE(1); 1746 1815 if (*p != *s) goto fail; 1747 1816 p++; s++; 1748 #endif1749 if (*p != *s++) goto fail;1750 DATA_ENSURE(0);1751 p++;1752 1817 MOP_OUT; 1753 1818 NEXT; … … 1767 1832 while (len-- > 0) { 1768 1833 if (*p != *q) { 1769 1770 1834 goto fail; 1835 } 1771 1836 p++; q++; 1772 1837 } … … 1950 2015 if (BITSET_AT(((BitSetRef )p), *s) == 0) goto fail; 1951 2016 p += SIZE_BITSET; 1952 s += enclen(encode, s ); /* OP_CCLASS can match mb-code. \D, \S */2017 s += enclen(encode, s, end); /* OP_CCLASS can match mb-code. \D, \S */ 1953 2018 MOP_OUT; 1954 2019 NEXT; 1955 2020 1956 2021 CASE(OP_CCLASS_MB) MOP_IN(OP_CCLASS_MB); 1957 if (! ONIGENC_IS_MBC_HEAD(encode, s )) goto fail;2022 if (! ONIGENC_IS_MBC_HEAD(encode, s, end)) goto fail; 1958 2023 1959 2024 cclass_mb: … … 1965 2030 1966 2031 DATA_ENSURE(1); 1967 mb_len = enclen(encode, s );2032 mb_len = enclen(encode, s, end); 1968 2033 DATA_ENSURE(mb_len); 1969 2034 ss = s; … … 1985 2050 CASE(OP_CCLASS_MIX) MOP_IN(OP_CCLASS_MIX); 1986 2051 DATA_ENSURE(1); 1987 if (ONIGENC_IS_MBC_HEAD(encode, s )) {2052 if (ONIGENC_IS_MBC_HEAD(encode, s, end)) { 1988 2053 p += SIZE_BITSET; 1989 2054 goto cclass_mb; … … 2005 2070 if (BITSET_AT(((BitSetRef )p), *s) != 0) goto fail; 2006 2071 p += SIZE_BITSET; 2007 s += enclen(encode, s );2072 s += enclen(encode, s, end); 2008 2073 MOP_OUT; 2009 2074 NEXT; … … 2011 2076 CASE(OP_CCLASS_MB_NOT) MOP_IN(OP_CCLASS_MB_NOT); 2012 2077 DATA_ENSURE(1); 2013 if (! ONIGENC_IS_MBC_HEAD(encode, s )) {2078 if (! ONIGENC_IS_MBC_HEAD(encode, s, end)) { 2014 2079 s++; 2015 2080 GET_LENGTH_INC(tlen, p); … … 2023 2088 OnigCodePoint code; 2024 2089 UChar *ss; 2025 int mb_len = enclen(encode, s );2090 int mb_len = enclen(encode, s, end); 2026 2091 2027 2092 if (! DATA_ENSURE_CHECK(mb_len)) { 2028 2093 DATA_ENSURE(1); 2029 2094 s = (UChar* )end; 2030 2095 p += tlen; … … 2052 2117 CASE(OP_CCLASS_MIX_NOT) MOP_IN(OP_CCLASS_MIX_NOT); 2053 2118 DATA_ENSURE(1); 2054 if (ONIGENC_IS_MBC_HEAD(encode, s )) {2119 if (ONIGENC_IS_MBC_HEAD(encode, s, end)) { 2055 2120 p += SIZE_BITSET; 2056 2121 goto cclass_mb_not; … … 2068 2133 NEXT; 2069 2134 2070 CASE(OP_CCLASS_NODE) MOP_IN(OP_CCLASS_NODE);2071 {2072 OnigCodePoint code;2073 void *node;2074 int mb_len;2075 UChar *ss;2076 2077 DATA_ENSURE(1);2078 GET_POINTER_INC(node, p);2079 mb_len = enclen(encode, s);2080 ss = s;2081 s += mb_len;2082 DATA_ENSURE(0);2083 code = ONIGENC_MBC_TO_CODE(encode, ss, s);2084 if (onig_is_code_in_cc_len(mb_len, code, node) == 0) goto fail;2085 }2086 MOP_OUT;2087 NEXT;2088 2089 2135 CASE(OP_ANYCHAR) MOP_IN(OP_ANYCHAR); 2090 2136 DATA_ENSURE(1); 2091 n = enclen(encode, s );2137 n = enclen(encode, s, end); 2092 2138 DATA_ENSURE(n); 2093 2139 if (ONIGENC_IS_MBC_NEWLINE_EX(encode, s, str, end, option, 0)) goto fail; … … 2098 2144 CASE(OP_ANYCHAR_ML) MOP_IN(OP_ANYCHAR_ML); 2099 2145 DATA_ENSURE(1); 2100 n = enclen(encode, s );2146 n = enclen(encode, s, end); 2101 2147 DATA_ENSURE(n); 2102 2148 s += n; … … 2107 2153 while (DATA_ENSURE_CHECK1) { 2108 2154 STACK_PUSH_ALT(p, s, sprev, pkeep); 2109 n = enclen(encode, s );2110 2111 2112 2113 2114 } 2115 MOP_OUT; 2116 NEXT;2155 n = enclen(encode, s, end); 2156 DATA_ENSURE(n); 2157 if (ONIGENC_IS_MBC_NEWLINE_EX(encode, s, str, end, option, 0)) goto fail; 2158 sprev = s; 2159 s += n; 2160 } 2161 MOP_OUT; 2162 JUMP; 2117 2163 2118 2164 CASE(OP_ANYCHAR_ML_STAR) MOP_IN(OP_ANYCHAR_ML_STAR); 2119 2165 while (DATA_ENSURE_CHECK1) { 2120 2166 STACK_PUSH_ALT(p, s, sprev, pkeep); 2121 n = enclen(encode, s );2167 n = enclen(encode, s, end); 2122 2168 if (n > 1) { 2123 2169 DATA_ENSURE(n); … … 2131 2177 } 2132 2178 MOP_OUT; 2133 NEXT;2179 JUMP; 2134 2180 2135 2181 CASE(OP_ANYCHAR_STAR_PEEK_NEXT) MOP_IN(OP_ANYCHAR_STAR_PEEK_NEXT); … … 2138 2184 STACK_PUSH_ALT(p + 1, s, sprev, pkeep); 2139 2185 } 2140 n = enclen(encode, s );2141 2142 2143 2144 2186 n = enclen(encode, s, end); 2187 DATA_ENSURE(n); 2188 if (ONIGENC_IS_MBC_NEWLINE_EX(encode, s, str, end, option, 0)) goto fail; 2189 sprev = s; 2190 s += n; 2145 2191 } 2146 2192 p++; … … 2153 2199 STACK_PUSH_ALT(p + 1, s, sprev, pkeep); 2154 2200 } 2155 n = enclen(encode, s );2201 n = enclen(encode, s, end); 2156 2202 if (n > 1) { 2157 2203 DATA_ENSURE(n); … … 2176 2222 2177 2223 STACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem, pkeep); 2178 n = enclen(encode, s );2179 2180 2181 2182 2224 n = enclen(encode, s, end); 2225 DATA_ENSURE(n); 2226 if (ONIGENC_IS_MBC_NEWLINE_EX(encode, s, str, end, option, 0)) goto fail; 2227 sprev = s; 2228 s += n; 2183 2229 } 2184 2230 MOP_OUT; … … 2194 2240 2195 2241 STACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem, pkeep); 2196 n = enclen(encode, s );2242 n = enclen(encode, s, end); 2197 2243 if (n > 1) { 2198 2244 DATA_ENSURE(n); … … 2214 2260 goto fail; 2215 2261 2216 s += enclen(encode, s );2262 s += enclen(encode, s, end); 2217 2263 MOP_OUT; 2218 2264 NEXT; … … 2223 2269 goto fail; 2224 2270 2225 s += enclen(encode, s );2271 s += enclen(encode, s, end); 2226 2272 MOP_OUT; 2227 2273 NEXT; … … 2232 2278 goto fail; 2233 2279 2234 s += enclen(encode, s );2280 s += enclen(encode, s, end); 2235 2281 MOP_OUT; 2236 2282 NEXT; … … 2241 2287 goto fail; 2242 2288 2243 s += enclen(encode, s );2289 s += enclen(encode, s, end); 2244 2290 MOP_OUT; 2245 2291 NEXT; … … 2372 2418 2373 2419 CASE(OP_BEGIN_LINE) MOP_IN(OP_BEGIN_LINE); 2374 op_begin_line:2375 2420 if (ON_STR_BEGIN(s)) { 2376 2421 if (IS_NOTBOL(msa->options)) goto fail; … … 2422 2467 } 2423 2468 else if (ONIGENC_IS_MBC_NEWLINE_EX(encode, s, str, end, option, 1)) { 2424 UChar* ss = s + enclen(encode, s );2469 UChar* ss = s + enclen(encode, s, end); 2425 2470 if (ON_STR_END(ss)) { 2426 2471 MOP_OUT; … … 2430 2475 else if (IS_NEWLINE_CRLF(option) 2431 2476 && ONIGENC_IS_MBC_CRNL(encode, s, end)) { 2432 ss += enclen(encode, ss );2477 ss += enclen(encode, ss, end); 2433 2478 if (ON_STR_END(ss)) { 2434 2479 MOP_OUT; … … 2444 2489 if (s != msa->gpos) 2445 2490 goto fail; 2446 2447 MOP_OUT;2448 JUMP;2449 2450 CASE(OP_BEGIN_POS_OR_LINE) MOP_IN(OP_BEGIN_POS_OR_LINE);2451 if (s != msa->gpos)2452 goto op_begin_line;2453 2491 2454 2492 MOP_OUT; … … 2543 2581 sprev = s; 2544 2582 STRING_CMP(pstart, s, n); 2545 while (sprev + (len = enclen(encode, sprev )) < s)2583 while (sprev + (len = enclen(encode, sprev, end)) < s) 2546 2584 sprev += len; 2547 2585 … … 2573 2611 DATA_ENSURE(n); 2574 2612 sprev = s; 2575 STRING_CMP_IC(case_fold_flag, pstart, &s, n);2576 while (sprev + (len = enclen(encode, sprev )) < s)2613 STRING_CMP_IC(case_fold_flag, pstart, &s, (int)n, end); 2614 while (sprev + (len = enclen(encode, sprev, end)) < s) 2577 2615 sprev += len; 2578 2616 … … 2609 2647 if (is_fail) continue; 2610 2648 s = swork; 2611 while (sprev + (len = enclen(encode, sprev )) < s)2649 while (sprev + (len = enclen(encode, sprev, end)) < s) 2612 2650 sprev += len; 2613 2651 … … 2645 2683 sprev = s; 2646 2684 swork = s; 2647 STRING_CMP_VALUE_IC(case_fold_flag, pstart, &swork, n, is_fail);2685 STRING_CMP_VALUE_IC(case_fold_flag, pstart, &swork, n, end, is_fail); 2648 2686 if (is_fail) continue; 2649 2687 s = swork; 2650 while (sprev + (len = enclen(encode, sprev )) < s)2688 while (sprev + (len = enclen(encode, sprev, end)) < s) 2651 2689 sprev += len; 2652 2690 … … 2671 2709 2672 2710 sprev = s; 2673 if (backref_match_at_nested_level(reg, stk, stk_base, ic 2674 ,case_fold_flag, (int )level, (int )tlen, p, &s, end)) {2675 while (sprev + (len = enclen(encode, sprev )) < s)2711 if (backref_match_at_nested_level(reg, stk, stk_base, ic, 2712 case_fold_flag, (int )level, (int )tlen, p, &s, end)) { 2713 while (sprev + (len = enclen(encode, sprev, end)) < s) 2676 2714 sprev += len; 2677 2715 … … 2715 2753 if (isnull) { 2716 2754 #ifdef ONIG_DEBUG_MATCH 2717 fprintf(stderr, "NULL_CHECK_END: skip id:%d, s:%"PRI dPTR" (%p)\n",2718 (int )mem, ( intptr_t )s, s);2755 fprintf(stderr, "NULL_CHECK_END: skip id:%d, s:%"PRIuPTR" (%p)\n", 2756 (int )mem, (uintptr_t )s, s); 2719 2757 #endif 2720 2758 null_check_found: … … 2748 2786 STACK_NULL_CHECK_MEMST(isnull, mem, s, reg); 2749 2787 if (isnull) { 2750 # ifdef ONIG_DEBUG_MATCH2751 fprintf(stderr, "NULL_CHECK_END_MEMST: skip id:%d, s:%"PRI dPTR" (%p)\n",2752 (int )mem, ( intptr_t )s, s);2753 # endif2788 # ifdef ONIG_DEBUG_MATCH 2789 fprintf(stderr, "NULL_CHECK_END_MEMST: skip id:%d, s:%"PRIuPTR" (%p)\n", 2790 (int )mem, (uintptr_t )s, s); 2791 # endif 2754 2792 if (isnull == -1) goto fail; 2755 2793 goto null_check_found; … … 2767 2805 2768 2806 GET_MEMNUM_INC(mem, p); /* mem: null check id */ 2769 # ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT2807 # ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT 2770 2808 STACK_NULL_CHECK_MEMST_REC(isnull, mem, s, reg); 2771 # else2809 # else 2772 2810 STACK_NULL_CHECK_REC(isnull, mem, s); 2773 # endif2811 # endif 2774 2812 if (isnull) { 2775 # ifdef ONIG_DEBUG_MATCH2776 fprintf(stderr, "NULL_CHECK_END_MEMST_PUSH: skip id:%d, s:%"PRI dPTR" (%p)\n",2777 (int )mem, ( intptr_t )s, s);2778 # endif2813 # ifdef ONIG_DEBUG_MATCH 2814 fprintf(stderr, "NULL_CHECK_END_MEMST_PUSH: skip id:%d, s:%"PRIuPTR" (%p)\n", 2815 (int )mem, (uintptr_t )s, s); 2816 # endif 2779 2817 if (isnull == -1) goto fail; 2780 2818 goto null_check_found; … … 2840 2878 JUMP; 2841 2879 2880 #ifdef USE_OP_PUSH_OR_JUMP_EXACT 2842 2881 CASE(OP_PUSH_OR_JUMP_EXACT1) MOP_IN(OP_PUSH_OR_JUMP_EXACT1); 2843 2882 GET_RELADDR_INC(addr, p); … … 2851 2890 MOP_OUT; 2852 2891 JUMP; 2892 #endif 2853 2893 2854 2894 CASE(OP_PUSH_IF_PEEK_NEXT) MOP_IN(OP_PUSH_IF_PEEK_NEXT); … … 2905 2945 stkp->u.repeat.count++; 2906 2946 if (stkp->u.repeat.count >= reg->repeat_range[mem].upper) { 2907 2947 /* end of repeat. Nothing to do. */ 2908 2948 } 2909 2949 else if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) { 2910 2911 2950 STACK_PUSH_ALT(p, s, sprev, pkeep); 2951 p = STACK_AT(si)->u.repeat.pcode; /* Don't use stkp after PUSH. */ 2912 2952 } 2913 2953 else { 2914 2954 p = stkp->u.repeat.pcode; 2915 2955 } 2916 2956 STACK_PUSH_REPEAT_INC(si); … … 2934 2974 stkp->u.repeat.count++; 2935 2975 if (stkp->u.repeat.count < reg->repeat_range[mem].upper) { 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2976 if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) { 2977 UChar* pcode = stkp->u.repeat.pcode; 2978 2979 STACK_PUSH_REPEAT_INC(si); 2980 STACK_PUSH_ALT(pcode, s, sprev, pkeep); 2981 } 2982 else { 2983 p = stkp->u.repeat.pcode; 2984 STACK_PUSH_REPEAT_INC(si); 2985 } 2946 2986 } 2947 2987 else if (stkp->u.repeat.count == reg->repeat_range[mem].upper) { 2948 2988 STACK_PUSH_REPEAT_INC(si); 2949 2989 } 2950 2990 MOP_OUT; … … 2996 3036 CASE(OP_LOOK_BEHIND) MOP_IN(OP_LOOK_BEHIND); 2997 3037 GET_LENGTH_INC(tlen, p); 2998 s = (UChar* )ONIGENC_STEP_BACK(encode, str, s, (int )tlen);3038 s = (UChar* )ONIGENC_STEP_BACK(encode, str, s, end, (int )tlen); 2999 3039 if (IS_NULL(s)) goto fail; 3000 sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s );3040 sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s, end); 3001 3041 MOP_OUT; 3002 3042 JUMP; … … 3005 3045 GET_RELADDR_INC(addr, p); 3006 3046 GET_LENGTH_INC(tlen, p); 3007 q = (UChar* )ONIGENC_STEP_BACK(encode, str, s, (int )tlen);3047 q = (UChar* )ONIGENC_STEP_BACK(encode, str, s, end, (int )tlen); 3008 3048 if (IS_NULL(q)) { 3009 3049 /* too short case -> success. ex. /(?<!XXX)a/.match("a") … … 3015 3055 STACK_PUSH_LOOK_BEHIND_NOT(p + addr, s, sprev, pkeep); 3016 3056 s = q; 3017 sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s );3057 sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s, end); 3018 3058 } 3019 3059 MOP_OUT; … … 3022 3062 CASE(OP_FAIL_LOOK_BEHIND_NOT) MOP_IN(OP_FAIL_LOOK_BEHIND_NOT); 3023 3063 STACK_POP_TIL_LOOK_BEHIND_NOT; 3064 goto fail; 3065 NEXT; 3066 3067 CASE(OP_PUSH_ABSENT_POS) MOP_IN(OP_PUSH_ABSENT_POS); 3068 /* Save the absent-start-pos and the original end-pos. */ 3069 STACK_PUSH_ABSENT_POS(s, ABSENT_END_POS); 3070 MOP_OUT; 3071 JUMP; 3072 3073 CASE(OP_ABSENT) MOP_IN(OP_ABSENT); 3074 { 3075 const UChar* aend = ABSENT_END_POS; 3076 UChar* absent; 3077 UChar* selfp = p - 1; 3078 3079 STACK_POP_ABSENT_POS(absent, ABSENT_END_POS); /* Restore end-pos. */ 3080 GET_RELADDR_INC(addr, p); 3081 #ifdef ONIG_DEBUG_MATCH 3082 fprintf(stderr, "ABSENT: s:%p, end:%p, absent:%p, aend:%p\n", s, end, absent, aend); 3083 #endif 3084 if ((absent > aend) && (s > absent)) { 3085 /* An empty match occurred in (?~...) at the start point. 3086 * Never match. */ 3087 STACK_POP; 3088 goto fail; 3089 } 3090 else if ((s >= aend) && (s > absent)) { 3091 if (s > aend) { 3092 /* Only one (or less) character matched in the last iteration. 3093 * This is not a possible point. */ 3094 goto fail; 3095 } 3096 /* All possible points were found. Try matching after (?~...). */ 3097 DATA_ENSURE(0); 3098 p += addr; 3099 } 3100 else { 3101 STACK_PUSH_ALT(p + addr, s, sprev, pkeep); /* Push possible point. */ 3102 n = enclen(encode, s, end); 3103 STACK_PUSH_ABSENT_POS(absent, ABSENT_END_POS); /* Save the original pos. */ 3104 STACK_PUSH_ALT(selfp, s + n, s, pkeep); /* Next iteration. */ 3105 STACK_PUSH_ABSENT; 3106 ABSENT_END_POS = aend; 3107 } 3108 } 3109 MOP_OUT; 3110 JUMP; 3111 3112 CASE(OP_ABSENT_END) MOP_IN(OP_ABSENT_END); 3113 /* The pattern inside (?~...) was matched. 3114 * Set the end-pos temporary and go to next iteration. */ 3115 if (sprev < ABSENT_END_POS) 3116 ABSENT_END_POS = sprev; 3117 #ifdef ONIG_DEBUG_MATCH 3118 fprintf(stderr, "ABSENT_END: end:%p\n", ABSENT_END_POS); 3119 #endif 3120 STACK_POP_TIL_ABSENT; 3024 3121 goto fail; 3025 3122 NEXT; … … 3057 3154 CASE(OP_FAIL) 3058 3155 if (0) { 3059 3156 /* fall */ 3060 3157 fail: 3061 3158 MOP_OUT; 3062 3159 } 3063 3160 MOP_IN(OP_FAIL); … … 3070 3167 #ifdef USE_COMBINATION_EXPLOSION_CHECK 3071 3168 if (stk->u.state.state_check != 0) { 3072 3073 3169 stk->type = STK_STATE_CHECK_MARK; 3170 stk++; 3074 3171 } 3075 3172 #endif … … 3105 3202 } 3106 3203 3107 static OnigPosition3108 match_at(regex_t* reg, const UChar* str, const UChar* end,3109 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE3110 const UChar* right_range,3111 #endif3112 const UChar* sstart, UChar* sprev, OnigMatchArg* msa)3113 {3114 char *alloca_base = NULL;3115 OnigPosition ret = match_at_(reg, str, end,3116 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE3117 right_range,3118 #endif3119 sstart, sprev, msa, &alloca_base);3120 if(alloca_base) xfree(alloca_base);3121 return ret;3122 }3123 3204 3124 3205 static UChar* … … 3156 3237 return s; 3157 3238 } 3158 s += enclen(enc, s );3239 s += enclen(enc, s, text_end); 3159 3240 } 3160 3241 … … 3164 3245 static int 3165 3246 str_lower_case_match(OnigEncoding enc, int case_fold_flag, 3166 3247 const UChar* t, const UChar* tend, 3167 3248 const UChar* p, const UChar* end) 3168 3249 { … … 3201 3282 return s; 3202 3283 3203 s += enclen(enc, s );3284 s += enclen(enc, s, text_end); 3204 3285 } 3205 3286 … … 3219 3300 s = (UChar* )text_start; 3220 3301 else 3221 s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s );3302 s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s, text_end); 3222 3303 3223 3304 while (s >= text) { … … 3233 3314 return s; 3234 3315 } 3235 s = (UChar* )onigenc_get_prev_char_head(enc, adjust_text, s );3316 s = (UChar* )onigenc_get_prev_char_head(enc, adjust_text, s, text_end); 3236 3317 } 3237 3318 … … 3252 3333 s = (UChar* )text_start; 3253 3334 else 3254 s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s );3335 s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s, text_end); 3255 3336 3256 3337 while (s >= text) { 3257 3338 if (str_lower_case_match(enc, case_fold_flag, 3258 3339 target, target_end, s, text_end)) 3259 3340 return s; 3260 3341 3261 s = (UChar* )onigenc_get_prev_char_head(enc, adjust_text, s );3342 s = (UChar* )onigenc_get_prev_char_head(enc, adjust_text, s, text_end); 3262 3343 } 3263 3344 … … 3276 3357 ptrdiff_t skip, tlen1; 3277 3358 3278 # ifdef ONIG_DEBUG_SEARCH3359 # ifdef ONIG_DEBUG_SEARCH 3279 3360 fprintf(stderr, "bm_search_notrev: text: %"PRIuPTR" (%p), text_end: %"PRIuPTR" (%p), text_range: %"PRIuPTR" (%p)\n", 3280 text, text, text_end, text_end,text_range, text_range);3281 # endif3361 (uintptr_t )text, text, (uintptr_t )text_end, text_end, (uintptr_t )text_range, text_range); 3362 # endif 3282 3363 3283 3364 tail = target_end - 1; … … 3300 3381 t = s; 3301 3382 do { 3302 s += enclen(reg->enc, s);3383 s += enclen(reg->enc, s, end); 3303 3384 } while ((s - t) < skip && s < end); 3304 3385 } 3305 3386 } 3306 3387 else { 3388 # if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE 3307 3389 while (s < end) { 3308 3390 p = se = s + tlen1; … … 3315 3397 t = s; 3316 3398 do { 3317 s += enclen(reg->enc, s);3399 s += enclen(reg->enc, s, end); 3318 3400 } while ((s - t) < skip && s < end); 3319 3401 } 3402 # endif 3320 3403 } 3321 3404 … … 3331 3414 const UChar *tail; 3332 3415 3333 # ifdef ONIG_DEBUG_SEARCH3334 fprintf(stderr, "bm_search: text: %"PRIuPTR" , text_end: %"PRIuPTR", text_range: %"PRIuPTR"\n",3335 text, text_end, text_range);3336 # endif3416 # ifdef ONIG_DEBUG_SEARCH 3417 fprintf(stderr, "bm_search: text: %"PRIuPTR" (%p), text_end: %"PRIuPTR" (%p), text_range: %"PRIuPTR" (%p)\n", 3418 (uintptr_t )text, text, (uintptr_t )text_end, text_end, (uintptr_t )text_range, text_range); 3419 # endif 3337 3420 3338 3421 end = text_range + (target_end - target) - 1; … … 3346 3429 p = s; 3347 3430 t = tail; 3348 # ifdef ONIG_DEBUG_SEARCH3431 # ifdef ONIG_DEBUG_SEARCH 3349 3432 fprintf(stderr, "bm_search_loop: pos: %"PRIdPTR" %s\n", 3350 3433 (intptr_t )(s - text), s); 3351 # endif3434 # endif 3352 3435 while (*p == *t) { 3353 3436 if (t == target) return (UChar* )p; … … 3358 3441 } 3359 3442 else { /* see int_map[] */ 3443 # if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE 3360 3444 while (s < end) { 3361 3445 p = s; … … 3367 3451 s += reg->int_map[*s]; 3368 3452 } 3453 # endif 3369 3454 } 3370 3455 return (UChar* )NULL; … … 3383 3468 int case_fold_flag = reg->case_fold_flag; 3384 3469 3385 # ifdef ONIG_DEBUG_SEARCH3470 # ifdef ONIG_DEBUG_SEARCH 3386 3471 fprintf(stderr, "bm_search_notrev_ic: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n", 3387 3472 (int )text, text, (int )text_end, text_end, (int )text_range, text_range); 3388 # endif3473 # endif 3389 3474 3390 3475 tail = target_end - 1; … … 3405 3490 t = s; 3406 3491 do { 3407 s += enclen(reg->enc, s);3492 s += enclen(reg->enc, s, end); 3408 3493 } while ((s - t) < skip && s < end); 3409 3494 } 3410 3495 } 3411 3496 else { 3497 # if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE 3412 3498 while (s < end) { 3413 3499 se = s + tlen1; … … 3418 3504 t = s; 3419 3505 do { 3420 s += enclen(reg->enc, s);3506 s += enclen(reg->enc, s, end); 3421 3507 } while ((s - t) < skip && s < end); 3422 3508 } 3509 # endif 3423 3510 } 3424 3511 … … 3436 3523 int case_fold_flag = reg->case_fold_flag; 3437 3524 3438 # ifdef ONIG_DEBUG_SEARCH3525 # ifdef ONIG_DEBUG_SEARCH 3439 3526 fprintf(stderr, "bm_search_ic: text: %d (%p), text_end: %d (%p), text_range: %d (%p)\n", 3440 3527 (int )text, text, (int )text_end, text_end, (int )text_range, text_range); 3441 # endif3528 # endif 3442 3529 3443 3530 end = text_range + (target_end - target) - 1; … … 3457 3544 } 3458 3545 else { /* see int_map[] */ 3546 # if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE 3459 3547 while (s < end) { 3460 3548 p = s - (target_end - target) + 1; … … 3464 3552 s += reg->int_map[*s]; 3465 3553 } 3554 # endif 3466 3555 } 3467 3556 return (UChar* )NULL; … … 3480 3569 ptrdiff_t skip, tlen1; 3481 3570 OnigEncoding enc = reg->enc; 3482 int (*mbc_enc_len)(const OnigUChar* p) = enc->mbc_enc_len; 3483 3484 #ifdef ONIG_DEBUG_SEARCH 3485 fprintf(stderr, "bm_search_notrev: text: %"PRIdPTR" (%p), text_end: %"PRIdPTR" (%p), text_range: %"PRIdPTR" (%p)\n", 3486 (intptr_t )text, text, (intptr_t )text_end, text_end, (intptr_t )text_range, text_range); 3487 #endif 3571 3572 # ifdef ONIG_DEBUG_SEARCH 3573 fprintf(stderr, "bm_search_notrev: text: %"PRIuPTR" (%p), text_end: %"PRIuPTR" (%p), text_range: %"PRIuPTR" (%p)\n", 3574 (uintptr_t )text, text, (uintptr_t )text_end, text_end, (uintptr_t )text_range, text_range); 3575 # endif 3488 3576 3489 3577 tail = target_end - 1; … … 3507 3595 t = s; 3508 3596 do { 3509 s += mbc_enc_len(s);3597 s += enclen(enc, s, end); 3510 3598 } while ((s - t) < skip && s < end); 3511 3599 } 3512 3600 } 3513 3601 else { 3602 # if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE 3514 3603 while (s < end) { 3515 3604 p = se = s + tlen1; … … 3523 3612 t = s; 3524 3613 do { 3525 s += mbc_enc_len(s);3614 s += enclen(enc, s, end); 3526 3615 } while ((s - t) < skip && s < end); 3527 3616 } 3617 # endif 3528 3618 } 3529 3619 … … 3539 3629 const UChar *tail; 3540 3630 ptrdiff_t tlen1; 3631 3632 # ifdef ONIG_DEBUG_SEARCH 3633 fprintf(stderr, "bm_search: text: %"PRIuPTR" (%p), text_end: %"PRIuPTR" (%p), text_range: %"PRIuPTR" (%p)\n", 3634 (uintptr_t )text, text, (uintptr_t )text_end, text_end, (uintptr_t )text_range, text_range); 3635 # endif 3541 3636 3542 3637 tail = target_end - 1; … … 3560 3655 } 3561 3656 else { /* see int_map[] */ 3657 # if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE 3562 3658 while (s < end) { 3563 3659 p = s; … … 3570 3666 s += reg->int_map[s[1]]; 3571 3667 } 3668 # endif 3572 3669 } 3573 3670 return (UChar* )NULL; … … 3584 3681 ptrdiff_t skip, tlen1; 3585 3682 OnigEncoding enc = reg->enc; 3586 int (*mbc_enc_len)(const OnigUChar* p) = enc->mbc_enc_len;3587 3683 int case_fold_flag = reg->case_fold_flag; 3588 3684 3589 # ifdef ONIG_DEBUG_SEARCH3590 fprintf(stderr, "bm_search_notrev_ic: text: %"PRI dPTR" (%p), text_end: %"PRIdPTR" (%p), text_range: %"PRIdPTR" (%p)\n",3591 ( intptr_t )text, text, (intptr_t )text_end, text_end, (intptr_t )text_range, text_range);3592 # endif3685 # ifdef ONIG_DEBUG_SEARCH 3686 fprintf(stderr, "bm_search_notrev_ic: text: %"PRIuPTR" (%p), text_end: %"PRIuPTR" (%p), text_range: %"PRIuPTR" (%p)\n", 3687 (uintptr_t )text, text, (uintptr_t )text_end, text_end, (uintptr_t )text_range, text_range); 3688 # endif 3593 3689 3594 3690 tail = target_end - 1; … … 3610 3706 t = s; 3611 3707 do { 3612 s += mbc_enc_len(s);3708 s += enclen(enc, s, end); 3613 3709 } while ((s - t) < skip && s < end); 3614 3710 } 3615 3711 } 3616 3712 else { 3713 # if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE 3617 3714 while (s < end) { 3618 3715 se = s + tlen1; … … 3624 3721 t = s; 3625 3722 do { 3626 s += mbc_enc_len(s);3723 s += enclen(enc, s, end); 3627 3724 } while ((s - t) < skip && s < end); 3628 3725 } 3726 # endif 3629 3727 } 3630 3728 … … 3643 3741 int case_fold_flag = reg->case_fold_flag; 3644 3742 3645 # ifdef ONIG_DEBUG_SEARCH3646 fprintf(stderr, "bm_search_ic: text: %"PRI dPTR" (%p), text_end: %"PRIdPTR" (%p), text_range: %"PRIdPTR" (%p)\n",3647 ( intptr_t )text, text, (intptr_t )text_end, text_end, (intptr_t )text_range, text_range);3648 # endif3743 # ifdef ONIG_DEBUG_SEARCH 3744 fprintf(stderr, "bm_search_ic: text: %"PRIuPTR" (%p), text_end: %"PRIuPTR" (%p), text_range: %"PRIuPTR" (%p)\n", 3745 (uintptr_t )text, text, (uintptr_t )text_end, text_end, (uintptr_t )text_range, text_range); 3746 # endif 3649 3747 3650 3748 tail = target_end - 1; … … 3666 3764 } 3667 3765 else { /* see int_map[] */ 3766 # if OPT_EXACT_MAXLEN >= ONIG_CHAR_TABLE_SIZE 3668 3767 while (s < end) { 3669 3768 p = s - tlen1; … … 3674 3773 s += reg->int_map[s[1]]; 3675 3774 } 3775 # endif 3676 3776 } 3677 3777 return (UChar* )NULL; … … 3679 3779 #endif /* USE_SUNDAY_QUICK_SEARCH */ 3680 3780 3781 #ifdef USE_INT_MAP_BACKWARD 3681 3782 static int 3682 3783 set_bm_backward_skip(UChar* s, UChar* end, OnigEncoding enc ARG_UNUSED, … … 3711 3812 s = text_start; 3712 3813 else 3713 s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s );3814 s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s, text_end); 3714 3815 3715 3816 while (s >= text) { … … 3723 3824 3724 3825 s -= reg->int_map_backward[*s]; 3725 s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s );3826 s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s, text_end); 3726 3827 } 3727 3828 3728 3829 return (UChar* )NULL; 3729 3830 } 3831 #endif 3730 3832 3731 3833 static UChar* 3732 3834 map_search(OnigEncoding enc, UChar map[], 3733 const UChar* text, const UChar* text_range )3835 const UChar* text, const UChar* text_range, const UChar* text_end) 3734 3836 { 3735 3837 const UChar *s = text; … … 3738 3840 if (map[*s]) return (UChar* )s; 3739 3841 3740 s += enclen(enc, s );3842 s += enclen(enc, s, text_end); 3741 3843 } 3742 3844 return (UChar* )NULL; … … 3746 3848 map_search_backward(OnigEncoding enc, UChar map[], 3747 3849 const UChar* text, const UChar* adjust_text, 3748 const UChar* text_start )3850 const UChar* text_start, const UChar* text_end) 3749 3851 { 3750 3852 const UChar *s = text_start; … … 3753 3855 if (map[*s]) return (UChar* )s; 3754 3856 3755 s = onigenc_get_prev_char_head(enc, adjust_text, s );3857 s = onigenc_get_prev_char_head(enc, adjust_text, s, text_end); 3756 3858 } 3757 3859 return (UChar* )NULL; … … 3765 3867 UChar *prev; 3766 3868 OnigMatchArg msa; 3767 3768 #if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM)3769 start:3770 THREAD_ATOMIC_START;3771 if (ONIG_STATE(reg) >= ONIG_STATE_NORMAL) {3772 ONIG_STATE_INC(reg);3773 if (IS_NOT_NULL(reg->chain) && ONIG_STATE(reg) == ONIG_STATE_NORMAL) {3774 onig_chain_reduce(reg);3775 ONIG_STATE_INC(reg);3776 }3777 }3778 else {3779 int n;3780 3781 THREAD_ATOMIC_END;3782 n = 0;3783 while (ONIG_STATE(reg) < ONIG_STATE_NORMAL) {3784 if (++n > THREAD_PASS_LIMIT_COUNT)3785 return ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT;3786 THREAD_PASS;3787 }3788 goto start;3789 }3790 THREAD_ATOMIC_END;3791 #endif /* USE_RECOMPILE_API && USE_MULTI_THREAD_SYSTEM */3792 3869 3793 3870 MATCH_ARG_INIT(msa, option, region, at, at); … … 3799 3876 #endif 3800 3877 3801 if (region 3802 #ifdef USE_POSIX_API_REGION_OPTION 3803 && !IS_POSIX_REGION(option) 3804 #endif 3805 ) { 3878 if (region) { 3806 3879 r = onig_region_resize_clear(region, reg->num_mem + 1); 3807 3880 } … … 3810 3883 3811 3884 if (r == 0) { 3812 prev = (UChar* )onigenc_get_prev_char_head(reg->enc, str, at );3885 prev = (UChar* )onigenc_get_prev_char_head(reg->enc, str, at, end); 3813 3886 r = match_at(reg, str, end, 3814 3887 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE … … 3819 3892 3820 3893 MATCH_ARG_FREE(msa); 3821 ONIG_STATE_DEC_THREAD(reg);3822 3894 return r; 3823 3895 } … … 3831 3903 #ifdef ONIG_DEBUG_SEARCH 3832 3904 fprintf(stderr, "forward_search_range: str: %"PRIuPTR" (%p), end: %"PRIuPTR" (%p), s: %"PRIuPTR" (%p), range: %"PRIuPTR" (%p)\n", 3833 ( intptr_t )str, str, (intptr_t )end, end, (intptr_t )s, s, (intptr_t )range, range);3905 (uintptr_t )str, str, (uintptr_t )end, end, (uintptr_t )s, s, (uintptr_t )range, range); 3834 3906 #endif 3835 3907 … … 3841 3913 else { 3842 3914 UChar *q = p + reg->dmin; 3843 while (p < q) p += enclen(reg->enc, p); 3915 3916 if (q >= end) return 0; /* fail */ 3917 while (p < q) p += enclen(reg->enc, p, end); 3844 3918 } 3845 3919 } … … 3852 3926 case ONIG_OPTIMIZE_EXACT_IC: 3853 3927 p = slow_search_ic(reg->enc, reg->case_fold_flag, 3854 3928 reg->exact, reg->exact_end, p, end, range); 3855 3929 break; 3856 3930 … … 3872 3946 3873 3947 case ONIG_OPTIMIZE_MAP: 3874 p = map_search(reg->enc, reg->map, p, range );3948 p = map_search(reg->enc, reg->map, p, range, end); 3875 3949 break; 3876 3950 } … … 3880 3954 retry_gate: 3881 3955 pprev = p; 3882 p += enclen(reg->enc, p );3956 p += enclen(reg->enc, p, end); 3883 3957 goto retry; 3884 3958 } … … 3891 3965 if (!ON_STR_BEGIN(p)) { 3892 3966 prev = onigenc_get_prev_char_head(reg->enc, 3893 (pprev ? pprev : str), p );3967 (pprev ? pprev : str), p, end); 3894 3968 if (!ONIGENC_IS_MBC_NEWLINE_EX(reg->enc, prev, str, end, reg->options, 0)) 3895 3969 goto retry_gate; … … 3916 3990 if (low_prev) { 3917 3991 if (*low > s) 3918 *low_prev = onigenc_get_prev_char_head(reg->enc, s, p );3992 *low_prev = onigenc_get_prev_char_head(reg->enc, s, p, end); 3919 3993 else 3920 3994 *low_prev = onigenc_get_prev_char_head(reg->enc, 3921 (pprev ? pprev : str), p );3995 (pprev ? pprev : str), p, end); 3922 3996 } 3923 3997 } 3924 3998 else { 3925 3999 if (reg->dmax != ONIG_INFINITE_DISTANCE) { 3926 *low = p - reg->dmax; 3927 if (*low > s) { 3928 *low = onigenc_get_right_adjust_char_head_with_prev(reg->enc, s, 3929 *low, (const UChar** )low_prev); 3930 if (low_prev && IS_NULL(*low_prev)) 3931 *low_prev = onigenc_get_prev_char_head(reg->enc, 3932 (pprev ? pprev : s), *low); 4000 if (p < str + reg->dmax) { 4001 *low = (UChar* )str; 4002 if (low_prev) 4003 *low_prev = onigenc_get_prev_char_head(reg->enc, str, *low, end); 3933 4004 } 3934 4005 else { 3935 if (low_prev) 3936 *low_prev = onigenc_get_prev_char_head(reg->enc, 3937 (pprev ? pprev : str), *low); 4006 *low = p - reg->dmax; 4007 if (*low > s) { 4008 *low = onigenc_get_right_adjust_char_head_with_prev(reg->enc, s, 4009 *low, end, (const UChar** )low_prev); 4010 if (low_prev && IS_NULL(*low_prev)) 4011 *low_prev = onigenc_get_prev_char_head(reg->enc, 4012 (pprev ? pprev : s), *low, end); 4013 } 4014 else { 4015 if (low_prev) 4016 *low_prev = onigenc_get_prev_char_head(reg->enc, 4017 (pprev ? pprev : str), *low, end); 4018 } 3938 4019 } 3939 4020 } … … 3960 4041 UChar** low, UChar** high) 3961 4042 { 3962 int r;3963 4043 UChar *p; 3964 4044 … … 3978 4058 case ONIG_OPTIMIZE_EXACT_BM_NOT_REV_IC: 3979 4059 p = slow_search_backward_ic(reg->enc, reg->case_fold_flag, 3980 3981 4060 reg->exact, reg->exact_end, 4061 range, adjrange, end, p); 3982 4062 break; 3983 4063 3984 4064 case ONIG_OPTIMIZE_EXACT_BM: 3985 4065 case ONIG_OPTIMIZE_EXACT_BM_NOT_REV: 4066 #ifdef USE_INT_MAP_BACKWARD 3986 4067 if (IS_NULL(reg->int_map_backward)) { 4068 int r; 3987 4069 if (s - range < BM_BACKWARD_SEARCH_LENGTH_THRESHOLD) 3988 4070 goto exact_method; … … 3994 4076 p = bm_search_backward(reg, reg->exact, reg->exact_end, range, adjrange, 3995 4077 end, p); 4078 #else 4079 goto exact_method; 4080 #endif 3996 4081 break; 3997 4082 3998 4083 case ONIG_OPTIMIZE_MAP: 3999 p = map_search_backward(reg->enc, reg->map, range, adjrange, p );4084 p = map_search_backward(reg->enc, reg->map, range, adjrange, p, end); 4000 4085 break; 4001 4086 } … … 4008 4093 case ANCHOR_BEGIN_LINE: 4009 4094 if (!ON_STR_BEGIN(p)) { 4010 prev = onigenc_get_prev_char_head(reg->enc, str, p );4095 prev = onigenc_get_prev_char_head(reg->enc, str, p, end); 4011 4096 if (!ONIGENC_IS_MBC_NEWLINE_EX(reg->enc, prev, str, end, reg->options, 0)) { 4012 4097 p = prev; … … 4028 4113 } 4029 4114 else if (! ONIGENC_IS_MBC_NEWLINE_EX(reg->enc, p, str, end, reg->options, 1)) { 4030 p = onigenc_get_prev_char_head(reg->enc, adjrange, p );4115 p = onigenc_get_prev_char_head(reg->enc, adjrange, p, end); 4031 4116 if (IS_NULL(p)) goto fail; 4032 4117 goto retry; … … 4040 4125 *low = p - reg->dmax; 4041 4126 *high = p - reg->dmin; 4042 *high = onigenc_get_right_adjust_char_head(reg->enc, adjrange, *high );4127 *high = onigenc_get_right_adjust_char_head(reg->enc, adjrange, *high, end); 4043 4128 } 4044 4129 … … 4078 4163 #endif 4079 4164 4080 #if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM)4081 start:4082 THREAD_ATOMIC_START;4083 if (ONIG_STATE(reg) >= ONIG_STATE_NORMAL) {4084 ONIG_STATE_INC(reg);4085 if (IS_NOT_NULL(reg->chain) && ONIG_STATE(reg) == ONIG_STATE_NORMAL) {4086 onig_chain_reduce(reg);4087 ONIG_STATE_INC(reg);4088 }4089 }4090 else {4091 int n;4092 4093 THREAD_ATOMIC_END;4094 n = 0;4095 while (ONIG_STATE(reg) < ONIG_STATE_NORMAL) {4096 if (++n > THREAD_PASS_LIMIT_COUNT)4097 return ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT;4098 THREAD_PASS;4099 }4100 goto start;4101 }4102 THREAD_ATOMIC_END;4103 #endif /* USE_RECOMPILE_API && USE_MULTI_THREAD_SYSTEM */4104 4105 4165 #ifdef ONIG_DEBUG_SEARCH 4106 4166 fprintf(stderr, 4107 4167 "onig_search (entry point): str: %"PRIuPTR" (%p), end: %"PRIuPTR", start: %"PRIuPTR", range: %"PRIuPTR"\n", 4108 (intptr_t )str, str, end - str, start - str, range - str); 4109 #endif 4110 4111 if (region 4112 #ifdef USE_POSIX_API_REGION_OPTION 4113 && !IS_POSIX_REGION(option) 4114 #endif 4115 ) { 4168 (uintptr_t )str, str, end - str, start - str, range - str); 4169 #endif 4170 4171 if (region) { 4116 4172 r = onig_region_resize_clear(region, reg->num_mem + 1); 4117 4173 if (r) goto finish_no_msa; … … 4122 4178 4123 4179 #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE 4124 # ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE4125 # define MATCH_AND_RETURN_CHECK(upper_range) \4180 # ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 4181 # define MATCH_AND_RETURN_CHECK(upper_range) \ 4126 4182 r = match_at(reg, str, end, (upper_range), s, prev, &msa); \ 4127 4183 if (r != ONIG_MISMATCH) {\ … … 4133 4189 else goto finish; /* error */ \ 4134 4190 } 4135 # else4136 # define MATCH_AND_RETURN_CHECK(upper_range) \4191 # else 4192 # define MATCH_AND_RETURN_CHECK(upper_range) \ 4137 4193 r = match_at(reg, str, end, (upper_range), s, prev, &msa); \ 4138 4194 if (r != ONIG_MISMATCH) {\ … … 4142 4198 else goto finish; /* error */ \ 4143 4199 } 4144 # endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */4200 # endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */ 4145 4201 #else 4146 # ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE4147 # define MATCH_AND_RETURN_CHECK(none) \4202 # ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE 4203 # define MATCH_AND_RETURN_CHECK(none) \ 4148 4204 r = match_at(reg, str, end, s, prev, &msa);\ 4149 4205 if (r != ONIG_MISMATCH) {\ … … 4155 4211 else goto finish; /* error */ \ 4156 4212 } 4157 # else4158 # define MATCH_AND_RETURN_CHECK(none) \4213 # else 4214 # define MATCH_AND_RETURN_CHECK(none) \ 4159 4215 r = match_at(reg, str, end, s, prev, &msa);\ 4160 4216 if (r != ONIG_MISMATCH) {\ … … 4164 4220 else goto finish; /* error */ \ 4165 4221 } 4166 # endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */4222 # endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */ 4167 4223 #endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */ 4168 4224 … … 4176 4232 begin_position: 4177 4233 if (range > start) 4178 range = start + 1; 4234 { 4235 if (global_pos > start) 4236 { 4237 if (global_pos < range) 4238 range = global_pos + 1; 4239 } 4240 else 4241 range = start + 1; 4242 } 4179 4243 else 4180 4244 range = start; … … 4206 4270 start = min_semi_end - reg->anchor_dmax; 4207 4271 if (start < end) 4208 start = onigenc_get_right_adjust_char_head(reg->enc, str, start );4272 start = onigenc_get_right_adjust_char_head(reg->enc, str, start, end); 4209 4273 } 4210 4274 if ((OnigDistance )(max_semi_end - (range - 1)) < reg->anchor_dmin) { … … 4222 4286 if ((OnigDistance )(max_semi_end - start) < reg->anchor_dmin) { 4223 4287 start = max_semi_end - reg->anchor_dmin; 4224 start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, start );4288 start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, start, end); 4225 4289 } 4226 4290 if (range > start) goto mismatch_no_msa; … … 4228 4292 } 4229 4293 else if (reg->anchor & ANCHOR_SEMI_END_BUF) { 4230 UChar* pre_end = ONIGENC_STEP_BACK(reg->enc, str, end, 1);4294 UChar* pre_end = ONIGENC_STEP_BACK(reg->enc, str, end, end, 1); 4231 4295 4232 4296 max_semi_end = (UChar* )end; … … 4235 4299 4236 4300 #ifdef USE_CRNL_AS_LINE_TERMINATOR 4237 pre_end = ONIGENC_STEP_BACK(reg->enc, str, pre_end, 1);4301 pre_end = ONIGENC_STEP_BACK(reg->enc, str, pre_end, end, 1); 4238 4302 if (IS_NOT_NULL(pre_end) && 4239 4303 IS_NEWLINE_CRLF(reg->options) && … … 4252 4316 } 4253 4317 else if ((reg->anchor & ANCHOR_ANYCHAR_STAR_ML)) { 4254 if (! (reg->anchor & ANCHOR_LOOK_BEHIND)) { 4255 goto begin_position; 4256 } 4318 goto begin_position; 4257 4319 } 4258 4320 } … … 4296 4358 if (range > start) { /* forward search */ 4297 4359 if (s > str) 4298 prev = onigenc_get_prev_char_head(reg->enc, str, s );4360 prev = onigenc_get_prev_char_head(reg->enc, str, s, end); 4299 4361 else 4300 4362 prev = (UChar* )NULL; … … 4314 4376 4315 4377 if ((end - start) < reg->threshold_len) 4316 4378 goto mismatch; 4317 4379 4318 4380 if (reg->dmax != ONIG_INFINITE_DISTANCE) { … … 4327 4389 MATCH_AND_RETURN_CHECK(orig_range); 4328 4390 prev = s; 4329 s += enclen(reg->enc, s );4391 s += enclen(reg->enc, s, end); 4330 4392 } 4331 4393 } while (s < range); … … 4336 4398 &low, &high, (UChar** )NULL)) goto mismatch; 4337 4399 4338 if ((reg->anchor & ANCHOR_ANYCHAR_STAR) != 0) { 4339 do { 4340 if ((reg->anchor & ANCHOR_BEGIN_POSITION) == 0) 4341 msa.gpos = s; /* move \G position */ 4342 MATCH_AND_RETURN_CHECK(orig_range); 4343 prev = s; 4344 s += enclen(reg->enc, s); 4345 4346 if ((reg->anchor & (ANCHOR_LOOK_BEHIND | ANCHOR_PREC_READ_NOT)) == 0) { 4347 while (!ONIGENC_IS_MBC_NEWLINE_EX(reg->enc, prev, str, end, reg->options, 0) 4348 && s < range) { 4349 prev = s; 4350 s += enclen(reg->enc, s); 4351 } 4352 } 4353 } while (s < range); 4354 goto mismatch; 4355 } 4400 if ((reg->anchor & ANCHOR_ANYCHAR_STAR) != 0) { 4401 do { 4402 MATCH_AND_RETURN_CHECK(orig_range); 4403 prev = s; 4404 s += enclen(reg->enc, s, end); 4405 4406 if ((reg->anchor & (ANCHOR_LOOK_BEHIND | ANCHOR_PREC_READ_NOT)) == 0) { 4407 while (!ONIGENC_IS_MBC_NEWLINE_EX(reg->enc, prev, str, end, reg->options, 0) 4408 && s < range) { 4409 prev = s; 4410 s += enclen(reg->enc, s, end); 4411 } 4412 } 4413 } while (s < range); 4414 goto mismatch; 4415 } 4356 4416 } 4357 4417 } … … 4360 4420 MATCH_AND_RETURN_CHECK(orig_range); 4361 4421 prev = s; 4362 s += enclen(reg->enc, s );4422 s += enclen(reg->enc, s, end); 4363 4423 } while (s < range); 4364 4424 … … 4372 4432 4373 4433 if (range < end) 4374 adjrange = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, range );4434 adjrange = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, range, end); 4375 4435 else 4376 4436 adjrange = (UChar* )end; … … 4389 4449 4390 4450 while (s >= low) { 4391 prev = onigenc_get_prev_char_head(reg->enc, str, s );4451 prev = onigenc_get_prev_char_head(reg->enc, str, s, end); 4392 4452 MATCH_AND_RETURN_CHECK(orig_start); 4393 4453 s = prev; … … 4408 4468 else 4409 4469 sch_start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, 4410 start, sch_start );4470 start, sch_start, end); 4411 4471 } 4412 4472 } … … 4417 4477 4418 4478 do { 4419 prev = onigenc_get_prev_char_head(reg->enc, str, s );4479 prev = onigenc_get_prev_char_head(reg->enc, str, s, end); 4420 4480 MATCH_AND_RETURN_CHECK(orig_start); 4421 4481 s = prev; … … 4436 4496 finish: 4437 4497 MATCH_ARG_FREE(msa); 4438 ONIG_STATE_DEC_THREAD(reg);4439 4498 4440 4499 /* If result is mismatch and no FIND_NOT_EMPTY option, 4441 4500 then the region is not set in match_at(). */ 4442 if (IS_FIND_NOT_EMPTY(reg->options) && region 4443 #ifdef USE_POSIX_API_REGION_OPTION 4444 && !IS_POSIX_REGION(option) 4445 #endif 4446 ) { 4501 if (IS_FIND_NOT_EMPTY(reg->options) && region) { 4447 4502 onig_region_clear(region); 4448 4503 } … … 4450 4505 #ifdef ONIG_DEBUG 4451 4506 if (r != ONIG_MISMATCH) 4452 fprintf(stderr, "onig_search: error %"PRIdPTR "\n", r);4507 fprintf(stderr, "onig_search: error %"PRIdPTRDIFF"\n", r); 4453 4508 #endif 4454 4509 return r; … … 4457 4512 r = ONIG_MISMATCH; 4458 4513 finish_no_msa: 4459 ONIG_STATE_DEC_THREAD(reg);4460 4514 #ifdef ONIG_DEBUG 4461 4515 if (r != ONIG_MISMATCH) 4462 fprintf(stderr, "onig_search: error %"PRIdPTR "\n", r);4516 fprintf(stderr, "onig_search: error %"PRIdPTRDIFF"\n", r); 4463 4517 #endif 4464 4518 return r; 4465 4519 4466 4520 match: 4467 ONIG_STATE_DEC_THREAD(reg);4468 4521 MATCH_ARG_FREE(msa); 4469 4522 return s - str; 4470 4523 } 4471 4524 4525 extern OnigPosition 4526 onig_scan(regex_t* reg, const UChar* str, const UChar* end, 4527 OnigRegion* region, OnigOptionType option, 4528 int (*scan_callback)(OnigPosition, OnigPosition, OnigRegion*, void*), 4529 void* callback_arg) 4530 { 4531 OnigPosition r; 4532 OnigPosition n; 4533 int rs; 4534 const UChar* start; 4535 4536 n = 0; 4537 start = str; 4538 while (1) { 4539 r = onig_search(reg, str, end, start, end, region, option); 4540 if (r >= 0) { 4541 rs = scan_callback(n, r, region, callback_arg); 4542 n++; 4543 if (rs != 0) 4544 return rs; 4545 4546 if (region->end[0] == start - str) { 4547 if (start >= end) break; 4548 start += enclen(reg->enc, start, end); 4549 } 4550 else 4551 start = str + region->end[0]; 4552 4553 if (start > end) 4554 break; 4555 } 4556 else if (r == ONIG_MISMATCH) { 4557 break; 4558 } 4559 else { /* error */ 4560 return r; 4561 } 4562 } 4563 4564 return n; 4565 } 4566 4472 4567 extern OnigEncoding 4473 onig_get_encoding( regex_t* reg)4568 onig_get_encoding(const regex_t* reg) 4474 4569 { 4475 4570 return reg->enc; … … 4477 4572 4478 4573 extern OnigOptionType 4479 onig_get_options( regex_t* reg)4574 onig_get_options(const regex_t* reg) 4480 4575 { 4481 4576 return reg->options; … … 4483 4578 4484 4579 extern OnigCaseFoldType 4485 onig_get_case_fold_flag( regex_t* reg)4580 onig_get_case_fold_flag(const regex_t* reg) 4486 4581 { 4487 4582 return reg->case_fold_flag; 4488 4583 } 4489 4584 4490 extern OnigSyntaxType*4491 onig_get_syntax( regex_t* reg)4585 extern const OnigSyntaxType* 4586 onig_get_syntax(const regex_t* reg) 4492 4587 { 4493 4588 return reg->syntax; … … 4495 4590 4496 4591 extern int 4497 onig_number_of_captures( regex_t* reg)4592 onig_number_of_captures(const regex_t* reg) 4498 4593 { 4499 4594 return reg->num_mem; … … 4501 4596 4502 4597 extern int 4503 onig_number_of_capture_histories( regex_t* reg)4598 onig_number_of_capture_histories(const regex_t* reg) 4504 4599 { 4505 4600 #ifdef USE_CAPTURE_HISTORY … … 4518 4613 4519 4614 extern void 4520 onig_copy_encoding(OnigEncoding 4615 onig_copy_encoding(OnigEncodingType *to, OnigEncoding from) 4521 4616 { 4522 4617 *to = *from;
Note:
See TracChangeset
for help on using the changeset viewer.