mirror of
https://codeberg.org/grunfink/snac2.git
synced 2024-11-25 14:35:04 +00:00
46 lines
1 KiB
C
46 lines
1 KiB
C
/* 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 */
|