summaryrefslogtreecommitdiff
path: root/noncore/apps/tinykate/libkate/qt3back/qregexp3.cpp
Unidiff
Diffstat (limited to 'noncore/apps/tinykate/libkate/qt3back/qregexp3.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/apps/tinykate/libkate/qt3back/qregexp3.cpp2282
1 files changed, 1144 insertions, 1138 deletions
diff --git a/noncore/apps/tinykate/libkate/qt3back/qregexp3.cpp b/noncore/apps/tinykate/libkate/qt3back/qregexp3.cpp
index a2c680f..78635b2 100644
--- a/noncore/apps/tinykate/libkate/qt3back/qregexp3.cpp
+++ b/noncore/apps/tinykate/libkate/qt3back/qregexp3.cpp
@@ -40,7 +40,2 @@
40 40
41#include "qarray.h"
42#include "qbitarray.h"
43#include "qcache.h"
44#include "qintdict.h"
45#include "qmap.h"
46#if QT_VERSION < 300 41#if QT_VERSION < 300
@@ -50,6 +45,17 @@
50#endif 45#endif
51#include "qstring.h"
52#include "qtl.h"
53#include "qvector.h"
54 46
47/* OPIE */
48#include <opie2/odebug.h>
49
50/* QT */
51#include <qarray.h>
52#include <qbitarray.h>
53#include <qcache.h>
54#include <qintdict.h>
55#include <qmap.h>
56#include <qstring.h>
57#include <qtl.h>
58#include <qvector.h>
59
60/* STD */
55#include <limits.h> 61#include <limits.h>
@@ -517,6 +523,6 @@
517 \code 523 \code
518 QRegExp rx( "^\\d\\d?$" );// Match integers 0 to 99 524 QRegExp rx( "^\\d\\d?$" ); // Match integers 0 to 99
519 rx.search( "123" ); // Returns -1 (no match) 525 rx.search( "123" ); // Returns -1 (no match)
520 rx.search( "-6" ); // Returns -1 (no match) 526 rx.search( "-6" ); // Returns -1 (no match)
521 rx.search( "6" ); // Returns 0 (matched as position 0) 527 rx.search( "6" ); // Returns 0 (matched as position 0)
522 \endcode 528 \endcode
@@ -527,5 +533,5 @@
527 \code 533 \code
528 QRegExp rx( "^\\S+$" );// Match strings which have no whitespace 534 QRegExp rx( "^\\S+$" ); // Match strings which have no whitespace
529 rx.search( "Hello world" );// Returns -1 (no match) 535 rx.search( "Hello world" ); // Returns -1 (no match)
530 rx.search( "This_is-OK" );// Returns 0 (matched at position 0) 536 rx.search( "This_is-OK" ); // Returns 0 (matched at position 0)
531 \endcode 537 \endcode
@@ -542,3 +548,3 @@
542 QRegExp rx( "\\b(mail|letter|correspondence)\\b" ); 548 QRegExp rx( "\\b(mail|letter|correspondence)\\b" );
543 rx.search( "I sent you an email" ); // Returns -1 (no match) 549 rx.search( "I sent you an email" ); // Returns -1 (no match)
544 rx.search( "Please write the letter" ); // Returns 17 (matched at position 17) 550 rx.search( "Please write the letter" ); // Returns 17 (matched at position 17)
@@ -560,3 +566,3 @@
560 \code 566 \code
561 QRegExp rx( "&(?!amp;)" ); // Match ampersands but not &amp; 567 QRegExp rx( "&(?!amp;)" ); // Match ampersands but not &amp;
562 QString line1 = "This & that"; 568 QString line1 = "This & that";
@@ -574,3 +580,3 @@
574 QString str = "One Eric another Eirik, and an Ericsson. How many Eiriks, Eric?"; 580 QString str = "One Eric another Eirik, and an Ericsson. How many Eiriks, Eric?";
575 QRegExp rx( "\\b(Eric|Eirik)\\b" );// Match Eric or Eirik 581 QRegExp rx( "\\b(Eric|Eirik)\\b" ); // Match Eric or Eirik
576 int pos = 0; // Where we are in the string 582 int pos = 0; // Where we are in the string
@@ -578,7 +584,7 @@
578 while ( pos >= 0 ) { 584 while ( pos >= 0 ) {
579 pos = rx.search( str, pos ); 585 pos = rx.search( str, pos );
580 if ( pos >= 0 ) { 586 if ( pos >= 0 ) {
581 pos++;// Move along in str 587 pos++; // Move along in str
582 count++;// Count our Eric or Eirik 588 count++; // Count our Eric or Eirik
583 } 589 }
584 } 590 }
@@ -603,5 +609,5 @@
603 if ( rx.search( str ) != -1 ) { 609 if ( rx.search( str ) != -1 ) {
604 company = rx.cap( 1 ); 610 company = rx.cap( 1 );
605 web= rx.cap( 2 ); 611 web = rx.cap( 2 );
606 country = rx.cap( 3 ); 612 country = rx.cap( 3 );
607 } 613 }
@@ -626,7 +632,7 @@
626 \code 632 \code
627 QRegExp rx( "*.html" );// Invalid regexp: * doesn't quantify anything 633 QRegExp rx( "*.html" ); // Invalid regexp: * doesn't quantify anything
628 rx.setWildcard( TRUE );// Now its a valid wildcard regexp 634 rx.setWildcard( TRUE ); // Now its a valid wildcard regexp
629 rx.search( "index.html" );// Returns 0 (matched at position 0) 635 rx.search( "index.html" ); // Returns 0 (matched at position 0)
630 rx.search( "default.htm" );// Returns -1 (no match) 636 rx.search( "default.htm" ); // Returns -1 (no match)
631 rx.search( "readme.txt" );// Returns -1 (no match) 637 rx.search( "readme.txt" ); // Returns -1 (no match)
632 \endcode 638 \endcode
@@ -678,32 +684,32 @@ static void mergeInto( QArray<int> *a, const QArray<int>& b )
678 if ( asize == 0 ) { 684 if ( asize == 0 ) {
679 *a = b.copy(); 685 *a = b.copy();
680#ifndef QT_NO_REGEXP_OPTIM 686#ifndef QT_NO_REGEXP_OPTIM
681 } else if ( bsize == 1 && (*a)[asize - 1] < b[0] ) { 687 } else if ( bsize == 1 && (*a)[asize - 1] < b[0] ) {
682 a->resize( asize + 1 ); 688 a->resize( asize + 1 );
683 (*a)[asize] = b[0]; 689 (*a)[asize] = b[0];
684#endif 690#endif
685 } else if ( bsize >= 1 ) { 691 } else if ( bsize >= 1 ) {
686 int csize = asize + bsize; 692 int csize = asize + bsize;
687 QArray<int> c( csize ); 693 QArray<int> c( csize );
688 int i = 0, j = 0, k = 0; 694 int i = 0, j = 0, k = 0;
689 while ( i < asize ) { 695 while ( i < asize ) {
690 if ( j < bsize ) { 696 if ( j < bsize ) {
691 if ( (*a)[i] == b[j] ) { 697 if ( (*a)[i] == b[j] ) {
692 i++; 698 i++;
693 csize--; 699 csize--;
694 } else if ( (*a)[i] < b[j] ) { 700 } else if ( (*a)[i] < b[j] ) {
695 c[k++] = (*a)[i++]; 701 c[k++] = (*a)[i++];
696 } else { 702 } else {
697 c[k++] = b[j++]; 703 c[k++] = b[j++];
698 } 704 }
699 } else { 705 } else {
700 memcpy( c.data() + k, (*a).data() + i, 706 memcpy( c.data() + k, (*a).data() + i,
701 (asize - i) * sizeof(int) ); 707 (asize - i) * sizeof(int) );
702 break; 708 break;
703 } 709 }
704 } 710 }
705 c.resize( csize ); 711 c.resize( csize );
706 if ( j < bsize ) 712 if ( j < bsize )
707 memcpy( c.data() + k, b.data() + j, (bsize - j) * sizeof(int) ); 713 memcpy( c.data() + k, b.data() + j, (bsize - j) * sizeof(int) );
708 *a = c; 714 *a = c;
709 } 715 }
@@ -719,3 +725,3 @@ static void mergeInto( QMap<int, int> *a, const QMap<int, int>& b )
719 for ( it = b.begin(); it != b.end(); ++it ) 725 for ( it = b.begin(); it != b.end(); ++it )
720 a->insert( it.key(), *it ); 726 a->insert( it.key(), *it );
721} 727}
@@ -730,5 +736,5 @@ static int at( const QMap<int, int>& m, int k )
730 if ( it == m.end() ) 736 if ( it == m.end() )
731 return 0; 737 return 0;
732 else 738 else
733 return *it; 739 return *it;
734} 740}
@@ -746,40 +752,40 @@ static QString wc2rx( const QString& wc )
746 while ( i < wclen ) { 752 while ( i < wclen ) {
747 QChar c = wc[i++]; 753 QChar c = wc[i++];
748 switch ( c.unicode() ) { 754 switch ( c.unicode() ) {
749 case '*': 755 case '*':
750 rx += QString::fromLatin1( ".*" ); 756 rx += QString::fromLatin1( ".*" );
751 break; 757 break;
752 case '?': 758 case '?':
753 rx += QChar( '.' ); 759 rx += QChar( '.' );
754 break; 760 break;
755 case '$': 761 case '$':
756 case '(': 762 case '(':
757 case ')': 763 case ')':
758 case '+': 764 case '+':
759 case '.': 765 case '.':
760 case '\\': 766 case '\\':
761 case '^': 767 case '^':
762 case '{': 768 case '{':
763 case '|': 769 case '|':
764 case '}': 770 case '}':
765 rx += QChar( '\\' ); 771 rx += QChar( '\\' );
766 rx += c; 772 rx += c;
767 break; 773 break;
768 case '[': 774 case '[':
769 rx += c; 775 rx += c;
770 if ( wc[i] == QChar('^') ) 776 if ( wc[i] == QChar('^') )
771 rx += wc[i++]; 777 rx += wc[i++];
772 if ( i < wclen ) { 778 if ( i < wclen ) {
773 if ( rx[i] == ']' ) 779 if ( rx[i] == ']' )
774 rx += wc[i++]; 780 rx += wc[i++];
775 while ( i < wclen && wc[i] != QChar(']') ) { 781 while ( i < wclen && wc[i] != QChar(']') ) {
776 if ( wc[i] == '\\' ) 782 if ( wc[i] == '\\' )
777 rx += QChar( '\\' ); 783 rx += QChar( '\\' );
778 rx += wc[i++]; 784 rx += wc[i++];
779 } 785 }
780 } 786 }
781 break; 787 break;
782 default: 788 default:
783 rx += c; 789 rx += c;
784 } 790 }
785 } 791 }
@@ -804,17 +810,17 @@ public:
804 public: 810 public:
805 CharClass(); 811 CharClass();
806 CharClass( const CharClass& cc ) { operator=( cc ); } 812 CharClass( const CharClass& cc ) { operator=( cc ); }
807 813
808 CharClass& operator=( const CharClass& cc ); 814 CharClass& operator=( const CharClass& cc );
809 815
810 void clear(); 816 void clear();
811 bool negative() const { return n; } 817 bool negative() const { return n; }
812 void setNegative( bool negative ); 818 void setNegative( bool negative );
813 void addCategories( int cats ); 819 void addCategories( int cats );
814 void addRange( ushort from, ushort to ); 820 void addRange( ushort from, ushort to );
815 void addSingleton( ushort ch ) { addRange( ch, ch ); } 821 void addSingleton( ushort ch ) { addRange( ch, ch ); }
816 822
817 bool in( QChar ch ) const; 823 bool in( QChar ch ) const;
818#ifndef QT_NO_REGEXP_OPTIM 824#ifndef QT_NO_REGEXP_OPTIM
819 const QArray<int>& firstOccurrence() const { return occ1; } 825 const QArray<int>& firstOccurrence() const { return occ1; }
820#endif 826#endif
@@ -822,3 +828,3 @@ public:
822#if defined(QT_DEBUG) 828#if defined(QT_DEBUG)
823 void dump() const; 829 void dump() const;
824#endif 830#endif
@@ -826,17 +832,17 @@ public:
826 private: 832 private:
827 /* 833 /*
828 The struct Range represents a range of characters (e.g., [0-9] denotes 834 The struct Range represents a range of characters (e.g., [0-9] denotes
829 range 48 to 57). 835 range 48 to 57).
830 */ 836 */
831 struct Range 837 struct Range
832 { 838 {
833 ushort from; // 48 839 ushort from; // 48
834 ushort to; // 57 840 ushort to; // 57
835 }; 841 };
836 842
837 int c; // character classes 843 int c; // character classes
838 QArray<Range> r; // character ranges 844 QArray<Range> r; // character ranges
839 bool n; // negative? 845 bool n; // negative?
840#ifndef QT_NO_REGEXP_OPTIM 846#ifndef QT_NO_REGEXP_OPTIM
841 QArray<int> occ1; // first-occurrence array 847 QArray<int> occ1; // first-occurrence array
842#endif 848#endif
@@ -846,8 +852,8 @@ public:
846 { 852 {
847 int x; // dummy 853 int x; // dummy
848 854
849#ifndef QT_NO_REGEXP_OPTIM 855#ifndef QT_NO_REGEXP_OPTIM
850 const QArray<int>& firstOccurrence() const { 856 const QArray<int>& firstOccurrence() const {
851 return *firstOccurrenceAtZero; 857 return *firstOccurrenceAtZero;
852 } 858 }
853#endif 859#endif
@@ -866,3 +872,3 @@ public:
866 QArray<int> match( const QString& str, int pos, bool minimal, 872 QArray<int> match( const QString& str, int pos, bool minimal,
867 bool oneTest ); 873 bool oneTest );
868 int matchedLength() const { return mmMatchedLen; } 874 int matchedLength() const { return mmMatchedLen; }
@@ -878,3 +884,3 @@ public:
878 void addPlusTransitions( const QArray<int>& from, const QArray<int>& to, 884 void addPlusTransitions( const QArray<int>& from, const QArray<int>& to,
879 int atom ); 885 int atom );
880#endif 886#endif
@@ -892,3 +898,3 @@ public:
892 void setupGoodStringHeuristic( int earlyStart, int lateStart, 898 void setupGoodStringHeuristic( int earlyStart, int lateStart,
893 const QString& str ); 899 const QString& str );
894 void setupBadCharHeuristic( int minLen, const QArray<int>& firstOcc ); 900 void setupBadCharHeuristic( int minLen, const QArray<int>& firstOcc );
@@ -912,17 +918,17 @@ private:
912#ifndef QT_NO_REGEXP_CAPTURE 918#ifndef QT_NO_REGEXP_CAPTURE
913 int atom; // which atom does this state belong to? 919 int atom; // which atom does this state belong to?
914#endif 920#endif
915 int match; // what does it match? (see CharClassBit and BackRefBit) 921 int match; // what does it match? (see CharClassBit and BackRefBit)
916 QArray<int> outs; // out-transitions 922 QArray<int> outs; // out-transitions
917 QMap<int, int> *reenter; // atoms reentered when transiting out 923 QMap<int, int> *reenter; // atoms reentered when transiting out
918 QMap<int, int> *anchors; // anchors met when transiting out 924 QMap<int, int> *anchors; // anchors met when transiting out
919 925
920#ifndef QT_NO_REGEXP_CAPTURE 926#ifndef QT_NO_REGEXP_CAPTURE
921 State( int a, int m ) 927 State( int a, int m )
922 : atom( a ), match( m ), reenter( 0 ), anchors( 0 ) { } 928 : atom( a ), match( m ), reenter( 0 ), anchors( 0 ) { }
923#else 929#else
924 State( int m ) 930 State( int m )
925 : match( m ), reenter( 0 ), anchors( 0 ) { } 931 : match( m ), reenter( 0 ), anchors( 0 ) { }
926#endif 932#endif
927 ~State() { delete reenter; delete anchors; } 933 ~State() { delete reenter; delete anchors; }
928 }; 934 };
@@ -936,8 +942,8 @@ private:
936 { 942 {
937 QRegExpEngine *eng; // NFA representing the embedded regular expression 943 QRegExpEngine *eng; // NFA representing the embedded regular expression
938 bool neg; // negative lookahead? 944 bool neg; // negative lookahead?
939 945
940 Lookahead( QRegExpEngine *eng0, bool neg0 ) 946 Lookahead( QRegExpEngine *eng0, bool neg0 )
941 : eng( eng0 ), neg( neg0 ) { } 947 : eng( eng0 ), neg( neg0 ) { }
942 ~Lookahead() { delete eng; } 948 ~Lookahead() { delete eng; }
943 }; 949 };
@@ -952,4 +958,4 @@ private:
952 { 958 {
953 int parent; // index of parent in array of atoms 959 int parent; // index of parent in array of atoms
954 int capture; // index of capture, from 1 to ncap 960 int capture; // index of capture, from 1 to ncap
955 }; 961 };
@@ -964,4 +970,4 @@ private:
964 { 970 {
965 int a; // this anchor... 971 int a; // this anchor...
966 int b; // ...or this one 972 int b; // ...or this one
967 }; 973 };
@@ -978,10 +984,10 @@ private:
978 enum { Anchor_Dollar = 0x00000001, Anchor_Caret = 0x00000002, 984 enum { Anchor_Dollar = 0x00000001, Anchor_Caret = 0x00000002,
979 Anchor_Word = 0x00000004, Anchor_NonWord = 0x00000008, 985 Anchor_Word = 0x00000004, Anchor_NonWord = 0x00000008,
980 Anchor_FirstLookahead = 0x00000010, 986 Anchor_FirstLookahead = 0x00000010,
981 Anchor_BackRef1Empty = Anchor_FirstLookahead << MaxLookaheads, 987 Anchor_BackRef1Empty = Anchor_FirstLookahead << MaxLookaheads,
982 Anchor_BackRef0Empty = Anchor_BackRef1Empty >> 1, 988 Anchor_BackRef0Empty = Anchor_BackRef1Empty >> 1,
983 Anchor_Alternation = Anchor_BackRef1Empty << MaxBackRefs, 989 Anchor_Alternation = Anchor_BackRef1Empty << MaxBackRefs,
984 990
985 Anchor_LookaheadMask = ( Anchor_FirstLookahead - 1 ) ^ 991 Anchor_LookaheadMask = ( Anchor_FirstLookahead - 1 ) ^
986 ( (Anchor_FirstLookahead << MaxLookaheads) - 1 ) }; 992 ( (Anchor_FirstLookahead << MaxLookaheads) - 1 ) };
987#ifndef QT_NO_REGEXP_CAPTURE 993#ifndef QT_NO_REGEXP_CAPTURE
@@ -997,3 +1003,3 @@ private:
997 bool isBetterCapture( const int *begin1, const int *end1, const int *begin2, 1003 bool isBetterCapture( const int *begin1, const int *end1, const int *begin2,
998 const int *end2 ); 1004 const int *end2 );
999#endif 1005#endif
@@ -1057,21 +1063,21 @@ private:
1057 public: 1063 public:
1058 Box( QRegExpEngine *engine ); 1064 Box( QRegExpEngine *engine );
1059 Box( const Box& b ) { operator=( b ); } 1065 Box( const Box& b ) { operator=( b ); }
1060 1066
1061 Box& operator=( const Box& b ); 1067 Box& operator=( const Box& b );
1062 1068
1063 void clear() { operator=(Box(eng)); } 1069 void clear() { operator=(Box(eng)); }
1064 void set( QChar ch ); 1070 void set( QChar ch );
1065 void set( const CharClass& cc ); 1071 void set( const CharClass& cc );
1066#ifndef QT_NO_REGEXP_BACKREF 1072#ifndef QT_NO_REGEXP_BACKREF
1067 void set( int bref ); 1073 void set( int bref );
1068#endif 1074#endif
1069 1075
1070 void cat( const Box& b ); 1076 void cat( const Box& b );
1071 void orx( const Box& b ); 1077 void orx( const Box& b );
1072 void plus( int atom ); 1078 void plus( int atom );
1073 void opt(); 1079 void opt();
1074 void catAnchor( int a ); 1080 void catAnchor( int a );
1075#ifndef QT_NO_REGEXP_OPTIM 1081#ifndef QT_NO_REGEXP_OPTIM
1076 void setupHeuristics(); 1082 void setupHeuristics();
1077#endif 1083#endif
@@ -1079,3 +1085,3 @@ private:
1079#if defined(QT_DEBUG) 1085#if defined(QT_DEBUG)
1080 void dump() const; 1086 void dump() const;
1081#endif 1087#endif
@@ -1083,23 +1089,23 @@ private:
1083 private: 1089 private:
1084 void addAnchorsToEngine( const Box& to ) const; 1090 void addAnchorsToEngine( const Box& to ) const;
1085 1091
1086 QRegExpEngine *eng; // the automaton under construction 1092 QRegExpEngine *eng; // the automaton under construction
1087 QArray<int> ls; // the left states (firstpos) 1093 QArray<int> ls; // the left states (firstpos)
1088 QArray<int> rs; // the right states (lastpos) 1094 QArray<int> rs; // the right states (lastpos)
1089 QMap<int, int> lanchors; // the left anchors 1095 QMap<int, int> lanchors; // the left anchors
1090 QMap<int, int> ranchors; // the right anchors 1096 QMap<int, int> ranchors; // the right anchors
1091 int skipanchors; // the anchors to match if the box is skipped 1097 int skipanchors; // the anchors to match if the box is skipped
1092 1098
1093#ifndef QT_NO_REGEXP_OPTIM 1099#ifndef QT_NO_REGEXP_OPTIM
1094 int earlyStart; // the index where str can first occur 1100 int earlyStart; // the index where str can first occur
1095 int lateStart; // the index where str can last occur 1101 int lateStart; // the index where str can last occur
1096 QString str; // a string that has to occur in any match 1102 QString str; // a string that has to occur in any match
1097 QString leftStr; // a string occurring at the left of this box 1103 QString leftStr; // a string occurring at the left of this box
1098 QString rightStr; // a string occurring at the right of this box 1104 QString rightStr; // a string occurring at the right of this box
1099 int maxl; // the maximum length of this box (possibly InftyLen) 1105 int maxl; // the maximum length of this box (possibly InftyLen)
1100#endif 1106#endif
1101 1107
1102 int minl; // the minimum length of this box 1108 int minl; // the minimum length of this box
1103#ifndef QT_NO_REGEXP_OPTIM 1109#ifndef QT_NO_REGEXP_OPTIM
1104 QArray<int> occ1; // first-occurrence array 1110 QArray<int> occ1; // first-occurrence array
1105#endif 1111#endif
@@ -1112,5 +1118,5 @@ private:
1112 enum { Tok_Eos, Tok_Dollar, Tok_LeftParen, Tok_MagicLeftParen, 1118 enum { Tok_Eos, Tok_Dollar, Tok_LeftParen, Tok_MagicLeftParen,
1113 Tok_PosLookahead, Tok_NegLookahead, Tok_RightParen, Tok_CharClass, 1119 Tok_PosLookahead, Tok_NegLookahead, Tok_RightParen, Tok_CharClass,
1114 Tok_Caret, Tok_Quantifier, Tok_Bar, Tok_Word, Tok_NonWord, 1120 Tok_Caret, Tok_Quantifier, Tok_Bar, Tok_Word, Tok_NonWord,
1115 Tok_Char = 0x10000, Tok_BackRef = 0x20000 }; 1121 Tok_Char = 0x10000, Tok_BackRef = 0x20000 };
1116 int getChar(); 1122 int getChar();
@@ -1191,6 +1197,6 @@ QRegExpEngine::~QRegExpEngine()
1191 if ( --engCount == 0 ) { 1197 if ( --engCount == 0 ) {
1192 delete noOccurrences; 1198 delete noOccurrences;
1193 noOccurrences = 0; 1199 noOccurrences = 0;
1194 delete firstOccurrenceAtZero; 1200 delete firstOccurrenceAtZero;
1195 firstOccurrenceAtZero = 0; 1201 firstOccurrenceAtZero = 0;
1196 } 1202 }
@@ -1204,3 +1210,3 @@ QRegExpEngine::~QRegExpEngine()
1204QArray<int> QRegExpEngine::match( const QString& str, int pos, bool minimal, 1210QArray<int> QRegExpEngine::match( const QString& str, int pos, bool minimal,
1205 bool oneTest ) 1211 bool oneTest )
1206{ 1212{
@@ -1209,3 +1215,3 @@ QArray<int> QRegExpEngine::match( const QString& str, int pos, bool minimal,
1209 if ( mmIn == 0 ) 1215 if ( mmIn == 0 )
1210 mmIn = &QChar::null; 1216 mmIn = &QChar::null;
1211 mmPos = pos; 1217 mmPos = pos;
@@ -1218,12 +1224,12 @@ QArray<int> QRegExpEngine::match( const QString& str, int pos, bool minimal,
1218#ifndef QT_NO_REGEXP_OPTIM 1224#ifndef QT_NO_REGEXP_OPTIM
1219 if ( mmPos <= mmLen - minl ) { 1225 if ( mmPos <= mmLen - minl ) {
1220 if ( caretAnchored || oneTest ) 1226 if ( caretAnchored || oneTest )
1221 matched = matchHere(); 1227 matched = matchHere();
1222 else if ( useGoodStringHeuristic ) 1228 else if ( useGoodStringHeuristic )
1223 matched = goodStringMatch(); 1229 matched = goodStringMatch();
1224 else 1230 else
1225 matched = badCharMatch(); 1231 matched = badCharMatch();
1226 } 1232 }
1227#else 1233#else
1228 matched = oneTest ? matchHere() : bruteMatch(); 1234 matched = oneTest ? matchHere() : bruteMatch();
1229#endif 1235#endif
@@ -1232,13 +1238,13 @@ QArray<int> QRegExpEngine::match( const QString& str, int pos, bool minimal,
1232 if ( matched ) { 1238 if ( matched ) {
1233 mmCaptured.detach(); 1239 mmCaptured.detach();
1234 mmCaptured[0] = mmPos; 1240 mmCaptured[0] = mmPos;
1235 mmCaptured[1] = mmMatchedLen; 1241 mmCaptured[1] = mmMatchedLen;
1236 for ( int j = 0; j < realncap; j++ ) { 1242 for ( int j = 0; j < realncap; j++ ) {
1237 int len = mmCapEnd[j] - mmCapBegin[j]; 1243 int len = mmCapEnd[j] - mmCapBegin[j];
1238 mmCaptured[2 + 2 * j] = len > 0 ? mmPos + mmCapBegin[j] : 0; 1244 mmCaptured[2 + 2 * j] = len > 0 ? mmPos + mmCapBegin[j] : 0;
1239 mmCaptured[2 + 2 * j + 1] = len; 1245 mmCaptured[2 + 2 * j + 1] = len;
1240 } 1246 }
1241 return mmCaptured; 1247 return mmCaptured;
1242 } else { 1248 } else {
1243 return mmCapturedNoMatch; 1249 return mmCapturedNoMatch;
1244 } 1250 }
@@ -1273,7 +1279,7 @@ int QRegExpEngine::createState( int bref )
1273 if ( bref > nbrefs ) { 1279 if ( bref > nbrefs ) {
1274 nbrefs = bref; 1280 nbrefs = bref;
1275 if ( nbrefs > MaxBackRefs ) { 1281 if ( nbrefs > MaxBackRefs ) {
1276 yyError = TRUE; 1282 yyError = TRUE;
1277 return 0; 1283 return 0;
1278 } 1284 }
1279 } 1285 }
@@ -1291,7 +1297,7 @@ int QRegExpEngine::createState( int bref )
1291void QRegExpEngine::addCatTransitions( const QArray<int>& from, 1297void QRegExpEngine::addCatTransitions( const QArray<int>& from,
1292 const QArray<int>& to ) 1298 const QArray<int>& to )
1293{ 1299{
1294 for ( int i = 0; i < (int) from.size(); i++ ) { 1300 for ( int i = 0; i < (int) from.size(); i++ ) {
1295 State *st = s[from[i]]; 1301 State *st = s[from[i]];
1296 mergeInto( &st->outs, to ); 1302 mergeInto( &st->outs, to );
1297 } 1303 }
@@ -1301,17 +1307,17 @@ void QRegExpEngine::addCatTransitions( const QArray<int>& from,
1301void QRegExpEngine::addPlusTransitions( const QArray<int>& from, 1307void QRegExpEngine::addPlusTransitions( const QArray<int>& from,
1302 const QArray<int>& to, int atom ) 1308 const QArray<int>& to, int atom )
1303{ 1309{
1304 for ( int i = 0; i < (int) from.size(); i++ ) { 1310 for ( int i = 0; i < (int) from.size(); i++ ) {
1305 State *st = s[from[i]]; 1311 State *st = s[from[i]];
1306 QArray<int> oldOuts = st->outs.copy(); 1312 QArray<int> oldOuts = st->outs.copy();
1307 mergeInto( &st->outs, to ); 1313 mergeInto( &st->outs, to );
1308 if ( f[atom].capture >= 0 ) { 1314 if ( f[atom].capture >= 0 ) {
1309 if ( st->reenter == 0 ) 1315 if ( st->reenter == 0 )
1310 st->reenter = new QMap<int, int>; 1316 st->reenter = new QMap<int, int>;
1311 for ( int j = 0; j < (int) to.size(); j++ ) { 1317 for ( int j = 0; j < (int) to.size(); j++ ) {
1312 if ( !st->reenter->contains(to[j]) && 1318 if ( !st->reenter->contains(to[j]) &&
1313 oldOuts.bsearch(to[j]) < 0 ) 1319 oldOuts.bsearch(to[j]) < 0 )
1314 st->reenter->insert( to[j], atom ); 1320 st->reenter->insert( to[j], atom );
1315 } 1321 }
1316 } 1322 }
1317 } 1323 }
@@ -1327,3 +1333,3 @@ int QRegExpEngine::anchorAlternation( int a, int b )
1327 if ( ((a & b) == a || (a & b) == b) && ((a | b) & Anchor_Alternation) == 0 ) 1333 if ( ((a & b) == a || (a & b) == b) && ((a | b) & Anchor_Alternation) == 0 )
1328 return a & b; 1334 return a & b;
1329 1335
@@ -1342,5 +1348,5 @@ int QRegExpEngine::anchorConcatenation( int a, int b )
1342 if ( ((a | b) & Anchor_Alternation) == 0 ) 1348 if ( ((a | b) & Anchor_Alternation) == 0 )
1343 return a | b; 1349 return a | b;
1344 if ( (b & Anchor_Alternation) != 0 ) 1350 if ( (b & Anchor_Alternation) != 0 )
1345 qSwap( a, b ); 1351 qSwap( a, b );
1346 int aprime = anchorConcatenation( aa[a ^ Anchor_Alternation].a, b ); 1352 int aprime = anchorConcatenation( aa[a ^ Anchor_Alternation].a, b );
@@ -1358,5 +1364,5 @@ void QRegExpEngine::addAnchors( int from, int to, int a )
1358 if ( st->anchors == 0 ) 1364 if ( st->anchors == 0 )
1359 st->anchors = new QMap<int, int>; 1365 st->anchors = new QMap<int, int>;
1360 if ( st->anchors->contains(to) ) 1366 if ( st->anchors->contains(to) )
1361 a = anchorAlternation( (*st->anchors)[to], a ); 1367 a = anchorAlternation( (*st->anchors)[to], a );
1362 st->anchors->insert( to, a ); 1368 st->anchors->insert( to, a );
@@ -1371,3 +1377,3 @@ void QRegExpEngine::addAnchors( int from, int to, int a )
1371void QRegExpEngine::setupGoodStringHeuristic( int earlyStart, int lateStart, 1377void QRegExpEngine::setupGoodStringHeuristic( int earlyStart, int lateStart,
1372 const QString& str ) 1378 const QString& str )
1373{ 1379{
@@ -1379,3 +1385,3 @@ void QRegExpEngine::setupGoodStringHeuristic( int earlyStart, int lateStart,
1379void QRegExpEngine::setupBadCharHeuristic( int minLen, 1385void QRegExpEngine::setupBadCharHeuristic( int minLen,
1380 const QArray<int>& firstOcc ) 1386 const QArray<int>& firstOcc )
1381{ 1387{
@@ -1402,3 +1408,3 @@ void QRegExpEngine::heuristicallyChooseHeuristic()
1402 if ( minl == 0 ) 1408 if ( minl == 0 )
1403 return; 1409 return;
1404 1410
@@ -1409,3 +1415,3 @@ void QRegExpEngine::heuristicallyChooseHeuristic()
1409 int goodStringScore = ( 64 * goodStr.length() / minl ) - 1415 int goodStringScore = ( 64 * goodStr.length() / minl ) -
1410 ( goodLateStart - goodEarlyStart ); 1416 ( goodLateStart - goodEarlyStart );
1411 1417
@@ -1418,6 +1424,6 @@ void QRegExpEngine::heuristicallyChooseHeuristic()
1418 for ( i = 1; i < NumBadChars; i += step ) { 1424 for ( i = 1; i < NumBadChars; i += step ) {
1419 if ( occ1[i] == NoOccurrence ) 1425 if ( occ1[i] == NoOccurrence )
1420 badCharScore += minl; 1426 badCharScore += minl;
1421 else 1427 else
1422 badCharScore += occ1[i]; 1428 badCharScore += occ1[i];
1423 } 1429 }
@@ -1433,34 +1439,35 @@ void QRegExpEngine::dump() const
1433 int i, j; 1439 int i, j;
1434 qDebug( "Case %ssensitive engine", cs ? "" : "in" ); 1440 odebug << "Case " << (cs ? "" : "in") << "sensitive engine" << oendl;
1435 qDebug( " States" ); 1441 odebug << " States" << oendl;
1436 for ( i = 0; i < ns; i++ ) { 1442 for ( i = 0; i < ns; i++ ) {
1437 qDebug( " %d%s", i, 1443 odebug << " " << i
1438 i == InitialState ? " (initial)" : 1444 << (i == InitialState ? " (initial)" : i == FinalState ? " (final)" : "") << oendl;
1439 i == FinalState ? " (final)" : "" ); 1445
1440#ifndef QT_NO_REGEXP_CAPTURE 1446#ifndef QT_NO_REGEXP_CAPTURE
1441 qDebug( " in atom %d", s[i]->atom ); 1447 odebug << " in atom " << s[i]->atom << oendl;
1442#endif 1448#endif
1443 int m = s[i]->match; 1449 int m = s[i]->match;
1444 if ( (m & CharClassBit) != 0 ) { 1450 if ( (m & CharClassBit) != 0 ) {
1445 qDebug( " match character class %d", m ^ CharClassBit ); 1451 odebug << " match character class " << (m ^ CharClassBit) << oendl;
1446#ifndef QT_NO_REGEXP_CCLASS 1452#ifndef QT_NO_REGEXP_CCLASS
1447 cl[m ^ CharClassBit]->dump(); 1453 cl[m ^ CharClassBit]->dump();
1448#else 1454#else
1449 qDebug( " negative character class" ); 1455 odebug << " negative character class" << oendl;
1450#endif 1456#endif
1451 } else if ( (m & BackRefBit) != 0 ) { 1457 } else if ( (m & BackRefBit) != 0 ) {
1452 qDebug( " match back-reference %d", m ^ BackRefBit ); 1458 odebug << " match back-reference " << (m ^ BackRefBit) << oendl;
1453 } else if ( m >= 0x20 && m <= 0x7e ) { 1459 } else if ( m >= 0x20 && m <= 0x7e ) {
1454 qDebug( " match 0x%.4x (%c)", m, m ); 1460 odebug << " match " << QString().sprintf( "0x%.4x", m) << " (" << m << ")" << oendl;
1455 } else { 1461
1456 qDebug( " match 0x%.4x", m ); 1462 } else {
1457 } 1463 odebug << " match " << QString().sprintf( "0x%.4x", m) << oendl;
1458 for ( j = 0; j < (int) s[i]->outs.size(); j++ ) { 1464 }
1459 int next = s[i]->outs[j]; 1465 for ( j = 0; j < (int) s[i]->outs.size(); j++ ) {
1460 qDebug( " -> %d", next ); 1466 int next = s[i]->outs[j];
1461 if ( s[i]->reenter != 0 && s[i]->reenter->contains(next) ) 1467 odebug << " -> " << next << oendl;
1462 qDebug( " [reenter %d]", (*s[i]->reenter)[next] ); 1468 if ( s[i]->reenter != 0 && s[i]->reenter->contains(next) )
1463 if ( s[i]->anchors != 0 && at(*s[i]->anchors, next) != 0 ) 1469 odebug << " [reenter " << (*s[i]->reenter)[next] << "]" << oendl;
1464 qDebug( " [anchors 0x%.8x]", (*s[i]->anchors)[next] ); 1470 if ( s[i]->anchors != 0 && at(*s[i]->anchors, next) != 0 )
1465 } 1471 odebug << " [anchors " << QString().sprintf( "0x%.8x]", (*s[i]->anchors)[next] ) << oendl;
1472 }
1466 } 1473 }
@@ -1468,5 +1475,5 @@ void QRegExpEngine::dump() const
1468 if ( nf > 0 ) { 1475 if ( nf > 0 ) {
1469 qDebug( " Atom Parent Capture" ); 1476 odebug << " Atom Parent Capture" << oendl;
1470 for ( i = 0; i < nf; i++ ) 1477 for ( i = 0; i < nf; i++ )
1471 qDebug( " %6d %6d %6d", i, f[i].parent, f[i].capture ); 1478 odebug << QString().sprintf(" %6d %6d %6d", i, f[i].parent, f[i].capture ) << oendl;
1472 } 1479 }
@@ -1475,4 +1482,3 @@ void QRegExpEngine::dump() const
1475 for ( i = 0; i < (int) aa.size(); i++ ) 1482 for ( i = 0; i < (int) aa.size(); i++ )
1476 qDebug( " Anchor alternation 0x%.8x: 0x%.8x 0x%.9x", i, aa[i].a, 1483 odebug << QString().sprintf(" Anchor alternation 0x%.8x: 0x%.8x 0x%.9x", i, aa[i].a, aa[i].b ) << oendl;
1477 aa[i].b );
1478#endif 1484#endif
@@ -1485,6 +1491,6 @@ void QRegExpEngine::setup( bool caseSensitive )
1485 if ( engCount++ == 0 ) { 1491 if ( engCount++ == 0 ) {
1486 noOccurrences = new QArray<int>( NumBadChars ); 1492 noOccurrences = new QArray<int>( NumBadChars );
1487 firstOccurrenceAtZero = new QArray<int>( NumBadChars ); 1493 firstOccurrenceAtZero = new QArray<int>( NumBadChars );
1488 noOccurrences->fill( NoOccurrence ); 1494 noOccurrences->fill( NoOccurrence );
1489 firstOccurrenceAtZero->fill( 0 ); 1495 firstOccurrenceAtZero->fill( 0 );
1490 } 1496 }
@@ -1526,3 +1532,3 @@ int QRegExpEngine::setupState( int match )
1526 if ( (ns & (ns + 1)) == 0 && ns + 1 >= (int) s.size() ) 1532 if ( (ns & (ns + 1)) == 0 && ns + 1 >= (int) s.size() )
1527 s.resize( (ns + 1) << 1 ); 1533 s.resize( (ns + 1) << 1 );
1528#ifndef QT_NO_REGEXP_CAPTURE 1534#ifndef QT_NO_REGEXP_CAPTURE
@@ -1544,3 +1550,3 @@ int QRegExpEngine::startAtom( bool capture )
1544 if ( (nf & (nf + 1)) == 0 && nf + 1 >= (int) f.size() ) 1550 if ( (nf & (nf + 1)) == 0 && nf + 1 >= (int) f.size() )
1545 f.resize( (nf + 1) << 1 ); 1551 f.resize( (nf + 1) << 1 );
1546 f[nf].parent = cf; 1552 f[nf].parent = cf;
@@ -1560,4 +1566,4 @@ int QRegExpEngine::addLookahead( QRegExpEngine *eng, bool negative )
1560 if ( n == MaxLookaheads ) { 1566 if ( n == MaxLookaheads ) {
1561 yyError = TRUE; 1567 yyError = TRUE;
1562 return 0; 1568 return 0;
1563 } 1569 }
@@ -1574,11 +1580,11 @@ int QRegExpEngine::addLookahead( QRegExpEngine *eng, bool negative )
1574bool QRegExpEngine::isBetterCapture( const int *begin1, const int *end1, 1580bool QRegExpEngine::isBetterCapture( const int *begin1, const int *end1,
1575 const int *begin2, const int *end2 ) 1581 const int *begin2, const int *end2 )
1576{ 1582{
1577 for ( int i = 0; i < ncap; i++ ) { 1583 for ( int i = 0; i < ncap; i++ ) {
1578 int delta = begin2[i] - begin1[i]; // it has to start early... 1584 int delta = begin2[i] - begin1[i]; // it has to start early...
1579 if ( delta == 0 ) 1585 if ( delta == 0 )
1580 delta = end1[i] - end2[i]; // ...and end late (like a party) 1586 delta = end1[i] - end2[i]; // ...and end late (like a party)
1581 1587
1582 if ( delta != 0 ) 1588 if ( delta != 0 )
1583 return delta > 0; 1589 return delta > 0;
1584 } 1590 }
@@ -1598,4 +1604,4 @@ bool QRegExpEngine::testAnchor( int i, int a, const int *capBegin )
1598 if ( (a & Anchor_Alternation) != 0 ) { 1604 if ( (a & Anchor_Alternation) != 0 ) {
1599 return testAnchor( i, aa[a ^ Anchor_Alternation].a, capBegin ) || 1605 return testAnchor( i, aa[a ^ Anchor_Alternation].a, capBegin ) ||
1600 testAnchor( i, aa[a ^ Anchor_Alternation].b, capBegin ); 1606 testAnchor( i, aa[a ^ Anchor_Alternation].b, capBegin );
1601 } 1607 }
@@ -1604,8 +1610,8 @@ bool QRegExpEngine::testAnchor( int i, int a, const int *capBegin )
1604 if ( (a & Anchor_Caret) != 0 ) { 1610 if ( (a & Anchor_Caret) != 0 ) {
1605 if ( mmPos + i != 0 ) 1611 if ( mmPos + i != 0 )
1606 return FALSE; 1612 return FALSE;
1607 } 1613 }
1608 if ( (a & Anchor_Dollar) != 0 ) { 1614 if ( (a & Anchor_Dollar) != 0 ) {
1609 if ( mmPos + i != mmLen ) 1615 if ( mmPos + i != mmLen )
1610 return FALSE; 1616 return FALSE;
1611 } 1617 }
@@ -1613,11 +1619,11 @@ bool QRegExpEngine::testAnchor( int i, int a, const int *capBegin )
1613 if ( (a & (Anchor_Word | Anchor_NonWord)) != 0 ) { 1619 if ( (a & (Anchor_Word | Anchor_NonWord)) != 0 ) {
1614 bool before = FALSE, after = FALSE; 1620 bool before = FALSE, after = FALSE;
1615 if ( mmPos + i != 0 ) 1621 if ( mmPos + i != 0 )
1616 before = mmIn[mmPos + i - 1].isLetterOrNumber(); 1622 before = mmIn[mmPos + i - 1].isLetterOrNumber();
1617 if ( mmPos + i != mmLen ) 1623 if ( mmPos + i != mmLen )
1618 after = mmIn[mmPos + i].isLetterOrNumber(); 1624 after = mmIn[mmPos + i].isLetterOrNumber();
1619 if ( (a & Anchor_Word) != 0 && (before == after) ) 1625 if ( (a & Anchor_Word) != 0 && (before == after) )
1620 return FALSE; 1626 return FALSE;
1621 if ( (a & Anchor_NonWord) != 0 && (before != after) ) 1627 if ( (a & Anchor_NonWord) != 0 && (before != after) )
1622 return FALSE; 1628 return FALSE;
1623 } 1629 }
@@ -1628,12 +1634,12 @@ bool QRegExpEngine::testAnchor( int i, int a, const int *capBegin )
1628 if ( (a & Anchor_LookaheadMask) != 0 ) { 1634 if ( (a & Anchor_LookaheadMask) != 0 ) {
1629 QConstString cstr = QConstString( (QChar *) mmIn + mmPos + i, 1635 QConstString cstr = QConstString( (QChar *) mmIn + mmPos + i,
1630 mmLen - mmPos - i ); 1636 mmLen - mmPos - i );
1631 for ( j = 0; j < (int) ahead.size(); j++ ) { 1637 for ( j = 0; j < (int) ahead.size(); j++ ) {
1632 if ( (a & (Anchor_FirstLookahead << j)) != 0 ) { 1638 if ( (a & (Anchor_FirstLookahead << j)) != 0 ) {
1633 catchx = ( ahead[j]->eng->match(cstr.string(), 0, TRUE, 1639 catchx = ( ahead[j]->eng->match(cstr.string(), 0, TRUE,
1634 TRUE)[0] == 0 ); 1640 TRUE)[0] == 0 );
1635 if ( catchx == ahead[j]->neg ) 1641 if ( catchx == ahead[j]->neg )
1636 return FALSE; 1642 return FALSE;
1637 } 1643 }
1638 } 1644 }
1639 } 1645 }
@@ -1643,6 +1649,6 @@ bool QRegExpEngine::testAnchor( int i, int a, const int *capBegin )
1643 for ( j = 0; j < nbrefs; j++ ) { 1649 for ( j = 0; j < nbrefs; j++ ) {
1644 if ( (a & (Anchor_BackRef1Empty << j)) != 0 ) { 1650 if ( (a & (Anchor_BackRef1Empty << j)) != 0 ) {
1645 if ( capBegin[j] != EmptyCapture ) 1651 if ( capBegin[j] != EmptyCapture )
1646 return FALSE; 1652 return FALSE;
1647 } 1653 }
1648 } 1654 }
@@ -1665,13 +1671,13 @@ bool QRegExpEngine::goodStringMatch()
1665 while ( (k = mmStr->find(goodStr, k, cs)) != -1 ) { 1671 while ( (k = mmStr->find(goodStr, k, cs)) != -1 ) {
1666 int from = k - goodLateStart; 1672 int from = k - goodLateStart;
1667 int to = k - goodEarlyStart; 1673 int to = k - goodEarlyStart;
1668 if ( from > mmPos ) 1674 if ( from > mmPos )
1669 mmPos = from; 1675 mmPos = from;
1670 1676
1671 while ( mmPos <= to ) { 1677 while ( mmPos <= to ) {
1672 if ( matchHere() ) 1678 if ( matchHere() )
1673 return TRUE; 1679 return TRUE;
1674 mmPos++; 1680 mmPos++;
1675 } 1681 }
1676 k++; 1682 k++;
1677 } 1683 }
@@ -1693,14 +1699,14 @@ bool QRegExpEngine::badCharMatch()
1693 for ( i = 0; i < minl; i++ ) { 1699 for ( i = 0; i < minl; i++ ) {
1694 int sk = occ1[BadChar(mmIn[mmPos + i])]; 1700 int sk = occ1[BadChar(mmIn[mmPos + i])];
1695 if ( sk == NoOccurrence ) 1701 if ( sk == NoOccurrence )
1696 sk = i + 1; 1702 sk = i + 1;
1697 if ( sk > 0 ) { 1703 if ( sk > 0 ) {
1698 int k = i + 1 - sk; 1704 int k = i + 1 - sk;
1699 if ( k < 0 ) { 1705 if ( k < 0 ) {
1700 sk = i + 1; 1706 sk = i + 1;
1701 k = 0; 1707 k = 0;
1702 } 1708 }
1703 if ( sk > mmSlideTab[k] ) 1709 if ( sk > mmSlideTab[k] )
1704 mmSlideTab[k] = sk; 1710 mmSlideTab[k] = sk;
1705 } 1711 }
1706 } 1712 }
@@ -1708,35 +1714,35 @@ bool QRegExpEngine::badCharMatch()
1708 if ( mmPos > lastPos ) 1714 if ( mmPos > lastPos )
1709 return FALSE; 1715 return FALSE;
1710 1716
1711 while ( TRUE ) { 1717 while ( TRUE ) {
1712 if ( ++slideNext >= mmSlideTabSize ) 1718 if ( ++slideNext >= mmSlideTabSize )
1713 slideNext = 0; 1719 slideNext = 0;
1714 if ( mmSlideTab[slideHead] > 0 ) { 1720 if ( mmSlideTab[slideHead] > 0 ) {
1715 if ( mmSlideTab[slideHead] - 1 > mmSlideTab[slideNext] ) 1721 if ( mmSlideTab[slideHead] - 1 > mmSlideTab[slideNext] )
1716 mmSlideTab[slideNext] = mmSlideTab[slideHead] - 1; 1722 mmSlideTab[slideNext] = mmSlideTab[slideHead] - 1;
1717 mmSlideTab[slideHead] = 0; 1723 mmSlideTab[slideHead] = 0;
1718 } else { 1724 } else {
1719 if ( matchHere() ) 1725 if ( matchHere() )
1720 return TRUE; 1726 return TRUE;
1721 } 1727 }
1722 1728
1723 if ( mmPos == lastPos ) 1729 if ( mmPos == lastPos )
1724 break; 1730 break;
1725 1731
1726 /* 1732 /*
1727 Update the slide table. This code has much in common with the 1733 Update the slide table. This code has much in common with the
1728 initialization code. 1734 initialization code.
1729 */ 1735 */
1730 int sk = occ1[BadChar(mmIn[mmPos + minl])]; 1736 int sk = occ1[BadChar(mmIn[mmPos + minl])];
1731 if ( sk == NoOccurrence ) { 1737 if ( sk == NoOccurrence ) {
1732 mmSlideTab[slideNext] = minl; 1738 mmSlideTab[slideNext] = minl;
1733 } else if ( sk > 0 ) { 1739 } else if ( sk > 0 ) {
1734 int k = slideNext + minl - sk; 1740 int k = slideNext + minl - sk;
1735 if ( k >= mmSlideTabSize ) 1741 if ( k >= mmSlideTabSize )
1736 k -= mmSlideTabSize; 1742 k -= mmSlideTabSize;
1737 if ( sk > mmSlideTab[k] ) 1743 if ( sk > mmSlideTab[k] )
1738 mmSlideTab[k] = sk; 1744 mmSlideTab[k] = sk;
1739 } 1745 }
1740 slideHead = slideNext; 1746 slideHead = slideNext;
1741 mmPos++; 1747 mmPos++;
1742 } 1748 }
@@ -1748,5 +1754,5 @@ bool QRegExpEngine::bruteMatch()
1748 while ( mmPos <= mmLen ) { 1754 while ( mmPos <= mmLen ) {
1749 if ( matchHere() ) 1755 if ( matchHere() )
1750 return TRUE; 1756 return TRUE;
1751 mmPos++; 1757 mmPos++;
1752 } 1758 }
@@ -1770,6 +1776,6 @@ bool QRegExpEngine::matchHere()
1770 if ( ncap > 0 ) { 1776 if ( ncap > 0 ) {
1771 for ( j = 0; j < ncap; j++ ) { 1777 for ( j = 0; j < ncap; j++ ) {
1772 mmCurCapBegin[j] = EmptyCapture; 1778 mmCurCapBegin[j] = EmptyCapture;
1773 mmCurCapEnd[j] = EmptyCapture; 1779 mmCurCapEnd[j] = EmptyCapture;
1774 } 1780 }
1775 } 1781 }
@@ -1781,3 +1787,3 @@ bool QRegExpEngine::matchHere()
1781 while ( (ncur > 0 || mmSleeping.count() > 0) && i <= mmLen - mmPos && 1787 while ( (ncur > 0 || mmSleeping.count() > 0) && i <= mmLen - mmPos &&
1782 !match ) 1788 !match )
1783#else 1789#else
@@ -1786,302 +1792,302 @@ bool QRegExpEngine::matchHere()
1786 { 1792 {
1787 int ch = ( i < mmLen - mmPos ) ? mmIn[mmPos + i].unicode() : 0; 1793 int ch = ( i < mmLen - mmPos ) ? mmIn[mmPos + i].unicode() : 0;
1788 for ( j = 0; j < ncur; j++ ) { 1794 for ( j = 0; j < ncur; j++ ) {
1789 int cur = mmCurStack[j]; 1795 int cur = mmCurStack[j];
1790 State *scur = s[cur]; 1796 State *scur = s[cur];
1791 QArray<int>& outs = scur->outs; 1797 QArray<int>& outs = scur->outs;
1792 for ( k = 0; k < (int) outs.size(); k++ ) { 1798 for ( k = 0; k < (int) outs.size(); k++ ) {
1793 int next = outs[k]; 1799 int next = outs[k];
1794 State *snext = s[next]; 1800 State *snext = s[next];
1795 bool in = TRUE; 1801 bool in = TRUE;
1796#ifndef QT_NO_REGEXP_BACKREF 1802#ifndef QT_NO_REGEXP_BACKREF
1797 int needSomeSleep = 0; 1803 int needSomeSleep = 0;
1798#endif 1804#endif
1799 1805
1800 /* 1806 /*
1801 First, check if the anchors are anchored properly. 1807 First, check if the anchors are anchored properly.
1802 */ 1808 */
1803 if ( scur->anchors != 0 ) { 1809 if ( scur->anchors != 0 ) {
1804 int a = at( *scur->anchors, next ); 1810 int a = at( *scur->anchors, next );
1805 if ( a != 0 && !testAnchor(i, a, mmCurCapBegin + j * ncap) ) 1811 if ( a != 0 && !testAnchor(i, a, mmCurCapBegin + j * ncap) )
1806 in = FALSE; 1812 in = FALSE;
1807 } 1813 }
1808 /* 1814 /*
1809 If indeed they are, check if the input character is correct 1815 If indeed they are, check if the input character is correct
1810 for this transition. 1816 for this transition.
1811 */ 1817 */
1812 if ( in ) { 1818 if ( in ) {
1813 m = snext->match; 1819 m = snext->match;
1814 if ( (m & (CharClassBit | BackRefBit)) == 0 ) { 1820 if ( (m & (CharClassBit | BackRefBit)) == 0 ) {
1815 if ( cs ) 1821 if ( cs )
1816 in = ( m == ch ); 1822 in = ( m == ch );
1817 else 1823 else
1818 in = ( QChar(m).lower() == QChar(ch).lower() ); 1824 in = ( QChar(m).lower() == QChar(ch).lower() );
1819 } else if ( next == FinalState ) { 1825 } else if ( next == FinalState ) {
1820 mmMatchedLen = i; 1826 mmMatchedLen = i;
1821 match = mmMinimal; 1827 match = mmMinimal;
1822 in = TRUE; 1828 in = TRUE;
1823 } else if ( (m & CharClassBit) != 0 ) { 1829 } else if ( (m & CharClassBit) != 0 ) {
1824#ifndef QT_NO_REGEXP_CCLASS 1830#ifndef QT_NO_REGEXP_CCLASS
1825 const CharClass *cc = cl[m ^ CharClassBit]; 1831 const CharClass *cc = cl[m ^ CharClassBit];
1826 if ( cs ) 1832 if ( cs )
1827 in = cc->in( ch ); 1833 in = cc->in( ch );
1828 else if ( cc->negative() ) 1834 else if ( cc->negative() )
1829 in = cc->in( QChar(ch).lower() ) && 1835 in = cc->in( QChar(ch).lower() ) &&
1830 cc->in( QChar(ch).upper() ); 1836 cc->in( QChar(ch).upper() );
1831 else 1837 else
1832 in = cc->in( QChar(ch).lower() ) || 1838 in = cc->in( QChar(ch).lower() ) ||
1833 cc->in( QChar(ch).upper() ); 1839 cc->in( QChar(ch).upper() );
1834#endif 1840#endif
1835#ifndef QT_NO_REGEXP_BACKREF 1841#ifndef QT_NO_REGEXP_BACKREF
1836 } else { /* ( (m & BackRefBit) != 0 ) */ 1842 } else { /* ( (m & BackRefBit) != 0 ) */
1837 int bref = m ^ BackRefBit; 1843 int bref = m ^ BackRefBit;
1838 int ell = j * ncap + ( bref - 1 ); 1844 int ell = j * ncap + ( bref - 1 );
1839 1845
1840 in = bref <= ncap && mmCurCapBegin[ell] != EmptyCapture; 1846 in = bref <= ncap && mmCurCapBegin[ell] != EmptyCapture;
1841 if ( in ) { 1847 if ( in ) {
1842 if ( cs ) 1848 if ( cs )
1843 in = ( mmIn[mmPos + mmCurCapBegin[ell]] 1849 in = ( mmIn[mmPos + mmCurCapBegin[ell]]
1844 == QChar(ch) ); 1850 == QChar(ch) );
1845 else 1851 else
1846 in = ( mmIn[mmPos + mmCurCapBegin[ell]].lower() 1852 in = ( mmIn[mmPos + mmCurCapBegin[ell]].lower()
1847 == QChar(ch).lower() ); 1853 == QChar(ch).lower() );
1848 } 1854 }
1849 1855
1850 if ( in ) { 1856 if ( in ) {
1851 int delta; 1857 int delta;
1852 if ( mmCurCapEnd[ell] == EmptyCapture ) 1858 if ( mmCurCapEnd[ell] == EmptyCapture )
1853 delta = i - mmCurCapBegin[ell]; 1859 delta = i - mmCurCapBegin[ell];
1854 else 1860 else
1855 delta = mmCurCapEnd[ell] - mmCurCapBegin[ell]; 1861 delta = mmCurCapEnd[ell] - mmCurCapBegin[ell];
1856 1862
1857 in = ( delta <= mmLen - mmPos ); 1863 in = ( delta <= mmLen - mmPos );
1858 if ( in && delta > 1 ) { 1864 if ( in && delta > 1 ) {
1859 int n; 1865 int n;
1860 if ( cs ) { 1866 if ( cs ) {
1861 for ( n = 1; n < delta; n++ ) { 1867 for ( n = 1; n < delta; n++ ) {
1862 if ( mmIn[mmPos + 1868 if ( mmIn[mmPos +
1863 mmCurCapBegin[ell] + n] != 1869 mmCurCapBegin[ell] + n] !=
1864 mmIn[mmPos + i + n] ) 1870 mmIn[mmPos + i + n] )
1865 break; 1871 break;
1866 } 1872 }
1867 } else { 1873 } else {
1868 for ( n = 1; n < delta; n++ ) { 1874 for ( n = 1; n < delta; n++ ) {
1869 QChar a = mmIn[mmPos + 1875 QChar a = mmIn[mmPos +
1870 mmCurCapBegin[ell] + n]; 1876 mmCurCapBegin[ell] + n];
1871 QChar b = mmIn[mmPos + i + n]; 1877 QChar b = mmIn[mmPos + i + n];
1872 if ( a.lower() != b.lower() ) 1878 if ( a.lower() != b.lower() )
1873 break; 1879 break;
1874 } 1880 }
1875 } 1881 }
1876 in = ( n == delta ); 1882 in = ( n == delta );
1877 if ( in ) 1883 if ( in )
1878 needSomeSleep = delta - 1; 1884 needSomeSleep = delta - 1;
1879 } 1885 }
1880 } 1886 }
1881#endif 1887#endif
1882 } 1888 }
1883 } 1889 }
1884 1890
1885 /* 1891 /*
1886 All is right. We must now update our data structures. 1892 All is right. We must now update our data structures.
1887 */ 1893 */
1888 if ( in ) { 1894 if ( in ) {
1889#ifndef QT_NO_REGEXP_CAPTURE 1895#ifndef QT_NO_REGEXP_CAPTURE
1890 int *capBegin, *capEnd; 1896 int *capBegin, *capEnd;
1891#endif 1897#endif
1892 /* 1898 /*
1893 If the next state was not encountered yet, all is fine. 1899 If the next state was not encountered yet, all is fine.
1894 */ 1900 */
1895 if ( (m = mmInNextStack[next]) == -1 ) { 1901 if ( (m = mmInNextStack[next]) == -1 ) {
1896 m = nnext++; 1902 m = nnext++;
1897 mmNextStack[m] = next; 1903 mmNextStack[m] = next;
1898 mmInNextStack[next] = m; 1904 mmInNextStack[next] = m;
1899#ifndef QT_NO_REGEXP_CAPTURE 1905#ifndef QT_NO_REGEXP_CAPTURE
1900 capBegin = mmNextCapBegin + m * ncap; 1906 capBegin = mmNextCapBegin + m * ncap;
1901 capEnd = mmNextCapEnd + m * ncap; 1907 capEnd = mmNextCapEnd + m * ncap;
1902 1908
1903 /* 1909 /*
1904 Otherwise, we'll first maintain captures in temporary 1910 Otherwise, we'll first maintain captures in temporary
1905 arrays, and decide at the end whether it's best to keep 1911 arrays, and decide at the end whether it's best to keep
1906 the previous capture zones or the new ones. 1912 the previous capture zones or the new ones.
1907 */ 1913 */
1908 } else { 1914 } else {
1909 capBegin = mmTempCapBegin; 1915 capBegin = mmTempCapBegin;
1910 capEnd = mmTempCapEnd; 1916 capEnd = mmTempCapEnd;
1911#endif 1917#endif
1912 } 1918 }
1913 1919
1914#ifndef QT_NO_REGEXP_CAPTURE 1920#ifndef QT_NO_REGEXP_CAPTURE
1915 /* 1921 /*
1916 Updating the capture zones is much of a task. 1922 Updating the capture zones is much of a task.
1917 */ 1923 */
1918 if ( ncap > 0 ) { 1924 if ( ncap > 0 ) {
1919 memcpy( capBegin, mmCurCapBegin + j * ncap, 1925 memcpy( capBegin, mmCurCapBegin + j * ncap,
1920 ncap * sizeof(int) ); 1926 ncap * sizeof(int) );
1921 memcpy( capEnd, mmCurCapEnd + j * ncap, 1927 memcpy( capEnd, mmCurCapEnd + j * ncap,
1922 ncap * sizeof(int) ); 1928 ncap * sizeof(int) );
1923 int c = scur->atom, n = snext->atom; 1929 int c = scur->atom, n = snext->atom;
1924 int p = -1, q = -1; 1930 int p = -1, q = -1;
1925 int cap; 1931 int cap;
1926 1932
1927 /* 1933 /*
1928 Lemma 1. For any x in the range [0..nf), we have 1934 Lemma 1. For any x in the range [0..nf), we have
1929 f[x].parent < x. 1935 f[x].parent < x.
1930 1936
1931 Proof. By looking at startAtom(), it is clear that 1937 Proof. By looking at startAtom(), it is clear that
1932 cf < nf holds all the time, and thus that 1938 cf < nf holds all the time, and thus that
1933 f[nf].parent < nf. 1939 f[nf].parent < nf.
1934 */ 1940 */
1935 1941
1936 /* 1942 /*
1937 If we are reentering an atom, we empty all capture 1943 If we are reentering an atom, we empty all capture
1938 zones inside it. 1944 zones inside it.
1939 */ 1945 */
1940 if ( scur->reenter != 0 && 1946 if ( scur->reenter != 0 &&
1941 (q = at(*scur->reenter, next)) != 0 ) { 1947 (q = at(*scur->reenter, next)) != 0 ) {
1942 QBitArray b; 1948 QBitArray b;
1943 b.fill( FALSE, nf ); 1949 b.fill( FALSE, nf );
1944 b.setBit( q, TRUE ); 1950 b.setBit( q, TRUE );
1945 for ( int ell = q + 1; ell < nf; ell++ ) { 1951 for ( int ell = q + 1; ell < nf; ell++ ) {
1946 if ( b.testBit(f[ell].parent) ) { 1952 if ( b.testBit(f[ell].parent) ) {
1947 b.setBit( ell, TRUE ); 1953 b.setBit( ell, TRUE );
1948 cap = f[ell].capture; 1954 cap = f[ell].capture;
1949 if ( cap >= 0 ) { 1955 if ( cap >= 0 ) {
1950 capBegin[cap] = EmptyCapture; 1956 capBegin[cap] = EmptyCapture;
1951 capEnd[cap] = EmptyCapture; 1957 capEnd[cap] = EmptyCapture;
1952 } 1958 }
1953 } 1959 }
1954 } 1960 }
1955 p = f[q].parent; 1961 p = f[q].parent;
1956 1962
1957 /* 1963 /*
1958 Otherwise, close the capture zones we are leaving. 1964 Otherwise, close the capture zones we are leaving.
1959 We are leaving f[c].capture, f[f[c].parent].capture, 1965 We are leaving f[c].capture, f[f[c].parent].capture,
1960 f[f[f[c].parent].parent].capture, ..., until 1966 f[f[f[c].parent].parent].capture, ..., until
1961 f[x].capture, with x such that f[x].parent is the 1967 f[x].capture, with x such that f[x].parent is the
1962 youngest common ancestor for c and n. 1968 youngest common ancestor for c and n.
1963 1969
1964 We go up along c's and n's ancestry until we find x. 1970 We go up along c's and n's ancestry until we find x.
1965 */ 1971 */
1966 } else { 1972 } else {
1967 p = c; 1973 p = c;
1968 q = n; 1974 q = n;
1969 while ( p != q ) { 1975 while ( p != q ) {
1970 if ( p > q ) { 1976 if ( p > q ) {
1971 cap = f[p].capture; 1977 cap = f[p].capture;
1972 if ( cap >= 0 ) { 1978 if ( cap >= 0 ) {
1973 if ( capBegin[cap] == i ) { 1979 if ( capBegin[cap] == i ) {
1974 capBegin[cap] = EmptyCapture; 1980 capBegin[cap] = EmptyCapture;
1975 capEnd[cap] = EmptyCapture; 1981 capEnd[cap] = EmptyCapture;
1976 } else { 1982 } else {
1977 capEnd[cap] = i; 1983 capEnd[cap] = i;
1978 } 1984 }
1979 } 1985 }
1980 p = f[p].parent; 1986 p = f[p].parent;
1981 } else { 1987 } else {
1982 q = f[q].parent; 1988 q = f[q].parent;
1983 } 1989 }
1984 } 1990 }
1985 } 1991 }
1986 1992
1987 /* 1993 /*
1988 In any case, we now open the capture zones we are 1994 In any case, we now open the capture zones we are
1989 entering. We work upwards from n until we reach p 1995 entering. We work upwards from n until we reach p
1990 (the parent of the atom we reenter or the youngest 1996 (the parent of the atom we reenter or the youngest
1991 common ancestor). 1997 common ancestor).
1992 */ 1998 */
1993 while ( n > p ) { 1999 while ( n > p ) {
1994 cap = f[n].capture; 2000 cap = f[n].capture;
1995 if ( cap >= 0 ) { 2001 if ( cap >= 0 ) {
1996 capBegin[cap] = i; 2002 capBegin[cap] = i;
1997 capEnd[cap] = EmptyCapture; 2003 capEnd[cap] = EmptyCapture;
1998 } 2004 }
1999 n = f[n].parent; 2005 n = f[n].parent;
2000 } 2006 }
2001 /* 2007 /*
2002 If the next state was already in mmNextStack, we must 2008 If the next state was already in mmNextStack, we must
2003 choose carefully which capture zones we want to keep. 2009 choose carefully which capture zones we want to keep.
2004 */ 2010 */
2005 if ( capBegin == mmTempCapBegin && 2011 if ( capBegin == mmTempCapBegin &&
2006 isBetterCapture(capBegin, capEnd, 2012 isBetterCapture(capBegin, capEnd,
2007 mmNextCapBegin + m * ncap, 2013 mmNextCapBegin + m * ncap,
2008 mmNextCapEnd + m * ncap) ) { 2014 mmNextCapEnd + m * ncap) ) {
2009 memcpy( mmNextCapBegin + m * ncap, capBegin, 2015 memcpy( mmNextCapBegin + m * ncap, capBegin,
2010 ncap * sizeof(int) ); 2016 ncap * sizeof(int) );
2011 memcpy( mmNextCapEnd + m * ncap, capEnd, 2017 memcpy( mmNextCapEnd + m * ncap, capEnd,
2012 ncap * sizeof(int) ); 2018 ncap * sizeof(int) );
2013 } 2019 }
2014 } 2020 }
2015#ifndef QT_NO_REGEXP_BACKREF 2021#ifndef QT_NO_REGEXP_BACKREF
2016 /* 2022 /*
2017 We are done with updating the capture zones. It's now 2023 We are done with updating the capture zones. It's now
2018 time to put the next state to sleep, if it needs to, and 2024 time to put the next state to sleep, if it needs to, and
2019 to remove it from mmNextStack. 2025 to remove it from mmNextStack.
2020 */ 2026 */
2021 if ( needSomeSleep > 0 ) { 2027 if ( needSomeSleep > 0 ) {
2022 zzZ = new int[1 + 2 * ncap]; 2028 zzZ = new int[1 + 2 * ncap];
2023 zzZ[0] = next; 2029 zzZ[0] = next;
2024 if ( ncap > 0 ) { 2030 if ( ncap > 0 ) {
2025 memcpy( zzZ + 1, capBegin, ncap * sizeof(int) ); 2031 memcpy( zzZ + 1, capBegin, ncap * sizeof(int) );
2026 memcpy( zzZ + 1 + ncap, capEnd, 2032 memcpy( zzZ + 1 + ncap, capEnd,
2027 ncap * sizeof(int) ); 2033 ncap * sizeof(int) );
2028 } 2034 }
2029 mmInNextStack[mmNextStack[--nnext]] = -1; 2035 mmInNextStack[mmNextStack[--nnext]] = -1;
2030 mmSleeping.insert( i + needSomeSleep, zzZ ); 2036 mmSleeping.insert( i + needSomeSleep, zzZ );
2031 } 2037 }
2032#endif 2038#endif
2033#endif 2039#endif
2034 } 2040 }
2035 } 2041 }
2036 } 2042 }
2037#ifndef QT_NO_REGEXP_CAPTURE 2043#ifndef QT_NO_REGEXP_CAPTURE
2038 /* 2044 /*
2039 If we reached the final state, hurray! Copy the captured zone. 2045 If we reached the final state, hurray! Copy the captured zone.
2040 */ 2046 */
2041 if ( ncap > 0 && (m = mmInNextStack[FinalState]) != -1 ) { 2047 if ( ncap > 0 && (m = mmInNextStack[FinalState]) != -1 ) {
2042 memcpy( mmCapBegin, mmNextCapBegin + m * ncap, ncap * sizeof(int) ); 2048 memcpy( mmCapBegin, mmNextCapBegin + m * ncap, ncap * sizeof(int) );
2043 memcpy( mmCapEnd, mmNextCapEnd + m * ncap, ncap * sizeof(int) ); 2049 memcpy( mmCapEnd, mmNextCapEnd + m * ncap, ncap * sizeof(int) );
2044 } 2050 }
2045#ifndef QT_NO_REGEXP_BACKREF 2051#ifndef QT_NO_REGEXP_BACKREF
2046 /* 2052 /*
2047 It's time to wake up the sleepers. 2053 It's time to wake up the sleepers.
2048 */ 2054 */
2049 if ( mmSleeping.count() > 0 ) { 2055 if ( mmSleeping.count() > 0 ) {
2050 while ( (zzZ = mmSleeping.take(i)) != 0 ) { 2056 while ( (zzZ = mmSleeping.take(i)) != 0 ) {
2051 int next = zzZ[0]; 2057 int next = zzZ[0];
2052 int *capBegin = zzZ + 1; 2058 int *capBegin = zzZ + 1;
2053 int *capEnd = zzZ + 1 + ncap; 2059 int *capEnd = zzZ + 1 + ncap;
2054 bool copyOver = TRUE; 2060 bool copyOver = TRUE;
2055 2061
2056 if ( (m = mmInNextStack[zzZ[0]]) == -1 ) { 2062 if ( (m = mmInNextStack[zzZ[0]]) == -1 ) {
2057 m = nnext++; 2063 m = nnext++;
2058 mmNextStack[m] = next; 2064 mmNextStack[m] = next;
2059 mmInNextStack[next] = m; 2065 mmInNextStack[next] = m;
2060 } else { 2066 } else {
2061 copyOver = isBetterCapture( mmNextCapBegin + m * ncap, 2067 copyOver = isBetterCapture( mmNextCapBegin + m * ncap,
2062 mmNextCapEnd + m * ncap, 2068 mmNextCapEnd + m * ncap,
2063 capBegin, capEnd ); 2069 capBegin, capEnd );
2064 } 2070 }
2065 if ( copyOver ) { 2071 if ( copyOver ) {
2066 memcpy( mmNextCapBegin + m * ncap, capBegin, 2072 memcpy( mmNextCapBegin + m * ncap, capBegin,
2067 ncap * sizeof(int) ); 2073 ncap * sizeof(int) );
2068 memcpy( mmNextCapEnd + m * ncap, capEnd, 2074 memcpy( mmNextCapEnd + m * ncap, capEnd,
2069 ncap * sizeof(int) ); 2075 ncap * sizeof(int) );
2070 } 2076 }
2071 delete[] zzZ; 2077 delete[] zzZ;
2072 } 2078 }
2073 } 2079 }
2074#endif 2080#endif
2075#endif 2081#endif
2076 for ( j = 0; j < nnext; j++ ) 2082 for ( j = 0; j < nnext; j++ )
2077 mmInNextStack[mmNextStack[j]] = -1; 2083 mmInNextStack[mmNextStack[j]] = -1;
2078 2084
2079 qSwap( mmCurStack, mmNextStack ); 2085 qSwap( mmCurStack, mmNextStack );
2080#ifndef QT_NO_REGEXP_CAPTURE 2086#ifndef QT_NO_REGEXP_CAPTURE
2081 qSwap( mmCurCapBegin, mmNextCapBegin ); 2087 qSwap( mmCurCapBegin, mmNextCapBegin );
2082 qSwap( mmCurCapEnd, mmNextCapEnd ); 2088 qSwap( mmCurCapEnd, mmNextCapEnd );
2083#endif 2089#endif
2084 ncur = nnext; 2090 ncur = nnext;
2085 nnext = 0; 2091 nnext = 0;
2086 i++; 2092 i++;
2087 } 2093 }
@@ -2093,4 +2099,4 @@ bool QRegExpEngine::matchHere()
2093 while ( !mmSleeping.isEmpty() ) { 2099 while ( !mmSleeping.isEmpty() ) {
2094 zzZ = mmSleeping.take( *QIntDictIterator<int>(mmSleeping) ); 2100 zzZ = mmSleeping.take( *QIntDictIterator<int>(mmSleeping) );
2095 delete[] zzZ; 2101 delete[] zzZ;
2096 } 2102 }
@@ -2100,3 +2106,3 @@ bool QRegExpEngine::matchHere()
2100 if ( !match ) 2106 if ( !match )
2101 mmMatchedLen = i - 1; 2107 mmMatchedLen = i - 1;
2102 return match; 2108 return match;
@@ -2115,3 +2121,3 @@ QRegExpEngine::CharClass::CharClass()
2115QRegExpEngine::CharClass& QRegExpEngine::CharClass::operator=( 2121QRegExpEngine::CharClass& QRegExpEngine::CharClass::operator=(
2116 const CharClass& cc ) 2122 const CharClass& cc )
2117{ 2123{
@@ -2152,3 +2158,3 @@ void QRegExpEngine::CharClass::addRange( ushort from, ushort to )
2152 if ( from > to ) 2158 if ( from > to )
2153 qSwap( from, to ); 2159 qSwap( from, to );
2154 int n = r.size(); 2160 int n = r.size();
@@ -2162,14 +2168,14 @@ void QRegExpEngine::CharClass::addRange( ushort from, ushort to )
2162 if ( to - from < NumBadChars ) { 2168 if ( to - from < NumBadChars ) {
2163 occ1.detach(); 2169 occ1.detach();
2164 if ( from % NumBadChars <= to % NumBadChars ) { 2170 if ( from % NumBadChars <= to % NumBadChars ) {
2165 for ( i = from % NumBadChars; i <= to % NumBadChars; i++ ) 2171 for ( i = from % NumBadChars; i <= to % NumBadChars; i++ )
2166 occ1[i] = 0; 2172 occ1[i] = 0;
2167 } else {
2168 for ( i = 0; i <= to % NumBadChars; i++ )
2169 occ1[i] = 0;
2170 for ( i = from % NumBadChars; i < NumBadChars; i++ )
2171 occ1[i] = 0;
2172 }
2173 } else { 2173 } else {
2174 occ1 = *firstOccurrenceAtZero; 2174 for ( i = 0; i <= to % NumBadChars; i++ )
2175 occ1[i] = 0;
2176 for ( i = from % NumBadChars; i < NumBadChars; i++ )
2177 occ1[i] = 0;
2178 }
2179 } else {
2180 occ1 = *firstOccurrenceAtZero;
2175 } 2181 }
@@ -2182,3 +2188,3 @@ bool QRegExpEngine::CharClass::in( QChar ch ) const
2182 if ( occ1[BadChar(ch)] == NoOccurrence ) 2188 if ( occ1[BadChar(ch)] == NoOccurrence )
2183 return n; 2189 return n;
2184#endif 2190#endif
@@ -2186,6 +2192,6 @@ bool QRegExpEngine::CharClass::in( QChar ch ) const
2186 if ( c != 0 && (c & (1 << (int) ch.category())) != 0 ) 2192 if ( c != 0 && (c & (1 << (int) ch.category())) != 0 )
2187 return !n; 2193 return !n;
2188 for ( int i = 0; i < (int) r.size(); i++ ) { 2194 for ( int i = 0; i < (int) r.size(); i++ ) {
2189 if ( ch.unicode() >= r[i].from && ch.unicode() <= r[i].to ) 2195 if ( ch.unicode() >= r[i].from && ch.unicode() <= r[i].to )
2190 return !n; 2196 return !n;
2191 } 2197 }
@@ -2198,9 +2204,9 @@ void QRegExpEngine::CharClass::dump() const
2198 int i; 2204 int i;
2199 qDebug( " %stive character class", n ? "nega" : "posi" ); 2205 odebug << " " << (n ? "nega" : "posi") << "tive character class" << oendl;
2200#ifndef QT_NO_REGEXP_CCLASS 2206#ifndef QT_NO_REGEXP_CCLASS
2201 if ( c != 0 ) 2207 if ( c != 0 )
2202 qDebug( " categories 0x%.8x", c ); 2208 odebug << QString().sprintf(" categories 0x%.8x", c ) << oendl;
2203#endif 2209#endif
2204 for ( i = 0; i < (int) r.size(); i++ ) 2210 for ( i = 0; i < (int) r.size(); i++ )
2205 qDebug( " 0x%.4x through 0x%.4x", r[i].from, r[i].to ); 2211 odebug << QString().sprintf(" 0x%.4x through 0x%.4x", r[i].from, r[i].to ) << oendl;
2206} 2212}
@@ -2277,3 +2283,3 @@ void QRegExpEngine::Box::set( int bref )
2277 if ( bref >= 1 && bref <= MaxBackRefs ) 2283 if ( bref >= 1 && bref <= MaxBackRefs )
2278 skipanchors = Anchor_BackRef0Empty << bref; 2284 skipanchors = Anchor_BackRef0Empty << bref;
2279#ifndef QT_NO_REGEXP_OPTIM 2285#ifndef QT_NO_REGEXP_OPTIM
@@ -2290,25 +2296,25 @@ void QRegExpEngine::Box::cat( const Box& b )
2290 if ( minl == 0 ) { 2296 if ( minl == 0 ) {
2291 mergeInto( &lanchors, b.lanchors ); 2297 mergeInto( &lanchors, b.lanchors );
2292 if ( skipanchors != 0 ) { 2298 if ( skipanchors != 0 ) {
2293 for ( int i = 0; i < (int) b.ls.size(); i++ ) { 2299 for ( int i = 0; i < (int) b.ls.size(); i++ ) {
2294 int a = eng->anchorConcatenation( at(lanchors, b.ls[i]), 2300 int a = eng->anchorConcatenation( at(lanchors, b.ls[i]),
2295 skipanchors ); 2301 skipanchors );
2296 lanchors.insert( b.ls[i], a ); 2302 lanchors.insert( b.ls[i], a );
2297 } 2303 }
2298 } 2304 }
2299 mergeInto( &ls, b.ls ); 2305 mergeInto( &ls, b.ls );
2300 } 2306 }
2301 if ( b.minl == 0 ) { 2307 if ( b.minl == 0 ) {
2302 mergeInto( &ranchors, b.ranchors ); 2308 mergeInto( &ranchors, b.ranchors );
2303 if ( b.skipanchors != 0 ) { 2309 if ( b.skipanchors != 0 ) {
2304 for ( int i = 0; i < (int) rs.size(); i++ ) { 2310 for ( int i = 0; i < (int) rs.size(); i++ ) {
2305 int a = eng->anchorConcatenation( at(ranchors, rs[i]), 2311 int a = eng->anchorConcatenation( at(ranchors, rs[i]),
2306 b.skipanchors ); 2312 b.skipanchors );
2307 ranchors.insert( rs[i], a ); 2313 ranchors.insert( rs[i], a );
2308 } 2314 }
2309 } 2315 }
2310 mergeInto( &rs, b.rs ); 2316 mergeInto( &rs, b.rs );
2311 } else { 2317 } else {
2312 ranchors = b.ranchors; 2318 ranchors = b.ranchors;
2313 rs = b.rs; 2319 rs = b.rs;
2314 } 2320 }
@@ -2317,12 +2323,12 @@ void QRegExpEngine::Box::cat( const Box& b )
2317 if ( maxl != InftyLen ) { 2323 if ( maxl != InftyLen ) {
2318 if ( rightStr.length() + b.leftStr.length() > 2324 if ( rightStr.length() + b.leftStr.length() >
2319 QMAX(str.length(), b.str.length()) ) { 2325 QMAX(str.length(), b.str.length()) ) {
2320 earlyStart = minl - rightStr.length(); 2326 earlyStart = minl - rightStr.length();
2321 lateStart = maxl - rightStr.length(); 2327 lateStart = maxl - rightStr.length();
2322 str = rightStr + b.leftStr; 2328 str = rightStr + b.leftStr;
2323 } else if ( b.str.length() > str.length() ) { 2329 } else if ( b.str.length() > str.length() ) {
2324 earlyStart = minl + b.earlyStart; 2330 earlyStart = minl + b.earlyStart;
2325 lateStart = maxl + b.lateStart; 2331 lateStart = maxl + b.lateStart;
2326 str = b.str; 2332 str = b.str;
2327 } 2333 }
2328 } 2334 }
@@ -2330,12 +2336,12 @@ void QRegExpEngine::Box::cat( const Box& b )
2330 if ( (int) leftStr.length() == maxl ) 2336 if ( (int) leftStr.length() == maxl )
2331 leftStr += b.leftStr; 2337 leftStr += b.leftStr;
2332 if ( (int) b.rightStr.length() == b.maxl ) 2338 if ( (int) b.rightStr.length() == b.maxl )
2333 rightStr += b.rightStr; 2339 rightStr += b.rightStr;
2334 else 2340 else
2335 rightStr = b.rightStr; 2341 rightStr = b.rightStr;
2336 2342
2337 if ( maxl == InftyLen || b.maxl == InftyLen ) 2343 if ( maxl == InftyLen || b.maxl == InftyLen )
2338 maxl = InftyLen; 2344 maxl = InftyLen;
2339 else 2345 else
2340 maxl += b.maxl; 2346 maxl += b.maxl;
2341 2347
@@ -2343,4 +2349,4 @@ void QRegExpEngine::Box::cat( const Box& b )
2343 for ( int i = 0; i < NumBadChars; i++ ) { 2349 for ( int i = 0; i < NumBadChars; i++ ) {
2344 if ( b.occ1[i] != NoOccurrence && minl + b.occ1[i] < occ1[i] ) 2350 if ( b.occ1[i] != NoOccurrence && minl + b.occ1[i] < occ1[i] )
2345 occ1[i] = minl + b.occ1[i]; 2351 occ1[i] = minl + b.occ1[i];
2346 } 2352 }
@@ -2350,5 +2356,5 @@ void QRegExpEngine::Box::cat( const Box& b )
2350 if ( minl == 0 ) 2356 if ( minl == 0 )
2351 skipanchors = eng->anchorConcatenation( skipanchors, b.skipanchors ); 2357 skipanchors = eng->anchorConcatenation( skipanchors, b.skipanchors );
2352 else 2358 else
2353 skipanchors = 0; 2359 skipanchors = 0;
2354} 2360}
@@ -2366,4 +2372,4 @@ void QRegExpEngine::Box::orx( const Box& b )
2366 for ( int i = 0; i < NumBadChars; i++ ) { 2372 for ( int i = 0; i < NumBadChars; i++ ) {
2367 if ( occ1[i] > b.occ1[i] ) 2373 if ( occ1[i] > b.occ1[i] )
2368 occ1[i] = b.occ1[i]; 2374 occ1[i] = b.occ1[i];
2369 } 2375 }
@@ -2375,6 +2381,6 @@ void QRegExpEngine::Box::orx( const Box& b )
2375 if ( b.maxl > maxl ) 2381 if ( b.maxl > maxl )
2376 maxl = b.maxl; 2382 maxl = b.maxl;
2377#endif 2383#endif
2378 if ( b.minl < minl ) 2384 if ( b.minl < minl )
2379 minl = b.minl; 2385 minl = b.minl;
2380} 2386}
@@ -2411,8 +2417,8 @@ void QRegExpEngine::Box::catAnchor( int a )
2411 if ( a != 0 ) { 2417 if ( a != 0 ) {
2412 for ( int i = 0; i < (int) rs.size(); i++ ) { 2418 for ( int i = 0; i < (int) rs.size(); i++ ) {
2413 a = eng->anchorConcatenation( at(ranchors, rs[i]), a ); 2419 a = eng->anchorConcatenation( at(ranchors, rs[i]), a );
2414 ranchors.insert( rs[i], a ); 2420 ranchors.insert( rs[i], a );
2415 } 2421 }
2416 if ( minl == 0 ) 2422 if ( minl == 0 )
2417 skipanchors = eng->anchorConcatenation( skipanchors, a ); 2423 skipanchors = eng->anchorConcatenation( skipanchors, a );
2418 } 2424 }
@@ -2435,4 +2441,4 @@ void QRegExpEngine::Box::setupHeuristics()
2435 for ( int i = 0; i < NumBadChars; i++ ) { 2441 for ( int i = 0; i < NumBadChars; i++ ) {
2436 if ( occ1[i] != NoOccurrence && occ1[i] >= minl ) 2442 if ( occ1[i] != NoOccurrence && occ1[i] >= minl )
2437 occ1[i] = minl; 2443 occ1[i] = minl;
2438 } 2444 }
@@ -2448,18 +2454,18 @@ void QRegExpEngine::Box::dump() const
2448 int i; 2454 int i;
2449 qDebug( "Box of at least %d character%s", minl, minl == 1 ? "" : "s" ); 2455 odebug << "Box of at least " << minl << " character" << (minl == 1 ? "" : "s") << oendl;
2450 qDebug( " Left states:" ); 2456 odebug << " Left states:" << oendl;
2451 for ( i = 0; i < (int) ls.size(); i++ ) { 2457 for ( i = 0; i < (int) ls.size(); i++ ) {
2452 if ( at(lanchors, ls[i]) == 0 ) 2458 if ( at(lanchors, ls[i]) == 0 )
2453 qDebug( " %d", ls[i] ); 2459 odebug << " " << ls[i] << oendl;
2454 else 2460 else
2455 qDebug( " %d [anchors 0x%.8x]", ls[i], lanchors[ls[i]] ); 2461 odebug << " " << ls[i] << QString().sprintf(" [anchors 0x%.8x]", lanchors[ls[i]]) << oendl;
2456 } 2462 }
2457 qDebug( " Right states:" ); 2463 odebug << " Right states:" << oendl;
2458 for ( i = 0; i < (int) rs.size(); i++ ) { 2464 for ( i = 0; i < (int) rs.size(); i++ ) {
2459 if ( at(ranchors, ls[i]) == 0 ) 2465 if ( at(ranchors, ls[i]) == 0 )
2460 qDebug( " %d", rs[i] ); 2466 odebug << " " << rs[i] << oendl;
2461 else 2467 else
2462 qDebug( " %d [anchors 0x%.8x]", rs[i], ranchors[rs[i]] ); 2468 odebug << " " << rs[i] << QString().sprintf(" [anchors 0x%.8x]", ranchors[rs[i]]) << oendl;
2463 } 2469 }
2464 qDebug( " Skip anchors: 0x%.8x", skipanchors ); 2470 odebug << QString().sprintf(" Skip anchors: 0x%.8x", skipanchors) << oendl;
2465} 2471}
@@ -2470,7 +2476,7 @@ void QRegExpEngine::Box::addAnchorsToEngine( const Box& to ) const
2470 for ( int i = 0; i < (int) to.ls.size(); i++ ) { 2476 for ( int i = 0; i < (int) to.ls.size(); i++ ) {
2471 for ( int j = 0; j < (int) rs.size(); j++ ) { 2477 for ( int j = 0; j < (int) rs.size(); j++ ) {
2472 int a = eng->anchorConcatenation( at(ranchors, rs[j]), 2478 int a = eng->anchorConcatenation( at(ranchors, rs[j]),
2473 at(to.lanchors, to.ls[i]) ); 2479 at(to.lanchors, to.ls[i]) );
2474 eng->addAnchors( rs[j], to.ls[i], a ); 2480 eng->addAnchors( rs[j], to.ls[i], a );
2475 } 2481 }
2476 } 2482 }
@@ -2495,4 +2501,4 @@ int QRegExpEngine::getEscape()
2495 if ( prevCh == EOS ) { 2501 if ( prevCh == EOS ) {
2496 yyError = TRUE; 2502 yyError = TRUE;
2497 return Tok_Char | '\\'; 2503 return Tok_Char | '\\';
2498 } 2504 }
@@ -2501,5 +2507,5 @@ int QRegExpEngine::getEscape()
2501 if ( (prevCh & ~0xff) == 0 ) { 2507 if ( (prevCh & ~0xff) == 0 ) {
2502 const char *p = strchr( tab, prevCh ); 2508 const char *p = strchr( tab, prevCh );
2503 if ( p != 0 ) 2509 if ( p != 0 )
2504 return Tok_Char | backTab[p - tab]; 2510 return Tok_Char | backTab[p - tab];
2505 } 2511 }
@@ -2510,13 +2516,13 @@ int QRegExpEngine::getEscape()
2510 case '0': 2516 case '0':
2511 val = 0; 2517 val = 0;
2512 for ( i = 0; i < 3; i++ ) { 2518 for ( i = 0; i < 3; i++ ) {
2513 if ( yyCh >= '0' && yyCh <= '7' ) 2519 if ( yyCh >= '0' && yyCh <= '7' )
2514 val = ( val << 3 ) | ( yyCh - '0' ); 2520 val = ( val << 3 ) | ( yyCh - '0' );
2515 else 2521 else
2516 break; 2522 break;
2517 yyCh = getChar(); 2523 yyCh = getChar();
2518 } 2524 }
2519 if ( (val & ~0377) != 0 ) 2525 if ( (val & ~0377) != 0 )
2520 yyError = TRUE; 2526 yyError = TRUE;
2521 return Tok_Char | val; 2527 return Tok_Char | val;
2522#endif 2528#endif
@@ -2524,3 +2530,3 @@ int QRegExpEngine::getEscape()
2524 case 'B': 2530 case 'B':
2525 return Tok_NonWord; 2531 return Tok_NonWord;
2526#endif 2532#endif
@@ -2528,16 +2534,16 @@ int QRegExpEngine::getEscape()
2528 case 'D': 2534 case 'D':
2529 // see QChar::isDigit() 2535 // see QChar::isDigit()
2530 yyCharClass->addCategories( 0x7fffffef ); 2536 yyCharClass->addCategories( 0x7fffffef );
2531 return Tok_CharClass; 2537 return Tok_CharClass;
2532 case 'S': 2538 case 'S':
2533 // see QChar::isSpace() 2539 // see QChar::isSpace()
2534 yyCharClass->addCategories( 0x7ffff87f ); 2540 yyCharClass->addCategories( 0x7ffff87f );
2535 yyCharClass->addRange( 0x0000, 0x0008 ); 2541 yyCharClass->addRange( 0x0000, 0x0008 );
2536 yyCharClass->addRange( 0x000e, 0x001f ); 2542 yyCharClass->addRange( 0x000e, 0x001f );
2537 yyCharClass->addRange( 0x007f, 0x009f ); 2543 yyCharClass->addRange( 0x007f, 0x009f );
2538 return Tok_CharClass; 2544 return Tok_CharClass;
2539 case 'W': 2545 case 'W':
2540 // see QChar::isLetterOrNumber() 2546 // see QChar::isLetterOrNumber()
2541 yyCharClass->addCategories( 0x7ff07f8f ); 2547 yyCharClass->addCategories( 0x7ff07f8f );
2542 return Tok_CharClass; 2548 return Tok_CharClass;
2543#endif 2549#endif
@@ -2545,3 +2551,3 @@ int QRegExpEngine::getEscape()
2545 case 'b': 2551 case 'b':
2546 return Tok_Word; 2552 return Tok_Word;
2547#endif 2553#endif
@@ -2549,14 +2555,14 @@ int QRegExpEngine::getEscape()
2549 case 'd': 2555 case 'd':
2550 // see QChar::isDigit() 2556 // see QChar::isDigit()
2551 yyCharClass->addCategories( 0x00000010 ); 2557 yyCharClass->addCategories( 0x00000010 );
2552 return Tok_CharClass; 2558 return Tok_CharClass;
2553 case 's': 2559 case 's':
2554 // see QChar::isSpace() 2560 // see QChar::isSpace()
2555 yyCharClass->addCategories( 0x00000380 ); 2561 yyCharClass->addCategories( 0x00000380 );
2556 yyCharClass->addRange( 0x0009, 0x000d ); 2562 yyCharClass->addRange( 0x0009, 0x000d );
2557 return Tok_CharClass; 2563 return Tok_CharClass;
2558 case 'w': 2564 case 'w':
2559 // see QChar::isLetterOrNumber() 2565 // see QChar::isLetterOrNumber()
2560 yyCharClass->addCategories( 0x000f8070 ); 2566 yyCharClass->addCategories( 0x000f8070 );
2561 return Tok_CharClass; 2567 return Tok_CharClass;
2562#endif 2568#endif
@@ -2564,29 +2570,29 @@ int QRegExpEngine::getEscape()
2564 case 'x': 2570 case 'x':
2565 val = 0; 2571 val = 0;
2566 for ( i = 0; i < 4; i++ ) { 2572 for ( i = 0; i < 4; i++ ) {
2567 low = QChar( yyCh ).lower(); 2573 low = QChar( yyCh ).lower();
2568 if ( low >= '0' && low <= '9' ) 2574 if ( low >= '0' && low <= '9' )
2569 val = ( val << 4 ) | ( low - '0' ); 2575 val = ( val << 4 ) | ( low - '0' );
2570 else if ( low >= 'a' && low <= 'f' ) 2576 else if ( low >= 'a' && low <= 'f' )
2571 val = ( val << 4 ) | ( low - 'a' + 10 ); 2577 val = ( val << 4 ) | ( low - 'a' + 10 );
2572 else 2578 else
2573 break; 2579 break;
2574 yyCh = getChar(); 2580 yyCh = getChar();
2575 } 2581 }
2576 return Tok_Char | val; 2582 return Tok_Char | val;
2577#endif 2583#endif
2578 default: 2584 default:
2579 if ( prevCh >= '1' && prevCh <= '9' ) { 2585 if ( prevCh >= '1' && prevCh <= '9' ) {
2580#ifndef QT_NO_REGEXP_BACKREF 2586#ifndef QT_NO_REGEXP_BACKREF
2581 val = prevCh - '0'; 2587 val = prevCh - '0';
2582 while ( yyCh >= '0' && yyCh <= '9' ) { 2588 while ( yyCh >= '0' && yyCh <= '9' ) {
2583 val = ( val *= 10 ) | ( yyCh - '0' ); 2589 val = ( val *= 10 ) | ( yyCh - '0' );
2584 yyCh = getChar(); 2590 yyCh = getChar();
2585 } 2591 }
2586 return Tok_BackRef | val; 2592 return Tok_BackRef | val;
2587#else 2593#else
2588 yyError = TRUE; 2594 yyError = TRUE;
2589#endif 2595#endif
2590 } 2596 }
2591 return Tok_Char | prevCh; 2597 return Tok_Char | prevCh;
2592 } 2598 }
@@ -2598,14 +2604,14 @@ int QRegExpEngine::getRep( int def )
2598 if ( yyCh >= '0' && yyCh <= '9' ) { 2604 if ( yyCh >= '0' && yyCh <= '9' ) {
2599 int rep = 0; 2605 int rep = 0;
2600 do { 2606 do {
2601 rep = 10 * rep + yyCh - '0'; 2607 rep = 10 * rep + yyCh - '0';
2602 if ( rep >= InftyRep ) { 2608 if ( rep >= InftyRep ) {
2603 yyError = TRUE; 2609 yyError = TRUE;
2604 rep = def; 2610 rep = def;
2605 } 2611 }
2606 yyCh = getChar(); 2612 yyCh = getChar();
2607 } while ( yyCh >= '0' && yyCh <= '9' ); 2613 } while ( yyCh >= '0' && yyCh <= '9' );
2608 return rep; 2614 return rep;
2609 } else { 2615 } else {
2610 return def; 2616 return def;
2611 } 2617 }
@@ -2618,4 +2624,4 @@ void QRegExpEngine::skipChars( int n )
2618 if ( n > 0 ) { 2624 if ( n > 0 ) {
2619 yyPos += n - 1; 2625 yyPos += n - 1;
2620 yyCh = getChar(); 2626 yyCh = getChar();
2621 } 2627 }
@@ -2656,137 +2662,137 @@ int QRegExpEngine::getToken()
2656 case EOS: 2662 case EOS:
2657 yyPos0 = yyPos; 2663 yyPos0 = yyPos;
2658 return Tok_Eos; 2664 return Tok_Eos;
2659 case '$': 2665 case '$':
2660 return Tok_Dollar; 2666 return Tok_Dollar;
2661 case '(': 2667 case '(':
2662 if ( yyCh == '?' ) { 2668 if ( yyCh == '?' ) {
2663 prevCh = getChar(); 2669 prevCh = getChar();
2664 yyCh = getChar(); 2670 yyCh = getChar();
2665 switch ( prevCh ) { 2671 switch ( prevCh ) {
2666#ifndef QT_NO_REGEXP_LOOKAHEAD 2672#ifndef QT_NO_REGEXP_LOOKAHEAD
2667 case '!': 2673 case '!':
2668 return Tok_NegLookahead; 2674 return Tok_NegLookahead;
2669 case '=': 2675 case '=':
2670 return Tok_PosLookahead; 2676 return Tok_PosLookahead;
2671#endif 2677#endif
2672 case ':': 2678 case ':':
2673 return Tok_MagicLeftParen; 2679 return Tok_MagicLeftParen;
2674 default: 2680 default:
2675 yyError = TRUE; 2681 yyError = TRUE;
2676 return Tok_MagicLeftParen; 2682 return Tok_MagicLeftParen;
2677 } 2683 }
2678 } else { 2684 } else {
2679 return Tok_LeftParen; 2685 return Tok_LeftParen;
2680 } 2686 }
2681 case ')': 2687 case ')':
2682 return Tok_RightParen; 2688 return Tok_RightParen;
2683 case '*': 2689 case '*':
2684 yyMinRep = 0; 2690 yyMinRep = 0;
2685 yyMaxRep = InftyRep; 2691 yyMaxRep = InftyRep;
2686 return Tok_Quantifier; 2692 return Tok_Quantifier;
2687 case '+': 2693 case '+':
2688 yyMinRep = 1; 2694 yyMinRep = 1;
2689 yyMaxRep = InftyRep; 2695 yyMaxRep = InftyRep;
2690 return Tok_Quantifier; 2696 return Tok_Quantifier;
2691 case '.': 2697 case '.':
2692#ifndef QT_NO_REGEXP_CCLASS 2698#ifndef QT_NO_REGEXP_CCLASS
2693 yyCharClass->setNegative( TRUE ); 2699 yyCharClass->setNegative( TRUE );
2694#endif 2700#endif
2695 return Tok_CharClass; 2701 return Tok_CharClass;
2696 case '?': 2702 case '?':
2697 yyMinRep = 0; 2703 yyMinRep = 0;
2698 yyMaxRep = 1; 2704 yyMaxRep = 1;
2699 return Tok_Quantifier; 2705 return Tok_Quantifier;
2700 case '[': 2706 case '[':
2701#ifndef QT_NO_REGEXP_CCLASS 2707#ifndef QT_NO_REGEXP_CCLASS
2702 if ( yyCh == '^' ) { 2708 if ( yyCh == '^' ) {
2703 yyCharClass->setNegative( TRUE ); 2709 yyCharClass->setNegative( TRUE );
2704 yyCh = getChar(); 2710 yyCh = getChar();
2705 } 2711 }
2706 charPending = FALSE; 2712 charPending = FALSE;
2707 rangePending = FALSE; 2713 rangePending = FALSE;
2708 do { 2714 do {
2709 if ( yyCh == '-' && charPending && !rangePending ) { 2715 if ( yyCh == '-' && charPending && !rangePending ) {
2710 rangePending = TRUE; 2716 rangePending = TRUE;
2711 yyCh = getChar(); 2717 yyCh = getChar();
2712 } else { 2718 } else {
2713 if ( charPending && !rangePending ) { 2719 if ( charPending && !rangePending ) {
2714 yyCharClass->addSingleton( pendingCh ); 2720 yyCharClass->addSingleton( pendingCh );
2715 charPending = FALSE; 2721 charPending = FALSE;
2716 } 2722 }
2717 if ( yyCh == '\\' ) { 2723 if ( yyCh == '\\' ) {
2718 yyCh = getChar(); 2724 yyCh = getChar();
2719 tok = getEscape(); 2725 tok = getEscape();
2720 if ( tok == Tok_Word ) 2726 if ( tok == Tok_Word )
2721 tok = '\b'; 2727 tok = '\b';
2722 } else { 2728 } else {
2723 tok = Tok_Char | yyCh; 2729 tok = Tok_Char | yyCh;
2724 yyCh = getChar(); 2730 yyCh = getChar();
2725 } 2731 }
2726 if ( tok == Tok_CharClass ) { 2732 if ( tok == Tok_CharClass ) {
2727 if ( rangePending ) { 2733 if ( rangePending ) {
2728 yyCharClass->addSingleton( '-' ); 2734 yyCharClass->addSingleton( '-' );
2729 yyCharClass->addSingleton( pendingCh ); 2735 yyCharClass->addSingleton( pendingCh );
2730 charPending = FALSE; 2736 charPending = FALSE;
2731 rangePending = FALSE; 2737 rangePending = FALSE;
2732 } 2738 }
2733 } else if ( (tok & Tok_Char) != 0 ) { 2739 } else if ( (tok & Tok_Char) != 0 ) {
2734 if ( rangePending ) { 2740 if ( rangePending ) {
2735 yyCharClass->addRange( pendingCh, tok ^ Tok_Char ); 2741 yyCharClass->addRange( pendingCh, tok ^ Tok_Char );
2736 charPending = FALSE; 2742 charPending = FALSE;
2737 rangePending = FALSE; 2743 rangePending = FALSE;
2738 } else { 2744 } else {
2739 pendingCh = tok ^ Tok_Char; 2745 pendingCh = tok ^ Tok_Char;
2740 charPending = TRUE; 2746 charPending = TRUE;
2741 } 2747 }
2742 } else { 2748 } else {
2743 yyError = TRUE; 2749 yyError = TRUE;
2744 } 2750 }
2745 } 2751 }
2746 } while ( yyCh != ']' && yyCh != EOS ); 2752 } while ( yyCh != ']' && yyCh != EOS );
2747 if ( rangePending ) 2753 if ( rangePending )
2748 yyCharClass->addSingleton( '-' ); 2754 yyCharClass->addSingleton( '-' );
2749 if ( charPending ) 2755 if ( charPending )
2750 yyCharClass->addSingleton( pendingCh ); 2756 yyCharClass->addSingleton( pendingCh );
2751 if ( yyCh == EOS ) 2757 if ( yyCh == EOS )
2752 yyError = TRUE; 2758 yyError = TRUE;
2753 else 2759 else
2754 yyCh = getChar(); 2760 yyCh = getChar();
2755 return Tok_CharClass; 2761 return Tok_CharClass;
2756#else 2762#else
2757 yyError = TRUE; 2763 yyError = TRUE;
2758 return Tok_Char | '['; 2764 return Tok_Char | '[';
2759#endif 2765#endif
2760 case '\\': 2766 case '\\':
2761 return getEscape(); 2767 return getEscape();
2762 case ']': 2768 case ']':
2763 yyError = TRUE; 2769 yyError = TRUE;
2764 return Tok_Char | ']'; 2770 return Tok_Char | ']';
2765 case '^': 2771 case '^':
2766 return Tok_Caret; 2772 return Tok_Caret;
2767#ifndef QT_NO_REGEXP_INTERVAL 2773#ifndef QT_NO_REGEXP_INTERVAL
2768 case '{': 2774 case '{':
2769 yyMinRep = getRep( 0 ); 2775 yyMinRep = getRep( 0 );
2770 yyMaxRep = yyMinRep; 2776 yyMaxRep = yyMinRep;
2771 if ( yyCh == ',' ) { 2777 if ( yyCh == ',' ) {
2772 yyCh = getChar(); 2778 yyCh = getChar();
2773 yyMaxRep = getRep( InftyRep ); 2779 yyMaxRep = getRep( InftyRep );
2774 } 2780 }
2775 if ( yyMaxRep < yyMinRep ) 2781 if ( yyMaxRep < yyMinRep )
2776 qSwap( yyMinRep, yyMaxRep ); 2782 qSwap( yyMinRep, yyMaxRep );
2777 if ( yyCh != '}' ) 2783 if ( yyCh != '}' )
2778 yyError = TRUE; 2784 yyError = TRUE;
2779 yyCh = getChar(); 2785 yyCh = getChar();
2780 return Tok_Quantifier; 2786 return Tok_Quantifier;
2781#else 2787#else
2782 yyError = TRUE; 2788 yyError = TRUE;
2783 return Tok_Char | '{'; 2789 return Tok_Char | '{';
2784#endif 2790#endif
2785 case '|': 2791 case '|':
2786 return Tok_Bar; 2792 return Tok_Bar;
2787 case '}': 2793 case '}':
2788 yyError = TRUE; 2794 yyError = TRUE;
2789 return Tok_Char | '}'; 2795 return Tok_Char | '}';
2790 default: 2796 default:
2791 return Tok_Char | prevCh; 2797 return Tok_Char | prevCh;
2792 } 2798 }
@@ -2830,3 +2836,3 @@ int QRegExpEngine::parse( const QChar *pattern, int len )
2830 if ( nbrefs > ncap ) 2836 if ( nbrefs > ncap )
2831 ncap = nbrefs; 2837 ncap = nbrefs;
2832#endif 2838#endif
@@ -2865,3 +2871,3 @@ int QRegExpEngine::parse( const QChar *pattern, int len )
2865 if ( yyError ) 2871 if ( yyError )
2866 return -1; 2872 return -1;
2867 2873
@@ -2871,14 +2877,14 @@ int QRegExpEngine::parse( const QChar *pattern, int len )
2871 if ( caretAnchored ) { 2877 if ( caretAnchored ) {
2872 QMap<int, int>& anchors = *sinit->anchors; 2878 QMap<int, int>& anchors = *sinit->anchors;
2873 QMap<int, int>::ConstIterator a; 2879 QMap<int, int>::ConstIterator a;
2874 for ( a = anchors.begin(); a != anchors.end(); ++a ) { 2880 for ( a = anchors.begin(); a != anchors.end(); ++a ) {
2875#ifndef QT_NO_REGEXP_ANCHOR_ALT 2881#ifndef QT_NO_REGEXP_ANCHOR_ALT
2876 if ( (*a & Anchor_Alternation) != 0 ) 2882 if ( (*a & Anchor_Alternation) != 0 )
2877 break; 2883 break;
2878#endif 2884#endif
2879 if ( (*a & Anchor_Caret) == 0 ) { 2885 if ( (*a & Anchor_Caret) == 0 ) {
2880 caretAnchored = FALSE; 2886 caretAnchored = FALSE;
2881 break; 2887 break;
2882 } 2888 }
2883 } 2889 }
2884 } 2890 }
@@ -2898,7 +2904,7 @@ void QRegExpEngine::parseAtom( Box *box )
2898 case Tok_Dollar: 2904 case Tok_Dollar:
2899 box->catAnchor( Anchor_Dollar ); 2905 box->catAnchor( Anchor_Dollar );
2900 break; 2906 break;
2901 case Tok_Caret: 2907 case Tok_Caret:
2902 box->catAnchor( Anchor_Caret ); 2908 box->catAnchor( Anchor_Caret );
2903 break; 2909 break;
2904#ifndef QT_NO_REGEXP_LOOKAHEAD 2910#ifndef QT_NO_REGEXP_LOOKAHEAD
@@ -2906,14 +2912,14 @@ void QRegExpEngine::parseAtom( Box *box )
2906 case Tok_NegLookahead: 2912 case Tok_NegLookahead:
2907 neg = ( yyTok == Tok_NegLookahead ); 2913 neg = ( yyTok == Tok_NegLookahead );
2908 eng = new QRegExpEngine( cs ); 2914 eng = new QRegExpEngine( cs );
2909 len = eng->parse( yyIn + yyPos - 1, yyLen - yyPos + 1 ); 2915 len = eng->parse( yyIn + yyPos - 1, yyLen - yyPos + 1 );
2910 if ( len >= 0 ) 2916 if ( len >= 0 )
2911 skipChars( len ); 2917 skipChars( len );
2912 else 2918 else
2913 yyError = TRUE; 2919 yyError = TRUE;
2914 box->catAnchor( addLookahead(eng, neg) ); 2920 box->catAnchor( addLookahead(eng, neg) );
2915 yyTok = getToken(); 2921 yyTok = getToken();
2916 if ( yyTok != Tok_RightParen ) 2922 if ( yyTok != Tok_RightParen )
2917 yyError = TRUE; 2923 yyError = TRUE;
2918 break; 2924 break;
2919#endif 2925#endif
@@ -2921,7 +2927,7 @@ void QRegExpEngine::parseAtom( Box *box )
2921 case Tok_Word: 2927 case Tok_Word:
2922 box->catAnchor( Anchor_Word ); 2928 box->catAnchor( Anchor_Word );
2923 break; 2929 break;
2924 case Tok_NonWord: 2930 case Tok_NonWord:
2925 box->catAnchor( Anchor_NonWord ); 2931 box->catAnchor( Anchor_NonWord );
2926 break; 2932 break;
2927#endif 2933#endif
@@ -2929,19 +2935,19 @@ void QRegExpEngine::parseAtom( Box *box )
2929 case Tok_MagicLeftParen: 2935 case Tok_MagicLeftParen:
2930 yyTok = getToken(); 2936 yyTok = getToken();
2931 parseExpression( box ); 2937 parseExpression( box );
2932 if ( yyTok != Tok_RightParen ) 2938 if ( yyTok != Tok_RightParen )
2933 yyError = TRUE; 2939 yyError = TRUE;
2934 break; 2940 break;
2935 case Tok_CharClass: 2941 case Tok_CharClass:
2936 box->set( *yyCharClass ); 2942 box->set( *yyCharClass );
2937 break; 2943 break;
2938 default: 2944 default:
2939 if ( (yyTok & Tok_Char) != 0 ) 2945 if ( (yyTok & Tok_Char) != 0 )
2940 box->set( QChar(yyTok ^ Tok_Char) ); 2946 box->set( QChar(yyTok ^ Tok_Char) );
2941#ifndef QT_NO_REGEXP_BACKREF 2947#ifndef QT_NO_REGEXP_BACKREF
2942 else if ( (yyTok & Tok_BackRef) != 0 ) 2948 else if ( (yyTok & Tok_BackRef) != 0 )
2943 box->set( yyTok ^ Tok_BackRef ); 2949 box->set( yyTok ^ Tok_BackRef );
2944#endif 2950#endif
2945 else 2951 else
2946 yyError = TRUE; 2952 yyError = TRUE;
2947 } 2953 }
@@ -2960,4 +2966,4 @@ void QRegExpEngine::parseFactor( Box *box )
2960#define YYREDO() \ 2966#define YYREDO() \
2961 yyIn = in, yyPos0 = pos0, yyPos = pos, yyLen = len, yyCh = ch, \ 2967 yyIn = in, yyPos0 = pos0, yyPos = pos, yyLen = len, yyCh = ch, \
2962 *yyCharClass = charClass, yyMinRep = 0, yyMaxRep = 0, yyTok = tok 2968 *yyCharClass = charClass, yyMinRep = 0, yyMaxRep = 0, yyTok = tok
2963 2969
@@ -2970,3 +2976,3 @@ void QRegExpEngine::parseFactor( Box *box )
2970 if ( yyTok == Tok_CharClass ) 2976 if ( yyTok == Tok_CharClass )
2971 charClass = *yyCharClass; 2977 charClass = *yyCharClass;
2972 int tok = yyTok; 2978 int tok = yyTok;
@@ -2981,41 +2987,41 @@ void QRegExpEngine::parseFactor( Box *box )
2981 if ( yyTok == Tok_Quantifier ) { 2987 if ( yyTok == Tok_Quantifier ) {
2982 if ( yyMaxRep == InftyRep ) { 2988 if ( yyMaxRep == InftyRep ) {
2983 box->plus( atom ); 2989 box->plus( atom );
2984#ifndef QT_NO_REGEXP_INTERVAL 2990#ifndef QT_NO_REGEXP_INTERVAL
2985 } else if ( yyMaxRep == 0 ) { 2991 } else if ( yyMaxRep == 0 ) {
2986 box->clear(); 2992 box->clear();
2987#endif 2993#endif
2988 } 2994 }
2989 if ( yyMinRep == 0 ) 2995 if ( yyMinRep == 0 )
2990 box->opt(); 2996 box->opt();
2991 2997
2992#ifndef QT_NO_REGEXP_INTERVAL 2998#ifndef QT_NO_REGEXP_INTERVAL
2993 yyMayCapture = FALSE; 2999 yyMayCapture = FALSE;
2994 int alpha = ( yyMinRep == 0 ) ? 0 : yyMinRep - 1; 3000 int alpha = ( yyMinRep == 0 ) ? 0 : yyMinRep - 1;
2995 int beta = ( yyMaxRep == InftyRep ) ? 0 : yyMaxRep - ( alpha + 1 ); 3001 int beta = ( yyMaxRep == InftyRep ) ? 0 : yyMaxRep - ( alpha + 1 );
2996 3002
2997 Box rightBox( this ); 3003 Box rightBox( this );
2998 int i; 3004 int i;
2999 3005
3000 for ( i = 0; i < beta; i++ ) { 3006 for ( i = 0; i < beta; i++ ) {
3001 YYREDO(); 3007 YYREDO();
3002 Box leftBox( this ); 3008 Box leftBox( this );
3003 parseAtom( &leftBox ); 3009 parseAtom( &leftBox );
3004 leftBox.cat( rightBox ); 3010 leftBox.cat( rightBox );
3005 leftBox.opt(); 3011 leftBox.opt();
3006 rightBox = leftBox; 3012 rightBox = leftBox;
3007 } 3013 }
3008 for ( i = 0; i < alpha; i++ ) { 3014 for ( i = 0; i < alpha; i++ ) {
3009 YYREDO(); 3015 YYREDO();
3010 Box leftBox( this ); 3016 Box leftBox( this );
3011 parseAtom( &leftBox ); 3017 parseAtom( &leftBox );
3012 leftBox.cat( rightBox ); 3018 leftBox.cat( rightBox );
3013 rightBox = leftBox; 3019 rightBox = leftBox;
3014 } 3020 }
3015 rightBox.cat( *box ); 3021 rightBox.cat( *box );
3016 *box = rightBox; 3022 *box = rightBox;
3017#endif 3023#endif
3018 yyTok = getToken(); 3024 yyTok = getToken();
3019#ifndef QT_NO_REGEXP_INTERVAL 3025#ifndef QT_NO_REGEXP_INTERVAL
3020 yyMayCapture = mayCapture; 3026 yyMayCapture = mayCapture;
3021#endif 3027#endif
@@ -3029,8 +3035,8 @@ void QRegExpEngine::parseTerm( Box *box )
3029 if ( yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar ) 3035 if ( yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar )
3030 parseFactor( box ); 3036 parseFactor( box );
3031#endif 3037#endif
3032 while ( yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar ) { 3038 while ( yyTok != Tok_Eos && yyTok != Tok_RightParen && yyTok != Tok_Bar ) {
3033 Box rightBox( this ); 3039 Box rightBox( this );
3034 parseFactor( &rightBox ); 3040 parseFactor( &rightBox );
3035 box->cat( rightBox ); 3041 box->cat( rightBox );
3036 } 3042 }
@@ -3042,6 +3048,6 @@ void QRegExpEngine::parseExpression( Box *box )
3042 while ( yyTok == Tok_Bar ) { 3048 while ( yyTok == Tok_Bar ) {
3043 Box rightBox( this ); 3049 Box rightBox( this );
3044 yyTok = getToken(); 3050 yyTok = getToken();
3045 parseTerm( &rightBox ); 3051 parseTerm( &rightBox );
3046 box->orx( rightBox ); 3052 box->orx( rightBox );
3047 } 3053 }
@@ -3079,9 +3085,9 @@ static QRegExpEngine *newEngine( const QString& pattern, bool caseSensitive )
3079 if ( engineCache != 0 ) { 3085 if ( engineCache != 0 ) {
3080 QRegExpEngine *eng = engineCache->take( pattern ); 3086 QRegExpEngine *eng = engineCache->take( pattern );
3081 if ( eng == 0 || eng->caseSensitive() != caseSensitive ) { 3087 if ( eng == 0 || eng->caseSensitive() != caseSensitive ) {
3082 delete eng; 3088 delete eng;
3083 } else { 3089 } else {
3084 eng->ref(); 3090 eng->ref();
3085 return eng; 3091 return eng;
3086 } 3092 }
3087 } 3093 }
@@ -3095,13 +3101,13 @@ static void derefEngine( QRegExpEngine *eng, const QString& pattern )
3095#ifndef QT_NO_REGEXP_OPTIM 3101#ifndef QT_NO_REGEXP_OPTIM
3096 if ( engineCache == 0 ) { 3102 if ( engineCache == 0 ) {
3097 engineCache = new QCache<QRegExpEngine>; 3103 engineCache = new QCache<QRegExpEngine>;
3098 engineCache->setAutoDelete( TRUE ); 3104 engineCache->setAutoDelete( TRUE );
3099 } 3105 }
3100 if ( !pattern.isNull() && 3106 if ( !pattern.isNull() &&
3101 engineCache->insert(pattern, eng, 4 + pattern.length() / 4) ) 3107 engineCache->insert(pattern, eng, 4 + pattern.length() / 4) )
3102 return; 3108 return;
3103#else 3109#else
3104 Q_UNUSED( pattern ); 3110 Q_UNUSED( pattern );
3105#endif 3111#endif
3106 delete eng; 3112 delete eng;
3107 } 3113 }
@@ -3203,7 +3209,7 @@ bool QRegExp3::operator==( const QRegExp3& rx ) const
3203 return priv->pattern == rx.priv->pattern && 3209 return priv->pattern == rx.priv->pattern &&
3204 eng->caseSensitive() == rx.eng->caseSensitive() && 3210 eng->caseSensitive() == rx.eng->caseSensitive() &&
3205#ifndef QT_NO_REGEXP_WILDCARD 3211#ifndef QT_NO_REGEXP_WILDCARD
3206 priv->wc == rx.priv->wc && 3212 priv->wc == rx.priv->wc &&
3207#endif 3213#endif
3208 priv->min == rx.priv->min; 3214 priv->min == rx.priv->min;
3209} 3215}
@@ -3274,4 +3280,4 @@ void QRegExp3::setPattern( const QString& pattern )
3274 if ( priv->pattern != pattern ) { 3280 if ( priv->pattern != pattern ) {
3275 priv->pattern = pattern; 3281 priv->pattern = pattern;
3276 compile( caseSensitive() ); 3282 compile( caseSensitive() );
3277 } 3283 }
@@ -3301,3 +3307,3 @@ void QRegExp3::setCaseSensitive( bool sensitive )
3301 if ( sensitive != eng->caseSensitive() ) 3307 if ( sensitive != eng->caseSensitive() )
3302 compile( sensitive ); 3308 compile( sensitive );
3303} 3309}
@@ -3330,4 +3336,4 @@ void QRegExp3::setWildcard( bool wildcard )
3330 if ( wildcard != priv->wc ) { 3336 if ( wildcard != priv->wc ) {
3331 priv->wc = wildcard; 3337 priv->wc = wildcard;
3332 compile( caseSensitive() ); 3338 compile( caseSensitive() );
3333 } 3339 }
@@ -3393,8 +3399,8 @@ bool QRegExp3::exactMatch( const QString& str )
3393 if ( priv->captured[1] == (int) str.length() ) { 3399 if ( priv->captured[1] == (int) str.length() ) {
3394 return TRUE; 3400 return TRUE;
3395 } else { 3401 } else {
3396 priv->captured.detach(); 3402 priv->captured.detach();
3397 priv->captured[0] = 0; 3403 priv->captured[0] = 0;
3398 priv->captured[1] = eng->matchedLength(); 3404 priv->captured[1] = eng->matchedLength();
3399 return FALSE; 3405 return FALSE;
3400 } 3406 }
@@ -3409,3 +3415,3 @@ bool QRegExp3::exactMatch( const QString& str ) const
3409 return eng->match(str, 0, priv->min, TRUE)[0] == 0 && 3415 return eng->match(str, 0, priv->min, TRUE)[0] == 0 &&
3410 eng->matchedLength() == (int) str.length(); 3416 eng->matchedLength() == (int) str.length();
3411} 3417}
@@ -3431,3 +3437,3 @@ bool QRegExp3::exactMatch( const QString& str ) const
3431 if ( pos != -1 ) 3437 if ( pos != -1 )
3432 pos += index; 3438 pos += index;
3433 int len = rx.matchedLength(); 3439 int len = rx.matchedLength();
@@ -3435,5 +3441,5 @@ bool QRegExp3::exactMatch( const QString& str ) const
3435*/ 3441*/
3436#ifndef QT_NO_COMPAT 3442#ifndef QT_NO_COMPAT
3437int QRegExp3::match( const QString& str, int index, int *len, 3443int QRegExp3::match( const QString& str, int index, int *len,
3438 bool indexIsStart ) 3444 bool indexIsStart )
3439{ 3445{
@@ -3441,15 +3447,15 @@ int QRegExp3::match( const QString& str, int index, int *len,
3441 if ( indexIsStart ) { 3447 if ( indexIsStart ) {
3442 pos = search( str.mid(index) ); 3448 pos = search( str.mid(index) );
3443 if ( pos >= 0 ) { 3449 if ( pos >= 0 ) {
3444 pos += index; 3450 pos += index;
3445 if ( len != 0 ) 3451 if ( len != 0 )
3446 *len = matchedLength(); 3452 *len = matchedLength();
3447 } else { 3453 } else {
3448 if ( len != 0 ) 3454 if ( len != 0 )
3449 *len = 0; 3455 *len = 0;
3450 } 3456 }
3451 } else { 3457 } else {
3452 pos = search( str, index ); 3458 pos = search( str, index );
3453 if ( len != 0 ) 3459 if ( len != 0 )
3454 *len = matchedLength(); 3460 *len = matchedLength();
3455 } 3461 }
@@ -3476,4 +3482,4 @@ int QRegExp3::match( const QString& str, int index, int *len,
3476 while ( pos >= 0 ) { 3482 while ( pos >= 0 ) {
3477 pos = rx.search( str, pos ); 3483 pos = rx.search( str, pos );
3478 count++; 3484 count++;
3479 } 3485 }
@@ -3490,7 +3496,7 @@ const QString makeString(const QChar *str)
3490// A sentinel value checked in case the QChar *ptr is never null terminated 3496// A sentinel value checked in case the QChar *ptr is never null terminated
3491 const uint MAXLENGTH=65535; 3497 const uint MAXLENGTH=65535;
3492 3498
3493 const QChar *s=str; 3499 const QChar *s=str;
3494 uint i=0; 3500 uint i=0;
3495 while(i < MAXLENGTH && *s != QChar::null) { i++;s++ ;} 3501 while(i < MAXLENGTH && *s != QChar::null) { i++;s++ ;}
3496 return QString(str,i); 3502 return QString(str,i);
@@ -3500,3 +3506,3 @@ int QRegExp3::search(const QChar *str,int start)
3500{ 3506{
3501 return search(makeString(str),start); 3507 return search(makeString(str),start);
3502} 3508}
@@ -3504,3 +3510,3 @@ int QRegExp3::search(const QChar *str,int start) const
3504{ 3510{
3505 return search(makeString(str),start); 3511 return search(makeString(str),start);
3506} 3512}
@@ -3508,3 +3514,3 @@ int QRegExp3::searchRev(const QChar *str,int start)
3508{ 3514{
3509 return searchRev(makeString(str),start); 3515 return searchRev(makeString(str),start);
3510} 3516}
@@ -3512,3 +3518,3 @@ int QRegExp3::searchRev(const QChar *str,int start) const
3512{ 3518{
3513 return searchRev(makeString(str),start); 3519 return searchRev(makeString(str),start);
3514} 3520}
@@ -3516,3 +3522,3 @@ bool QRegExp3::exactMatch(const QChar *str)
3516{ 3522{
3517 return exactMatch(makeString(str)); 3523 return exactMatch(makeString(str));
3518} 3524}
@@ -3520,3 +3526,3 @@ bool QRegExp3::exactMatch(const QChar *str) const
3520{ 3526{
3521 return exactMatch(makeString(str)); 3527 return exactMatch(makeString(str));
3522} 3528}
@@ -3527,3 +3533,3 @@ int QRegExp3::search( const QString& str, int start )
3527 if ( start < 0 ) 3533 if ( start < 0 )
3528 start += str.length(); 3534 start += str.length();
3529#ifndef QT_NO_REGEXP_CAPTURE 3535#ifndef QT_NO_REGEXP_CAPTURE
@@ -3543,3 +3549,3 @@ int QRegExp3::search( const QString& str, int start ) const
3543 if ( start < 0 ) 3549 if ( start < 0 )
3544 start += str.length(); 3550 start += str.length();
3545 return eng->match( str, start, priv->min, FALSE )[0]; 3551 return eng->match( str, start, priv->min, FALSE )[0];
@@ -3561,3 +3567,3 @@ int QRegExp3::searchRev( const QString& str, int start )
3561 if ( start < 0 ) 3567 if ( start < 0 )
3562 start += str.length(); 3568 start += str.length();
3563#ifndef QT_NO_REGEXP_CAPTURE 3569#ifndef QT_NO_REGEXP_CAPTURE
@@ -3567,5 +3573,5 @@ int QRegExp3::searchRev( const QString& str, int start )
3567 if ( start < 0 || start > (int) str.length() ) { 3573 if ( start < 0 || start > (int) str.length() ) {
3568 priv->captured.detach(); 3574 priv->captured.detach();
3569 priv->captured.fill( -1 ); 3575 priv->captured.fill( -1 );
3570 return -1; 3576 return -1;
3571 } 3577 }
@@ -3573,6 +3579,6 @@ int QRegExp3::searchRev( const QString& str, int start )
3573 while ( start >= 0 ) { 3579 while ( start >= 0 ) {
3574 priv->captured = eng->match( str, start, priv->min, TRUE ); 3580 priv->captured = eng->match( str, start, priv->min, TRUE );
3575 if ( priv->captured[0] == start ) 3581 if ( priv->captured[0] == start )
3576 return start; 3582 return start;
3577 start--; 3583 start--;
3578 } 3584 }
@@ -3588,10 +3594,10 @@ int QRegExp3::searchRev( const QString& str, int start ) const
3588 if ( start < 0 ) 3594 if ( start < 0 )
3589 start += str.length(); 3595 start += str.length();
3590 if ( start < 0 || start > (int) str.length() ) 3596 if ( start < 0 || start > (int) str.length() )
3591 return -1; 3597 return -1;
3592 3598
3593 while ( start >= 0 ) { 3599 while ( start >= 0 ) {
3594 if ( eng->match(str, start, priv->min, TRUE)[0] == start ) 3600 if ( eng->match(str, start, priv->min, TRUE)[0] == start )
3595 return start; 3601 return start;
3596 start--; 3602 start--;
3597 } 3603 }
@@ -3658,12 +3664,12 @@ QStringList QRegExp3::capturedTexts()
3658 if ( priv->capturedCache.isEmpty() ) { 3664 if ( priv->capturedCache.isEmpty() ) {
3659 for ( int i = 0; i < (int) priv->captured.size(); i += 2 ) { 3665 for ( int i = 0; i < (int) priv->captured.size(); i += 2 ) {
3660 QString m; 3666 QString m;
3661 if ( priv->captured[i + 1] == 0 ) 3667 if ( priv->captured[i + 1] == 0 )
3662 m = QString::fromLatin1( "" ); 3668 m = QString::fromLatin1( "" );
3663 else if ( priv->captured[i] >= 0 ) 3669 else if ( priv->captured[i] >= 0 )
3664 m = priv->t.mid( priv->captured[i], 3670 m = priv->t.mid( priv->captured[i],
3665 priv->captured[i + 1] ); 3671 priv->captured[i + 1] );
3666 priv->capturedCache.append( m ); 3672 priv->capturedCache.append( m );
3667 } 3673 }
3668 priv->t = QString::null; 3674 priv->t = QString::null;
3669 } 3675 }
@@ -3680,5 +3686,5 @@ QStringList QRegExp3::capturedTexts()
3680 if ( pos > -1 ) { 3686 if ( pos > -1 ) {
3681 QString value = rxlen.cap( 1 );// "189" 3687 QString value = rxlen.cap( 1 ); // "189"
3682 QString unit = rxlen.cap( 2 ); // "cm" 3688 QString unit = rxlen.cap( 2 ); // "cm"
3683 // ... 3689 // ...
3684 } 3690 }
@@ -3696,7 +3702,7 @@ QStringList QRegExp3::capturedTexts()
3696 while ( pos >= 0 ) { 3702 while ( pos >= 0 ) {
3697 pos = rx.search( str, pos ); 3703 pos = rx.search( str, pos );
3698 if ( pos > -1 ) { 3704 if ( pos > -1 ) {
3699 list += rx.cap( 1 ); 3705 list += rx.cap( 1 );
3700 pos += rx.matchedLength(); 3706 pos += rx.matchedLength();
3701 } 3707 }
3702 } 3708 }
@@ -3716,5 +3722,5 @@ QString QRegExp3::cap( int nth )
3716 if ( nth < 0 || nth >= (int) priv->captured.size() / 2 ) 3722 if ( nth < 0 || nth >= (int) priv->captured.size() / 2 )
3717 return QString::null; 3723 return QString::null;
3718 else 3724 else
3719 return capturedTexts()[nth]; 3725 return capturedTexts()[nth];
3720} 3726}
@@ -3728,3 +3734,3 @@ QString QRegExp3::cap( int nth )
3728 QRegExp3 rx( "/([a-z]+)/([a-z]+)" ); 3734 QRegExp3 rx( "/([a-z]+)/([a-z]+)" );
3729 rx.search( "Output /dev/null" );// Returns 7 (position of /dev/null) 3735 rx.search( "Output /dev/null" ); // Returns 7 (position of /dev/null)
3730 rx.pos( 0 ); // Returns 7 (position of /dev/null) 3736 rx.pos( 0 ); // Returns 7 (position of /dev/null)
@@ -3743,5 +3749,5 @@ int QRegExp3::pos( int nth )
3743 if ( nth < 0 || nth >= (int) priv->captured.size() / 2 ) 3749 if ( nth < 0 || nth >= (int) priv->captured.size() / 2 )
3744 return -1; 3750 return -1;
3745 else 3751 else
3746 return priv->captured[2 * nth]; 3752 return priv->captured[2 * nth];
3747} 3753}
@@ -3754,7 +3760,7 @@ void QRegExp3::compile( bool caseSensitive )
3754 if ( priv->wc ) 3760 if ( priv->wc )
3755 priv->rxpattern = wc2rx( priv->pattern ); 3761 priv->rxpattern = wc2rx( priv->pattern );
3756 else 3762 else
3757#endif 3763#endif
3758 priv->rxpattern = priv->pattern.isNull() ? QString::fromLatin1( "" ) 3764 priv->rxpattern = priv->pattern.isNull() ? QString::fromLatin1( "" )
3759 : priv->pattern; 3765 : priv->pattern;
3760 eng = newEngine( priv->rxpattern, caseSensitive ); 3766 eng = newEngine( priv->rxpattern, caseSensitive );