diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/u16_mbstowcs.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/u16_mbstowcs.c b/src/u16_mbstowcs.c new file mode 100644 index 0000000..8b84379 --- /dev/null +++ b/src/u16_mbstowcs.c @@ -0,0 +1,36 @@ +/*******************************************************************/ +/* u16ports: u16 variants of wide character string functions. */ +/* Copyright (C) 2017 Z. Gilboa */ +/* Released under the Standard MIT License; see COPYING.U16PORTS. */ +/*******************************************************************/ + +#include <wchar.h> +#include <uchar.h> +#include <u16ports/u16ports.h> + +size_t u16_mbstowcs(uint16_t * dst, const char * src, size_t len) +{ + size_t nbytes; + uint16_t * wch; + mbstate_t st = {0}; + + for (wch=dst; len; src+=nbytes) { + if ((nbytes = mbrtoc16(wch,src,4,&st)) == (size_t)-1) { + return (size_t)(-1); + + } else if (nbytes == 0) { + return wch - dst; + + } else if (nbytes == (size_t)-3) { + nbytes = 0; + len--; + wch++; + + } else { + len--; + wch++; + } + } + + return wch - dst; +} |