summaryrefslogtreecommitdiff
path: root/Build/source/libs/icu-xetex/common/udata.c
diff options
context:
space:
mode:
authorJonathan Kew <jfkthame@googlemail.com>2007-11-21 12:29:46 +0000
committerJonathan Kew <jfkthame@googlemail.com>2007-11-21 12:29:46 +0000
commit952d69f85d43b087ce9fa79d3fc6f1c076000bc7 (patch)
treedd6937a6486e80e1638618308481075efab000ae /Build/source/libs/icu-xetex/common/udata.c
parent888236cb9df7b7d7b5a3e2d784037a9a59511c53 (diff)
updated icu-xetex library for XeTeX 0.997
git-svn-id: svn://tug.org/texlive/trunk@5536 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/icu-xetex/common/udata.c')
-rw-r--r--Build/source/libs/icu-xetex/common/udata.c218
1 files changed, 55 insertions, 163 deletions
diff --git a/Build/source/libs/icu-xetex/common/udata.c b/Build/source/libs/icu-xetex/common/udata.c
index dd8e5d5831f..5ffd85079a0 100644
--- a/Build/source/libs/icu-xetex/common/udata.c
+++ b/Build/source/libs/icu-xetex/common/udata.c
@@ -1,7 +1,7 @@
/*
******************************************************************************
*
-* Copyright (C) 1999-2005, International Business Machines
+* Copyright (C) 1999-2006, International Business Machines
* Corporation and others. All Rights Reserved.
*
******************************************************************************
@@ -139,7 +139,6 @@ setCommonICUData(UDataMemory *pData, /* The new common data. Belongs to ca
uprv_free(newCommonData);
}
umtx_unlock(NULL);
- return;
}
static const char *
@@ -218,7 +217,7 @@ static UHashtable *udata_getHashTable() {
return gCommonDataCache;
}
- tHT = uhash_open(uhash_hashChars, uhash_compareChars, &err);
+ tHT = uhash_open(uhash_hashChars, uhash_compareChars, NULL, &err);
uhash_setValueDeleter(tHT, DataCacheElement_deleter);
umtx_lock(NULL);
@@ -284,6 +283,7 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr
}
newElement->item = UDataMemory_createNewInstance(pErr);
if (U_FAILURE(*pErr)) {
+ uprv_free(newElement);
return NULL;
}
UDatamemory_assign(newElement->item, item);
@@ -293,6 +293,8 @@ static UDataMemory *udata_cacheDataItem(const char *path, UDataMemory *item, UEr
newElement->name = uprv_malloc(nameLen+1);
if (newElement->name == NULL) {
*pErr = U_MEMORY_ALLOCATION_ERROR;
+ uprv_free(newElement->item);
+ uprv_free(newElement);
return NULL;
}
uprv_strcpy(newElement->name, baseName);
@@ -493,11 +495,6 @@ static void udata_pathiter_init(UDataPathIterator *iter, const char *path, const
iter->basename = findBasename(item);
iter->basenameLen = (int32_t)uprv_strlen(iter->basename);
- if(iter->basename == NULL) {
- iter->nextPath = NULL;
- return;
- }
-
/** Item path **/
iter->itemPath = iter->itemPathBuf;
if(iter->basename == item) {
@@ -576,7 +573,7 @@ static const char *udata_pathiter_next(UDataPathIterator *iter)
do
{
if( iter->nextPath == NULL ) {
- return NULL;
+ break;
}
path = iter->nextPath;
@@ -698,6 +695,10 @@ static void udata_pathiter_dt(UDataPathIterator *iter) {
uprv_free(iter->pathBuffer);
iter->pathBuffer = NULL;
}
+ if (iter->packageStub != iter->packageStubBuf) {
+ uprv_free(iter->packageStub);
+ iter->packageStub = NULL;
+ }
}
/* ==================================================================================*/
@@ -1012,118 +1013,72 @@ checkDataItem
/**
* @return 0 if not loaded, 1 if loaded or err
*/
-static UDataMemory *doLoadFromIndividualFiles(const char *pkgName, const char *oldIndFileName,
- const char *dataPath, const char *tocEntryPathSuffix, const char *inBasename,
+static UDataMemory *doLoadFromIndividualFiles(const char *pkgName,
+ const char *dataPath, const char *tocEntryPathSuffix,
/* following arguments are the same as doOpenChoice itself */
const char *path, const char *type, const char *name,
UDataMemoryIsAcceptable *isAcceptable, void *context,
UErrorCode *subErrorCode,
UErrorCode *pErrorCode)
{
- UDataMemory *retVal = NULL;
- const char *pathBuffer;
- UDataMemory dataMemory;
- UDataMemory *pEntryData;
-
- UDataPathIterator iter;
- /* #1a look in ind. files: package\nam.typ ========================= */
- /* init path iterator for individual files */
- udata_pathiter_init(&iter, dataPath, pkgName, path, tocEntryPathSuffix, FALSE);
-
- while((pathBuffer = udata_pathiter_next(&iter)))
- {
-#ifdef UDATA_DEBUG
- fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer);
-#endif
- if( uprv_mapFile(&dataMemory, pathBuffer) ||
- (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename)))
- {
- pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
- if (pEntryData != NULL) {
- /* Data is good.
- * Hand off ownership of the backing memory to the user's UDataMemory.
- * and return it. */
- pEntryData->mapAddr = dataMemory.mapAddr;
- pEntryData->map = dataMemory.map;
-
-#ifdef UDATA_DEBUG
- fprintf(stderr, "** Mapped file: %s\n", pathBuffer);
-#endif
- retVal = pEntryData;
- goto commonReturn;
- }
+ UDataMemory *retVal = NULL;
+ const char *pathBuffer;
+ UDataMemory dataMemory;
+ UDataMemory *pEntryData;
- /* the data is not acceptable, or some error occured. Either way, unmap the memory */
- udata_close(&dataMemory);
+ UDataPathIterator iter;
+ /* look in ind. files: package\nam.typ ========================= */
+ /* init path iterator for individual files */
+ udata_pathiter_init(&iter, dataPath, pkgName, path, tocEntryPathSuffix, FALSE);
- /* If we had a nasty error, bail out completely. */
- if (U_FAILURE(*pErrorCode)) {
- retVal = NULL;
- goto commonReturn;
- }
-
- /* Otherwise remember that we found data but didn't like it for some reason */
- *subErrorCode=U_INVALID_FORMAT_ERROR;
- }
+ while((pathBuffer = udata_pathiter_next(&iter)))
+ {
#ifdef UDATA_DEBUG
- fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded");
+ fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer);
#endif
- }
- udata_pathiter_dt(&iter);
-
- /* #1b look in ind. files - with old naming (package_nam.typ not package\nam.typ) ==================== */
- /* init path iterator for individual files */
- udata_pathiter_init(&iter, dataPath, "", path, oldIndFileName, FALSE);
-
- while((pathBuffer = udata_pathiter_next(&iter)))
+ if(uprv_mapFile(&dataMemory, pathBuffer))
{
-#ifdef UDATA_DEBUG
- fprintf(stderr, "UDATA: trying individual file %s\n", pathBuffer);
-#endif
- if( uprv_mapFile(&dataMemory, pathBuffer) ||
- (inBasename!=pathBuffer && uprv_mapFile(&dataMemory, inBasename)))
- {
- pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
- if (pEntryData != NULL) {
- /* Data is good.
- * Hand off ownership of the backing memory to the user's UDataMemory.
- * and return it. */
- pEntryData->mapAddr = dataMemory.mapAddr;
- pEntryData->map = dataMemory.map;
+ pEntryData = checkDataItem(dataMemory.pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
+ if (pEntryData != NULL) {
+ /* Data is good.
+ * Hand off ownership of the backing memory to the user's UDataMemory.
+ * and return it. */
+ pEntryData->mapAddr = dataMemory.mapAddr;
+ pEntryData->map = dataMemory.map;
#ifdef UDATA_DEBUG
- fprintf(stderr, "** Mapped file: %s\n", pathBuffer);
+ fprintf(stderr, "** Mapped file: %s\n", pathBuffer);
#endif
- retVal = pEntryData;
- goto commonReturn;
- }
-
- /* the data is not acceptable, or some error occured. Either way, unmap the memory */
- udata_close(&dataMemory);
+ retVal = pEntryData;
+ goto commonReturn;
+ }
- /* If we had a nasty error, bail out completely. */
- if (U_FAILURE(*pErrorCode)) {
- retVal = NULL;
- goto commonReturn;
- }
+ /* the data is not acceptable, or some error occured. Either way, unmap the memory */
+ udata_close(&dataMemory);
- /* Otherwise remember that we found data but didn't like it for some reason */
- *subErrorCode=U_INVALID_FORMAT_ERROR;
+ /* If we had a nasty error, bail out completely. */
+ if (U_FAILURE(*pErrorCode)) {
+ retVal = NULL;
+ goto commonReturn;
}
+
+ /* Otherwise remember that we found data but didn't like it for some reason */
+ *subErrorCode=U_INVALID_FORMAT_ERROR;
+ }
#ifdef UDATA_DEBUG
- fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded");
+ fprintf(stderr, "%s\n", UDataMemory_isLoaded(&dataMemory)?"LOADED":"not loaded");
#endif
- }
+ }
commonReturn:
- udata_pathiter_dt(&iter);
- return retVal;
+ udata_pathiter_dt(&iter);
+ return retVal;
}
/**
* @return 0 if not loaded, 1 if loaded or err
*/
-static UDataMemory *doLoadFromCommonData(UBool isICUData, const char *pkgName, const char *oldIndFileName,
- const char *dataPath, const char *tocEntryPathSuffix, const char *tocEntryName, const char *inBasename,
+static UDataMemory *doLoadFromCommonData(UBool isICUData, const char *pkgName,
+ const char *dataPath, const char *tocEntryPathSuffix, const char *tocEntryName,
/* following arguments are the same as doOpenChoice itself */
const char *path, const char *type, const char *name,
UDataMemoryIsAcceptable *isAcceptable, void *context,
@@ -1154,13 +1109,6 @@ static UDataMemory *doLoadFromCommonData(UBool isICUData, const char *pkgName, c
#ifdef UDATA_DEBUG
fprintf(stderr, "%s: pHeader=%p - %s\n", tocEntryName, pHeader, u_errorName(*subErrorCode));
#endif
- if((pHeader == NULL) && !U_FAILURE(*subErrorCode)) {
- pHeader=pCommonData->vFuncs->Lookup(pCommonData, oldIndFileName, /* oldIndFileName is preceded by a slash */
- &length, subErrorCode);
-#ifdef UDATA_DEBUG
- fprintf(stderr, "[OLD name] %s: pHeader=%p - %s\n", oldIndFileName, pHeader, u_errorName(*subErrorCode));
-#endif
- }
if(pHeader!=NULL) {
pEntryData = checkDataItem(pHeader, isAcceptable, context, type, name, subErrorCode, pErrorCode);
@@ -1231,9 +1179,6 @@ doOpenChoice(const char *path, const char *type, const char *name,
TinyString tocEntryName; /* entry name in tree format. ex: 'icudt28b/coll/ar.res' */
TinyString tocEntryPath; /* entry name in path format. ex: 'icudt28b\\coll\\ar.res' */
- TinyString oldIndFileName; /* ex: icudt28b_ar.res */
- TinyString oldStylePath;
- TinyString oldStylePathBasename;
TinyString pkgName;
TinyString treeName;
@@ -1243,10 +1188,8 @@ doOpenChoice(const char *path, const char *type, const char *name,
const char *dataPath;
- const char *tocEntrySuffix;
int32_t tocEntrySuffixIndex;
const char *tocEntryPathSuffix;
- const char *inBasename;
UErrorCode subErrorCode=U_ZERO_ERROR;
const char *treeChar;
@@ -1281,11 +1224,8 @@ doOpenChoice(const char *path, const char *type, const char *name,
}
#endif
- TinyString_init(&oldIndFileName);
TinyString_init(&tocEntryName);
TinyString_init(&tocEntryPath);
- TinyString_init(&oldStylePath);
- TinyString_init(&oldStylePathBasename);
TinyString_init(&pkgName);
TinyString_init(&treeName);
@@ -1343,7 +1283,6 @@ doOpenChoice(const char *path, const char *type, const char *name,
/* prepend the package */
TinyString_append(&tocEntryName, pkgName.s);
TinyString_append(&tocEntryPath, pkgName.s);
- TinyString_append(&oldIndFileName, pkgName.s);
tocEntrySuffixIndex = tocEntryName.length;
if(treeName.s[0]) {
@@ -1354,10 +1293,8 @@ doOpenChoice(const char *path, const char *type, const char *name,
TinyString_append(&tocEntryPath, treeName.s);
}
- TinyString_append(&oldIndFileName, "_");
TinyString_append(&tocEntryName, U_TREE_ENTRY_SEP_STRING);
TinyString_append(&tocEntryPath, U_FILE_SEP_STRING);
- TinyString_append(&oldIndFileName, name);
TinyString_append(&tocEntryName, name);
TinyString_append(&tocEntryPath, name);
if(type!=NULL && *type!=0) {
@@ -1365,28 +1302,16 @@ doOpenChoice(const char *path, const char *type, const char *name,
TinyString_append(&tocEntryName, type);
TinyString_append(&tocEntryPath, ".");
TinyString_append(&tocEntryPath, type);
- TinyString_append(&oldIndFileName, ".");
- TinyString_append(&oldIndFileName, type);
}
- tocEntrySuffix = tocEntryName.s+tocEntrySuffixIndex; /* suffix starts here */
tocEntryPathSuffix = tocEntryPath.s+tocEntrySuffixIndex; /* suffix starts here */
#ifdef UDATA_DEBUG
fprintf(stderr, " tocEntryName = %s\n", tocEntryName.s);
fprintf(stderr, " tocEntryPath = %s\n", tocEntryName.s);
- fprintf(stderr, " oldIndFileName = %s\n", oldIndFileName.s);
#endif
- /* try to get an individual data file */
if(path == NULL) {
path = COMMON_DATA_NAME; /* "icudt26e" */
- inBasename = COMMON_DATA_NAME;
- } else {
- if(isICUData) {
- inBasename=COMMON_DATA_NAME;
- } else {
- inBasename=findBasename(path);
- }
}
/************************ Begin loop looking for ind. files ***************/
@@ -1394,33 +1319,6 @@ doOpenChoice(const char *path, const char *type, const char *name,
fprintf(stderr, "IND: inBasename = %s, pkg=%s\n", inBasename, packageNameFromPath(path));
#endif
- /* Deal with a null basename */
- if( (*inBasename==0) && (uprv_strlen(path) > 3) ) {
- /* the purpose of this exercise is to turn /tmp/foo/bar/ into
- path= /tmp/foo/bar/bar and basename= bar
- (i.e. /tmp/foo/bar/bar.dat or /tmp/foo/bar/bar_en_US.res )
- */
-
- char *rightSlash;
- TinyString_append(&oldStylePath, path);
- /* chop off trailing slash */
- oldStylePath.length--;
- oldStylePath.s[oldStylePath.length] = 0;
-
- rightSlash = (char*)uprv_strrchr(oldStylePath.s, U_FILE_SEP_CHAR);
- if(rightSlash != NULL) {
- rightSlash++;
- TinyString_append(&oldStylePathBasename, rightSlash);
- inBasename = oldStylePathBasename.s;
- TinyString_append(&oldStylePath, U_FILE_SEP_STRING);
- TinyString_append(&oldStylePath, inBasename); /* one more time, for the base name */
- path = oldStylePath.s;
- } else {
- *pErrorCode = U_FILE_ACCESS_ERROR; /* hopelessly bad case */
- retVal = NULL;
- goto commonReturn;
- }
- }
/* End of dealing with a null basename */
dataPath = u_getDataDirectory();
@@ -1431,8 +1329,7 @@ doOpenChoice(const char *path, const char *type, const char *name,
#endif
/* #2 */
retVal = doLoadFromCommonData(isICUData,
- pkgName.s, oldIndFileName.s, dataPath, tocEntryPathSuffix,
- tocEntryName.s, inBasename,
+ pkgName.s, dataPath, tocEntryPathSuffix, tocEntryName.s,
path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
if((retVal != NULL) || U_FAILURE(*pErrorCode)) {
goto commonReturn;
@@ -1447,7 +1344,7 @@ doOpenChoice(const char *path, const char *type, const char *name,
#endif
/* Check to make sure that there is a dataPath to iterate over */
if ((dataPath && *dataPath) || !isICUData) {
- retVal = doLoadFromIndividualFiles(pkgName.s, oldIndFileName.s, dataPath, tocEntryPathSuffix, inBasename,
+ retVal = doLoadFromIndividualFiles(pkgName.s, dataPath, tocEntryPathSuffix,
path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
if((retVal != NULL) || U_FAILURE(*pErrorCode)) {
goto commonReturn;
@@ -1462,8 +1359,7 @@ doOpenChoice(const char *path, const char *type, const char *name,
fprintf(stderr, "Trying packages (UDATA_ONLY_PACKAGES || UDATA_FILES_FIRST)\n");
#endif
retVal = doLoadFromCommonData(isICUData,
- pkgName.s, oldIndFileName.s, dataPath, tocEntryPathSuffix,
- tocEntryName.s, inBasename,
+ pkgName.s, dataPath, tocEntryPathSuffix, tocEntryName.s,
path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
if((retVal != NULL) || U_FAILURE(*pErrorCode)) {
goto commonReturn;
@@ -1478,8 +1374,7 @@ doOpenChoice(const char *path, const char *type, const char *name,
fprintf(stderr, "Trying common data (UDATA_NO_FILES)\n");
#endif
retVal = doLoadFromCommonData(isICUData,
- pkgName.s, oldIndFileName.s, "", tocEntryPathSuffix,
- tocEntryName.s, inBasename,
+ pkgName.s, "", tocEntryPathSuffix, tocEntryName.s,
path, type, name, isAcceptable, context, &subErrorCode, pErrorCode);
if((retVal != NULL) || U_FAILURE(*pErrorCode)) {
goto commonReturn;
@@ -1500,9 +1395,6 @@ doOpenChoice(const char *path, const char *type, const char *name,
commonReturn:
TinyString_dt(&tocEntryName);
TinyString_dt(&tocEntryPath);
- TinyString_dt(&oldIndFileName);
- TinyString_dt(&oldStylePath);
- TinyString_dt(&oldStylePathBasename);
TinyString_dt(&pkgName);
TinyString_dt(&treeName);
#if (U_FILE_SEP_CHAR != U_FILE_ALT_SEP_CHAR)