-/**
- * Implements {@link Transliterator#handleTransliterate}.
- */
-void LowercaseTransliterator::handleTransliterate(Replaceable& text,
- UTransPosition& offsets,
- UBool isIncremental) const
-{
- int32_t textPos = offsets.start;
- if (textPos >= offsets.limit) return;
-
- // get string for context
-
- UnicodeString original;
- text.extractBetween(offsets.contextStart, offsets.contextLimit, original);
-
- UCharIterator iter;
- uiter_setReplaceable(&iter, &text);
- iter.start = offsets.contextStart;
- iter.limit = offsets.contextLimit;
-
- // Walk through original string
- // If there is a case change, modify corresponding position in replaceable
-
- int32_t i = textPos - offsets.contextStart;
- int32_t limit = offsets.limit - offsets.contextStart;
- UChar32 cp;
- int32_t oldLen;
-
- for (; i < limit; ) {
- UTF_GET_CHAR(original.getBuffer(), 0, i, original.length(), cp);
- oldLen = UTF_CHAR_LENGTH(cp);
- i += oldLen;
- iter.index = i; // Point _past_ current char
- int32_t newLen = u_internalToLower(cp, &iter, buffer, u_getMaxCaseExpansion(), loc.getName());
- if (newLen >= 0) {
- UnicodeString temp(buffer, newLen);
- text.handleReplaceBetween(textPos, textPos + oldLen, temp);
- if (newLen != oldLen) {
- textPos += newLen;
- offsets.limit += newLen - oldLen;
- offsets.contextLimit += newLen - oldLen;
- continue;
- }
- }
- textPos += oldLen;
- }
- offsets.start = offsets.limit;
-}