OLD | NEW |
1 #include "stdio_impl.h" | 1 #include "stdio_impl.h" |
2 #include "locale_impl.h" | 2 #include "locale_impl.h" |
3 #include <wchar.h> | 3 #include <wchar.h> |
4 #include <errno.h> | 4 #include <errno.h> |
5 | 5 |
6 static wint_t __fgetwc_unlocked_internal(FILE *f) | 6 static wint_t __fgetwc_unlocked_internal(FILE* f) { |
7 { | 7 mbstate_t st = {0}; |
8 » mbstate_t st = { 0 }; | 8 wchar_t wc; |
9 » wchar_t wc; | 9 int c; |
10 » int c; | 10 unsigned char b; |
11 » unsigned char b; | 11 size_t l; |
12 » size_t l; | |
13 | 12 |
14 » /* Convert character from buffer if possible */ | 13 /* Convert character from buffer if possible */ |
15 » if (f->rpos < f->rend) { | 14 if (f->rpos < f->rend) { |
16 » » l = mbrtowc(&wc, (void *)f->rpos, f->rend - f->rpos, &st); | 15 l = mbrtowc(&wc, (void*)f->rpos, f->rend - f->rpos, &st); |
17 » » if (l+2 >= 2) { | 16 if (l + 2 >= 2) { |
18 » » » f->rpos += l + !l; /* l==0 means 1 byte, null */ | 17 f->rpos += l + !l; /* l==0 means 1 byte, null */ |
19 » » » return wc; | 18 return wc; |
20 » » } | 19 } |
21 » » if (l == -1) { | 20 if (l == -1) { |
22 » » » f->rpos++; | 21 f->rpos++; |
23 » » » return WEOF; | 22 return WEOF; |
24 » » } | 23 } |
25 » } else l = -2; | 24 } else |
| 25 l = -2; |
26 | 26 |
27 » /* Convert character byte-by-byte */ | 27 /* Convert character byte-by-byte */ |
28 » while (l == -2) { | 28 while (l == -2) { |
29 » » b = c = getc_unlocked(f); | 29 b = c = getc_unlocked(f); |
30 » » if (c < 0) { | 30 if (c < 0) { |
31 » » » if (!mbsinit(&st)) errno = EILSEQ; | 31 if (!mbsinit(&st)) |
32 » » » return WEOF; | 32 errno = EILSEQ; |
33 » » } | 33 return WEOF; |
34 » » l = mbrtowc(&wc, (void *)&b, 1, &st); | 34 } |
35 » » if (l == -1) return WEOF; | 35 l = mbrtowc(&wc, (void*)&b, 1, &st); |
36 » } | 36 if (l == -1) |
| 37 return WEOF; |
| 38 } |
37 | 39 |
38 » return wc; | 40 return wc; |
39 } | 41 } |
40 | 42 |
41 wint_t __fgetwc_unlocked(FILE *f) | 43 wint_t __fgetwc_unlocked(FILE* f) { |
42 { | 44 locale_t *ploc = &CURRENT_LOCALE, loc = *ploc; |
43 » locale_t *ploc = &CURRENT_LOCALE, loc = *ploc; | 45 if (f->mode <= 0) |
44 » if (f->mode <= 0) fwide(f, 1); | 46 fwide(f, 1); |
45 » *ploc = f->locale; | 47 *ploc = f->locale; |
46 » wchar_t wc = __fgetwc_unlocked_internal(f); | 48 wchar_t wc = __fgetwc_unlocked_internal(f); |
47 » *ploc = loc; | 49 *ploc = loc; |
48 » return wc; | 50 return wc; |
49 } | 51 } |
50 | 52 |
51 wint_t fgetwc(FILE *f) | 53 wint_t fgetwc(FILE* f) { |
52 { | 54 wint_t c; |
53 » wint_t c; | 55 FLOCK(f); |
54 » FLOCK(f); | 56 c = __fgetwc_unlocked(f); |
55 » c = __fgetwc_unlocked(f); | 57 FUNLOCK(f); |
56 » FUNLOCK(f); | 58 return c; |
57 » return c; | |
58 } | 59 } |
59 | 60 |
60 weak_alias(__fgetwc_unlocked, fgetwc_unlocked); | 61 weak_alias(__fgetwc_unlocked, fgetwc_unlocked); |
61 weak_alias(__fgetwc_unlocked, getwc_unlocked); | 62 weak_alias(__fgetwc_unlocked, getwc_unlocked); |
OLD | NEW |