diff options
author | Steve Block <steveblock@google.com> | 2011-05-06 11:45:16 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-05-12 13:44:10 +0100 |
commit | cad810f21b803229eb11403f9209855525a25d57 (patch) | |
tree | 29a6fd0279be608e0fe9ffe9841f722f0f4e4269 /Source/WebCore/platform/Length.cpp | |
parent | 121b0cf4517156d0ac5111caf9830c51b69bae8f (diff) | |
download | external_webkit-cad810f21b803229eb11403f9209855525a25d57.zip external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.gz external_webkit-cad810f21b803229eb11403f9209855525a25d57.tar.bz2 |
Merge WebKit at r75315: Initial merge by git.
Change-Id: I570314b346ce101c935ed22a626b48c2af266b84
Diffstat (limited to 'Source/WebCore/platform/Length.cpp')
-rw-r--r-- | Source/WebCore/platform/Length.cpp | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/Source/WebCore/platform/Length.cpp b/Source/WebCore/platform/Length.cpp new file mode 100644 index 0000000..e2fd9b8 --- /dev/null +++ b/Source/WebCore/platform/Length.cpp @@ -0,0 +1,151 @@ +/* + * Copyright (C) 1999 Lars Knoll (knoll@kde.org) + * (C) 1999 Antti Koivisto (koivisto@kde.org) + * (C) 2001 Dirk Mueller ( mueller@kde.org ) + * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public License + * along with this library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + */ + +#include "config.h" +#include "Length.h" + +#include "PlatformString.h" +#include <wtf/ASCIICType.h> +#include <wtf/Assertions.h> +#include <wtf/text/StringBuffer.h> + +using namespace WTF; + +namespace WebCore { + +static Length parseLength(const UChar* data, unsigned length) +{ + if (length == 0) + return Length(1, Relative); + + unsigned i = 0; + while (i < length && isSpaceOrNewline(data[i])) + ++i; + if (i < length && (data[i] == '+' || data[i] == '-')) + ++i; + while (i < length && isASCIIDigit(data[i])) + ++i; + unsigned intLength = i; + while (i < length && (isASCIIDigit(data[i]) || data[i] == '.')) + ++i; + unsigned doubleLength = i; + + // IE quirk: Skip whitespace between the number and the % character (20 % => 20%). + while (i < length && isSpaceOrNewline(data[i])) + ++i; + + bool ok; + UChar next = (i < length) ? data[i] : ' '; + if (next == '%') { + // IE quirk: accept decimal fractions for percentages. + double r = charactersToDouble(data, doubleLength, &ok); + if (ok) + return Length(r, Percent); + return Length(1, Relative); + } + int r = charactersToIntStrict(data, intLength, &ok); + if (next == '*') { + if (ok) + return Length(r, Relative); + return Length(1, Relative); + } + if (ok) + return Length(r, Fixed); + return Length(0, Relative); +} + +static int countCharacter(const UChar* data, unsigned length, UChar character) +{ + int count = 0; + for (int i = 0; i < static_cast<int>(length); ++i) + count += data[i] == character; + return count; +} + +Length* newCoordsArray(const String& string, int& len) +{ + unsigned length = string.length(); + const UChar* data = string.characters(); + StringBuffer spacified(length); + for (unsigned i = 0; i < length; i++) { + UChar cc = data[i]; + if (cc > '9' || (cc < '0' && cc != '-' && cc != '*' && cc != '.')) + spacified[i] = ' '; + else + spacified[i] = cc; + } + RefPtr<StringImpl> str = StringImpl::adopt(spacified); + + str = str->simplifyWhiteSpace(); + + len = countCharacter(str->characters(), str->length(), ' ') + 1; + Length* r = new Length[len]; + + int i = 0; + unsigned pos = 0; + size_t pos2; + + while ((pos2 = str->find(' ', pos)) != notFound) { + r[i++] = parseLength(str->characters() + pos, pos2 - pos); + pos = pos2+1; + } + r[i] = parseLength(str->characters() + pos, str->length() - pos); + + ASSERT(i == len - 1); + + return r; +} + +Length* newLengthArray(const String& string, int& len) +{ + RefPtr<StringImpl> str = string.impl()->simplifyWhiteSpace(); + if (!str->length()) { + len = 1; + return 0; + } + + len = countCharacter(str->characters(), str->length(), ',') + 1; + Length* r = new Length[len]; + + int i = 0; + unsigned pos = 0; + size_t pos2; + + while ((pos2 = str->find(',', pos)) != notFound) { + r[i++] = parseLength(str->characters() + pos, pos2 - pos); + pos = pos2+1; + } + + ASSERT(i == len - 1); + + // IE Quirk: If the last comma is the last char skip it and reduce len by one. + if (str->length()-pos > 0) + r[i] = parseLength(str->characters() + pos, str->length() - pos); + else + len--; + + return r; +} + +} // namespace WebCore |