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;
174 n = ft->
extf(&argv, ft);
178 if ((t_str = argv.
s) && (n_str = (
int)ft->
size) < 0)
179 n_str = (ssize_t)strlen(t_str);
197 }
else if (*form ==
'*') {
202 if (ft->
extf(&argv, ft) < 0)
223 for (v = fmt -
'0';
gv_isdigit(*form); ++form)
224 v = v * 10 + (*form -
'0');
238 size = size * 10 + (n -
'0');
239 }
else if (*form ==
'*') {
243 FMTSET(ft, form,
'I',
sizeof(
int), 0, 0, 0, 0,
NULL, 0);
244 if (ft->
extf(&argv, ft) < 0)
253 flags &= ~SFFMT_TYPES;
262 flags &= ~SFFMT_TYPES;
306 FMTSET(ft, form, fmt, size,
flags, width, 0, base, t_str, n_str);
307 v = ft->
extf(&argv, ft);
312 FMTGET(ft, form, fmt, size,
flags, width, n, base);
328 if (
sizeof(
long) >
sizeof(
int) &&
FMTCMP(size,
long,
long long))
329 *((
long *) value) = (long)n_input;
330 else if (
sizeof(
short) <
sizeof(int) &&
FMTCMP(size,
short,
long long))
331 *((
short *) value) = (
short)n_input;
332 else if (size ==
sizeof(
char))
333 *((
char *) value) = (
char)n_input;
335 *((
int *) value) = (int)n_input;
344 if (fmt ==
'c' || fmt ==
'[')
363 bool seen_dot =
false;
367 else if (inp ==
'.') {
372 }
else if (inp ==
'e' || inp ==
'E') {
376 if (--width <= 0 ||
SFGETC(f, inp) < 0 ||
377 (inp !=
'-' && inp !=
'+' && !
gv_isdigit(inp)))
380 }
else if (inp ==
'-' || inp ==
'+') {
387 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
391 argv.
d = strtod(accept,
NULL);
394 if (
FMTCMP(size,
double,
long double))
395 *((
double *) value) = argv.
d;
397 *((
float *) value) = (float) argv.
d;
407 if (inp ==
'-' || inp ==
'+') {
410 while (--width > 0 &&
SFGETC(f, inp) >= 0)
419 else if (fmt ==
'x' || fmt ==
'p')
421 else if (fmt ==
'i' && inp ==
'0') {
424 if (
SFGETC(f, inp) >= 0) {
425 if (inp ==
'x' || inp ==
'X')
442 if (inp ==
'0' && --width > 0) {
443 if (
SFGETC(f, inp) >= 0 &&
444 (inp ==
'x' || inp ==
'X') && --width > 0)
447 if (inp >= 0 && sp[inp] < 16)
449 }
else if (base == 10) {
450 if (inp <
'0' || inp >
'9') {
457 (argv.
lu << 3) + (argv.
lu << 1) + (inp -
'0');
458 }
while (--width > 0 &&
SFGETC(f, inp) >=
'0'
462 base = (int) argv.
lu;
468 SFGETC(f, inp) >= 0 && sp[inp] < base)
473 if (base < 2 || base >
SF_RADIX || sp[inp] >= base) {
479 if ((base & ~(base - 1)) == base) {
481 shift = base < 4 ? 1 : 2;
483 shift = base < 16 ? 3 : 4;
485 shift = base < 64 ? 5 : 6;
488 argv.
lu = (argv.
lu << shift) + sp[inp];
489 }
while (--width > 0 &&
490 SFGETC(f, inp) >= 0 && sp[inp] < base);
493 argv.
lu = (argv.
lu * base) + sp[inp];
494 }
while (--width > 0 &&
495 SFGETC(f, inp) >= 0 && sp[inp] < base);
506 *((
void **) value) = (
void *)(uintptr_t)argv.
lu;
507 }
else if (
sizeof(
long) >
sizeof(int) &&
FMTCMP(size,
long,
long long)) {
508 if (fmt ==
'd' || fmt ==
'i')
509 *((
long *) value) = (long) argv.
ll;
512 }
else if (
sizeof(
short) <
sizeof(
int) &&
FMTCMP(size,
short,
long long)) {
513 if (fmt ==
'd' || fmt ==
'i')
514 *((
short *) value) = (short) argv.
ll;
517 }
else if (size ==
sizeof(
char)) {
518 if (fmt ==
'd' || fmt ==
'i')
519 *((
char *) value) = (char) argv.
ll;
523 if (fmt ==
'd' || fmt ==
'i')
524 *((
int *) value) = (int) argv.
ll;
526 *((
unsigned*)value) = (unsigned)argv.
lu;
529 }
else if (fmt ==
's' || fmt ==
'c' || fmt ==
'[') {
544 if ((n += 1) <= size)
546 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
547 }
else if (fmt ==
'c') {
549 if ((n += 1) <= size)
551 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
553 bool accepted[UCHAR_MAX + 1];
554 form = (
const char*)
setclass((
const unsigned char*)form, accepted);
556 if (!accepted[inp]) {
564 if ((n += 1) <= size)
566 }
while (--width > 0 &&
SFGETC(f, inp) >= 0);
569 if (value && (n > 0 || fmt ==
'[')) {
571 if (fmt !=
'c' && size >= 0)
576 if (width > 0 && inp >= 0)
582 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)