"Fossies" - the Fresh Open Source Software Archive 
Member "libisofs-1.5.4/libisofs/hfsplus_case.c" (8 Jul 2020, 12533 Bytes) of package /linux/misc/libisofs-1.5.4.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "hfsplus_case.c" see the
Fossies "Dox" file reference documentation.
1 /*
2 * Copyright (c) 2012 Thomas Schmitt
3 *
4 * This file is part of the libisofs project; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License version 2
6 * or later as published by the Free Software Foundation.
7 * See COPYING file for details.
8 */
9
10 /**
11 * Maps UTF-16BE double-byte characters to the representative of their
12 * equivalence class under the relation of HFS+ case-insensitivity.
13 */
14
15 #ifdef HAVE_CONFIG_H
16 #include "../config.h"
17 #endif
18
19 #include "libisofs.h"
20
21
22 /* The translation list utf16be_transl was generated by a program which
23 compared input and output of existing example code by Apple Inc.
24 found published on
25 http://developer.apple.com/legacy/mac/library/#technotes/tn/tn1150.html
26
27 Each deviation was recorded as pair of byte pairs. The first pair gives
28 the input, the second pair gives the output. If a byte pair is not mentioned
29 in this list as input, then it gets mapped to itself.
30 Pairs which get mapped to pair 0,0 shall be ignored with HFS+ comparisons.
31
32 Another comparison run verified that both implementations yield the same
33 character translation with all 65536 possible input bit patterns.
34 */
35 static uint8_t utf16be_transl[] = {
36 0x00, 0x00, 0xff, 0xff,
37 0x00, 0x41, 0x00, 0x61,
38 0x00, 0x42, 0x00, 0x62,
39 0x00, 0x43, 0x00, 0x63,
40 0x00, 0x44, 0x00, 0x64,
41 0x00, 0x45, 0x00, 0x65,
42 0x00, 0x46, 0x00, 0x66,
43 0x00, 0x47, 0x00, 0x67,
44 0x00, 0x48, 0x00, 0x68,
45 0x00, 0x49, 0x00, 0x69,
46 0x00, 0x4a, 0x00, 0x6a,
47 0x00, 0x4b, 0x00, 0x6b,
48 0x00, 0x4c, 0x00, 0x6c,
49 0x00, 0x4d, 0x00, 0x6d,
50 0x00, 0x4e, 0x00, 0x6e,
51 0x00, 0x4f, 0x00, 0x6f,
52 0x00, 0x50, 0x00, 0x70,
53 0x00, 0x51, 0x00, 0x71,
54 0x00, 0x52, 0x00, 0x72,
55 0x00, 0x53, 0x00, 0x73,
56 0x00, 0x54, 0x00, 0x74,
57 0x00, 0x55, 0x00, 0x75,
58 0x00, 0x56, 0x00, 0x76,
59 0x00, 0x57, 0x00, 0x77,
60 0x00, 0x58, 0x00, 0x78,
61 0x00, 0x59, 0x00, 0x79,
62 0x00, 0x5a, 0x00, 0x7a,
63 0x00, 0xc6, 0x00, 0xe6,
64 0x00, 0xd0, 0x00, 0xf0,
65 0x00, 0xd8, 0x00, 0xf8,
66 0x00, 0xde, 0x00, 0xfe,
67 0x01, 0x10, 0x01, 0x11,
68 0x01, 0x26, 0x01, 0x27,
69 0x01, 0x32, 0x01, 0x33,
70 0x01, 0x3f, 0x01, 0x40,
71 0x01, 0x41, 0x01, 0x42,
72 0x01, 0x4a, 0x01, 0x4b,
73 0x01, 0x52, 0x01, 0x53,
74 0x01, 0x66, 0x01, 0x67,
75 0x01, 0x81, 0x02, 0x53,
76 0x01, 0x82, 0x01, 0x83,
77 0x01, 0x84, 0x01, 0x85,
78 0x01, 0x86, 0x02, 0x54,
79 0x01, 0x87, 0x01, 0x88,
80 0x01, 0x89, 0x02, 0x56,
81 0x01, 0x8a, 0x02, 0x57,
82 0x01, 0x8b, 0x01, 0x8c,
83 0x01, 0x8e, 0x01, 0xdd,
84 0x01, 0x8f, 0x02, 0x59,
85 0x01, 0x90, 0x02, 0x5b,
86 0x01, 0x91, 0x01, 0x92,
87 0x01, 0x93, 0x02, 0x60,
88 0x01, 0x94, 0x02, 0x63,
89 0x01, 0x96, 0x02, 0x69,
90 0x01, 0x97, 0x02, 0x68,
91 0x01, 0x98, 0x01, 0x99,
92 0x01, 0x9c, 0x02, 0x6f,
93 0x01, 0x9d, 0x02, 0x72,
94 0x01, 0x9f, 0x02, 0x75,
95 0x01, 0xa2, 0x01, 0xa3,
96 0x01, 0xa4, 0x01, 0xa5,
97 0x01, 0xa7, 0x01, 0xa8,
98 0x01, 0xa9, 0x02, 0x83,
99 0x01, 0xac, 0x01, 0xad,
100 0x01, 0xae, 0x02, 0x88,
101 0x01, 0xb1, 0x02, 0x8a,
102 0x01, 0xb2, 0x02, 0x8b,
103 0x01, 0xb3, 0x01, 0xb4,
104 0x01, 0xb5, 0x01, 0xb6,
105 0x01, 0xb7, 0x02, 0x92,
106 0x01, 0xb8, 0x01, 0xb9,
107 0x01, 0xbc, 0x01, 0xbd,
108 0x01, 0xc4, 0x01, 0xc6,
109 0x01, 0xc5, 0x01, 0xc6,
110 0x01, 0xc7, 0x01, 0xc9,
111 0x01, 0xc8, 0x01, 0xc9,
112 0x01, 0xca, 0x01, 0xcc,
113 0x01, 0xcb, 0x01, 0xcc,
114 0x01, 0xe4, 0x01, 0xe5,
115 0x01, 0xf1, 0x01, 0xf3,
116 0x01, 0xf2, 0x01, 0xf3,
117 0x03, 0x91, 0x03, 0xb1,
118 0x03, 0x92, 0x03, 0xb2,
119 0x03, 0x93, 0x03, 0xb3,
120 0x03, 0x94, 0x03, 0xb4,
121 0x03, 0x95, 0x03, 0xb5,
122 0x03, 0x96, 0x03, 0xb6,
123 0x03, 0x97, 0x03, 0xb7,
124 0x03, 0x98, 0x03, 0xb8,
125 0x03, 0x99, 0x03, 0xb9,
126 0x03, 0x9a, 0x03, 0xba,
127 0x03, 0x9b, 0x03, 0xbb,
128 0x03, 0x9c, 0x03, 0xbc,
129 0x03, 0x9d, 0x03, 0xbd,
130 0x03, 0x9e, 0x03, 0xbe,
131 0x03, 0x9f, 0x03, 0xbf,
132 0x03, 0xa0, 0x03, 0xc0,
133 0x03, 0xa1, 0x03, 0xc1,
134 0x03, 0xa3, 0x03, 0xc3,
135 0x03, 0xa4, 0x03, 0xc4,
136 0x03, 0xa5, 0x03, 0xc5,
137 0x03, 0xa6, 0x03, 0xc6,
138 0x03, 0xa7, 0x03, 0xc7,
139 0x03, 0xa8, 0x03, 0xc8,
140 0x03, 0xa9, 0x03, 0xc9,
141 0x03, 0xe2, 0x03, 0xe3,
142 0x03, 0xe4, 0x03, 0xe5,
143 0x03, 0xe6, 0x03, 0xe7,
144 0x03, 0xe8, 0x03, 0xe9,
145 0x03, 0xea, 0x03, 0xeb,
146 0x03, 0xec, 0x03, 0xed,
147 0x03, 0xee, 0x03, 0xef,
148 0x04, 0x02, 0x04, 0x52,
149 0x04, 0x04, 0x04, 0x54,
150 0x04, 0x05, 0x04, 0x55,
151 0x04, 0x06, 0x04, 0x56,
152 0x04, 0x08, 0x04, 0x58,
153 0x04, 0x09, 0x04, 0x59,
154 0x04, 0x0a, 0x04, 0x5a,
155 0x04, 0x0b, 0x04, 0x5b,
156 0x04, 0x0f, 0x04, 0x5f,
157 0x04, 0x10, 0x04, 0x30,
158 0x04, 0x11, 0x04, 0x31,
159 0x04, 0x12, 0x04, 0x32,
160 0x04, 0x13, 0x04, 0x33,
161 0x04, 0x14, 0x04, 0x34,
162 0x04, 0x15, 0x04, 0x35,
163 0x04, 0x16, 0x04, 0x36,
164 0x04, 0x17, 0x04, 0x37,
165 0x04, 0x18, 0x04, 0x38,
166 0x04, 0x1a, 0x04, 0x3a,
167 0x04, 0x1b, 0x04, 0x3b,
168 0x04, 0x1c, 0x04, 0x3c,
169 0x04, 0x1d, 0x04, 0x3d,
170 0x04, 0x1e, 0x04, 0x3e,
171 0x04, 0x1f, 0x04, 0x3f,
172 0x04, 0x20, 0x04, 0x40,
173 0x04, 0x21, 0x04, 0x41,
174 0x04, 0x22, 0x04, 0x42,
175 0x04, 0x23, 0x04, 0x43,
176 0x04, 0x24, 0x04, 0x44,
177 0x04, 0x25, 0x04, 0x45,
178 0x04, 0x26, 0x04, 0x46,
179 0x04, 0x27, 0x04, 0x47,
180 0x04, 0x28, 0x04, 0x48,
181 0x04, 0x29, 0x04, 0x49,
182 0x04, 0x2a, 0x04, 0x4a,
183 0x04, 0x2b, 0x04, 0x4b,
184 0x04, 0x2c, 0x04, 0x4c,
185 0x04, 0x2d, 0x04, 0x4d,
186 0x04, 0x2e, 0x04, 0x4e,
187 0x04, 0x2f, 0x04, 0x4f,
188 0x04, 0x60, 0x04, 0x61,
189 0x04, 0x62, 0x04, 0x63,
190 0x04, 0x64, 0x04, 0x65,
191 0x04, 0x66, 0x04, 0x67,
192 0x04, 0x68, 0x04, 0x69,
193 0x04, 0x6a, 0x04, 0x6b,
194 0x04, 0x6c, 0x04, 0x6d,
195 0x04, 0x6e, 0x04, 0x6f,
196 0x04, 0x70, 0x04, 0x71,
197 0x04, 0x72, 0x04, 0x73,
198 0x04, 0x74, 0x04, 0x75,
199 0x04, 0x78, 0x04, 0x79,
200 0x04, 0x7a, 0x04, 0x7b,
201 0x04, 0x7c, 0x04, 0x7d,
202 0x04, 0x7e, 0x04, 0x7f,
203 0x04, 0x80, 0x04, 0x81,
204 0x04, 0x90, 0x04, 0x91,
205 0x04, 0x92, 0x04, 0x93,
206 0x04, 0x94, 0x04, 0x95,
207 0x04, 0x96, 0x04, 0x97,
208 0x04, 0x98, 0x04, 0x99,
209 0x04, 0x9a, 0x04, 0x9b,
210 0x04, 0x9c, 0x04, 0x9d,
211 0x04, 0x9e, 0x04, 0x9f,
212 0x04, 0xa0, 0x04, 0xa1,
213 0x04, 0xa2, 0x04, 0xa3,
214 0x04, 0xa4, 0x04, 0xa5,
215 0x04, 0xa6, 0x04, 0xa7,
216 0x04, 0xa8, 0x04, 0xa9,
217 0x04, 0xaa, 0x04, 0xab,
218 0x04, 0xac, 0x04, 0xad,
219 0x04, 0xae, 0x04, 0xaf,
220 0x04, 0xb0, 0x04, 0xb1,
221 0x04, 0xb2, 0x04, 0xb3,
222 0x04, 0xb4, 0x04, 0xb5,
223 0x04, 0xb6, 0x04, 0xb7,
224 0x04, 0xb8, 0x04, 0xb9,
225 0x04, 0xba, 0x04, 0xbb,
226 0x04, 0xbc, 0x04, 0xbd,
227 0x04, 0xbe, 0x04, 0xbf,
228 0x04, 0xc3, 0x04, 0xc4,
229 0x04, 0xc7, 0x04, 0xc8,
230 0x04, 0xcb, 0x04, 0xcc,
231 0x05, 0x31, 0x05, 0x61,
232 0x05, 0x32, 0x05, 0x62,
233 0x05, 0x33, 0x05, 0x63,
234 0x05, 0x34, 0x05, 0x64,
235 0x05, 0x35, 0x05, 0x65,
236 0x05, 0x36, 0x05, 0x66,
237 0x05, 0x37, 0x05, 0x67,
238 0x05, 0x38, 0x05, 0x68,
239 0x05, 0x39, 0x05, 0x69,
240 0x05, 0x3a, 0x05, 0x6a,
241 0x05, 0x3b, 0x05, 0x6b,
242 0x05, 0x3c, 0x05, 0x6c,
243 0x05, 0x3d, 0x05, 0x6d,
244 0x05, 0x3e, 0x05, 0x6e,
245 0x05, 0x3f, 0x05, 0x6f,
246 0x05, 0x40, 0x05, 0x70,
247 0x05, 0x41, 0x05, 0x71,
248 0x05, 0x42, 0x05, 0x72,
249 0x05, 0x43, 0x05, 0x73,
250 0x05, 0x44, 0x05, 0x74,
251 0x05, 0x45, 0x05, 0x75,
252 0x05, 0x46, 0x05, 0x76,
253 0x05, 0x47, 0x05, 0x77,
254 0x05, 0x48, 0x05, 0x78,
255 0x05, 0x49, 0x05, 0x79,
256 0x05, 0x4a, 0x05, 0x7a,
257 0x05, 0x4b, 0x05, 0x7b,
258 0x05, 0x4c, 0x05, 0x7c,
259 0x05, 0x4d, 0x05, 0x7d,
260 0x05, 0x4e, 0x05, 0x7e,
261 0x05, 0x4f, 0x05, 0x7f,
262 0x05, 0x50, 0x05, 0x80,
263 0x05, 0x51, 0x05, 0x81,
264 0x05, 0x52, 0x05, 0x82,
265 0x05, 0x53, 0x05, 0x83,
266 0x05, 0x54, 0x05, 0x84,
267 0x05, 0x55, 0x05, 0x85,
268 0x05, 0x56, 0x05, 0x86,
269 0x10, 0xa0, 0x10, 0xd0,
270 0x10, 0xa1, 0x10, 0xd1,
271 0x10, 0xa2, 0x10, 0xd2,
272 0x10, 0xa3, 0x10, 0xd3,
273 0x10, 0xa4, 0x10, 0xd4,
274 0x10, 0xa5, 0x10, 0xd5,
275 0x10, 0xa6, 0x10, 0xd6,
276 0x10, 0xa7, 0x10, 0xd7,
277 0x10, 0xa8, 0x10, 0xd8,
278 0x10, 0xa9, 0x10, 0xd9,
279 0x10, 0xaa, 0x10, 0xda,
280 0x10, 0xab, 0x10, 0xdb,
281 0x10, 0xac, 0x10, 0xdc,
282 0x10, 0xad, 0x10, 0xdd,
283 0x10, 0xae, 0x10, 0xde,
284 0x10, 0xaf, 0x10, 0xdf,
285 0x10, 0xb0, 0x10, 0xe0,
286 0x10, 0xb1, 0x10, 0xe1,
287 0x10, 0xb2, 0x10, 0xe2,
288 0x10, 0xb3, 0x10, 0xe3,
289 0x10, 0xb4, 0x10, 0xe4,
290 0x10, 0xb5, 0x10, 0xe5,
291 0x10, 0xb6, 0x10, 0xe6,
292 0x10, 0xb7, 0x10, 0xe7,
293 0x10, 0xb8, 0x10, 0xe8,
294 0x10, 0xb9, 0x10, 0xe9,
295 0x10, 0xba, 0x10, 0xea,
296 0x10, 0xbb, 0x10, 0xeb,
297 0x10, 0xbc, 0x10, 0xec,
298 0x10, 0xbd, 0x10, 0xed,
299 0x10, 0xbe, 0x10, 0xee,
300 0x10, 0xbf, 0x10, 0xef,
301 0x10, 0xc0, 0x10, 0xf0,
302 0x10, 0xc1, 0x10, 0xf1,
303 0x10, 0xc2, 0x10, 0xf2,
304 0x10, 0xc3, 0x10, 0xf3,
305 0x10, 0xc4, 0x10, 0xf4,
306 0x10, 0xc5, 0x10, 0xf5,
307 0x20, 0x0c, 0x00, 0x00,
308 0x20, 0x0d, 0x00, 0x00,
309 0x20, 0x0e, 0x00, 0x00,
310 0x20, 0x0f, 0x00, 0x00,
311 0x20, 0x2a, 0x00, 0x00,
312 0x20, 0x2b, 0x00, 0x00,
313 0x20, 0x2c, 0x00, 0x00,
314 0x20, 0x2d, 0x00, 0x00,
315 0x20, 0x2e, 0x00, 0x00,
316 0x20, 0x6a, 0x00, 0x00,
317 0x20, 0x6b, 0x00, 0x00,
318 0x20, 0x6c, 0x00, 0x00,
319 0x20, 0x6d, 0x00, 0x00,
320 0x20, 0x6e, 0x00, 0x00,
321 0x20, 0x6f, 0x00, 0x00,
322 0x21, 0x60, 0x21, 0x70,
323 0x21, 0x61, 0x21, 0x71,
324 0x21, 0x62, 0x21, 0x72,
325 0x21, 0x63, 0x21, 0x73,
326 0x21, 0x64, 0x21, 0x74,
327 0x21, 0x65, 0x21, 0x75,
328 0x21, 0x66, 0x21, 0x76,
329 0x21, 0x67, 0x21, 0x77,
330 0x21, 0x68, 0x21, 0x78,
331 0x21, 0x69, 0x21, 0x79,
332 0x21, 0x6a, 0x21, 0x7a,
333 0x21, 0x6b, 0x21, 0x7b,
334 0x21, 0x6c, 0x21, 0x7c,
335 0x21, 0x6d, 0x21, 0x7d,
336 0x21, 0x6e, 0x21, 0x7e,
337 0x21, 0x6f, 0x21, 0x7f,
338 0xfe, 0xff, 0x00, 0x00,
339 0xff, 0x21, 0xff, 0x41,
340 0xff, 0x22, 0xff, 0x42,
341 0xff, 0x23, 0xff, 0x43,
342 0xff, 0x24, 0xff, 0x44,
343 0xff, 0x25, 0xff, 0x45,
344 0xff, 0x26, 0xff, 0x46,
345 0xff, 0x27, 0xff, 0x47,
346 0xff, 0x28, 0xff, 0x48,
347 0xff, 0x29, 0xff, 0x49,
348 0xff, 0x2a, 0xff, 0x4a,
349 0xff, 0x2b, 0xff, 0x4b,
350 0xff, 0x2c, 0xff, 0x4c,
351 0xff, 0x2d, 0xff, 0x4d,
352 0xff, 0x2e, 0xff, 0x4e,
353 0xff, 0x2f, 0xff, 0x4f,
354 0xff, 0x30, 0xff, 0x50,
355 0xff, 0x31, 0xff, 0x51,
356 0xff, 0x32, 0xff, 0x52,
357 0xff, 0x33, 0xff, 0x53,
358 0xff, 0x34, 0xff, 0x54,
359 0xff, 0x35, 0xff, 0x55,
360 0xff, 0x36, 0xff, 0x56,
361 0xff, 0x37, 0xff, 0x57,
362 0xff, 0x38, 0xff, 0x58,
363 0xff, 0x39, 0xff, 0x59,
364 0xff, 0x3a, 0xff, 0x5a,
365 0x00
366 };
367 static int utf16be_transl_count = 329;
368
369 /* These are the start indice in utf16be_transl[] for the page numbers 0 to 9
370 as classified by function what_page().
371 As soon as the first byte of the input pair in utf16be_transl[] changes,
372 the search can be ended and output is equal to input.
373 If page -1 is returned by what_page(), then input is equal to output.
374 */
375 static int utf16be_transl_starts[] = {
376 0, 31, 81, 112, 195, 233, 271, 286, 302, 303
377 };
378
379
380 static int what_page(uint16_t x)
381 {
382 switch(((uint8_t *) &x)[0]) {
383 case 0:
384 return 0;
385 case 1:
386 return 1;
387 case 3:
388 return 2;
389 case 4:
390 return 3;
391 case 5:
392 return 4;
393 case 16:
394 return 5;
395 case 32:
396 return 6;
397 case 33:
398 return 7;
399 case 254:
400 return 8;
401 case 255:
402 return 9;
403 default:
404 return -1; /* no mapping */
405 }
406 }
407
408
409 /* Accelerator for the ASCII subset which is expected to be the most
410 frequently used one.
411 */
412 static uint16_t cmp_name_page0(uint16_t x)
413 {
414 uint8_t *low;
415
416 low = ((uint8_t *) &x) + 1;
417
418 if (x == 0)
419 return 0xffff;
420 if (*low <= 0x40)
421 ;
422 else if (*low <= 0x5a)
423 *low = *low + 0x20;
424 else if (*low < 0xc6)
425 ;
426 else if (*low == 0xc6)
427 *low = 0xe6;
428 else if (*low == 0xd0)
429 *low = 0xf0;
430 else if (*low == 0xd8)
431 *low = 0xf8;
432 else if (*low == 0xde)
433 *low = 0xfe;
434 return x;
435 }
436
437
438 /* Converts a character into the representative of its HFS+ equivalence
439 class.
440 @param x The UTF-16BE character to be converted.
441 @return 0 = ignore character with comparisons
442 else the case-insensitive character.
443 */
444 uint16_t iso_hfsplus_cichar(uint16_t x)
445 {
446 int page, i;
447 uint16_t ret;
448 uint8_t low, high;
449
450 high = ((uint8_t *) &x)[0];
451 low = ((uint8_t *) &x)[1];
452
453 page = what_page(x);
454 if (page < 0)
455 return x; /* No translation needed */
456 if (page == 0)
457 return cmp_name_page0(x); /* Accelerator for ASCII subset */
458
459 for (i = utf16be_transl_starts[page] * 4; i < utf16be_transl_count * 4;
460 i += 4) {
461 if (utf16be_transl[i] != high)
462 break;
463 if (utf16be_transl[i + 1] == low) {
464 ((uint8_t *) &ret)[0] = utf16be_transl[i + 2];
465 ((uint8_t *) &ret)[1] = utf16be_transl[i + 3];
466 return ret;
467 }
468 }
469 return x;
470 }
471
472