69 int inp, shift, base, width;
71 int fmt,
flags,
dot, n_assign, v, n_input;
81#define SFGETC(f,c) (((c) = getc(f)) < 0 ? c : (++n_input, c))
82#define SFUNGETC(f,c) do { \
89 n_assign = n_input = 0;
101 while ((fmt = *form++)) {
107 if (
SFGETC(f, inp) < 0 || inp == fmt)
116 if (
SFGETC(f, inp) != fmt) {
148 switch ((fmt = *form++)) {
165 n_str = (form - 1) - t_str;
169 if (ft->
extf(&argv, ft) < 0)
172 if ((t_str = argv.
s) && (n_str = (
int)ft->
size) < 0)
173 n_str = (ssize_t)strlen(t_str);
191 }
else if (*form ==
'*') {
195 if (ft->
extf(&argv, ft) < 0)
216 for (v = fmt -
'0';
gv_isdigit(*form); ++form)
217 v = v * 10 + (*form -
'0');
231 size = size * 10 + (*form -
'0');
232 }
else if (*form ==
'*') {
235 FMTSET(ft, form,
'I',
sizeof(
int), 0, 0, 0, 0,
NULL, 0);
236 if (ft->
extf(&argv, ft) < 0)
245 flags &= ~SFFMT_TYPES;
254 flags &= ~SFFMT_TYPES;
297 FMTSET(ft, form, fmt, size,
flags, width, 0, base, t_str, n_str);
298 v = ft->
extf(&argv, ft);
303 FMTGET(ft, form, fmt, size,
flags, width, (
int){0}, base);
319 if (
sizeof(
long) >
sizeof(
int) &&
FMTCMP(size,
long,
long long))
320 *((
long *) value) = (long)n_input;
321 else if (
sizeof(
short) <
sizeof(int) &&
FMTCMP(size,
short,
long long))
322 *((
short *) value) = (
short)n_input;
323 else if (size ==
sizeof(
char))
324 *((
char *) value) = (
char)n_input;
326 *((
int *) value) = (int)n_input;
335 if (fmt ==
'c' || fmt ==
'[')
354 bool seen_dot =
false;
358 else if (inp ==
'.') {
363 }
else if (inp ==
'e' || inp ==
'E') {
367 if (--width <= 0 ||
SFGETC(f, inp) < 0 ||
368 (inp !=
'-' && inp !=
'+' && !
gv_isdigit(inp)))
371 }
else if (inp ==
'-' || inp ==
'+') {
378 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
382 argv.
d = strtod(accept,
NULL);
385 if (
FMTCMP(size,
double,
long double))
386 *((
double *) value) = argv.
d;
388 *((
float *) value) = (float) argv.
d;
398 if (inp ==
'-' || inp ==
'+') {
401 while (--width > 0 &&
SFGETC(f, inp) >= 0)
410 else if (fmt ==
'x' || fmt ==
'p')
412 else if (fmt ==
'i' && inp ==
'0') {
415 if (
SFGETC(f, inp) >= 0) {
416 if (inp ==
'x' || inp ==
'X')
433 if (inp ==
'0' && --width > 0) {
434 if (
SFGETC(f, inp) >= 0 &&
435 (inp ==
'x' || inp ==
'X') && --width > 0)
438 if (inp >= 0 && sp[inp] < 16)
440 }
else if (base == 10) {
441 if (inp <
'0' || inp >
'9') {
448 (argv.
lu << 3) + (argv.
lu << 1) + (inp -
'0');
449 }
while (--width > 0 &&
SFGETC(f, inp) >=
'0'
453 base = (int) argv.
lu;
459 SFGETC(f, inp) >= 0 && sp[inp] < base)
464 if (base < 2 || base >
SF_RADIX || sp[inp] >= base) {
470 if ((base & ~(base - 1)) == base) {
472 shift = base < 4 ? 1 : 2;
474 shift = base < 16 ? 3 : 4;
476 shift = base < 64 ? 5 : 6;
479 argv.
lu = (argv.
lu << shift) + sp[inp];
480 }
while (--width > 0 &&
481 SFGETC(f, inp) >= 0 && sp[inp] < base);
484 argv.
lu = (argv.
lu * base) + sp[inp];
485 }
while (--width > 0 &&
486 SFGETC(f, inp) >= 0 && sp[inp] < base);
497 *((
void **) value) = (
void *)(uintptr_t)argv.
lu;
498 }
else if (
sizeof(
long) >
sizeof(int) &&
FMTCMP(size,
long,
long long)) {
499 if (fmt ==
'd' || fmt ==
'i')
500 *((
long *) value) = (long) argv.
ll;
503 }
else if (
sizeof(
short) <
sizeof(
int) &&
FMTCMP(size,
short,
long long)) {
504 if (fmt ==
'd' || fmt ==
'i')
505 *((
short *) value) = (short) argv.
ll;
508 }
else if (size ==
sizeof(
char)) {
509 if (fmt ==
'd' || fmt ==
'i')
510 *((
char *) value) = (char) argv.
ll;
514 if (fmt ==
'd' || fmt ==
'i')
515 *((
int *) value) = (int) argv.
ll;
517 *((
unsigned*)value) = (unsigned)argv.
lu;
520 }
else if (fmt ==
's' || fmt ==
'c' || fmt ==
'[') {
535 if ((n += 1) <= size)
537 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
538 }
else if (fmt ==
'c') {
540 if ((n += 1) <= size)
542 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
544 bool accepted[UCHAR_MAX + 1];
545 form = (
const char*)
setclass((
const unsigned char*)form, accepted);
547 if (!accepted[inp]) {
555 if ((n += 1) <= size)
557 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
560 if (value && (n > 0 || fmt ==
'[')) {
562 if (fmt !=
'c' && size >= 0)
567 if (width > 0 && inp >= 0)
573 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)