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 <string.h>
 | |
| #include "local.h"
 | |
| 
 | |
| size_t
 | |
| _DEFUN (_mbrtowc_r, (ptr, pwc, s, n, ps),
 | |
| 	struct _reent *ptr _AND
 | |
| 	wchar_t *pwc _AND
 | |
| 	const char *s _AND
 | |
| 	size_t n _AND
 | |
| 	mbstate_t *ps)
 | |
| {
 | |
|   int retval = 0;
 | |
| 
 | |
| #ifdef _MB_CAPABLE
 | |
|   if (ps == NULL)
 | |
|     {
 | |
|       _REENT_CHECK_MISC(ptr);
 | |
|       ps = &(_REENT_MBRTOWC_STATE(ptr));
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|   if (s == NULL)
 | |
|     retval = __mbtowc (ptr, NULL, "", 1, __locale_charset (), ps);
 | |
|   else
 | |
|     retval = __mbtowc (ptr, pwc, s, n, __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 (mbrtowc, (pwc, s, n, ps),
 | |
| 	wchar_t *pwc _AND
 | |
| 	const char *s _AND
 | |
| 	size_t n _AND
 | |
| 	mbstate_t *ps)
 | |
| {
 | |
| #if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__)
 | |
|   return _mbrtowc_r (_REENT, pwc, s, n, ps);
 | |
| #else
 | |
|   int retval = 0;
 | |
| 
 | |
| #ifdef _MB_CAPABLE
 | |
|   if (ps == NULL)
 | |
|     {
 | |
|       _REENT_CHECK_MISC(_REENT);
 | |
|       ps = &(_REENT_MBRTOWC_STATE(_REENT));
 | |
|     }
 | |
| #endif
 | |
| 
 | |
|   if (s == NULL)
 | |
|     retval = __mbtowc (_REENT, NULL, "", 1, __locale_charset (), ps);
 | |
|   else
 | |
|     retval = __mbtowc (_REENT, pwc, s, n, __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 */
 |