xref: /aosp_15_r20/external/musl/src/stdio/vfscanf.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
2*c9945492SAndroid Build Coastguard Worker #include <stdarg.h>
3*c9945492SAndroid Build Coastguard Worker #include <ctype.h>
4*c9945492SAndroid Build Coastguard Worker #include <wchar.h>
5*c9945492SAndroid Build Coastguard Worker #include <wctype.h>
6*c9945492SAndroid Build Coastguard Worker #include <limits.h>
7*c9945492SAndroid Build Coastguard Worker #include <string.h>
8*c9945492SAndroid Build Coastguard Worker #include <stdint.h>
9*c9945492SAndroid Build Coastguard Worker 
10*c9945492SAndroid Build Coastguard Worker #include "stdio_impl.h"
11*c9945492SAndroid Build Coastguard Worker #include "shgetc.h"
12*c9945492SAndroid Build Coastguard Worker #include "intscan.h"
13*c9945492SAndroid Build Coastguard Worker #include "floatscan.h"
14*c9945492SAndroid Build Coastguard Worker 
15*c9945492SAndroid Build Coastguard Worker #define SIZE_hh -2
16*c9945492SAndroid Build Coastguard Worker #define SIZE_h  -1
17*c9945492SAndroid Build Coastguard Worker #define SIZE_def 0
18*c9945492SAndroid Build Coastguard Worker #define SIZE_l   1
19*c9945492SAndroid Build Coastguard Worker #define SIZE_L   2
20*c9945492SAndroid Build Coastguard Worker #define SIZE_ll  3
21*c9945492SAndroid Build Coastguard Worker 
store_int(void * dest,int size,unsigned long long i)22*c9945492SAndroid Build Coastguard Worker static void store_int(void *dest, int size, unsigned long long i)
23*c9945492SAndroid Build Coastguard Worker {
24*c9945492SAndroid Build Coastguard Worker 	if (!dest) return;
25*c9945492SAndroid Build Coastguard Worker 	switch (size) {
26*c9945492SAndroid Build Coastguard Worker 	case SIZE_hh:
27*c9945492SAndroid Build Coastguard Worker 		*(char *)dest = i;
28*c9945492SAndroid Build Coastguard Worker 		break;
29*c9945492SAndroid Build Coastguard Worker 	case SIZE_h:
30*c9945492SAndroid Build Coastguard Worker 		*(short *)dest = i;
31*c9945492SAndroid Build Coastguard Worker 		break;
32*c9945492SAndroid Build Coastguard Worker 	case SIZE_def:
33*c9945492SAndroid Build Coastguard Worker 		*(int *)dest = i;
34*c9945492SAndroid Build Coastguard Worker 		break;
35*c9945492SAndroid Build Coastguard Worker 	case SIZE_l:
36*c9945492SAndroid Build Coastguard Worker 		*(long *)dest = i;
37*c9945492SAndroid Build Coastguard Worker 		break;
38*c9945492SAndroid Build Coastguard Worker 	case SIZE_ll:
39*c9945492SAndroid Build Coastguard Worker 		*(long long *)dest = i;
40*c9945492SAndroid Build Coastguard Worker 		break;
41*c9945492SAndroid Build Coastguard Worker 	}
42*c9945492SAndroid Build Coastguard Worker }
43*c9945492SAndroid Build Coastguard Worker 
arg_n(va_list ap,unsigned int n)44*c9945492SAndroid Build Coastguard Worker static void *arg_n(va_list ap, unsigned int n)
45*c9945492SAndroid Build Coastguard Worker {
46*c9945492SAndroid Build Coastguard Worker 	void *p;
47*c9945492SAndroid Build Coastguard Worker 	unsigned int i;
48*c9945492SAndroid Build Coastguard Worker 	va_list ap2;
49*c9945492SAndroid Build Coastguard Worker 	va_copy(ap2, ap);
50*c9945492SAndroid Build Coastguard Worker 	for (i=n; i>1; i--) va_arg(ap2, void *);
51*c9945492SAndroid Build Coastguard Worker 	p = va_arg(ap2, void *);
52*c9945492SAndroid Build Coastguard Worker 	va_end(ap2);
53*c9945492SAndroid Build Coastguard Worker 	return p;
54*c9945492SAndroid Build Coastguard Worker }
55*c9945492SAndroid Build Coastguard Worker 
vfscanf(FILE * restrict f,const char * restrict fmt,va_list ap)56*c9945492SAndroid Build Coastguard Worker int vfscanf(FILE *restrict f, const char *restrict fmt, va_list ap)
57*c9945492SAndroid Build Coastguard Worker {
58*c9945492SAndroid Build Coastguard Worker 	int width;
59*c9945492SAndroid Build Coastguard Worker 	int size;
60*c9945492SAndroid Build Coastguard Worker 	int alloc = 0;
61*c9945492SAndroid Build Coastguard Worker 	int base;
62*c9945492SAndroid Build Coastguard Worker 	const unsigned char *p;
63*c9945492SAndroid Build Coastguard Worker 	int c, t;
64*c9945492SAndroid Build Coastguard Worker 	char *s;
65*c9945492SAndroid Build Coastguard Worker 	wchar_t *wcs;
66*c9945492SAndroid Build Coastguard Worker 	mbstate_t st;
67*c9945492SAndroid Build Coastguard Worker 	void *dest=NULL;
68*c9945492SAndroid Build Coastguard Worker 	int invert;
69*c9945492SAndroid Build Coastguard Worker 	int matches=0;
70*c9945492SAndroid Build Coastguard Worker 	unsigned long long x;
71*c9945492SAndroid Build Coastguard Worker 	long double y;
72*c9945492SAndroid Build Coastguard Worker 	off_t pos = 0;
73*c9945492SAndroid Build Coastguard Worker 	unsigned char scanset[257];
74*c9945492SAndroid Build Coastguard Worker 	size_t i, k;
75*c9945492SAndroid Build Coastguard Worker 	wchar_t wc;
76*c9945492SAndroid Build Coastguard Worker 
77*c9945492SAndroid Build Coastguard Worker 	FLOCK(f);
78*c9945492SAndroid Build Coastguard Worker 
79*c9945492SAndroid Build Coastguard Worker 	if (!f->rpos) __toread(f);
80*c9945492SAndroid Build Coastguard Worker 	if (!f->rpos) goto input_fail;
81*c9945492SAndroid Build Coastguard Worker 
82*c9945492SAndroid Build Coastguard Worker 	for (p=(const unsigned char *)fmt; *p; p++) {
83*c9945492SAndroid Build Coastguard Worker 
84*c9945492SAndroid Build Coastguard Worker 		alloc = 0;
85*c9945492SAndroid Build Coastguard Worker 
86*c9945492SAndroid Build Coastguard Worker 		if (isspace(*p)) {
87*c9945492SAndroid Build Coastguard Worker 			while (isspace(p[1])) p++;
88*c9945492SAndroid Build Coastguard Worker 			shlim(f, 0);
89*c9945492SAndroid Build Coastguard Worker 			while (isspace(shgetc(f)));
90*c9945492SAndroid Build Coastguard Worker 			shunget(f);
91*c9945492SAndroid Build Coastguard Worker 			pos += shcnt(f);
92*c9945492SAndroid Build Coastguard Worker 			continue;
93*c9945492SAndroid Build Coastguard Worker 		}
94*c9945492SAndroid Build Coastguard Worker 		if (*p != '%' || p[1] == '%') {
95*c9945492SAndroid Build Coastguard Worker 			shlim(f, 0);
96*c9945492SAndroid Build Coastguard Worker 			if (*p == '%') {
97*c9945492SAndroid Build Coastguard Worker 				p++;
98*c9945492SAndroid Build Coastguard Worker 				while (isspace((c=shgetc(f))));
99*c9945492SAndroid Build Coastguard Worker 			} else {
100*c9945492SAndroid Build Coastguard Worker 				c = shgetc(f);
101*c9945492SAndroid Build Coastguard Worker 			}
102*c9945492SAndroid Build Coastguard Worker 			if (c!=*p) {
103*c9945492SAndroid Build Coastguard Worker 				shunget(f);
104*c9945492SAndroid Build Coastguard Worker 				if (c<0) goto input_fail;
105*c9945492SAndroid Build Coastguard Worker 				goto match_fail;
106*c9945492SAndroid Build Coastguard Worker 			}
107*c9945492SAndroid Build Coastguard Worker 			pos += shcnt(f);
108*c9945492SAndroid Build Coastguard Worker 			continue;
109*c9945492SAndroid Build Coastguard Worker 		}
110*c9945492SAndroid Build Coastguard Worker 
111*c9945492SAndroid Build Coastguard Worker 		p++;
112*c9945492SAndroid Build Coastguard Worker 		if (*p=='*') {
113*c9945492SAndroid Build Coastguard Worker 			dest = 0; p++;
114*c9945492SAndroid Build Coastguard Worker 		} else if (isdigit(*p) && p[1]=='$') {
115*c9945492SAndroid Build Coastguard Worker 			dest = arg_n(ap, *p-'0'); p+=2;
116*c9945492SAndroid Build Coastguard Worker 		} else {
117*c9945492SAndroid Build Coastguard Worker 			dest = va_arg(ap, void *);
118*c9945492SAndroid Build Coastguard Worker 		}
119*c9945492SAndroid Build Coastguard Worker 
120*c9945492SAndroid Build Coastguard Worker 		for (width=0; isdigit(*p); p++) {
121*c9945492SAndroid Build Coastguard Worker 			width = 10*width + *p - '0';
122*c9945492SAndroid Build Coastguard Worker 		}
123*c9945492SAndroid Build Coastguard Worker 
124*c9945492SAndroid Build Coastguard Worker 		if (*p=='m') {
125*c9945492SAndroid Build Coastguard Worker 			wcs = 0;
126*c9945492SAndroid Build Coastguard Worker 			s = 0;
127*c9945492SAndroid Build Coastguard Worker 			alloc = !!dest;
128*c9945492SAndroid Build Coastguard Worker 			p++;
129*c9945492SAndroid Build Coastguard Worker 		} else {
130*c9945492SAndroid Build Coastguard Worker 			alloc = 0;
131*c9945492SAndroid Build Coastguard Worker 		}
132*c9945492SAndroid Build Coastguard Worker 
133*c9945492SAndroid Build Coastguard Worker 		size = SIZE_def;
134*c9945492SAndroid Build Coastguard Worker 		switch (*p++) {
135*c9945492SAndroid Build Coastguard Worker 		case 'h':
136*c9945492SAndroid Build Coastguard Worker 			if (*p == 'h') p++, size = SIZE_hh;
137*c9945492SAndroid Build Coastguard Worker 			else size = SIZE_h;
138*c9945492SAndroid Build Coastguard Worker 			break;
139*c9945492SAndroid Build Coastguard Worker 		case 'l':
140*c9945492SAndroid Build Coastguard Worker 			if (*p == 'l') p++, size = SIZE_ll;
141*c9945492SAndroid Build Coastguard Worker 			else size = SIZE_l;
142*c9945492SAndroid Build Coastguard Worker 			break;
143*c9945492SAndroid Build Coastguard Worker 		case 'j':
144*c9945492SAndroid Build Coastguard Worker 			size = SIZE_ll;
145*c9945492SAndroid Build Coastguard Worker 			break;
146*c9945492SAndroid Build Coastguard Worker 		case 'z':
147*c9945492SAndroid Build Coastguard Worker 		case 't':
148*c9945492SAndroid Build Coastguard Worker 			size = SIZE_l;
149*c9945492SAndroid Build Coastguard Worker 			break;
150*c9945492SAndroid Build Coastguard Worker 		case 'L':
151*c9945492SAndroid Build Coastguard Worker 			size = SIZE_L;
152*c9945492SAndroid Build Coastguard Worker 			break;
153*c9945492SAndroid Build Coastguard Worker 		case 'd': case 'i': case 'o': case 'u': case 'x':
154*c9945492SAndroid Build Coastguard Worker 		case 'a': case 'e': case 'f': case 'g':
155*c9945492SAndroid Build Coastguard Worker 		case 'A': case 'E': case 'F': case 'G': case 'X':
156*c9945492SAndroid Build Coastguard Worker 		case 's': case 'c': case '[':
157*c9945492SAndroid Build Coastguard Worker 		case 'S': case 'C':
158*c9945492SAndroid Build Coastguard Worker 		case 'p': case 'n':
159*c9945492SAndroid Build Coastguard Worker 			p--;
160*c9945492SAndroid Build Coastguard Worker 			break;
161*c9945492SAndroid Build Coastguard Worker 		default:
162*c9945492SAndroid Build Coastguard Worker 			goto fmt_fail;
163*c9945492SAndroid Build Coastguard Worker 		}
164*c9945492SAndroid Build Coastguard Worker 
165*c9945492SAndroid Build Coastguard Worker 		t = *p;
166*c9945492SAndroid Build Coastguard Worker 
167*c9945492SAndroid Build Coastguard Worker 		/* C or S */
168*c9945492SAndroid Build Coastguard Worker 		if ((t&0x2f) == 3) {
169*c9945492SAndroid Build Coastguard Worker 			t |= 32;
170*c9945492SAndroid Build Coastguard Worker 			size = SIZE_l;
171*c9945492SAndroid Build Coastguard Worker 		}
172*c9945492SAndroid Build Coastguard Worker 
173*c9945492SAndroid Build Coastguard Worker 		switch (t) {
174*c9945492SAndroid Build Coastguard Worker 		case 'c':
175*c9945492SAndroid Build Coastguard Worker 			if (width < 1) width = 1;
176*c9945492SAndroid Build Coastguard Worker 		case '[':
177*c9945492SAndroid Build Coastguard Worker 			break;
178*c9945492SAndroid Build Coastguard Worker 		case 'n':
179*c9945492SAndroid Build Coastguard Worker 			store_int(dest, size, pos);
180*c9945492SAndroid Build Coastguard Worker 			/* do not increment match count, etc! */
181*c9945492SAndroid Build Coastguard Worker 			continue;
182*c9945492SAndroid Build Coastguard Worker 		default:
183*c9945492SAndroid Build Coastguard Worker 			shlim(f, 0);
184*c9945492SAndroid Build Coastguard Worker 			while (isspace(shgetc(f)));
185*c9945492SAndroid Build Coastguard Worker 			shunget(f);
186*c9945492SAndroid Build Coastguard Worker 			pos += shcnt(f);
187*c9945492SAndroid Build Coastguard Worker 		}
188*c9945492SAndroid Build Coastguard Worker 
189*c9945492SAndroid Build Coastguard Worker 		shlim(f, width);
190*c9945492SAndroid Build Coastguard Worker 		if (shgetc(f) < 0) goto input_fail;
191*c9945492SAndroid Build Coastguard Worker 		shunget(f);
192*c9945492SAndroid Build Coastguard Worker 
193*c9945492SAndroid Build Coastguard Worker 		switch (t) {
194*c9945492SAndroid Build Coastguard Worker 		case 's':
195*c9945492SAndroid Build Coastguard Worker 		case 'c':
196*c9945492SAndroid Build Coastguard Worker 		case '[':
197*c9945492SAndroid Build Coastguard Worker 			if (t == 'c' || t == 's') {
198*c9945492SAndroid Build Coastguard Worker 				memset(scanset, -1, sizeof scanset);
199*c9945492SAndroid Build Coastguard Worker 				scanset[0] = 0;
200*c9945492SAndroid Build Coastguard Worker 				if (t == 's') {
201*c9945492SAndroid Build Coastguard Worker 					scanset[1+'\t'] = 0;
202*c9945492SAndroid Build Coastguard Worker 					scanset[1+'\n'] = 0;
203*c9945492SAndroid Build Coastguard Worker 					scanset[1+'\v'] = 0;
204*c9945492SAndroid Build Coastguard Worker 					scanset[1+'\f'] = 0;
205*c9945492SAndroid Build Coastguard Worker 					scanset[1+'\r'] = 0;
206*c9945492SAndroid Build Coastguard Worker 					scanset[1+' '] = 0;
207*c9945492SAndroid Build Coastguard Worker 				}
208*c9945492SAndroid Build Coastguard Worker 			} else {
209*c9945492SAndroid Build Coastguard Worker 				if (*++p == '^') p++, invert = 1;
210*c9945492SAndroid Build Coastguard Worker 				else invert = 0;
211*c9945492SAndroid Build Coastguard Worker 				memset(scanset, invert, sizeof scanset);
212*c9945492SAndroid Build Coastguard Worker 				scanset[0] = 0;
213*c9945492SAndroid Build Coastguard Worker 				if (*p == '-') p++, scanset[1+'-'] = 1-invert;
214*c9945492SAndroid Build Coastguard Worker 				else if (*p == ']') p++, scanset[1+']'] = 1-invert;
215*c9945492SAndroid Build Coastguard Worker 				for (; *p != ']'; p++) {
216*c9945492SAndroid Build Coastguard Worker 					if (!*p) goto fmt_fail;
217*c9945492SAndroid Build Coastguard Worker 					if (*p=='-' && p[1] && p[1] != ']')
218*c9945492SAndroid Build Coastguard Worker 						for (c=p++[-1]; c<*p; c++)
219*c9945492SAndroid Build Coastguard Worker 							scanset[1+c] = 1-invert;
220*c9945492SAndroid Build Coastguard Worker 					scanset[1+*p] = 1-invert;
221*c9945492SAndroid Build Coastguard Worker 				}
222*c9945492SAndroid Build Coastguard Worker 			}
223*c9945492SAndroid Build Coastguard Worker 			wcs = 0;
224*c9945492SAndroid Build Coastguard Worker 			s = 0;
225*c9945492SAndroid Build Coastguard Worker 			i = 0;
226*c9945492SAndroid Build Coastguard Worker 			k = t=='c' ? width+1U : 31;
227*c9945492SAndroid Build Coastguard Worker 			if (size == SIZE_l) {
228*c9945492SAndroid Build Coastguard Worker 				if (alloc) {
229*c9945492SAndroid Build Coastguard Worker 					wcs = malloc(k*sizeof(wchar_t));
230*c9945492SAndroid Build Coastguard Worker 					if (!wcs) goto alloc_fail;
231*c9945492SAndroid Build Coastguard Worker 				} else {
232*c9945492SAndroid Build Coastguard Worker 					wcs = dest;
233*c9945492SAndroid Build Coastguard Worker 				}
234*c9945492SAndroid Build Coastguard Worker 				st = (mbstate_t){0};
235*c9945492SAndroid Build Coastguard Worker 				while (scanset[(c=shgetc(f))+1]) {
236*c9945492SAndroid Build Coastguard Worker 					switch (mbrtowc(&wc, &(char){c}, 1, &st)) {
237*c9945492SAndroid Build Coastguard Worker 					case -1:
238*c9945492SAndroid Build Coastguard Worker 						goto input_fail;
239*c9945492SAndroid Build Coastguard Worker 					case -2:
240*c9945492SAndroid Build Coastguard Worker 						continue;
241*c9945492SAndroid Build Coastguard Worker 					}
242*c9945492SAndroid Build Coastguard Worker 					if (wcs) wcs[i++] = wc;
243*c9945492SAndroid Build Coastguard Worker 					if (alloc && i==k) {
244*c9945492SAndroid Build Coastguard Worker 						k+=k+1;
245*c9945492SAndroid Build Coastguard Worker 						wchar_t *tmp = realloc(wcs, k*sizeof(wchar_t));
246*c9945492SAndroid Build Coastguard Worker 						if (!tmp) goto alloc_fail;
247*c9945492SAndroid Build Coastguard Worker 						wcs = tmp;
248*c9945492SAndroid Build Coastguard Worker 					}
249*c9945492SAndroid Build Coastguard Worker 				}
250*c9945492SAndroid Build Coastguard Worker 				if (!mbsinit(&st)) goto input_fail;
251*c9945492SAndroid Build Coastguard Worker 			} else if (alloc) {
252*c9945492SAndroid Build Coastguard Worker 				s = malloc(k);
253*c9945492SAndroid Build Coastguard Worker 				if (!s) goto alloc_fail;
254*c9945492SAndroid Build Coastguard Worker 				while (scanset[(c=shgetc(f))+1]) {
255*c9945492SAndroid Build Coastguard Worker 					s[i++] = c;
256*c9945492SAndroid Build Coastguard Worker 					if (i==k) {
257*c9945492SAndroid Build Coastguard Worker 						k+=k+1;
258*c9945492SAndroid Build Coastguard Worker 						char *tmp = realloc(s, k);
259*c9945492SAndroid Build Coastguard Worker 						if (!tmp) goto alloc_fail;
260*c9945492SAndroid Build Coastguard Worker 						s = tmp;
261*c9945492SAndroid Build Coastguard Worker 					}
262*c9945492SAndroid Build Coastguard Worker 				}
263*c9945492SAndroid Build Coastguard Worker 			} else if ((s = dest)) {
264*c9945492SAndroid Build Coastguard Worker 				while (scanset[(c=shgetc(f))+1])
265*c9945492SAndroid Build Coastguard Worker 					s[i++] = c;
266*c9945492SAndroid Build Coastguard Worker 			} else {
267*c9945492SAndroid Build Coastguard Worker 				while (scanset[(c=shgetc(f))+1]);
268*c9945492SAndroid Build Coastguard Worker 			}
269*c9945492SAndroid Build Coastguard Worker 			shunget(f);
270*c9945492SAndroid Build Coastguard Worker 			if (!shcnt(f)) goto match_fail;
271*c9945492SAndroid Build Coastguard Worker 			if (t == 'c' && shcnt(f) != width) goto match_fail;
272*c9945492SAndroid Build Coastguard Worker 			if (alloc) {
273*c9945492SAndroid Build Coastguard Worker 				if (size == SIZE_l) *(wchar_t **)dest = wcs;
274*c9945492SAndroid Build Coastguard Worker 				else *(char **)dest = s;
275*c9945492SAndroid Build Coastguard Worker 			}
276*c9945492SAndroid Build Coastguard Worker 			if (t != 'c') {
277*c9945492SAndroid Build Coastguard Worker 				if (wcs) wcs[i] = 0;
278*c9945492SAndroid Build Coastguard Worker 				if (s) s[i] = 0;
279*c9945492SAndroid Build Coastguard Worker 			}
280*c9945492SAndroid Build Coastguard Worker 			break;
281*c9945492SAndroid Build Coastguard Worker 		case 'p':
282*c9945492SAndroid Build Coastguard Worker 		case 'X':
283*c9945492SAndroid Build Coastguard Worker 		case 'x':
284*c9945492SAndroid Build Coastguard Worker 			base = 16;
285*c9945492SAndroid Build Coastguard Worker 			goto int_common;
286*c9945492SAndroid Build Coastguard Worker 		case 'o':
287*c9945492SAndroid Build Coastguard Worker 			base = 8;
288*c9945492SAndroid Build Coastguard Worker 			goto int_common;
289*c9945492SAndroid Build Coastguard Worker 		case 'd':
290*c9945492SAndroid Build Coastguard Worker 		case 'u':
291*c9945492SAndroid Build Coastguard Worker 			base = 10;
292*c9945492SAndroid Build Coastguard Worker 			goto int_common;
293*c9945492SAndroid Build Coastguard Worker 		case 'i':
294*c9945492SAndroid Build Coastguard Worker 			base = 0;
295*c9945492SAndroid Build Coastguard Worker 		int_common:
296*c9945492SAndroid Build Coastguard Worker 			x = __intscan(f, base, 0, ULLONG_MAX);
297*c9945492SAndroid Build Coastguard Worker 			if (!shcnt(f)) goto match_fail;
298*c9945492SAndroid Build Coastguard Worker 			if (t=='p' && dest) *(void **)dest = (void *)(uintptr_t)x;
299*c9945492SAndroid Build Coastguard Worker 			else store_int(dest, size, x);
300*c9945492SAndroid Build Coastguard Worker 			break;
301*c9945492SAndroid Build Coastguard Worker 		case 'a': case 'A':
302*c9945492SAndroid Build Coastguard Worker 		case 'e': case 'E':
303*c9945492SAndroid Build Coastguard Worker 		case 'f': case 'F':
304*c9945492SAndroid Build Coastguard Worker 		case 'g': case 'G':
305*c9945492SAndroid Build Coastguard Worker 			y = __floatscan(f, size, 0);
306*c9945492SAndroid Build Coastguard Worker 			if (!shcnt(f)) goto match_fail;
307*c9945492SAndroid Build Coastguard Worker 			if (dest) switch (size) {
308*c9945492SAndroid Build Coastguard Worker 			case SIZE_def:
309*c9945492SAndroid Build Coastguard Worker 				*(float *)dest = y;
310*c9945492SAndroid Build Coastguard Worker 				break;
311*c9945492SAndroid Build Coastguard Worker 			case SIZE_l:
312*c9945492SAndroid Build Coastguard Worker 				*(double *)dest = y;
313*c9945492SAndroid Build Coastguard Worker 				break;
314*c9945492SAndroid Build Coastguard Worker 			case SIZE_L:
315*c9945492SAndroid Build Coastguard Worker 				*(long double *)dest = y;
316*c9945492SAndroid Build Coastguard Worker 				break;
317*c9945492SAndroid Build Coastguard Worker 			}
318*c9945492SAndroid Build Coastguard Worker 			break;
319*c9945492SAndroid Build Coastguard Worker 		}
320*c9945492SAndroid Build Coastguard Worker 
321*c9945492SAndroid Build Coastguard Worker 		pos += shcnt(f);
322*c9945492SAndroid Build Coastguard Worker 		if (dest) matches++;
323*c9945492SAndroid Build Coastguard Worker 	}
324*c9945492SAndroid Build Coastguard Worker 	if (0) {
325*c9945492SAndroid Build Coastguard Worker fmt_fail:
326*c9945492SAndroid Build Coastguard Worker alloc_fail:
327*c9945492SAndroid Build Coastguard Worker input_fail:
328*c9945492SAndroid Build Coastguard Worker 		if (!matches) matches--;
329*c9945492SAndroid Build Coastguard Worker match_fail:
330*c9945492SAndroid Build Coastguard Worker 		if (alloc) {
331*c9945492SAndroid Build Coastguard Worker 			free(s);
332*c9945492SAndroid Build Coastguard Worker 			free(wcs);
333*c9945492SAndroid Build Coastguard Worker 		}
334*c9945492SAndroid Build Coastguard Worker 	}
335*c9945492SAndroid Build Coastguard Worker 	FUNLOCK(f);
336*c9945492SAndroid Build Coastguard Worker 	return matches;
337*c9945492SAndroid Build Coastguard Worker }
338*c9945492SAndroid Build Coastguard Worker 
339*c9945492SAndroid Build Coastguard Worker weak_alias(vfscanf,__isoc99_vfscanf);
340