Changeset 27422 in webkit for trunk/JavaScriptCore/pcre/pcre_exec.c
- Timestamp:
- Nov 4, 2007, 1:28:22 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/pcre/pcre_exec.c
r27421 r27422 217 217 218 218 219 #define RMATCH(num, rx,rb,rf,rg)\219 #define RMATCH(num, ra, rb, rc)\ 220 220 {\ 221 221 if (frame >= stackframes && frame + 1 < stackframesend)\ … … 225 225 frame->where = RMATCH_WHERE(num);\ 226 226 newframe->eptr = frame->eptr;\ 227 newframe->ecode = rb;\227 newframe->ecode = (ra);\ 228 228 newframe->offset_top = frame->offset_top;\ 229 newframe->eptrb = rf;\230 is_group_start = rg;\229 newframe->eptrb = (rb);\ 230 is_group_start = (rc);\ 231 231 ++rdepth;\ 232 232 newframe->prevframe = frame;\ … … 235 235 goto HEAP_RECURSE;\ 236 236 RRETURN_##num:\ 237 --rdepth;\ 237 238 DPRINTF(("did a goto back to line %d\n", __LINE__));\ 238 rx = result;\239 --rdepth;\240 239 } 241 240 … … 248 247 if (frame != NULL)\ 249 248 {\ 250 r esult = ra;\249 rrc = (ra);\ 251 250 goto RRETURN_LABEL;\ 252 251 }\ 253 252 return ra;\ 254 253 } 255 256 254 257 255 /* Structure for remembering the local variables in a private frame */ … … 275 273 const pcre_uchar *saved_eptr; 276 274 277 BOOL minimize;278 279 275 int repeat_othercase; 280 276 … … 284 280 int length; 285 281 int max; 286 int min;287 282 int number; 288 283 int offset; 289 int op;290 284 int save_offset1, save_offset2, save_offset3; 291 285 … … 319 313 same response. 320 314 321 Performance note: It might be tempting to extract commonly used fields from the322 md structure (e.g. utf8, end_subject) into individual variables to improve323 performance. Tests using gcc on a SPARC disproved this; in the first case, it324 made performance worse.325 326 315 Arguments: 327 316 eptr pointer in subject … … 351 340 BOOL prev_is_word; 352 341 BOOL is_group_start = TRUE; 342 int min; 343 BOOL minimize = FALSE; /* Initialization not really needed, but some compilers think so. */ 353 344 354 345 /* When recursion is not being used, all "local" variables that have to be … … 365 356 matchframe *frame = stackframes; 366 357 matchframe *newframe; 367 int result;368 358 frame->prevframe = NULL; /* Marks the top level */ 369 359 … … 409 399 for (;;) 410 400 { 411 frame->op = *frame->ecode; 412 frame->minimize = FALSE; 413 414 /* Opening capturing bracket. If there is space in the offset vector, save 415 the current subject position in the working slot at the top of the vector. We 416 mustn't change the current values of the data slot, because they may be set 417 from a previous iteration of this group, and be referred to by a reference 418 inside the group. 419 420 If the bracket fails to match, we need to restore this value and also the 421 values of the final offsets, in case they were set by a previous iteration of 422 the same bracket. 423 424 If there isn't enough space in the offset vector, treat this as if it were a 425 non-capturing bracket. Don't worry about setting the flag for the error case 426 here; that is handled in the code for KET. */ 427 428 if (frame->op > OP_BRA) 429 { 430 frame->number = frame->op - OP_BRA; 431 432 /* For extended extraction brackets (large number), we have to fish out the 433 number from a dummy opcode at the start. */ 434 435 if (frame->number > EXTRACT_BASIC_MAX) 436 frame->number = GET2(frame->ecode, 2+LINK_SIZE); 437 frame->offset = frame->number << 1; 438 439 #ifdef DEBUG 440 printf("start bracket %d subject=", frame->number); 441 pchars(frame->eptr, 16, TRUE, md); 442 printf("\n"); 443 #endif 444 445 if (frame->offset < md->offset_max) 446 { 447 frame->save_offset1 = md->offset_vector[frame->offset]; 448 frame->save_offset2 = md->offset_vector[frame->offset+1]; 449 frame->save_offset3 = md->offset_vector[md->offset_end - frame->number]; 450 451 DPRINTF(("saving %d %d %d\n", frame->save_offset1, frame->save_offset2, frame->save_offset3)); 452 md->offset_vector[md->offset_end - frame->number] = frame->eptr - md->start_subject; 453 454 do 455 { 456 RMATCH(1, rrc, frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup); 457 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 458 frame->ecode += GET(frame->ecode, 1); 459 } 460 while (*frame->ecode == OP_ALT); 461 462 DPRINTF(("bracket %d failed\n", frame->number)); 463 464 md->offset_vector[frame->offset] = frame->save_offset1; 465 md->offset_vector[frame->offset+1] = frame->save_offset2; 466 md->offset_vector[md->offset_end - frame->number] = frame->save_offset3; 467 468 RRETURN(MATCH_NOMATCH); 469 } 470 471 /* Insufficient room for saving captured contents */ 472 473 else frame->op = OP_BRA; 474 } 475 476 /* Other types of node can be handled by a switch */ 477 478 switch(frame->op) 401 switch (*frame->ecode) 479 402 { 480 403 case OP_BRA: /* Non-capturing bracket: optimized */ 404 NON_CAPTURING_BRACKET: 481 405 DPRINTF(("start bracket 0\n")); 482 406 do 483 407 { 484 RMATCH(2, rrc,frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup);408 RMATCH(2, frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup); 485 409 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 486 410 frame->ecode += GET(frame->ecode, 1); … … 506 430 do 507 431 { 508 RMATCH(6, rrc,frame->ecode + 1 + LINK_SIZE, NULL, match_isgroup);432 RMATCH(6, frame->ecode + 1 + LINK_SIZE, NULL, match_isgroup); 509 433 if (rrc == MATCH_MATCH) break; 510 434 if (rrc != MATCH_NOMATCH) RRETURN(rrc); … … 527 451 do 528 452 { 529 RMATCH(7, rrc,frame->ecode + 1 + LINK_SIZE, NULL, match_isgroup);453 RMATCH(7, frame->ecode + 1 + LINK_SIZE, NULL, match_isgroup); 530 454 if (rrc == MATCH_MATCH) RRETURN(MATCH_NOMATCH); 531 455 if (rrc != MATCH_NOMATCH) RRETURN(rrc); … … 551 475 do 552 476 { 553 RMATCH(9, rrc,frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup);477 RMATCH(9, frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup); 554 478 if (rrc == MATCH_MATCH) break; 555 479 if (rrc != MATCH_NOMATCH) RRETURN(rrc); … … 589 513 if (*frame->ecode == OP_KETRMIN) 590 514 { 591 RMATCH(10, rrc,frame->ecode + 1 + LINK_SIZE, frame->eptrb, 0);515 RMATCH(10, frame->ecode + 1 + LINK_SIZE, frame->eptrb, 0); 592 516 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 593 RMATCH(11, rrc,frame->prev, frame->eptrb, match_isgroup);517 RMATCH(11, frame->prev, frame->eptrb, match_isgroup); 594 518 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 595 519 } 596 520 else /* OP_KETRMAX */ 597 521 { 598 RMATCH(12, rrc,frame->prev, frame->eptrb, match_isgroup);522 RMATCH(12, frame->prev, frame->eptrb, match_isgroup); 599 523 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 600 RMATCH(13, rrc,frame->ecode + 1+LINK_SIZE, frame->eptrb, 0);524 RMATCH(13, frame->ecode + 1+LINK_SIZE, frame->eptrb, 0); 601 525 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 602 526 } … … 620 544 { 621 545 frame->next = frame->ecode+1; 622 RMATCH(14, rrc,frame->next, frame->eptrb, match_isgroup);546 RMATCH(14, frame->next, frame->eptrb, match_isgroup); 623 547 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 624 548 do frame->next += GET(frame->next,1); while (*frame->next == OP_ALT); … … 631 555 frame->next = frame->ecode+1; 632 556 do frame->next += GET(frame->next,1); while (*frame->next == OP_ALT); 633 RMATCH(15, rrc,frame->next + 1+LINK_SIZE, frame->eptrb, match_isgroup);557 RMATCH(15, frame->next + 1+LINK_SIZE, frame->eptrb, match_isgroup); 634 558 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 635 559 frame->ecode++; … … 712 636 if (*frame->ecode == OP_KETRMIN) 713 637 { 714 RMATCH(16, rrc,frame->ecode + 1+LINK_SIZE, frame->eptrb, 0);638 RMATCH(16, frame->ecode + 1+LINK_SIZE, frame->eptrb, 0); 715 639 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 716 RMATCH(17, rrc,frame->prev, frame->eptrb, match_isgroup);640 RMATCH(17, frame->prev, frame->eptrb, match_isgroup); 717 641 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 718 642 } 719 643 else /* OP_KETRMAX */ 720 644 { 721 RMATCH(18, rrc,frame->prev, frame->eptrb, match_isgroup);645 RMATCH(18, frame->prev, frame->eptrb, match_isgroup); 722 646 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 723 RMATCH(19, rrc,frame->ecode + 1+LINK_SIZE, frame->eptrb, 0);647 RMATCH(19, frame->ecode + 1+LINK_SIZE, frame->eptrb, 0); 724 648 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 725 649 } … … 904 828 case OP_CRMINQUERY: 905 829 c = *frame->ecode++ - OP_CRSTAR; 906 frame->minimize = (c & 1) != 0;907 frame->min = rep_min[c]; /* Pick up values from tables; */830 minimize = (c & 1) != 0; 831 min = rep_min[c]; /* Pick up values from tables; */ 908 832 frame->max = rep_max[c]; /* zero for max => infinity */ 909 833 if (frame->max == 0) frame->max = INT_MAX; … … 912 836 case OP_CRRANGE: 913 837 case OP_CRMINRANGE: 914 frame->minimize = (*frame->ecode == OP_CRMINRANGE);915 frame->min = GET2(frame->ecode, 1);838 minimize = (*frame->ecode == OP_CRMINRANGE); 839 min = GET2(frame->ecode, 1); 916 840 frame->max = GET2(frame->ecode, 3); 917 841 if (frame->max == 0) frame->max = INT_MAX; … … 932 856 /* First, ensure the minimum number of matches are present. */ 933 857 934 for (i = 1; i <= frame->min; i++)858 for (i = 1; i <= min; i++) 935 859 { 936 860 if (!match_ref(frame->offset, frame->eptr, frame->length, md)) RRETURN(MATCH_NOMATCH); … … 941 865 They are not both allowed to be zero. */ 942 866 943 if ( frame->min == frame->max) continue;867 if (min == frame->max) continue; 944 868 945 869 /* If minimizing, keep trying and advancing the pointer */ 946 870 947 if ( frame->minimize)948 { 949 for (frame->fi = frame->min;; frame->fi++)950 { 951 RMATCH(20, rrc,frame->ecode, frame->eptrb, 0);871 if (minimize) 872 { 873 for (frame->fi = min;; frame->fi++) 874 { 875 RMATCH(20, frame->ecode, frame->eptrb, 0); 952 876 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 953 877 if (frame->fi >= frame->max || !match_ref(frame->offset, frame->eptr, frame->length, md)) … … 963 887 { 964 888 frame->pp = frame->eptr; 965 for (i = frame->min; i < frame->max; i++)889 for (i = min; i < frame->max; i++) 966 890 { 967 891 if (!match_ref(frame->offset, frame->eptr, frame->length, md)) break; … … 970 894 while (frame->eptr >= frame->pp) 971 895 { 972 RMATCH(21, rrc,frame->ecode, frame->eptrb, 0);896 RMATCH(21, frame->ecode, frame->eptrb, 0); 973 897 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 974 898 frame->eptr -= frame->length; … … 1007 931 case OP_CRMINQUERY: 1008 932 c = *frame->ecode++ - OP_CRSTAR; 1009 frame->minimize = (c & 1) != 0;1010 frame->min = rep_min[c]; /* Pick up values from tables; */933 minimize = (c & 1) != 0; 934 min = rep_min[c]; /* Pick up values from tables; */ 1011 935 frame->max = rep_max[c]; /* zero for max => infinity */ 1012 936 if (frame->max == 0) frame->max = INT_MAX; … … 1015 939 case OP_CRRANGE: 1016 940 case OP_CRMINRANGE: 1017 frame->minimize = (*frame->ecode == OP_CRMINRANGE);1018 frame->min = GET2(frame->ecode, 1);941 minimize = (*frame->ecode == OP_CRMINRANGE); 942 min = GET2(frame->ecode, 1); 1019 943 frame->max = GET2(frame->ecode, 3); 1020 944 if (frame->max == 0) frame->max = INT_MAX; … … 1023 947 1024 948 default: /* No repeat follows */ 1025 frame->min = frame->max = 1;949 min = frame->max = 1; 1026 950 break; 1027 951 } … … 1030 954 1031 955 { 1032 for (i = 1; i <= frame->min; i++)956 for (i = 1; i <= min; i++) 1033 957 { 1034 958 if (frame->eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); … … 1036 960 if (c > 255) 1037 961 { 1038 if (frame-> op== OP_CLASS) RRETURN(MATCH_NOMATCH);962 if (frame->data[-1] == OP_CLASS) RRETURN(MATCH_NOMATCH); 1039 963 } 1040 964 else … … 1048 972 need to recurse. */ 1049 973 1050 if ( frame->min == frame->max) continue;974 if (min == frame->max) continue; 1051 975 1052 976 /* If minimizing, keep testing the rest of the expression and advancing 1053 977 the pointer while it matches the class. */ 1054 978 1055 if ( frame->minimize)1056 { 1057 { 1058 for (frame->fi = frame->min;; frame->fi++)1059 { 1060 RMATCH(22, rrc,frame->ecode, frame->eptrb, 0);979 if (minimize) 980 { 981 { 982 for (frame->fi = min;; frame->fi++) 983 { 984 RMATCH(22, frame->ecode, frame->eptrb, 0); 1061 985 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1062 986 if (frame->fi >= frame->max || frame->eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); … … 1064 988 if (c > 255) 1065 989 { 1066 if (frame-> op== OP_CLASS) RRETURN(MATCH_NOMATCH);990 if (frame->data[-1] == OP_CLASS) RRETURN(MATCH_NOMATCH); 1067 991 } 1068 992 else … … 1082 1006 1083 1007 { 1084 for (i = frame->min; i < frame->max; i++)1008 for (i = min; i < frame->max; i++) 1085 1009 { 1086 1010 int len = 1; … … 1089 1013 if (c > 255) 1090 1014 { 1091 if (frame-> op== OP_CLASS) break;1015 if (frame->data[-1] == OP_CLASS) break; 1092 1016 } 1093 1017 else … … 1099 1023 for (;;) 1100 1024 { 1101 RMATCH(24, rrc,frame->ecode, frame->eptrb, 0);1025 RMATCH(24, frame->ecode, frame->eptrb, 0); 1102 1026 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1103 1027 if (frame->eptr-- == frame->pp) break; /* Stop if tried at original pos */ … … 1128 1052 case OP_CRMINQUERY: 1129 1053 c = *frame->ecode++ - OP_CRSTAR; 1130 frame->minimize = (c & 1) != 0;1131 frame->min = rep_min[c]; /* Pick up values from tables; */1054 minimize = (c & 1) != 0; 1055 min = rep_min[c]; /* Pick up values from tables; */ 1132 1056 frame->max = rep_max[c]; /* zero for max => infinity */ 1133 1057 if (frame->max == 0) frame->max = INT_MAX; … … 1136 1060 case OP_CRRANGE: 1137 1061 case OP_CRMINRANGE: 1138 frame->minimize = (*frame->ecode == OP_CRMINRANGE);1139 frame->min = GET2(frame->ecode, 1);1062 minimize = (*frame->ecode == OP_CRMINRANGE); 1063 min = GET2(frame->ecode, 1); 1140 1064 frame->max = GET2(frame->ecode, 3); 1141 1065 if (frame->max == 0) frame->max = INT_MAX; … … 1144 1068 1145 1069 default: /* No repeat follows */ 1146 frame->min = frame->max = 1;1070 min = frame->max = 1; 1147 1071 break; 1148 1072 } … … 1150 1074 /* First, ensure the minimum number of matches are present. */ 1151 1075 1152 for (i = 1; i <= frame->min; i++)1076 for (i = 1; i <= min; i++) 1153 1077 { 1154 1078 if (frame->eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); … … 1160 1084 need to recurse. */ 1161 1085 1162 if ( frame->min == frame->max) continue;1086 if (min == frame->max) continue; 1163 1087 1164 1088 /* If minimizing, keep testing the rest of the expression and advancing 1165 1089 the pointer while it matches the class. */ 1166 1090 1167 if ( frame->minimize)1168 { 1169 for (frame->fi = frame->min;; frame->fi++)1170 { 1171 RMATCH(26, rrc,frame->ecode, frame->eptrb, 0);1091 if (minimize) 1092 { 1093 for (frame->fi = min;; frame->fi++) 1094 { 1095 RMATCH(26, frame->ecode, frame->eptrb, 0); 1172 1096 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1173 1097 if (frame->fi >= frame->max || frame->eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); … … 1183 1107 { 1184 1108 frame->pp = frame->eptr; 1185 for (i = frame->min; i < frame->max; i++)1109 for (i = min; i < frame->max; i++) 1186 1110 { 1187 1111 int len = 1; … … 1193 1117 for(;;) 1194 1118 { 1195 RMATCH(27, rrc,frame->ecode, frame->eptrb, 0);1119 RMATCH(27, frame->ecode, frame->eptrb, 0); 1196 1120 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1197 1121 if (frame->eptr-- == frame->pp) break; /* Stop if tried at original pos */ … … 1277 1201 break; 1278 1202 1203 /* Match a single ASCII character. */ 1204 1205 case OP_ASCII_CHAR: 1206 if (md->end_subject == frame->eptr) 1207 RRETURN(MATCH_NOMATCH); 1208 if (*frame->eptr != frame->ecode[1]) 1209 RRETURN(MATCH_NOMATCH); 1210 ++frame->eptr; 1211 frame->ecode += 2; 1212 break; 1213 1214 /* Match one of two cases of an ASCII character. */ 1215 1216 case OP_ASCII_LETTER_NC: 1217 if (md->end_subject == frame->eptr) 1218 RRETURN(MATCH_NOMATCH); 1219 if ((*frame->eptr | 0x20) != frame->ecode[1]) 1220 RRETURN(MATCH_NOMATCH); 1221 ++frame->eptr; 1222 frame->ecode += 2; 1223 break; 1224 1279 1225 /* Match a single character repeatedly; different opcodes share code. */ 1280 1226 1281 1227 case OP_EXACT: 1282 frame->min = frame->max = GET2(frame->ecode, 1); 1228 min = frame->max = GET2(frame->ecode, 1); 1229 minimize = FALSE; 1283 1230 frame->ecode += 3; 1284 1231 goto REPEATCHAR; … … 1286 1233 case OP_UPTO: 1287 1234 case OP_MINUPTO: 1288 frame->min = 0;1235 min = 0; 1289 1236 frame->max = GET2(frame->ecode, 1); 1290 frame->minimize = *frame->ecode == OP_MINUPTO;1237 minimize = *frame->ecode == OP_MINUPTO; 1291 1238 frame->ecode += 3; 1292 1239 goto REPEATCHAR; … … 1299 1246 case OP_MINQUERY: 1300 1247 c = *frame->ecode++ - OP_STAR; 1301 frame->minimize = (c & 1) != 0;1302 frame->min = rep_min[c]; /* Pick up values from tables; */1248 minimize = (c & 1) != 0; 1249 min = rep_min[c]; /* Pick up values from tables; */ 1303 1250 frame->max = rep_max[c]; /* zero for max => infinity */ 1304 1251 if (frame->max == 0) frame->max = INT_MAX; … … 1313 1260 GETUTF8CHARLEN(frame->fc, frame->ecode, frame->length); 1314 1261 { 1315 if ( frame->min * (frame->fc > 0xFFFF ? 2 : 1) > md->end_subject - frame->eptr) RRETURN(MATCH_NOMATCH);1262 if (min * (frame->fc > 0xFFFF ? 2 : 1) > md->end_subject - frame->eptr) RRETURN(MATCH_NOMATCH); 1316 1263 frame->ecode += frame->length; 1317 1264 … … 1320 1267 int othercase = md->caseless ? _pcre_ucp_othercase(frame->fc) : -1; 1321 1268 1322 for (i = 1; i <= frame->min; i++)1269 for (i = 1; i <= min; i++) 1323 1270 { 1324 1271 if (*frame->eptr != frame->fc && *frame->eptr != othercase) RRETURN(MATCH_NOMATCH); … … 1326 1273 } 1327 1274 1328 if ( frame->min == frame->max) continue;1329 1330 if ( frame->minimize)1275 if (min == frame->max) continue; 1276 1277 if (minimize) 1331 1278 { 1332 1279 frame->repeat_othercase = othercase; 1333 for (frame->fi = frame->min;; frame->fi++)1334 { 1335 RMATCH(28, rrc,frame->ecode, frame->eptrb, 0);1280 for (frame->fi = min;; frame->fi++) 1281 { 1282 RMATCH(28, frame->ecode, frame->eptrb, 0); 1336 1283 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1337 1284 if (frame->fi >= frame->max || frame->eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); … … 1344 1291 { 1345 1292 frame->pp = frame->eptr; 1346 for (i = frame->min; i < frame->max; i++)1293 for (i = min; i < frame->max; i++) 1347 1294 { 1348 1295 if (frame->eptr >= md->end_subject) break; … … 1352 1299 while (frame->eptr >= frame->pp) 1353 1300 { 1354 RMATCH(29, rrc,frame->ecode, frame->eptrb, 0);1301 RMATCH(29, frame->ecode, frame->eptrb, 0); 1355 1302 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1356 1303 --frame->eptr; … … 1364 1311 /* No case on surrogate pairs, so no need to bother with "othercase". */ 1365 1312 1366 for (i = 1; i <= frame->min; i++)1313 for (i = 1; i <= min; i++) 1367 1314 { 1368 1315 int nc; … … 1372 1319 } 1373 1320 1374 if ( frame->min == frame->max) continue;1375 1376 if ( frame->minimize)1377 { 1378 for (frame->fi = frame->min;; frame->fi++)1321 if (min == frame->max) continue; 1322 1323 if (minimize) 1324 { 1325 for (frame->fi = min;; frame->fi++) 1379 1326 { 1380 1327 int nc; 1381 RMATCH(30, rrc,frame->ecode, frame->eptrb, 0);1328 RMATCH(30, frame->ecode, frame->eptrb, 0); 1382 1329 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1383 1330 if (frame->fi >= frame->max || frame->eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); … … 1391 1338 { 1392 1339 frame->pp = frame->eptr; 1393 for (i = frame->min; i < frame->max; i++)1340 for (i = min; i < frame->max; i++) 1394 1341 { 1395 1342 int nc; … … 1401 1348 while (frame->eptr >= frame->pp) 1402 1349 { 1403 RMATCH(31, rrc,frame->ecode, frame->eptrb, 0);1350 RMATCH(31, frame->ecode, frame->eptrb, 0); 1404 1351 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1405 1352 frame->eptr -= 2; … … 1439 1386 1440 1387 case OP_NOTEXACT: 1441 frame->min = frame->max = GET2(frame->ecode, 1); 1388 min = frame->max = GET2(frame->ecode, 1); 1389 minimize = FALSE; 1442 1390 frame->ecode += 3; 1443 1391 goto REPEATNOTCHAR; … … 1445 1393 case OP_NOTUPTO: 1446 1394 case OP_NOTMINUPTO: 1447 frame->min = 0;1395 min = 0; 1448 1396 frame->max = GET2(frame->ecode, 1); 1449 frame->minimize = *frame->ecode == OP_NOTMINUPTO;1397 minimize = *frame->ecode == OP_NOTMINUPTO; 1450 1398 frame->ecode += 3; 1451 1399 goto REPEATNOTCHAR; … … 1458 1406 case OP_NOTMINQUERY: 1459 1407 c = *frame->ecode++ - OP_NOTSTAR; 1460 frame->minimize = (c & 1) != 0;1461 frame->min = rep_min[c]; /* Pick up values from tables; */1408 minimize = (c & 1) != 0; 1409 min = rep_min[c]; /* Pick up values from tables; */ 1462 1410 frame->max = rep_max[c]; /* zero for max => infinity */ 1463 1411 if (frame->max == 0) frame->max = INT_MAX; … … 1468 1416 1469 1417 REPEATNOTCHAR: 1470 if ( frame->min > md->end_subject - frame->eptr) RRETURN(MATCH_NOMATCH);1418 if (min > md->end_subject - frame->eptr) RRETURN(MATCH_NOMATCH); 1471 1419 frame->fc = *frame->ecode++; 1472 1420 … … 1479 1427 characters and work backwards. */ 1480 1428 1481 DPRINTF(("negative matching %c{%d,%d}\n", frame->fc, frame->min, frame->max));1429 DPRINTF(("negative matching %c{%d,%d}\n", frame->fc, min, frame->max)); 1482 1430 1483 1431 if (md->caseless) … … 1487 1435 { 1488 1436 register int d; 1489 for (i = 1; i <= frame->min; i++)1437 for (i = 1; i <= min; i++) 1490 1438 { 1491 1439 GETCHARINC(d, frame->eptr); … … 1495 1443 } 1496 1444 1497 if ( frame->min == frame->max) continue;1498 1499 if ( frame->minimize)1445 if (min == frame->max) continue; 1446 1447 if (minimize) 1500 1448 { 1501 1449 { 1502 1450 register int d; 1503 for (frame->fi = frame->min;; frame->fi++)1504 { 1505 RMATCH(38, rrc,frame->ecode, frame->eptrb, 0);1451 for (frame->fi = min;; frame->fi++) 1452 { 1453 RMATCH(38, frame->ecode, frame->eptrb, 0); 1506 1454 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1507 1455 GETCHARINC(d, frame->eptr); … … 1522 1470 { 1523 1471 register int d; 1524 for (i = frame->min; i < frame->max; i++)1472 for (i = min; i < frame->max; i++) 1525 1473 { 1526 1474 int len = 1; … … 1533 1481 for(;;) 1534 1482 { 1535 RMATCH(40, rrc,frame->ecode, frame->eptrb, 0);1483 RMATCH(40, frame->ecode, frame->eptrb, 0); 1536 1484 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1537 1485 if (frame->eptr-- == frame->pp) break; /* Stop if tried at original pos */ … … 1551 1499 { 1552 1500 register int d; 1553 for (i = 1; i <= frame->min; i++)1501 for (i = 1; i <= min; i++) 1554 1502 { 1555 1503 GETCHARINC(d, frame->eptr); … … 1558 1506 } 1559 1507 1560 if ( frame->min == frame->max) continue;1561 1562 if ( frame->minimize)1508 if (min == frame->max) continue; 1509 1510 if (minimize) 1563 1511 { 1564 1512 { 1565 1513 register int d; 1566 for (frame->fi = frame->min;; frame->fi++)1567 { 1568 RMATCH(42, rrc,frame->ecode, frame->eptrb, 0);1514 for (frame->fi = min;; frame->fi++) 1515 { 1516 RMATCH(42, frame->ecode, frame->eptrb, 0); 1569 1517 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1570 1518 GETCHARINC(d, frame->eptr); … … 1584 1532 { 1585 1533 register int d; 1586 for (i = frame->min; i < frame->max; i++)1534 for (i = min; i < frame->max; i++) 1587 1535 { 1588 1536 int len = 1; … … 1594 1542 for(;;) 1595 1543 { 1596 RMATCH(44, rrc,frame->ecode, frame->eptrb, 0);1544 RMATCH(44, frame->ecode, frame->eptrb, 0); 1597 1545 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1598 1546 if (frame->eptr-- == frame->pp) break; /* Stop if tried at original pos */ … … 1611 1559 1612 1560 case OP_TYPEEXACT: 1613 frame->min = frame->max = GET2(frame->ecode, 1);1614 frame->minimize = TRUE;1561 min = frame->max = GET2(frame->ecode, 1); 1562 minimize = TRUE; 1615 1563 frame->ecode += 3; 1616 1564 goto REPEATTYPE; … … 1618 1566 case OP_TYPEUPTO: 1619 1567 case OP_TYPEMINUPTO: 1620 frame->min = 0;1568 min = 0; 1621 1569 frame->max = GET2(frame->ecode, 1); 1622 frame->minimize = *frame->ecode == OP_TYPEMINUPTO;1570 minimize = *frame->ecode == OP_TYPEMINUPTO; 1623 1571 frame->ecode += 3; 1624 1572 goto REPEATTYPE; … … 1631 1579 case OP_TYPEMINQUERY: 1632 1580 c = *frame->ecode++ - OP_TYPESTAR; 1633 frame->minimize = (c & 1) != 0;1634 frame->min = rep_min[c]; /* Pick up values from tables; */1581 minimize = (c & 1) != 0; 1582 min = rep_min[c]; /* Pick up values from tables; */ 1635 1583 frame->max = rep_max[c]; /* zero for max => infinity */ 1636 1584 if (frame->max == 0) frame->max = INT_MAX; … … 1651 1599 and single-bytes. */ 1652 1600 1653 if ( frame->min > md->end_subject - frame->eptr) RRETURN(MATCH_NOMATCH);1654 if ( frame->min > 0)1601 if (min > md->end_subject - frame->eptr) RRETURN(MATCH_NOMATCH); 1602 if (min > 0) 1655 1603 { 1656 1604 switch(frame->ctype) 1657 1605 { 1658 1606 case OP_ANY: 1659 for (i = 1; i <= frame->min; i++)1607 for (i = 1; i <= min; i++) 1660 1608 { 1661 1609 if (frame->eptr >= md->end_subject || IS_NEWLINE(*frame->eptr)) … … 1667 1615 1668 1616 case OP_NOT_DIGIT: 1669 for (i = 1; i <= frame->min; i++)1617 for (i = 1; i <= min; i++) 1670 1618 { 1671 1619 if (frame->eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); … … 1677 1625 1678 1626 case OP_DIGIT: 1679 for (i = 1; i <= frame->min; i++)1627 for (i = 1; i <= min; i++) 1680 1628 { 1681 1629 if (frame->eptr >= md->end_subject || … … 1687 1635 1688 1636 case OP_NOT_WHITESPACE: 1689 for (i = 1; i <= frame->min; i++)1637 for (i = 1; i <= min; i++) 1690 1638 { 1691 1639 if (frame->eptr >= md->end_subject || … … 1697 1645 1698 1646 case OP_WHITESPACE: 1699 for (i = 1; i <= frame->min; i++)1647 for (i = 1; i <= min; i++) 1700 1648 { 1701 1649 if (frame->eptr >= md->end_subject || … … 1707 1655 1708 1656 case OP_NOT_WORDCHAR: 1709 for (i = 1; i <= frame->min; i++)1657 for (i = 1; i <= min; i++) 1710 1658 { 1711 1659 if (frame->eptr >= md->end_subject || … … 1717 1665 1718 1666 case OP_WORDCHAR: 1719 for (i = 1; i <= frame->min; i++)1667 for (i = 1; i <= min; i++) 1720 1668 { 1721 1669 if (frame->eptr >= md->end_subject || … … 1733 1681 /* If min = max, continue at the same level without recursing */ 1734 1682 1735 if ( frame->min == frame->max) continue;1683 if (min == frame->max) continue; 1736 1684 1737 1685 /* If minimizing, we have to test the rest of the pattern before each 1738 subsequent match. Again, separate the UTF-8 case for speed, and also 1739 separate the UCP cases. */ 1740 1741 if (frame->minimize) 1742 { 1743 { 1744 for (frame->fi = frame->min;; frame->fi++) 1745 { 1746 RMATCH(48, rrc, frame->ecode, frame->eptrb, 0); 1686 subsequent match. */ 1687 1688 if (minimize) 1689 { 1690 { 1691 for (frame->fi = min;; frame->fi++) 1692 { 1693 RMATCH(48, frame->ecode, frame->eptrb, 0); 1747 1694 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1748 1695 if (frame->fi >= frame->max || frame->eptr >= md->end_subject) RRETURN(MATCH_NOMATCH); … … 1794 1741 1795 1742 /* If maximizing it is worth using inline code for speed, doing the type 1796 test once at the start (i.e. keep it out of the loop). Again, keep the 1797 UTF-8 and UCP stuff separate. */ 1743 test once at the start (i.e. keep it out of the loop). */ 1798 1744 1799 1745 else … … 1813 1759 { 1814 1760 { 1815 for (i = frame->min; i < frame->max; i++)1761 for (i = min; i < frame->max; i++) 1816 1762 { 1817 1763 if (frame->eptr >= md->end_subject || IS_NEWLINE(*frame->eptr)) break; … … 1827 1773 { 1828 1774 { 1829 for (i = frame->min; i < frame->max; i++)1775 for (i = min; i < frame->max; i++) 1830 1776 { 1831 1777 if (frame->eptr >= md->end_subject || IS_NEWLINE(*frame->eptr)) break; … … 1838 1784 1839 1785 case OP_NOT_DIGIT: 1840 for (i = frame->min; i < frame->max; i++)1786 for (i = min; i < frame->max; i++) 1841 1787 { 1842 1788 int len = 1; … … 1849 1795 1850 1796 case OP_DIGIT: 1851 for (i = frame->min; i < frame->max; i++)1797 for (i = min; i < frame->max; i++) 1852 1798 { 1853 1799 int len = 1; … … 1860 1806 1861 1807 case OP_NOT_WHITESPACE: 1862 for (i = frame->min; i < frame->max; i++)1808 for (i = min; i < frame->max; i++) 1863 1809 { 1864 1810 int len = 1; … … 1871 1817 1872 1818 case OP_WHITESPACE: 1873 for (i = frame->min; i < frame->max; i++)1819 for (i = min; i < frame->max; i++) 1874 1820 { 1875 1821 int len = 1; … … 1882 1828 1883 1829 case OP_NOT_WORDCHAR: 1884 for (i = frame->min; i < frame->max; i++)1830 for (i = min; i < frame->max; i++) 1885 1831 { 1886 1832 int len = 1; … … 1893 1839 1894 1840 case OP_WORDCHAR: 1895 for (i = frame->min; i < frame->max; i++)1841 for (i = min; i < frame->max; i++) 1896 1842 { 1897 1843 int len = 1; … … 1911 1857 for(;;) 1912 1858 { 1913 RMATCH(52, rrc,frame->ecode, frame->eptrb, 0);1859 RMATCH(52, frame->ecode, frame->eptrb, 0); 1914 1860 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1915 1861 if (frame->eptr-- == frame->pp) break; /* Stop if tried at original pos */ … … 1923 1869 } 1924 1870 /* Control never gets here */ 1871 1872 default: 1873 /* Opening capturing bracket. If there is space in the offset vector, save 1874 the current subject position in the working slot at the top of the vector. We 1875 mustn't change the current values of the data slot, because they may be set 1876 from a previous iteration of this group, and be referred to by a reference 1877 inside the group. 1878 1879 If the bracket fails to match, we need to restore this value and also the 1880 values of the final offsets, in case they were set by a previous iteration of 1881 the same bracket. 1882 1883 If there isn't enough space in the offset vector, treat this as if it were a 1884 non-capturing bracket. Don't worry about setting the flag for the error case 1885 here; that is handled in the code for KET. */ 1886 1887 if (*frame->ecode > OP_BRA) 1888 { 1889 frame->number = *frame->ecode - OP_BRA; 1890 1891 /* For extended extraction brackets (large number), we have to fish out the 1892 number from a dummy opcode at the start. */ 1893 1894 if (frame->number > EXTRACT_BASIC_MAX) 1895 frame->number = GET2(frame->ecode, 2+LINK_SIZE); 1896 frame->offset = frame->number << 1; 1897 1898 #ifdef DEBUG 1899 printf("start bracket %d subject=", frame->number); 1900 pchars(frame->eptr, 16, TRUE, md); 1901 printf("\n"); 1902 #endif 1903 1904 if (frame->offset < md->offset_max) 1905 { 1906 frame->save_offset1 = md->offset_vector[frame->offset]; 1907 frame->save_offset2 = md->offset_vector[frame->offset+1]; 1908 frame->save_offset3 = md->offset_vector[md->offset_end - frame->number]; 1909 1910 DPRINTF(("saving %d %d %d\n", frame->save_offset1, frame->save_offset2, frame->save_offset3)); 1911 md->offset_vector[md->offset_end - frame->number] = frame->eptr - md->start_subject; 1912 1913 do 1914 { 1915 RMATCH(1, frame->ecode + 1 + LINK_SIZE, frame->eptrb, match_isgroup); 1916 if (rrc != MATCH_NOMATCH) RRETURN(rrc); 1917 frame->ecode += GET(frame->ecode, 1); 1918 } 1919 while (*frame->ecode == OP_ALT); 1920 1921 DPRINTF(("bracket %d failed\n", frame->number)); 1922 1923 md->offset_vector[frame->offset] = frame->save_offset1; 1924 md->offset_vector[frame->offset+1] = frame->save_offset2; 1925 md->offset_vector[md->offset_end - frame->number] = frame->save_offset3; 1926 1927 RRETURN(MATCH_NOMATCH); 1928 } 1929 1930 /* Insufficient room for saving captured contents */ 1931 1932 goto NON_CAPTURING_BRACKET; 1933 } 1925 1934 1926 1935 /* There's been some horrible disaster. Since all codes > OP_BRA are … … 1929 1938 in the code above or the OP_xxx definitions. */ 1930 1939 1931 default:1932 1940 DPRINTF(("Unknown opcode %d\n", *frame->ecode)); 1933 1941 RRETURN(JS_REGEXP_ERROR_INTERNAL);
Note:
See TracChangeset
for help on using the changeset viewer.