diff options
Diffstat (limited to 'WebCore/html/parser/HTMLParserIdioms.cpp')
-rw-r--r-- | WebCore/html/parser/HTMLParserIdioms.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/WebCore/html/parser/HTMLParserIdioms.cpp b/WebCore/html/parser/HTMLParserIdioms.cpp index 0ce5e4d..91ff8d3 100644 --- a/WebCore/html/parser/HTMLParserIdioms.cpp +++ b/WebCore/html/parser/HTMLParserIdioms.cpp @@ -96,6 +96,78 @@ bool parseToDoubleForNumberType(const String& string, double* result) return true; } +bool parseToDoubleForNumberTypeWithDecimalPlaces(const String& string, double *result, unsigned *decimalPlaces) +{ + if (decimalPlaces) + *decimalPlaces = 0; + + if (!parseToDoubleForNumberType(string, result)) + return false; + + if (!decimalPlaces) + return true; + + size_t dotIndex = string.find('.'); + size_t eIndex = string.find('e'); + if (eIndex == notFound) + eIndex = string.find('E'); + + unsigned baseDecimalPlaces = 0; + if (dotIndex != notFound) { + if (eIndex == notFound) + baseDecimalPlaces = string.length() - dotIndex - 1; + else + baseDecimalPlaces = eIndex - dotIndex - 1; + } + + int exponent = 0; + if (eIndex != notFound) { + unsigned cursor = eIndex + 1, cursorSaved; + int digit, exponentSign; + int32_t exponent32; + size_t length = string.length(); + + // Not using String.toInt() in order to perform the same computation as dtoa() does. + exponentSign = 0; + switch (digit = string[cursor]) { + case '-': + exponentSign = 1; + case '+': + digit = string[++cursor]; + } + if (digit >= '0' && digit <= '9') { + while (cursor < length && digit == '0') + digit = string[++cursor]; + if (digit > '0' && digit <= '9') { + exponent32 = digit - '0'; + cursorSaved = cursor; + while (cursor < length && (digit = string[++cursor]) >= '0' && digit <= '9') + exponent32 = (10 * exponent32) + digit - '0'; + if (cursor - cursorSaved > 8 || exponent32 > 19999) + /* Avoid confusion from exponents + * so large that e might overflow. + */ + exponent = 19999; /* safe for 16 bit ints */ + else + exponent = static_cast<int>(exponent32); + if (exponentSign) + exponent = -exponent; + } else + exponent = 0; + } + } + + int intDecimalPlaces = baseDecimalPlaces - exponent; + if (intDecimalPlaces < 0) + *decimalPlaces = 0; + else if (intDecimalPlaces > 19999) + *decimalPlaces = 19999; + else + *decimalPlaces = static_cast<unsigned>(intDecimalPlaces); + + return true; +} + // http://www.whatwg.org/specs/web-apps/current-work/#rules-for-parsing-integers bool parseHTMLInteger(const String& input, int& value) { |