snac2/xs_unicode.h

47 lines
1.0 KiB
C
Raw Normal View History

2023-05-09 15:18:15 +03:00
/* 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 */