ICU-2487 add internal function for creating enumerator based on keyword list

X-SVN-Rev: 14950
This commit is contained in:
Steven R. Loomis 2004-04-13 17:26:33 +00:00
parent c27cbae2d6
commit 4e04fc6c2b
2 changed files with 38 additions and 19 deletions

View file

@ -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);*/
}

View file

@ -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*/