wint_t btowc (int c) { mbstate_t mbs; int retval = 0; wchar_t pwc; unsigned char b; if (c == EOF) return WEOF; b = (unsigned char)c; /* Put mbs in initial state. */ memset (&mbs, '\0', sizeof (mbs)); _REENT_CHECK_MISC(_REENT); retval = __mbtowc (_REENT, &pwc, &b, 1, __locale_charset (), &mbs); if (retval != 0 && retval != 1) return WEOF; return (wint_t)pwc; }
size_t _mbrtowc_r (struct _reent *ptr, wchar_t *pwc, const char *s, size_t n, 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, ps); else retval = __MBTOWC (ptr, pwc, s, n, ps); if (retval == -1) { ps->__count = 0; __errno_r(ptr) = EILSEQ; return (size_t)(-1); } else return (size_t)retval; }
int * __getdate_err () { struct _reent *ptr = _REENT; _REENT_CHECK_MISC(ptr); return _REENT_GETDATE_ERR_P(ptr); }
int wctob (wint_t wc) { mbstate_t mbs; unsigned char pmb[MB_LEN_MAX]; if (wc == WEOF) return EOF; /* Put mbs in initial state. */ memset (&mbs, '\0', sizeof (mbs)); _REENT_CHECK_MISC(_REENT); return __wctomb (_REENT, (char *) pmb, wc, __locale_charset (), &mbs) == 1 ? (int) pmb[0] : EOF; }
int wctob (wint_t c) { mbstate_t mbs; int retval = 0; unsigned char pwc; /* Put mbs in initial state. */ memset (&mbs, '\0', sizeof (mbs)); _REENT_CHECK_MISC(_REENT); retval = _wctomb_r (_REENT, &pwc, c, &mbs); if (c == EOF || retval != 1) return WEOF; else return (int)pwc; }
wint_t btowc (int c) { mbstate_t mbs; int retval = 0; wchar_t pwc; unsigned char b; b = (unsigned char)c; /* Put mbs in initial state. */ memset (&mbs, '\0', sizeof (mbs)); _REENT_CHECK_MISC(_REENT); retval = _mbtowc_r (_REENT, &pwc, &b, 1, &mbs); if (c == EOF || retval != 1) return WEOF; else return (wint_t)pwc; }
size_t _wcsnrtombs_l (struct _reent *r, char *dst, const wchar_t **src, size_t nwc, size_t len, mbstate_t *ps, struct __locale_t *loc) { char *ptr = dst; char buff[10]; wchar_t *pwcs; size_t n; int i; #ifdef _MB_CAPABLE if (ps == NULL) { _REENT_CHECK_MISC(r); ps = &(_REENT_WCSRTOMBS_STATE(r)); } #endif /* If no dst pointer, treat len as maximum possible value. */ if (dst == NULL) len = (size_t)-1; n = 0; pwcs = (wchar_t *)(*src); while (n < len && nwc-- > 0) { int count = ps->__count; wint_t wch = ps->__value.__wch; int bytes = loc->wctomb (r, buff, *pwcs, ps); if (bytes == -1) { __errno_r(r) = EILSEQ; ps->__count = 0; return (size_t)-1; } if (n + bytes <= len) { n += bytes; if (dst) { for (i = 0; i < bytes; ++i) *ptr++ = buff[i]; ++(*src); } if (*pwcs++ == 0x00) { if (dst) *src = NULL; ps->__count = 0; return n - 1; } } else { /* not enough room, we must back up state to before __WCTOMB call */ ps->__count = count; ps->__value.__wch = wch; len = 0; } } return n; }