1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/*********************************************************************
unicode.h
Unicode related functions
This code is for converting between UTF-8, UTF-16, and 32-bit
Unicode strings. These functions roughly parallel C runtime
library functions like mbtowc() and similar functions, but are
specific for these Unicode encodings. Specifically, there are
functions that convert UTF-8 and UTF-16 char clusters to and from
singular 32-bit Unicode chars.
***************************************************************************/
#pragma once
#ifndef UNICODE_H
#define UNICODE_H
#include <stdlib.h>
#include "osdcore.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
/* these defines specify the maximum size of different types of Unicode
* character encodings */
#define UTF8_CHAR_MAX 6
#define UTF16_CHAR_MAX 2
/* these are UTF-8 encoded strings for common characters */
#define UTF8_NBSP "\xc2\xa0" /* non-breaking space */
#define UTF8_MULTIPLY "\xc3\x97" /* multiplication symbol */
#define UTF8_DEGREES "\xc2\xb0" /* degrees symbol */
#define a_RING "\xc3\xa5" /* small a with a ring */
#define a_UMLAUT "\xc3\xa4" /* small a with an umlaut */
#define o_UMLAUT "\xc3\xb6" /* small o with an umlaut */
#define u_UMLAUT "\xc3\xbc" /* small u with an umlaut */
#define e_ACUTE "\xc3\xa9" /* small e with an acute */
#define A_RING "\xc3\x85" /* capital A with a ring */
#define A_UMLAUT "\xc3\x84" /* capital A with an umlaut */
#define O_UMLAUT "\xc3\x96" /* capital O with an umlaut */
#define U_UMLAUT "\xc3\x9c" /* capital U with an umlaut */
#define E_ACUTE "\xc3\x89" /* capital E with an acute */
#define UTF8_LEFT "\xe2\x86\x90" /* cursor left */
#define UTF8_RIGHT "\xe2\x86\x92" /* cursor right */
#define UTF8_UP "\xe2\x86\x91" /* cursor up */
#define UTF8_DOWN "\xe2\x86\x93" /* cursor down */
/***************************************************************************
TYPE DEFINITIONS
***************************************************************************/
typedef UINT16 utf16_char;
typedef UINT32 unicode_char;
/***************************************************************************
FUNCTION PROTOTYPES
***************************************************************************/
/* tests to see if a unicode char is a valid code point */
int uchar_isvalid(unicode_char uchar);
/* converting strings to 32-bit Unicode chars */
int uchar_from_utf8(unicode_char *uchar, const char *utf8char, size_t count);
int uchar_from_utf16(unicode_char *uchar, const utf16_char *utf16char, size_t count);
int uchar_from_utf16f(unicode_char *uchar, const utf16_char *utf16char, size_t count);
/* converting 32-bit Unicode chars to strings */
int utf8_from_uchar(char *utf8string, size_t count, unicode_char uchar);
int utf16_from_uchar(utf16_char *utf16string, size_t count, unicode_char uchar);
int utf16f_from_uchar(utf16_char *utf16string, size_t count, unicode_char uchar);
/* misc UTF-8 helpers */
const char *utf8_previous_char(const char *utf8string);
int utf8_is_valid_string(const char *utf8string);
/***************************************************************************
MACROS
***************************************************************************/
#ifdef LSB_FIRST
#define uchar_from_utf16be uchar_from_utf16f
#define uchar_from_utf16le uchar_from_utf16
#define utf16be_from_uchar utf16f_from_uchar
#define utf16le_from_uchar utf16_from_uchar
#else
#define uchar_from_utf16be uchar_from_utf16
#define uchar_from_utf16le uchar_from_utf16f
#define utf16be_from_uchar utf16_from_uchar
#define utf16le_from_uchar utf16f_from_uchar
#endif
#endif /* UNICODE_H */
|