1/*- 2 * Copyright (c) 2002-2004 Tim J. Robbins. 3 * All rights reserved. 4 * 5 * Copyright (c) 2011 The FreeBSD Foundation 6 * All rights reserved. 7 * Portions of this software were developed by David Chisnall 8 * under sponsorship from the FreeBSD Foundation. --- 16 unchanged lines hidden (view full) --- 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32#include <sys/cdefs.h> |
33__FBSDID("$FreeBSD: head/lib/libc/stdio/fgetwc.c 234799 2012-04-29 16:28:39Z das $"); |
34 35#include "namespace.h" 36#include <errno.h> 37#include <stdio.h> 38#include <stdlib.h> 39#include <wchar.h> 40#include "un-namespace.h" 41#include "libc_private.h" --- 12 unchanged lines hidden (view full) --- 54 55 FLOCKFILE(fp); 56 ORIENT(fp, 1); 57 r = __fgetwc(fp, locale); 58 FUNLOCKFILE(fp); 59 60 return (r); 61} |
62 |
63wint_t 64fgetwc(FILE *fp) 65{ 66 return fgetwc_l(fp, __get_locale()); 67} 68 69/* |
70 * Internal (non-MPSAFE) version of fgetwc(). This version takes an 71 * mbstate_t argument specifying the initial conversion state. For 72 * wide streams, this should always be fp->_mbstate. On return, *nread 73 * is set to the number of bytes read. |
74 */ |
75wint_t 76__fgetwc_mbs(FILE *fp, mbstate_t *mbs, int *nread, locale_t locale) |
77{ 78 wchar_t wc; 79 size_t nconv; 80 struct xlocale_ctype *l = XLOCALE_CTYPE(locale); 81 |
82 if (fp->_r <= 0 && __srefill(fp)) { 83 *nread = 0; |
84 return (WEOF); |
85 } |
86 if (MB_CUR_MAX == 1) { 87 /* Fast path for single-byte encodings. */ 88 wc = *fp->_p++; 89 fp->_r--; |
90 *nread = 1; |
91 return (wc); 92 } |
93 *nread = 0; |
94 do { |
95 nconv = l->__mbrtowc(&wc, fp->_p, fp->_r, mbs); |
96 if (nconv == (size_t)-1) 97 break; 98 else if (nconv == (size_t)-2) 99 continue; 100 else if (nconv == 0) { |
101 fp->_p++; 102 fp->_r--; |
103 (*nread)++; |
104 return (L'\0'); 105 } else { 106 fp->_p += nconv; 107 fp->_r -= nconv; |
108 *nread += nconv; |
109 return (wc); 110 } 111 } while (__srefill(fp) == 0); 112 fp->_flags |= __SERR; 113 errno = EILSEQ; 114 return (WEOF); 115} |