Nyx Node
Toggle main menu visibility
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
16
int
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
/*--------------------------------------------------------------------------------------------------------------------*/
str_t
#define str_t
Alias for char *.
Definition
nyx_node.h:70
Author:
Jérôme ODIER
License:
LGPL-3.0-or-later
Copyright:
LPSC / CNRS