Deleted Added
sdiff udiff text old ( 227753 ) new ( 234799 )
full compact
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}