From 4e04fc6c2bec90a9f10e330aacbc490ce08b3982 Mon Sep 17 00:00:00 2001 From: "Steven R. Loomis" Date: Tue, 13 Apr 2004 17:26:33 +0000 Subject: [PATCH] ICU-2487 add internal function for creating enumerator based on keyword list X-SVN-Rev: 14950 --- icu4c/source/common/uloc.c | 46 ++++++++++++++++++------------ icu4c/source/common/unicode/uloc.h | 11 +++++++ 2 files changed, 38 insertions(+), 19 deletions(-) diff --git a/icu4c/source/common/uloc.c b/icu4c/source/common/uloc.c index a75481f75d5..fe5e11b7896 100644 --- a/icu4c/source/common/uloc.c +++ b/icu4c/source/common/uloc.c @@ -1012,6 +1012,30 @@ static const UEnumeration gKeywordsEnum = { uloc_kw_resetKeywords }; +U_CAPI UEnumeration* U_EXPORT2 +uloc_openKeywordList(const char *keywordList, int32_t keywordListSize, UErrorCode* status) +{ + UKeywordsContext *myContext = NULL; + UEnumeration *result = NULL; + + if(U_FAILURE(*status)) { + return NULL; + } + result = (UEnumeration *)uprv_malloc(sizeof(UEnumeration)); + uprv_memcpy(result, &gKeywordsEnum, sizeof(UEnumeration)); + myContext = uprv_malloc(sizeof(UKeywordsContext)); + if (myContext == NULL) { + *status = U_MEMORY_ALLOCATION_ERROR; + uprv_free(result); + return NULL; + } + myContext->keywords = (char *)uprv_malloc(keywordListSize+1); + uprv_memcpy(myContext->keywords, keywordList, keywordListSize); + myContext->keywords[keywordListSize] = 0; + myContext->current = myContext->keywords; + result->context = myContext; + return result; +} U_CAPI UEnumeration* U_EXPORT2 uloc_openKeywords(const char* localeID, @@ -1020,10 +1044,6 @@ uloc_openKeywords(const char* localeID, int32_t i=0; char keywords[256]; int32_t keywordsCapacity = 256; - UKeywordsContext *myContext = NULL; - - UEnumeration *result = NULL; - if(status==NULL || U_FAILURE(*status)) { return 0; } @@ -1057,23 +1077,11 @@ uloc_openKeywords(const char* localeID, } if(i) { - result = (UEnumeration *)uprv_malloc(sizeof(UEnumeration)); - uprv_memcpy(result, &gKeywordsEnum, sizeof(UEnumeration)); - myContext = uprv_malloc(sizeof(UKeywordsContext)); - if (myContext == NULL) { - *status = U_MEMORY_ALLOCATION_ERROR; - uprv_free(result); - return NULL; - } - myContext->keywords = (char *)uprv_malloc(i+1); - uprv_memcpy(myContext->keywords, keywords, i); - myContext->keywords[i] = 0; - myContext->current = myContext->keywords; - result->context = myContext; + return uloc_openKeywordList(keywords, i, status); + } else { + return NULL; } - return result; - /*return u_terminateChars(keywords, keywordsCapacity, i, status);*/ } diff --git a/icu4c/source/common/unicode/uloc.h b/icu4c/source/common/unicode/uloc.h index bb9d020dd81..ff863481fbd 100644 --- a/icu4c/source/common/unicode/uloc.h +++ b/icu4c/source/common/unicode/uloc.h @@ -834,6 +834,17 @@ uloc_getKeywordValue(const char* localeID, char* buffer, int32_t bufferCapacity, UErrorCode* status); + +/** + * Create an iterator over the specified keywords list + * @param keywordList double-null terminated list. Will be copied. + * @param keywordListSize size in bytes of keywordList + * @param status err code + * @return enumeration (owned by caller) of the keyword list. + * @internal ICU 3.0 + */ +U_CAPI UEnumeration* U_EXPORT2 +uloc_openKeywordList(const char *keywordList, int32_t keywordListSize, UErrorCode* status); /*eof*/