]>
git.ipfire.org Git - thirdparty/util-linux.git/blob - lib/encode.c
2 * Based on code from libblkid,
4 * Copyright (C) 2008 Kay Sievers <kay.sievers@vrfy.org>
5 * Copyright (C) 2009 Karel Zak <kzak@redhat.com>
6 * Copyright (C) 2020 Pali Rohár <pali.rohar@gmail.com>
8 * This file may be redistributed under the terms of the
9 * GNU Lesser General Public License.
14 size_t ul_encode_to_utf8(int enc
, unsigned char *dest
, size_t len
,
15 const unsigned char *src
, size_t count
)
21 for (j
= i
= 0; i
< count
; i
++) {
22 if (enc
== UL_ENCODE_UTF16LE
) {
25 c
= (src
[i
+1] << 8) | src
[i
];
27 } else if (enc
== UL_ENCODE_UTF16BE
) {
30 c
= (src
[i
] << 8) | src
[i
+1];
32 } else if (enc
== UL_ENCODE_LATIN1
) {
37 if ((enc
== UL_ENCODE_UTF16LE
|| enc
== UL_ENCODE_UTF16BE
) &&
38 c
>= 0xD800 && c
<= 0xDBFF && i
+2 < count
) {
39 if (enc
== UL_ENCODE_UTF16LE
)
40 c2
= (src
[i
+2] << 8) | src
[i
+1];
42 c2
= (src
[i
+1] << 8) | src
[i
+2];
43 if (c2
>= 0xDC00 && c2
<= 0xDFFF) {
44 c
= 0x10000 + ((c
- 0xD800) << 10) + (c2
- 0xDC00);
56 dest
[j
++] = (uint8_t) c
;
57 } else if (c
< 0x800) {
60 dest
[j
++] = (uint8_t) (0xc0 | (c
>> 6));
61 dest
[j
++] = (uint8_t) (0x80 | (c
& 0x3f));
62 } else if (c
< 0x10000) {
65 dest
[j
++] = (uint8_t) (0xe0 | (c
>> 12));
66 dest
[j
++] = (uint8_t) (0x80 | ((c
>> 6) & 0x3f));
67 dest
[j
++] = (uint8_t) (0x80 | (c
& 0x3f));
71 dest
[j
++] = (uint8_t) (0xf0 | (c
>> 18));
72 dest
[j
++] = (uint8_t) (0x80 | ((c
>> 12) & 0x3f));
73 dest
[j
++] = (uint8_t) (0x80 | ((c
>> 6) & 0x3f));
74 dest
[j
++] = (uint8_t) (0x80 | (c
& 0x3f));