diff --git a/icu4c/source/i18n/ucol_sit.cpp b/icu4c/source/i18n/ucol_sit.cpp index 3acf7cd4f3..40810ca452 100644 --- a/icu4c/source/i18n/ucol_sit.cpp +++ b/icu4c/source/i18n/ucol_sit.cpp @@ -184,8 +184,8 @@ _processLocaleElement(CollatorSpec *spec, uint32_t value, const char* string, *status = U_BUFFER_OVERFLOW_ERROR; return string; } - // skip the underscore at the end - return ++string; + // don't skip the underscore at the end + return string; } U_CDECL_END @@ -202,7 +202,7 @@ _processRFC3066Locale(CollatorSpec *spec, uint32_t value1, const char* string, return string; } else { uprv_strncpy(spec->locale, string, end-string); - return end+2; + return end+1; } } @@ -217,9 +217,8 @@ _processCollatorOption(CollatorSpec *spec, uint32_t option, const char* string, spec->options[option] = ucol_sit_letterToAttributeValue(*string, status); if((*(++string) != '_' && *string) || U_FAILURE(*status)) { *status = U_ILLEGAL_ARGUMENT_ERROR; - return string; } - return ++string; + return string; } U_CDECL_END @@ -264,10 +263,8 @@ _processVariableTop(CollatorSpec *spec, uint32_t value1, const char* string, UEr } if(U_SUCCESS(*status)) { spec->variableTopSet = TRUE; - return string+1; // to move over the '_' - } else { - return string; - } + } + return string; } U_CDECL_END @@ -310,7 +307,7 @@ const char* ucol_sit_readOption(const char *start, CollatorSpec *spec, if(*start == options[i].optionStart) { spec->entries[i].start = start; const char* end = options[i].action(spec, options[i].attr, start+1, status); - spec->entries[i].len = end - start - 1; + spec->entries[i].len = end - start; return end; } } @@ -337,6 +334,10 @@ ucol_sit_readSpecs(CollatorSpec *s, const char *string, const char *definition = string; while(U_SUCCESS(*status) && *string) { string = ucol_sit_readOption(string, s, status); + // advance over '_' + while(*string && *string == '_') { + string++; + } } if(U_FAILURE(*status)) { parseError->offset = string - definition; diff --git a/icu4c/source/test/cintltst/capitst.c b/icu4c/source/test/cintltst/capitst.c index 5489c91937..bb37807d5c 100644 --- a/icu4c/source/test/cintltst/capitst.c +++ b/icu4c/source/test/cintltst/capitst.c @@ -1735,7 +1735,7 @@ static void TestShortString(void) {"LDE_Kphonebook","KPHONEBOOK_LDE", "de@collation=phonebook", U_ZERO_ERROR, 0, 0 }, {"Xqde_DE@collation=phonebookq_S3_EX","KPHONEBOOK_LDE", "de@collation=phonebook", U_USING_FALLBACK_WARNING, 0, 0 }, {"LFR_FO", "LFR", NULL, U_ZERO_ERROR, 0, 0 }, - {"SO_LX_AS", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 9, 0 }, + {"SO_LX_AS", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 8, 0 }, {"S3_ASS_MMM", "", NULL, U_ILLEGAL_ARGUMENT_ERROR, 5, 0 } };