Backport from xs.

This commit is contained in:
default 2023-05-09 14:18:15 +02:00
parent 510477cf39
commit d562c3cfed
4 changed files with 49 additions and 35 deletions

3
snac.c
View file

@ -5,8 +5,9 @@
#include "xs.h" #include "xs.h"
#include "xs_io.h" #include "xs_io.h"
#include "xs_encdec.h" #include "xs_unicode.h"
#include "xs_json.h" #include "xs_json.h"
#include "xs_encdec.h"
#include "xs_curl.h" #include "xs_curl.h"
#include "xs_openssl.h" #include "xs_openssl.h"
#include "xs_socket.h" #include "xs_socket.h"

View file

@ -14,7 +14,6 @@
xs_str *xs_base64_enc(const xs_val *data, int sz); xs_str *xs_base64_enc(const xs_val *data, int sz);
xs_val *xs_base64_dec(const xs_str *data, int *size); xs_val *xs_base64_dec(const xs_str *data, int *size);
int xs_is_base64(const char *str); int xs_is_base64(const char *str);
xs_str *xs_utf8_enc(xs_str *str, unsigned int cpoint);
#ifdef XS_IMPLEMENTATION #ifdef XS_IMPLEMENTATION
@ -383,38 +382,6 @@ int xs_is_base64(const char *str)
} }
/** 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_IMPLEMENTATION */
#endif /* _XS_ENCDEC_H */ #endif /* _XS_ENCDEC_H */

46
xs_unicode.h Normal file
View file

@ -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 */

View file

@ -1 +1 @@
/* b4f118990f3b8327a033a28bd9ca687c75b23dee */ /* d8ec27efc55ba67403e88bfbe7d2ce9905364d6d */