#include <wchar.h> | |
#include <limits.h> | |
#include <string.h> | |
size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st) | |
{ | |
const wchar_t *ws = *wcs; | |
size_t cnt = 0; | |
if (!dst) n=0; | |
while (ws && wn) { | |
char tmp[MB_LEN_MAX]; | |
size_t l = wcrtomb(n<MB_LEN_MAX ? tmp : dst, *ws, 0); | |
if (l==-1) { | |
cnt = -1; | |
break; | |
} | |
if (dst) { | |
if (n<MB_LEN_MAX) { | |
if (l>n) break; | |
memcpy(dst, tmp, l); | |
} | |
dst += l; | |
n -= l; | |
} | |
if (!*ws) { | |
ws = 0; | |
break; | |
} | |
ws++; | |
wn--; | |
cnt += l; | |
} | |
if (dst) *wcs = ws; | |
return cnt; | |
} |