2006-10-26 Anders Carlsson <acarlsson@apple.com>
authorandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Oct 2006 22:22:43 +0000 (22:22 +0000)
committerandersca <andersca@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Oct 2006 22:22:43 +0000 (22:22 +0000)
        Reviewed by Brady.

        Add reverseFind to String and use it instead of findRev.
        Use CString instead of DeprecatedCString in one place.

        * html/HTMLFormElement.cpp:
        (WebCore::HTMLFormElement::formData):
        * ksvg2/svg/SVGURIReference.cpp:
        (WebCore::SVGURIReference::getTarget):
        * loader/Decoder.cpp:
        (WebCore::Decoder::checkForCSSCharset):
        * platform/PlatformString.h:
        (WebCore::String::reverseFind):
        * platform/StringImpl.cpp:
        (WebCore::StringImpl::reverseFind):
        * platform/StringImpl.h:

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

WebCore/ChangeLog
WebCore/html/HTMLFormElement.cpp
WebCore/ksvg2/svg/SVGURIReference.cpp
WebCore/loader/Decoder.cpp
WebCore/platform/PlatformString.h
WebCore/platform/StringImpl.cpp
WebCore/platform/StringImpl.h

index 491c14cca82fbfa8df16246cd70dc5af4c7a7990..4a5a953310ce19ce0694a9f55bbb274da4652c6a 100644 (file)
@@ -1,3 +1,22 @@
+2006-10-26  Anders Carlsson  <acarlsson@apple.com>
+
+        Reviewed by Brady.
+
+        Add reverseFind to String and use it instead of findRev.
+        Use CString instead of DeprecatedCString in one place.
+        
+        * html/HTMLFormElement.cpp:
+        (WebCore::HTMLFormElement::formData):
+        * ksvg2/svg/SVGURIReference.cpp:
+        (WebCore::SVGURIReference::getTarget):
+        * loader/Decoder.cpp:
+        (WebCore::Decoder::checkForCSSCharset):
+        * platform/PlatformString.h:
+        (WebCore::String::reverseFind):
+        * platform/StringImpl.cpp:
+        (WebCore::StringImpl::reverseFind):
+        * platform/StringImpl.h:
+
 2006-10-26  John Sullivan  <sullivan@apple.com>
 
         Reviewed by Darin
