]>
code.delx.au - refind/blob - filesystems/fsw_strfunc.h
1 /* fsw_strfunc.h generated by mk_fsw_strfunc.py */
4 * Copyright (c) 2006 Christoph Pfisterer
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the
18 * * Neither the name of Christoph Pfisterer nor the names of the
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 static int fsw_streq_ISO88591_UTF8(void *s1data
, void *s2data
, int len
)
38 fsw_u8
*p1
= (fsw_u8
*)s1data
;
39 fsw_u8
*p2
= (fsw_u8
*)s2data
;
42 for (i
= 0; i
< len
; i
++) {
45 if ((c2
& 0xe0) == 0xc0) {
46 c2
= ((c2
& 0x1f) << 6) | (*p2
++ & 0x3f);
47 } else if ((c2
& 0xf0) == 0xe0) {
48 c2
= ((c2
& 0x0f) << 12) | ((*p2
++ & 0x3f) << 6);
50 } else if ((c2
& 0xf8) == 0xf0) {
51 c2
= ((c2
& 0x07) << 18) | ((*p2
++ & 0x3f) << 12);
52 c2
|= ((*p2
++ & 0x3f) << 6);
61 static int fsw_streq_ISO88591_UTF16(void *s1data
, void *s2data
, int len
)
64 fsw_u8
*p1
= (fsw_u8
*)s1data
;
65 fsw_u16
*p2
= (fsw_u16
*)s2data
;
68 for (i
= 0; i
< len
; i
++) {
77 static int fsw_streq_ISO88591_UTF16_SWAPPED(void *s1data
, void *s2data
, int len
)
80 fsw_u8
*p1
= (fsw_u8
*)s1data
;
81 fsw_u16
*p2
= (fsw_u16
*)s2data
;
84 for (i
= 0; i
< len
; i
++) {
86 c2
= *p2
++; c2
= FSW_SWAPVALUE_U16(c2
);
93 static int fsw_streq_UTF8_UTF16(void *s1data
, void *s2data
, int len
)
96 fsw_u8
*p1
= (fsw_u8
*)s1data
;
97 fsw_u16
*p2
= (fsw_u16
*)s2data
;
100 for (i
= 0; i
< len
; i
++) {
102 if ((c1
& 0xe0) == 0xc0) {
103 c1
= ((c1
& 0x1f) << 6) | (*p1
++ & 0x3f);
104 } else if ((c1
& 0xf0) == 0xe0) {
105 c1
= ((c1
& 0x0f) << 12) | ((*p1
++ & 0x3f) << 6);
106 c1
|= (*p1
++ & 0x3f);
107 } else if ((c1
& 0xf8) == 0xf0) {
108 c1
= ((c1
& 0x07) << 18) | ((*p1
++ & 0x3f) << 12);
109 c1
|= ((*p1
++ & 0x3f) << 6);
110 c1
|= (*p1
++ & 0x3f);
119 static int fsw_streq_UTF8_UTF16_SWAPPED(void *s1data
, void *s2data
, int len
)
122 fsw_u8
*p1
= (fsw_u8
*)s1data
;
123 fsw_u16
*p2
= (fsw_u16
*)s2data
;
126 for (i
= 0; i
< len
; i
++) {
128 if ((c1
& 0xe0) == 0xc0) {
129 c1
= ((c1
& 0x1f) << 6) | (*p1
++ & 0x3f);
130 } else if ((c1
& 0xf0) == 0xe0) {
131 c1
= ((c1
& 0x0f) << 12) | ((*p1
++ & 0x3f) << 6);
132 c1
|= (*p1
++ & 0x3f);
133 } else if ((c1
& 0xf8) == 0xf0) {
134 c1
= ((c1
& 0x07) << 18) | ((*p1
++ & 0x3f) << 12);
135 c1
|= ((*p1
++ & 0x3f) << 6);
136 c1
|= (*p1
++ & 0x3f);
138 c2
= *p2
++; c2
= FSW_SWAPVALUE_U16(c2
);
145 static int fsw_streq_UTF16_UTF16_SWAPPED(void *s1data
, void *s2data
, int len
)
148 fsw_u16
*p1
= (fsw_u16
*)s1data
;
149 fsw_u16
*p2
= (fsw_u16
*)s2data
;
152 for (i
= 0; i
< len
; i
++) {
154 c2
= *p2
++; c2
= FSW_SWAPVALUE_U16(c2
);
161 static fsw_status_t
fsw_strcoerce_UTF8_ISO88591(void *srcdata
, int srclen
, struct fsw_string
*dest
)
169 dest
->type
= FSW_STRING_TYPE_ISO88591
;
171 dest
->size
= srclen
* sizeof(fsw_u8
);
172 status
= fsw_alloc(dest
->size
, &dest
->data
);
176 sp
= (fsw_u8
*)srcdata
;
177 dp
= (fsw_u8
*)dest
->data
;
178 for (i
= 0; i
< srclen
; i
++) {
180 if ((c
& 0xe0) == 0xc0) {
181 c
= ((c
& 0x1f) << 6) | (*sp
++ & 0x3f);
182 } else if ((c
& 0xf0) == 0xe0) {
183 c
= ((c
& 0x0f) << 12) | ((*sp
++ & 0x3f) << 6);
185 } else if ((c
& 0xf8) == 0xf0) {
186 c
= ((c
& 0x07) << 18) | ((*sp
++ & 0x3f) << 12);
187 c
|= ((*sp
++ & 0x3f) << 6);
195 static fsw_status_t
fsw_strcoerce_UTF16_ISO88591(void *srcdata
, int srclen
, struct fsw_string
*dest
)
203 dest
->type
= FSW_STRING_TYPE_ISO88591
;
205 dest
->size
= srclen
* sizeof(fsw_u8
);
206 status
= fsw_alloc(dest
->size
, &dest
->data
);
210 sp
= (fsw_u16
*)srcdata
;
211 dp
= (fsw_u8
*)dest
->data
;
212 for (i
= 0; i
< srclen
; i
++) {
219 static fsw_status_t
fsw_strcoerce_UTF16_SWAPPED_ISO88591(void *srcdata
, int srclen
, struct fsw_string
*dest
)
227 dest
->type
= FSW_STRING_TYPE_ISO88591
;
229 dest
->size
= srclen
* sizeof(fsw_u8
);
230 status
= fsw_alloc(dest
->size
, &dest
->data
);
234 sp
= (fsw_u16
*)srcdata
;
235 dp
= (fsw_u8
*)dest
->data
;
236 for (i
= 0; i
< srclen
; i
++) {
237 c
= *sp
++; c
= FSW_SWAPVALUE_U16(c
);
243 static fsw_status_t
fsw_strcoerce_ISO88591_UTF16(void *srcdata
, int srclen
, struct fsw_string
*dest
)
251 dest
->type
= FSW_STRING_TYPE_UTF16
;
253 dest
->size
= srclen
* sizeof(fsw_u16
);
254 status
= fsw_alloc(dest
->size
, &dest
->data
);
258 sp
= (fsw_u8
*)srcdata
;
259 dp
= (fsw_u16
*)dest
->data
;
260 for (i
= 0; i
< srclen
; i
++) {
267 static fsw_status_t
fsw_strcoerce_UTF8_UTF16(void *srcdata
, int srclen
, struct fsw_string
*dest
)
275 dest
->type
= FSW_STRING_TYPE_UTF16
;
277 dest
->size
= srclen
* sizeof(fsw_u16
);
278 status
= fsw_alloc(dest
->size
, &dest
->data
);
282 sp
= (fsw_u8
*)srcdata
;
283 dp
= (fsw_u16
*)dest
->data
;
284 for (i
= 0; i
< srclen
; i
++) {
286 if ((c
& 0xe0) == 0xc0) {
287 c
= ((c
& 0x1f) << 6) | (*sp
++ & 0x3f);
288 } else if ((c
& 0xf0) == 0xe0) {
289 c
= ((c
& 0x0f) << 12) | ((*sp
++ & 0x3f) << 6);
291 } else if ((c
& 0xf8) == 0xf0) {
292 c
= ((c
& 0x07) << 18) | ((*sp
++ & 0x3f) << 12);
293 c
|= ((*sp
++ & 0x3f) << 6);
301 static fsw_status_t
fsw_strcoerce_UTF16_SWAPPED_UTF16(void *srcdata
, int srclen
, struct fsw_string
*dest
)
309 dest
->type
= FSW_STRING_TYPE_UTF16
;
311 dest
->size
= srclen
* sizeof(fsw_u16
);
312 status
= fsw_alloc(dest
->size
, &dest
->data
);
316 sp
= (fsw_u16
*)srcdata
;
317 dp
= (fsw_u16
*)dest
->data
;
318 for (i
= 0; i
< srclen
; i
++) {
319 c
= *sp
++; c
= FSW_SWAPVALUE_U16(c
);
325 static fsw_status_t
fsw_strcoerce_ISO88591_UTF8(void *srcdata
, int srclen
, struct fsw_string
*dest
)
333 sp
= (fsw_u8
*)srcdata
;
335 for (i
= 0; i
< srclen
; i
++) {
340 else if (c
< 0x000800)
342 else if (c
< 0x010000)
348 dest
->type
= FSW_STRING_TYPE_UTF8
;
350 dest
->size
= destsize
;
351 status
= fsw_alloc(dest
->size
, &dest
->data
);
355 sp
= (fsw_u8
*)srcdata
;
356 dp
= (fsw_u8
*)dest
->data
;
357 for (i
= 0; i
< srclen
; i
++) {
362 } else if (c
< 0x000800) {
363 *dp
++ = (fsw_u8
)(0xc0 | ((c
>> 6) & 0x1f));
364 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));
365 } else if (c
< 0x010000) {
366 *dp
++ = (fsw_u8
)(0xe0 | ((c
>> 12) & 0x0f));
367 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 6) & 0x3f));
368 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));
370 *dp
++ = (fsw_u8
)(0xf0 | ((c
>> 18) & 0x07));
371 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 12) & 0x3f));
372 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 6) & 0x3f));
373 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));
379 static fsw_status_t
fsw_strcoerce_UTF16_UTF8(void *srcdata
, int srclen
, struct fsw_string
*dest
)
387 sp
= (fsw_u16
*)srcdata
;
389 for (i
= 0; i
< srclen
; i
++) {
394 else if (c
< 0x000800)
396 else if (c
< 0x010000)
402 dest
->type
= FSW_STRING_TYPE_UTF8
;
404 dest
->size
= destsize
;
405 status
= fsw_alloc(dest
->size
, &dest
->data
);
409 sp
= (fsw_u16
*)srcdata
;
410 dp
= (fsw_u8
*)dest
->data
;
411 for (i
= 0; i
< srclen
; i
++) {
416 } else if (c
< 0x000800) {
417 *dp
++ = (fsw_u8
)(0xc0 | ((c
>> 6) & 0x1f));
418 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));
419 } else if (c
< 0x010000) {
420 *dp
++ = (fsw_u8
)(0xe0 | ((c
>> 12) & 0x0f));
421 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 6) & 0x3f));
422 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));
424 *dp
++ = (fsw_u8
)(0xf0 | ((c
>> 18) & 0x07));
425 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 12) & 0x3f));
426 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 6) & 0x3f));
427 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));
433 static fsw_status_t
fsw_strcoerce_UTF16_SWAPPED_UTF8(void *srcdata
, int srclen
, struct fsw_string
*dest
)
441 sp
= (fsw_u16
*)srcdata
;
443 for (i
= 0; i
< srclen
; i
++) {
444 c
= *sp
++; c
= FSW_SWAPVALUE_U16(c
);
448 else if (c
< 0x000800)
450 else if (c
< 0x010000)
456 dest
->type
= FSW_STRING_TYPE_UTF8
;
458 dest
->size
= destsize
;
459 status
= fsw_alloc(dest
->size
, &dest
->data
);
463 sp
= (fsw_u16
*)srcdata
;
464 dp
= (fsw_u8
*)dest
->data
;
465 for (i
= 0; i
< srclen
; i
++) {
466 c
= *sp
++; c
= FSW_SWAPVALUE_U16(c
);
470 } else if (c
< 0x000800) {
471 *dp
++ = (fsw_u8
)(0xc0 | ((c
>> 6) & 0x1f));
472 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));
473 } else if (c
< 0x010000) {
474 *dp
++ = (fsw_u8
)(0xe0 | ((c
>> 12) & 0x0f));
475 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 6) & 0x3f));
476 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));
478 *dp
++ = (fsw_u8
)(0xf0 | ((c
>> 18) & 0x07));
479 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 12) & 0x3f));
480 *dp
++ = (fsw_u8
)(0x80 | ((c
>> 6) & 0x3f));
481 *dp
++ = (fsw_u8
)(0x80 | (c
& 0x3f));