U_CAPI int32_t U_EXPORT2 ucol_normalizeShortDefinitionString(const char *definition, char *destination, int32_t capacity, UParseError *parseError, UErrorCode *status) { if(U_FAILURE(*status)) { return 0; } if(destination) { uprv_memset(destination, 0, capacity*sizeof(char)); } UParseError pe; if(!parseError) { parseError = &pe; } // validate CollatorSpec s; ucol_sit_initCollatorSpecs(&s); ucol_sit_readSpecs(&s, definition, parseError, status); return ucol_sit_dumpSpecs(&s, destination, capacity, status); }
U_CAPI void U_EXPORT2 ucol_prepareShortStringOpen( const char *definition, UBool, UParseError *parseError, UErrorCode *status) { if(U_FAILURE(*status)) return; UParseError internalParseError; if(!parseError) { parseError = &internalParseError; } parseError->line = 0; parseError->offset = 0; parseError->preContext[0] = 0; parseError->postContext[0] = 0; // first we want to pick stuff out of short string. // we'll end up with an UCA version, locale and a bunch of // settings // analyse the string in order to get everything we need. CollatorSpec s; ucol_sit_initCollatorSpecs(&s); ucol_sit_readSpecs(&s, definition, parseError, status); ucol_sit_calculateWholeLocale(&s); char buffer[internalBufferSize]; uprv_memset(buffer, 0, internalBufferSize); uloc_canonicalize(s.locale, buffer, internalBufferSize, status); UResourceBundle *b = ures_open(U_ICUDATA_COLL, buffer, status); /* we try to find stuff from keyword */ UResourceBundle *collations = ures_getByKey(b, "collations", NULL, status); UResourceBundle *collElem = NULL; char keyBuffer[256]; // if there is a keyword, we pick it up and try to get elements if(!uloc_getKeywordValue(buffer, "collation", keyBuffer, 256, status)) { // no keyword. we try to find the default setting, which will give us the keyword value UResourceBundle *defaultColl = ures_getByKeyWithFallback(collations, "default", NULL, status); if(U_SUCCESS(*status)) { int32_t defaultKeyLen = 0; const UChar *defaultKey = ures_getString(defaultColl, &defaultKeyLen, status); u_UCharsToChars(defaultKey, keyBuffer, defaultKeyLen); keyBuffer[defaultKeyLen] = 0; } else { *status = U_INTERNAL_PROGRAM_ERROR; return; } ures_close(defaultColl); } collElem = ures_getByKeyWithFallback(collations, keyBuffer, collElem, status); ures_close(collElem); ures_close(collations); ures_close(b); }
U_CAPI UCollator* U_EXPORT2 ucol_openFromShortString( const char *definition, UBool forceDefaults, UParseError *parseError, UErrorCode *status) { UTRACE_ENTRY_OC(UTRACE_UCOL_OPEN_FROM_SHORT_STRING); UTRACE_DATA1(UTRACE_INFO, "short string = \"%s\"", definition); if(U_FAILURE(*status)) return 0; UParseError internalParseError; if(!parseError) { parseError = &internalParseError; } parseError->line = 0; parseError->offset = 0; parseError->preContext[0] = 0; parseError->postContext[0] = 0; // first we want to pick stuff out of short string. // we'll end up with an UCA version, locale and a bunch of // settings // analyse the string in order to get everything we need. const char *string = definition; CollatorSpec s; ucol_sit_initCollatorSpecs(&s); string = ucol_sit_readSpecs(&s, definition, parseError, status); ucol_sit_calculateWholeLocale(&s); char buffer[internalBufferSize]; uprv_memset(buffer, 0, internalBufferSize); uloc_canonicalize(s.locale, buffer, internalBufferSize, status); UCollator *result = ucol_open(buffer, status); int32_t i = 0; for(i = 0; i < UCOL_ATTRIBUTE_COUNT; i++) { if(s.options[i] != UCOL_DEFAULT) { if(forceDefaults || ucol_getAttribute(result, (UColAttribute)i, status) != s.options[i]) { ucol_setAttribute(result, (UColAttribute)i, s.options[i], status); } if(U_FAILURE(*status)) { parseError->offset = (int32_t)(string - definition); ucol_close(result); return NULL; } } } if(s.variableTopSet) { if(s.variableTopString[0]) { ucol_setVariableTop(result, s.variableTopString, s.variableTopStringLen, status); } else { // we set by value, using 'B' ucol_restoreVariableTop(result, s.variableTopValue, status); } } if(U_FAILURE(*status)) { // here it can only be a bogus value ucol_close(result); result = NULL; } UTRACE_EXIT_PTR_STATUS(result, *status); return result; }
U_CAPI int32_t U_EXPORT2 ucol_getShortDefinitionString(const UCollator *coll, const char *locale, char *dst, int32_t capacity, UErrorCode *status) { if(U_FAILURE(*status)) return 0; if(coll->delegate != NULL) { return ((icu::Collator*)coll->delegate)->internalGetShortDefinitionString(locale,dst,capacity,*status); } char buffer[internalBufferSize]; uprv_memset(buffer, 0, internalBufferSize*sizeof(char)); int32_t resultSize = 0; char tempbuff[internalBufferSize]; char locBuff[internalBufferSize]; uprv_memset(buffer, 0, internalBufferSize*sizeof(char)); int32_t elementSize = 0; UBool isAvailable = 0; CollatorSpec s; ucol_sit_initCollatorSpecs(&s); if(!locale) { locale = ucol_getLocaleByType(coll, ULOC_VALID_LOCALE, status); } elementSize = ucol_getFunctionalEquivalent(locBuff, internalBufferSize, "collation", locale, &isAvailable, status); if(elementSize) { // we should probably canonicalize here... elementSize = uloc_getLanguage(locBuff, tempbuff, internalBufferSize, status); appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, languageArg); elementSize = uloc_getCountry(locBuff, tempbuff, internalBufferSize, status); appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, regionArg); elementSize = uloc_getScript(locBuff, tempbuff, internalBufferSize, status); appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, scriptArg); elementSize = uloc_getVariant(locBuff, tempbuff, internalBufferSize, status); appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, variantArg); elementSize = uloc_getKeywordValue(locBuff, "collation", tempbuff, internalBufferSize, status); appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, /*capacity*/internalBufferSize, keywordArg); } int32_t i = 0; UColAttributeValue attribute = UCOL_DEFAULT; for(i = 0; i < UCOL_SIT_ITEMS_COUNT; i++) { if(options[i].action == _processCollatorOption) { attribute = ucol_getAttributeOrDefault(coll, (UColAttribute)options[i].attr, status); if(attribute != UCOL_DEFAULT) { char letter = ucol_sit_attributeValueToLetter(attribute, status); appendShortStringElement(&letter, 1, buffer, &resultSize, /*capacity*/internalBufferSize, options[i].optionStart); } } } if(coll->variableTopValueisDefault == FALSE) { //s.variableTopValue = ucol_getVariableTop(coll, status); elementSize = T_CString_integerToString(tempbuff, coll->variableTopValue, 16); appendShortStringElement(tempbuff, elementSize, buffer, &resultSize, capacity, variableTopValArg); } UParseError parseError; return ucol_normalizeShortDefinitionString(buffer, dst, capacity, &parseError, status); }