diff options
author | Jonathan Kew <jfkthame@googlemail.com> | 2007-11-21 12:29:46 +0000 |
---|---|---|
committer | Jonathan Kew <jfkthame@googlemail.com> | 2007-11-21 12:29:46 +0000 |
commit | 952d69f85d43b087ce9fa79d3fc6f1c076000bc7 (patch) | |
tree | dd6937a6486e80e1638618308481075efab000ae /Build/source/libs/icu-xetex/common/udata.c | |
parent | 888236cb9df7b7d7b5a3e2d784037a9a59511c53 (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.c | 218 |
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) |