16 #if __has_include(<uchar.h>)
19 #define char16_t uint16_t
20 #define char32_t uint32_t
23 #define char16_t uint16_t
24 #define char32_t uint32_t
32typedef enum simdutf_error_code {
33 SIMDUTF_ERROR_SUCCESS = 0,
34 SIMDUTF_ERROR_HEADER_BITS,
35 SIMDUTF_ERROR_TOO_SHORT,
36 SIMDUTF_ERROR_TOO_LONG,
37 SIMDUTF_ERROR_OVERLONG,
38 SIMDUTF_ERROR_TOO_LARGE,
39 SIMDUTF_ERROR_SURROGATE,
40 SIMDUTF_ERROR_INVALID_BASE64_CHARACTER,
41 SIMDUTF_ERROR_BASE64_INPUT_REMAINDER,
42 SIMDUTF_ERROR_BASE64_EXTRA_BITS,
43 SIMDUTF_ERROR_OUTPUT_BUFFER_TOO_SMALL,
48 simdutf_error_code error;
53 simdutf_error_code error;
59 simdutf_error_code error;
61 size_t continuation_count;
62 size_t four_byte_count;
70#define SIMDUTF_UTF8_TO_UTF16_MAX_ERRORS 16
72 simdutf_error_code error;
76 size_t error_offset[SIMDUTF_UTF8_TO_UTF16_MAX_ERRORS];
79typedef enum simdutf_encoding_type {
80 SIMDUTF_ENCODING_UNSPECIFIED = 0,
81 SIMDUTF_ENCODING_UTF8 = 1,
82 SIMDUTF_ENCODING_UTF16_LE = 2,
83 SIMDUTF_ENCODING_UTF16_BE = 4,
84 SIMDUTF_ENCODING_UTF32_LE = 8,
85 SIMDUTF_ENCODING_UTF32_BE = 16
86} simdutf_encoding_type;
89bool simdutf_validate_utf8(
const char *buf,
size_t len);
92simdutf_result simdutf_validate_utf8_with_errors(
const char *buf,
size_t len);
111simdutf_encoding_type simdutf_autodetect_encoding(
const char *input,
113int simdutf_detect_encodings(
const char *input,
size_t length);
116bool simdutf_validate_ascii(
const char *buf,
size_t len);
117simdutf_result simdutf_validate_ascii_with_errors(
const char *buf,
size_t len);
120bool simdutf_validate_utf16_as_ascii(
const char16_t *buf,
size_t len);
121bool simdutf_validate_utf16be_as_ascii(
const char16_t *buf,
size_t len);
122bool simdutf_validate_utf16le_as_ascii(
const char16_t *buf,
size_t len);
125bool simdutf_validate_utf16(
const char16_t *buf,
size_t len);
126bool simdutf_validate_utf16le(
const char16_t *buf,
size_t len);
127bool simdutf_validate_utf16be(
const char16_t *buf,
size_t len);
128simdutf_result simdutf_validate_utf16_with_errors(
const char16_t *buf,
130simdutf_result simdutf_validate_utf16le_with_errors(
const char16_t *buf,
132simdutf_result simdutf_validate_utf16be_with_errors(
const char16_t *buf,
135bool simdutf_validate_utf32(
const char32_t *buf,
size_t len);
136simdutf_result simdutf_validate_utf32_with_errors(
const char32_t *buf,
140void simdutf_to_well_formed_utf16le(
const char16_t *input,
size_t len,
142void simdutf_to_well_formed_utf16be(
const char16_t *input,
size_t len,
144void simdutf_to_well_formed_utf16(
const char16_t *input,
size_t len,
148size_t simdutf_count_utf16(
const char16_t *input,
size_t length);
149size_t simdutf_count_utf16le(
const char16_t *input,
size_t length);
150size_t simdutf_count_utf16be(
const char16_t *input,
size_t length);
151size_t simdutf_count_utf8(
const char *input,
size_t length);
154size_t simdutf_utf8_length_from_latin1(
const char *input,
size_t length);
155size_t simdutf_latin1_length_from_utf8(
const char *input,
size_t length);
156size_t simdutf_latin1_length_from_utf16(
size_t length);
157size_t simdutf_latin1_length_from_utf32(
size_t length);
158size_t simdutf_utf16_length_from_utf8(
const char *input,
size_t length);
166simdutf_utf16_length_from_utf8_with_replacement(
const char *input,
168size_t simdutf_utf32_length_from_utf8(
const char *input,
size_t length);
169size_t simdutf_utf8_length_from_utf16(
const char16_t *input,
size_t length);
170size_t simdutf_utf8_length_from_utf32(
const char32_t *input,
size_t length);
172simdutf_utf8_length_from_utf16_with_replacement(
const char16_t *input,
174size_t simdutf_utf8_length_from_utf16le(
const char16_t *input,
size_t length);
175size_t simdutf_utf8_length_from_utf16be(
const char16_t *input,
size_t length);
177simdutf_utf8_length_from_utf16le_with_replacement(
const char16_t *input,
180simdutf_utf8_length_from_utf16be_with_replacement(
const char16_t *input,
184size_t simdutf_convert_latin1_to_utf8(
const char *input,
size_t length,
186size_t simdutf_convert_latin1_to_utf8_safe(
const char *input,
size_t length,
187 char *output,
size_t utf8_len);
189 const char *input,
size_t length,
char *output,
size_t utf8_len);
190size_t simdutf_convert_latin1_to_utf16le(
const char *input,
size_t length,
192size_t simdutf_convert_latin1_to_utf16be(
const char *input,
size_t length,
194size_t simdutf_convert_latin1_to_utf16(
const char *input,
size_t length,
196size_t simdutf_convert_latin1_to_utf32(
const char *input,
size_t length,
199size_t simdutf_convert_utf8_to_latin1(
const char *input,
size_t length,
201size_t simdutf_convert_utf8_to_utf16le(
const char *input,
size_t length,
203size_t simdutf_convert_utf8_to_utf16be(
const char *input,
size_t length,
205size_t simdutf_convert_utf8_to_utf16(
const char *input,
size_t length,
212size_t simdutf_convert_utf8_to_utf16_with_replacement(
const char *input,
215size_t simdutf_convert_utf8_to_utf16le_with_replacement(
const char *input,
218size_t simdutf_convert_utf8_to_utf16be_with_replacement(
const char *input,
224size_t simdutf_convert_utf8_to_utf16_with_replacement_with_result(
225 const char *input,
size_t length,
char16_t *output,
227size_t simdutf_convert_utf8_to_utf16le_with_replacement_with_result(
228 const char *input,
size_t length,
char16_t *output,
230size_t simdutf_convert_utf8_to_utf16be_with_replacement_with_result(
231 const char *input,
size_t length,
char16_t *output,
234size_t simdutf_convert_utf8_to_utf32(
const char *input,
size_t length,
236simdutf_result simdutf_convert_utf8_to_latin1_with_errors(
const char *input,
239simdutf_result simdutf_convert_utf8_to_utf16_with_errors(
const char *input,
242simdutf_result simdutf_convert_utf8_to_utf16le_with_errors(
const char *input,
245simdutf_result simdutf_convert_utf8_to_utf16be_with_errors(
const char *input,
248simdutf_result simdutf_convert_utf8_to_utf32_with_errors(
const char *input,
253size_t simdutf_convert_valid_utf8_to_latin1(
const char *input,
size_t length,
255size_t simdutf_convert_valid_utf8_to_utf16le(
const char *input,
size_t length,
257size_t simdutf_convert_valid_utf8_to_utf16be(
const char *input,
size_t length,
259size_t simdutf_convert_valid_utf8_to_utf32(
const char *input,
size_t length,
263size_t simdutf_convert_utf16_to_utf8(
const char16_t *input,
size_t length,
265size_t simdutf_convert_utf16le_to_utf8(
const char16_t *input,
size_t length,
267size_t simdutf_convert_utf16be_to_utf8(
const char16_t *input,
size_t length,
269size_t simdutf_convert_utf16_to_utf8_safe(
const char16_t *input,
size_t length,
270 char *output,
size_t utf8_len);
272 const char16_t *input,
size_t length,
char *output,
size_t utf8_len);
273size_t simdutf_convert_utf16_to_latin1(
const char16_t *input,
size_t length,
275size_t simdutf_convert_utf16le_to_latin1(
const char16_t *input,
size_t length,
277size_t simdutf_convert_utf16be_to_latin1(
const char16_t *input,
size_t length,
280simdutf_convert_utf16_to_latin1_with_errors(
const char16_t *input,
281 size_t length,
char *output);
283simdutf_convert_utf16le_to_latin1_with_errors(
const char16_t *input,
284 size_t length,
char *output);
286simdutf_convert_utf16be_to_latin1_with_errors(
const char16_t *input,
287 size_t length,
char *output);
289simdutf_result simdutf_convert_utf16_to_utf8_with_errors(
const char16_t *input,
293simdutf_convert_utf16le_to_utf8_with_errors(
const char16_t *input,
294 size_t length,
char *output);
296simdutf_convert_utf16be_to_utf8_with_errors(
const char16_t *input,
297 size_t length,
char *output);
303size_t simdutf_convert_utf16_to_utf8_with_replacement(
const char16_t *input,
307 const char16_t *input,
size_t length,
char *output,
size_t utf8_len);
308size_t simdutf_convert_utf16le_to_utf8_with_replacement(
const char16_t *input,
311size_t simdutf_convert_utf16be_to_utf8_with_replacement(
const char16_t *input,
315size_t simdutf_convert_valid_utf16_to_utf8(
const char16_t *input,
size_t length,
317size_t simdutf_convert_valid_utf16_to_latin1(
const char16_t *input,
318 size_t length,
char *output);
319size_t simdutf_convert_valid_utf16le_to_latin1(
const char16_t *input,
320 size_t length,
char *output);
321size_t simdutf_convert_valid_utf16be_to_latin1(
const char16_t *input,
322 size_t length,
char *output);
324size_t simdutf_convert_valid_utf16le_to_utf8(
const char16_t *input,
325 size_t length,
char *output);
326size_t simdutf_convert_valid_utf16be_to_utf8(
const char16_t *input,
327 size_t length,
char *output);
330size_t simdutf_convert_utf16_to_utf32(
const char16_t *input,
size_t length,
332size_t simdutf_convert_utf16le_to_utf32(
const char16_t *input,
size_t length,
334size_t simdutf_convert_utf16be_to_utf32(
const char16_t *input,
size_t length,
336simdutf_result simdutf_convert_utf16_to_utf32_with_errors(
const char16_t *input,
340simdutf_convert_utf16le_to_utf32_with_errors(
const char16_t *input,
341 size_t length,
char32_t *output);
343simdutf_convert_utf16be_to_utf32_with_errors(
const char16_t *input,
344 size_t length,
char32_t *output);
347size_t simdutf_convert_valid_utf16_to_utf32(
const char16_t *input,
348 size_t length,
char32_t *output);
349size_t simdutf_convert_valid_utf16le_to_utf32(
const char16_t *input,
350 size_t length,
char32_t *output);
351size_t simdutf_convert_valid_utf16be_to_utf32(
const char16_t *input,
352 size_t length,
char32_t *output);
355size_t simdutf_convert_utf32_to_utf8(
const char32_t *input,
size_t length,
357simdutf_result simdutf_convert_utf32_to_utf8_with_errors(
const char32_t *input,
360size_t simdutf_convert_valid_utf32_to_utf8(
const char32_t *input,
size_t length,
363size_t simdutf_convert_utf32_to_utf16(
const char32_t *input,
size_t length,
365size_t simdutf_convert_utf32_to_utf16le(
const char32_t *input,
size_t length,
367size_t simdutf_convert_utf32_to_utf16be(
const char32_t *input,
size_t length,
370simdutf_convert_utf32_to_latin1_with_errors(
const char32_t *input,
371 size_t length,
char *output);
374const char *simdutf_find(
const char *start,
const char *end,
char character);
375const char16_t *simdutf_find_utf16(
const char16_t *start,
const char16_t *end,
379typedef enum simdutf_base64_options {
380 SIMDUTF_BASE64_DEFAULT = 0,
381 SIMDUTF_BASE64_URL = 1,
382 SIMDUTF_BASE64_DEFAULT_NO_PADDING = 2,
383 SIMDUTF_BASE64_URL_WITH_PADDING = 3,
384 SIMDUTF_BASE64_DEFAULT_ACCEPT_GARBAGE = 4,
385 SIMDUTF_BASE64_URL_ACCEPT_GARBAGE = 5,
386 SIMDUTF_BASE64_DEFAULT_OR_URL = 8,
387 SIMDUTF_BASE64_DEFAULT_OR_URL_ACCEPT_GARBAGE = 12
388} simdutf_base64_options;
390typedef enum simdutf_last_chunk_handling_options {
391 SIMDUTF_LAST_CHUNK_LOOSE = 0,
392 SIMDUTF_LAST_CHUNK_STRICT = 1,
393 SIMDUTF_LAST_CHUNK_STOP_BEFORE_PARTIAL = 2,
394 SIMDUTF_LAST_CHUNK_ONLY_FULL_CHUNKS = 3
395} simdutf_last_chunk_handling_options;
398size_t simdutf_maximal_binary_length_from_base64(
const char *input,
400size_t simdutf_maximal_binary_length_from_base64_utf16(
const char16_t *input,
405 const char *input,
size_t length,
char *output,
406 simdutf_base64_options options,
407 simdutf_last_chunk_handling_options last_chunk_options);
409 const char16_t *input,
size_t length,
char *output,
410 simdutf_base64_options options,
411 simdutf_last_chunk_handling_options last_chunk_options);
413size_t simdutf_base64_length_from_binary(
size_t length,
414 simdutf_base64_options options);
415size_t simdutf_base64_length_from_binary_with_lines(
416 size_t length, simdutf_base64_options options,
size_t line_length);
418size_t simdutf_binary_to_base64(
const char *input,
size_t length,
char *output,
419 simdutf_base64_options options);
420size_t simdutf_binary_to_base64_with_lines(
const char *input,
size_t length,
421 char *output,
size_t line_length,
422 simdutf_base64_options options);
426 const char *input,
size_t length,
char *output,
size_t *outlen,
427 simdutf_base64_options options,
428 simdutf_last_chunk_handling_options last_chunk_options,
429 bool decode_up_to_bad_char);
431 const char16_t *input,
size_t length,
char *output,
size_t *outlen,
432 simdutf_base64_options options,
433 simdutf_last_chunk_handling_options last_chunk_options,
434 bool decode_up_to_bad_char);
438 const char *input,
size_t length,
char *output,
439 simdutf_base64_options options,
440 simdutf_last_chunk_handling_options last_chunk_options);
442 const char16_t *input,
size_t length,
char *output,
443 simdutf_base64_options options,
444 simdutf_last_chunk_handling_options last_chunk_options);
447bool simdutf_base64_valid(
char input, simdutf_base64_options options);
448bool simdutf_base64_valid_utf16(
char16_t input, simdutf_base64_options options);