diff options
Diffstat (limited to 'WebCore/platform/text')
-rw-r--r-- | WebCore/platform/text/TextBoundaries.cpp | 28 | ||||
-rw-r--r-- | WebCore/platform/text/TextBoundaries.h | 3 | ||||
-rw-r--r-- | WebCore/platform/text/TextCodecUTF16.cpp | 11 | ||||
-rw-r--r-- | WebCore/platform/text/TextEncodingRegistry.cpp | 3 | ||||
-rw-r--r-- | WebCore/platform/text/brew/StringBrew.cpp | 4 | ||||
-rw-r--r-- | WebCore/platform/text/transcoder/FontTranscoder.cpp | 10 | ||||
-rw-r--r-- | WebCore/platform/text/wince/TextBoundariesWinCE.cpp | 74 | ||||
-rw-r--r-- | WebCore/platform/text/wince/TextBreakIteratorWinCE.cpp | 49 |
8 files changed, 67 insertions, 115 deletions
diff --git a/WebCore/platform/text/TextBoundaries.cpp b/WebCore/platform/text/TextBoundaries.cpp index 8eaffca..fbb261b 100644 --- a/WebCore/platform/text/TextBoundaries.cpp +++ b/WebCore/platform/text/TextBoundaries.cpp @@ -36,6 +36,32 @@ using namespace Unicode; namespace WebCore { +int endOfFirstWordBoundaryContext(const UChar* characters, int length) +{ + for (int i = 0; i < length; ) { + int first = i; + UChar32 ch; + U16_NEXT(characters, i, length, ch); + if (!requiresContextForWordBoundary(ch)) + return first; + } + return length; +} + +int startOfLastWordBoundaryContext(const UChar* characters, int length) +{ + for (int i = length; i > 0; ) { + int last = i; + UChar32 ch; + U16_PREV(characters, 0, i, ch); + if (!requiresContextForWordBoundary(ch)) + return last; + } + return 0; +} + +#if !PLATFORM(BREWMP) && !PLATFORM(MAC) && !PLATFORM(QT) + int findNextWordFromIndex(const UChar* chars, int len, int position, bool forward) { TextBreakIterator* it = wordBreakIterator(chars, len); @@ -76,4 +102,6 @@ void findWordBoundary(const UChar* chars, int len, int position, int* start, int *start = textBreakPrevious(it); } +#endif // !PLATFORM(BREWMP) && !PLATFORM(MAC) && !PLATFORM(QT) + } // namespace WebCore diff --git a/WebCore/platform/text/TextBoundaries.h b/WebCore/platform/text/TextBoundaries.h index 7eb9cab..870ab62 100644 --- a/WebCore/platform/text/TextBoundaries.h +++ b/WebCore/platform/text/TextBoundaries.h @@ -35,6 +35,9 @@ namespace WebCore { return WTF::Unicode::hasLineBreakingPropertyComplexContext(ch); } + int endOfFirstWordBoundaryContext(const UChar* characters, int length); + int startOfLastWordBoundaryContext(const UChar* characters, int length); + void findWordBoundary(const UChar*, int len, int position, int* start, int* end); int findNextWordFromIndex(const UChar*, int len, int position, bool forward); diff --git a/WebCore/platform/text/TextCodecUTF16.cpp b/WebCore/platform/text/TextCodecUTF16.cpp index 95f4dc4..e88e83b 100644 --- a/WebCore/platform/text/TextCodecUTF16.cpp +++ b/WebCore/platform/text/TextCodecUTF16.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004, 2006, 2008 Apple Inc. All rights reserved. + * Copyright (C) 2004, 2006, 2008, 2010 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -117,8 +117,13 @@ String TextCodecUTF16::decode(const char* bytes, size_t length, bool, bool, bool CString TextCodecUTF16::encode(const UChar* characters, size_t length, UnencodableHandling) { - if (length > numeric_limits<size_t>::max() / 2) - CRASH(); + // We need to be sure we can double the length without overflowing. + // Since the passed-in length is the length of an actual existing + // character buffer, each character is two bytes, and we know + // the buffer doesn't occupy the entire address space, we can + // assert here that doubling the length does not overflow size_t + // and there's no need for a runtime check. + ASSERT(length <= numeric_limits<size_t>::max() / 2); char* bytes; CString string = CString::newUninitialized(length * 2, bytes); diff --git a/WebCore/platform/text/TextEncodingRegistry.cpp b/WebCore/platform/text/TextEncodingRegistry.cpp index fbe5826..6bf5552 100644 --- a/WebCore/platform/text/TextEncodingRegistry.cpp +++ b/WebCore/platform/text/TextEncodingRegistry.cpp @@ -189,8 +189,7 @@ static void addToTextCodecMap(const char* name, NewTextCodecFunction function, c static void pruneBlacklistedCodecs() { - size_t blacklistedCodecListLength = sizeof(textEncodingNameBlacklist) / sizeof(textEncodingNameBlacklist[0]); - for (size_t i = 0; i < blacklistedCodecListLength; ++i) { + for (size_t i = 0; i < WTF_ARRAY_LENGTH(textEncodingNameBlacklist); ++i) { const char* atomicName = textEncodingNameMap->get(textEncodingNameBlacklist[i]); if (!atomicName) continue; diff --git a/WebCore/platform/text/brew/StringBrew.cpp b/WebCore/platform/text/brew/StringBrew.cpp index 7869e0f..2da81e3 100644 --- a/WebCore/platform/text/brew/StringBrew.cpp +++ b/WebCore/platform/text/brew/StringBrew.cpp @@ -26,7 +26,7 @@ #include "config.h" #include "PlatformString.h" -#include <AEEStdLib.h> +#include <AEEstd.h> namespace WTF { @@ -35,7 +35,7 @@ String::String(const AECHAR* string) { // It is safe to cast AECHAR to UChar as both of them use 16 bits representation. const UChar* str = reinterpret_cast<const UChar*>(string); - const size_t len = WSTRLEN(string); + const size_t len = std_wstrlen(string); m_impl = StringImpl::create(str, len); } diff --git a/WebCore/platform/text/transcoder/FontTranscoder.cpp b/WebCore/platform/text/transcoder/FontTranscoder.cpp index 8e2f33f..68601f9 100644 --- a/WebCore/platform/text/transcoder/FontTranscoder.cpp +++ b/WebCore/platform/text/transcoder/FontTranscoder.cpp @@ -41,23 +41,23 @@ FontTranscoder::FontTranscoder() { m_converterTypes.add("MS PGothic", BackslashToYenSign); UChar unicodeNameMSPGothic[] = {0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x30B4, 0x30B7, 0x30C3, 0x30AF}; - m_converterTypes.add(AtomicString(unicodeNameMSPGothic, sizeof(unicodeNameMSPGothic) / sizeof(UChar)), BackslashToYenSign); + m_converterTypes.add(AtomicString(unicodeNameMSPGothic, WTF_ARRAY_LENGTH(unicodeNameMSPGothic)), BackslashToYenSign); m_converterTypes.add("MS PMincho", BackslashToYenSign); UChar unicodeNameMSPMincho[] = {0xFF2D, 0xFF33, 0x0020, 0xFF30, 0x660E, 0x671D}; - m_converterTypes.add(AtomicString(unicodeNameMSPMincho, sizeof(unicodeNameMSPMincho) / sizeof(UChar)), BackslashToYenSign); + m_converterTypes.add(AtomicString(unicodeNameMSPMincho, WTF_ARRAY_LENGTH(unicodeNameMSPMincho)), BackslashToYenSign); m_converterTypes.add("MS Gothic", BackslashToYenSign); UChar unicodeNameMSGothic[] = {0xFF2D, 0xFF33, 0x0020, 0x30B4, 0x30B7, 0x30C3, 0x30AF}; - m_converterTypes.add(AtomicString(unicodeNameMSGothic, sizeof(unicodeNameMSGothic) / sizeof(UChar)), BackslashToYenSign); + m_converterTypes.add(AtomicString(unicodeNameMSGothic, WTF_ARRAY_LENGTH(unicodeNameMSGothic)), BackslashToYenSign); m_converterTypes.add("MS Mincho", BackslashToYenSign); UChar unicodeNameMSMincho[] = {0xFF2D, 0xFF33, 0x0020, 0x660E, 0x671D}; - m_converterTypes.add(AtomicString(unicodeNameMSMincho, sizeof(unicodeNameMSMincho) / sizeof(UChar)), BackslashToYenSign); + m_converterTypes.add(AtomicString(unicodeNameMSMincho, WTF_ARRAY_LENGTH(unicodeNameMSMincho)), BackslashToYenSign); m_converterTypes.add("Meiryo", BackslashToYenSign); UChar unicodeNameMeiryo[] = {0x30E1, 0x30A4, 0x30EA, 0x30AA}; - m_converterTypes.add(AtomicString(unicodeNameMeiryo, sizeof(unicodeNameMeiryo) / sizeof(UChar)), BackslashToYenSign); + m_converterTypes.add(AtomicString(unicodeNameMeiryo, WTF_ARRAY_LENGTH(unicodeNameMeiryo)), BackslashToYenSign); } FontTranscoder::ConverterType FontTranscoder::converterType(const FontDescription& fontDescription, const TextEncoding* encoding) const diff --git a/WebCore/platform/text/wince/TextBoundariesWinCE.cpp b/WebCore/platform/text/wince/TextBoundariesWinCE.cpp deleted file mode 100644 index f3070a4..0000000 --- a/WebCore/platform/text/wince/TextBoundariesWinCE.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2006 Zack Rusin <zack@kde.org> - * Copyright (C) 2007-2009 Torch Mobile, Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "TextBoundaries.h" - -#include "NotImplemented.h" -#include "PlatformString.h" - -using namespace WTF::Unicode; - -namespace WebCore { - -int findNextWordFromIndex(const UChar * buffer, int len, int position, bool forward) -{ - notImplemented(); - return 0; -} - -void findWordBoundary(const UChar * buffer, int len, int position, int* start, int* end) -{ - if (position > len) { - *start = 0; - *end = 0; - return; - } - - String str(buffer, len); - - int currentPosition = position - 1; - String foundWord; - while (currentPosition >= 0 && isLetter(str[currentPosition])) { - UChar c = str[currentPosition]; - foundWord.insert(&c, 1, 0); - --currentPosition; - } - - // currentPosition == 0 means the first char is not letter - // currentPosition == -1 means we reached the beginning - int startPos = (currentPosition < 0) ? 0 : ++currentPosition; - currentPosition = position; - while (isLetter(str[currentPosition])) { - foundWord.append(str[currentPosition]); - ++currentPosition; - } - - *start = startPos; - *end = currentPosition; -} - -} // namespace WebCore diff --git a/WebCore/platform/text/wince/TextBreakIteratorWinCE.cpp b/WebCore/platform/text/wince/TextBreakIteratorWinCE.cpp index 7f46e4f..96488c0 100644 --- a/WebCore/platform/text/wince/TextBreakIteratorWinCE.cpp +++ b/WebCore/platform/text/wince/TextBreakIteratorWinCE.cpp @@ -55,7 +55,16 @@ public: length = len; currentPos = 0; } - virtual int first() = 0; + int first() + { + currentPos = 0; + return currentPos; + } + int last() + { + currentPos = length; + return currentPos; + } virtual int next() = 0; virtual int previous() = 0; int following(int position) @@ -75,35 +84,25 @@ public: }; struct WordBreakIterator: TextBreakIterator { - virtual int first(); virtual int next(); virtual int previous(); }; struct CharBreakIterator: TextBreakIterator { - virtual int first(); virtual int next(); virtual int previous(); }; struct LineBreakIterator: TextBreakIterator { - virtual int first(); virtual int next(); virtual int previous(); }; struct SentenceBreakIterator : TextBreakIterator { - virtual int first(); virtual int next(); virtual int previous(); }; -int WordBreakIterator::first() -{ - currentPos = 0; - return currentPos; -} - int WordBreakIterator::next() { if (currentPos == length) { @@ -138,12 +137,6 @@ int WordBreakIterator::previous() return currentPos; } -int CharBreakIterator::first() -{ - currentPos = 0; - return currentPos; -} - int CharBreakIterator::next() { if (currentPos >= length) @@ -166,12 +159,6 @@ int CharBreakIterator::previous() return currentPos; } -int LineBreakIterator::first() -{ - currentPos = 0; - return currentPos; -} - int LineBreakIterator::next() { if (currentPos == length) { @@ -206,12 +193,6 @@ int LineBreakIterator::previous() return currentPos; } -int SentenceBreakIterator::first() -{ - currentPos = 0; - return currentPos; -} - int SentenceBreakIterator::next() { if (currentPos == length) { @@ -279,11 +260,21 @@ int textBreakFirst(TextBreakIterator* breakIterator) return breakIterator->first(); } +int textBreakLast(TextBreakIterator* breakIterator) +{ + return breakIterator->last(); +} + int textBreakNext(TextBreakIterator* breakIterator) { return breakIterator->next(); } +int textBreakPrevious(TextBreakIterator* breakIterator) +{ + return breakIterator->previous(); +} + int textBreakPreceding(TextBreakIterator* breakIterator, int position) { return breakIterator->preceding(position); |