wint_t __fputwc (struct _reent *ptr, wchar_t wc, FILE *fp) { char buf[MB_LEN_MAX]; size_t i, len; if (MB_CUR_MAX == 1 && wc > 0 && wc <= UCHAR_MAX) { /* * Assume single-byte locale with no special encoding. * A more careful test would be to check * _CurrentRuneLocale->encoding. */ *buf = (unsigned char)wc; len = 1; } else { if ((len = _wcrtomb_r (ptr, buf, wc, &fp->_mbstate)) == (size_t) -1) { fp->_flags |= __SERR; return WEOF; } } for (i = 0; i < len; i++) if (__sputc_r (ptr, (unsigned char) buf[i], fp) == EOF) return WEOF; return (wint_t) wc; }
/* * A subroutine version of the macro putc. */ #undef putc int _DEFUN(_putc_r, (ptr, c, fp), struct _reent *ptr _AND int c _AND register FILE *fp) { int result; CHECK_INIT (ptr, fp); _newlib_flockfile_start (fp); result = __sputc_r (ptr, c, fp); _newlib_flockfile_end (fp); return result; } #ifndef _REENT_ONLY int _DEFUN(putc, (c, fp), int c _AND register FILE *fp) { #if !defined(PREFER_SIZE_OVER_SPEED) && !defined(__OPTIMIZE_SIZE__) int result; CHECK_INIT (_REENT, fp); _newlib_flockfile_start (fp); result = __sputc_r (_REENT, c, fp);