xref: /aosp_15_r20/external/musl/src/stdio/fgetws.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
2*c9945492SAndroid Build Coastguard Worker #include <wchar.h>
3*c9945492SAndroid Build Coastguard Worker 
4*c9945492SAndroid Build Coastguard Worker wint_t __fgetwc_unlocked(FILE *);
5*c9945492SAndroid Build Coastguard Worker 
fgetws(wchar_t * restrict s,int n,FILE * restrict f)6*c9945492SAndroid Build Coastguard Worker wchar_t *fgetws(wchar_t *restrict s, int n, FILE *restrict f)
7*c9945492SAndroid Build Coastguard Worker {
8*c9945492SAndroid Build Coastguard Worker 	wchar_t *p = s;
9*c9945492SAndroid Build Coastguard Worker 
10*c9945492SAndroid Build Coastguard Worker 	if (!n--) return s;
11*c9945492SAndroid Build Coastguard Worker 
12*c9945492SAndroid Build Coastguard Worker 	FLOCK(f);
13*c9945492SAndroid Build Coastguard Worker 
14*c9945492SAndroid Build Coastguard Worker 	for (; n; n--) {
15*c9945492SAndroid Build Coastguard Worker 		wint_t c = __fgetwc_unlocked(f);
16*c9945492SAndroid Build Coastguard Worker 		if (c == WEOF) break;
17*c9945492SAndroid Build Coastguard Worker 		*p++ = c;
18*c9945492SAndroid Build Coastguard Worker 		if (c == '\n') break;
19*c9945492SAndroid Build Coastguard Worker 	}
20*c9945492SAndroid Build Coastguard Worker 	*p = 0;
21*c9945492SAndroid Build Coastguard Worker 	if (ferror(f)) p = s;
22*c9945492SAndroid Build Coastguard Worker 
23*c9945492SAndroid Build Coastguard Worker 	FUNLOCK(f);
24*c9945492SAndroid Build Coastguard Worker 
25*c9945492SAndroid Build Coastguard Worker 	return (p == s) ? NULL : s;
26*c9945492SAndroid Build Coastguard Worker }
27*c9945492SAndroid Build Coastguard Worker 
28*c9945492SAndroid Build Coastguard Worker weak_alias(fgetws, fgetws_unlocked);
29