From d562c3cfed3080013ee4fc68c7956c874f1323b8 Mon Sep 17 00:00:00 2001 From: default Date: Tue, 9 May 2023 14:18:15 +0200 Subject: Backport from xs. --- xs_unicode.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 xs_unicode.h (limited to 'xs_unicode.h') diff --git a/xs_unicode.h b/xs_unicode.h new file mode 100644 index 0000000..6f78d58 --- /dev/null +++ b/xs_unicode.h @@ -0,0 +1,46 @@ +/* copyright (c) 2022 - 2023 grunfink / MIT license */ + +#ifndef _XS_UNICODE_H + +#define _XS_UNICODE_H + + xs_str *xs_utf8_enc(xs_str *str, unsigned int cpoint); + + +#ifdef XS_IMPLEMENTATION + +/** utf-8 **/ + +xs_str *xs_utf8_enc(xs_str *str, unsigned int cpoint) +/* encodes an Unicode codepoint to utf8 */ +{ + unsigned char tmp[4]; + int n = 0; + + if (cpoint < 0x80) + tmp[n++] = cpoint & 0xff; + else + if (cpoint < 0x800) { + tmp[n++] = 0xc0 | (cpoint >> 6); + tmp[n++] = 0x80 | (cpoint & 0x3f); + } + else + if (cpoint < 0x10000) { + tmp[n++] = 0xe0 | (cpoint >> 12); + tmp[n++] = 0x80 | ((cpoint >> 6) & 0x3f); + tmp[n++] = 0x80 | (cpoint & 0x3f); + } + else + if (cpoint < 0x200000) { + tmp[n++] = 0xf0 | (cpoint >> 18); + tmp[n++] = 0x80 | ((cpoint >> 12) & 0x3f); + tmp[n++] = 0x80 | ((cpoint >> 6) & 0x3f); + tmp[n++] = 0x80 | (cpoint & 0x3f); + } + + return xs_append_m(str, (char *)tmp, n); +} + +#endif /* XS_IMPLEMENTATION */ + +#endif /* _XS_UNICODE_H */ -- cgit v1.2.3