1
0

wcsnrtombs.c 987 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * This code was written by Rich Felker in 2010; no copyright is claimed.
  3. * This code is in the public domain. Attribution is appreciated but
  4. * unnecessary.
  5. */
  6. #include <stdlib.h>
  7. #include <inttypes.h>
  8. #include <wchar.h>
  9. #include <errno.h>
  10. #include "internal.h"
  11. size_t wcsnrtombs(char *restrict dst, const wchar_t **restrict wcs, size_t wn, size_t n, mbstate_t *restrict st)
  12. {
  13. size_t l, cnt=0, n2;
  14. char *s, buf[256];
  15. const wchar_t *ws = *wcs;
  16. if (!dst) s = buf, n = sizeof buf;
  17. else s = dst;
  18. while ( ws && n && ( (n2=wn)>=n || n2>32 ) ) {
  19. if (n2>=n) n2=n;
  20. wn -= n2;
  21. l = wcsrtombs(s, &ws, n2, 0);
  22. if (!(l+1)) {
  23. cnt = l;
  24. n = 0;
  25. break;
  26. }
  27. if (s != buf) {
  28. s += l;
  29. n -= l;
  30. }
  31. cnt += l;
  32. }
  33. if (ws) while (n && wn) {
  34. l = wcrtomb(s, *ws, 0);
  35. if ((l+1)<=1) {
  36. if (!l) ws = 0;
  37. else cnt = l;
  38. break;
  39. }
  40. ws++; wn--;
  41. /* safe - this loop runs fewer than sizeof(buf) times */
  42. s+=l; n-=l;
  43. cnt++;
  44. }
  45. if (dst) *wcs = ws;
  46. return cnt;
  47. }