Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2. FUNCTION
  3. <<mbsrtowcs>>, <<mbsnrtowcs>>---convert a character string to a wide-character string
  4.  
  5. INDEX
  6.         mbsrtowcs
  7. INDEX
  8.         _mbsrtowcs_r
  9. INDEX
  10.         mbsnrtowcs
  11. INDEX
  12.         _mbsnrtowcs_r
  13.  
  14. ANSI_SYNOPSIS
  15.         #include <wchar.h>
  16.         size_t mbsrtowcs(wchar_t *__restrict <[dst]>,
  17.                          const char **__restrict <[src]>,
  18.                          size_t <[len]>,
  19.                          mbstate_t *__restrict <[ps]>);
  20.  
  21.         #include <wchar.h>
  22.         size_t _mbsrtowcs_r(struct _reent *<[ptr]>, wchar_t *<[dst]>,
  23.                             const char **<[src]>, size_t <[len]>,
  24.                             mbstate_t *<[ps]>);
  25.  
  26.         #include <wchar.h>
  27.         size_t mbsnrtowcs(wchar_t *__ restrict <[dst]>,
  28.                           const char **__restrict <[src]>, size_t <[nms]>,
  29.                           size_t <[len]>, mbstate_t *__restrict <[ps]>);
  30.  
  31.         #include <wchar.h>
  32.         size_t _mbsnrtowcs_r(struct _reent *<[ptr]>, wchar_t *<[dst]>,
  33.                              const char **<[src]>, size_t <[nms]>,
  34.                              size_t <[len]>, mbstate_t *<[ps]>);
  35.  
  36. TRAD_SYNOPSIS
  37.         #include <wchar.h>
  38.         size_t mbsrtowcs(<[dst]>, <[src]>, <[len]>, <[ps]>)
  39.         wchar_t *__restrict <[dst]>;
  40.         const char **__restrict <[src]>;
  41.         size_t <[len]>;
  42.         mbstate_t *__restrict <[ps]>;
  43.  
  44.         #include <wchar.h>
  45.         size_t _mbsrtowcs_r(<[ptr]>, <[dst]>, <[src]>, <[len]>, <[ps]>)
  46.         struct _reent *<[ptr]>;
  47.         wchar_t *<[dst]>;
  48.         const char **<[src]>;
  49.         size_t <[len]>;
  50.         mbstate_t *<[ps]>;
  51.  
  52.         #include <wchar.h>
  53.         size_t mbsnrtowcs(<[dst]>, <[src]>, <[nms]>, <[len]>, <[ps]>)
  54.         wchar_t *__restrict <[dst]>;
  55.         const char **__restrict <[src]>;
  56.         size_t <[nms]>;
  57.         size_t <[len]>;
  58.         mbstate_t *__restrict <[ps]>;
  59.  
  60.         #include <wchar.h>
  61.         size_t _mbsnrtowcs_r(<[ptr]>, <[dst]>, <[src]>, <[nms]>, <[len]>, <[ps]>)
  62.         struct _reent *<[ptr]>;
  63.         wchar_t *<[dst]>;
  64.         const char **<[src]>;
  65.         size_t <[nms]>;
  66.         size_t <[len]>;
  67.         mbstate_t *<[ps]>;
  68.  
  69. DESCRIPTION
  70. The <<mbsrtowcs>> function converts a sequence of multibyte characters
  71. pointed to indirectly by <[src]> into a sequence of corresponding wide
  72. characters and stores at most <[len]> of them in the wchar_t array pointed
  73. to by <[dst]>, until it encounters a terminating null character ('\0').
  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, <<mbsrtowcs>> uses an internal, static mbstate_t object, which
  83. is initialized to the initial conversion state at program startup.
  84.  
  85. The <<mbsnrtowcs>> function behaves identically to <<mbsrtowcs>>, except that
  86. conversion stops after reading at most <[nms]> bytes from the buffer pointed
  87. to by <[src]>.
  88.  
  89. RETURNS
  90. The <<mbsrtowcs>> and <<mbsnrtowcs>> functions return the number of wide
  91. characters stored in the array pointed to by <[dst]> if successful, otherwise
  92. it returns (size_t)-1.
  93.  
  94. PORTABILITY
  95. <<mbsrtowcs>> is defined by the C99 standard.
  96. <<mbsnrtowcs>> 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.  
  106. size_t
  107. _DEFUN (_mbsnrtowcs_r, (r, dst, src, nms, len, ps),
  108.         struct _reent *r _AND
  109.         wchar_t *dst _AND
  110.         const char **src _AND
  111.         size_t nms _AND
  112.         size_t len _AND
  113.         mbstate_t *ps)
  114. {
  115.   wchar_t *ptr = dst;
  116.   const char *tmp_src;
  117.   size_t max;
  118.   size_t count = 0;
  119.   int bytes;
  120.  
  121. #ifdef _MB_CAPABLE
  122.   if (ps == NULL)
  123.     {
  124.       _REENT_CHECK_MISC(r);
  125.       ps = &(_REENT_MBSRTOWCS_STATE(r));
  126.     }
  127. #endif
  128.  
  129.   if (dst == NULL)
  130.     {
  131.       /* Ignore original len value and do not alter src pointer if the
  132.          dst pointer is NULL.  */
  133.       len = (size_t)-1;
  134.       tmp_src = *src;
  135.       src = &tmp_src;
  136.     }      
  137.  
  138.   max = len;
  139.   while (len > 0)
  140.     {
  141.       bytes = _mbrtowc_r (r, ptr, *src, nms, ps);
  142.       if (bytes > 0)
  143.         {
  144.           *src += bytes;
  145.           nms -= bytes;
  146.           ++count;
  147.           ptr = (dst == NULL) ? NULL : ptr + 1;
  148.           --len;
  149.         }
  150.       else if (bytes == -2)
  151.         {
  152.           *src += nms;
  153.           return count;
  154.         }
  155.       else if (bytes == 0)
  156.         {
  157.           *src = NULL;
  158.           return count;
  159.         }
  160.       else
  161.         {
  162.           ps->__count = 0;
  163.           r->_errno = EILSEQ;
  164.           return (size_t)-1;
  165.         }
  166.     }
  167.  
  168.   return (size_t)max;
  169. }
  170.  
  171. #ifndef _REENT_ONLY
  172. size_t
  173. _DEFUN (mbsnrtowcs, (dst, src, nms, len, ps),
  174.         wchar_t *__restrict dst _AND
  175.         const char **__restrict src _AND
  176.         size_t nms _AND
  177.         size_t len _AND
  178.         mbstate_t *__restrict ps)
  179. {
  180.   return _mbsnrtowcs_r (_REENT, dst, src, nms, len, ps);
  181. }
  182. #endif /* !_REENT_ONLY */
  183.