80 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <reent.h>
 | |
| #include <newlib.h>
 | |
| #include <wchar.h>
 | |
| #include <stdlib.h>
 | |
| #include <stdio.h>
 | |
| #include <errno.h>
 | |
| #include "local.h"
 | |
| 
 | |
| size_t
 | |
| _DEFUN (_wcrtomb_r, (ptr, s, wc, ps),
 | |
| 	struct _reent *ptr _AND
 | |
| 	char *s _AND
 | |
| 	wchar_t wc _AND
 | |
| 	mbstate_t *ps)
 | |
| {
 | |
|   int retval = 0;
 | |
|   char buf[10];
 | |
| 
 | |
| #ifdef _MB_CAPABLE
 | |
|   if (ps == NULL)
 | |
|     {
 | |
|       _REENT_CHECK_MISC(ptr);
 | |
|       ps = &(_REENT_WCRTOMB_STATE(ptr));
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|   if (s == NULL)
 | |
|     retval = __wctomb (ptr, buf, L'\0', __locale_charset (), ps);
 | |
|   else
 | |
|     retval = __wctomb (ptr, s, wc, __locale_charset (), ps);
 | |
| 
 | |
|   if (retval == -1)
 | |
|     {
 | |
|       ps->__count = 0;
 | |
|       ptr->_errno = EILSEQ;
 | |
|       return (size_t)(-1);
 | |
|     }
 | |
|   else
 | |
|     return (size_t)retval;
 | |
| }
 | |
| 
 | |
| #ifndef _REENT_ONLY
 | |
| size_t
 | |
| _DEFUN (wcrtomb, (s, wc, ps),
 | |
| 	char *__restrict s _AND
 | |
| 	wchar_t wc _AND
 | |
| 	mbstate_t *__restrict ps)
 | |
| {
 | |
| #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
 | |
|   return _wcrtomb_r (_REENT, s, wc, ps);
 | |
| #else
 | |
|   int retval = 0;
 | |
|   struct _reent *reent = _REENT;
 | |
|   char buf[10];
 | |
| 
 | |
| #ifdef _MB_CAPABLE
 | |
|   if (ps == NULL)
 | |
|     {
 | |
|       _REENT_CHECK_MISC(reent);
 | |
|       ps = &(_REENT_WCRTOMB_STATE(reent));
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|   if (s == NULL)
 | |
|     retval = __wctomb (reent, buf, L'\0', __locale_charset (), ps);
 | |
|   else
 | |
|     retval = __wctomb (reent, s, wc, __locale_charset (), ps);
 | |
| 
 | |
|   if (retval == -1)
 | |
|     {
 | |
|       ps->__count = 0;
 | |
|       reent->_errno = EILSEQ;
 | |
|       return (size_t)(-1);
 | |
|     }
 | |
|   else
 | |
|     return (size_t)retval;
 | |
| #endif /* not PREFER_SIZE_OVER_SPEED */
 | |
| }
 | |
| #endif /* !_REENT_ONLY */
 |