@@ -5,6 +5,19 @@ Copyright 2017-2018 Gandalf Software, Inc., Scott P. Jones
55Licensed under MIT License, see LICENSE.md
66=#
77
8+ _wide_lower_l (c) = ifelse (c > (V6_COMPAT ? 0xdf : 0xde ), c != 0xf7 , c == 0xb5 )
9+ @inline _wide_lower_ch (ch) =
10+ ch <= 0x7f ? _islower_a (ch) : (ch > 0xff ? _islower_u (ch) : _wide_lower_l (ch))
11+
12+ @inline _isupper_ch (ch) =
13+ ch <= 0x7f ? _isupper_a (ch) : (ch <= 0xff ? _isupper_l (ch) : _isupper_u (ch))
14+
15+ _wide_lower_latin (ch) = (ch == 0xb5 ) | (ch == 0xff ) | (! V6_COMPAT & (ch == 0xdf ))
16+
17+ _wide_out_upper (ch) =
18+ ifelse (ch == 0xb5 , 0x39c , ifelse (ch == 0xff , 0x178 , ifelse (ch == 0xdf , 0x1e9e , ch% UInt16)))
19+
20+
821function uppercase_first (str:: MaybeSub{S} ) where {C<: ASCIICSE ,S<: Str{C} }
922 (len = ncodeunits (str)) == 0 && return str
1023 @preserve str begin
@@ -109,12 +122,6 @@ function uppercase_first(str::MaybeSub{S}) where {C<:LatinCSE,S<:Str{C}}
109122 end
110123end
111124
112- @static if V6_COMPAT
113- _wide_lower_latin (ch) = (ch == 0xb5 ) | (ch == 0xff )
114- else
115- _wide_lower_latin (ch) = (ch == 0xb5 ) | (ch == 0xff ) | (ch == 0xdf )
116- end
117-
118125# Special handling for characters that can't map into Latin1
119126function uppercase_first (str:: MaybeSub{S} ) where {C<: _LatinCSE ,S<: Str{C} }
120127 (len = ncodeunits (str)) == 0 && return str
@@ -128,7 +135,7 @@ function uppercase_first(str::MaybeSub{S}) where {C<:_LatinCSE,S<:Str{C}}
128135 Str (C, buf)
129136 elseif _wide_lower_latin (ch)
130137 buf, out = _allocate (UInt16, len)
131- set_codeunit! (out, ifelse (ch == 0xb5 , 0x39c , ifelse (ch == 0xff , 0x178 , 0x1e9e ) ))
138+ set_codeunit! (out, _wide_out_upper (ch))
132139 # Perform the widen operation on the rest (should be done via SIMD)
133140 @inbounds for i = 2 : len
134141 set_codeunit! (out += 2 , get_codeunit (pnt += 2 )% UInt16)
@@ -191,15 +198,7 @@ function _widenupper(beg::Ptr{UInt8}, off, len)
191198 out = bytoff (out, off)
192199 while out < fin
193200 ch = get_codeunit (cur)
194- if ch == 0xb5
195- set_codeunit! (out, 0x39c )
196- elseif ch == 0xff
197- set_codeunit! (out, 0x178 )
198- elseif ! V6_COMPAT && (ch == 0xdf )
199- set_codeunit! (out, 0x1e9e )
200- else
201- set_codeunit! (out, _can_upper (ch) ? ch - 0x20 : ch)
202- end
201+ set_codeunit! (out, _can_upper (ch) ? ch - 0x20 : _wide_out_upper (ch))
203202 cur += 1
204203 out += 2
205204 end
@@ -319,7 +318,7 @@ function lowercase(str::MaybeSub{S}) where {C<:Union{UCS2_CSEs,UTF32_CSEs},S<:St
319318 pnt = beg = pointer (str)
320319 fin = beg + sizeof (str)
321320 while pnt < fin
322- _can_lower_ch (get_codeunit (pnt)) && return _lower (C, beg, pnt- beg, ncodeunits (str))
321+ _isupper_ch (get_codeunit (pnt)) && return _lower (C, beg, pnt- beg, ncodeunits (str))
323322 pnt += sizeof (CU)
324323 end
325324 end
0 commit comments