index 062caad5b130e3167c05b1be4c7964130ba8e6f5..6212f6b39faf1d14bc58403f1a4a0332a246a6f6 100644 (file)
@@ -240,16 +240,16 @@ bool HTMLFormElement::formData(FormData& result) const
                     // include the filename
                     if (current->hasLocalName(inputTag) &&
                         static_cast<HTMLInputElement*>(current)->inputType() == HTMLInputElement::FILE) {
-                        DeprecatedString path = static_cast<HTMLInputElement*>(current)->value().deprecatedString();
+                        String path = static_cast<HTMLInputElement*>(current)->value();
 
                         // FIXME: This won't work if the filename includes a " mark,
                         // or control characters like CR or LF. This also does strange
                         // things if the filename includes characters you can't encode
                         // in the website's character set.
                         hstr += "; filename=\"";
-                        int start = path.findRev('/') + 1;
+                        int start = path.reverseFind('/') + 1;
                         int length = path.length() - start;
-                        hstr += encoding.encode(reinterpret_cast<const UChar*>(path.unicode() + start), length, true);
+                        hstr += encoding.encode(reinterpret_cast<const UChar*>(path.characters() + start), length, true);
                         hstr += "\"";
 
                         if (!static_cast<HTMLInputElement*>(current)->value().isEmpty()) {
index bf8de0d6507600e85b7a2bf483d44a4bacc1dce9..0c7dadf1b2a5ca9f3e8d55b77d9bf7b4d4fe9028 100644 (file)
@@ -54,11 +54,11 @@ bool SVGURIReference::parseMappedAttribute(MappedAttribute* attr)
 String SVGURIReference::getTarget(const String& url)
 {
     DeprecatedString urlDeprecated = url.deprecatedString(); // FIXME: Needed until findRev exists for String
-    if (urlDeprecated.startsWith("url(")) { // URI References, ie. fill:url(#target)
-        unsigned int start = urlDeprecated.find('#') + 1;
-        unsigned int end = urlDeprecated.findRev(')');
+    if (url.startsWith("url(")) { // URI References, ie. fill:url(#target)
+        unsigned int start = url.find('#') + 1;
+        unsigned int end = url.reverseFind(')');
 
-        return urlDeprecated.mid(start, end - start);
+        return url.substring(start, end - start);
     } else if (url.find('#') > -1) { // format is #target
         unsigned int start = url.find('#') + 1;
         return url.substring(start, url.length() - start);
index 59707c6c9267b6b8d5c626f78c697b11f154b4d7..49fadafec26a2b2029a107f15d4486cdb30ed116 100644 (file)
@@ -414,7 +414,7 @@ bool Decoder::checkForCSSCharset(const char* data, size_t len, bool& movedDataTo
                 if (pos == dataEnd)
                     return false;
 
-                DeprecatedCString encodingName(dataStart, pos - dataStart + 1);
+                CString encodingName(dataStart, pos - dataStart + 1);
                 
                 ++pos;
                 if (!skipWhitespace(pos, dataEnd))
index 1ac1e45fd0e4b790ebca757914bdc0277e8f7a9e..b379f514c243a23621575058a4b0ed9edae0a2bd 100644 (file)
@@ -81,6 +81,11 @@ public:
         { return m_impl ? m_impl->find(str, start, caseSensitive) : -1; }
     int find(const String& str, int start = 0, bool caseSensitive = true) const
         { return m_impl ? m_impl->find(str.impl(), start, caseSensitive) : -1; }
+
+    int reverseFind(UChar c, int start = -1) const
+        { return m_impl ? m_impl->reverseFind(c, start) : -1; }
+    int reverseFind(const String& str, int start = -1, bool caseSensitive = true) const
+        { return m_impl ? m_impl->reverseFind(str.impl(), start, caseSensitive) : -1; }
     
     bool startsWith(const String& s, bool caseSensitive = true) const
         { return m_impl ? m_impl->startsWith(s.impl(), caseSensitive) : s.isEmpty(); }
index 7a28606bd04d9c8f5d4371fa6062a62c0b28b2a6..d8ba0a6c3f8b7dd389a1270c15321c74048b1d89 100644 (file)
@@ -800,6 +800,81 @@ int StringImpl::find(const StringImpl* str, int index, bool caseSensitive) const
     }
 }
 
+int StringImpl::reverseFind(const UChar c, int index) const
+{
+    if (index >= (int)m_length)
+        return -1;
+
+    if (index < 0)
+        index += m_length;
+    while (1) {
+        if (m_data[index] == c)
+            return index;
+        if (index == 0)
+            return -1;
+        index--;
+    }
+}
+
+int StringImpl::reverseFind(const StringImpl* str, int index, bool caseSensitive) const
+{
+    // FIXME, use the first character algorithm
+    /*
+     See StringImpl::find() for explanations.
+     */
+    ASSERT(str);
+    int lthis = m_length;
+    if (index < 0)
+        index += lthis;
+    
+    int lstr = str->m_length;
+    int delta = lthis - lstr;
+    if ( index < 0 || index > lthis || delta < 0 )
+        return -1;
+    if ( index > delta )
+        index = delta;
+    
+    const UChar *uthis = m_data;
+    const UChar *ustr = str->m_data;
+    unsigned hthis = 0;
+    unsigned hstr = 0;
+    int i;
+    if (caseSensitive) {
+        for ( i = 0; i < lstr; i++ ) {
+            hthis += uthis[index + i];
+            hstr += ustr[i];
+        }
+        i = index;
+        while (1) {
+            if (hthis == hstr && memcmp(uthis + i, ustr, lstr * sizeof(UChar)) == 0)
+                return i;
+            if (i == 0)
+                return -1;
+            i--;
+            hthis -= uthis[i + lstr];
+            hthis += uthis[i];
+        }
+    } else {
+        for (i = 0; i < lstr; i++) {
+            hthis += tolower(uthis[index + i]);
+            hstr += tolower(ustr[i]);
+        }
+        i = index;
+        while (1) {
+            if (hthis == hstr && equalIgnoringCase(uthis + i, ustr, lstr) )
+                return i;
+            if (i == 0)
+                return -1;
+            i--;
+            hthis -= tolower(uthis[i + lstr]);
+            hthis += tolower(uthis[i]);
+        }
+    }
+    
+    // Should never get here.
+    return -1;
+}
+
 bool StringImpl::endsWith(const StringImpl* m_data, bool caseSensitive) const
 {
     ASSERT(m_data);
index bb67180a6d2ab27d9044807251450fec7121b7b2..b18180a497c4e4ab2ac500bc19eeab77f7497979 100644 (file)
@@ -119,6 +119,9 @@ public:
     int find(UChar, int index = 0) const;
     int find(const StringImpl*, int index, bool caseSensitive = true) const;
 
+    int reverseFind(UChar, int index) const;
+    int reverseFind(const StringImpl*, int index, bool caseSensitive = true) const;
+    
     bool startsWith(const StringImpl* m_data, bool caseSensitive = true) const { return find(m_data, 0, caseSensitive) == 0; }
     bool endsWith(const StringImpl*, bool caseSensitive = true) const;