fgetwc.c (8fa0b743820f61c661ba5f3ea0e3be0dc137910e) | fgetwc.c (d7af8cf14be778fbf7f6ebc84346ae88fbd6978f) |
---|---|
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. --- 45 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} | 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. --- 45 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 |
|
62wint_t 63fgetwc(FILE *fp) 64{ 65 return fgetwc_l(fp, __get_locale()); 66} 67 68/* | 63wint_t 64fgetwc(FILE *fp) 65{ 66 return fgetwc_l(fp, __get_locale()); 67} 68 69/* |
69 * Non-MT-safe version. | 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. |
70 */ | 74 */ |
71wint_t 72__fgetwc(FILE *fp, locale_t locale) | 75wint_t 76__fgetwc_mbs(FILE *fp, mbstate_t *mbs, int *nread, locale_t locale) |
73{ 74 wchar_t wc; 75 size_t nconv; 76 struct xlocale_ctype *l = XLOCALE_CTYPE(locale); 77 | 77{ 78 wchar_t wc; 79 size_t nconv; 80 struct xlocale_ctype *l = XLOCALE_CTYPE(locale); 81 |
78 if (fp->_r <= 0 && __srefill(fp)) | 82 if (fp->_r <= 0 && __srefill(fp)) { 83 *nread = 0; |
79 return (WEOF); | 84 return (WEOF); |
85 } |
|
80 if (MB_CUR_MAX == 1) { 81 /* Fast path for single-byte encodings. */ 82 wc = *fp->_p++; 83 fp->_r--; | 86 if (MB_CUR_MAX == 1) { 87 /* Fast path for single-byte encodings. */ 88 wc = *fp->_p++; 89 fp->_r--; |
90 *nread = 1; |
|
84 return (wc); 85 } | 91 return (wc); 92 } |
93 *nread = 0; |
|
86 do { | 94 do { |
87 nconv = l->__mbrtowc(&wc, fp->_p, fp->_r, &fp->_mbstate); | 95 nconv = l->__mbrtowc(&wc, fp->_p, fp->_r, mbs); |
88 if (nconv == (size_t)-1) 89 break; 90 else if (nconv == (size_t)-2) 91 continue; 92 else if (nconv == 0) { | 96 if (nconv == (size_t)-1) 97 break; 98 else if (nconv == (size_t)-2) 99 continue; 100 else if (nconv == 0) { |
93 /* 94 * Assume that the only valid representation of 95 * the null wide character is a single null byte. 96 */ | |
97 fp->_p++; 98 fp->_r--; | 101 fp->_p++; 102 fp->_r--; |
103 (*nread)++; |
|
99 return (L'\0'); 100 } else { 101 fp->_p += nconv; 102 fp->_r -= nconv; | 104 return (L'\0'); 105 } else { 106 fp->_p += nconv; 107 fp->_r -= nconv; |
108 *nread += nconv; |
|
103 return (wc); 104 } 105 } while (__srefill(fp) == 0); 106 fp->_flags |= __SERR; 107 errno = EILSEQ; 108 return (WEOF); 109} | 109 return (wc); 110 } 111 } while (__srefill(fp) == 0); 112 fp->_flags |= __SERR; 113 errno = EILSEQ; 114 return (WEOF); 115} |