about summary refs log tree commit diff
path: root/src/ctype
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2014-09-05 03:28:00 -0400
committerRich Felker <dalias@aerifal.cx>2014-09-05 03:28:00 -0400
commit4674809bdf7a46041ac0152eea0a6363ceeca548 (patch)
tree4e8460ef71d49a36c912bed355bc4e7ed7b0bf41 /src/ctype
parentfff546930347d99729f1c0a9d911e7f24a094531 (diff)
downloadmusl-4674809bdf7a46041ac0152eea0a6363ceeca548.tar.gz
musl-4674809bdf7a46041ac0152eea0a6363ceeca548.tar.xz
musl-4674809bdf7a46041ac0152eea0a6363ceeca548.zip
fix case mapping for U+00DF (ß)
U+00DF ('ß') has had an uppercase form (U+1E9E) available since
Unicode 5.1, but Unicode lacks the case mappings for it due to
stability policy. when I added support for the new character in commit
1a63a9fc30e7a1f1239e3cedcb5041e5ec1c5351, I omitted the mapping in the
lowercase-to-uppercase direction. this choice was not based on any
actual information, only assumptions.

this commit adds bidirectional case mappings between U+00DF and
U+1E9E, and removes the special-case hack that allowed U+00DF to be
identified as lowecase despite lacking a mapping. aside from strong
evidence that this is the "right" behavior for real-world usage of
these characters, several factors informed this decision:

- the other "potentially correct" mapping, to "SS", is not
  representable in the C case-mapping system anyway.

- leaving one letter in lowercase form when transforming a string to
  uppercase is obviously wrong.

- having a character which is nominally lowercase but which is fixed
  under case mapping violates reasonable invariants.
Diffstat (limited to 'src/ctype')
-rw-r--r--src/ctype/iswlower.c2
-rw-r--r--src/ctype/towctrans.c1
2 files changed, 1 insertions, 2 deletions
diff --git a/src/ctype/iswlower.c b/src/ctype/iswlower.c
index c754fb95..79df44a3 100644
--- a/src/ctype/iswlower.c
+++ b/src/ctype/iswlower.c
@@ -3,7 +3,7 @@
 
 int iswlower(wint_t wc)
 {
-	return towupper(wc) != wc || wc == 0xdf;
+	return towupper(wc) != wc;
 }
 
 int __iswlower_l(wint_t c, locale_t l)
diff --git a/src/ctype/towctrans.c b/src/ctype/towctrans.c
index 5e0889b1..6af61875 100644
--- a/src/ctype/towctrans.c
+++ b/src/ctype/towctrans.c
@@ -151,7 +151,6 @@ static const unsigned short pairs[][2] = {
 	{ 0x03f7, 0x03f8 },
 	{ 0x03fa, 0x03fb },
 	{ 0x1e60, 0x1e9b },
-	{ 0xdf, 0xdf },
 	{ 0x1e9e, 0xdf },
 
 	{ 0x1f59, 0x1f51 },