Contiki 2.6
|
00001 #include <reent.h> 00002 #include <wchar.h> 00003 #include <stdlib.h> 00004 #include <stdio.h> 00005 #include <errno.h> 00006 00007 #if defined( _SMALL_PRINTF ) || defined(SMALL_SCANF) 00008 #define _ASCII_CAR 00009 #endif 00010 00011 size_t 00012 _DEFUN (_wcsrtombs_r, (r, dst, src, len, ps), 00013 struct _reent *r _AND 00014 char *dst _AND 00015 const wchar_t **src _AND 00016 size_t len _AND 00017 mbstate_t *ps) 00018 { 00019 00020 00021 char *ptr = dst; 00022 char buff[10]; 00023 wchar_t *pwcs; 00024 size_t n; 00025 int i; 00026 00027 #ifdef MB_CAPABLE 00028 if (ps == NULL) 00029 { 00030 _REENT_CHECK_MISC(r); 00031 ps = &(_REENT_WCSRTOMBS_STATE(r)); 00032 } 00033 #endif 00034 00035 /* If no dst pointer, treat len as maximum possible value. */ 00036 if (dst == NULL) 00037 len = (size_t)-1; 00038 00039 n = 0; 00040 pwcs = (wchar_t *)(*src); 00041 00042 while (n < len) 00043 { 00044 int count = ps->__count; 00045 wint_t wch = ps->__value.__wch; 00046 #ifndef _ASCII_CAR 00047 int bytes = _wcrtomb_r (r, buff, *pwcs, ps); 00048 if (bytes == -1) 00049 { 00050 r->_errno = EILSEQ; 00051 ps->__count = 0; 00052 return (size_t)-1; 00053 } 00054 #else 00055 int bytes = 1 ; 00056 #endif 00057 00058 if (n <= len - bytes && bytes < len) 00059 { 00060 n += bytes; 00061 if (dst) 00062 { 00063 for (i = 0; i < bytes; ++i) 00064 *ptr++ = buff[i]; 00065 ++(*src); 00066 } 00067 if (*pwcs++ == 0x00) 00068 { 00069 if (dst) 00070 *src = NULL; 00071 ps->__count = 0; 00072 return n - 1; 00073 } 00074 } 00075 else 00076 { 00077 /* not enough room, we must back up state to before _wctomb_r call */ 00078 ps->__count = count; 00079 ps->__value.__wch = wch; 00080 len = 0; 00081 } 00082 } 00083 00084 return n; 00085 } 00086 00087 #ifndef _REENT_ONLY 00088 size_t 00089 _DEFUN (wcsrtombs, (dst, src, len, ps), 00090 char *dst _AND 00091 const wchar_t **src _AND 00092 size_t len _AND 00093 mbstate_t *ps) 00094 { 00095 return _wcsrtombs_r (_REENT, dst, src, len, ps); 00096 } 00097 #endif /* !_REENT_ONLY */