Contiki 2.5
small_wcsrtombs.c
1 #include <reent.h>
2 #include <wchar.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <errno.h>
6 
7 #if defined( _SMALL_PRINTF ) || defined(SMALL_SCANF)
8  #define _ASCII_CAR
9  #endif
10 
11 size_t
12 _DEFUN (_wcsrtombs_r, (r, dst, src, len, ps),
13  struct _reent *r _AND
14  char *dst _AND
15  const wchar_t **src _AND
16  size_t len _AND
17  mbstate_t *ps)
18 {
19 
20 
21  char *ptr = dst;
22  char buff[10];
23  wchar_t *pwcs;
24  size_t n;
25  int i;
26 
27 #ifdef MB_CAPABLE
28  if (ps == NULL)
29  {
30  _REENT_CHECK_MISC(r);
31  ps = &(_REENT_WCSRTOMBS_STATE(r));
32  }
33 #endif
34 
35  /* If no dst pointer, treat len as maximum possible value. */
36  if (dst == NULL)
37  len = (size_t)-1;
38 
39  n = 0;
40  pwcs = (wchar_t *)(*src);
41 
42  while (n < len)
43  {
44  int count = ps->__count;
45  wint_t wch = ps->__value.__wch;
46  #ifndef _ASCII_CAR
47  int bytes = _wcrtomb_r (r, buff, *pwcs, ps);
48  if (bytes == -1)
49  {
50  r->_errno = EILSEQ;
51  ps->__count = 0;
52  return (size_t)-1;
53  }
54  #else
55  int bytes = 1 ;
56  #endif
57 
58  if (n <= len - bytes && bytes < len)
59  {
60  n += bytes;
61  if (dst)
62  {
63  for (i = 0; i < bytes; ++i)
64  *ptr++ = buff[i];
65  ++(*src);
66  }
67  if (*pwcs++ == 0x00)
68  {
69  if (dst)
70  *src = NULL;
71  ps->__count = 0;
72  return n - 1;
73  }
74  }
75  else
76  {
77  /* not enough room, we must back up state to before _wctomb_r call */
78  ps->__count = count;
79  ps->__value.__wch = wch;
80  len = 0;
81  }
82  }
83 
84  return n;
85 }
86 
87 #ifndef _REENT_ONLY
88 size_t
89 _DEFUN (wcsrtombs, (dst, src, len, ps),
90  char *dst _AND
91  const wchar_t **src _AND
92  size_t len _AND
93  mbstate_t *ps)
94 {
95  return _wcsrtombs_r (_REENT, dst, src, len, ps);
96 }
97 #endif /* !_REENT_ONLY */