⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 platformstring.h

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 H
字号:
/* * (C) 1999 Lars Knoll (knoll@kde.org) * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB.  If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */#ifndef PlatformString_h#define PlatformString_h// This file would be called String.h, but that conflicts with <string.h>// on systems without case-sensitive file systems.#include "StringImpl.h"#if USE(JSC)#include <runtime/Identifier.h>#else// runtime/Identifier.h includes HashMap.h and HashSet.h. We explicitly include // them in the case of non-JSC builds to keep things consistent.#include <wtf/HashMap.h>#include <wtf/HashSet.h>#endif#if PLATFORM(CF) || (PLATFORM(QT) && PLATFORM(DARWIN))typedef const struct __CFString * CFStringRef;#endif#if PLATFORM(QT)QT_BEGIN_NAMESPACEclass QString;QT_END_NAMESPACE#endif#if PLATFORM(WX)class wxString;#endifnamespace WebCore {class CString;class SharedBuffer;struct StringHash;class String {public:    String() { } // gives null string, distinguishable from an empty string    String(const UChar*, unsigned length);    String(const UChar*); // Specifically for null terminated UTF-16#if USE(JSC)    String(const JSC::Identifier&);    String(const JSC::UString&);#endif    String(const char*);    String(const char*, unsigned length);    String(StringImpl* i) : m_impl(i) { }    String(PassRefPtr<StringImpl> i) : m_impl(i) { }    String(RefPtr<StringImpl> i) : m_impl(i) { }    void swap(String& o) { m_impl.swap(o.m_impl); }    // Hash table deleted values, which are only constructed and never copied or destroyed.    String(WTF::HashTableDeletedValueType) : m_impl(WTF::HashTableDeletedValue) { }    bool isHashTableDeletedValue() const { return m_impl.isHashTableDeletedValue(); }    static String adopt(StringBuffer& buffer) { return StringImpl::adopt(buffer); }    static String adopt(Vector<UChar>& vector) { return StringImpl::adopt(vector); }#if USE(JSC)    operator JSC::UString() const;#endif    unsigned length() const;    const UChar* characters() const;    const UChar* charactersWithNullTermination();        UChar operator[](unsigned i) const; // if i >= length(), returns 0        UChar32 characterStartingAt(unsigned) const; // Ditto.        bool contains(UChar c) const { return find(c) != -1; }    bool contains(const char* str, bool caseSensitive = true) const { return find(str, 0, caseSensitive) != -1; }    bool contains(const String& str, bool caseSensitive = true) const { return find(str, 0, caseSensitive) != -1; }    int find(UChar c, int start = 0) const        { return m_impl ? m_impl->find(c, start) : -1; }    int find(CharacterMatchFunctionPtr matchFunction, int start = 0) const        { return m_impl ? m_impl->find(matchFunction, start) : -1; }    int find(const char* str, int start = 0, bool caseSensitive = true) const        { 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(); }    bool endsWith(const String& s, bool caseSensitive = true) const        { return m_impl ? m_impl->endsWith(s.impl(), caseSensitive) : s.isEmpty(); }    void append(const String&);    void append(char);    void append(UChar);    void append(const UChar*, unsigned length);    void insert(const String&, unsigned pos);    void insert(const UChar*, unsigned length, unsigned pos);    String& replace(UChar a, UChar b) { if (m_impl) m_impl = m_impl->replace(a, b); return *this; }    String& replace(UChar a, const String& b) { if (m_impl) m_impl = m_impl->replace(a, b.impl()); return *this; }    String& replace(const String& a, const String& b) { if (m_impl) m_impl = m_impl->replace(a.impl(), b.impl()); return *this; }    String& replace(unsigned index, unsigned len, const String& b) { if (m_impl) m_impl = m_impl->replace(index, len, b.impl()); return *this; }    void truncate(unsigned len);    void remove(unsigned pos, int len = 1);    String substring(unsigned pos, unsigned len = UINT_MAX) const;    String left(unsigned len) const { return substring(0, len); }    String right(unsigned len) const { return substring(length() - len, len); }    // Returns a lowercase/uppercase version of the string    String lower() const;    String upper() const;    String stripWhiteSpace() const;    String simplifyWhiteSpace() const;    String removeCharacters(CharacterMatchFunctionPtr) const;    // Return the string with case folded for case insensitive comparison.    String foldCase() const;    static String number(short);    static String number(unsigned short);    static String number(int);    static String number(unsigned);    static String number(long);    static String number(unsigned long);    static String number(long long);    static String number(unsigned long long);    static String number(double);        static String format(const char *, ...) WTF_ATTRIBUTE_PRINTF(1, 2);    void split(const String& separator, Vector<String>& result) const;    void split(const String& separator, bool allowEmptyEntries, Vector<String>& result) const;    void split(UChar separator, Vector<String>& result) const;    void split(UChar separator, bool allowEmptyEntries, Vector<String>& result) const;    int toIntStrict(bool* ok = 0, int base = 10) const;    unsigned toUIntStrict(bool* ok = 0, int base = 10) const;    int64_t toInt64Strict(bool* ok = 0, int base = 10) const;    uint64_t toUInt64Strict(bool* ok = 0, int base = 10) const;    int toInt(bool* ok = 0) const;    unsigned toUInt(bool* ok = 0) const;    int64_t toInt64(bool* ok = 0) const;    uint64_t toUInt64(bool* ok = 0) const;    double toDouble(bool* ok = 0) const;    float toFloat(bool* ok = 0) const;    bool percentage(int& percentage) const;    // Makes a deep copy. Helpful only if you need to use a String on another thread.    // Since the underlying StringImpl objects are immutable, there's no other reason    // to ever prefer copy() over plain old assignment.    String copy() const;    // Makes a deep copy like copy() but only for a substring.    // (This ensures that you always get something suitable for a thread while subtring    // may not.  For example, in the empty string case, StringImpl::substring returns    // empty() which is not safe for another thread.)    String substringCopy(unsigned pos, unsigned len  = UINT_MAX) const;    bool isNull() const { return !m_impl; }    bool isEmpty() const;    StringImpl* impl() const { return m_impl.get(); }#if PLATFORM(CF) || (PLATFORM(QT) && PLATFORM(DARWIN))    String(CFStringRef);    CFStringRef createCFString() const;#endif#ifdef __OBJC__    String(NSString*);        // This conversion maps NULL to "", which loses the meaning of NULL, but we     // need this mapping because AppKit crashes when passed nil NSStrings.    operator NSString*() const { if (!m_impl) return @""; return *m_impl; }#endif#if PLATFORM(QT)    String(const QString&);    String(const QStringRef&);    operator QString() const;#endif#if PLATFORM(WX)    String(const wxString&);    operator wxString() const;#endif#ifndef NDEBUG    Vector<char> ascii() const;#endif    CString latin1() const;    CString utf8() const;    static String fromUTF8(const char*, size_t);    static String fromUTF8(const char*);    // Tries to convert the passed in string to UTF-8, but will fall back to Latin-1 if the string is not valid UTF-8.    static String fromUTF8WithLatin1Fallback(const char*, size_t);        // Determines the writing direction using the Unicode Bidi Algorithm rules P2 and P3.    WTF::Unicode::Direction defaultWritingDirection() const { return m_impl ? m_impl->defaultWritingDirection() : WTF::Unicode::LeftToRight; }private:    RefPtr<StringImpl> m_impl;};String operator+(const String&, const String&);String operator+(const String&, const char*);String operator+(const char*, const String&);inline String& operator+=(String& a, const String& b) { a.append(b); return a; }inline bool operator==(const String& a, const String& b) { return equal(a.impl(), b.impl()); }inline bool operator==(const String& a, const char* b) { return equal(a.impl(), b); }inline bool operator==(const char* a, const String& b) { return equal(a, b.impl()); }inline bool operator!=(const String& a, const String& b) { return !equal(a.impl(), b.impl()); }inline bool operator!=(const String& a, const char* b) { return !equal(a.impl(), b); }inline bool operator!=(const char* a, const String& b) { return !equal(a, b.impl()); }inline bool equalIgnoringCase(const String& a, const String& b) { return equalIgnoringCase(a.impl(), b.impl()); }inline bool equalIgnoringCase(const String& a, const char* b) { return equalIgnoringCase(a.impl(), b); }inline bool equalIgnoringCase(const char* a, const String& b) { return equalIgnoringCase(a, b.impl()); }inline bool operator!(const String& str) { return str.isNull(); }inline void swap(String& a, String& b) { a.swap(b); }// String Operationsbool charactersAreAllASCII(const UChar*, size_t);int charactersToIntStrict(const UChar*, size_t, bool* ok = 0, int base = 10);unsigned charactersToUIntStrict(const UChar*, size_t, bool* ok = 0, int base = 10);int64_t charactersToInt64Strict(const UChar*, size_t, bool* ok = 0, int base = 10);uint64_t charactersToUInt64Strict(const UChar*, size_t, bool* ok = 0, int base = 10);int charactersToInt(const UChar*, size_t, bool* ok = 0); // ignores trailing garbageunsigned charactersToUInt(const UChar*, size_t, bool* ok = 0); // ignores trailing garbageint64_t charactersToInt64(const UChar*, size_t, bool* ok = 0); // ignores trailing garbageuint64_t charactersToUInt64(const UChar*, size_t, bool* ok = 0); // ignores trailing garbagedouble charactersToDouble(const UChar*, size_t, bool* ok = 0);float charactersToFloat(const UChar*, size_t, bool* ok = 0);int find(const UChar*, size_t, UChar, int startPosition = 0);int reverseFind(const UChar*, size_t, UChar, int startPosition = -1);#ifdef __OBJC__// This is for situations in WebKit where the long standing behavior has been// "nil if empty", so we try to maintain longstanding behavior for the sake of// entrenched clientsinline NSString* nsStringNilIfEmpty(const String& str) {  return str.isEmpty() ? nil : (NSString*)str; }#endifinline bool charactersAreAllASCII(const UChar* characters, size_t length){    UChar ored = 0;    for (size_t i = 0; i < length; ++i)        ored |= characters[i];    return !(ored & 0xFF80);}inline int find(const UChar* characters, size_t length, UChar character, int startPosition){    if (startPosition >= static_cast<int>(length))        return -1;    for (size_t i = startPosition; i < length; ++i) {        if (characters[i] == character)            return static_cast<int>(i);    }    return -1;}inline int find(const UChar* characters, size_t length, CharacterMatchFunctionPtr matchFunction, int startPosition){    if (startPosition >= static_cast<int>(length))        return -1;    for (size_t i = startPosition; i < length; ++i) {        if (matchFunction(characters[i]))            return static_cast<int>(i);    }    return -1;}inline int reverseFind(const UChar* characters, size_t length, UChar character, int startPosition){    if (startPosition >= static_cast<int>(length) || !length)        return -1;    if (startPosition < 0)        startPosition += static_cast<int>(length);    while (true) {        if (characters[startPosition] == character)            return startPosition;        if (!startPosition)            return -1;        startPosition--;    }    ASSERT_NOT_REACHED();    return -1;}inline void append(Vector<UChar>& vector, const String& string){    vector.append(string.characters(), string.length());}inline void appendNumber(Vector<UChar>& vector, unsigned char number){    int numberLength = number > 99 ? 3 : (number > 9 ? 2 : 1);    size_t vectorSize = vector.size();    vector.grow(vectorSize + numberLength);    switch (numberLength) {    case 3:        vector[vectorSize + 2] = number % 10 + '0';        number /= 10;    case 2:        vector[vectorSize + 1] = number % 10 + '0';        number /= 10;    case 1:        vector[vectorSize] = number % 10 + '0';    }}PassRefPtr<SharedBuffer> utf8Buffer(const String&);} // namespace WebCorenamespace WTF {    // StringHash is the default hash for String    template<typename T> struct DefaultHash;    template<> struct DefaultHash<WebCore::String> {        typedef WebCore::StringHash Hash;    };}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -