37 int v = 0, n_s, base, fmt,
flags;
39 char *sp, *ssp, *endsp, *ep, *endep;
40 int dot, width, precis, n, n_output = 0;
55 char decimal = 0, thousand = 0;
57#define SFputc(f,c) do { \
58 if (putc((c), (f)) == EOF) { \
62#define SFnputc(f,c,n) do { \
63 for (int i_ = 0; i_ < (n); ++i_) { \
64 if (putc((c), (f)) == EOF) { \
70#define SFwrite(f,s,n) do { \
71 if ((n) > 0 && fwrite((s), (size_t)(n), 1, (f)) < 1) { \
87 const char *form = argv.
ft->
form;
94 while (*form && *form !=
'%')
103 size = width = precis = base = n_s = -1;
106 endsp = sp = buf + (
sizeof(buf) - 1);
111 switch ((fmt = *form++)) {
135 n_str = (form - 1) - t_str;
140 n = ft->
extf(&argv, ft);
144 if ((t_str = argv.
s) && (n_str = (
int)ft->
size) < 0)
145 n_str = (ssize_t)strlen(t_str);
182 }
else if (
dot == 2) {
184 if (*form ==
'c' || *form ==
's')
187 (form[1] ==
'c' || form[1] ==
's')) {
200 }
else if (*form !=
'*')
209 if (ft->
extf(&argv, ft) < 0)
225 for (v = fmt -
'0';
gv_isdigit(*form); ++form)
226 v = v * 10 + (*form -
'0');
229 if ((width = v) < 0) {
244 size = size * 10 + (n -
'0');
245 }
else if (*form ==
'*') {
249 FMTSET(ft, form,
'I',
sizeof(
int), 0, 0, 0, 0,
NULL, 0);
250 if (ft->
extf(&argv, ft) < 0)
259 flags &= ~SFFMT_TYPES;
268 flags &= ~SFFMT_TYPES;
313 FMTSET(ft, form, fmt, size,
flags, width, precis, base, t_str, n_str);
314 v = ft->
extf(&argv, ft);
319 FMTGET(ft, form, fmt, size,
flags, width, precis, base);
334 if (!(ls = argv.
sp) || !ls[0])
343 if ((v = size) >= 0) {
344 if (precis >= 0 && v > precis)
346 }
else if (precis < 0)
349 for (v = 0; v < precis; ++v)
353 if ((n = width - v) > 0) {
374 if (!(sp = argv.
s) || !sp[0])
409 if (
sizeof(
void*) >
sizeof(int)) {
410 lv = (
long long)(intptr_t)argv.
vp;
413 v = (int)(intptr_t)argv.
vp;
423 ssp =
"0123456789ABCDEF";
441 if ((base & (n_s = base - 1)) == 0) {
443 n = base < 4 ? 1 : 2;
445 n = base < 16 ? 3 : 4;
447 n = base < 64 ? 5 : 6;
449 n_s = base == 10 ? -1 : 0;
452 if ((
sizeof(
long) >
sizeof(int) ||
sizeof(
void*) >
sizeof(int))
453 &&
FMTCMP(size,
long long,
long long)) {
456 }
else if ((
sizeof(
long) >
sizeof(
int) ||
sizeof(
void*) >
sizeof(
int))
457 &&
FMTCMP(size,
long,
long long)) {
459 lv = (
long long)argv.
l;
461 lv = (
long long)(
ulong)argv.
l;
463 if (lv == 0 && precis == 0)
465 if (lv < 0 && fmt ==
'd') {
467 if ((
unsigned long long)lv ==
HIGHBITL) {
468 lv = (
long long)(
HIGHBITL / (
unsigned long long)base);
470 (
unsigned long long)lv * (
unsigned long long)base];
476 sfucvt(lv, sp, nv, ssp,
long long,
unsigned long long);
477 }
else if (n_s > 0) {
479 *--sp = ssp[lv & n_s];
480 }
while ((lv = (
unsigned long long)lv >> n));
483 *--sp = ssp[(
unsigned long long)lv % (
unsigned long long)base];
484 }
while ((lv = (
unsigned long long)lv / (
unsigned long long)base));
487 if (
sizeof(
short) <
sizeof(int) &&
FMTCMP(size,
short,
long long)) {
490 v = (int) ((
short) argv.
h);
495 v = (int) ((
short) argv.
i);
500 }
else if (size ==
sizeof(
char)) {
503 v = (int) ((
char) argv.
c);
505 v = (int) ((
uchar) argv.
c);
508 v = (int) ((
char) argv.
i);
510 v = (int) ((
uchar) argv.
i);
516 if (v == 0 && precis == 0)
518 if (v < 0 && fmt ==
'd') {
521 v = (int)(
HIGHBITI / (
unsigned)base);
527 sfucvt(v, sp, n, ssp,
int,
unsigned);
528 }
else if (n_s > 0) {
530 *--sp = ssp[v & n_s];
531 }
while ((v = (
unsigned)v >> n));
534 *--sp = ssp[(unsigned)v % (
unsigned)base];
535 }
while ((v = (
unsigned)v / (
unsigned)base));
540 && (n = endsp - sp) > 3) {
543 for (ep = buf +
SLACK, endep = ep + n;;) {
557 if (precis > 0 && (precis -= (endsp - sp)) < (sp - buf) - 64)
567 if (fmt ==
'x' || fmt ==
'X')
572 n = base < 10 ? 2 : 3;
574 n = width - (n + (endsp - sp));
578 if (fmt ==
'x' || fmt ==
'X') {
581 }
else if (
dot >= 2) {
584 *--sp = (char) (
'0' + base);
586 *--sp =
_Sfdec[(base <<= 1) + 1];
603 dval = (double) argv.
f;
605 if (fmt ==
'e' || fmt ==
'E') {
606 n = (precis = precis < 0 ?
FPRECIS : precis) + 1;
612 }
else if (fmt ==
'f' || fmt ==
'F') {
613 precis = precis < 0 ?
FPRECIS : precis;
622 precis = precis < 0 ?
FPRECIS : precis == 0 ? 1 : precis;
633 if ((n =
sfslen()) > precis)
635 while ((n -= 1) >= 1 && ep[n] ==
'0');
640 if (decpt < -3 || decpt > precis) {
651 sp = endsp = buf + 1;
652 *endsp++ = *ep ? *ep++ :
'0';
659 while ((*endsp++ = *ep++) && ep <= endep);
660 precis -= (endsp -= 1) - ssp;
663 ep = endep = buf + (
sizeof(buf) - 1);
665 if ((n = decpt - 1) < 0)
670 *--ep = (char) (
'0' + (v - n * 10));
674 *--ep = (char) (
'0' + n);
679 *--ep = (decpt > 0 || dval == 0.) ?
'+' :
'-';
687 endsp = (sp = ep) +
sfslen();
694 endsp = sp = buf + 1;
697 if ((n = decpt % 3) == 0)
699 while (ep < endep && (*endsp++ = *ep++)) {
700 if (--n == 0 && (ep <= endep - 3)) {
706 while (ep < endep && (*endsp++ = *ep++));
714 if ((n = -decpt) > 0) {
715 ssp = endsp +
imin(n, precis);
723 while ((*endsp++ = *ep++) && ep <= endep);
724 precis -= (endsp -= 1) - ssp;
733 if (
flags == 0 && width <= 0)
741 n = (endsp - sp) + (endep - ep) + (precis <= 0 ? 0 : precis) +
743 if ((v = width - n) <= 0)
750 flags &= ~SFFMT_PREFIX;
771 if ((n = endsp - sp) > 0)
775 if ((n = precis) > 0)
779 if ((n = endep - (sp = ep)) > 0)
#define FMTGET(ft, frm, fv, sz, flgs, wid, pr, bs)
#define FMTSET(ft, frm, fv, sz, flgs, wid, pr, bs, ts, ns)