~legolas/ubuntu/natty/php5/5.3.5

« back to all changes in this revision

Viewing changes to ext/pcre/pcrelib/pcre_study.c

  • Committer: Stas Verberkt
  • Date: 2011-02-01 09:27:15 UTC
  • Revision ID: legolas@legolasweb.nl-20110201092715-yq052iu2yl4i2eyg
Inserted PHP 5.3.5.

Show diffs side-by-side

added added

removed removed

Lines of Context:
46
46
 
47
47
#include "pcre_internal.h"
48
48
 
 
49
#define SET_BIT(c) start_bits[c/8] |= (1 << (c&7))
49
50
 
50
51
/* Returns from set_start_bits() */
51
52
 
411
412
#endif
412
413
    break;
413
414
 
 
415
    /* Skip these, but we need to add in the name length. */
 
416
 
 
417
    case OP_MARK:
 
418
    case OP_PRUNE_ARG:
 
419
    case OP_SKIP_ARG:
 
420
    case OP_THEN_ARG:
 
421
    cc += _pcre_OP_lengths[op] + cc[1];
 
422
    break;
 
423
 
414
424
    /* For the record, these are the opcodes that are matched by "default":
415
425
    OP_ACCEPT, OP_CLOSE, OP_COMMIT, OP_FAIL, OP_PRUNE, OP_SET_SOM, OP_SKIP,
416
426
    OP_THEN. */
429
439
*      Set a bit and maybe its alternate case    *
430
440
*************************************************/
431
441
 
432
 
/* Given a character, set its bit in the table, and also the bit for the other
433
 
version of a letter if we are caseless.
 
442
/* Given a character, set its first byte's bit in the table, and also the
 
443
corresponding bit for the other version of a letter if we are caseless. In
 
444
UTF-8 mode, for characters greater than 127, we can only do the caseless thing
 
445
when Unicode property support is available.
434
446
 
435
447
Arguments:
436
448
  start_bits    points to the bit map
437
 
  c             is the character
 
449
  p             points to the character
438
450
  caseless      the caseless flag
439
451
  cd            the block with char table pointers
440
 
 
441
 
Returns:        nothing
442
 
*/
443
 
 
444
 
static void
445
 
set_table_bit(uschar *start_bits, unsigned int c, BOOL caseless,
446
 
  compile_data *cd)
447
 
{
448
 
start_bits[c/8] |= (1 << (c&7));
449
 
if (caseless && (cd->ctypes[c] & ctype_letter) != 0)
450
 
  start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7));
 
452
  utf8          TRUE for UTF-8 mode
 
453
 
 
454
Returns:        pointer after the character
 
455
*/
 
456
 
 
457
static const uschar *
 
458
set_table_bit(uschar *start_bits, const uschar *p, BOOL caseless,
 
459
  compile_data *cd, BOOL utf8)
 
460
{
 
461
unsigned int c = *p;
 
462
 
 
463
SET_BIT(c);
 
464
 
 
465
#ifdef SUPPORT_UTF8
 
466
if (utf8 && c > 127)
 
467
  {
 
468
  GETCHARINC(c, p);
 
469
#ifdef SUPPORT_UCP
 
470
  if (caseless)
 
471
    {
 
472
    uschar buff[8];
 
473
    c = UCD_OTHERCASE(c);
 
474
    (void)_pcre_ord2utf8(c, buff);
 
475
    SET_BIT(buff[0]);
 
476
    }
 
477
#endif
 
478
  return p;
 
479
  }
 
480
#endif
 
481
 
 
482
/* Not UTF-8 mode, or character is less than 127. */
 
483
 
 
484
if (caseless && (cd->ctypes[c] & ctype_letter) != 0) SET_BIT(cd->fcc[c]);
 
485
return p + 1;
 
486
}
 
487
 
 
488
 
 
489
 
 
490
/*************************************************
 
491
*     Set bits for a positive character type     *
 
492
*************************************************/
 
493
 
 
494
/* This function sets starting bits for a character type. In UTF-8 mode, we can
 
495
only do a direct setting for bytes less than 128, as otherwise there can be
 
496
confusion with bytes in the middle of UTF-8 characters. In a "traditional"
 
497
environment, the tables will only recognize ASCII characters anyway, but in at
 
498
least one Windows environment, some higher bytes bits were set in the tables.
 
499
So we deal with that case by considering the UTF-8 encoding.
 
500
 
 
501
Arguments:
 
502
  start_bits     the starting bitmap
 
503
  cbit type      the type of character wanted
 
504
  table_limit    32 for non-UTF-8; 16 for UTF-8
 
505
  cd             the block with char table pointers
 
506
 
 
507
Returns:         nothing
 
508
*/
 
