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
/*
**************************************************************************
@ -438,7 +438,7 @@ RegexMatcher &RegexMatcher::appendReplacement(UText *dest,
status = U_REGEX_INVALID_CAPTURE_GROUP_NAME;
}
}
} else if (u_isdigit(nextChar)) {
// $n Scan for a capture group number
int32_t numCaptureGroups = fPattern->fGroupMap->size();
@ -459,7 +459,7 @@ RegexMatcher &RegexMatcher::appendReplacement(UText *dest,
break;
}
(void)UTEXT_NEXT32(replacement);
groupNum=groupNum*10 + nextDigitVal;
groupNum=groupNum*10 + nextDigitVal;
++numDigits;
}
} else {
@ -801,7 +801,7 @@ UBool RegexMatcher::find(UErrorCode &status) {
case START_LINE:
{
UChar32 c;
UChar32 ch;
if (startPos == fAnchorStart) {
MatchAt(startPos, FALSE, status);
if (U_FAILURE(status)) {
@ -811,17 +811,17 @@ UBool RegexMatcher::find(UErrorCode &status) {
return TRUE;
}
UTEXT_SETNATIVEINDEX(fInputText, startPos);
c = UTEXT_NEXT32(fInputText);
ch = UTEXT_NEXT32(fInputText);
startPos = UTEXT_GETNATIVEINDEX(fInputText);
} else {
UTEXT_SETNATIVEINDEX(fInputText, startPos);
c = UTEXT_PREVIOUS32(fInputText);
ch = UTEXT_PREVIOUS32(fInputText);
UTEXT_SETNATIVEINDEX(fInputText, startPos);
}
if (fPattern->fFlags & UREGEX_UNIX_LINES) {
for (;;) {
if (c == 0x0a) {
if (ch == 0x0a) {
MatchAt(startPos, FALSE, status);
if (U_FAILURE(status)) {
return FALSE;
@ -836,7 +836,7 @@ UBool RegexMatcher::find(UErrorCode &status) {
fHitEnd = TRUE;
return FALSE;
}
c = UTEXT_NEXT32(fInputText);
ch = UTEXT_NEXT32(fInputText);
startPos = UTEXT_GETNATIVEINDEX(fInputText);
// Note that it's perfectly OK for a pattern to have a zero-length
// match at the end of a string, so we must make sure that the loop
@ -846,8 +846,8 @@ UBool RegexMatcher::find(UErrorCode &status) {
}
} else {
for (;;) {
if (isLineTerminator(c)) {
if (c == 0x0d && startPos < fActiveLimit && UTEXT_CURRENT32(fInputText) == 0x0a) {
if (isLineTerminator(ch)) {
if (ch == 0x0d && startPos < fActiveLimit && UTEXT_CURRENT32(fInputText) == 0x0a) {
(void)UTEXT_NEXT32(fInputText);
startPos = UTEXT_GETNATIVEINDEX(fInputText);
}
@ -865,7 +865,7 @@ UBool RegexMatcher::find(UErrorCode &status) {
fHitEnd = TRUE;
return FALSE;
}
c = UTEXT_NEXT32(fInputText);
ch = UTEXT_NEXT32(fInputText);
startPos = UTEXT_GETNATIVEINDEX(fInputText);
// Note that it's perfectly OK for a pattern to have a zero-length
// match at the end of a string, so we must make sure that the loop
@ -1034,7 +1034,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) {
return FALSE;
}
}
U_ASSERT(FALSE);
U_ASSERT(FALSE);
case START_STRING:
case START_CHAR:
@ -1067,7 +1067,7 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) {
case START_LINE:
{
UChar32 c;
UChar32 ch;
if (startPos == fAnchorStart) {
MatchChunkAt(startPos, FALSE, status);
if (U_FAILURE(status)) {
@ -1081,8 +1081,8 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) {
if (fPattern->fFlags & UREGEX_UNIX_LINES) {
for (;;) {
c = inputBuf[startPos-1];
if (c == 0x0a) {
ch = inputBuf[startPos-1];
if (ch == 0x0a) {
MatchChunkAt(startPos, FALSE, status);
if (U_FAILURE(status)) {
return FALSE;
@ -1105,9 +1105,9 @@ UBool RegexMatcher::findUsingChunk(UErrorCode &status) {
}
} else {
for (;;) {
c = inputBuf[startPos-1];
if (isLineTerminator(c)) {
if (c == 0x0d && startPos < fActiveLimit && inputBuf[startPos] == 0x0a) {
ch = inputBuf[startPos-1];
if (isLineTerminator(ch)) {
if (ch == 0x0d && startPos < fActiveLimit && inputBuf[startPos] == 0x0a) {
startPos++;
}
MatchChunkAt(startPos, FALSE, status);
@ -2187,7 +2187,7 @@ int32_t RegexMatcher::split(UText *input,
break;
}
i++;
dest[i] = utext_extract_replace(fInputText, dest[i],
dest[i] = utext_extract_replace(fInputText, dest[i],
start64(groupNum, status), end64(groupNum, status), &status);
}
@ -2200,7 +2200,7 @@ int32_t RegexMatcher::split(UText *input,
if (dest[i] == NULL) {
dest[i] = utext_openUChars(NULL, NULL, 0, &status);
} else {
static UChar emptyString[] = {(UChar)0};
static const UChar emptyString[] = {(UChar)0};
utext_replace(dest[i], 0, utext_nativeLength(dest[i]), emptyString, 0, &status);
}
}
@ -2774,7 +2774,7 @@ void RegexMatcher::MatchAt(int64_t startIdx, UBool toEnd, UErrorCode &status) {
int64_t *pat = fPattern->fCompiledPat->getBuffer();
const UChar *litText = fPattern->fLiteralText.getBuffer();
UVector *sets = fPattern->fSets;
UVector *fSets = fPattern->fSets;
fFrameSize = fPattern->fFrameSize;
REStackFrame *fp = resetStack();
@ -3376,7 +3376,7 @@ GC_Done:
// There is input left. Pick up one char and test it for set membership.
UChar32 c = UTEXT_NEXT32(fInputText);
U_ASSERT(opValue > 0 && opValue < sets->size());
U_ASSERT(opValue > 0 && opValue < fSets->size());
if (c<256) {
Regex8BitSet *s8 = &fPattern->fSets8[opValue];
if (s8->contains(c)) {
@ -3384,7 +3384,7 @@ GC_Done:
break;
}
} else {
UnicodeSet *s = (UnicodeSet *)sets->elementAt(opValue);
UnicodeSet *s = (UnicodeSet *)fSets->elementAt(opValue);
if (s->contains(c)) {
// The character is in the set. A Match.
fp->fInputIdx = UTEXT_GETNATIVEINDEX(fInputText);
@ -3566,7 +3566,14 @@ GC_Done:
}
}
fp = StateSave(fp, fp->fPatIdx, status);
} else {
// Increment time-out counter. (StateSave() does it if count >= minCount)
fTickCounter--;
if (fTickCounter <= 0) {
IncrementTime(status); // Re-initializes fTickCounter
}
}
fp->fPatIdx = opValue + 4; // Loop back.
}
break;
@ -3623,6 +3630,11 @@ GC_Done:
// We haven't met the minimum number of matches yet.
// Loop back for another one.
fp->fPatIdx = opValue + 4; // Loop back.
// Increment time-out counter. (StateSave() does it if count >= minCount)
fTickCounter--;
if (fTickCounter <= 0) {
IncrementTime(status); // Re-initializes fTickCounter
}
} else {
// We do have the minimum number of matches.
@ -3659,9 +3671,9 @@ GC_Done:
if (newFP == (int64_t *)fp) {
break;
}
int32_t i;
for (i=0; i<fFrameSize; i++) {
newFP[i] = ((int64_t *)fp)[i];
int32_t j;
for (j=0; j<fFrameSize; j++) {
newFP[j] = ((int64_t *)fp)[j];
}
fp = (REStackFrame *)newFP;
fStack->setSize(newStackSize);
@ -3818,9 +3830,9 @@ GC_Done:
// This makes the capture groups from within the look-ahead
// expression available.
int64_t *newFP = fStack->getBuffer() + newStackSize - fFrameSize;
int32_t i;
for (i=0; i<fFrameSize; i++) {
newFP[i] = ((int64_t *)fp)[i];
int32_t j;
for (j=0; j<fFrameSize; j++) {
newFP[j] = ((int64_t *)fp)[j];
}
fp = (REStackFrame *)newFP;
fStack->setSize(newStackSize);
@ -4111,9 +4123,9 @@ GC_Done:
// This op scans through all matching input.
// The following LOOP_C op emulates stack unwinding if the following pattern fails.
{
U_ASSERT(opValue > 0 && opValue < sets->size());
U_ASSERT(opValue > 0 && opValue < fSets->size());
Regex8BitSet *s8 = &fPattern->fSets8[opValue];
UnicodeSet *s = (UnicodeSet *)sets->elementAt(opValue);
UnicodeSet *s = (UnicodeSet *)fSets->elementAt(opValue);
// Loop through input, until either the input is exhausted or
// we reach a character that is not a member of the set.
@ -4338,7 +4350,7 @@ void RegexMatcher::MatchChunkAt(int32_t startIdx, UBool toEnd, UErrorCode &statu
int64_t *pat = fPattern->fCompiledPat->getBuffer();
const UChar *litText = fPattern->fLiteralText.getBuffer();
UVector *sets = fPattern->fSets;
UVector *fSets = fPattern->fSets;
const UChar *inputBuf = fInputText->chunkContents;
@ -4916,7 +4928,7 @@ GC_Done:
break;
}
U_ASSERT(opValue > 0 && opValue < sets->size());
U_ASSERT(opValue > 0 && opValue < fSets->size());
// There is input left. Pick up one char and test it for set membership.
UChar32 c;
@ -4928,7 +4940,7 @@ GC_Done:
break;
}
} else {
UnicodeSet *s = (UnicodeSet *)sets->elementAt(opValue);
UnicodeSet *s = (UnicodeSet *)fSets->elementAt(opValue);
if (s->contains(c)) {
// The character is in the set. A Match.
break;
@ -5099,6 +5111,12 @@ GC_Done:
}
}
fp = StateSave(fp, fp->fPatIdx, status);
} else {
// Increment time-out counter. (StateSave() does it if count >= minCount)
fTickCounter--;
if (fTickCounter <= 0) {
IncrementTime(status); // Re-initializes fTickCounter
}
}
fp->fPatIdx = opValue + 4; // Loop back.
}
@ -5156,6 +5174,10 @@ GC_Done:
// We haven't met the minimum number of matches yet.
// Loop back for another one.
fp->fPatIdx = opValue + 4; // Loop back.
fTickCounter--;
if (fTickCounter <= 0) {
IncrementTime(status); // Re-initializes fTickCounter
}
} else {
// We do have the minimum number of matches.
@ -5192,9 +5214,9 @@ GC_Done:
if (newFP == (int64_t *)fp) {
break;
}
int32_t i;
for (i=0; i<fFrameSize; i++) {
newFP[i] = ((int64_t *)fp)[i];
int32_t j;
for (j=0; j<fFrameSize; j++) {
newFP[j] = ((int64_t *)fp)[j];
}
fp = (REStackFrame *)newFP;
fStack->setSize(newStackSize);
@ -5339,9 +5361,9 @@ GC_Done:
// This makes the capture groups from within the look-ahead
// expression available.
int64_t *newFP = fStack->getBuffer() + newStackSize - fFrameSize;
int32_t i;
for (i=0; i<fFrameSize; i++) {
newFP[i] = ((int64_t *)fp)[i];
int32_t j;
for (j=0; j<fFrameSize; j++) {
newFP[j] = ((int64_t *)fp)[j];
}
fp = (REStackFrame *)newFP;
fStack->setSize(newStackSize);
@ -5447,7 +5469,7 @@ GC_Done:
if (lbStartIdx < 0) {
// First time through loop.
lbStartIdx = fp->fInputIdx - minML;
if (lbStartIdx > 0) {
if (lbStartIdx > 0 && lbStartIdx < fInputLength) {
U16_SET_CP_START(inputBuf, 0, lbStartIdx);
}
} else {
@ -5524,7 +5546,7 @@ GC_Done:
if (lbStartIdx < 0) {
// First time through loop.
lbStartIdx = fp->fInputIdx - minML;
if (lbStartIdx > 0) {
if (lbStartIdx > 0 && lbStartIdx < fInputLength) {
U16_SET_CP_START(inputBuf, 0, lbStartIdx);
}
} else {
@ -5601,9 +5623,9 @@ GC_Done:
// This op scans through all matching input.
// The following LOOP_C op emulates stack unwinding if the following pattern fails.
{
U_ASSERT(opValue > 0 && opValue < sets->size());
U_ASSERT(opValue > 0 && opValue < fSets->size());
Regex8BitSet *s8 = &fPattern->fSets8[opValue];
UnicodeSet *s = (UnicodeSet *)sets->elementAt(opValue);
UnicodeSet *s = (UnicodeSet *)fSets->elementAt(opValue);
// Loop through input, until either the input is exhausted or
// we reach a character that is not a member of the set.
@ -5796,3 +5818,4 @@ UOBJECT_DEFINE_RTTI_IMPLEMENTATION(RegexMatcher)
U_NAMESPACE_END
#endif // !UCONFIG_NO_REGULAR_EXPRESSIONS