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