📄 string.cpp
字号:
{ 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 + -