509
 
 
510
static void
 
511
set_type_bits(uschar *start_bits, int cbit_type, int table_limit,
 
512
  compile_data *cd)
 
513
{
 
514
register int c;
 
515
for (c = 0; c < table_limit; c++) start_bits[c] |= cd->cbits[c+cbit_type];
 
516
if (table_limit == 32) return;
 
517
for (c = 128; c < 256; c++)
 
518
  {
 
519
  if ((cd->cbits[c/8] & (1 << (c&7))) != 0)
 
520
    {
 
521
    uschar buff[8];
 
522
    (void)_pcre_ord2utf8(c, buff);
 
523
    SET_BIT(buff[0]);
 
524
    }
 
525
  }
 
526
}
 
527
 
 
528
 
 
529
/*************************************************
 
530
*     Set bits for a negative character type     *
 
531
*************************************************/
 
532
 
 
533
/* This function sets starting bits for a negative character type such as \D.
 
534
In UTF-8 mode, we can only do a direct setting for bytes less than 128, as
 
535
otherwise there can be confusion with bytes in the middle of UTF-8 characters.
 
536
Unlike in the positive case, where we can set appropriate starting bits for
 
537
specific high-valued UTF-8 characters, in this case we have to set the bits for
 
538
all high-valued characters. The lowest is 0xc2, but we overkill by starting at
 
539
0xc0 (192) for simplicity.
 
540
 
 
541
Arguments:
 
542
  start_bits     the starting bitmap
 
543
  cbit type      the type of character wanted
 
544
  table_limit    32 for non-UTF-8; 16 for UTF-8
 
545
  cd             the block with char table pointers
 
546
 
 
547
Returns:         nothing
 
548
*/
 
549
 
 
550
static void
 
551
set_nottype_bits(uschar *start_bits, int cbit_type, int table_limit,
 
552
  compile_data *cd)
 
553
{
 
554
register int c;
 
555
for (c = 0; c < table_limit; c++) start_bits[c] |= ~cd->cbits[c+cbit_type];
 
556
if (table_limit != 32) for (c = 24; c < 32; c++) start_bits[c] = 0xff;
451
557
}
452
558
 
453
559
 
