diff --git a/headers/posix/uchar.h b/headers/posix/uchar.h index 72f3ac18cd..8b090cba5e 100644 --- a/headers/posix/uchar.h +++ b/headers/posix/uchar.h @@ -1,44 +1,59 @@ /* - * Copyright 2018 Haiku, Inc. All Right Reserved + * Copyright 2018-2020 Haiku, Inc. All Right Reserved * Distributed under the terms of MIT license. */ #ifndef _UCHAR_H #define _UCHAR_H + #include + #ifdef __cplusplus extern "C" { -#else -typedef wchar_t char32_t; /* our wchar_t is utf32 */ -typedef wchar_t char16_t; #endif -#define __STD_UTF_32__ 1 -/* We don't define __STD_UTF_16__, so the format of char16_t is unspecified */ +typedef uint_least32_t char32_t; +typedef uint_least16_t char16_t; + + +#define __STD_UTF_32__ 1 +#define __STD_UTF_16__ 1 + + +// TODO implement mbrtoc16 + + static __inline size_t -c16rtomb(char *dest, char16_t wc, mbstate_t *mbState) +c16rtomb(char *dest, char32_t wc, mbstate_t *mbState) { - return wcrtomb(dest, wc, mbState); + wchar_t tmp = (wchar_t)wc; + return wcrtomb(dest, tmp, mbState); } + + static __inline size_t -mbrtoc16(char16_t *dest, const char *src, size_t srcLength, mbstate_t *mbState) +mbrtoc32(char32_t *dest, const char *src, size_t srcLength, mbstate_t *mbState) { - return mbrtowc(dest, src, srcLength, mbState); + return mbrtowc((wchar_t*)dest, src, srcLength, mbState); } + static __inline size_t c32rtomb(char *dest, char32_t wc, mbstate_t *mbState) { - return wcrtomb(dest, wc, mbState); + return wcrtomb(dest, (wchar_t)wc, mbState); } + + static __inline size_t mbrtoc32(char32_t *dest, const char *src, size_t srcLength, mbstate_t *mbState) { - return mbrtowc(dest, src, srcLength, mbState); + return mbrtowc((wchar_t*)dest, src, srcLength, mbState); } + #ifdef __cplusplus } #endif