static inline IntegralType toIntegralType(const CharType* 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; CharType 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; }
void Parser::skipWS() { while (m_nextPos < m_data.length() && isSpaceOrNewline(m_data[m_nextPos])) ++m_nextPos; }
static bool IsWhiteSpaceOrPunctuation(UChar c) { return isSpaceOrNewline(c) || WTF::Unicode::isPunct(c); }