71 int inp, shift, base, width;
73 int fmt,
flags,
dot, n_assign, v, 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;
103 while ((fmt = *form++)) {
109 if (
SFGETC(f, inp) < 0 || inp == fmt)
118 if (
SFGETC(f, inp) != fmt) {
150 switch ((fmt = *form++)) {
167 n_str = (form - 1) - t_str;
171 if (ft->
extf(&argv, ft) < 0)
174 if ((t_str = argv.
s) && (n_str = (
int)ft->
size) < 0)
175 n_str = (ssize_t)strlen(t_str);
193 }
else if (*form ==
'*') {
197 if (ft->
extf(&argv, ft) < 0)
218 for (v = fmt -
'0';
gv_isdigit(*form); ++form)
219 v = v * 10 + (*form -
'0');
233 size = size * 10 + (*form -
'0');
234 }
else if (*form ==
'*') {
237 FMTSET(ft, form,
'I',
sizeof(
int), 0, 0, 0, 0,
NULL, 0);
238 if (ft->
extf(&argv, ft) < 0)
247 flags &= ~SFFMT_TYPES;
256 flags &= ~SFFMT_TYPES;
299 FMTSET(ft, form, fmt, size,
flags, width, 0, base, t_str, n_str);
300 v = ft->
extf(&argv, ft);
305 FMTGET(ft, form, fmt, size,
flags, width, (
int){0}, base);
321 if (
sizeof(
long) >
sizeof(
int) &&
FMTCMP(size,
long,
long long))
322 *((
long *) value) = (long)n_input;
323 else if (
sizeof(
short) <
sizeof(int) &&
FMTCMP(size,
short,
long long))
324 *((
short *) value) = (
short)n_input;
325 else if (size ==
sizeof(
char))
326 *((
char *) value) = (
char)n_input;
328 *((
int *) value) = (int)n_input;
337 if (fmt ==
'c' || fmt ==
'[')
356 bool seen_dot =
false;
360 else if (inp ==
'.') {
365 }
else if (inp ==
'e' || inp ==
'E') {
369 if (--width <= 0 ||
SFGETC(f, inp) < 0 ||
370 (inp !=
'-' && inp !=
'+' && !
gv_isdigit(inp)))
373 }
else if (inp ==
'-' || inp ==
'+') {
380 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
384 argv.
d = strtod(accept,
NULL);
387 if (
FMTCMP(size,
double,
long double))
388 *((
double *) value) = argv.
d;
390 *((
float *) value) = (float) argv.
d;
400 if (inp ==
'-' || inp ==
'+') {
403 while (--width > 0 &&
SFGETC(f, inp) >= 0)
412 else if (fmt ==
'x' || fmt ==
'p')
414 else if (fmt ==
'i' && inp ==
'0') {
417 if (
SFGETC(f, inp) >= 0) {
418 if (inp ==
'x' || inp ==
'X')
435 if (inp ==
'0' && --width > 0) {
436 if (
SFGETC(f, inp) >= 0 &&
437 (inp ==
'x' || inp ==
'X') && --width > 0)
440 if (inp >= 0 && sp[inp] < 16)
442 }
else if (base == 10) {
443 if (inp <
'0' || inp >
'9') {
450 (argv.
lu << 3) + (argv.
lu << 1) + (inp -
'0');
451 }
while (--width > 0 &&
SFGETC(f, inp) >=
'0'
455 base = (int) argv.
lu;
461 SFGETC(f, inp) >= 0 && sp[inp] < base)
466 if (base < 2 || base >
SF_RADIX || sp[inp] >= base) {
472 if ((base & ~(base - 1)) == base) {
474 shift = base < 4 ? 1 : 2;
476 shift = base < 16 ? 3 : 4;
478 shift = base < 64 ? 5 : 6;
481 argv.
lu = (argv.
lu << shift) + sp[inp];
482 }
while (--width > 0 &&
483 SFGETC(f, inp) >= 0 && sp[inp] < base);
486 argv.
lu = (argv.
lu * base) + sp[inp];
487 }
while (--width > 0 &&
488 SFGETC(f, inp) >= 0 && sp[inp] < base);
499 *((
void **) value) = (
void *)(uintptr_t)argv.
lu;
500 }
else if (
sizeof(
long) >
sizeof(int) &&
FMTCMP(size,
long,
long long)) {
501 if (fmt ==
'd' || fmt ==
'i')
502 *((
long *) value) = (long) argv.
ll;
505 }
else if (
sizeof(
short) <
sizeof(
int) &&
FMTCMP(size,
short,
long long)) {
506 if (fmt ==
'd' || fmt ==
'i')
507 *((
short *) value) = (short) argv.
ll;
510 }
else if (size ==
sizeof(
char)) {
511 if (fmt ==
'd' || fmt ==
'i')
512 *((
char *) value) = (char) argv.
ll;
516 if (fmt ==
'd' || fmt ==
'i')
517 *((
int *) value) = (int) argv.
ll;
519 *((
unsigned*)value) = (unsigned)argv.
lu;
522 }
else if (fmt ==
's' || fmt ==
'c' || fmt ==
'[') {
537 if ((n += 1) <= size)
539 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
540 }
else if (fmt ==
'c') {
542 if ((n += 1) <= size)
544 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
546 bool accepted[UCHAR_MAX + 1];
547 form = (
const char*)
setclass((
const unsigned char*)form, accepted);
549 if (!accepted[inp]) {
557 if ((n += 1) <= size)
559 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
562 if (value && (n > 0 || fmt ==
'[')) {
564 if (fmt !=
'c' && size >= 0)
569 if (width > 0 && inp >= 0)
575 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)