482
588
{
483
589
register int c;
484
590
int yield = SSB_DONE;
 
591
int table_limit = utf8? 16:32;
485
592
 
486
593
#if 0
487
594
/* ========================================================================= */
605
712
      case OP_QUERY:
606
713
      case OP_MINQUERY:
607
714
      case OP_POSQUERY:
608
 
      set_table_bit(start_bits, tcode[1], caseless, cd);
609
 
      tcode += 2;
610
 
#ifdef SUPPORT_UTF8
611
 
      if (utf8 && tcode[-1] >= 0xc0)
612
 
        tcode += _pcre_utf8_table4[tcode[-1] & 0x3f];
613
 
#endif
 
715
      tcode = set_table_bit(start_bits, tcode + 1, caseless, cd, utf8);
614
716
      break;
615
717
 
616
718
      /* Single-char upto sets the bit and tries the next */
618
720
      case OP_UPTO:
619
721
      case OP_MINUPTO:
620
722
      case OP_POSUPTO:
621
 
      set_table_bit(start_bits, tcode[3], caseless, cd);
622
 
      tcode += 4;
623
 
#ifdef SUPPORT_UTF8
624
 
      if (utf8 && tcode[-1] >= 0xc0)
625
 
        tcode += _pcre_utf8_table4[tcode[-1] & 0x3f];
626
 
#endif
 
723
      tcode = set_table_bit(start_bits, tcode + 3, caseless, cd, utf8);
627
724
      break;
628
725
 
629
726
      /* At least one single char sets the bit and stops */
636
733
      case OP_PLUS:
637
734
      case OP_MINPLUS:
638
735
      case OP_POSPLUS:
639
 
      set_table_bit(start_bits, tcode[1], caseless, cd);
640
 
      try_next = FALSE;
641
 
      break;
642
 
 
643
 
      /* Single character type sets the bits and stops */
 
736
      (void)set_table_bit(start_bits, tcode + 1, caseless, cd, utf8);
 
737
      try_next = FALSE;
 
738
      break;
 
739
 
 
740
      /* Special spacing and line-terminating items. These recognize specific
 
741
      lists of characters. The difference between VSPACE and ANYNL is that the
 
742
      latter can match the two-character CRLF sequence, but that is not
 
743
      relevant for finding the first character, so their code here is
 
744
      identical. */
 
745
 
 
746
      case OP_HSPACE:
 
747
      SET_BIT(0x09);
 
748
      SET_BIT(0x20);
 
749
      if (utf8)
 
750
        {
 
751
        SET_BIT(0xC2);  /* For U+00A0 */
 
752
        SET_BIT(0xE1);  /* For U+1680, U+180E */
 
753
        SET_BIT(0xE2);  /* For U+2000 - U+200A, U+202F, U+205F */
 
754
        SET_BIT(0xE3);  /* For U+3000 */
 
755
        }
 
756
      else SET_BIT(0xA0);
 
757
      try_next = FALSE;
 
758
      break;
 
759
 
 
760
      case OP_ANYNL:
 
761
      case OP_VSPACE:
 
762
      SET_BIT(0x0A);
 
763
      SET_BIT(0x0B);
 
764
      SET_BIT(0x0C);
 
765
      SET_BIT(0x0D);
 
766
      if (utf8)
 
767
        {
 
768
        SET_BIT(0xC2);  /* For U+0085 */
 
769
        SET_BIT(0xE2);  /* For U+2028, U+2029 */
 
770
        }
 
771
      else SET_BIT(0x85);
 
772
      try_next = FALSE;
 
773
      break;
 
774
 
 
775
      /* Single character types set the bits and stop. Note that if PCRE_UCP
 
776
      is set, we do not see these op codes because \d etc are converted to
 
777
      properties. Therefore, these apply in the case when only characters less
 
778
      than 256 are recognized to match the types. */
644
779
 
645
780
      case OP_NOT_DIGIT:
646
 
      for (c = 0; c < 32; c++)
647
 
        start_bits[c] |= ~cd->cbits[c+cbit_digit];
 
781
      set_nottype_bits(start_bits, cbit_digit, table_limit, cd);
648
782
      try_next = FALSE;
649
783
      break;
650
784
 
651
785
      case OP_DIGIT:
652
 
      for (c = 0; c < 32; c++)
653
 
        start_bits[c] |= cd->cbits[c+cbit_digit];
 
786
      set_type_bits(start_bits, cbit_digit, table_limit, cd);
654
787
      try_next = FALSE;
655
788
      break;
656
789
 
657
790
      /* The cbit_space table has vertical tab as whitespace; we have to
658
 
      discard it. */
 
791
      ensure it is set as not whitespace. */
659
792
 
660
793
      case OP_NOT_WHITESPACE:
661
 
      for (c = 0; c < 32; c++)
662
 
        {
663
 
        int d = cd->cbits[c+cbit_space];
664
 
        if (c == 1) d &= ~0x08;
665
 
        start_bits[c] |= ~d;
666
 
        }
 
794
      set_nottype_bits(start_bits, cbit_space, table_limit, cd);
 
795
      start_bits[1] |= 0x08;
667
796
      try_next = FALSE;
668
797
      break;
669
798
 
670
799
      /* The cbit_space table has vertical tab as whitespace; we have to
671
 
      discard it. */
 
800
      not set it from the table. */
672
801
 
673
802
      case OP_WHITESPACE:
674
 
      for (c = 0; c < 32; c++)
675
 
        {
676
 
        int d = cd->cbits[c+cbit_space];
677
 
        if (c == 1) d &= ~0x08;
678
 
        start_bits[c] |= d;
679
 
        }
 
803
      c = start_bits[1];    /* Save in case it was already set */
 
804
      set_type_bits(start_bits, cbit_space, table_limit, cd);
 
805
      start_bits[1] = (start_bits[1] & ~0x08) | c;
680
806
      try_next = FALSE;
681
807
      break;
682
808
 
683
809
      case OP_NOT_WORDCHAR:
684
 
      for (c = 0; c < 32; c++)
685
 
        start_bits[c] |= ~cd->cbits[c+cbit_word];
 
810
      set_nottype_bits(start_bits, cbit_word, table_limit, cd);
686
811
      try_next = FALSE;
687
812
      break;
688
813
 
689
814
      case OP_WORDCHAR:
690
 
      for (c = 0; c < 32; c++)
691
 
        start_bits[c] |= cd->cbits[c+cbit_word];
 
815
      set_type_bits(start_bits, cbit_word, table_limit, cd);
692
816
      try_next = FALSE;
693
817
      break;
694
818
 
697
821
 
698
822
      case OP_TYPEPLUS:
699
823
      case OP_TYPEMINPLUS:
 
824
      case OP_TYPEPOSPLUS:
700
825
      tcode++;
701
826
      break;
702
827
 
720
845
      case OP_TYPEPOSQUERY:
721
846
      switch(tcode[1])
722
847
        {
 
848
        default:
723
849
        case OP_ANY:
724
850
        case OP_ALLANY:
725
851
        return SSB_FAIL;
726
852
 
 
853
        case OP_HSPACE:
 
854
        SET_BIT(0x09);
 
855
        SET_BIT(0x20);
 
856
        if (utf8)
 
857
          {
 
858
          SET_BIT(0xC2);  /* For U+00A0 */
 
859
          SET_BIT(0xE1);  /* For U+1680, U+180E */
 
860
          SET_BIT(0xE2);  /* For U+2000 - U+200A, U+202F, U+205F */
 
861
          SET_BIT(0xE3);  /* For U+3000 */
 
862
          }
 
863
        else SET_BIT(0xA0);
 
864
        break;
 
865
 
 
866
        case OP_ANYNL:
 
867
        case OP_VSPACE:
 
868
        SET_BIT(0x0A);
 
869
        SET_BIT(0x0B);
 
870
        SET_BIT(0x0C);
 
871
        SET_BIT(0x0D);
 
872
        if (utf8)
 
873
          {
 
874
          SET_BIT(0xC2);  /* For U+0085 */
 
875
          SET_BIT(0xE2);  /* For U+2028, U+2029 */
 
876
          }
 
877
        else SET_BIT(0x85);
 
878
        break;
 
879
 
727
880
        case OP_NOT_DIGIT:
728
 
        for (c = 0; c < 32; c++)
729
 
          start_bits[c] |= ~cd->cbits[c+cbit_digit];
 
881
        set_nottype_bits(start_bits, cbit_digit, table_limit, cd);
730
882
        break;
731
883
 
732
884
        case OP_DIGIT:
733
 
        for (c = 0; c < 32; c++)
734
 
          start_bits[c] |= cd->cbits[c+cbit_digit];
 
885
        set_type_bits(start_bits, cbit_digit, table_limit, cd);
735
886
        break;
736
887
 
737
888
        /* The cbit_space table has vertical tab as whitespace; we have to
738
 
        discard it. */
 
889
        ensure it gets set as not whitespace. */
739
890
 
740
891
        case OP_NOT_WHITESPACE:
741
 
        for (c = 0; c < 32; c++)
742
 
          {
743
 
          int d = cd->cbits[c+cbit_space];
744
 
          if (c == 1) d &= ~0x08;
745
 
          start_bits[c] |= ~d;
746
 
          }
 
892
        set_nottype_bits(start_bits, cbit_space, table_limit, cd);
 
893
        start_bits[1] |= 0x08;
747
894
        break;
748
895
 
749
896
        /* The cbit_space table has vertical tab as whitespace; we have to
750
 
        discard it. */
 
897
        avoid setting it. */
751
898
 
752
899
        case OP_WHITESPACE:
753
 
        for (c = 0; c < 32; c++)
754
 
          {
755
 
          int d = cd->cbits[c+cbit_space];
756
 
          if (c == 1) d &= ~0x08;
757
 
          start_bits[c] |= d;
758
 
          }
 
900
        c = start_bits[1];    /* Save in case it was already set */
 
901
        set_type_bits(start_bits, cbit_space, table_limit, cd);
 
902
        start_bits[1] = (start_bits[1] & ~0x08) | c;
759
903
        break;
760
904
 
761
905
        case OP_NOT_WORDCHAR:
762
 
        for (c = 0; c < 32; c++)
763
 
          start_bits[c] |= ~cd->cbits[c+cbit_word];
 
906
        set_nottype_bits(start_bits, cbit_word, table_limit, cd);
764
907
        break;
765
908
 
766
909
        case OP_WORDCHAR:
767
 
        for (c = 0; c < 32; c++)
768
 
          start_bits[c] |= cd->cbits[c+cbit_word];
 
910
        set_type_bits(start_bits, cbit_word, table_limit, cd);
769
911
        break;
770
912
        }
771
913