1 /* radare2 - LGPL - Copyright 2017 - kazarmy */
2
3 #include <r_types.h>
4 #include <r_util.h>
5
6 /* Convert an UTF-32 buf into a unicode RRune */
r_utf32_decode(const ut8 * ptr,int ptrlen,RRune * ch,bool bigendian)7 R_API int r_utf32_decode(const ut8 *ptr, int ptrlen, RRune *ch, bool bigendian) {
8 if (ptrlen < 1) {
9 return 0;
10 }
11 int low = 0;
12 int high = 3;
13 if (bigendian) {
14 low = 3;
15 high = 0;
16 }
17 if (ptrlen > 3) {
18 int sign = bigendian ? -1 : 1;
19 if (ch) {
20 int i;
21 *ch = (ut32)ptr[low];
22 for (i = 1; i < 4; i++) {
23 *ch |= (ut32)ptr[3 - high + i * sign] << 8 * i;
24 }
25 }
26 if (ptr[high] || ptr[high - 1 * sign]) {
27 return 4;
28 }
29 if (ptr[low + 1 * sign]) {
30 return 2;
31 }
32 return 1;
33 }
34 return 0;
35 }
36
37 /* Convert an UTF-32LE buf into a unicode RRune */
r_utf32le_decode(const ut8 * ptr,int ptrlen,RRune * ch)38 R_API int r_utf32le_decode(const ut8 *ptr, int ptrlen, RRune *ch) {
39 return r_utf32_decode (ptr, ptrlen, ch, false);
40 }
41
42 /* Convert an UTF-32BE buf into a unicode RRune */
r_utf32be_decode(const ut8 * ptr,int ptrlen,RRune * ch)43 R_API int r_utf32be_decode(const ut8 *ptr, int ptrlen, RRune *ch) {
44 return r_utf32_decode (ptr, ptrlen, ch, true);
45 }
46