[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    branches/KDE/4.2/kdelibs/khtml
From:       Maks Orlovich <maksim () kde ! org>
Date:       2009-03-21 16:07:45
Message-ID: 1237651665.513470.20189.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 942375 by orlovich:

Merged revision:r941605 | vtokarev | 2009-03-19 21:49:54 -0400 (Thu, 19 Mar 2009) | 2 \
lines

Add caseSensitivity parameter, for startsWith/endsWith methods in
DOMStrngImpl, which allows to avoid some more conversions in checkSimpleSelector

 M  +11 -16    css/cssstyleselector.cpp  
 M  +22 -8     xml/dom_stringimpl.cpp  
 M  +4 -2      xml/dom_stringimpl.h  


--- branches/KDE/4.2/kdelibs/khtml/css/cssstyleselector.cpp #942374:942375
@@ -1374,31 +1374,26 @@
         case CSSSelector::Begin:
         {
             //kDebug( 6080 ) << "checking for beginswith match";
-            QString val_str = QString::fromRawData(value->unicode(), \
                value->length());
-            QString sel_str = QString::fromRawData(sel->value.string().unicode(), \
                sel->value.length());
-            return val_str.startsWith(sel_str, caseSensitive ? Qt::CaseSensitive : \
Qt::CaseInsensitive) && !sel_str.isEmpty(); +            DOMStringImpl* selValue = \
sel->value.impl(); +            return selValue && selValue->length() && \
value->startsWith(selValue, caseSensitive ? DOM::CaseSensitive : \
DOM::CaseInsensitive);  }
         case CSSSelector::End:
         {
             //kDebug( 6080 ) << "checking for endswith match";
-            QString val_str = QString::fromRawData(value->unicode(), \
                value->length());
-            QString sel_str = QString::fromRawData(sel->value.string().unicode(), \
                sel->value.length());
-            return val_str.endsWith(sel_str, caseSensitive ? Qt::CaseSensitive : \
Qt::CaseInsensitive) && !sel_str.isEmpty(); +            DOMStringImpl* selValue = \
sel->value.impl(); +            return selValue && selValue->length() && \
value->endsWith(selValue, caseSensitive ? DOM::CaseSensitive : DOM::CaseInsensitive); \
}  case CSSSelector::Hyphen:
         {
             //kDebug( 6080 ) << "checking for hyphen match";
-            QString val_str = QString::fromRawData(value->unicode(), \
                value->length());
-            QString sel_str = QString::fromRawData(sel->value.string().unicode(), \
                sel->value.length());
-            const QString& str = val_str;
-            const QString& selStr = sel_str;
-            if(str.length() < selStr.length()) return false;
-            // Check if str begins with selStr:
-            if(str.indexOf(selStr, 0, (caseSensitive ? Qt::CaseSensitive : \
Qt::CaseInsensitive)) != 0) return false; +            DOMStringImpl* selValue = \
sel->value.impl(); +            if (value->length() < selValue->length())
+                return false;
+            // Check if value begins with selStr:
+            if (!value->startsWith(selValue))
+                return false;
             // It does. Check for exact match or following '-':
-            if(str.length() != selStr.length()
-                && str[selStr.length()] != '-') return false;
-            break;
+            return value->length() == selValue->length() || \
(*value)[selValue->length()].unicode() == '-';  }
         case CSSSelector::PseudoClass:
         case CSSSelector::PseudoElement:
--- branches/KDE/4.2/kdelibs/khtml/xml/dom_stringimpl.cpp #942374:942375
@@ -470,28 +470,42 @@
     return QString::fromRawData(s, l).toFloat(ok);
 }
 
-bool DOMStringImpl::endsWith(DOMStringImpl* str) const
+bool DOMStringImpl::endsWith(DOMStringImpl* str, CaseSensitivity cs) const
 {
     if (l < str->l) return false;
     const QChar *a = s + l - 1; 
     const QChar *b = str->s + str->l - 1; 
     int i = str->l;
-    while (i--) {
-        if (*a != *b) return false;
-        a--, b--;
+    if (cs == CaseSensitive) {
+        while (i--) {
+            if (*a != *b) return false;
+            a--, b--;
+        }
+    } else {
+        while (i--) {
+            if (a->toLower() != b->toLower()) return false;
+            a--, b--;
+        }
     }
     return true;
 }
 
-bool DOMStringImpl::startsWith(DOMStringImpl* str) const
+bool DOMStringImpl::startsWith(DOMStringImpl* str, CaseSensitivity cs) const
 {
     if (l < str->l) return false;
     const QChar *a = s;
     const QChar *b = str->s;
     int i = str->l;
-    while (i--) {
-        if (*a != *b) return false;
-        a++, b++;
+    if (cs == CaseSensitive) {
+        while (i--) {
+            if (*a != *b) return false;
+            a++, b++;
+        }
+    } else {
+        while (i--) {
+            if (a->toLower() != b->toLower()) return false;
+            a++, b++;
+        }
     }
     return true;
 }
--- branches/KDE/4.2/kdelibs/khtml/xml/dom_stringimpl.h #942374:942375
@@ -37,6 +37,8 @@
 
 namespace DOM {
 
+enum CaseSensitivity { CaseSensitive, CaseInsensitive };
+
 class DOMStringImpl : public khtml::Shared<DOMStringImpl>
 {
 private:
@@ -124,8 +126,8 @@
     uint length() const { return l; }
     QString string() const;
 
-    bool endsWith(DOMStringImpl* str) const;
-    bool startsWith(DOMStringImpl* str) const;
+    bool endsWith(DOMStringImpl* str, CaseSensitivity cs = CaseSensitive) const;
+    bool startsWith(DOMStringImpl* str, CaseSensitivity cs = CaseSensitive) const;
 
     DOMStringImpl* substring(unsigned pos, unsigned len = UINT_MAX) const;
 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic