mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-09 17:31:47 +09:00
Issue #1971 - Part 2: Update ICU source to 63.2.
This commit is contained in:
parent
8df84683be
commit
1e69214382
3160 changed files with 275815 additions and 234203 deletions
|
|
@ -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: udata.cpp
|
||||
* encoding: US-ASCII
|
||||
* encoding: UTF-8
|
||||
* tab size: 8 (not used)
|
||||
* indentation:4
|
||||
*
|
||||
|
|
@ -110,8 +110,12 @@ static u_atomic_int32_t gHaveTriedToLoadCommonData = ATOMIC_INT32_T_INITIALIZER(
|
|||
static UHashtable *gCommonDataCache = NULL; /* Global hash table of opened ICU data files. */
|
||||
static icu::UInitOnce gCommonDataCacheInitOnce = U_INITONCE_INITIALIZER;
|
||||
|
||||
#if U_PLATFORM_HAS_WINUWP_API == 0
|
||||
static UDataFileAccess gDataFileAccess = UDATA_DEFAULT_ACCESS; // Access not synchronized.
|
||||
// Modifying is documented as thread-unsafe.
|
||||
#else
|
||||
static UDataFileAccess gDataFileAccess = UDATA_NO_FILES; // Windows UWP looks in one spot explicitly
|
||||
#endif
|
||||
|
||||
static UBool U_CALLCONV
|
||||
udata_cleanup(void)
|
||||
|
|
@ -202,6 +206,8 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca
|
|||
return didUpdate;
|
||||
}
|
||||
|
||||
#if U_PLATFORM_HAS_WINUWP_API == 0
|
||||
|
||||
static UBool
|
||||
setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCode) {
|
||||
UDataMemory tData;
|
||||
|
|
@ -211,6 +217,8 @@ setCommonICUDataPointer(const void *pData, UBool /*warn*/, UErrorCode *pErrorCod
|
|||
return setCommonICUData(&tData, FALSE, pErrorCode);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static const char *
|
||||
findBasename(const char *path) {
|
||||
const char *basename=uprv_strrchr(path, U_FILE_SEP_CHAR);
|
||||
|
|
@ -410,7 +418,8 @@ private:
|
|||
const char *path; /* working path (u_icudata_Dir) */
|
||||
const char *nextPath; /* path following this one */
|
||||
const char *basename; /* item's basename (icudt22e_mt.res)*/
|
||||
const char *suffix; /* item suffix (can be null) */
|
||||
|
||||
StringPiece suffix; /* item suffix (can be null) */
|
||||
|
||||
uint32_t basenameLen; /* length of basename */
|
||||
|
||||
|
|
@ -424,13 +433,15 @@ private:
|
|||
};
|
||||
|
||||
/**
|
||||
* @param iter The iterator to be initialized. Its current state does not matter.
|
||||
* @param path The full pathname to be iterated over. If NULL, defaults to U_ICUDATA_NAME
|
||||
* @param pkg Package which is being searched for, ex "icudt28l". Will ignore leave directories such as /icudt28l
|
||||
* @param item Item to be searched for. Can include full path, such as /a/b/foo.dat
|
||||
* @param suffix Optional item suffix, if not-null (ex. ".dat") then 'path' can contain 'item' explicitly.
|
||||
* Ex: 'stuff.dat' would be found in '/a/foo:/tmp/stuff.dat:/bar/baz' as item #2.
|
||||
* '/blarg/stuff.dat' would also be found.
|
||||
* @param iter The iterator to be initialized. Its current state does not matter.
|
||||
* @param inPath The full pathname to be iterated over. If NULL, defaults to U_ICUDATA_NAME
|
||||
* @param pkg Package which is being searched for, ex "icudt28l". Will ignore leaf directories such as /icudt28l
|
||||
* @param item Item to be searched for. Can include full path, such as /a/b/foo.dat
|
||||
* @param inSuffix Optional item suffix, if not-null (ex. ".dat") then 'path' can contain 'item' explicitly.
|
||||
* Ex: 'stuff.dat' would be found in '/a/foo:/tmp/stuff.dat:/bar/baz' as item #2.
|
||||
* '/blarg/stuff.dat' would also be found.
|
||||
* Note: inSuffix may also be the 'item' being searched for as well, (ex: "ibm-5348_P100-1997.cnv"), in which case
|
||||
* the 'item' parameter is often the same as pkg. (Though sometimes might have a tree part as well, ex: "icudt62l-curr").
|
||||
*/
|
||||
UDataPathIterator::UDataPathIterator(const char *inPath, const char *pkg,
|
||||
const char *item, const char *inSuffix, UBool doCheckLastFour,
|
||||
|
|
@ -558,7 +569,7 @@ const char *UDataPathIterator::next(UErrorCode *pErrorCode)
|
|||
|
||||
if(checkLastFour == TRUE &&
|
||||
(pathLen>=4) &&
|
||||
uprv_strncmp(pathBuffer.data() +(pathLen-4), suffix, 4)==0 && /* suffix matches */
|
||||
uprv_strncmp(pathBuffer.data() +(pathLen-4), suffix.data(), 4)==0 && /* suffix matches */
|
||||
uprv_strncmp(findBasename(pathBuffer.data()), basename, basenameLen)==0 && /* base matches */
|
||||
uprv_strlen(pathBasename)==(basenameLen+4)) { /* base+suffix = full len */
|
||||
|
||||
|
|
@ -594,8 +605,13 @@ const char *UDataPathIterator::next(UErrorCode *pErrorCode)
|
|||
/* + basename */
|
||||
pathBuffer.append(packageStub.data()+1, packageStub.length()-1, *pErrorCode);
|
||||
|
||||
if(*suffix) /* tack on suffix */
|
||||
if (!suffix.empty()) /* tack on suffix */
|
||||
{
|
||||
if (suffix.length() > 4) {
|
||||
// If the suffix is actually an item ("ibm-5348_P100-1997.cnv") and not an extension (".res")
|
||||
// then we need to ensure that the path ends with a separator.
|
||||
pathBuffer.ensureEndsWithFileSeparator(*pErrorCode);
|
||||
}
|
||||
pathBuffer.append(suffix, *pErrorCode);
|
||||
}
|
||||
}
|
||||
|
|
@ -619,12 +635,14 @@ U_NAMESPACE_END
|
|||
|
||||
/*----------------------------------------------------------------------*
|
||||
* *
|
||||
* Add a static reference to the common data library *
|
||||
* Add a static reference to the common data library *
|
||||
* Unless overridden by an explicit udata_setCommonData, this will be *
|
||||
* our common data. *
|
||||
* *
|
||||
*----------------------------------------------------------------------*/
|
||||
#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time
|
||||
extern "C" const DataHeader U_DATA_API U_ICUDATA_ENTRY_POINT;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This would be a good place for weak-linkage declarations of
|
||||
|
|
@ -672,6 +690,7 @@ openCommonData(const char *path, /* Path from OpenChoice? */
|
|||
if(gCommonICUDataArray[commonDataIndex] != NULL) {
|
||||
return gCommonICUDataArray[commonDataIndex];
|
||||
}
|
||||
#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time
|
||||
int32_t i;
|
||||
for(i = 0; i < commonDataIndex; ++i) {
|
||||
if(gCommonICUDataArray[i]->pHeader == &U_ICUDATA_ENTRY_POINT) {
|
||||
|
|
@ -679,6 +698,7 @@ openCommonData(const char *path, /* Path from OpenChoice? */
|
|||
return NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Add the linked-in data to the list. */
|
||||
|
|
@ -694,11 +714,13 @@ openCommonData(const char *path, /* Path from OpenChoice? */
|
|||
setCommonICUDataPointer(uprv_getICUData_conversion(), FALSE, pErrorCode);
|
||||
}
|
||||
*/
|
||||
#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time
|
||||
setCommonICUDataPointer(&U_ICUDATA_ENTRY_POINT, FALSE, pErrorCode);
|
||||
{
|
||||
Mutex lock;
|
||||
return gCommonICUDataArray[commonDataIndex];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -737,16 +759,19 @@ openCommonData(const char *path, /* Path from OpenChoice? */
|
|||
|
||||
UDataPathIterator iter(u_getDataDirectory(), inBasename, path, ".dat", TRUE, pErrorCode);
|
||||
|
||||
while((UDataMemory_isLoaded(&tData)==FALSE) && (pathBuffer = iter.next(pErrorCode)) != NULL)
|
||||
while ((UDataMemory_isLoaded(&tData)==FALSE) && (pathBuffer = iter.next(pErrorCode)) != NULL)
|
||||
{
|
||||
#ifdef UDATA_DEBUG
|
||||
fprintf(stderr, "ocd: trying path %s - ", pathBuffer);
|
||||
#endif
|
||||
uprv_mapFile(&tData, pathBuffer);
|
||||
uprv_mapFile(&tData, pathBuffer, pErrorCode);
|
||||
#ifdef UDATA_DEBUG
|
||||
fprintf(stderr, "%s\n", UDataMemory_isLoaded(&tData)?"LOADED":"not loaded");
|
||||
#endif
|
||||
}
|
||||
if (U_FAILURE(*pErrorCode)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if defined(OS390_STUBDATA) && defined(OS390BATCH)
|
||||
if (!UDataMemory_isLoaded(&tData)) {
|
||||
|
|
@ -755,7 +780,7 @@ openCommonData(const char *path, /* Path from OpenChoice? */
|
|||
uprv_strncpy(ourPathBuffer, path, 1019);
|
||||
ourPathBuffer[1019]=0;
|
||||
uprv_strcat(ourPathBuffer, ".dat");
|
||||
uprv_mapFile(&tData, ourPathBuffer);
|
||||
uprv_mapFile(&tData, ourPathBuffer, pErrorCode);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
@ -846,7 +871,7 @@ static UBool extendICUData(UErrorCode *pErr)
|
|||
umtx_unlock(&extendICUDataMutex);
|
||||
#endif
|
||||
return didUpdate; /* Return true if ICUData pointer was updated. */
|
||||
/* (Could potentialy have been done by another thread racing */
|
||||
/* (Could potentially have been done by another thread racing */
|
||||
/* us through here, but that's fine, we still return true */
|
||||
/* so that current thread will also examine extended data. */
|
||||
}
|
||||
|
|
@ -972,12 +997,12 @@ static UDataMemory *doLoadFromIndividualFiles(const char *pkgName,
|
|||
/* init path iterator for individual files */
|
||||
UDataPathIterator iter(dataPath, pkgName, path, tocEntryPathSuffix, FALSE, pErrorCode);
|
||||
|
||||
while((pathBuffer = iter.next(pErrorCode)))
|
||||
while ((pathBuffer = iter.next(pErrorCode)) != NULL)
|
||||
{
|
||||
#ifdef UDATA_DEBUG
|
||||
fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer);
|
||||
#endif
|
||||
if(uprv_mapFile(&dataMemory, pathBuffer))
|
||||
if (uprv_mapFile(&dataMemory, pathBuffer, pErrorCode))
|
||||
{
|
||||
pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
|
||||
if (pEntryData != NULL) {
|
||||
|
|
@ -993,7 +1018,7 @@ static UDataMemory *doLoadFromIndividualFiles(const char *pkgName,
|
|||
return pEntryData;
|
||||
}
|
||||
|
||||
/* the data is not acceptable, or some error occured. Either way, unmap the memory */
|
||||
/* the data is not acceptable, or some error occurred. Either way, unmap the memory */
|
||||
udata_close(&dataMemory);
|
||||
|
||||
/* If we had a nasty error, bail out completely. */
|
||||
|
|
@ -1062,6 +1087,11 @@ static UDataMemory *doLoadFromCommonData(UBool isICUData, const char * /*pkgName
|
|||
}
|
||||
}
|
||||
}
|
||||
// If we failed due to being out-of-memory, then stop early and report the error.
|
||||
if (*subErrorCode == U_MEMORY_ALLOCATION_ERROR) {
|
||||
*pErrorCode = *subErrorCode;
|
||||
return NULL;
|
||||
}
|
||||
/* Data wasn't found. If we were looking for an ICUData item and there is
|
||||
* more data available, load it and try again,
|
||||
* otherwise break out of this loop. */
|
||||
|
|
@ -1155,7 +1185,7 @@ doOpenChoice(const char *path, const char *type, const char *name,
|
|||
if(uprv_strchr(path,U_FILE_ALT_SEP_CHAR) != NULL) {
|
||||
altSepPath.append(path, *pErrorCode);
|
||||
char *p;
|
||||
while((p=uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR))) {
|
||||
while ((p = uprv_strchr(altSepPath.data(), U_FILE_ALT_SEP_CHAR)) != NULL) {
|
||||
*p = U_FILE_SEP_CHAR;
|
||||
}
|
||||
#if defined (UDATA_DEBUG)
|
||||
|
|
@ -1238,16 +1268,22 @@ doOpenChoice(const char *path, const char *type, const char *name,
|
|||
tocEntryName.append(".", *pErrorCode).append(type, *pErrorCode);
|
||||
tocEntryPath.append(".", *pErrorCode).append(type, *pErrorCode);
|
||||
}
|
||||
tocEntryPathSuffix = tocEntryPath.data()+tocEntrySuffixIndex; /* suffix starts here */
|
||||
// The +1 is for the U_FILE_SEP_CHAR that is always appended above.
|
||||
tocEntryPathSuffix = tocEntryPath.data() + tocEntrySuffixIndex + 1; /* suffix starts here */
|
||||
|
||||
#ifdef UDATA_DEBUG
|
||||
fprintf(stderr, " tocEntryName = %s\n", tocEntryName.data());
|
||||
fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.data());
|
||||
#endif
|
||||
|
||||
#if U_PLATFORM_HAS_WINUWP_API == 0 // Windows UWP Platform does not support dll icu data at this time
|
||||
if(path == NULL) {
|
||||
path = COMMON_DATA_NAME; /* "icudt26e" */
|
||||
}
|
||||
#else
|
||||
// Windows UWP expects only a single data file.
|
||||
path = COMMON_DATA_NAME; /* "icudt26e" */
|
||||
#endif
|
||||
|
||||
/************************ Begin loop looking for ind. files ***************/
|
||||
#ifdef UDATA_DEBUG
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue