7 #define va_strt va_start
10 #define va_strt(p,i) va_start(p)
15 int scanf(const char * fmt, ...)
17 int scanf(fmt, va_alist)
25 rv = vfscanf(stdin,fmt,ptr);
33 int sscanf(char * sp, const char * fmt, ...)
35 int sscanf(sp, fmt, va_alist)
41 static FILE string[1] =
43 {0, (char*)(unsigned) -1, 0, 0, (char*) (unsigned) -1, -1,
51 rv = vfscanf(string,fmt,ptr);
59 int fscanf(FILE * fp, const char * fmt, ...)
61 int fscanf(fp, fmt, va_alist)
70 rv = vfscanf(fp,fmt,ptr);
81 return vfscanf(stdin,fmt,ap);
86 int vsscanf(sp, fmt, ap)
90 static FILE string[1] =
92 {0, (char*)(unsigned) -1, 0, 0, (char*) (unsigned) -1, -1,
97 return vfscanf(string,fmt,ap);
104 int _vfscanf_fp_ref = 1;
106 int _vfscanf_fp_ref = 0;
109 /* #define skip() do{c=getc(fp); if (c<1) goto done;}while(isspace(c))*/
111 #define skip() while(isspace(c)) { if ((c=getc(fp))<1) goto done; }
114 /* fp scan actions */
115 #define F_NADA 0 /* just change state */
116 #define F_SIGN 1 /* set sign */
117 #define F_ESIGN 2 /* set exponent's sign */
118 #define F_INT 3 /* adjust integer part */
119 #define F_FRAC 4 /* adjust fraction part */
120 #define F_EXP 5 /* adjust exponent part */
124 #define FS_INIT 0 /* initial state */
125 #define FS_SIGNED 1 /* saw sign */
126 #define FS_DIGS 2 /* saw digits, no . */
127 #define FS_DOT 3 /* saw ., no digits */
128 #define FS_DD 4 /* saw digits and . */
129 #define FS_E 5 /* saw 'e' */
130 #define FS_ESIGN 6 /* saw exp's sign */
131 #define FS_EDIGS 7 /* saw exp's digits */
138 /* given transition,state do what action? */
139 int fp_do[][NSTATE] = {
142 F_EXP,F_EXP,F_EXP}, /* see digit */
143 {F_NADA,F_NADA,F_NADA,
144 F_QUIT,F_QUIT,F_QUIT,F_QUIT,F_QUIT}, /* see '.' */
146 F_NADA,F_QUIT,F_NADA,
147 F_QUIT,F_QUIT,F_QUIT}, /* see e/E */
148 {F_SIGN,F_QUIT,F_QUIT,F_QUIT,F_QUIT,
149 F_ESIGN,F_QUIT,F_QUIT}, /* see sign */
151 /* given transition,state what is new state? */
152 int fp_ns[][NSTATE] = {
153 {FS_DIGS,FS_DIGS,FS_DIGS,
155 FS_EDIGS,FS_EDIGS,FS_EDIGS}, /* see digit */
156 {FS_DOT,FS_DOT,FS_DD,
162 FS_ESIGN,0,0}, /* see sign */
164 /* which states are valid terminators? */
165 int fp_sval[NSTATE] = {
178 register int c, width, lval, cnt = 0;
179 int store, neg, base, wide1, endnull, rngflag, c2;
180 register unsigned char *p;
181 unsigned char delim[128], digits[17], *q;
184 int eneg, fraclen, fstate, trans;
185 double fx, fp_scan();
201 lval = (sizeof(long) == sizeof(int));
206 strcpy(delim, "\011\012\013\014\015 ");
207 strcpy(digits, "0123456789ABCDEF");
215 while (isdigit(*++fmt))/* width digit(s) */
219 wide1 = width = (width * 10) + (*fmt - '0');
224 switch (tolower(*fmt)) /* tolower() is a MACRO! */
230 case 'l': /* long data */
233 case 'h': /* short data */
237 case 'i': /* any-base numeric */
241 case 'b': /* unsigned binary */
245 case 'o': /* unsigned octal */
249 case 'x': /* unsigned hexadecimal */
253 case 'd': /* SIGNED decimal */
257 case 'u': /* unsigned decimal */
289 if ((neg == 0) && (base == 10)
290 && ((neg = (c == '-')) || (c == '+')))
299 p = ((unsigned char *)
300 strchr(digits, toupper(c)));
302 if ((!c || !p) && width)
305 while (p && width-- && c)
307 n = (n * base) + (p - digits);
310 p = ((unsigned char *)
311 strchr(digits, toupper(c)));
319 *va_arg(ap, long*) = n;
321 *va_arg(ap, short*) = n;
327 case 'e': /* float */
331 fprintf(stderr,"LIBM:SCANF");
346 if (c >= '0' && c <= '9')
350 else if (c == '+' || c == '-')
352 else if (tolower(c) == 'e')
357 switch (fp_do[trans][fstate])
366 n = 10 * n + (c - '0');
369 frac = 10 * frac + (c - '0');
373 expo = 10 * expo + (c - '0');
378 fstate = fp_ns[trans][fstate];
383 if (!fp_sval[fstate])
387 fx = fp_scan(neg, eneg, n, frac, expo, fraclen);
389 *va_arg(ap, double *) = fx;
391 *va_arg(ap, float *) = fx;
396 case 'e': /* float */
399 fprintf(stderr, "LIBC:SCANF");
403 case 'c': /* character data */
409 case '[': /* string w/ delimiter set */
423 if ((*fmt == ']') || (*fmt == '-'))
445 /* fall thru intentional */
448 rngflag = (*fmt == '-');
461 case 's': /* string data */
466 p = va_arg(ap, unsigned char *);
468 /* if the 1st char fails, match fails */
471 q = ((unsigned char *)
473 if ((c < 1) || lval == (q==0))
481 for (;;) /* FOREVER */
485 if (((c = getc(fp)) < 1) ||
489 q = ((unsigned char *)
503 case '\0': /* early EOS */
511 else if (isspace(*fmt)) /* skip whitespace */
516 { /* normal match char */
527 done: /* end of scan */
528 if ((c == EOF) && (cnt == 0))