blob: ec64140a117c62898cb9a00866af364dd1206b7f [file] [log] [blame]
#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;
}