Bug #: 3847
authoreseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Jul 2005 01:01:10 +0000 (01:01 +0000)
committereseidel <eseidel@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 9 Jul 2005 01:01:10 +0000 (01:01 +0000)
Submitted by: eseidel
Reviewed by: mjs
        * kwq/KWQRegExp.h: Added cap() support.
        * kwq/KWQRegExp.mm: Added cap() support.
        (QRegExp::match): Changes necessary for cap()
        (QRegExp::cap): based off of JSC's pcre support.
        http://bugzilla.opendarwin.org/show_bug.cgi?id=3847

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@9634 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/kwq/KWQRegExp.h
WebCore/kwq/KWQRegExp.mm

index 1b3a5d1addcf6e94d18eb21e4edb6942cb3327f5..7c6acdc4e3e72b115f8842f8be81bf56ec0d0d5f 100644 (file)
@@ -1,3 +1,13 @@
+2005-07-08  Eric Seidel  <eseidel@apple.com>
+
+        Reviewed by mjs.
+
+        * kwq/KWQRegExp.h: Added cap() support.
+        * kwq/KWQRegExp.mm: Added cap() support.
+        (QRegExp::match): Changes necessary for cap()
+        (QRegExp::cap): based off of JSC's pcre support.
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=3847
+
 2005-07-08  Geoffrey Garen  <ggaren@apple.com>
 
         Rolled in layout test for fix to 
index 60af0c56b59bcbd032df694e166490da418f1ce7..c94d2f4cc184eeef5e0a152678794b1b6004f176 100644 (file)
@@ -49,6 +49,8 @@ public:
     int pos(int n = 0);
     int matchedLength() const;
     
+    QString cap(int n = 0) const;
+    
 private:
     class KWQRegExpPrivate;    
     KWQRefPtr<KWQRegExpPrivate> d;
index d46395ba35dd2e17b0ad86d839bd42fb7151aa9c..775d1c165099216a0561cc355b1b02f580525498 100644 (file)
@@ -29,6 +29,9 @@
 #import <sys/types.h>
 #import <JavaScriptCore/pcre.h>
 
+#define MAX_SUBSTRINGS  10
+#define MAX_OFFSETS     (3 *MAX_SUBSTRINGS)
+
 class QRegExp::KWQRegExpPrivate
 {
 public:
@@ -43,6 +46,9 @@ public:
     
     uint refCount;
 
+    QString lastMatchString;
+    int lastMatchOffsets[MAX_OFFSETS];
+    int lastMatchCount;
     int lastMatchPos;
     int lastMatchLength;
 };
@@ -148,23 +154,22 @@ QString QRegExp::pattern() const
 
 int QRegExp::match(const QString &str, int startFrom, int *matchLength) const
 {
+    d->lastMatchString = str;
     // First 2 offsets are start and end offsets; 3rd entry is used internally by pcre
-    int offsets[3];
-    int result = pcre_exec(d->regex, NULL, reinterpret_cast<const uint16_t *>(str.unicode()), str.length(), startFrom, 
-                           startFrom == 0 ? 0 : PCRE_NOTBOL, offsets, 3);
-    if (result < 0) {
-        if (result != PCRE_ERROR_NOMATCH) {
-            ERROR("KWQRegExp: pcre_exec() failed with result %d", result);
-        }
+    d->lastMatchCount = pcre_exec(d->regex, NULL, reinterpret_cast<const uint16_t *>(d->lastMatchString.unicode()), d->lastMatchString.length(), startFrom, startFrom == 0 ? 0 : PCRE_NOTBOL, d->lastMatchOffsets, MAX_OFFSETS);
+    if (d->lastMatchCount < 0) {
+        if (d->lastMatchCount != PCRE_ERROR_NOMATCH)
+            ERROR("KWQRegExp: pcre_exec() failed with result %d", d->lastMatchCount);
         d->lastMatchPos = -1;
         d->lastMatchLength = -1;
+        d->lastMatchString = QString();
         return -1;
     }
     
     // 1 means 1 match; 0 means more than one match. First match is recorded in offsets.
-    ASSERT(result < 2);
-    d->lastMatchPos = offsets[0];
-    d->lastMatchLength = offsets[1] - offsets[0];
+    //ASSERT(d->lastMatchCount < 2);
+    d->lastMatchPos = d->lastMatchOffsets[0];
+    d->lastMatchLength = d->lastMatchOffsets[1] - d->lastMatchOffsets[0];
     if (matchLength != NULL) {
         *matchLength = d->lastMatchLength;
     }
@@ -213,3 +218,17 @@ int QRegExp::matchedLength() const
 {
     return d->lastMatchLength;
 }
+
+QString QRegExp::cap(int n) const
+{
+    Q_ASSERT(!d->lastSearchString.isNull());
+    const pcre_char *substring = NULL;
+    int substringLength =  pcre_get_substring(reinterpret_cast<const uint16_t *>(d->lastMatchString.unicode()), d->lastMatchOffsets, d->lastMatchCount, n, &substring);
+    if (substringLength > 0) {
+       QString capture(reinterpret_cast<const QChar *>(substring), substringLength);
+       pcre_free_substring(substring);
+       return capture;
+    }
+    return QString();
+}
+