Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2. FUNCTION
  3. <<wcsrtombs>>, <<wcsnrtombs>>---convert a wide-character string to a character string
  4.  
  5. INDEX
  6.         wcsrtombs
  7. INDEX
  8.         _wcsrtombs_r
  9. INDEX
  10.         wcsnrtombs
  11. INDEX
  12.         _wcsnrtombs_r
  13.  
  14. ANSI_SYNOPSIS
  15.         #include <wchar.h>
  16.         size_t wcsrtombs(char *__restrict <[dst]>,
  17.                          const wchar_t **__restrict <[src]>, size_t <[len]>,
  18.                          mbstate_t *__restrict <[ps]>);
  19.  
  20.         #include <wchar.h>
  21.         size_t _wcsrtombs_r(struct _reent *<[ptr]>, char *<[dst]>,
  22.                             const wchar_t **<[src]>, size_t <[len]>,
  23.                             mbstate_t *<[ps]>);
  24.  
  25.         #include <wchar.h>
  26.         size_t wcsnrtombs(char *__restrict <[dst]>,
  27.                           const wchar_t **__restrict <[src]>,
  28.                           size_t <[nwc]>, size_t <[len]>,
  29.                           mbstate_t *__restrict <[ps]>);
  30.  
  31.         #include <wchar.h>
  32.         size_t _wcsnrtombs_r(struct _reent *<[ptr]>, char *<[dst]>,
  33.                              const wchar_t **<[src]>, size_t <[nwc]>,
  34.                              size_t <[len]>, mbstate_t *<[ps]>);
  35.  
  36. TRAD_SYNOPSIS
  37.         #include <wchar.h>
  38.         size_t wcsrtombs(<[dst]>, <[src]>, <[len]>, <[ps]>)
  39.         char *__restrict <[dst]>;
  40.         const wchar_t **__restrict <[src]>;
  41.         size_t <[len]>;
  42.         mbstate_t *__restrict <[ps]>;
  43.  
  44.         #include <wchar.h>
  45.         size_t _wcsrtombs_r(<[ptr]>, <[dst]>, <[src]>, <[len]>, <[ps]>)
  46.         struct _rent *<[ptr]>;
  47.         char *<[dst]>;
  48.         const wchar_t **<[src]>;
  49.         size_t <[len]>;
  50.         mbstate_t *<[ps]>;
  51.  
  52.         #include <wchar.h>
  53.         size_t wcsnrtombs(<[dst]>, <[src]>, <[nwc]>, <[len]>, <[ps]>)
  54.         char *__restrict <[dst]>;
  55.         const wchar_t **__restrict <[src]>;
  56.         size_t <[nwc]>;
  57.         size_t <[len]>;
  58.         mbstate_t *__restrict <[ps]>;
  59.  
  60.         #include <wchar.h>
  61.         size_t _wcsnrtombs_r(<[ptr]>, <[dst]>, <[src]>, <[nwc]>, <[len]>, <[ps]>)
  62.         struct _rent *<[ptr]>;
  63.         char *<[dst]>;
  64.         const wchar_t **<[src]>;
  65.         size_t <[nwc]>;
  66.         size_t <[len]>;
  67.         mbstate_t *<[ps]>;
  68.  
  69. DESCRIPTION
  70. The <<wcsrtombs>> function converts a string of wide characters indirectly
  71. pointed to by <[src]> to a corresponding multibyte character string stored in
  72. the array pointed to by <[dst]>.  No more than <[len]> bytes are written to
  73. <[dst]>.
  74.  
  75. If <[dst]> is NULL, no characters are stored.
  76.  
  77. If <[dst]> is not NULL, the pointer pointed to by <[src]> is updated to point
  78. to the character after the one that conversion stopped at.  If conversion
  79. stops because a null character is encountered, *<[src]> is set to NULL.
  80.  
  81. The mbstate_t argument, <[ps]>, is used to keep track of the shift state.  If
  82. it is NULL, <<wcsrtombs>> uses an internal, static mbstate_t object, which
  83. is initialized to the initial conversion state at program startup.
  84.  
  85. The <<wcsnrtombs>> function behaves identically to <<wcsrtombs>>, except that
  86. conversion stops after reading at most <[nwc]> characters from the buffer
  87. pointed to by <[src]>.
  88.  
  89. RETURNS
  90. The <<wcsrtombs>> and <<wcsnrtombs>> functions return the number of bytes
  91. stored in the array pointed to by <[dst]> (not including any terminating
  92. null), if successful, otherwise it returns (size_t)-1.
  93.  
  94. PORTABILITY
  95. <<wcsrtombs>> is defined by C99 standard.
  96. <<wcsnrtombs>> is defined by the POSIX.1-2008 standard.
  97. */
  98.  
  99. #include <reent.h>
  100. #include <newlib.h>
  101. #include <wchar.h>
  102. #include <stdlib.h>
  103. #include <stdio.h>
  104. #include <errno.h>
  105. #include "local.h"
  106.  
  107. size_t
  108. _DEFUN (_wcsnrtombs_r, (r, dst, src, nwc, len, ps),
  109.         struct _reent *r _AND
  110.         char *dst _AND
  111.         const wchar_t **src _AND
  112.         size_t nwc _AND
  113.         size_t len _AND
  114.         mbstate_t *ps)
  115. {
  116.   char *ptr = dst;
  117.   char buff[10];
  118.   wchar_t *pwcs;
  119.   size_t n;
  120.   int i;
  121.  
  122. #ifdef _MB_CAPABLE
  123.   if (ps == NULL)
  124.     {
  125.       _REENT_CHECK_MISC(r);
  126.       ps = &(_REENT_WCSRTOMBS_STATE(r));
  127.     }
  128. #endif
  129.  
  130.   /* If no dst pointer, treat len as maximum possible value. */
  131.   if (dst == NULL)
  132.     len = (size_t)-1;
  133.  
  134.   n = 0;
  135.   pwcs = (wchar_t *)(*src);
  136.  
  137.   while (n < len && nwc-- > 0)
  138.     {
  139.       int count = ps->__count;
  140.       wint_t wch = ps->__value.__wch;
  141.       int bytes = __wctomb (r, buff, *pwcs, __locale_charset (), ps);
  142.       if (bytes == -1)
  143.         {
  144.           r->_errno = EILSEQ;
  145.           ps->__count = 0;
  146.           return (size_t)-1;
  147.         }
  148.       if (n + bytes <= len)
  149.         {
  150.           n += bytes;
  151.           if (dst)
  152.             {
  153.               for (i = 0; i < bytes; ++i)
  154.                 *ptr++ = buff[i];
  155.               ++(*src);
  156.             }
  157.           if (*pwcs++ == 0x00)
  158.             {
  159.               if (dst)
  160.                 *src = NULL;
  161.               ps->__count = 0;
  162.               return n - 1;
  163.             }
  164.         }
  165.       else
  166.         {
  167.           /* not enough room, we must back up state to before __wctomb call */
  168.           ps->__count = count;
  169.           ps->__value.__wch = wch;
  170.           len = 0;
  171.         }
  172.     }
  173.  
  174.   return n;
  175. }
  176.  
  177. #ifndef _REENT_ONLY
  178. size_t
  179. _DEFUN (wcsnrtombs, (dst, src, nwc, len, ps),
  180.         char *__restrict dst _AND
  181.         const wchar_t **__restrict src _AND
  182.         size_t nwc _AND
  183.         size_t len _AND
  184.         mbstate_t *__restrict ps)
  185. {
  186.   return _wcsnrtombs_r (_REENT, dst, src, nwc, len, ps);
  187. }
  188. #endif /* !_REENT_ONLY */
  189.