| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 
| 3  *           (C) 1999 Antti Koivisto (koivisto@kde.org) | 3  *           (C) 1999 Antti Koivisto (koivisto@kde.org) | 
| 4  *           (C) 2001 Dirk Mueller ( mueller@kde.org ) | 4  *           (C) 2001 Dirk Mueller ( mueller@kde.org ) | 
| 5  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All | 5  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2013 Apple Inc. All | 
| 6  * rights reserved. | 6  * rights reserved. | 
| 7  * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 7  * Copyright (C) 2006 Andrew Wellington (proton@wiretapped.net) | 
| 8  * | 8  * | 
| 9  * This library is free software; you can redistribute it and/or | 9  * This library is free software; you can redistribute it and/or | 
| 10  * modify it under the terms of the GNU Library General Public | 10  * modify it under the terms of the GNU Library General Public | 
| (...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 626   UChar* data16; | 626   UChar* data16; | 
| 627   RefPtr<StringImpl> new_impl = CreateUninitialized(length_, data16); | 627   RefPtr<StringImpl> new_impl = CreateUninitialized(length_, data16); | 
| 628 | 628 | 
| 629   for (unsigned i = 0; i < length; ++i) { | 629   for (unsigned i = 0; i < length; ++i) { | 
| 630     UChar c = Characters16()[i]; | 630     UChar c = Characters16()[i]; | 
| 631     data16[i] = IsASCIIUpper(c) ? ToASCIILower(c) : c; | 631     data16[i] = IsASCIIUpper(c) ? ToASCIILower(c) : c; | 
| 632   } | 632   } | 
| 633   return new_impl.Release(); | 633   return new_impl.Release(); | 
| 634 } | 634 } | 
| 635 | 635 | 
| 636 PassRefPtr<StringImpl> StringImpl::Lower() { | 636 PassRefPtr<StringImpl> StringImpl::LowerUnicode() { | 
| 637   // Note: This is a hot function in the Dromaeo benchmark, specifically the | 637   // Note: This is a hot function in the Dromaeo benchmark, specifically the | 
| 638   // no-op code path up through the first 'return' statement. | 638   // no-op code path up through the first 'return' statement. | 
| 639 | 639 | 
| 640   // First scan the string for uppercase and non-ASCII characters: | 640   // First scan the string for uppercase and non-ASCII characters: | 
| 641   if (Is8Bit()) { | 641   if (Is8Bit()) { | 
| 642     unsigned first_index_to_be_lowered = length_; | 642     unsigned first_index_to_be_lowered = length_; | 
| 643     for (unsigned i = 0; i < length_; ++i) { | 643     for (unsigned i = 0; i < length_; ++i) { | 
| 644       LChar ch = Characters8()[i]; | 644       LChar ch = Characters8()[i]; | 
| 645       if (UNLIKELY(IsASCIIUpper(ch) || ch & ~0x7F)) { | 645       if (UNLIKELY(IsASCIIUpper(ch) || ch & ~0x7F)) { | 
| 646         first_index_to_be_lowered = i; | 646         first_index_to_be_lowered = i; | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 703   if (!error && real_length == length) | 703   if (!error && real_length == length) | 
| 704     return new_impl.Release(); | 704     return new_impl.Release(); | 
| 705 | 705 | 
| 706   new_impl = CreateUninitialized(real_length, data16); | 706   new_impl = CreateUninitialized(real_length, data16); | 
| 707   Unicode::ToLower(data16, real_length, Characters16(), length_, &error); | 707   Unicode::ToLower(data16, real_length, Characters16(), length_, &error); | 
| 708   if (error) | 708   if (error) | 
| 709     return this; | 709     return this; | 
| 710   return new_impl.Release(); | 710   return new_impl.Release(); | 
| 711 } | 711 } | 
| 712 | 712 | 
| 713 PassRefPtr<StringImpl> StringImpl::Upper() { | 713 PassRefPtr<StringImpl> StringImpl::UpperUnicode() { | 
| 714   // This function could be optimized for no-op cases the way lower() is, | 714   // This function could be optimized for no-op cases the way LowerUnicode() is, | 
| 715   // but in empirical testing, few actual calls to upper() are no-ops, so | 715   // but in empirical testing, few actual calls to UpperUnicode() are no-ops, so | 
| 716   // it wouldn't be worth the extra time for pre-scanning. | 716   // it wouldn't be worth the extra time for pre-scanning. | 
| 717 | 717 | 
| 718   RELEASE_ASSERT(length_ <= | 718   RELEASE_ASSERT(length_ <= | 
| 719                  static_cast<unsigned>(numeric_limits<int32_t>::max())); | 719                  static_cast<unsigned>(numeric_limits<int32_t>::max())); | 
| 720   int32_t length = length_; | 720   int32_t length = length_; | 
| 721 | 721 | 
| 722   if (Is8Bit()) { | 722   if (Is8Bit()) { | 
| 723     LChar* data8; | 723     LChar* data8; | 
| 724     RefPtr<StringImpl> new_impl = CreateUninitialized(length_, data8); | 724     RefPtr<StringImpl> new_impl = CreateUninitialized(length_, data8); | 
| 725 | 725 | 
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 864         return output->Substring(0, target_length); | 864         return output->Substring(0, target_length); | 
| 865       return output.Release(); | 865       return output.Release(); | 
| 866     } | 866     } | 
| 867     if (status != U_BUFFER_OVERFLOW_ERROR) | 867     if (status != U_BUFFER_OVERFLOW_ERROR) | 
| 868       return original_string; | 868       return original_string; | 
| 869     // Expand the buffer. | 869     // Expand the buffer. | 
| 870     output = StringImpl::CreateUninitialized(target_length, data16); | 870     output = StringImpl::CreateUninitialized(target_length, data16); | 
| 871   } while (true); | 871   } while (true); | 
| 872 } | 872 } | 
| 873 | 873 | 
| 874 PassRefPtr<StringImpl> StringImpl::Lower( | 874 PassRefPtr<StringImpl> StringImpl::LowerUnicode( | 
| 875     const AtomicString& locale_identifier) { | 875     const AtomicString& locale_identifier) { | 
| 876   // Use the more optimized code path most of the time. | 876   // Use the more optimized code path most of the time. | 
| 877   // Only Turkic (tr and az) languages and Lithuanian requires | 877   // Only Turkic (tr and az) languages and Lithuanian requires | 
| 878   // locale-specific lowercasing rules. Even though CLDR has el-Lower, | 878   // locale-specific lowercasing rules. Even though CLDR has el-Lower, | 
| 879   // it's identical to the locale-agnostic lowercasing. Context-dependent | 879   // it's identical to the locale-agnostic lowercasing. Context-dependent | 
| 880   // handling of Greek capital sigma is built into the common lowercasing | 880   // handling of Greek capital sigma is built into the common lowercasing | 
| 881   // function in ICU. | 881   // function in ICU. | 
| 882   const char* locale_for_conversion = 0; | 882   const char* locale_for_conversion = 0; | 
| 883   if (LocaleIdMatchesLang(locale_identifier, "tr") || | 883   if (LocaleIdMatchesLang(locale_identifier, "tr") || | 
| 884       LocaleIdMatchesLang(locale_identifier, "az")) | 884       LocaleIdMatchesLang(locale_identifier, "az")) | 
| 885     locale_for_conversion = "tr"; | 885     locale_for_conversion = "tr"; | 
| 886   else if (LocaleIdMatchesLang(locale_identifier, "lt")) | 886   else if (LocaleIdMatchesLang(locale_identifier, "lt")) | 
| 887     locale_for_conversion = "lt"; | 887     locale_for_conversion = "lt"; | 
| 888   else | 888   else | 
| 889     return Lower(); | 889     return LowerUnicode(); | 
| 890 | 890 | 
| 891   if (length_ > static_cast<unsigned>(numeric_limits<int32_t>::max())) | 891   if (length_ > static_cast<unsigned>(numeric_limits<int32_t>::max())) | 
| 892     CRASH(); | 892     CRASH(); | 
| 893   int length = length_; | 893   int length = length_; | 
| 894 | 894 | 
| 895   RefPtr<StringImpl> upconverted = UpconvertedString(); | 895   RefPtr<StringImpl> upconverted = UpconvertedString(); | 
| 896   const UChar* source16 = upconverted->Characters16(); | 896   const UChar* source16 = upconverted->Characters16(); | 
| 897   return CaseConvert(source16, length, u_strToLower, locale_for_conversion, | 897   return CaseConvert(source16, length, u_strToLower, locale_for_conversion, | 
| 898                      this); | 898                      this); | 
| 899 } | 899 } | 
| 900 | 900 | 
| 901 PassRefPtr<StringImpl> StringImpl::Upper( | 901 PassRefPtr<StringImpl> StringImpl::UpperUnicode( | 
| 902     const AtomicString& locale_identifier) { | 902     const AtomicString& locale_identifier) { | 
| 903   // Use the more-optimized code path most of the time. | 903   // Use the more-optimized code path most of the time. | 
| 904   // Only Turkic (tr and az) languages, Greek and Lithuanian require | 904   // Only Turkic (tr and az) languages, Greek and Lithuanian require | 
| 905   // locale-specific uppercasing rules. | 905   // locale-specific uppercasing rules. | 
| 906   const char* locale_for_conversion = 0; | 906   const char* locale_for_conversion = 0; | 
| 907   if (LocaleIdMatchesLang(locale_identifier, "tr") || | 907   if (LocaleIdMatchesLang(locale_identifier, "tr") || | 
| 908       LocaleIdMatchesLang(locale_identifier, "az")) | 908       LocaleIdMatchesLang(locale_identifier, "az")) | 
| 909     locale_for_conversion = "tr"; | 909     locale_for_conversion = "tr"; | 
| 910   else if (LocaleIdMatchesLang(locale_identifier, "el")) | 910   else if (LocaleIdMatchesLang(locale_identifier, "el")) | 
| 911     locale_for_conversion = "el"; | 911     locale_for_conversion = "el"; | 
| 912   else if (LocaleIdMatchesLang(locale_identifier, "lt")) | 912   else if (LocaleIdMatchesLang(locale_identifier, "lt")) | 
| 913     locale_for_conversion = "lt"; | 913     locale_for_conversion = "lt"; | 
| 914   else | 914   else | 
| 915     return Upper(); | 915     return UpperUnicode(); | 
| 916 | 916 | 
| 917   if (length_ > static_cast<unsigned>(numeric_limits<int32_t>::max())) | 917   if (length_ > static_cast<unsigned>(numeric_limits<int32_t>::max())) | 
| 918     CRASH(); | 918     CRASH(); | 
| 919   int length = length_; | 919   int length = length_; | 
| 920 | 920 | 
| 921   RefPtr<StringImpl> upconverted = UpconvertedString(); | 921   RefPtr<StringImpl> upconverted = UpconvertedString(); | 
| 922   const UChar* source16 = upconverted->Characters16(); | 922   const UChar* source16 = upconverted->Characters16(); | 
| 923 | 923 | 
| 924   return CaseConvert(source16, length, u_strToUpper, locale_for_conversion, | 924   return CaseConvert(source16, length, u_strToUpper, locale_for_conversion, | 
| 925                      this); | 925                      this); | 
| (...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2246     } else if (LocaleIdMatchesLang(locale_identifier, "lt")) { | 2246     } else if (LocaleIdMatchesLang(locale_identifier, "lt")) { | 
| 2247       // TODO(rob.buis) implement upper-casing rules for lt | 2247       // TODO(rob.buis) implement upper-casing rules for lt | 
| 2248       // like in StringImpl::upper(locale). | 2248       // like in StringImpl::upper(locale). | 
| 2249     } | 2249     } | 
| 2250   } | 2250   } | 
| 2251 | 2251 | 
| 2252   return ToUpper(c); | 2252   return ToUpper(c); | 
| 2253 } | 2253 } | 
| 2254 | 2254 | 
| 2255 }  // namespace WTF | 2255 }  // namespace WTF | 
| OLD | NEW | 
|---|