| 440 | } |
| 441 | |
| 442 | const char *RESearch::Compile(const char *pattern, int length, bool caseSensitive, bool posix) { |
| 443 | char *mp=nfa; /* nfa pointer */ |
| 444 | char *lp; /* saved pointer */ |
| 445 | char *sp=nfa; /* another one */ |
| 446 | char *mpMax = mp + MAXNFA - BITBLK - 10; |
| 447 | |
| 448 | int tagi = 0; /* tag stack index */ |
| 449 | int tagc = 1; /* actual tag count */ |
| 450 | |
| 451 | int n; |
| 452 | char mask; /* xor mask -CCL/NCL */ |
| 453 | int c1, c2, prevChar; |
| 454 | |
| 455 | if (!pattern || !length) { |
| 456 | if (sta) |
| 457 | return 0; |
| 458 | else |
| 459 | return badpat("No previous regular expression"); |
| 460 | } |
| 461 | sta = NOP; |
| 462 | |
| 463 | const char *p=pattern; /* pattern pointer */ |
| 464 | for (int i=0; i<length; i++, p++) { |
| 465 | if (mp > mpMax) |
| 466 | return badpat("Pattern too long"); |
| 467 | lp = mp; |
| 468 | switch (*p) { |
| 469 | |
| 470 | case '.': /* match any char */ |
| 471 | *mp++ = ANY; |
| 472 | break; |
| 473 | |
| 474 | case '^': /* match beginning */ |
| 475 | if (p == pattern) |
| 476 | *mp++ = BOL; |
| 477 | else { |
| 478 | *mp++ = CHR; |
| 479 | *mp++ = *p; |
| 480 | } |
| 481 | break; |
| 482 | |
| 483 | case '$': /* match endofline */ |
| 484 | if (!*(p+1)) |
| 485 | *mp++ = EOL; |
| 486 | else { |
| 487 | *mp++ = CHR; |
| 488 | *mp++ = *p; |
| 489 | } |
| 490 | break; |
| 491 | |
| 492 | case '[': /* match char class */ |
| 493 | *mp++ = CCL; |
| 494 | prevChar = 0; |
| 495 | |
| 496 | i++; |
| 497 | if (*++p == '^') { |
| 498 | mask = '\377'; |
| 499 | i++; |