on master help sign in
Switch to a C lookup table for case mapping

This should be considerably faster than the older Haskell-based code, and far less prone to inliner space explosions.

commit33cfd89920096ab3cace654752fdcc6b79095292 authorBryan O'Sullivan <bos@serpentine.com> dateFri 1 May 2015, 18:28 (11 years ago) parent0923e00
11 files changed+1052−615
Data/Text/Internal/Fusion/CaseMapping.hs−570 Data/Text/Internal/Fusion/Common.hs+46−14 benchmarks/text-benchmarks.cabal+1−1 cbits/case_mapping.c+852 cbits/cbits.c+94 changelog.md+9 scripts/Arsec.hs+17−4 scripts/CaseFolding.hs+11−7 scripts/CaseMapping.hs+10−9 scripts/SpecialCasing.hs+10−7 text.cabal+2−3
Data/Text/Internal/Fusion/CaseMapping.hsdeleted−570
@@ -1,570 +0,0 @@
1−{-# LANGUAGE Rank2Types #-}
2−-- AUTOMATICALLY GENERATED - DO NOT EDIT
3−-- Generated by scripts/SpecialCasing.hs
4−-- CaseFolding-6.3.0.txt
5−-- Date: 2012-12-20, 22:14:35 GMT [MD]
6−-- SpecialCasing-6.3.0.txt
7−-- Date: 2013-05-08, 13:54:51 GMT [MD]
8−
9−module Data.Text.Internal.Fusion.CaseMapping where
10−import Data.Char
11−import Data.Text.Internal.Fusion.Types
12−
13−upperMapping :: forall s. Char -> s -> Step (CC s) Char
14−{-# INLINE upperMapping #-}
15−-- LATIN SMALL LETTER SHARP S
16−upperMapping '\x00df' s = Yield '\x0053' (CC s '\x0053' '\x0000')
17−-- LATIN SMALL LIGATURE FF
18−upperMapping '\xfb00' s = Yield '\x0046' (CC s '\x0046' '\x0000')
19−-- LATIN SMALL LIGATURE FI
20−upperMapping '\xfb01' s = Yield '\x0046' (CC s '\x0049' '\x0000')
21−-- LATIN SMALL LIGATURE FL
22−upperMapping '\xfb02' s = Yield '\x0046' (CC s '\x004c' '\x0000')
23−-- LATIN SMALL LIGATURE FFI
24−upperMapping '\xfb03' s = Yield '\x0046' (CC s '\x0046' '\x0049')
25−-- LATIN SMALL LIGATURE FFL
26−upperMapping '\xfb04' s = Yield '\x0046' (CC s '\x0046' '\x004c')
27−-- LATIN SMALL LIGATURE LONG S T
28−upperMapping '\xfb05' s = Yield '\x0053' (CC s '\x0054' '\x0000')
29−-- LATIN SMALL LIGATURE ST
30−upperMapping '\xfb06' s = Yield '\x0053' (CC s '\x0054' '\x0000')
31−-- ARMENIAN SMALL LIGATURE ECH YIWN
32−upperMapping '\x0587' s = Yield '\x0535' (CC s '\x0552' '\x0000')
33−-- ARMENIAN SMALL LIGATURE MEN NOW
34−upperMapping '\xfb13' s = Yield '\x0544' (CC s '\x0546' '\x0000')
35−-- ARMENIAN SMALL LIGATURE MEN ECH
36−upperMapping '\xfb14' s = Yield '\x0544' (CC s '\x0535' '\x0000')
37−-- ARMENIAN SMALL LIGATURE MEN INI
38−upperMapping '\xfb15' s = Yield '\x0544' (CC s '\x053b' '\x0000')
39−-- ARMENIAN SMALL LIGATURE VEW NOW
40−upperMapping '\xfb16' s = Yield '\x054e' (CC s '\x0546' '\x0000')
41−-- ARMENIAN SMALL LIGATURE MEN XEH
42−upperMapping '\xfb17' s = Yield '\x0544' (CC s '\x053d' '\x0000')
43−-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
44−upperMapping '\x0149' s = Yield '\x02bc' (CC s '\x004e' '\x0000')
45−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
46−upperMapping '\x0390' s = Yield '\x0399' (CC s '\x0308' '\x0301')
47−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
48−upperMapping '\x03b0' s = Yield '\x03a5' (CC s '\x0308' '\x0301')
49−-- LATIN SMALL LETTER J WITH CARON
50−upperMapping '\x01f0' s = Yield '\x004a' (CC s '\x030c' '\x0000')
51−-- LATIN SMALL LETTER H WITH LINE BELOW
52−upperMapping '\x1e96' s = Yield '\x0048' (CC s '\x0331' '\x0000')
53−-- LATIN SMALL LETTER T WITH DIAERESIS
54−upperMapping '\x1e97' s = Yield '\x0054' (CC s '\x0308' '\x0000')
55−-- LATIN SMALL LETTER W WITH RING ABOVE
56−upperMapping '\x1e98' s = Yield '\x0057' (CC s '\x030a' '\x0000')
57−-- LATIN SMALL LETTER Y WITH RING ABOVE
58−upperMapping '\x1e99' s = Yield '\x0059' (CC s '\x030a' '\x0000')
59−-- LATIN SMALL LETTER A WITH RIGHT HALF RING
60−upperMapping '\x1e9a' s = Yield '\x0041' (CC s '\x02be' '\x0000')
61−-- GREEK SMALL LETTER UPSILON WITH PSILI
62−upperMapping '\x1f50' s = Yield '\x03a5' (CC s '\x0313' '\x0000')
63−-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
64−upperMapping '\x1f52' s = Yield '\x03a5' (CC s '\x0313' '\x0300')
65−-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
66−upperMapping '\x1f54' s = Yield '\x03a5' (CC s '\x0313' '\x0301')
67−-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
68−upperMapping '\x1f56' s = Yield '\x03a5' (CC s '\x0313' '\x0342')
69−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI
70−upperMapping '\x1fb6' s = Yield '\x0391' (CC s '\x0342' '\x0000')
71−-- GREEK SMALL LETTER ETA WITH PERISPOMENI
72−upperMapping '\x1fc6' s = Yield '\x0397' (CC s '\x0342' '\x0000')
73−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
74−upperMapping '\x1fd2' s = Yield '\x0399' (CC s '\x0308' '\x0300')
75−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
76−upperMapping '\x1fd3' s = Yield '\x0399' (CC s '\x0308' '\x0301')
77−-- GREEK SMALL LETTER IOTA WITH PERISPOMENI
78−upperMapping '\x1fd6' s = Yield '\x0399' (CC s '\x0342' '\x0000')
79−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
80−upperMapping '\x1fd7' s = Yield '\x0399' (CC s '\x0308' '\x0342')
81−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
82−upperMapping '\x1fe2' s = Yield '\x03a5' (CC s '\x0308' '\x0300')
83−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
84−upperMapping '\x1fe3' s = Yield '\x03a5' (CC s '\x0308' '\x0301')
85−-- GREEK SMALL LETTER RHO WITH PSILI
86−upperMapping '\x1fe4' s = Yield '\x03a1' (CC s '\x0313' '\x0000')
87−-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI
88−upperMapping '\x1fe6' s = Yield '\x03a5' (CC s '\x0342' '\x0000')
89−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
90−upperMapping '\x1fe7' s = Yield '\x03a5' (CC s '\x0308' '\x0342')
91−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI
92−upperMapping '\x1ff6' s = Yield '\x03a9' (CC s '\x0342' '\x0000')
93−-- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
94−upperMapping '\x1f80' s = Yield '\x1f08' (CC s '\x0399' '\x0000')
95−-- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
96−upperMapping '\x1f81' s = Yield '\x1f09' (CC s '\x0399' '\x0000')
97−-- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
98−upperMapping '\x1f82' s = Yield '\x1f0a' (CC s '\x0399' '\x0000')
99−-- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
100−upperMapping '\x1f83' s = Yield '\x1f0b' (CC s '\x0399' '\x0000')
101−-- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
102−upperMapping '\x1f84' s = Yield '\x1f0c' (CC s '\x0399' '\x0000')
103−-- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
104−upperMapping '\x1f85' s = Yield '\x1f0d' (CC s '\x0399' '\x0000')
105−-- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
106−upperMapping '\x1f86' s = Yield '\x1f0e' (CC s '\x0399' '\x0000')
107−-- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
108−upperMapping '\x1f87' s = Yield '\x1f0f' (CC s '\x0399' '\x0000')
109−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
110−upperMapping '\x1f88' s = Yield '\x1f08' (CC s '\x0399' '\x0000')
111−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
112−upperMapping '\x1f89' s = Yield '\x1f09' (CC s '\x0399' '\x0000')
113−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
114−upperMapping '\x1f8a' s = Yield '\x1f0a' (CC s '\x0399' '\x0000')
115−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
116−upperMapping '\x1f8b' s = Yield '\x1f0b' (CC s '\x0399' '\x0000')
117−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
118−upperMapping '\x1f8c' s = Yield '\x1f0c' (CC s '\x0399' '\x0000')
119−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
120−upperMapping '\x1f8d' s = Yield '\x1f0d' (CC s '\x0399' '\x0000')
121−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
122−upperMapping '\x1f8e' s = Yield '\x1f0e' (CC s '\x0399' '\x0000')
123−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
124−upperMapping '\x1f8f' s = Yield '\x1f0f' (CC s '\x0399' '\x0000')
125−-- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
126−upperMapping '\x1f90' s = Yield '\x1f28' (CC s '\x0399' '\x0000')
127−-- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
128−upperMapping '\x1f91' s = Yield '\x1f29' (CC s '\x0399' '\x0000')
129−-- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
130−upperMapping '\x1f92' s = Yield '\x1f2a' (CC s '\x0399' '\x0000')
131−-- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
132−upperMapping '\x1f93' s = Yield '\x1f2b' (CC s '\x0399' '\x0000')
133−-- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
134−upperMapping '\x1f94' s = Yield '\x1f2c' (CC s '\x0399' '\x0000')
135−-- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
136−upperMapping '\x1f95' s = Yield '\x1f2d' (CC s '\x0399' '\x0000')
137−-- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
138−upperMapping '\x1f96' s = Yield '\x1f2e' (CC s '\x0399' '\x0000')
139−-- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
140−upperMapping '\x1f97' s = Yield '\x1f2f' (CC s '\x0399' '\x0000')
141−-- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
142−upperMapping '\x1f98' s = Yield '\x1f28' (CC s '\x0399' '\x0000')
143−-- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
144−upperMapping '\x1f99' s = Yield '\x1f29' (CC s '\x0399' '\x0000')
145−-- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
146−upperMapping '\x1f9a' s = Yield '\x1f2a' (CC s '\x0399' '\x0000')
147−-- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
148−upperMapping '\x1f9b' s = Yield '\x1f2b' (CC s '\x0399' '\x0000')
149−-- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
150−upperMapping '\x1f9c' s = Yield '\x1f2c' (CC s '\x0399' '\x0000')
151−-- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
152−upperMapping '\x1f9d' s = Yield '\x1f2d' (CC s '\x0399' '\x0000')
153−-- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
154−upperMapping '\x1f9e' s = Yield '\x1f2e' (CC s '\x0399' '\x0000')
155−-- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
156−upperMapping '\x1f9f' s = Yield '\x1f2f' (CC s '\x0399' '\x0000')
157−-- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
158−upperMapping '\x1fa0' s = Yield '\x1f68' (CC s '\x0399' '\x0000')
159−-- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
160−upperMapping '\x1fa1' s = Yield '\x1f69' (CC s '\x0399' '\x0000')
161−-- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
162−upperMapping '\x1fa2' s = Yield '\x1f6a' (CC s '\x0399' '\x0000')
163−-- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
164−upperMapping '\x1fa3' s = Yield '\x1f6b' (CC s '\x0399' '\x0000')
165−-- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
166−upperMapping '\x1fa4' s = Yield '\x1f6c' (CC s '\x0399' '\x0000')
167−-- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
168−upperMapping '\x1fa5' s = Yield '\x1f6d' (CC s '\x0399' '\x0000')
169−-- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
170−upperMapping '\x1fa6' s = Yield '\x1f6e' (CC s '\x0399' '\x0000')
171−-- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
172−upperMapping '\x1fa7' s = Yield '\x1f6f' (CC s '\x0399' '\x0000')
173−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
174−upperMapping '\x1fa8' s = Yield '\x1f68' (CC s '\x0399' '\x0000')
175−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
176−upperMapping '\x1fa9' s = Yield '\x1f69' (CC s '\x0399' '\x0000')
177−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
178−upperMapping '\x1faa' s = Yield '\x1f6a' (CC s '\x0399' '\x0000')
179−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
180−upperMapping '\x1fab' s = Yield '\x1f6b' (CC s '\x0399' '\x0000')
181−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
182−upperMapping '\x1fac' s = Yield '\x1f6c' (CC s '\x0399' '\x0000')
183−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
184−upperMapping '\x1fad' s = Yield '\x1f6d' (CC s '\x0399' '\x0000')
185−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
186−upperMapping '\x1fae' s = Yield '\x1f6e' (CC s '\x0399' '\x0000')
187−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
188−upperMapping '\x1faf' s = Yield '\x1f6f' (CC s '\x0399' '\x0000')
189−-- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
190−upperMapping '\x1fb3' s = Yield '\x0391' (CC s '\x0399' '\x0000')
191−-- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
192−upperMapping '\x1fbc' s = Yield '\x0391' (CC s '\x0399' '\x0000')
193−-- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
194−upperMapping '\x1fc3' s = Yield '\x0397' (CC s '\x0399' '\x0000')
195−-- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
196−upperMapping '\x1fcc' s = Yield '\x0397' (CC s '\x0399' '\x0000')
197−-- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
198−upperMapping '\x1ff3' s = Yield '\x03a9' (CC s '\x0399' '\x0000')
199−-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
200−upperMapping '\x1ffc' s = Yield '\x03a9' (CC s '\x0399' '\x0000')
201−-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
202−upperMapping '\x1fb2' s = Yield '\x1fba' (CC s '\x0399' '\x0000')
203−-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
204−upperMapping '\x1fb4' s = Yield '\x0386' (CC s '\x0399' '\x0000')
205−-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
206−upperMapping '\x1fc2' s = Yield '\x1fca' (CC s '\x0399' '\x0000')
207−-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
208−upperMapping '\x1fc4' s = Yield '\x0389' (CC s '\x0399' '\x0000')
209−-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
210−upperMapping '\x1ff2' s = Yield '\x1ffa' (CC s '\x0399' '\x0000')
211−-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
212−upperMapping '\x1ff4' s = Yield '\x038f' (CC s '\x0399' '\x0000')
213−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
214−upperMapping '\x1fb7' s = Yield '\x0391' (CC s '\x0342' '\x0399')
215−-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
216−upperMapping '\x1fc7' s = Yield '\x0397' (CC s '\x0342' '\x0399')
217−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
218−upperMapping '\x1ff7' s = Yield '\x03a9' (CC s '\x0342' '\x0399')
219−upperMapping c s = Yield (toUpper c) (CC s '\0' '\0')
220−lowerMapping :: forall s. Char -> s -> Step (CC s) Char
221−{-# INLINE lowerMapping #-}
222−-- LATIN CAPITAL LETTER I WITH DOT ABOVE
223−lowerMapping '\x0130' s = Yield '\x0069' (CC s '\x0307' '\x0000')
224−lowerMapping c s = Yield (toLower c) (CC s '\0' '\0')
225−titleMapping :: forall s. Char -> s -> Step (CC s) Char
226−{-# INLINE titleMapping #-}
227−-- LATIN SMALL LETTER SHARP S
228−titleMapping '\x00df' s = Yield '\x0053' (CC s '\x0073' '\x0000')
229−-- LATIN SMALL LIGATURE FF
230−titleMapping '\xfb00' s = Yield '\x0046' (CC s '\x0066' '\x0000')
231−-- LATIN SMALL LIGATURE FI
232−titleMapping '\xfb01' s = Yield '\x0046' (CC s '\x0069' '\x0000')
233−-- LATIN SMALL LIGATURE FL
234−titleMapping '\xfb02' s = Yield '\x0046' (CC s '\x006c' '\x0000')
235−-- LATIN SMALL LIGATURE FFI
236−titleMapping '\xfb03' s = Yield '\x0046' (CC s '\x0066' '\x0069')
237−-- LATIN SMALL LIGATURE FFL
238−titleMapping '\xfb04' s = Yield '\x0046' (CC s '\x0066' '\x006c')
239−-- LATIN SMALL LIGATURE LONG S T
240−titleMapping '\xfb05' s = Yield '\x0053' (CC s '\x0074' '\x0000')
241−-- LATIN SMALL LIGATURE ST
242−titleMapping '\xfb06' s = Yield '\x0053' (CC s '\x0074' '\x0000')
243−-- ARMENIAN SMALL LIGATURE ECH YIWN
244−titleMapping '\x0587' s = Yield '\x0535' (CC s '\x0582' '\x0000')
245−-- ARMENIAN SMALL LIGATURE MEN NOW
246−titleMapping '\xfb13' s = Yield '\x0544' (CC s '\x0576' '\x0000')
247−-- ARMENIAN SMALL LIGATURE MEN ECH
248−titleMapping '\xfb14' s = Yield '\x0544' (CC s '\x0565' '\x0000')
249−-- ARMENIAN SMALL LIGATURE MEN INI
250−titleMapping '\xfb15' s = Yield '\x0544' (CC s '\x056b' '\x0000')
251−-- ARMENIAN SMALL LIGATURE VEW NOW
252−titleMapping '\xfb16' s = Yield '\x054e' (CC s '\x0576' '\x0000')
253−-- ARMENIAN SMALL LIGATURE MEN XEH
254−titleMapping '\xfb17' s = Yield '\x0544' (CC s '\x056d' '\x0000')
255−-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
256−titleMapping '\x0149' s = Yield '\x02bc' (CC s '\x004e' '\x0000')
257−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
258−titleMapping '\x0390' s = Yield '\x0399' (CC s '\x0308' '\x0301')
259−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
260−titleMapping '\x03b0' s = Yield '\x03a5' (CC s '\x0308' '\x0301')
261−-- LATIN SMALL LETTER J WITH CARON
262−titleMapping '\x01f0' s = Yield '\x004a' (CC s '\x030c' '\x0000')
263−-- LATIN SMALL LETTER H WITH LINE BELOW
264−titleMapping '\x1e96' s = Yield '\x0048' (CC s '\x0331' '\x0000')
265−-- LATIN SMALL LETTER T WITH DIAERESIS
266−titleMapping '\x1e97' s = Yield '\x0054' (CC s '\x0308' '\x0000')
267−-- LATIN SMALL LETTER W WITH RING ABOVE
268−titleMapping '\x1e98' s = Yield '\x0057' (CC s '\x030a' '\x0000')
269−-- LATIN SMALL LETTER Y WITH RING ABOVE
270−titleMapping '\x1e99' s = Yield '\x0059' (CC s '\x030a' '\x0000')
271−-- LATIN SMALL LETTER A WITH RIGHT HALF RING
272−titleMapping '\x1e9a' s = Yield '\x0041' (CC s '\x02be' '\x0000')
273−-- GREEK SMALL LETTER UPSILON WITH PSILI
274−titleMapping '\x1f50' s = Yield '\x03a5' (CC s '\x0313' '\x0000')
275−-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
276−titleMapping '\x1f52' s = Yield '\x03a5' (CC s '\x0313' '\x0300')
277−-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
278−titleMapping '\x1f54' s = Yield '\x03a5' (CC s '\x0313' '\x0301')
279−-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
280−titleMapping '\x1f56' s = Yield '\x03a5' (CC s '\x0313' '\x0342')
281−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI
282−titleMapping '\x1fb6' s = Yield '\x0391' (CC s '\x0342' '\x0000')
283−-- GREEK SMALL LETTER ETA WITH PERISPOMENI
284−titleMapping '\x1fc6' s = Yield '\x0397' (CC s '\x0342' '\x0000')
285−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
286−titleMapping '\x1fd2' s = Yield '\x0399' (CC s '\x0308' '\x0300')
287−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
288−titleMapping '\x1fd3' s = Yield '\x0399' (CC s '\x0308' '\x0301')
289−-- GREEK SMALL LETTER IOTA WITH PERISPOMENI
290−titleMapping '\x1fd6' s = Yield '\x0399' (CC s '\x0342' '\x0000')
291−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
292−titleMapping '\x1fd7' s = Yield '\x0399' (CC s '\x0308' '\x0342')
293−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
294−titleMapping '\x1fe2' s = Yield '\x03a5' (CC s '\x0308' '\x0300')
295−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
296−titleMapping '\x1fe3' s = Yield '\x03a5' (CC s '\x0308' '\x0301')
297−-- GREEK SMALL LETTER RHO WITH PSILI
298−titleMapping '\x1fe4' s = Yield '\x03a1' (CC s '\x0313' '\x0000')
299−-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI
300−titleMapping '\x1fe6' s = Yield '\x03a5' (CC s '\x0342' '\x0000')
301−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
302−titleMapping '\x1fe7' s = Yield '\x03a5' (CC s '\x0308' '\x0342')
303−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI
304−titleMapping '\x1ff6' s = Yield '\x03a9' (CC s '\x0342' '\x0000')
305−-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
306−titleMapping '\x1fb2' s = Yield '\x1fba' (CC s '\x0345' '\x0000')
307−-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
308−titleMapping '\x1fb4' s = Yield '\x0386' (CC s '\x0345' '\x0000')
309−-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
310−titleMapping '\x1fc2' s = Yield '\x1fca' (CC s '\x0345' '\x0000')
311−-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
312−titleMapping '\x1fc4' s = Yield '\x0389' (CC s '\x0345' '\x0000')
313−-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
314−titleMapping '\x1ff2' s = Yield '\x1ffa' (CC s '\x0345' '\x0000')
315−-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
316−titleMapping '\x1ff4' s = Yield '\x038f' (CC s '\x0345' '\x0000')
317−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
318−titleMapping '\x1fb7' s = Yield '\x0391' (CC s '\x0342' '\x0345')
319−-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
320−titleMapping '\x1fc7' s = Yield '\x0397' (CC s '\x0342' '\x0345')
321−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
322−titleMapping '\x1ff7' s = Yield '\x03a9' (CC s '\x0342' '\x0345')
323−titleMapping c s = Yield (toTitle c) (CC s '\0' '\0')
324−foldMapping :: forall s. Char -> s -> Step (CC s) Char
325−{-# INLINE foldMapping #-}
326−-- MICRO SIGN
327−foldMapping '\x00b5' s = Yield '\x03bc' (CC s '\x0000' '\x0000')
328−-- LATIN SMALL LETTER SHARP S
329−foldMapping '\x00df' s = Yield '\x0073' (CC s '\x0073' '\x0000')
330−-- LATIN CAPITAL LETTER I WITH DOT ABOVE
331−foldMapping '\x0130' s = Yield '\x0069' (CC s '\x0307' '\x0000')
332−-- LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
333−foldMapping '\x0149' s = Yield '\x02bc' (CC s '\x006e' '\x0000')
334−-- LATIN SMALL LETTER LONG S
335−foldMapping '\x017f' s = Yield '\x0073' (CC s '\x0000' '\x0000')
336−-- LATIN SMALL LETTER J WITH CARON
337−foldMapping '\x01f0' s = Yield '\x006a' (CC s '\x030c' '\x0000')
338−-- COMBINING GREEK YPOGEGRAMMENI
339−foldMapping '\x0345' s = Yield '\x03b9' (CC s '\x0000' '\x0000')
340−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
341−foldMapping '\x0390' s = Yield '\x03b9' (CC s '\x0308' '\x0301')
342−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
343−foldMapping '\x03b0' s = Yield '\x03c5' (CC s '\x0308' '\x0301')
344−-- GREEK SMALL LETTER FINAL SIGMA
345−foldMapping '\x03c2' s = Yield '\x03c3' (CC s '\x0000' '\x0000')
346−-- GREEK BETA SYMBOL
347−foldMapping '\x03d0' s = Yield '\x03b2' (CC s '\x0000' '\x0000')
348−-- GREEK THETA SYMBOL
349−foldMapping '\x03d1' s = Yield '\x03b8' (CC s '\x0000' '\x0000')
350−-- GREEK PHI SYMBOL
351−foldMapping '\x03d5' s = Yield '\x03c6' (CC s '\x0000' '\x0000')
352−-- GREEK PI SYMBOL
353−foldMapping '\x03d6' s = Yield '\x03c0' (CC s '\x0000' '\x0000')
354−-- GREEK KAPPA SYMBOL
355−foldMapping '\x03f0' s = Yield '\x03ba' (CC s '\x0000' '\x0000')
356−-- GREEK RHO SYMBOL
357−foldMapping '\x03f1' s = Yield '\x03c1' (CC s '\x0000' '\x0000')
358−-- GREEK LUNATE EPSILON SYMBOL
359−foldMapping '\x03f5' s = Yield '\x03b5' (CC s '\x0000' '\x0000')
360−-- ARMENIAN SMALL LIGATURE ECH YIWN
361−foldMapping '\x0587' s = Yield '\x0565' (CC s '\x0582' '\x0000')
362−-- GEORGIAN CAPITAL LETTER YN
363−foldMapping '\x10c7' s = Yield '\x2d27' (CC s '\x0000' '\x0000')
364−-- GEORGIAN CAPITAL LETTER AEN
365−foldMapping '\x10cd' s = Yield '\x2d2d' (CC s '\x0000' '\x0000')
366−-- LATIN SMALL LETTER H WITH LINE BELOW
367−foldMapping '\x1e96' s = Yield '\x0068' (CC s '\x0331' '\x0000')
368−-- LATIN SMALL LETTER T WITH DIAERESIS
369−foldMapping '\x1e97' s = Yield '\x0074' (CC s '\x0308' '\x0000')
370−-- LATIN SMALL LETTER W WITH RING ABOVE
371−foldMapping '\x1e98' s = Yield '\x0077' (CC s '\x030a' '\x0000')
372−-- LATIN SMALL LETTER Y WITH RING ABOVE
373−foldMapping '\x1e99' s = Yield '\x0079' (CC s '\x030a' '\x0000')
374−-- LATIN SMALL LETTER A WITH RIGHT HALF RING
375−foldMapping '\x1e9a' s = Yield '\x0061' (CC s '\x02be' '\x0000')
376−-- LATIN SMALL LETTER LONG S WITH DOT ABOVE
377−foldMapping '\x1e9b' s = Yield '\x1e61' (CC s '\x0000' '\x0000')
378−-- LATIN CAPITAL LETTER SHARP S
379−foldMapping '\x1e9e' s = Yield '\x0073' (CC s '\x0073' '\x0000')
380−-- GREEK SMALL LETTER UPSILON WITH PSILI
381−foldMapping '\x1f50' s = Yield '\x03c5' (CC s '\x0313' '\x0000')
382−-- GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
383−foldMapping '\x1f52' s = Yield '\x03c5' (CC s '\x0313' '\x0300')
384−-- GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
385−foldMapping '\x1f54' s = Yield '\x03c5' (CC s '\x0313' '\x0301')
386−-- GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
387−foldMapping '\x1f56' s = Yield '\x03c5' (CC s '\x0313' '\x0342')
388−-- GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
389−foldMapping '\x1f80' s = Yield '\x1f00' (CC s '\x03b9' '\x0000')
390−-- GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
391−foldMapping '\x1f81' s = Yield '\x1f01' (CC s '\x03b9' '\x0000')
392−-- GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
393−foldMapping '\x1f82' s = Yield '\x1f02' (CC s '\x03b9' '\x0000')
394−-- GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
395−foldMapping '\x1f83' s = Yield '\x1f03' (CC s '\x03b9' '\x0000')
396−-- GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
397−foldMapping '\x1f84' s = Yield '\x1f04' (CC s '\x03b9' '\x0000')
398−-- GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
399−foldMapping '\x1f85' s = Yield '\x1f05' (CC s '\x03b9' '\x0000')
400−-- GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
401−foldMapping '\x1f86' s = Yield '\x1f06' (CC s '\x03b9' '\x0000')
402−-- GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
403−foldMapping '\x1f87' s = Yield '\x1f07' (CC s '\x03b9' '\x0000')
404−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
405−foldMapping '\x1f88' s = Yield '\x1f00' (CC s '\x03b9' '\x0000')
406−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
407−foldMapping '\x1f89' s = Yield '\x1f01' (CC s '\x03b9' '\x0000')
408−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
409−foldMapping '\x1f8a' s = Yield '\x1f02' (CC s '\x03b9' '\x0000')
410−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
411−foldMapping '\x1f8b' s = Yield '\x1f03' (CC s '\x03b9' '\x0000')
412−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
413−foldMapping '\x1f8c' s = Yield '\x1f04' (CC s '\x03b9' '\x0000')
414−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
415−foldMapping '\x1f8d' s = Yield '\x1f05' (CC s '\x03b9' '\x0000')
416−-- GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
417−foldMapping '\x1f8e' s = Yield '\x1f06' (CC s '\x03b9' '\x0000')
418−-- GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
419−foldMapping '\x1f8f' s = Yield '\x1f07' (CC s '\x03b9' '\x0000')
420−-- GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
421−foldMapping '\x1f90' s = Yield '\x1f20' (CC s '\x03b9' '\x0000')
422−-- GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
423−foldMapping '\x1f91' s = Yield '\x1f21' (CC s '\x03b9' '\x0000')
424−-- GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
425−foldMapping '\x1f92' s = Yield '\x1f22' (CC s '\x03b9' '\x0000')
426−-- GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
427−foldMapping '\x1f93' s = Yield '\x1f23' (CC s '\x03b9' '\x0000')
428−-- GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
429−foldMapping '\x1f94' s = Yield '\x1f24' (CC s '\x03b9' '\x0000')
430−-- GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
431−foldMapping '\x1f95' s = Yield '\x1f25' (CC s '\x03b9' '\x0000')
432−-- GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
433−foldMapping '\x1f96' s = Yield '\x1f26' (CC s '\x03b9' '\x0000')
434−-- GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
435−foldMapping '\x1f97' s = Yield '\x1f27' (CC s '\x03b9' '\x0000')
436−-- GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
437−foldMapping '\x1f98' s = Yield '\x1f20' (CC s '\x03b9' '\x0000')
438−-- GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
439−foldMapping '\x1f99' s = Yield '\x1f21' (CC s '\x03b9' '\x0000')
440−-- GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
441−foldMapping '\x1f9a' s = Yield '\x1f22' (CC s '\x03b9' '\x0000')
442−-- GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
443−foldMapping '\x1f9b' s = Yield '\x1f23' (CC s '\x03b9' '\x0000')
444−-- GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
445−foldMapping '\x1f9c' s = Yield '\x1f24' (CC s '\x03b9' '\x0000')
446−-- GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
447−foldMapping '\x1f9d' s = Yield '\x1f25' (CC s '\x03b9' '\x0000')
448−-- GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
449−foldMapping '\x1f9e' s = Yield '\x1f26' (CC s '\x03b9' '\x0000')
450−-- GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
451−foldMapping '\x1f9f' s = Yield '\x1f27' (CC s '\x03b9' '\x0000')
452−-- GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
453−foldMapping '\x1fa0' s = Yield '\x1f60' (CC s '\x03b9' '\x0000')
454−-- GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
455−foldMapping '\x1fa1' s = Yield '\x1f61' (CC s '\x03b9' '\x0000')
456−-- GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
457−foldMapping '\x1fa2' s = Yield '\x1f62' (CC s '\x03b9' '\x0000')
458−-- GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
459−foldMapping '\x1fa3' s = Yield '\x1f63' (CC s '\x03b9' '\x0000')
460−-- GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
461−foldMapping '\x1fa4' s = Yield '\x1f64' (CC s '\x03b9' '\x0000')
462−-- GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
463−foldMapping '\x1fa5' s = Yield '\x1f65' (CC s '\x03b9' '\x0000')
464−-- GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
465−foldMapping '\x1fa6' s = Yield '\x1f66' (CC s '\x03b9' '\x0000')
466−-- GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
467−foldMapping '\x1fa7' s = Yield '\x1f67' (CC s '\x03b9' '\x0000')
468−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
469−foldMapping '\x1fa8' s = Yield '\x1f60' (CC s '\x03b9' '\x0000')
470−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
471−foldMapping '\x1fa9' s = Yield '\x1f61' (CC s '\x03b9' '\x0000')
472−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
473−foldMapping '\x1faa' s = Yield '\x1f62' (CC s '\x03b9' '\x0000')
474−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
475−foldMapping '\x1fab' s = Yield '\x1f63' (CC s '\x03b9' '\x0000')
476−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
477−foldMapping '\x1fac' s = Yield '\x1f64' (CC s '\x03b9' '\x0000')
478−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
479−foldMapping '\x1fad' s = Yield '\x1f65' (CC s '\x03b9' '\x0000')
480−-- GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
481−foldMapping '\x1fae' s = Yield '\x1f66' (CC s '\x03b9' '\x0000')
482−-- GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
483−foldMapping '\x1faf' s = Yield '\x1f67' (CC s '\x03b9' '\x0000')
484−-- GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
485−foldMapping '\x1fb2' s = Yield '\x1f70' (CC s '\x03b9' '\x0000')
486−-- GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
487−foldMapping '\x1fb3' s = Yield '\x03b1' (CC s '\x03b9' '\x0000')
488−-- GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
489−foldMapping '\x1fb4' s = Yield '\x03ac' (CC s '\x03b9' '\x0000')
490−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI
491−foldMapping '\x1fb6' s = Yield '\x03b1' (CC s '\x0342' '\x0000')
492−-- GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
493−foldMapping '\x1fb7' s = Yield '\x03b1' (CC s '\x0342' '\x03b9')
494−-- GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
495−foldMapping '\x1fbc' s = Yield '\x03b1' (CC s '\x03b9' '\x0000')
496−-- GREEK PROSGEGRAMMENI
497−foldMapping '\x1fbe' s = Yield '\x03b9' (CC s '\x0000' '\x0000')
498−-- GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
499−foldMapping '\x1fc2' s = Yield '\x1f74' (CC s '\x03b9' '\x0000')
500−-- GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
501−foldMapping '\x1fc3' s = Yield '\x03b7' (CC s '\x03b9' '\x0000')
502−-- GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
503−foldMapping '\x1fc4' s = Yield '\x03ae' (CC s '\x03b9' '\x0000')
504−-- GREEK SMALL LETTER ETA WITH PERISPOMENI
505−foldMapping '\x1fc6' s = Yield '\x03b7' (CC s '\x0342' '\x0000')
506−-- GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
507−foldMapping '\x1fc7' s = Yield '\x03b7' (CC s '\x0342' '\x03b9')
508−-- GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
509−foldMapping '\x1fcc' s = Yield '\x03b7' (CC s '\x03b9' '\x0000')
510−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
511−foldMapping '\x1fd2' s = Yield '\x03b9' (CC s '\x0308' '\x0300')
512−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
513−foldMapping '\x1fd3' s = Yield '\x03b9' (CC s '\x0308' '\x0301')
514−-- GREEK SMALL LETTER IOTA WITH PERISPOMENI
515−foldMapping '\x1fd6' s = Yield '\x03b9' (CC s '\x0342' '\x0000')
516−-- GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
517−foldMapping '\x1fd7' s = Yield '\x03b9' (CC s '\x0308' '\x0342')
518−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
519−foldMapping '\x1fe2' s = Yield '\x03c5' (CC s '\x0308' '\x0300')
520−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
521−foldMapping '\x1fe3' s = Yield '\x03c5' (CC s '\x0308' '\x0301')
522−-- GREEK SMALL LETTER RHO WITH PSILI
523−foldMapping '\x1fe4' s = Yield '\x03c1' (CC s '\x0313' '\x0000')
524−-- GREEK SMALL LETTER UPSILON WITH PERISPOMENI
525−foldMapping '\x1fe6' s = Yield '\x03c5' (CC s '\x0342' '\x0000')
526−-- GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
527−foldMapping '\x1fe7' s = Yield '\x03c5' (CC s '\x0308' '\x0342')
528−-- GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
529−foldMapping '\x1ff2' s = Yield '\x1f7c' (CC s '\x03b9' '\x0000')
530−-- GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
531−foldMapping '\x1ff3' s = Yield '\x03c9' (CC s '\x03b9' '\x0000')
532−-- GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
533−foldMapping '\x1ff4' s = Yield '\x03ce' (CC s '\x03b9' '\x0000')
534−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI
535−foldMapping '\x1ff6' s = Yield '\x03c9' (CC s '\x0342' '\x0000')
536−-- GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
537−foldMapping '\x1ff7' s = Yield '\x03c9' (CC s '\x0342' '\x03b9')
538−-- GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
539−foldMapping '\x1ffc' s = Yield '\x03c9' (CC s '\x03b9' '\x0000')
540−-- COPTIC CAPITAL LETTER BOHAIRIC KHEI
541−foldMapping '\x2cf2' s = Yield '\x2cf3' (CC s '\x0000' '\x0000')
542−-- LATIN CAPITAL LETTER C WITH BAR
543−foldMapping '\xa792' s = Yield '\xa793' (CC s '\x0000' '\x0000')
544−-- LATIN CAPITAL LETTER H WITH HOOK
545−foldMapping '\xa7aa' s = Yield '\x0266' (CC s '\x0000' '\x0000')
546−-- LATIN SMALL LIGATURE FF
547−foldMapping '\xfb00' s = Yield '\x0066' (CC s '\x0066' '\x0000')
548−-- LATIN SMALL LIGATURE FI
549−foldMapping '\xfb01' s = Yield '\x0066' (CC s '\x0069' '\x0000')
550−-- LATIN SMALL LIGATURE FL
551−foldMapping '\xfb02' s = Yield '\x0066' (CC s '\x006c' '\x0000')
552−-- LATIN SMALL LIGATURE FFI
553−foldMapping '\xfb03' s = Yield '\x0066' (CC s '\x0066' '\x0069')
554−-- LATIN SMALL LIGATURE FFL
555−foldMapping '\xfb04' s = Yield '\x0066' (CC s '\x0066' '\x006c')
556−-- LATIN SMALL LIGATURE LONG S T
557−foldMapping '\xfb05' s = Yield '\x0073' (CC s '\x0074' '\x0000')
558−-- LATIN SMALL LIGATURE ST
559−foldMapping '\xfb06' s = Yield '\x0073' (CC s '\x0074' '\x0000')
560−-- ARMENIAN SMALL LIGATURE MEN NOW
561−foldMapping '\xfb13' s = Yield '\x0574' (CC s '\x0576' '\x0000')
562−-- ARMENIAN SMALL LIGATURE MEN ECH
563−foldMapping '\xfb14' s = Yield '\x0574' (CC s '\x0565' '\x0000')
564−-- ARMENIAN SMALL LIGATURE MEN INI
565−foldMapping '\xfb15' s = Yield '\x0574' (CC s '\x056b' '\x0000')
566−-- ARMENIAN SMALL LIGATURE VEW NOW
567−foldMapping '\xfb16' s = Yield '\x057e' (CC s '\x0576' '\x0000')
568−-- ARMENIAN SMALL LIGATURE MEN XEH
569−foldMapping '\xfb17' s = Yield '\x0574' (CC s '\x056d' '\x0000')
570−foldMapping c s = Yield (toLower c) (CC s '\0' '\0')
Data/Text/Internal/Fusion/Common.hs+46−14
@@ -1,7 +1,7 @@
1−{-# LANGUAGE BangPatterns, MagicHash, Rank2Types #-}
1+{-# LANGUAGE BangPatterns, ForeignFunctionInterface, MagicHash, Rank2Types #-}
22-- |
33-- Module : Data.Text.Internal.Fusion.Common
4−-- Copyright : (c) Bryan O'Sullivan 2009, 2012
4+-- Copyright : (c) Bryan O'Sullivan 2009, 2012, 2015
55--
66-- License : BSD-style
77-- Maintainer : bos@serpentine.com
@@ -104,20 +104,24 @@ module Data.Text.Internal.Fusion.Common
104104 , zipWith
105105 ) where
106106
107−import Prelude (Bool(..), Char, Eq(..), Int, Integral, Maybe(..),
107+import Prelude (Bool(..), Char, Eq(..), IO, Int, Integral, Maybe(..),
108108 Ord(..), Ordering(..), String, (.), ($), (+), (-), (*), (++),
109− (&&), fromIntegral, otherwise)
110−import qualified Data.List as L
111−import qualified Prelude as P
109+ (&&), fmap, fromIntegral, otherwise, return)
112110import Data.Bits (shiftL)
113111import Data.Char (isLetter)
114112import Data.Int (Int64)
115−import Data.Text.Internal.Fusion.Types
116−import Data.Text.Internal.Fusion.CaseMapping (foldMapping, lowerMapping, titleMapping,
117− upperMapping)
118113import Data.Text.Internal.Fusion.Size
114+import Data.Text.Internal.Fusion.Types
115+import Data.Text.Internal.Unsafe (inlinePerformIO)
116+import Data.Text.Internal.Unsafe.Char (ord, unsafeChr)
117+import Data.Word (Word16)
118+import Foreign.Ptr (Ptr, nullPtr, plusPtr)
119+import Foreign.Storable (peek)
119120import GHC.Prim (Addr#, chr#, indexCharOffAddr#, ord#)
120121import GHC.Types (Char(..), Int(..))
122+import qualified Data.Char as Char
123+import qualified Data.List as L
124+import qualified Prelude as P
121125
122126singleton :: Char -> Stream Char
123127singleton c = Stream next False 1
@@ -404,6 +408,22 @@ caseConvert remap (Stream next0 s0 len) = Stream next (CC s0 '\0' '\0') len
404408 Yield c s' -> remap c s'
405409 next (CC s a b) = Yield a (CC s b '\0')
406410
411+-- | Convert a single character to a Step.
412+convert :: (Word16 -> IO (Ptr Word16))
413+ -> (Char -> Char)
414+ -> Char -> s -> Step (CC s) Char
415+convert lookup f c s
416+ | c > '\xffff' = Yield (f c) (CC s '\0' '\0')
417+ | otherwise = inlinePerformIO $ do
418+ ptr <- lookup (fromIntegral (ord c))
419+ if (ptr == nullPtr)
420+ then return $ Yield (f c) (CC s '\0' '\0')
421+ else do
422+ x <- unsafeChr `fmap` peek ptr
423+ y <- unsafeChr `fmap` peek (ptr `plusPtr` 2)
424+ z <- unsafeChr `fmap` peek (ptr `plusPtr` 4)
425+ return $ Yield x (CC s y z)
426+
407427-- | /O(n)/ Convert a string to folded case. This function is mainly
408428-- useful for performing caseless (or case insensitive) string
409429-- comparisons.
@@ -419,7 +439,7 @@ caseConvert remap (Stream next0 s0 len) = Stream next (CC s0 '\0' '\0') len
419439-- case folded to the Greek small letter letter mu (U+03BC) instead of
420440-- itself.
421441toCaseFold :: Stream Char -> Stream Char
422−toCaseFold = caseConvert foldMapping
442+toCaseFold = caseConvert (convert to_case_fold Char.toLower)
423443{-# INLINE [0] toCaseFold #-}
424444
425445-- | /O(n)/ Convert a string to upper case, using simple case
@@ -427,7 +447,7 @@ toCaseFold = caseConvert foldMapping
427447-- For instance, the German eszett (U+00DF) maps to the two-letter
428448-- sequence SS.
429449toUpper :: Stream Char -> Stream Char
430−toUpper = caseConvert upperMapping
450+toUpper = caseConvert (convert to_upper Char.toUpper)
431451{-# INLINE [0] toUpper #-}
432452
433453-- | /O(n)/ Convert a string to lower case, using simple case
@@ -436,7 +456,7 @@ toUpper = caseConvert upperMapping
436456-- maps to the sequence Latin small letter i (U+0069) followed by
437457-- combining dot above (U+0307).
438458toLower :: Stream Char -> Stream Char
439−toLower = caseConvert lowerMapping
459+toLower = caseConvert (convert to_lower Char.toLower)
440460{-# INLINE [0] toLower #-}
441461
442462-- | /O(n)/ Convert a string to title case, using simple case
@@ -466,8 +486,8 @@ toTitle (Stream next0 s0 len) = Stream next (CC (False :*: s0) '\0' '\0') len
466486 Skip s' -> Skip (CC (letter :*: s') '\0' '\0')
467487 Yield c s'
468488 | letter' -> if letter
469− then lowerMapping c (letter' :*: s')
470− else titleMapping c (letter' :*: s')
489+ then convert to_lower Char.toLower c (letter' :*: s')
490+ else convert to_title Char.toTitle c (letter' :*: s')
471491 | otherwise -> Yield c (CC (letter' :*: s') '\0' '\0')
472492 where letter' = isLetter c
473493 next (CC s a b) = Yield a (CC s b '\0')
@@ -949,3 +969,15 @@ emptyError func = internalError func "Empty input"
949969
950970internalError :: String -> a
951971internalError func = streamError func "Internal error"
972+
973+foreign import ccall unsafe "_hs_text_to_upper" to_upper
974+ :: Word16 -> IO (Ptr Word16)
975+
976+foreign import ccall unsafe "_hs_text_to_lower" to_lower
977+ :: Word16 -> IO (Ptr Word16)
978+
979+foreign import ccall unsafe "_hs_text_to_case_fold" to_case_fold
980+ :: Word16 -> IO (Ptr Word16)
981+
982+foreign import ccall unsafe "_hs_text_to_title" to_title
983+ :: Word16 -> IO (Ptr Word16)
benchmarks/text-benchmarks.cabal+1−1
@@ -22,7 +22,7 @@ flag llvm
2222
2323executable text-benchmarks
2424 hs-source-dirs: haskell ..
25− c-sources: ../cbits/cbits.c
25+ c-sources: ../cbits/case_mapping.c ../cbits/cbits.c
2626 cbits/time_iconv.c
2727 include-dirs: ../include
2828 main-is: Benchmarks.hs
cbits/case_mapping.cnew file+852
@@ -0,0 +1,852 @@
1+/*
2+ * AUTOMATICALLY GENERATED - DO NOT EDIT
3+ * Generated by scripts/CaseMapping.hs
4+ *
5+ * CaseFolding-6.3.0.txt
6+ * Date: 2012-12-20, 22:14:35 GMT [MD]
7+ * SpecialCasing-6.3.0.txt
8+ * Date: 2013-05-08, 13:54:51 GMT [MD]
9+ */
10+
11+#include <stdint.h>
12+#include <sys/types.h>
13+
14+const uint16_t _hs_text_to_upper_keys[102] = {
15+ 0x00df, /* LATIN SMALL LETTER SHARP S */
16+ 0x0149, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
17+ 0x01f0, /* LATIN SMALL LETTER J WITH CARON */
18+ 0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
19+ 0x03b0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
20+ 0x0587, /* ARMENIAN SMALL LIGATURE ECH YIWN */
21+ 0x1e96, /* LATIN SMALL LETTER H WITH LINE BELOW */
22+ 0x1e97, /* LATIN SMALL LETTER T WITH DIAERESIS */
23+ 0x1e98, /* LATIN SMALL LETTER W WITH RING ABOVE */
24+ 0x1e99, /* LATIN SMALL LETTER Y WITH RING ABOVE */
25+ 0x1e9a, /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
26+ 0x1f50, /* GREEK SMALL LETTER UPSILON WITH PSILI */
27+ 0x1f52, /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
28+ 0x1f54, /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
29+ 0x1f56, /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
30+ 0x1f80, /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
31+ 0x1f81, /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
32+ 0x1f82, /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
33+ 0x1f83, /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
34+ 0x1f84, /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
35+ 0x1f85, /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
36+ 0x1f86, /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
37+ 0x1f87, /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
38+ 0x1f88, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
39+ 0x1f89, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
40+ 0x1f8a, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
41+ 0x1f8b, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
42+ 0x1f8c, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
43+ 0x1f8d, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
44+ 0x1f8e, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
45+ 0x1f8f, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
46+ 0x1f90, /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
47+ 0x1f91, /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
48+ 0x1f92, /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
49+ 0x1f93, /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
50+ 0x1f94, /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
51+ 0x1f95, /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
52+ 0x1f96, /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
53+ 0x1f97, /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
54+ 0x1f98, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
55+ 0x1f99, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
56+ 0x1f9a, /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
57+ 0x1f9b, /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
58+ 0x1f9c, /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
59+ 0x1f9d, /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
60+ 0x1f9e, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
61+ 0x1f9f, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
62+ 0x1fa0, /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
63+ 0x1fa1, /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
64+ 0x1fa2, /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
65+ 0x1fa3, /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
66+ 0x1fa4, /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
67+ 0x1fa5, /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
68+ 0x1fa6, /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
69+ 0x1fa7, /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
70+ 0x1fa8, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
71+ 0x1fa9, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
72+ 0x1faa, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
73+ 0x1fab, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
74+ 0x1fac, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
75+ 0x1fad, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
76+ 0x1fae, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
77+ 0x1faf, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
78+ 0x1fb2, /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
79+ 0x1fb3, /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
80+ 0x1fb4, /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
81+ 0x1fb6, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
82+ 0x1fb7, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
83+ 0x1fbc, /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
84+ 0x1fc2, /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
85+ 0x1fc3, /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
86+ 0x1fc4, /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
87+ 0x1fc6, /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
88+ 0x1fc7, /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
89+ 0x1fcc, /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
90+ 0x1fd2, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
91+ 0x1fd3, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
92+ 0x1fd6, /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
93+ 0x1fd7, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
94+ 0x1fe2, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
95+ 0x1fe3, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
96+ 0x1fe4, /* GREEK SMALL LETTER RHO WITH PSILI */
97+ 0x1fe6, /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
98+ 0x1fe7, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
99+ 0x1ff2, /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
100+ 0x1ff3, /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
101+ 0x1ff4, /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
102+ 0x1ff6, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
103+ 0x1ff7, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
104+ 0x1ffc, /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
105+ 0xfb00, /* LATIN SMALL LIGATURE FF */
106+ 0xfb01, /* LATIN SMALL LIGATURE FI */
107+ 0xfb02, /* LATIN SMALL LIGATURE FL */
108+ 0xfb03, /* LATIN SMALL LIGATURE FFI */
109+ 0xfb04, /* LATIN SMALL LIGATURE FFL */
110+ 0xfb05, /* LATIN SMALL LIGATURE LONG S T */
111+ 0xfb06, /* LATIN SMALL LIGATURE ST */
112+ 0xfb13, /* ARMENIAN SMALL LIGATURE MEN NOW */
113+ 0xfb14, /* ARMENIAN SMALL LIGATURE MEN ECH */
114+ 0xfb15, /* ARMENIAN SMALL LIGATURE MEN INI */
115+ 0xfb16, /* ARMENIAN SMALL LIGATURE VEW NOW */
116+ 0xfb17, /* ARMENIAN SMALL LIGATURE MEN XEH */
117+};
118+const size_t _hs_text_to_upper_len = 102;
119+const uint16_t _hs_text_to_upper_values[102][3] = {
120+ /* 0x00df - LATIN SMALL LETTER SHARP S */
121+ {0x0053, 0x0053, 0},
122+ /* 0x0149 - LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
123+ {0x02bc, 0x004e, 0},
124+ /* 0x01f0 - LATIN SMALL LETTER J WITH CARON */
125+ {0x004a, 0x030c, 0},
126+ /* 0x0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
127+ {0x0399, 0x0308, 0x0301},
128+ /* 0x03b0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
129+ {0x03a5, 0x0308, 0x0301},
130+ /* 0x0587 - ARMENIAN SMALL LIGATURE ECH YIWN */
131+ {0x0535, 0x0552, 0},
132+ /* 0x1e96 - LATIN SMALL LETTER H WITH LINE BELOW */
133+ {0x0048, 0x0331, 0},
134+ /* 0x1e97 - LATIN SMALL LETTER T WITH DIAERESIS */
135+ {0x0054, 0x0308, 0},
136+ /* 0x1e98 - LATIN SMALL LETTER W WITH RING ABOVE */
137+ {0x0057, 0x030a, 0},
138+ /* 0x1e99 - LATIN SMALL LETTER Y WITH RING ABOVE */
139+ {0x0059, 0x030a, 0},
140+ /* 0x1e9a - LATIN SMALL LETTER A WITH RIGHT HALF RING */
141+ {0x0041, 0x02be, 0},
142+ /* 0x1f50 - GREEK SMALL LETTER UPSILON WITH PSILI */
143+ {0x03a5, 0x0313, 0},
144+ /* 0x1f52 - GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
145+ {0x03a5, 0x0313, 0x0300},
146+ /* 0x1f54 - GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
147+ {0x03a5, 0x0313, 0x0301},
148+ /* 0x1f56 - GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
149+ {0x03a5, 0x0313, 0x0342},
150+ /* 0x1f80 - GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
151+ {0x1f08, 0x0399, 0},
152+ /* 0x1f81 - GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
153+ {0x1f09, 0x0399, 0},
154+ /* 0x1f82 - GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
155+ {0x1f0a, 0x0399, 0},
156+ /* 0x1f83 - GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
157+ {0x1f0b, 0x0399, 0},
158+ /* 0x1f84 - GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
159+ {0x1f0c, 0x0399, 0},
160+ /* 0x1f85 - GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
161+ {0x1f0d, 0x0399, 0},
162+ /* 0x1f86 - GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
163+ {0x1f0e, 0x0399, 0},
164+ /* 0x1f87 - GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
165+ {0x1f0f, 0x0399, 0},
166+ /* 0x1f88 - GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
167+ {0x1f08, 0x0399, 0},
168+ /* 0x1f89 - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
169+ {0x1f09, 0x0399, 0},
170+ /* 0x1f8a - GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
171+ {0x1f0a, 0x0399, 0},
172+ /* 0x1f8b - GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
173+ {0x1f0b, 0x0399, 0},
174+ /* 0x1f8c - GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
175+ {0x1f0c, 0x0399, 0},
176+ /* 0x1f8d - GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
177+ {0x1f0d, 0x0399, 0},
178+ /* 0x1f8e - GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
179+ {0x1f0e, 0x0399, 0},
180+ /* 0x1f8f - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
181+ {0x1f0f, 0x0399, 0},
182+ /* 0x1f90 - GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
183+ {0x1f28, 0x0399, 0},
184+ /* 0x1f91 - GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
185+ {0x1f29, 0x0399, 0},
186+ /* 0x1f92 - GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
187+ {0x1f2a, 0x0399, 0},
188+ /* 0x1f93 - GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
189+ {0x1f2b, 0x0399, 0},
190+ /* 0x1f94 - GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
191+ {0x1f2c, 0x0399, 0},
192+ /* 0x1f95 - GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
193+ {0x1f2d, 0x0399, 0},
194+ /* 0x1f96 - GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
195+ {0x1f2e, 0x0399, 0},
196+ /* 0x1f97 - GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
197+ {0x1f2f, 0x0399, 0},
198+ /* 0x1f98 - GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
199+ {0x1f28, 0x0399, 0},
200+ /* 0x1f99 - GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
201+ {0x1f29, 0x0399, 0},
202+ /* 0x1f9a - GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
203+ {0x1f2a, 0x0399, 0},
204+ /* 0x1f9b - GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
205+ {0x1f2b, 0x0399, 0},
206+ /* 0x1f9c - GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
207+ {0x1f2c, 0x0399, 0},
208+ /* 0x1f9d - GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
209+ {0x1f2d, 0x0399, 0},
210+ /* 0x1f9e - GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
211+ {0x1f2e, 0x0399, 0},
212+ /* 0x1f9f - GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
213+ {0x1f2f, 0x0399, 0},
214+ /* 0x1fa0 - GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
215+ {0x1f68, 0x0399, 0},
216+ /* 0x1fa1 - GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
217+ {0x1f69, 0x0399, 0},
218+ /* 0x1fa2 - GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
219+ {0x1f6a, 0x0399, 0},
220+ /* 0x1fa3 - GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
221+ {0x1f6b, 0x0399, 0},
222+ /* 0x1fa4 - GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
223+ {0x1f6c, 0x0399, 0},
224+ /* 0x1fa5 - GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
225+ {0x1f6d, 0x0399, 0},
226+ /* 0x1fa6 - GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
227+ {0x1f6e, 0x0399, 0},
228+ /* 0x1fa7 - GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
229+ {0x1f6f, 0x0399, 0},
230+ /* 0x1fa8 - GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
231+ {0x1f68, 0x0399, 0},
232+ /* 0x1fa9 - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
233+ {0x1f69, 0x0399, 0},
234+ /* 0x1faa - GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
235+ {0x1f6a, 0x0399, 0},
236+ /* 0x1fab - GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
237+ {0x1f6b, 0x0399, 0},
238+ /* 0x1fac - GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
239+ {0x1f6c, 0x0399, 0},
240+ /* 0x1fad - GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
241+ {0x1f6d, 0x0399, 0},
242+ /* 0x1fae - GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
243+ {0x1f6e, 0x0399, 0},
244+ /* 0x1faf - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
245+ {0x1f6f, 0x0399, 0},
246+ /* 0x1fb2 - GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
247+ {0x1fba, 0x0399, 0},
248+ /* 0x1fb3 - GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
249+ {0x0391, 0x0399, 0},
250+ /* 0x1fb4 - GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
251+ {0x0386, 0x0399, 0},
252+ /* 0x1fb6 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
253+ {0x0391, 0x0342, 0},
254+ /* 0x1fb7 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
255+ {0x0391, 0x0342, 0x0399},
256+ /* 0x1fbc - GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
257+ {0x0391, 0x0399, 0},
258+ /* 0x1fc2 - GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
259+ {0x1fca, 0x0399, 0},
260+ /* 0x1fc3 - GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
261+ {0x0397, 0x0399, 0},
262+ /* 0x1fc4 - GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
263+ {0x0389, 0x0399, 0},
264+ /* 0x1fc6 - GREEK SMALL LETTER ETA WITH PERISPOMENI */
265+ {0x0397, 0x0342, 0},
266+ /* 0x1fc7 - GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
267+ {0x0397, 0x0342, 0x0399},
268+ /* 0x1fcc - GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
269+ {0x0397, 0x0399, 0},
270+ /* 0x1fd2 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
271+ {0x0399, 0x0308, 0x0300},
272+ /* 0x1fd3 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
273+ {0x0399, 0x0308, 0x0301},
274+ /* 0x1fd6 - GREEK SMALL LETTER IOTA WITH PERISPOMENI */
275+ {0x0399, 0x0342, 0},
276+ /* 0x1fd7 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
277+ {0x0399, 0x0308, 0x0342},
278+ /* 0x1fe2 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
279+ {0x03a5, 0x0308, 0x0300},
280+ /* 0x1fe3 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
281+ {0x03a5, 0x0308, 0x0301},
282+ /* 0x1fe4 - GREEK SMALL LETTER RHO WITH PSILI */
283+ {0x03a1, 0x0313, 0},
284+ /* 0x1fe6 - GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
285+ {0x03a5, 0x0342, 0},
286+ /* 0x1fe7 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
287+ {0x03a5, 0x0308, 0x0342},
288+ /* 0x1ff2 - GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
289+ {0x1ffa, 0x0399, 0},
290+ /* 0x1ff3 - GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
291+ {0x03a9, 0x0399, 0},
292+ /* 0x1ff4 - GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
293+ {0x038f, 0x0399, 0},
294+ /* 0x1ff6 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
295+ {0x03a9, 0x0342, 0},
296+ /* 0x1ff7 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
297+ {0x03a9, 0x0342, 0x0399},
298+ /* 0x1ffc - GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
299+ {0x03a9, 0x0399, 0},
300+ /* 0xfb00 - LATIN SMALL LIGATURE FF */
301+ {0x0046, 0x0046, 0},
302+ /* 0xfb01 - LATIN SMALL LIGATURE FI */
303+ {0x0046, 0x0049, 0},
304+ /* 0xfb02 - LATIN SMALL LIGATURE FL */
305+ {0x0046, 0x004c, 0},
306+ /* 0xfb03 - LATIN SMALL LIGATURE FFI */
307+ {0x0046, 0x0046, 0x0049},
308+ /* 0xfb04 - LATIN SMALL LIGATURE FFL */
309+ {0x0046, 0x0046, 0x004c},
310+ /* 0xfb05 - LATIN SMALL LIGATURE LONG S T */
311+ {0x0053, 0x0054, 0},
312+ /* 0xfb06 - LATIN SMALL LIGATURE ST */
313+ {0x0053, 0x0054, 0},
314+ /* 0xfb13 - ARMENIAN SMALL LIGATURE MEN NOW */
315+ {0x0544, 0x0546, 0},
316+ /* 0xfb14 - ARMENIAN SMALL LIGATURE MEN ECH */
317+ {0x0544, 0x0535, 0},
318+ /* 0xfb15 - ARMENIAN SMALL LIGATURE MEN INI */
319+ {0x0544, 0x053b, 0},
320+ /* 0xfb16 - ARMENIAN SMALL LIGATURE VEW NOW */
321+ {0x054e, 0x0546, 0},
322+ /* 0xfb17 - ARMENIAN SMALL LIGATURE MEN XEH */
323+ {0x0544, 0x053d, 0},
324+};
325+const uint16_t _hs_text_to_lower_keys[1] = {
326+ 0x0130, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
327+};
328+const size_t _hs_text_to_lower_len = 1;
329+const uint16_t _hs_text_to_lower_values[1][3] = {
330+ /* 0x0130 - LATIN CAPITAL LETTER I WITH DOT ABOVE */
331+ {0x0069, 0x0307, 0},
332+};
333+const uint16_t _hs_text_to_title_keys[48] = {
334+ 0x00df, /* LATIN SMALL LETTER SHARP S */
335+ 0x0149, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
336+ 0x01f0, /* LATIN SMALL LETTER J WITH CARON */
337+ 0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
338+ 0x03b0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
339+ 0x0587, /* ARMENIAN SMALL LIGATURE ECH YIWN */
340+ 0x1e96, /* LATIN SMALL LETTER H WITH LINE BELOW */
341+ 0x1e97, /* LATIN SMALL LETTER T WITH DIAERESIS */
342+ 0x1e98, /* LATIN SMALL LETTER W WITH RING ABOVE */
343+ 0x1e99, /* LATIN SMALL LETTER Y WITH RING ABOVE */
344+ 0x1e9a, /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
345+ 0x1f50, /* GREEK SMALL LETTER UPSILON WITH PSILI */
346+ 0x1f52, /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
347+ 0x1f54, /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
348+ 0x1f56, /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
349+ 0x1fb2, /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
350+ 0x1fb4, /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
351+ 0x1fb6, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
352+ 0x1fb7, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
353+ 0x1fc2, /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
354+ 0x1fc4, /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
355+ 0x1fc6, /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
356+ 0x1fc7, /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
357+ 0x1fd2, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
358+ 0x1fd3, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
359+ 0x1fd6, /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
360+ 0x1fd7, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
361+ 0x1fe2, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
362+ 0x1fe3, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
363+ 0x1fe4, /* GREEK SMALL LETTER RHO WITH PSILI */
364+ 0x1fe6, /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
365+ 0x1fe7, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
366+ 0x1ff2, /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
367+ 0x1ff4, /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
368+ 0x1ff6, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
369+ 0x1ff7, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
370+ 0xfb00, /* LATIN SMALL LIGATURE FF */
371+ 0xfb01, /* LATIN SMALL LIGATURE FI */
372+ 0xfb02, /* LATIN SMALL LIGATURE FL */
373+ 0xfb03, /* LATIN SMALL LIGATURE FFI */
374+ 0xfb04, /* LATIN SMALL LIGATURE FFL */
375+ 0xfb05, /* LATIN SMALL LIGATURE LONG S T */
376+ 0xfb06, /* LATIN SMALL LIGATURE ST */
377+ 0xfb13, /* ARMENIAN SMALL LIGATURE MEN NOW */
378+ 0xfb14, /* ARMENIAN SMALL LIGATURE MEN ECH */
379+ 0xfb15, /* ARMENIAN SMALL LIGATURE MEN INI */
380+ 0xfb16, /* ARMENIAN SMALL LIGATURE VEW NOW */
381+ 0xfb17, /* ARMENIAN SMALL LIGATURE MEN XEH */
382+};
383+const size_t _hs_text_to_title_len = 48;
384+const uint16_t _hs_text_to_title_values[48][3] = {
385+ /* 0x00df - LATIN SMALL LETTER SHARP S */
386+ {0x0053, 0x0073, 0},
387+ /* 0x0149 - LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
388+ {0x02bc, 0x004e, 0},
389+ /* 0x01f0 - LATIN SMALL LETTER J WITH CARON */
390+ {0x004a, 0x030c, 0},
391+ /* 0x0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
392+ {0x0399, 0x0308, 0x0301},
393+ /* 0x03b0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
394+ {0x03a5, 0x0308, 0x0301},
395+ /* 0x0587 - ARMENIAN SMALL LIGATURE ECH YIWN */
396+ {0x0535, 0x0582, 0},
397+ /* 0x1e96 - LATIN SMALL LETTER H WITH LINE BELOW */
398+ {0x0048, 0x0331, 0},
399+ /* 0x1e97 - LATIN SMALL LETTER T WITH DIAERESIS */
400+ {0x0054, 0x0308, 0},
401+ /* 0x1e98 - LATIN SMALL LETTER W WITH RING ABOVE */
402+ {0x0057, 0x030a, 0},
403+ /* 0x1e99 - LATIN SMALL LETTER Y WITH RING ABOVE */
404+ {0x0059, 0x030a, 0},
405+ /* 0x1e9a - LATIN SMALL LETTER A WITH RIGHT HALF RING */
406+ {0x0041, 0x02be, 0},
407+ /* 0x1f50 - GREEK SMALL LETTER UPSILON WITH PSILI */
408+ {0x03a5, 0x0313, 0},
409+ /* 0x1f52 - GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
410+ {0x03a5, 0x0313, 0x0300},
411+ /* 0x1f54 - GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
412+ {0x03a5, 0x0313, 0x0301},
413+ /* 0x1f56 - GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
414+ {0x03a5, 0x0313, 0x0342},
415+ /* 0x1fb2 - GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
416+ {0x1fba, 0x0345, 0},
417+ /* 0x1fb4 - GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
418+ {0x0386, 0x0345, 0},
419+ /* 0x1fb6 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
420+ {0x0391, 0x0342, 0},
421+ /* 0x1fb7 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
422+ {0x0391, 0x0342, 0x0345},
423+ /* 0x1fc2 - GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
424+ {0x1fca, 0x0345, 0},
425+ /* 0x1fc4 - GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
426+ {0x0389, 0x0345, 0},
427+ /* 0x1fc6 - GREEK SMALL LETTER ETA WITH PERISPOMENI */
428+ {0x0397, 0x0342, 0},
429+ /* 0x1fc7 - GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
430+ {0x0397, 0x0342, 0x0345},
431+ /* 0x1fd2 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
432+ {0x0399, 0x0308, 0x0300},
433+ /* 0x1fd3 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
434+ {0x0399, 0x0308, 0x0301},
435+ /* 0x1fd6 - GREEK SMALL LETTER IOTA WITH PERISPOMENI */
436+ {0x0399, 0x0342, 0},
437+ /* 0x1fd7 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
438+ {0x0399, 0x0308, 0x0342},
439+ /* 0x1fe2 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
440+ {0x03a5, 0x0308, 0x0300},
441+ /* 0x1fe3 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
442+ {0x03a5, 0x0308, 0x0301},
443+ /* 0x1fe4 - GREEK SMALL LETTER RHO WITH PSILI */
444+ {0x03a1, 0x0313, 0},
445+ /* 0x1fe6 - GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
446+ {0x03a5, 0x0342, 0},
447+ /* 0x1fe7 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
448+ {0x03a5, 0x0308, 0x0342},
449+ /* 0x1ff2 - GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
450+ {0x1ffa, 0x0345, 0},
451+ /* 0x1ff4 - GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
452+ {0x038f, 0x0345, 0},
453+ /* 0x1ff6 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
454+ {0x03a9, 0x0342, 0},
455+ /* 0x1ff7 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
456+ {0x03a9, 0x0342, 0x0345},
457+ /* 0xfb00 - LATIN SMALL LIGATURE FF */
458+ {0x0046, 0x0066, 0},
459+ /* 0xfb01 - LATIN SMALL LIGATURE FI */
460+ {0x0046, 0x0069, 0},
461+ /* 0xfb02 - LATIN SMALL LIGATURE FL */
462+ {0x0046, 0x006c, 0},
463+ /* 0xfb03 - LATIN SMALL LIGATURE FFI */
464+ {0x0046, 0x0066, 0x0069},
465+ /* 0xfb04 - LATIN SMALL LIGATURE FFL */
466+ {0x0046, 0x0066, 0x006c},
467+ /* 0xfb05 - LATIN SMALL LIGATURE LONG S T */
468+ {0x0053, 0x0074, 0},
469+ /* 0xfb06 - LATIN SMALL LIGATURE ST */
470+ {0x0053, 0x0074, 0},
471+ /* 0xfb13 - ARMENIAN SMALL LIGATURE MEN NOW */
472+ {0x0544, 0x0576, 0},
473+ /* 0xfb14 - ARMENIAN SMALL LIGATURE MEN ECH */
474+ {0x0544, 0x0565, 0},
475+ /* 0xfb15 - ARMENIAN SMALL LIGATURE MEN INI */
476+ {0x0544, 0x056b, 0},
477+ /* 0xfb16 - ARMENIAN SMALL LIGATURE VEW NOW */
478+ {0x054e, 0x0576, 0},
479+ /* 0xfb17 - ARMENIAN SMALL LIGATURE MEN XEH */
480+ {0x0544, 0x056d, 0},
481+};
482+const uint16_t _hs_text_to_case_fold_keys[122] = {
483+ 0x00b5, /* MICRO SIGN */
484+ 0x00df, /* LATIN SMALL LETTER SHARP S */
485+ 0x0130, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
486+ 0x0149, /* LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
487+ 0x017f, /* LATIN SMALL LETTER LONG S */
488+ 0x01f0, /* LATIN SMALL LETTER J WITH CARON */
489+ 0x0345, /* COMBINING GREEK YPOGEGRAMMENI */
490+ 0x0390, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
491+ 0x03b0, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
492+ 0x03c2, /* GREEK SMALL LETTER FINAL SIGMA */
493+ 0x03d0, /* GREEK BETA SYMBOL */
494+ 0x03d1, /* GREEK THETA SYMBOL */
495+ 0x03d5, /* GREEK PHI SYMBOL */
496+ 0x03d6, /* GREEK PI SYMBOL */
497+ 0x03f0, /* GREEK KAPPA SYMBOL */
498+ 0x03f1, /* GREEK RHO SYMBOL */
499+ 0x03f5, /* GREEK LUNATE EPSILON SYMBOL */
500+ 0x0587, /* ARMENIAN SMALL LIGATURE ECH YIWN */
501+ 0x10c7, /* GEORGIAN CAPITAL LETTER YN */
502+ 0x10cd, /* GEORGIAN CAPITAL LETTER AEN */
503+ 0x1e96, /* LATIN SMALL LETTER H WITH LINE BELOW */
504+ 0x1e97, /* LATIN SMALL LETTER T WITH DIAERESIS */
505+ 0x1e98, /* LATIN SMALL LETTER W WITH RING ABOVE */
506+ 0x1e99, /* LATIN SMALL LETTER Y WITH RING ABOVE */
507+ 0x1e9a, /* LATIN SMALL LETTER A WITH RIGHT HALF RING */
508+ 0x1e9b, /* LATIN SMALL LETTER LONG S WITH DOT ABOVE */
509+ 0x1e9e, /* LATIN CAPITAL LETTER SHARP S */
510+ 0x1f50, /* GREEK SMALL LETTER UPSILON WITH PSILI */
511+ 0x1f52, /* GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
512+ 0x1f54, /* GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
513+ 0x1f56, /* GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
514+ 0x1f80, /* GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
515+ 0x1f81, /* GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
516+ 0x1f82, /* GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
517+ 0x1f83, /* GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
518+ 0x1f84, /* GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
519+ 0x1f85, /* GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
520+ 0x1f86, /* GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
521+ 0x1f87, /* GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
522+ 0x1f88, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
523+ 0x1f89, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
524+ 0x1f8a, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
525+ 0x1f8b, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
526+ 0x1f8c, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
527+ 0x1f8d, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
528+ 0x1f8e, /* GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
529+ 0x1f8f, /* GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
530+ 0x1f90, /* GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
531+ 0x1f91, /* GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
532+ 0x1f92, /* GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
533+ 0x1f93, /* GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
534+ 0x1f94, /* GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
535+ 0x1f95, /* GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
536+ 0x1f96, /* GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
537+ 0x1f97, /* GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
538+ 0x1f98, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
539+ 0x1f99, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
540+ 0x1f9a, /* GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
541+ 0x1f9b, /* GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
542+ 0x1f9c, /* GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
543+ 0x1f9d, /* GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
544+ 0x1f9e, /* GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
545+ 0x1f9f, /* GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
546+ 0x1fa0, /* GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
547+ 0x1fa1, /* GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
548+ 0x1fa2, /* GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
549+ 0x1fa3, /* GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
550+ 0x1fa4, /* GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
551+ 0x1fa5, /* GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
552+ 0x1fa6, /* GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
553+ 0x1fa7, /* GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
554+ 0x1fa8, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
555+ 0x1fa9, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
556+ 0x1faa, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
557+ 0x1fab, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
558+ 0x1fac, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
559+ 0x1fad, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
560+ 0x1fae, /* GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
561+ 0x1faf, /* GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
562+ 0x1fb2, /* GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
563+ 0x1fb3, /* GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
564+ 0x1fb4, /* GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
565+ 0x1fb6, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
566+ 0x1fb7, /* GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
567+ 0x1fbc, /* GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
568+ 0x1fbe, /* GREEK PROSGEGRAMMENI */
569+ 0x1fc2, /* GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
570+ 0x1fc3, /* GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
571+ 0x1fc4, /* GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
572+ 0x1fc6, /* GREEK SMALL LETTER ETA WITH PERISPOMENI */
573+ 0x1fc7, /* GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
574+ 0x1fcc, /* GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
575+ 0x1fd2, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
576+ 0x1fd3, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
577+ 0x1fd6, /* GREEK SMALL LETTER IOTA WITH PERISPOMENI */
578+ 0x1fd7, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
579+ 0x1fe2, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
580+ 0x1fe3, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
581+ 0x1fe4, /* GREEK SMALL LETTER RHO WITH PSILI */
582+ 0x1fe6, /* GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
583+ 0x1fe7, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
584+ 0x1ff2, /* GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
585+ 0x1ff3, /* GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
586+ 0x1ff4, /* GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
587+ 0x1ff6, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
588+ 0x1ff7, /* GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
589+ 0x1ffc, /* GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
590+ 0x2cf2, /* COPTIC CAPITAL LETTER BOHAIRIC KHEI */
591+ 0xa792, /* LATIN CAPITAL LETTER C WITH BAR */
592+ 0xa7aa, /* LATIN CAPITAL LETTER H WITH HOOK */
593+ 0xfb00, /* LATIN SMALL LIGATURE FF */
594+ 0xfb01, /* LATIN SMALL LIGATURE FI */
595+ 0xfb02, /* LATIN SMALL LIGATURE FL */
596+ 0xfb03, /* LATIN SMALL LIGATURE FFI */
597+ 0xfb04, /* LATIN SMALL LIGATURE FFL */
598+ 0xfb05, /* LATIN SMALL LIGATURE LONG S T */
599+ 0xfb06, /* LATIN SMALL LIGATURE ST */
600+ 0xfb13, /* ARMENIAN SMALL LIGATURE MEN NOW */
601+ 0xfb14, /* ARMENIAN SMALL LIGATURE MEN ECH */
602+ 0xfb15, /* ARMENIAN SMALL LIGATURE MEN INI */
603+ 0xfb16, /* ARMENIAN SMALL LIGATURE VEW NOW */
604+ 0xfb17, /* ARMENIAN SMALL LIGATURE MEN XEH */
605+};
606+const size_t _hs_text_to_case_fold_len = 122;
607+const uint16_t _hs_text_to_case_fold_values[122][3] = {
608+ /* 0x00b5 - MICRO SIGN */
609+ {0x03bc, 0, 0},
610+ /* 0x00df - LATIN SMALL LETTER SHARP S */
611+ {0x0073, 0x0073, 0},
612+ /* 0x0130 - LATIN CAPITAL LETTER I WITH DOT ABOVE */
613+ {0x0069, 0x0307, 0},
614+ /* 0x0149 - LATIN SMALL LETTER N PRECEDED BY APOSTROPHE */
615+ {0x02bc, 0x006e, 0},
616+ /* 0x017f - LATIN SMALL LETTER LONG S */
617+ {0x0073, 0, 0},
618+ /* 0x01f0 - LATIN SMALL LETTER J WITH CARON */
619+ {0x006a, 0x030c, 0},
620+ /* 0x0345 - COMBINING GREEK YPOGEGRAMMENI */
621+ {0x03b9, 0, 0},
622+ /* 0x0390 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
623+ {0x03b9, 0x0308, 0x0301},
624+ /* 0x03b0 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
625+ {0x03c5, 0x0308, 0x0301},
626+ /* 0x03c2 - GREEK SMALL LETTER FINAL SIGMA */
627+ {0x03c3, 0, 0},
628+ /* 0x03d0 - GREEK BETA SYMBOL */
629+ {0x03b2, 0, 0},
630+ /* 0x03d1 - GREEK THETA SYMBOL */
631+ {0x03b8, 0, 0},
632+ /* 0x03d5 - GREEK PHI SYMBOL */
633+ {0x03c6, 0, 0},
634+ /* 0x03d6 - GREEK PI SYMBOL */
635+ {0x03c0, 0, 0},
636+ /* 0x03f0 - GREEK KAPPA SYMBOL */
637+ {0x03ba, 0, 0},
638+ /* 0x03f1 - GREEK RHO SYMBOL */
639+ {0x03c1, 0, 0},
640+ /* 0x03f5 - GREEK LUNATE EPSILON SYMBOL */
641+ {0x03b5, 0, 0},
642+ /* 0x0587 - ARMENIAN SMALL LIGATURE ECH YIWN */
643+ {0x0565, 0x0582, 0},
644+ /* 0x10c7 - GEORGIAN CAPITAL LETTER YN */
645+ {0x2d27, 0, 0},
646+ /* 0x10cd - GEORGIAN CAPITAL LETTER AEN */
647+ {0x2d2d, 0, 0},
648+ /* 0x1e96 - LATIN SMALL LETTER H WITH LINE BELOW */
649+ {0x0068, 0x0331, 0},
650+ /* 0x1e97 - LATIN SMALL LETTER T WITH DIAERESIS */
651+ {0x0074, 0x0308, 0},
652+ /* 0x1e98 - LATIN SMALL LETTER W WITH RING ABOVE */
653+ {0x0077, 0x030a, 0},
654+ /* 0x1e99 - LATIN SMALL LETTER Y WITH RING ABOVE */
655+ {0x0079, 0x030a, 0},
656+ /* 0x1e9a - LATIN SMALL LETTER A WITH RIGHT HALF RING */
657+ {0x0061, 0x02be, 0},
658+ /* 0x1e9b - LATIN SMALL LETTER LONG S WITH DOT ABOVE */
659+ {0x1e61, 0, 0},
660+ /* 0x1e9e - LATIN CAPITAL LETTER SHARP S */
661+ {0x0073, 0x0073, 0},
662+ /* 0x1f50 - GREEK SMALL LETTER UPSILON WITH PSILI */
663+ {0x03c5, 0x0313, 0},
664+ /* 0x1f52 - GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA */
665+ {0x03c5, 0x0313, 0x0300},
666+ /* 0x1f54 - GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA */
667+ {0x03c5, 0x0313, 0x0301},
668+ /* 0x1f56 - GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI */
669+ {0x03c5, 0x0313, 0x0342},
670+ /* 0x1f80 - GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI */
671+ {0x1f00, 0x03b9, 0},
672+ /* 0x1f81 - GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI */
673+ {0x1f01, 0x03b9, 0},
674+ /* 0x1f82 - GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
675+ {0x1f02, 0x03b9, 0},
676+ /* 0x1f83 - GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
677+ {0x1f03, 0x03b9, 0},
678+ /* 0x1f84 - GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
679+ {0x1f04, 0x03b9, 0},
680+ /* 0x1f85 - GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
681+ {0x1f05, 0x03b9, 0},
682+ /* 0x1f86 - GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
683+ {0x1f06, 0x03b9, 0},
684+ /* 0x1f87 - GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
685+ {0x1f07, 0x03b9, 0},
686+ /* 0x1f88 - GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI */
687+ {0x1f00, 0x03b9, 0},
688+ /* 0x1f89 - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI */
689+ {0x1f01, 0x03b9, 0},
690+ /* 0x1f8a - GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
691+ {0x1f02, 0x03b9, 0},
692+ /* 0x1f8b - GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
693+ {0x1f03, 0x03b9, 0},
694+ /* 0x1f8c - GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
695+ {0x1f04, 0x03b9, 0},
696+ /* 0x1f8d - GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
697+ {0x1f05, 0x03b9, 0},
698+ /* 0x1f8e - GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
699+ {0x1f06, 0x03b9, 0},
700+ /* 0x1f8f - GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
701+ {0x1f07, 0x03b9, 0},
702+ /* 0x1f90 - GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI */
703+ {0x1f20, 0x03b9, 0},
704+ /* 0x1f91 - GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI */
705+ {0x1f21, 0x03b9, 0},
706+ /* 0x1f92 - GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
707+ {0x1f22, 0x03b9, 0},
708+ /* 0x1f93 - GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
709+ {0x1f23, 0x03b9, 0},
710+ /* 0x1f94 - GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
711+ {0x1f24, 0x03b9, 0},
712+ /* 0x1f95 - GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
713+ {0x1f25, 0x03b9, 0},
714+ /* 0x1f96 - GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
715+ {0x1f26, 0x03b9, 0},
716+ /* 0x1f97 - GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
717+ {0x1f27, 0x03b9, 0},
718+ /* 0x1f98 - GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI */
719+ {0x1f20, 0x03b9, 0},
720+ /* 0x1f99 - GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI */
721+ {0x1f21, 0x03b9, 0},
722+ /* 0x1f9a - GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
723+ {0x1f22, 0x03b9, 0},
724+ /* 0x1f9b - GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
725+ {0x1f23, 0x03b9, 0},
726+ /* 0x1f9c - GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
727+ {0x1f24, 0x03b9, 0},
728+ /* 0x1f9d - GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
729+ {0x1f25, 0x03b9, 0},
730+ /* 0x1f9e - GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
731+ {0x1f26, 0x03b9, 0},
732+ /* 0x1f9f - GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
733+ {0x1f27, 0x03b9, 0},
734+ /* 0x1fa0 - GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI */
735+ {0x1f60, 0x03b9, 0},
736+ /* 0x1fa1 - GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI */
737+ {0x1f61, 0x03b9, 0},
738+ /* 0x1fa2 - GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI */
739+ {0x1f62, 0x03b9, 0},
740+ /* 0x1fa3 - GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI */
741+ {0x1f63, 0x03b9, 0},
742+ /* 0x1fa4 - GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI */
743+ {0x1f64, 0x03b9, 0},
744+ /* 0x1fa5 - GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI */
745+ {0x1f65, 0x03b9, 0},
746+ /* 0x1fa6 - GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI */
747+ {0x1f66, 0x03b9, 0},
748+ /* 0x1fa7 - GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI */
749+ {0x1f67, 0x03b9, 0},
750+ /* 0x1fa8 - GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI */
751+ {0x1f60, 0x03b9, 0},
752+ /* 0x1fa9 - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI */
753+ {0x1f61, 0x03b9, 0},
754+ /* 0x1faa - GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI */
755+ {0x1f62, 0x03b9, 0},
756+ /* 0x1fab - GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI */
757+ {0x1f63, 0x03b9, 0},
758+ /* 0x1fac - GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI */
759+ {0x1f64, 0x03b9, 0},
760+ /* 0x1fad - GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI */
761+ {0x1f65, 0x03b9, 0},
762+ /* 0x1fae - GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI */
763+ {0x1f66, 0x03b9, 0},
764+ /* 0x1faf - GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI */
765+ {0x1f67, 0x03b9, 0},
766+ /* 0x1fb2 - GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI */
767+ {0x1f70, 0x03b9, 0},
768+ /* 0x1fb3 - GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI */
769+ {0x03b1, 0x03b9, 0},
770+ /* 0x1fb4 - GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI */
771+ {0x03ac, 0x03b9, 0},
772+ /* 0x1fb6 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI */
773+ {0x03b1, 0x0342, 0},
774+ /* 0x1fb7 - GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI */
775+ {0x03b1, 0x0342, 0x03b9},
776+ /* 0x1fbc - GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI */
777+ {0x03b1, 0x03b9, 0},
778+ /* 0x1fbe - GREEK PROSGEGRAMMENI */
779+ {0x03b9, 0, 0},
780+ /* 0x1fc2 - GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI */
781+ {0x1f74, 0x03b9, 0},
782+ /* 0x1fc3 - GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI */
783+ {0x03b7, 0x03b9, 0},
784+ /* 0x1fc4 - GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI */
785+ {0x03ae, 0x03b9, 0},
786+ /* 0x1fc6 - GREEK SMALL LETTER ETA WITH PERISPOMENI */
787+ {0x03b7, 0x0342, 0},
788+ /* 0x1fc7 - GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI */
789+ {0x03b7, 0x0342, 0x03b9},
790+ /* 0x1fcc - GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI */
791+ {0x03b7, 0x03b9, 0},
792+ /* 0x1fd2 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA */
793+ {0x03b9, 0x0308, 0x0300},
794+ /* 0x1fd3 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA */
795+ {0x03b9, 0x0308, 0x0301},
796+ /* 0x1fd6 - GREEK SMALL LETTER IOTA WITH PERISPOMENI */
797+ {0x03b9, 0x0342, 0},
798+ /* 0x1fd7 - GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI */
799+ {0x03b9, 0x0308, 0x0342},
800+ /* 0x1fe2 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA */
801+ {0x03c5, 0x0308, 0x0300},
802+ /* 0x1fe3 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA */
803+ {0x03c5, 0x0308, 0x0301},
804+ /* 0x1fe4 - GREEK SMALL LETTER RHO WITH PSILI */
805+ {0x03c1, 0x0313, 0},
806+ /* 0x1fe6 - GREEK SMALL LETTER UPSILON WITH PERISPOMENI */
807+ {0x03c5, 0x0342, 0},
808+ /* 0x1fe7 - GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI */
809+ {0x03c5, 0x0308, 0x0342},
810+ /* 0x1ff2 - GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI */
811+ {0x1f7c, 0x03b9, 0},
812+ /* 0x1ff3 - GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI */
813+ {0x03c9, 0x03b9, 0},
814+ /* 0x1ff4 - GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI */
815+ {0x03ce, 0x03b9, 0},
816+ /* 0x1ff6 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI */
817+ {0x03c9, 0x0342, 0},
818+ /* 0x1ff7 - GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI */
819+ {0x03c9, 0x0342, 0x03b9},
820+ /* 0x1ffc - GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI */
821+ {0x03c9, 0x03b9, 0},
822+ /* 0x2cf2 - COPTIC CAPITAL LETTER BOHAIRIC KHEI */
823+ {0x2cf3, 0, 0},
824+ /* 0xa792 - LATIN CAPITAL LETTER C WITH BAR */
825+ {0xa793, 0, 0},
826+ /* 0xa7aa - LATIN CAPITAL LETTER H WITH HOOK */
827+ {0x0266, 0, 0},
828+ /* 0xfb00 - LATIN SMALL LIGATURE FF */
829+ {0x0066, 0x0066, 0},
830+ /* 0xfb01 - LATIN SMALL LIGATURE FI */
831+ {0x0066, 0x0069, 0},
832+ /* 0xfb02 - LATIN SMALL LIGATURE FL */
833+ {0x0066, 0x006c, 0},
834+ /* 0xfb03 - LATIN SMALL LIGATURE FFI */
835+ {0x0066, 0x0066, 0x0069},
836+ /* 0xfb04 - LATIN SMALL LIGATURE FFL */
837+ {0x0066, 0x0066, 0x006c},
838+ /* 0xfb05 - LATIN SMALL LIGATURE LONG S T */
839+ {0x0073, 0x0074, 0},
840+ /* 0xfb06 - LATIN SMALL LIGATURE ST */
841+ {0x0073, 0x0074, 0},
842+ /* 0xfb13 - ARMENIAN SMALL LIGATURE MEN NOW */
843+ {0x0574, 0x0576, 0},
844+ /* 0xfb14 - ARMENIAN SMALL LIGATURE MEN ECH */
845+ {0x0574, 0x0565, 0},
846+ /* 0xfb15 - ARMENIAN SMALL LIGATURE MEN INI */
847+ {0x0574, 0x056b, 0},
848+ /* 0xfb16 - ARMENIAN SMALL LIGATURE VEW NOW */
849+ {0x057e, 0x0576, 0},
850+ /* 0xfb17 - ARMENIAN SMALL LIGATURE MEN XEH */
851+ {0x0574, 0x056d, 0},
852+};
cbits/cbits.c+94
@@ -309,3 +309,97 @@ _hs_text_encode_utf8(uint8_t **destp, const uint16_t *src, size_t srcoff,
309309
310310 *destp = dest;
311311}
312+
313+/*
314+ * Case mapping works as follows. We binary search a dense sorted
315+ * table of characters. If we find a match, we return the address of
316+ * a three-character sequence which represents the mapping of that
317+ * character. Short sequences are padded on the end with nulls.
318+ *
319+ * We can get away with a dense encoding, representing characters in
320+ * these tables as 16-bit values, until whenever the Unicode
321+ * consortium defines funky case mappings for code points above
322+ * U+FFFF. (The table generator scripts/CaseMapping.hs checks for
323+ * this.)
324+ */
325+
326+/*
327+ * Binary search through a case mapping table.
328+ */
329+static ssize_t case_map_search(const uint16_t *table, size_t len, uint16_t key)
330+{
331+ ssize_t max = len - 1;
332+ ssize_t min = 0;
333+
334+ while (max >= min) {
335+ ssize_t mid = min + (max - min) / 2;
336+
337+ if (table[mid] == key)
338+ return mid;
339+ if (table[mid] < key)
340+ min = mid + 1;
341+ else
342+ max = mid - 1;
343+ }
344+ return -1;
345+}
346+
347+extern const uint16_t _hs_text_to_upper_keys[];
348+extern const uint16_t _hs_text_to_upper_values[][3];
349+extern const size_t _hs_text_to_upper_len;
350+
351+const uint16_t *_hs_text_to_upper(uint16_t c)
352+{
353+ ssize_t idx = case_map_search(_hs_text_to_upper_keys,
354+ _hs_text_to_upper_len,
355+ c);
356+
357+ if (idx == -1)
358+ return NULL;
359+ return _hs_text_to_upper_values[idx];
360+}
361+
362+extern const uint16_t _hs_text_to_lower_keys[];
363+extern const uint16_t _hs_text_to_lower_values[][3];
364+extern const size_t _hs_text_to_lower_len;
365+
366+const uint16_t *_hs_text_to_lower(uint16_t c)
367+{
368+ ssize_t idx = case_map_search(_hs_text_to_lower_keys,
369+ _hs_text_to_lower_len,
370+ c);
371+
372+ if (idx == -1)
373+ return NULL;
374+ return _hs_text_to_lower_values[idx];
375+}
376+
377+extern const uint16_t _hs_text_to_case_fold_keys[];
378+extern const uint16_t _hs_text_to_case_fold_values[][3];
379+extern const size_t _hs_text_to_case_fold_len;
380+
381+const uint16_t *_hs_text_to_case_fold(uint16_t c)
382+{
383+ ssize_t idx = case_map_search(_hs_text_to_case_fold_keys,
384+ _hs_text_to_case_fold_len,
385+ c);
386+
387+ if (idx == -1)
388+ return NULL;
389+ return _hs_text_to_case_fold_values[idx];
390+}
391+
392+extern const uint16_t _hs_text_to_title_keys[];
393+extern const uint16_t _hs_text_to_title_values[][3];
394+extern const size_t _hs_text_to_title_len;
395+
396+const uint16_t *_hs_text_to_title(uint16_t c)
397+{
398+ ssize_t idx = case_map_search(_hs_text_to_title_keys,
399+ _hs_text_to_title_len,
400+ c);
401+
402+ if (idx == -1)
403+ return NULL;
404+ return _hs_text_to_title_values[idx];
405+}
changelog.md+9
@@ -1,3 +1,12 @@
1+1.2.0.5
2+
3+* Fixed a space explosion in the GHC inliner by changing how case
4+ mapping functions are implemented
5+
6+1.2.0.4
7+
8+* Resurrected compatibility with base < 4.5
9+
1101.2.0.3
211
312* Update formatRealFloat to correspond to the definition in versions
scripts/Arsec.hs+17−4
@@ -3,7 +3,9 @@ module Arsec
33 Comment
44 , comment
55 , semi
6− , showC
6+ , showX
7+ , key
8+ , value
79 , unichar
810 , unichars
911 , module Control.Applicative
@@ -18,6 +20,7 @@ module Arsec
1820import Control.Monad
1921import Control.Applicative
2022import Data.Char
23+import Data.List (intercalate)
2124import Numeric
2225import Text.ParserCombinators.Parsec.Char hiding (lower, upper)
2326import Text.ParserCombinators.Parsec.Combinator hiding (optional)
@@ -38,7 +41,17 @@ semi = char ';' *> spaces *> pure ()
3841comment :: Parser Comment
3942comment = (char '#' *> manyTill anyToken (char '\n')) <|> string "\n"
4043
41−showC :: Char -> String
42−showC c = "'\\x" ++ d ++ "'"
44+showX :: Char -> String
45+showX c
46+ | c > '\xffff' = error $ "U+" ++ h ++ " will not fit in 16 bits"
47+ | otherwise = "0x" ++ replicate (4 - length h) '0' ++ h
4348 where h = showHex (ord c) ""
44− d = replicate (4 - length h) '0' ++ h
49+
50+key :: (t -> Char) -> (t -> String) -> t -> String
51+key code name c = " " ++ showX (code c) ++ "," ++ " /* " ++ name c ++ " */"
52+
53+value :: (t -> Char) -> (t -> String) -> (t -> String) -> t -> String
54+value code name mapping c =
55+ " /* " ++ showX (code c) ++ " - " ++ name c ++ " */\n" ++
56+ " {" ++ intercalate ", " xs ++ "},"
57+ where xs = take 3 (map showX (mapping c) ++ ["0","0"])
scripts/CaseFolding.hs+11−7
@@ -11,6 +11,7 @@ module CaseFolding
1111 ) where
1212
1313import Arsec
14+import Data.List (sort)
1415
1516data Fold = Fold {
1617 code :: Char
@@ -34,13 +35,16 @@ parseCF :: FilePath -> IO (Either ParseError CaseFolding)
3435parseCF name = parse entries name <$> readFile name
3536
3637mapCF :: CaseFolding -> [String]
37−mapCF (CF _ ms) = typ ++ (map nice . filter p $ ms) ++ [last]
38+mapCF (CF _ ms) =
39+ ["const uint16_t _hs_text_to_case_fold_keys[" ++ count ++ "] = {"] ++
40+ map (key code name) mappings ++
41+ ["};"
42+ ,"const size_t _hs_text_to_case_fold_len = " ++ count ++ ";"
43+ ,"const uint16_t _hs_text_to_case_fold_values[" ++ count ++ "][3] = {"] ++
44+ map (value code name mapping) mappings ++
45+ ["};"]
3846 where
39− typ = ["foldMapping :: forall s. Char -> s -> Step (CC s) Char"
40− ,"{-# INLINE foldMapping #-}"]
41− last = "foldMapping c s = Yield (toLower c) (CC s '\\0' '\\0')"
42− nice c = "-- " ++ name c ++ "\n" ++
43− "foldMapping " ++ showC (code c) ++ " s = Yield " ++ x ++ " (CC s " ++ y ++ " " ++ z ++ ")"
44− where [x,y,z] = (map showC . take 3) (mapping c ++ repeat '\0')
47+ count = show (length mappings)
48+ mappings = sort (filter p ms)
4549 p f = status f `elem` "CF" &&
4650 mapping f /= [toLower (code f)]
scripts/CaseMapping.hs+10−9
@@ -8,7 +8,7 @@ import SpecialCasing
88main = do
99 args <- getArgs
1010 let oname = case args of
11− [] -> "../Data/Text/Fusion/CaseMapping.hs"
11+ [] -> "../cbits/case_mapping.c"
1212 [o] -> o
1313 psc <- parseSC "SpecialCasing.txt"
1414 pcf <- parseCF "CaseFolding.txt"
@@ -19,17 +19,18 @@ main = do
1919 Left err -> print err >> return undefined
2020 Right ms -> return ms
2121 h <- openFile oname WriteMode
22− let comments = map ("--" ++) $
22+ let comments = map (" *" ++) $
2323 take 2 (cfComments cfs) ++ take 2 (scComments scs)
2424 mapM_ (hPutStrLn h) $
25− ["{-# LANGUAGE Rank2Types #-}"
26− ,"-- AUTOMATICALLY GENERATED - DO NOT EDIT"
27− ,"-- Generated by scripts/SpecialCasing.hs"] ++
25+ ["/*"
26+ ," * AUTOMATICALLY GENERATED - DO NOT EDIT"
27+ ," * Generated by scripts/CaseMapping.hs"
28+ ," *"] ++
2829 comments ++
29− [""
30− ,"module Data.Text.Fusion.CaseMapping where"
31− ,"import Data.Char"
32− ,"import Data.Text.Internal.Fusion.Types"
30+ [" */"
31+ ,""
32+ ,"#include <stdint.h>"
33+ ,"#include <sys/types.h>"
3334 ,""]
3435 mapM_ (hPutStrLn h) (mapSC "upper" upper toUpper scs)
3536 mapM_ (hPutStrLn h) (mapSC "lower" lower toLower scs)
scripts/SpecialCasing.hs+10−7
@@ -11,6 +11,7 @@ module SpecialCasing
1111 ) where
1212
1313import Arsec
14+import Data.List (sort)
1415
1516data SpecialCasing = SC { scComments :: [Comment], scCasing :: [Case] }
1617 deriving (Show)
@@ -40,14 +41,16 @@ parseSC name = parse entries name <$> readFile name
4041mapSC :: String -> (Case -> String) -> (Char -> Char) -> SpecialCasing
4142 -> [String]
4243mapSC which access twiddle (SC _ ms) =
43− typ ++ (map nice . filter p $ ms) ++ [last]
44+ ["const uint16_t _hs_text_to_" ++ which ++ "_keys[" ++ count ++ "] = {"] ++
45+ map (key code name) mappings ++
46+ ["};"
47+ ,"const size_t _hs_text_to_" ++ which ++ "_len = " ++ count ++ ";"
48+ ,"const uint16_t _hs_text_to_" ++ which ++ "_values[" ++ count ++ "][3] = {"] ++
49+ map (value code name access) mappings ++
50+ ["};"]
4451 where
45− typ = [which ++ "Mapping :: forall s. Char -> s -> Step (CC s) Char"
46− ,"{-# INLINE " ++ which ++ "Mapping #-}"]
47− last = which ++ "Mapping c s = Yield (to" ++ ucFirst which ++ " c) (CC s '\\0' '\\0')"
48− nice c = "-- " ++ name c ++ "\n" ++
49− which ++ "Mapping " ++ showC (code c) ++ " s = Yield " ++ x ++ " (CC s " ++ y ++ " " ++ z ++ ")"
50− where [x,y,z] = (map showC . take 3) (access c ++ repeat '\0')
52+ count = show (length mappings)
53+ mappings = sort (filter p ms)
5154 p c = [k] /= a && a /= [twiddle k] && null (conditions c)
5255 where a = access c
5356 k = code c
text.cabal+2−3
@@ -73,7 +73,7 @@ flag integer-simple
7373 description: Use the simple integer library instead of GMP
7474
7575library
76− c-sources: cbits/cbits.c
76+ c-sources: cbits/case_mapping.c cbits/cbits.c
7777 include-dirs: include
7878
7979 exposed-modules:
@@ -95,7 +95,6 @@ library
9595 Data.Text.Internal.Encoding.Utf8
9696 Data.Text.Internal.Functions
9797 Data.Text.Internal.Fusion
98− Data.Text.Internal.Fusion.CaseMapping
9998 Data.Text.Internal.Fusion.Common
10099 Data.Text.Internal.Fusion.Size
101100 Data.Text.Internal.Fusion.Types
@@ -150,7 +149,7 @@ test-suite tests
150149 type: exitcode-stdio-1.0
151150 hs-source-dirs: tests .
152151 main-is: Tests.hs
153− c-sources: cbits/cbits.c
152+ c-sources: cbits/case_mapping.c cbits/cbits.c
154153 include-dirs: include
155154
156155 ghc-options: