318int vxprintf(
void (*func)(
const char *,
int,
void *),
void *arg,
const char *
format, va_list ap) {
319 register const char *fmt;
321 register char *bufpt;
322 register int precision;
328 int flag_leftjustify;
331 int flag_alternateform;
335 unsigned long longvalue;
342 static const char spaces[] =
" ";
343#define SPACESIZE (sizeof(spaces) - 1)
348 for (; (
c = (*fmt)) != 0; ++fmt) {
353 while ((
c = (*++fmt)) !=
'%' &&
c != 0) amt++;
354 (*func)(bufpt, amt, arg);
358 if ((
c = (*++fmt)) == 0) {
360 (*func)(
"%", 1, arg);
365 flag_leftjustify = flag_plussign = flag_blanksign = flag_alternateform = flag_zeropad = flag_center = 0;
369 flag_leftjustify = 1;
381 flag_alternateform = 1;
395 }
while (
c == 0 && (
c = (*++fmt)) != 0);
396 if (flag_center) flag_leftjustify = 0;
400 width = va_arg(ap,
int);
402 flag_leftjustify = 1;
420 precision = va_arg(ap,
int);
423 if (precision < 0) precision = -precision;
428 precision = precision * 10 +
c -
'0';
442 scale = scale * 10 +
c -
'0';
457 for (idx = 0; idx <
NINFO; idx++) {
458 if (
c == fmtinfo[idx].fmttype) {
459 infop = &fmtinfo[idx];
469 flag_alternateform = 1;
470 width =
sizeof(uintptr_t) * 2;
499 longvalue = va_arg(ap,
long);
501 longvalue = va_arg(ap,
int);
505 if (longvalue == 0) flag_alternateform = 0;
509 if (longvalue == 0 && infop->
base == 8) flag_alternateform = 0;
512 if (*(
long *)&longvalue < 0) {
513 longvalue = -*(
long *)&longvalue;
515 }
else if (flag_plussign)
517 else if (flag_blanksign)
523 if (flag_zeropad && precision <
width - (prefix != 0)) {
524 precision =
width - (prefix != 0);
532 if (a == 0 || a > 3 || (
b > 10 &&
b < 14)) {
546 if (xtype ==
FIXED) {
547 if (scale < 0) scale = infop->
base;
548 unsigned long integer = longvalue / scale;
549 unsigned long fractional = longvalue - (integer * scale);
550 register const char *cset;
552 if (precision < 0) precision = 6;
555 for (idx = precision; idx > 0; idx--) {
559 fractional -= copy * scale;
560 *(end++) = (copy % 10) +
'0';
564 *(--bufpt) = (integer % 10) +
'0';
565 integer = integer / 10;
566 }
while (integer > 0);
568 register const char *cset;
573 *(--bufpt) = cset[longvalue % base];
574 longvalue = longvalue / base;
575 }
while (longvalue > 0);
578 for (idx = precision - length; idx > 0; idx--) {
581 if (prefix) *(--bufpt) = prefix;
582 if (flag_alternateform && infop->
prefix) {
586 if (*bufpt != pre[0]) {
587 for (pre = infop->
prefix; (x = (*pre)) != 0; pre++) *(--bufpt) = x;
593 *(va_arg(ap,
int *)) =
count;
603 c =
buf[0] = (xtype ==
CHAR ? va_arg(ap,
int) : *++fmt);
604 if (precision >= 0) {
605 for (idx = 1; idx < precision; idx++)
buf[idx] =
c;
614 zMem = bufpt = va_arg(ap,
char *);
615 if (bufpt == 0) bufpt =
"(null)";
616 length = strlen(bufpt);
617 if (precision >= 0 && precision < length) length = precision;
622 char *arg = va_arg(ap,
char *);
623 for (
i = 0;
i <
BUFSIZE - 1 && (
c = *arg++) != 0;
i++) {
624 if (c < 0x20 || c >= 0x7f) {
626 buf[
i] = (
c & 0x1f) + 0x40;
633 if (precision >= 0 && precision < length) length = precision;
640 (*func)(
"%", idx, arg);
650 if (!flag_leftjustify) {
652 nspace =
width - length;
657 flag_leftjustify = 1;
664 if (nspace > 0) (*func)(spaces, nspace, arg);
668 (*func)(bufpt, length, arg);
671#ifndef XPRINTFNOALLOC
676 if (flag_leftjustify) {
678 nspace =
width - length;
685 if (nspace > 0) (*func)(spaces, nspace, arg);
689 return errorflag ? -1 :
count;
int vsprintf(char *buf, const char *fmt, va_list ap)
Prints a formatted string to a string.
Definition xprintf.c:723
int vasprintf(char **out, const char *zFormat, va_list ap)
Prints a formatted string to a newly allocated string.
Definition xprintf.c:786
int vxprintf(void(*func)(const char *, int, void *), void *arg, const char *format, va_list ap)
Prints a formatted string to a callback.
Definition xprintf.c:318
int vsnprintf(char *buf, size_t n, const char *fmt, va_list ap)
Prints a formatted string to a length-limited string.
Definition xprintf.c:730