diff options
Diffstat (limited to 'uchars.c')
-rw-r--r-- | uchars.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/uchars.c b/uchars.c new file mode 100644 index 0000000..5f09f60 --- /dev/null +++ b/uchars.c | |||
@@ -0,0 +1,29 @@ | |||
1 | #include "memory.h" | ||
2 | #include "uchars.h" | ||
3 | |||
4 | char *ascii(const char16_t *wstr, bool translate_slashes) | ||
5 | { | ||
6 | size_t len = 0; | ||
7 | for (const char16_t *wp = wstr; *wp; wp++) | ||
8 | len++; | ||
9 | char *ret = snewn(len + 1, char); | ||
10 | char *p = ret; | ||
11 | for (const char16_t *wp = wstr; *wp; wp++) | ||
12 | *p++ = (*wp == '\\' && translate_slashes ? '/' : | ||
13 | *wp < 0x80 ? *wp : | ||
14 | '?'); | ||
15 | *p = '\0'; | ||
16 | return ret; | ||
17 | } | ||
18 | |||
19 | void c16cpy(char16_t *out, uint32_t *outsize, char *s) | ||
20 | { | ||
21 | uint32_t retlen = 0; | ||
22 | while (retlen < *outsize) { | ||
23 | char16_t c = (out[retlen] = (unsigned char)*s++); | ||
24 | if (!c) | ||
25 | break; | ||
26 | retlen++; | ||
27 | } | ||
28 | *outsize = retlen; | ||
29 | } | ||