src/share/classes/java/lang/String.java

Print this page

        

*** 2547,2637 **** */ public String toLowerCase(Locale locale) { if (locale == null) { throw new NullPointerException(); } ! ! int firstUpper; final int len = value.length; ! /* Now check if there are any characters that need to be changed. */ ! scan: { ! for (firstUpper = 0 ; firstUpper < len; ) { ! char c = value[firstUpper]; ! if ((c >= Character.MIN_HIGH_SURROGATE) ! && (c <= Character.MAX_HIGH_SURROGATE)) { ! int supplChar = codePointAt(firstUpper); ! if (supplChar != Character.toLowerCase(supplChar)) { ! break scan; ! } ! firstUpper += Character.charCount(supplChar); ! } else { ! if (c != Character.toLowerCase(c)) { ! break scan; } ! firstUpper++; } } return this; - } - char[] result = new char[len]; ! int resultOffset = 0; /* result may grow, so i+resultOffset ! * is the write location in result */ ! ! /* Just copy the first few lowerCase characters. */ ! System.arraycopy(value, 0, result, 0, firstUpper); ! String lang = locale.getLanguage(); ! boolean localeDependent = ! (lang == "tr" || lang == "az" || lang == "lt"); ! char[] lowerCharArray; ! int lowerChar; ! int srcChar; int srcCount; ! for (int i = firstUpper; i < len; i += srcCount) { ! srcChar = (int)value[i]; ! if ((char)srcChar >= Character.MIN_HIGH_SURROGATE ! && (char)srcChar <= Character.MAX_HIGH_SURROGATE) { srcChar = codePointAt(i); srcCount = Character.charCount(srcChar); - } else { - srcCount = 1; } if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale); } else { lowerChar = Character.toLowerCase(srcChar); } ! if ((lowerChar == Character.ERROR) ! || (lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) { if (lowerChar == Character.ERROR) { ! lowerCharArray = ! ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale); } else if (srcCount == 2) { ! resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount; continue; } else { lowerCharArray = Character.toChars(lowerChar); } - /* Grow result if needed */ int mapLen = lowerCharArray.length; if (mapLen > srcCount) { char[] result2 = new char[result.length + mapLen - srcCount]; ! System.arraycopy(result, 0, result2, 0, i + resultOffset); result = result2; } for (int x = 0; x < mapLen; ++x) { ! result[i + resultOffset + x] = lowerCharArray[x]; } - resultOffset += (mapLen - srcCount); - } else { - result[i + resultOffset] = (char)lowerChar; } } ! return new String(result, 0, len + resultOffset); } /** * Converts all of the characters in this {@code String} to lower * case using the rules of the default locale. This is equivalent to calling --- 2547,2638 ---- */ public String toLowerCase(Locale locale) { if (locale == null) { throw new NullPointerException(); } ! int first; ! boolean hasSurr = false; final int len = value.length; ! // Now check if there are any characters that need to be changed, or are surrogate ! for (first = 0 ; first < len; first++) { ! int cp = (int)value[first]; ! if (Character.isSurrogate((char)cp)) { ! hasSurr = true; ! break; } ! if (cp != Character.toLowerCase(cp)) { // no need to check Character.ERROR ! break; } } + if (first == len) return this; char[] result = new char[len]; ! System.arraycopy(value, 0, result, 0, first); // Just copy the first few ! // lowerCase characters. String lang = locale.getLanguage(); ! if (lang == "tr" || lang == "az" || lang == "lt") { ! return toLowerCaseEx(result, first, locale, true); ! } ! if (hasSurr) { ! return toLowerCaseEx(result, first, locale, false); ! } ! for (int i = first; i < len; i++) { ! int cp = (int)value[i]; ! if (cp == '\u03A3') { // GREEK CAPITAL LETTER SIGMA ! return toLowerCaseEx(result, i, locale, false); ! } ! cp = Character.toLowerCase(cp); ! if (!Character.isBmpCodePoint(cp)) { ! return toLowerCaseEx(result, i, locale, false); ! } ! result[i] = (char)cp; ! } ! return new String(result, true); ! } ! ! private String toLowerCaseEx(char[] result, int first, Locale locale, boolean localeDependent) { ! int resultOffset = first; int srcCount; ! for (int i = first; i < value.length; i += srcCount) { ! int srcChar = (int)value[i]; ! int lowerChar; ! char[] lowerCharArray; ! srcCount = 1; ! if (Character.isSurrogate((char)srcChar)) { srcChar = codePointAt(i); srcCount = Character.charCount(srcChar); } if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale); } else { lowerChar = Character.toLowerCase(srcChar); } ! if (Character.isBmpCodePoint(lowerChar)) { // Character.ERROR is not a bmp ! result[resultOffset++] = (char)lowerChar; ! } else { if (lowerChar == Character.ERROR) { ! lowerCharArray = ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale); } else if (srcCount == 2) { ! resultOffset += Character.toChars(lowerChar, result, resultOffset); continue; } else { lowerCharArray = Character.toChars(lowerChar); } /* Grow result if needed */ int mapLen = lowerCharArray.length; if (mapLen > srcCount) { char[] result2 = new char[result.length + mapLen - srcCount]; ! System.arraycopy(result, 0, result2, 0, resultOffset); result = result2; } for (int x = 0; x < mapLen; ++x) { ! result[resultOffset++] = lowerCharArray[x]; } } } ! return new String(result, 0, resultOffset); } /** * Converts all of the characters in this {@code String} to lower * case using the rules of the default locale. This is equivalent to calling
*** 2705,2800 **** */ public String toUpperCase(Locale locale) { if (locale == null) { throw new NullPointerException(); } ! ! int firstLower; final int len = value.length; ! /* Now check if there are any characters that need to be changed. */ ! scan: { ! for (firstLower = 0 ; firstLower < len; ) { ! int c = (int)value[firstLower]; ! int srcCount; ! if ((c >= Character.MIN_HIGH_SURROGATE) ! && (c <= Character.MAX_HIGH_SURROGATE)) { ! c = codePointAt(firstLower); ! srcCount = Character.charCount(c); ! } else { ! srcCount = 1; } ! int upperCaseChar = Character.toUpperCaseEx(c); ! if ((upperCaseChar == Character.ERROR) ! || (c != upperCaseChar)) { ! break scan; } - firstLower += srcCount; } return this; } ! ! /* result may grow, so i+resultOffset is the write location in result */ ! int resultOffset = 0; ! char[] result = new char[len]; /* may grow */ ! ! /* Just copy the first few upperCase characters. */ ! System.arraycopy(value, 0, result, 0, firstLower); ! String lang = locale.getLanguage(); ! boolean localeDependent = ! (lang == "tr" || lang == "az" || lang == "lt"); ! char[] upperCharArray; ! int upperChar; ! int srcChar; int srcCount; ! for (int i = firstLower; i < len; i += srcCount) { ! srcChar = (int)value[i]; ! if ((char)srcChar >= Character.MIN_HIGH_SURROGATE && ! (char)srcChar <= Character.MAX_HIGH_SURROGATE) { srcChar = codePointAt(i); srcCount = Character.charCount(srcChar); - } else { - srcCount = 1; } if (localeDependent) { upperChar = ConditionalSpecialCasing.toUpperCaseEx(this, i, locale); } else { upperChar = Character.toUpperCaseEx(srcChar); } ! if ((upperChar == Character.ERROR) ! || (upperChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) { if (upperChar == Character.ERROR) { if (localeDependent) { upperCharArray = ConditionalSpecialCasing.toUpperCaseCharArray(this, i, locale); } else { upperCharArray = Character.toUpperCaseCharArray(srcChar); } } else if (srcCount == 2) { ! resultOffset += Character.toChars(upperChar, result, i + resultOffset) - srcCount; continue; } else { upperCharArray = Character.toChars(upperChar); } - /* Grow result if needed */ int mapLen = upperCharArray.length; if (mapLen > srcCount) { char[] result2 = new char[result.length + mapLen - srcCount]; ! System.arraycopy(result, 0, result2, 0, i + resultOffset); result = result2; } for (int x = 0; x < mapLen; ++x) { ! result[i + resultOffset + x] = upperCharArray[x]; } - resultOffset += (mapLen - srcCount); - } else { - result[i + resultOffset] = (char)upperChar; } } ! return new String(result, 0, len + resultOffset); } /** * Converts all of the characters in this {@code String} to upper * case using the rules of the default locale. This method is equivalent to --- 2706,2800 ---- */ public String toUpperCase(Locale locale) { if (locale == null) { throw new NullPointerException(); } ! int first; ! boolean hasSurr = false; final int len = value.length; ! // Now check if there are any characters that need to be changed, or are surrogate ! for (first = 0 ; first < len; first++ ) { ! int cp = (int)value[first]; ! if (Character.isSurrogate((char)cp)) { ! hasSurr = true; ! break; } ! if (cp != Character.toUpperCaseEx(cp)) { // no need to check Character.ERROR ! break; } } + if (first == len) { return this; } ! char[] result = new char[len]; ! System.arraycopy(value, 0, result, 0, first); // Just copy the first few ! // upperCase characters. String lang = locale.getLanguage(); ! if (lang == "tr" || lang == "az" || lang == "lt") { ! return toUpperCaseEx(result, first, locale, true); ! } ! if (hasSurr) { ! return toUpperCaseEx(result, first, locale, false); ! } ! for (int i = first; i < len; i++) { ! int cp = Character.toUpperCaseEx((int)value[i]); ! if (!Character.isBmpCodePoint(cp)) { // Character.ERROR is not bmp ! return toUpperCaseEx(result, i, locale, false); ! } ! result[i] = (char)cp; ! } ! return new String(result, true); ! } ! ! private String toUpperCaseEx(char[] result, int first, Locale locale, ! boolean localeDependent) { ! int resultOffset = first; int srcCount; ! for (int i = first; i < value.length; i += srcCount) { ! int srcChar = (int)value[i]; ! int upperChar; ! char[] upperCharArray; ! srcCount = 1; ! if (Character.isSurrogate((char)srcChar)) { srcChar = codePointAt(i); srcCount = Character.charCount(srcChar); } if (localeDependent) { upperChar = ConditionalSpecialCasing.toUpperCaseEx(this, i, locale); } else { upperChar = Character.toUpperCaseEx(srcChar); } ! if (Character.isBmpCodePoint(upperChar)) { ! result[resultOffset++] = (char)upperChar; ! } else { if (upperChar == Character.ERROR) { if (localeDependent) { upperCharArray = ConditionalSpecialCasing.toUpperCaseCharArray(this, i, locale); } else { upperCharArray = Character.toUpperCaseCharArray(srcChar); } } else if (srcCount == 2) { ! resultOffset += Character.toChars(upperChar, result, resultOffset); continue; } else { upperCharArray = Character.toChars(upperChar); } /* Grow result if needed */ int mapLen = upperCharArray.length; if (mapLen > srcCount) { char[] result2 = new char[result.length + mapLen - srcCount]; ! System.arraycopy(result, 0, result2, 0, resultOffset); result = result2; } for (int x = 0; x < mapLen; ++x) { ! result[resultOffset++] = upperCharArray[x]; } } } ! return new String(result, 0, resultOffset); } /** * Converts all of the characters in this {@code String} to upper * case using the rules of the default locale. This method is equivalent to