acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
encoding.h
1#pragma once
2
3
4#include "acme/prototype/string/x/x_charcategory.h"
5#include "acme/prototype/string/x/x_defines.h"
6#include "acme/prototype/string/x/x_tables.h"
7
8
9CLASS_DECL_ACME ::i32 trailingBytesForUTF8(::ansi_character ch);
10
11
12inline ::i32 utf8_unicode_length(::i32 c) { return trailingBytesForUTF8(c) + 1; }
13
14
15// return UTF8 offset
16inline ::i32 utf8_o(::i8 cExtraBytes);
17
18
19inline ::i8 utf8_e(::u8 c);
20
21
22
23CLASS_DECL_ACME character_count utf8_len(const_char_pointer psz);
24
25
26template < typename CHARACTER, typename CHARACTER_COUNT >
27inline CHARACTER *unicode_next(CHARACTER *psz, CHARACTER_COUNT *piRemaining)
28 requires(sizeof(CHARACTER) == 1);
29
30
31template<typename CHARACTER, typename CHARACTER_COUNT>
32inline CHARACTER *unicode_next(CHARACTER *psz, CHARACTER_COUNT *piRemaining)
33 requires(sizeof(CHARACTER) == 2);
34
35
36template<typename CHARACTER, typename CHARACTER_COUNT>
37inline CHARACTER *unicode_next(CHARACTER *psz, CHARACTER_COUNT *piRemaining)
38 requires(sizeof(CHARACTER) == 4);
39
40
41template < typename CHARACTER >
42[[nodiscard]] inline CHARACTER * unicode_next(CHARACTER * psz)
43{
44
45 return unicode_next(psz, (::i32 *)nullptr);
46
47}
48
49
50template<typename CHARACTER>
51inline CHARACTER *unicode_prior(CHARACTER *psz, const non_const<CHARACTER> *piRemaining)
52 requires(sizeof(CHARACTER) == 1);
53
54
55template<typename CHARACTER>
56inline CHARACTER *unicode_prior(CHARACTER *psz, const non_const<CHARACTER> *piRemaining)
57 requires(sizeof(CHARACTER) == 2);
58
59
60template<typename CHARACTER>
61inline CHARACTER *unicode_prior(CHARACTER *psz, const non_const<CHARACTER> *piRemaining)
62 requires(sizeof(CHARACTER) == 4);
63
64
65//CLASS_DECL_ACME const_char_pointer unicode_next(const_char_pointer psz);
66//CLASS_DECL_ACME const_char_pointer unicode_prior(const_char_pointer psz, const_char_pointer pszBeg);
67
68
69CLASS_DECL_ACME character_count ansi_to_ansi_len(const_char_pointer pcwsz, character_count input_size = -1);
70CLASS_DECL_ACME character_count ansi_to_ansi_len2(const_char_pointer pcwsz, character_count & input_size);
71CLASS_DECL_ACME character_count ansi_to_ansi(const_char_pointer *pwsz, const const_char_pointer *pcwsz,
72 character_count input_size = -1);
73
74
75
76CLASS_DECL_ACME character_count wd16_to_wd32_len(const ::wd16_character* pcwsz, character_count input_size = -1);
77CLASS_DECL_ACME character_count wd16_to_wd32_len2(const ::wd16_character *pcwsz, character_count & input_size);
78CLASS_DECL_ACME character_count wd16_to_wd32(::wd32_character* pwsz, const ::wd16_character* pcwsz, character_count input_size = -1);
79
80
81CLASS_DECL_ACME ::wd32_character* wd16_to_wd32_dup(const ::wd16_character* pcwsz, character_count input_size = -1);
82
83
84
85CLASS_DECL_ACME character_count wd32_to_wd16_len(const ::wd32_character* pcwsz, character_count input_size = -1);
86CLASS_DECL_ACME character_count wd32_to_wd16_len2(const ::wd32_character *pcwsz, character_count & input_size);
87CLASS_DECL_ACME character_count wd32_to_wd16(::wd16_character * pwsz, const ::wd32_character* pcwsz, character_count input_size = -1);
88
89CLASS_DECL_ACME ::wd16_character* wd32_to_wd16_dup(const ::wd16_character* pcwsz, character_count input_size = -1);
90
91
92
93CLASS_DECL_ACME character_count utf16_len(const ::wd16_character* psz);
94
95
96//CLASS_DECL_ACME const ::wd16_character * unicode_next(const ::wd16_character* psz, ::i32 * piError);
97//CLASS_DECL_ACME const ::wd16_character *unicode_prior(const ::wd16_character *psz, const ::wd16_character *pszBeg);
98
99CLASS_DECL_ACME character_count wd16_to_wd16_len(const wd16_character * pcwsz, character_count input_size = -1);
100CLASS_DECL_ACME character_count wd16_to_wd16_len2(const wd16_character * pcwsz, character_count &input_size);
101CLASS_DECL_ACME character_count wd16_to_wd16(wd16_character *pwsz, const wd16_character *pcwsz,
102 character_count input_size = -1);
103
104
105
106
107CLASS_DECL_ACME character_count ansi_to_wd16_len(const_char_pointer psz, character_count srclen = -1);
108CLASS_DECL_ACME character_count ansi_to_wd16_len2(const_char_pointer psz, character_count & srclen);
109CLASS_DECL_ACME character_count ansi_to_wd16(::wd16_character* pwsz, const_char_pointer psz, character_count srclen = -1);
110
111CLASS_DECL_ACME ::wd16_character * ansi_to_wd16_dup(const_char_pointer input, character_count input_size);
112
113
114CLASS_DECL_ACME character_count wd16_to_ansi_len(const ::wd16_character* pwsz, character_count srclen = -1);
115CLASS_DECL_ACME character_count wd16_to_ansi_len2(const ::wd16_character *pwsz, character_count & srclen);
116CLASS_DECL_ACME character_count wd16_to_ansi(char_pointer psz, const ::wd16_character* pwsz, character_count srclen = -11);
117
118CLASS_DECL_ACME char_pointer wd16_to_ansi_dup(const ::wd16_character * input, character_count input_size);
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133CLASS_DECL_ACME character_count utf32_len(const ::wd32_character* psz);
134
135
136//CLASS_DECL_ACME const ::wd32_character *unicode_next(const ::wd32_character *psz, ::i32 *piError);
137//CLASS_DECL_ACME const ::wd32_character *unicode_prior(const ::wd32_character *psz, const ::wd32_character *pszBeg);
138
139
140CLASS_DECL_ACME character_count wd32_to_wd32_len(const wd32_character * pcwsz, character_count input_size = -1);
141CLASS_DECL_ACME character_count wd32_to_wd32_len2(const wd32_character * pcwsz, character_count &input_size);
142CLASS_DECL_ACME character_count wd32_to_wd32(wd32_character *pwsz, const wd32_character *pcwsz,
143 character_count input_size = -1);
144
145
146CLASS_DECL_ACME character_count ansi_to_wd32_len(const_char_pointer psz, character_count srclen = -1);
147CLASS_DECL_ACME character_count ansi_to_wd32_len2(const_char_pointer psz, character_count & srclen);
148CLASS_DECL_ACME character_count ansi_to_wd32(::wd32_character* pwsz, const_char_pointer psz, character_count srclen = -1);
149
150CLASS_DECL_ACME ::wd32_character* ansi_to_wd32_dup(const_char_pointer pcwsz, character_count input_size = -1);
151
152
153CLASS_DECL_ACME character_count wd32_to_ansi_len(const ::wd32_character* pwsz, character_count srclen = -1);
154CLASS_DECL_ACME character_count wd32_to_ansi_len2(const ::wd32_character *pwsz, character_count & srclen);
155CLASS_DECL_ACME character_count wd32_to_ansi(char_pointer psz, const ::wd32_character* pwsz, character_count srclen = -1);
156
157CLASS_DECL_ACME char_pointer wd32_to_ansi_dup(const ::wd32_character * input, character_count input_size);
158
159
171inline character_count wd32_to_ansi_char_len(::wd32_character wch);
172
173inline character_count wd32_to_ansi_char(char_pointer psz, ::wd32_character wch);
174
175
176inline character_count replacement_utf8_char(char_pointer psz)
177{
178 psz[0] = (::i8) 0xEF;
179 psz[1] = (::i8) 0xBF;
180 psz[2] = (::i8) 0xBD;
181 return 3;
182}
183
184// The High Surrogate is first UTF-16 character
185// The Losh Surrogate is secnd UTF-16 codepointchar
186// I suggest if you want to transmit a face, you can use <img tag>
187// or if your font support a cad library with 512-bit wide encoding, you can createø <matter type="cad/application-x">512-bit wide of honda civic tweaked by john peter etcetra and used by ann (brakes light dimmed (don't tell the police))</test>
188
189
190//inline ::i32_bool utf16_is_surrogate(::wd16_character ::u16) { return (::u16 - 0xd800u) < 2048u; }
191//inline ::i32 utf16_is_high_surrogate(::wd16_character uc) { return (uc & 0xfc00) == 0xd800; }
192//inline ::i32 utf16_is_low_surrogate(::wd16_character uc) { return (uc & 0xfc00) == 0xdc00; }
193
194
195inline character_count wd16_to_wd32_char_len(const ::wd16_character * input, character_count len);
196
197
198inline character_count wd16_to_wd32_char(::wd32_character * output, const ::wd16_character * input, character_count len);
199
200
201inline character_count wd16_to_ansi_char_len(const ::wd16_character ** ppu16a, character_count * plen);
202
203
204inline character_count wd16_to_ansi_char(char_pointer psz, const ::wd16_character ** ppu16a, character_count * plen);
205
206
207#if WCHAR_T_SIZE == 16
208
209
210inline character_count utf8_to_unichar_len(const_char_pointer psz);
211inline character_count utf8_to_unichar_len(const_char_pointer psz, character_count srclen);
212inline character_count utf8_to_unichar(::wd16_character * pwsz, const_char_pointer psz);
213inline character_count utf8_to_unichar(::wd16_character * pwsz, const_char_pointer psz, character_count srclen);
214
215
216inline character_count unichar_to_utf8_len(const ::wd16_character * pwsz);
217inline character_count unichar_to_utf8_len(const ::wd16_character * pwsz, character_count srclen);
218inline character_count unichar_to_utf8(char_pointer psz, const ::wd16_character * pwsz);
219inline character_count unichar_to_utf8(char_pointer psz, const ::wd16_character * pwsz, character_count srclen);
220
221
222#else
223
224
225inline character_count utf8_to_unichar_len(const_char_pointer psz, character_count srclen = -1);
226inline character_count utf8_to_unichar(::wd32_character* pwsz, const_char_pointer psz, character_count srclen = -1);
227
228
229inline character_count unichar_to_utf8_len(const ::wd32_character* pwsz, character_count srclen = -1);
230inline character_count unichar_to_utf8(char_pointer psz, const ::wd32_character* pwsz, character_count srclen = -1);
231
232
233#endif
234
235
236inline character_count ansi_to_wd32_char(::wd32_character * output, const_char_pointer input, character_count srclen);
237
238
239inline ::i64 _ansi_to_wd32_char(const_char_pointer *ppsz, character_count * psrclen);
240
241
242inline character_count wd32_to_wd16_char(::wd16_character * pwd16sz, ::wd32_character wd32ch);