OSDN Git Service

Enable to track git://github.com/monaka/binutils.git
[pf3gnuchains/pf3gnuchains3x.git] / newlib / libc / stdlib / mbsnrtowcs.c
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 *<[dst]>, const char **<[src]>, size_t <[len]>,
17                          mbstate_t *<[ps]>);
18
19         #include <wchar.h>
20         size_t _mbsrtowcs_r(struct _reent *<[ptr]>, wchar_t *<[dst]>,
21                             const char **<[src]>, size_t <[len]>,
22                             mbstate_t *<[ps]>);
23
24         #include <wchar.h>
25         size_t mbsnrtowcs(wchar_t *<[dst]>, const char **<[src]>,
26                           size_t <[nms]>, size_t <[len]>, mbstate_t *<[ps]>);
27
28         #include <wchar.h>
29         size_t _mbsnrtowcs_r(struct _reent *<[ptr]>, wchar_t *<[dst]>,
30                              const char **<[src]>, size_t <[nms]>,
31                              size_t <[len]>, mbstate_t *<[ps]>);
32
33 TRAD_SYNOPSIS
34         #include <wchar.h>
35         size_t mbsrtowcs(<[dst]>, <[src]>, <[len]>, <[ps]>)
36         wchar_t *<[dst]>;
37         const char **<[src]>;
38         size_t <[len]>;
39         mbstate_t *<[ps]>;
40
41         #include <wchar.h>
42         size_t _mbsrtowcs_r(<[ptr]>, <[dst]>, <[src]>, <[len]>, <[ps]>)
43         struct _reent *<[ptr]>;
44         wchar_t *<[dst]>;
45         const char **<[src]>;
46         size_t <[len]>;
47         mbstate_t *<[ps]>;
48
49         #include <wchar.h>
50         size_t mbsnrtowcs(<[dst]>, <[src]>, <[nms]>, <[len]>, <[ps]>)
51         wchar_t *<[dst]>;
52         const char **<[src]>;
53         size_t <[nms]>;
54         size_t <[len]>;
55         mbstate_t *<[ps]>;
56
57         #include <wchar.h>
58         size_t _mbsnrtowcs_r(<[ptr]>, <[dst]>, <[src]>, <[nms]>, <[len]>, <[ps]>)
59         struct _reent *<[ptr]>;
60         wchar_t *<[dst]>;
61         const char **<[src]>;
62         size_t <[nms]>;
63         size_t <[len]>;
64         mbstate_t *<[ps]>;
65
66 DESCRIPTION
67 The <<mbsrtowcs>> function converts a sequence of multibyte characters
68 pointed to indirectly by <[src]> into a sequence of corresponding wide
69 characters and stores at most <[len]> of them in the wchar_t array pointed
70 to by <[dst]>, until it encounters a terminating null character ('\0').
71
72 If <[dst]> is NULL, no characters are stored.
73
74 If <[dst]> is not NULL, the pointer pointed to by <[src]> is updated to point
75 to the character after the one that conversion stopped at.  If conversion
76 stops because a null character is encountered, *<[src]> is set to NULL.
77
78 The mbstate_t argument, <[ps]>, is used to keep track of the shift state.  If
79 it is NULL, <<mbsrtowcs>> uses an internal, static mbstate_t object, which
80 is initialized to the initial conversion state at program startup.
81
82 The <<mbsnrtowcs>> function behaves identically to <<mbsrtowcs>>, except that
83 conversion stops after reading at most <[nms]> bytes from the buffer pointed
84 to by <[src]>.
85
86 RETURNS
87 The <<mbsrtowcs>> and <<mbsnrtowcs>> functions return the number of wide
88 characters stored in the array pointed to by <[dst]> if successful, otherwise
89 it returns (size_t)-1.
90
91 PORTABILITY
92 <<mbsrtowcs>> is defined by the C99 standard.
93 <<mbsnrtowcs>> is defined by the POSIX.1-2008 standard.
94 */
95
96 #include <reent.h>
97 #include <newlib.h>
98 #include <wchar.h>
99 #include <stdlib.h>
100 #include <stdio.h>
101 #include <errno.h>
102
103 size_t
104 _DEFUN (_mbsnrtowcs_r, (r, dst, src, nms, len, ps), 
105         struct _reent *r _AND
106         wchar_t *dst _AND
107         const char **src _AND
108         size_t nms _AND
109         size_t len _AND
110         mbstate_t *ps)
111 {
112   wchar_t *ptr = dst;
113   const char *tmp_src;
114   size_t max;
115   size_t count = 0;
116   int bytes;
117
118 #ifdef _MB_CAPABLE
119   if (ps == NULL)
120     {
121       _REENT_CHECK_MISC(r);
122       ps = &(_REENT_MBSRTOWCS_STATE(r));
123     }
124 #endif
125
126   if (dst == NULL)
127     {
128       /* Ignore original len value and do not alter src pointer if the
129          dst pointer is NULL.  */
130       len = (size_t)-1;
131       tmp_src = *src;
132       src = &tmp_src;
133     }      
134   
135   max = len;
136   while (len > 0)
137     {
138       bytes = _mbrtowc_r (r, ptr, *src, nms, ps);
139       if (bytes > 0)
140         {
141           *src += bytes;
142           nms -= bytes;
143           ++count;
144           ptr = (dst == NULL) ? NULL : ptr + 1;
145           --len;
146         }
147       else if (bytes == -2)
148         {
149           *src += nms;
150           return count;
151         }
152       else if (bytes == 0)
153         {
154           *src = NULL;
155           return count;
156         }
157       else
158         {
159           ps->__count = 0;
160           r->_errno = EILSEQ;
161           return (size_t)-1;
162         }
163     }
164
165   return (size_t)max;
166 }
167
168 #ifndef _REENT_ONLY
169 size_t
170 _DEFUN (mbsnrtowcs, (dst, src, nms, len, ps),
171         wchar_t *dst _AND
172         const char **src _AND
173         size_t nms _AND
174         size_t len _AND
175         mbstate_t *ps)
176 {
177   return _mbsnrtowcs_r (_REENT, dst, src, nms, len, ps);
178 }
179 #endif /* !_REENT_ONLY */