69 int inp, shift, base, width;
71 int fmt,
flags,
dot, n_assign, v, n, n_input;
83#define SFGETC(f,c) (((c) = getc(f)) < 0 ? c : (++n_input, c))
84#define SFUNGETC(f,c) do { \
91 n_assign = n_input = 0;
104 while ((fmt = *form++)) {
110 if (
SFGETC(f, inp) < 0 || inp == fmt)
119 if (
SFGETC(f, inp) != fmt) {
151 switch ((fmt = *form++)) {
168 n_str = (form - 1) - t_str;
173 n = ft->
extf(&argv, ft);
177 if ((t_str = argv.
s) && (n_str = (
int)ft->
size) < 0)
178 n_str = (ssize_t)strlen(t_str);
196 }
else if (*form ==
'*') {
201 if (ft->
extf(&argv, ft) < 0)
222 for (v = fmt -
'0';
gv_isdigit(*form); ++form)
223 v = v * 10 + (*form -
'0');
237 size = size * 10 + (n -
'0');
238 }
else if (*form ==
'*') {
242 FMTSET(ft, form,
'I',
sizeof(
int), 0, 0, 0, 0,
NULL, 0);
243 if (ft->
extf(&argv, ft) < 0)
252 flags &= ~SFFMT_TYPES;
261 flags &= ~SFFMT_TYPES;
305 FMTSET(ft, form, fmt, size,
flags, width, 0, base, t_str, n_str);
306 v = ft->
extf(&argv, ft);
311 FMTGET(ft, form, fmt, size,
flags, width, n, base);
327 if (
sizeof(
long) >
sizeof(
int) &&
FMTCMP(size,
long,
long long))
328 *((
long *) value) = (long)n_input;
329 else if (
sizeof(
short) <
sizeof(int) &&
FMTCMP(size,
short,
long long))
330 *((
short *) value) = (
short)n_input;
331 else if (size ==
sizeof(
char))
332 *((
char *) value) = (
char)n_input;
334 *((
int *) value) = (int)n_input;
343 if (fmt ==
'c' || fmt ==
'[')
362 bool seen_dot =
false;
366 else if (inp ==
'.') {
371 }
else if (inp ==
'e' || inp ==
'E') {
375 if (--width <= 0 ||
SFGETC(f, inp) < 0 ||
376 (inp !=
'-' && inp !=
'+' && !
gv_isdigit(inp)))
379 }
else if (inp ==
'-' || inp ==
'+') {
386 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
390 argv.
d = strtod(accept,
NULL);
393 if (
FMTCMP(size,
double,
long double))
394 *((
double *) value) = argv.
d;
396 *((
float *) value) = (float) argv.
d;
406 if (inp ==
'-' || inp ==
'+') {
409 while (--width > 0 &&
SFGETC(f, inp) >= 0)
418 else if (fmt ==
'x' || fmt ==
'p')
420 else if (fmt ==
'i' && inp ==
'0') {
423 if (
SFGETC(f, inp) >= 0) {
424 if (inp ==
'x' || inp ==
'X')
441 if (inp ==
'0' && --width > 0) {
442 if (
SFGETC(f, inp) >= 0 &&
443 (inp ==
'x' || inp ==
'X') && --width > 0)
446 if (inp >= 0 && sp[inp] < 16)
448 }
else if (base == 10) {
449 if (inp <
'0' || inp >
'9') {
456 (argv.
lu << 3) + (argv.
lu << 1) + (inp -
'0');
457 }
while (--width > 0 &&
SFGETC(f, inp) >=
'0'
461 base = (int) argv.
lu;
467 SFGETC(f, inp) >= 0 && sp[inp] < base)
472 if (base < 2 || base >
SF_RADIX || sp[inp] >= base) {
478 if ((base & ~(base - 1)) == base) {
480 shift = base < 4 ? 1 : 2;
482 shift = base < 16 ? 3 : 4;
484 shift = base < 64 ? 5 : 6;
487 argv.
lu = (argv.
lu << shift) + sp[inp];
488 }
while (--width > 0 &&
489 SFGETC(f, inp) >= 0 && sp[inp] < base);
492 argv.
lu = (argv.
lu * base) + sp[inp];
493 }
while (--width > 0 &&
494 SFGETC(f, inp) >= 0 && sp[inp] < base);
505 *((
void **) value) = (
void *)(uintptr_t)argv.
lu;
506 }
else if (
sizeof(
long) >
sizeof(int) &&
FMTCMP(size,
long,
long long)) {
507 if (fmt ==
'd' || fmt ==
'i')
508 *((
long *) value) = (long) argv.
ll;
511 }
else if (
sizeof(
short) <
sizeof(
int) &&
FMTCMP(size,
short,
long long)) {
512 if (fmt ==
'd' || fmt ==
'i')
513 *((
short *) value) = (short) argv.
ll;
516 }
else if (size ==
sizeof(
char)) {
517 if (fmt ==
'd' || fmt ==
'i')
518 *((
char *) value) = (char) argv.
ll;
522 if (fmt ==
'd' || fmt ==
'i')
523 *((
int *) value) = (int) argv.
ll;
525 *((
unsigned*)value) = (unsigned)argv.
lu;
528 }
else if (fmt ==
's' || fmt ==
'c' || fmt ==
'[') {
543 if ((n += 1) <= size)
545 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
546 }
else if (fmt ==
'c') {
548 if ((n += 1) <= size)
550 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
552 bool accepted[UCHAR_MAX + 1];
553 form = (
const char*)
setclass((
const unsigned char*)form, accepted);
555 if (!accepted[inp]) {
563 if ((n += 1) <= size)
565 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
568 if (value && (n > 0 || fmt ==
'[')) {
570 if (fmt !=
'c' && size >= 0)
575 if (width > 0 && inp >= 0)
581 if (n_assign == 0 && inp < 0)
#define FMTGET(ft, frm, fv, sz, flgs, wid, pr, bs)
#define FMTSET(ft, frm, fv, sz, flgs, wid, pr, bs, ts, ns)