ICU-542 implement case mapping conditions from Unicode 3.1 (az & lt)
X-SVN-Rev: 3548
This commit is contained in:
parent
2ea8bf637f
commit
81401a40b2
@ -920,9 +920,30 @@ void u_getUnicodeVersion(UVersionInfo versionArray) {
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
LOC_ROOT,
|
LOC_ROOT,
|
||||||
LOC_TURKISH
|
LOC_TURKISH,
|
||||||
|
LOC_LITHUANIAN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int32_t
|
||||||
|
getCaseLocale(const char *locale) {
|
||||||
|
if(locale==NULL) {
|
||||||
|
locale=uloc_getDefault();
|
||||||
|
if(locale==NULL) {
|
||||||
|
return LOC_ROOT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( ((locale[0]=='t' && locale[1]=='r') ||
|
||||||
|
(locale[0]=='a' && locale[1]=='z')) &&
|
||||||
|
(locale[2]=='_' || locale[2]==0)
|
||||||
|
) {
|
||||||
|
return LOC_TURKISH;
|
||||||
|
} else if(locale[0]=='l' && locale[1]=='t' && (locale[2]=='_' || locale[2]==0)) {
|
||||||
|
return LOC_LITHUANIAN;
|
||||||
|
} else {
|
||||||
|
return LOC_ROOT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
U_CFUNC int32_t
|
U_CFUNC int32_t
|
||||||
u_internalStrToLower(UChar *dest, int32_t destCapacity,
|
u_internalStrToLower(UChar *dest, int32_t destCapacity,
|
||||||
const UChar *src, int32_t srcLength,
|
const UChar *src, int32_t srcLength,
|
||||||
@ -971,14 +992,7 @@ u_internalStrToLower(UChar *dest, int32_t destCapacity,
|
|||||||
|
|
||||||
/* set up local variables */
|
/* set up local variables */
|
||||||
uchars=(const UChar *)(props32Table+indexes[INDEX_UCHARS]);
|
uchars=(const UChar *)(props32Table+indexes[INDEX_UCHARS]);
|
||||||
if(locale==NULL) {
|
loc=getCaseLocale(locale);
|
||||||
locale=uloc_getDefault();
|
|
||||||
}
|
|
||||||
if(locale[0]=='t' && locale[1]=='r' && (locale[2]=='_' || locale[2]==0)) {
|
|
||||||
loc=LOC_TURKISH;
|
|
||||||
} else {
|
|
||||||
loc=LOC_ROOT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* case mapping loop */
|
/* case mapping loop */
|
||||||
srcIndex=destIndex=0;
|
srcIndex=destIndex=0;
|
||||||
@ -1158,14 +1172,7 @@ u_internalStrToUpper(UChar *dest, int32_t destCapacity,
|
|||||||
|
|
||||||
/* set up local variables */
|
/* set up local variables */
|
||||||
uchars=(const UChar *)(props32Table+indexes[INDEX_UCHARS]);
|
uchars=(const UChar *)(props32Table+indexes[INDEX_UCHARS]);
|
||||||
if(locale==NULL) {
|
loc=getCaseLocale(locale);
|
||||||
locale=uloc_getDefault();
|
|
||||||
}
|
|
||||||
if(locale[0]=='t' && locale[1]=='r' && (locale[2]=='_' || locale[2]==0)) {
|
|
||||||
loc=LOC_TURKISH;
|
|
||||||
} else {
|
|
||||||
loc=LOC_ROOT;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* case mapping loop */
|
/* case mapping loop */
|
||||||
srcIndex=destIndex=0;
|
srcIndex=destIndex=0;
|
||||||
@ -1197,6 +1204,32 @@ u_internalStrToUpper(UChar *dest, int32_t destCapacity,
|
|||||||
buffer[0]=0x49;
|
buffer[0]=0x49;
|
||||||
}
|
}
|
||||||
i=1;
|
i=1;
|
||||||
|
} else if(c==0x307) {
|
||||||
|
if(loc==LOC_LITHUANIAN) {
|
||||||
|
/* lithuanian: remove DOT ABOVE after U+0069 "i" with upper or titlecase */
|
||||||
|
/* ### TODO: test this with Unicode 3.1 SpecialCasing.txt */
|
||||||
|
/* search backwards for the base letter - this works only because src and dest do not overlap! */
|
||||||
|
i=srcIndex;
|
||||||
|
while(i>0) {
|
||||||
|
UTF_PREV_CHAR(src, 0, i, c);
|
||||||
|
props=GET_PROPS_UNSAFE(c);
|
||||||
|
if(GET_CATEGORY(props)!=U_NON_SPACING_MARK) { /* Mn */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* is the base letter an 'i' (U+0069)? */
|
||||||
|
if(c==0x69) {
|
||||||
|
/* yes, remove the dot (continue without output) */
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
/* no, keep the dot */
|
||||||
|
buffer[0]=0x307;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* other languages: keep the dot */
|
||||||
|
buffer[0]=0x307;
|
||||||
|
}
|
||||||
|
i=1;
|
||||||
} else {
|
} else {
|
||||||
/* no known conditional special case mapping, output the code point itself */
|
/* no known conditional special case mapping, output the code point itself */
|
||||||
i=0;
|
i=0;
|
||||||
|
Loading…
Reference in New Issue
Block a user