Index: third_party/WebKit/Source/wtf/text/StringToNumber.cpp |
diff --git a/third_party/WebKit/Source/wtf/text/StringToNumber.cpp b/third_party/WebKit/Source/wtf/text/StringToNumber.cpp |
deleted file mode 100644 |
index 423bf6812c8fd67b676b0d0200c1ce9f18b6e009..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/Source/wtf/text/StringToNumber.cpp |
+++ /dev/null |
@@ -1,322 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "wtf/text/StringToNumber.h" |
- |
-#include "wtf/ASCIICType.h" |
-#include "wtf/dtoa.h" |
-#include "wtf/text/StringImpl.h" |
-#include <type_traits> |
- |
-namespace WTF { |
- |
-static 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, typename CharType> |
-static inline IntegralType toIntegralType(const CharType* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- static_assert(std::is_integral<IntegralType>::value, |
- "IntegralType must be an integral type."); |
- static constexpr IntegralType integralMax = |
- std::numeric_limits<IntegralType>::max(); |
- static constexpr IntegralType integralMin = |
- std::numeric_limits<IntegralType>::min(); |
- static constexpr bool isSigned = std::numeric_limits<IntegralType>::is_signed; |
- |
- 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; |
- CharType c = *data; |
- if (isASCIIDigit(c)) |
- digitValue = c - '0'; |
- else if (c >= 'a') |
- digitValue = c - 'a' + 10; |
- else |
- digitValue = c - 'A' + 10; |
- |
- bool overflow; |
- if (isNegative) { |
- // Overflow condition: |
- // value * base - digitValue < integralMin |
- // <=> value < (integralMin + digitValue) / base |
- // We must be careful of rounding errors here, but the default rounding |
- // mode (round to zero) works well, so we can use this formula as-is. |
- overflow = value < (integralMin + digitValue) / base; |
- } else { |
- // Overflow condition: |
- // value * base + digitValue > integralMax |
- // <=> value > (integralMax + digitValue) / base |
- // Ditto regarding rounding errors. |
- overflow = value > (integralMax - digitValue) / base; |
- } |
- if (overflow) |
- goto bye; |
- |
- if (isNegative) |
- value = base * value - digitValue; |
- else |
- value = base * value + digitValue; |
- ++data; |
- } |
- |
- // skip trailing space |
- while (length && isSpaceOrNewline(*data)) { |
- --length; |
- ++data; |
- } |
- |
- if (!length) |
- isOk = true; |
-bye: |
- if (ok) |
- *ok = isOk; |
- return isOk ? value : 0; |
-} |
- |
-template <typename CharType> |
-static unsigned lengthOfCharactersAsInteger(const CharType* 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 LChar* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- return toIntegralType<int, LChar>(data, length, ok, base); |
-} |
- |
-int charactersToIntStrict(const UChar* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- return toIntegralType<int, UChar>(data, length, ok, base); |
-} |
- |
-unsigned charactersToUIntStrict(const LChar* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- return toIntegralType<unsigned, LChar>(data, length, ok, base); |
-} |
- |
-unsigned charactersToUIntStrict(const UChar* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- return toIntegralType<unsigned, UChar>(data, length, ok, base); |
-} |
- |
-int64_t charactersToInt64Strict(const LChar* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- return toIntegralType<int64_t, LChar>(data, length, ok, base); |
-} |
- |
-int64_t charactersToInt64Strict(const UChar* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- return toIntegralType<int64_t, UChar>(data, length, ok, base); |
-} |
- |
-uint64_t charactersToUInt64Strict(const LChar* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- return toIntegralType<uint64_t, LChar>(data, length, ok, base); |
-} |
- |
-uint64_t charactersToUInt64Strict(const UChar* data, |
- size_t length, |
- bool* ok, |
- int base) { |
- return toIntegralType<uint64_t, UChar>(data, length, ok, base); |
-} |
- |
-int charactersToInt(const LChar* data, size_t length, bool* ok) { |
- return toIntegralType<int, LChar>( |
- data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); |
-} |
- |
-int charactersToInt(const UChar* data, size_t length, bool* ok) { |
- return toIntegralType<int, UChar>( |
- data, lengthOfCharactersAsInteger(data, length), ok, 10); |
-} |
- |
-unsigned charactersToUInt(const LChar* data, size_t length, bool* ok) { |
- return toIntegralType<unsigned, LChar>( |
- data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); |
-} |
- |
-unsigned charactersToUInt(const UChar* data, size_t length, bool* ok) { |
- return toIntegralType<unsigned, UChar>( |
- data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10); |
-} |
- |
-int64_t charactersToInt64(const LChar* data, size_t length, bool* ok) { |
- return toIntegralType<int64_t, LChar>( |
- data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); |
-} |
- |
-int64_t charactersToInt64(const UChar* data, size_t length, bool* ok) { |
- return toIntegralType<int64_t, UChar>( |
- data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10); |
-} |
- |
-uint64_t charactersToUInt64(const LChar* data, size_t length, bool* ok) { |
- return toIntegralType<uint64_t, LChar>( |
- data, lengthOfCharactersAsInteger<LChar>(data, length), ok, 10); |
-} |
- |
-uint64_t charactersToUInt64(const UChar* data, size_t length, bool* ok) { |
- return toIntegralType<uint64_t, UChar>( |
- data, lengthOfCharactersAsInteger<UChar>(data, length), ok, 10); |
-} |
- |
-enum TrailingJunkPolicy { DisallowTrailingJunk, AllowTrailingJunk }; |
- |
-template <typename CharType, TrailingJunkPolicy policy> |
-static inline double toDoubleType(const CharType* data, |
- size_t length, |
- bool* ok, |
- size_t& parsedLength) { |
- size_t leadingSpacesLength = 0; |
- while (leadingSpacesLength < length && |
- isASCIISpace(data[leadingSpacesLength])) |
- ++leadingSpacesLength; |
- |
- double number = parseDouble(data + leadingSpacesLength, |
- length - leadingSpacesLength, parsedLength); |
- if (!parsedLength) { |
- if (ok) |
- *ok = false; |
- return 0.0; |
- } |
- |
- parsedLength += leadingSpacesLength; |
- if (ok) |
- *ok = policy == AllowTrailingJunk || parsedLength == length; |
- return number; |
-} |
- |
-double charactersToDouble(const LChar* data, size_t length, bool* ok) { |
- size_t parsedLength; |
- return toDoubleType<LChar, DisallowTrailingJunk>(data, length, ok, |
- parsedLength); |
-} |
- |
-double charactersToDouble(const UChar* data, size_t length, bool* ok) { |
- size_t parsedLength; |
- return toDoubleType<UChar, DisallowTrailingJunk>(data, length, ok, |
- parsedLength); |
-} |
- |
-double charactersToDouble(const LChar* data, |
- size_t length, |
- size_t& parsedLength) { |
- return toDoubleType<LChar, AllowTrailingJunk>(data, length, nullptr, |
- parsedLength); |
-} |
- |
-double charactersToDouble(const UChar* data, |
- size_t length, |
- size_t& parsedLength) { |
- return toDoubleType<UChar, AllowTrailingJunk>(data, length, nullptr, |
- parsedLength); |
-} |
- |
-float charactersToFloat(const LChar* data, size_t length, bool* ok) { |
- // FIXME: This will return ok even when the string fits into a double but |
- // not a float. |
- size_t parsedLength; |
- return static_cast<float>(toDoubleType<LChar, DisallowTrailingJunk>( |
- data, length, ok, parsedLength)); |
-} |
- |
-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. |
- size_t parsedLength; |
- return static_cast<float>(toDoubleType<UChar, DisallowTrailingJunk>( |
- data, length, ok, parsedLength)); |
-} |
- |
-float charactersToFloat(const LChar* data, |
- size_t length, |
- size_t& parsedLength) { |
- // FIXME: This will return ok even when the string fits into a double but |
- // not a float. |
- return static_cast<float>( |
- toDoubleType<LChar, AllowTrailingJunk>(data, length, 0, parsedLength)); |
-} |
- |
-float charactersToFloat(const UChar* data, |
- size_t length, |
- size_t& parsedLength) { |
- // FIXME: This will return ok even when the string fits into a double but |
- // not a float. |
- return static_cast<float>( |
- toDoubleType<UChar, AllowTrailingJunk>(data, length, 0, parsedLength)); |
-} |
- |
-} // namespace WTF |