/*******************************************************************/ /* u16ports: u16 variants of wide character string functions. */ /* Copyright (C) 2017 SysDeer Technologies, LLC */ /* Released under the Standard MIT License; see COPYING.U16PORTS. */ /*******************************************************************/ #include #include #include 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; }