#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; }