@@ -5,6 +5,19 @@ Copyright 2017-2018 Gandalf Software, Inc., Scott P. Jones
5
5
Licensed under MIT License, see LICENSE.md
6
6
=#
7
7
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
+
8
21
function uppercase_first (str:: MaybeSub{S} ) where {C<: ASCIICSE ,S<: Str{C} }
9
22
(len = ncodeunits (str)) == 0 && return str
10
23
@preserve str begin
@@ -109,12 +122,6 @@ function uppercase_first(str::MaybeSub{S}) where {C<:LatinCSE,S<:Str{C}}
109
122
end
110
123
end
111
124
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
-
118
125
# Special handling for characters that can't map into Latin1
119
126
function uppercase_first (str:: MaybeSub{S} ) where {C<: _LatinCSE ,S<: Str{C} }
120
127
(len = ncodeunits (str)) == 0 && return str
@@ -128,7 +135,7 @@ function uppercase_first(str::MaybeSub{S}) where {C<:_LatinCSE,S<:Str{C}}
128
135
Str (C, buf)
129
136
elseif _wide_lower_latin (ch)
130
137
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))
132
139
# Perform the widen operation on the rest (should be done via SIMD)
133
140
@inbounds for i = 2 : len
134
141
set_codeunit! (out += 2 , get_codeunit (pnt += 2 )% UInt16)
@@ -191,15 +198,7 @@ function _widenupper(beg::Ptr{UInt8}, off, len)
191
198
out = bytoff (out, off)
192
199
while out < fin
193
200
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))
203
202
cur += 1
204
203
out += 2
205
204
end
@@ -319,7 +318,7 @@ function lowercase(str::MaybeSub{S}) where {C<:Union{UCS2_CSEs,UTF32_CSEs},S<:St
319
318
pnt = beg = pointer (str)
320
319
fin = beg + sizeof (str)
321
320
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))
323
322
pnt += sizeof (CU)
324
323
end
325
324
end
0 commit comments