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