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

📄 string.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{    if (!m_impl) {        if (ok)            *ok = false;        return 0;    }    return m_impl->toIntStrict(ok, base);}unsigned String::toUIntStrict(bool* ok, int base) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0;    }    return m_impl->toUIntStrict(ok, base);}int64_t String::toInt64Strict(bool* ok, int base) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0;    }    return m_impl->toInt64Strict(ok, base);}uint64_t String::toUInt64Strict(bool* ok, int base) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0;    }    return m_impl->toUInt64Strict(ok, base);}int String::toInt(bool* ok) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0;    }    return m_impl->toInt(ok);}unsigned String::toUInt(bool* ok) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0;    }    return m_impl->toUInt(ok);}int64_t String::toInt64(bool* ok) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0;    }    return m_impl->toInt64(ok);}uint64_t String::toUInt64(bool* ok) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0;    }    return m_impl->toUInt64(ok);}double String::toDouble(bool* ok) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0.0;    }    return m_impl->toDouble(ok);}float String::toFloat(bool* ok) const{    if (!m_impl) {        if (ok)            *ok = false;        return 0.0f;    }    return m_impl->toFloat(ok);}String String::copy() const{    if (!m_impl)        return String();    return m_impl->copy();}bool String::isEmpty() const{    return !m_impl || !m_impl->length();}void String::split(const String& separator, bool allowEmptyEntries, Vector<String>& result) const{    result.clear();    int startPos = 0;    int endPos;    while ((endPos = find(separator, startPos)) != -1) {        if (allowEmptyEntries || startPos != endPos)            result.append(substring(startPos, endPos - startPos));        startPos = endPos + separator.length();    }    if (allowEmptyEntries || startPos != static_cast<int>(length()))        result.append(substring(startPos));}void String::split(const String& separator, Vector<String>& result) const{    return split(separator, false, result);}void String::split(UChar separator, bool allowEmptyEntries, Vector<String>& result) const{    result.clear();    int startPos = 0;    int endPos;    while ((endPos = find(separator, startPos)) != -1) {        if (allowEmptyEntries || startPos != endPos)            result.append(substring(startPos, endPos - startPos));        startPos = endPos + 1;    }    if (allowEmptyEntries || startPos != static_cast<int>(length()))        result.append(substring(startPos));}void String::split(UChar separator, Vector<String>& result) const{    return split(String(&separator, 1), false, result);}#ifndef NDEBUGVector<char> String::ascii() const{    if (m_impl)         return m_impl->ascii();        const char* nullMsg = "(null impl)";    Vector<char, 2048> buffer;    for (int i = 0; nullMsg[i]; ++i)        buffer.append(nullMsg[i]);        buffer.append('\0');    return buffer;}#endifCString String::latin1() const{    return Latin1Encoding().encode(characters(), length(), QuestionMarksForUnencodables);}    CString String::utf8() const{    return UTF8Encoding().encode(characters(), length(), QuestionMarksForUnencodables);}String String::fromUTF8(const char* string, size_t size){    if (!string)        return String();    return UTF8Encoding().decode(string, size);}String String::fromUTF8(const char* string){    if (!string)        return String();    return UTF8Encoding().decode(string, strlen(string));}String String::fromUTF8WithLatin1Fallback(const char* string, size_t size){    String result = fromUTF8(string, size);    if (!result)        result = String(string, size);        return result;}#if USE(JSC)String::String(const Identifier& str){    if (str.isNull())        return;    m_impl = StringImpl::create(str.data(), str.size());}String::String(const UString& str){    if (str.isNull())        return;    m_impl = StringImpl::create(str.data(), str.size());}String::operator UString() const{    if (!m_impl)        return UString();    return UString(m_impl->characters(), m_impl->length());}#endif// String Operationsstatic bool isCharacterAllowedInBase(UChar c, int base){    if (c > 0x7F)        return false;    if (isASCIIDigit(c))        return c - '0' < base;    if (isASCIIAlpha(c)) {        if (base > 36)            base = 36;        return (c >= 'a' && c < 'a' + base - 10)            || (c >= 'A' && c < 'A' + base - 10);    }    return false;}template <typename IntegralType>static inline IntegralType toIntegralType(const UChar* data, size_t length, bool* ok, int base){    static const IntegralType integralMax = std::numeric_limits<IntegralType>::max();    static const bool isSigned = std::numeric_limits<IntegralType>::is_signed;    const IntegralType maxMultiplier = integralMax / base;    IntegralType value = 0;    bool isOk = false;    bool isNegative = false;    if (!data)        goto bye;    // skip leading whitespace    while (length && isSpaceOrNewline(*data)) {        length--;        data++;    }    if (isSigned && length && *data == '-') {        length--;        data++;        isNegative = true;    } else if (length && *data == '+') {        length--;        data++;    }    if (!length || !isCharacterAllowedInBase(*data, base))        goto bye;    while (length && isCharacterAllowedInBase(*data, base)) {        length--;        IntegralType digitValue;        UChar c = *data;        if (isASCIIDigit(c))            digitValue = c - '0';        else if (c >= 'a')            digitValue = c - 'a' + 10;        else            digitValue = c - 'A' + 10;        if (value > maxMultiplier || (value == maxMultiplier && digitValue > (integralMax % base) + isNegative))            goto bye;        value = base * value + digitValue;        data++;    }#if COMPILER(MSVC)#pragma warning(push, 0)#pragma warning(disable:4146)#endif    if (isNegative)        value = -value;#if COMPILER(MSVC)#pragma warning(pop)#endif    // skip trailing space    while (length && isSpaceOrNewline(*data)) {        length--;        data++;    }    if (!length)        isOk = true;bye:    if (ok)        *ok = isOk;    return isOk ? value : 0;}static unsigned lengthOfCharactersAsInteger(const UChar* data, size_t length){    size_t i = 0;    // Allow leading spaces.    for (; i != length; ++i) {        if (!isSpaceOrNewline(data[i]))            break;    }        // Allow sign.    if (i != length && (data[i] == '+' || data[i] == '-'))        ++i;        // Allow digits.    for (; i != length; ++i) {        if (!isASCIIDigit(data[i]))            break;    }    return i;}int charactersToIntStrict(const UChar* data, size_t length, bool* ok, int base){    return toIntegralType<int>(data, length, ok, base);}unsigned charactersToUIntStrict(const UChar* data, size_t length, bool* ok, int base){    return toIntegralType<unsigned>(data, length, ok, base);}int64_t charactersToInt64Strict(const UChar* data, size_t length, bool* ok, int base){    return toIntegralType<int64_t>(data, length, ok, base);}uint64_t charactersToUInt64Strict(const UChar* data, size_t length, bool* ok, int base){    return toIntegralType<uint64_t>(data, length, ok, base);}int charactersToInt(const UChar* data, size_t length, bool* ok){    return toIntegralType<int>(data, lengthOfCharactersAsInteger(data, length), ok, 10);}unsigned charactersToUInt(const UChar* data, size_t length, bool* ok){    return toIntegralType<unsigned>(data, lengthOfCharactersAsInteger(data, length), ok, 10);}int64_t charactersToInt64(const UChar* data, size_t length, bool* ok){    return toIntegralType<int64_t>(data, lengthOfCharactersAsInteger(data, length), ok, 10);}uint64_t charactersToUInt64(const UChar* data, size_t length, bool* ok){    return toIntegralType<uint64_t>(data, lengthOfCharactersAsInteger(data, length), ok, 10);}double charactersToDouble(const UChar* data, size_t length, bool* ok){    if (!length) {        if (ok)            *ok = false;        return 0.0;    }    Vector<char, 256> bytes(length + 1);    for (unsigned i = 0; i < length; ++i)        bytes[i] = data[i] < 0x7F ? data[i] : '?';    bytes[length] = '\0';    char* end;    double val = WTF::strtod(bytes.data(), &end);    if (ok)        *ok = (end == 0 || *end == '\0');    return val;}float charactersToFloat(const UChar* data, size_t length, bool* ok){    // FIXME: This will return ok even when the string fits into a double but not a float.    return narrowPrecisionToFloat(charactersToDouble(data, length, ok));}PassRefPtr<SharedBuffer> utf8Buffer(const String& string){    // Allocate a buffer big enough to hold all the characters.    const int length = string.length();    Vector<char> buffer(length * 3);    // Convert to runs of 8-bit characters.    char* p = buffer.data();    const UChar* d = string.characters();    ConversionResult result = convertUTF16ToUTF8(&d, d + length, &p, p + buffer.size(), true);    if (result != conversionOK)        return 0;    buffer.shrink(p - buffer.data());    return SharedBuffer::adoptVector(buffer);}} // namespace WebCore#ifndef NDEBUG// For use in the debugger - leaks memoryWebCore::String* string(const char*);WebCore::String* string(const char* s){    return new WebCore::String(s);}#endif

⌨️ 快捷键说明

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