Nyx Node
Loading...
Searching...
No Matches
utf8.c
1/* NyxNode
2 * Author: Jérôme ODIER <jerome.odier@lpsc.in2p3.fr>
3 * SPDX-License-Identifier: GPL-2.0-only (Mongoose backend) or GPL-3.0+
4 */
5
6/*--------------------------------------------------------------------------------------------------------------------*/
7
8#include "../nyx_node_internal.h"
9
10/*--------------------------------------------------------------------------------------------------------------------*/
11
12#define UTF8_INVALID_CHAR '?'
13
14/*--------------------------------------------------------------------------------------------------------------------*/
15
16int nyx_unicode_to_utf8(str_t result, uint32_t unicode_char)
17{
18 uint8_t *up = (uint8_t *) result;
19
20 /*----------------------------------------------------------------------------------------------------------------*/
21
22 /* ignore surrogates */
23
24 if(unicode_char >= 0xD800U
25 &&
26 unicode_char <= 0xDFFFU
27 ) {
28 *up = UTF8_INVALID_CHAR;
29
30 return 1;
31 }
32
33 /*----------------------------------------------------------------------------------------------------------------*/
34
35 if(unicode_char <= 0x7FU)
36 {
37 *up = (uint8_t) (0x00U | ((unicode_char >> 0) & 0x7FU));
38 return 1;
39 }
40
41 if(unicode_char <= 0x7FFU)
42 {
43 *up++ = (uint8_t) (0xC0U | ((unicode_char >> 6) & 0x1FU));
44 *up = (uint8_t) (0x80U | ((unicode_char >> 0) & 0x3FU));
45 return 2;
46 }
47
48 if(unicode_char <= 0xFFFFU)
49 {
50 *up++ = (uint8_t) (0xE0U | ((unicode_char >> 12) & 0x0FU));
51 *up++ = (uint8_t) (0x80U | ((unicode_char >> 6) & 0x3FU));
52 *up = (uint8_t) (0x80U | ((unicode_char >> 0) & 0x3FU));
53 return 3;
54 }
55
56 if(unicode_char <= 0x10FFFFU)
57 {
58 *up++ = (uint8_t) (0xF0U | ((unicode_char >> 18) & 0x07U));
59 *up++ = (uint8_t) (0x80U | ((unicode_char >> 12) & 0x3FU));
60 *up++ = (uint8_t) (0x80U | ((unicode_char >> 6) & 0x3FU));
61 *up = (uint8_t) (0x80U | ((unicode_char >> 0) & 0x3FU));
62 return 4;
63 }
64
65 /*----------------------------------------------------------------------------------------------------------------*/
66
67 *up = UTF8_INVALID_CHAR;
68
69 return 1;
70
71 /*----------------------------------------------------------------------------------------------------------------*/
72}
73
74/*--------------------------------------------------------------------------------------------------------------------*/
#define str_t
Alias for char *.
Definition nyx_node.h:70