Issue #1971 - Part 2: Update ICU source to 63.2.

This commit is contained in:
Job Bautista 2022-07-24 21:03:27 +08:00 committed by roytam1
commit 1e69214382
3160 changed files with 275815 additions and 234203 deletions

View file

@ -1,4 +1,4 @@
// Copyright (C) 2016 and later: Unicode, Inc. and others.
// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/*
*******************************************************************************
@ -8,7 +8,7 @@
*
*******************************************************************************
* file name: utext.cpp
* encoding: US-ASCII
* encoding: UTF-8
* tab size: 8 (not used)
* indentation:4
*
@ -847,9 +847,11 @@ U_CDECL_END
//------------------------------------------------------------------------------
// Chunk size.
// Must be less than 85, because of byte mapping from UChar indexes to native indexes.
// Must be less than 85 (256/3), because of byte mapping from UChar indexes to native indexes.
// Worst case is three native bytes to one UChar. (Supplemenaries are 4 native bytes
// to two UChars.)
// The longest illegal byte sequence treated as a single error (and converted to U+FFFD)
// is a three-byte sequence (truncated four-byte sequence).
//
enum { UTF8_TEXT_CHUNK_SIZE=32 };
@ -1032,6 +1034,7 @@ utf8TextAccess(UText *ut, int64_t index, UBool forward) {
// Requested index is in this buffer.
u8b = (UTF8Buf *)ut->p; // the current buffer
mapIndex = ix - u8b->toUCharsMapStart;
U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars));
ut->chunkOffset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
return TRUE;
@ -1193,9 +1196,9 @@ fillForward:
// Swap the UText buffers.
// We want to fill what was previously the alternate buffer,
// and make what was the current buffer be the new alternate.
UTF8Buf *u8b = (UTF8Buf *)ut->q;
UTF8Buf *u8b_swap = (UTF8Buf *)ut->q;
ut->q = ut->p;
ut->p = u8b;
ut->p = u8b_swap;
int32_t strLen = ut->b;
UBool nulTerminated = FALSE;
@ -1204,9 +1207,9 @@ fillForward:
nulTerminated = TRUE;
}
UChar *buf = u8b->buf;
uint8_t *mapToNative = u8b->mapToNative;
uint8_t *mapToUChars = u8b->mapToUChars;
UChar *buf = u8b_swap->buf;
uint8_t *mapToNative = u8b_swap->mapToNative;
uint8_t *mapToUChars = u8b_swap->mapToUChars;
int32_t destIx = 0;
int32_t srcIx = ix;
UBool seenNonAscii = FALSE;
@ -1227,7 +1230,7 @@ fillForward:
// General case, handle everything.
if (seenNonAscii == FALSE) {
seenNonAscii = TRUE;
u8b->bufNILimit = destIx;
u8b_swap->bufNILimit = destIx;
}
int32_t cIx = srcIx;
@ -1260,22 +1263,22 @@ fillForward:
mapToUChars[srcIx - ix] = (uint8_t)destIx;
// fill in Buffer descriptor
u8b->bufNativeStart = ix;
u8b->bufNativeLimit = srcIx;
u8b->bufStartIdx = 0;
u8b->bufLimitIdx = destIx;
u8b_swap->bufNativeStart = ix;
u8b_swap->bufNativeLimit = srcIx;
u8b_swap->bufStartIdx = 0;
u8b_swap->bufLimitIdx = destIx;
if (seenNonAscii == FALSE) {
u8b->bufNILimit = destIx;
u8b_swap->bufNILimit = destIx;
}
u8b->toUCharsMapStart = u8b->bufNativeStart;
u8b_swap->toUCharsMapStart = u8b_swap->bufNativeStart;
// Set UText chunk to refer to this buffer.
ut->chunkContents = buf;
ut->chunkOffset = 0;
ut->chunkLength = u8b->bufLimitIdx;
ut->chunkNativeStart = u8b->bufNativeStart;
ut->chunkNativeLimit = u8b->bufNativeLimit;
ut->nativeIndexingLimit = u8b->bufNILimit;
ut->chunkLength = u8b_swap->bufLimitIdx;
ut->chunkNativeStart = u8b_swap->bufNativeStart;
ut->chunkNativeLimit = u8b_swap->bufNativeLimit;
ut->nativeIndexingLimit = u8b_swap->bufNILimit;
// For zero terminated strings, keep track of the maximum point
// scanned so far.
@ -1298,20 +1301,27 @@ fillReverse:
// Can only do this if the incoming index is somewhere in the interior of the string.
// If index is at the end, there is no character there to look at.
if (ix != ut->b) {
// Note: this function will only move the index back if it is on a trail byte
// and there is a preceding lead byte and the sequence from the lead
// through this trail could be part of a valid UTF-8 sequence
// Otherwise the index remains unchanged.
U8_SET_CP_START(s8, 0, ix);
}
// Swap the UText buffers.
// We want to fill what was previously the alternate buffer,
// and make what was the current buffer be the new alternate.
UTF8Buf *u8b = (UTF8Buf *)ut->q;
UTF8Buf *u8b_swap = (UTF8Buf *)ut->q;
ut->q = ut->p;
ut->p = u8b;
ut->p = u8b_swap;
UChar *buf = u8b->buf;
uint8_t *mapToNative = u8b->mapToNative;
uint8_t *mapToUChars = u8b->mapToUChars;
int32_t toUCharsMapStart = ix - (UTF8_TEXT_CHUNK_SIZE*3 + 1);
UChar *buf = u8b_swap->buf;
uint8_t *mapToNative = u8b_swap->mapToNative;
uint8_t *mapToUChars = u8b_swap->mapToUChars;
int32_t toUCharsMapStart = ix - sizeof(UTF8Buf::mapToUChars) + 1;
// Note that toUCharsMapStart can be negative. Happens when the remaining
// text from current position to the beginning is less than the buffer size.
// + 1 because mapToUChars must have a slot at the end for the bufNativeLimit entry.
int32_t destIx = UTF8_TEXT_CHUNK_SIZE+2; // Start in the overflow region
// at end of buffer to leave room
// for a surrogate pair at the
@ -1338,6 +1348,7 @@ fillReverse:
if (c<0x80) {
// Special case ASCII range for speed.
buf[destIx] = (UChar)c;
U_ASSERT(toUCharsMapStart <= srcIx);
mapToUChars[srcIx - toUCharsMapStart] = (uint8_t)destIx;
mapToNative[destIx] = (uint8_t)(srcIx - toUCharsMapStart);
} else {
@ -1367,6 +1378,7 @@ fillReverse:
do {
mapToUChars[sIx-- - toUCharsMapStart] = (uint8_t)destIx;
} while (sIx >= srcIx);
U_ASSERT(toUCharsMapStart <= (srcIx+1));
// Set native indexing limit to be the current position.
// We are processing a non-ascii, non-native-indexing char now;
@ -1375,19 +1387,19 @@ fillReverse:
bufNILimit = destIx;
}
}
u8b->bufNativeStart = srcIx;
u8b->bufNativeLimit = ix;
u8b->bufStartIdx = destIx;
u8b->bufLimitIdx = UTF8_TEXT_CHUNK_SIZE+2;
u8b->bufNILimit = bufNILimit - u8b->bufStartIdx;
u8b->toUCharsMapStart = toUCharsMapStart;
u8b_swap->bufNativeStart = srcIx;
u8b_swap->bufNativeLimit = ix;
u8b_swap->bufStartIdx = destIx;
u8b_swap->bufLimitIdx = UTF8_TEXT_CHUNK_SIZE+2;
u8b_swap->bufNILimit = bufNILimit - u8b_swap->bufStartIdx;
u8b_swap->toUCharsMapStart = toUCharsMapStart;
ut->chunkContents = &buf[u8b->bufStartIdx];
ut->chunkLength = u8b->bufLimitIdx - u8b->bufStartIdx;
ut->chunkContents = &buf[u8b_swap->bufStartIdx];
ut->chunkLength = u8b_swap->bufLimitIdx - u8b_swap->bufStartIdx;
ut->chunkOffset = ut->chunkLength;
ut->chunkNativeStart = u8b->bufNativeStart;
ut->chunkNativeLimit = u8b->bufNativeLimit;
ut->nativeIndexingLimit = u8b->bufNILimit;
ut->chunkNativeStart = u8b_swap->bufNativeStart;
ut->chunkNativeLimit = u8b_swap->bufNativeLimit;
ut->nativeIndexingLimit = u8b_swap->bufNILimit;
return TRUE;
}
@ -1541,6 +1553,7 @@ utf8TextMapIndexToUTF16(const UText *ut, int64_t index64) {
U_ASSERT(index>=ut->chunkNativeStart+ut->nativeIndexingLimit);
U_ASSERT(index<=ut->chunkNativeLimit);
int32_t mapIndex = index - u8b->toUCharsMapStart;
U_ASSERT(mapIndex < (int32_t)sizeof(UTF8Buf::mapToUChars));
int32_t offset = u8b->mapToUChars[mapIndex] - u8b->bufStartIdx;
U_ASSERT(offset>=0 && offset<=ut->chunkLength);
return offset;
@ -2225,13 +2238,13 @@ unistrTextCopy(UText *ut,
}
if(move) {
// move: copy to destIndex, then replace original with nothing
// move: copy to destIndex, then remove original
int32_t segLength=limit32-start32;
us->copy(start32, limit32, destIndex32);
if(destIndex32<start32) {
start32+=segLength;
}
us->replace(start32, segLength, NULL, 0);
us->remove(start32, segLength);
} else {
// copy
us->copy(start32, limit32, destIndex32);