44#define PG_NL_ARGMAX 31
253 target.
bufend = buffer +
sizeof(buffer);
306 if (!target->
failed && nc > 0)
311 target->
nchars += written;
321static void fmtstr(
const char *
value,
int leftjust,
int minlen,
int maxwidth,
325 int leftjust,
int minlen,
int zpad,
int precision,
int pointflag,
329 int leftjust,
int minlen,
int zpad,
int precision,
int pointflag,
334static int adjust_sign(
int is_negative,
int forcesign,
int *signvalue);
336static void leading_pad(
int zpad,
int signvalue,
int *padlen,
354#if !HAVE_DECL_STRCHRNUL
356#define strchrnul pg_strchrnul
358static inline const char *
361 while (*s !=
'\0' && *s !=
c)
375 int save_errno = errno;
376 const char *first_pct = NULL;
394 const char *strvalue;
418 if (*next_pct ==
'\0')
428 if (first_pct == NULL)
438 strvalue = va_arg(
args,
char *);
439 if (strvalue == NULL)
441 dostr(strvalue, strlen(strvalue), target);
447 fieldwidth = precision = zpad = leftjust = forcesign = 0;
448 longflag = longlongflag = pointflag = 0;
450 have_star = afterstar =
false;
463 if (accum == 0 && !pointflag)
475 accum = accum * 10 + (ch -
'0');
498 int starval = va_arg(
args,
int);
511 fieldwidth = starval;
515 fieldwidth = -fieldwidth;
534 int starval = argvalues[accum].
i;
547 fieldwidth = starval;
551 fieldwidth = -fieldwidth;
567#if SIZEOF_INTMAX_T == SIZEOF_LONG
569#elif SIZEOF_INTMAX_T == SIZEOF_LONG_LONG
572#error "cannot find integer type of the same size as intmax_t"
576#if SIZEOF_SIZE_T == SIZEOF_LONG
578#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
581#error "cannot find integer type of the same size as size_t"
600 numvalue = argvalues[fmtpos].
ll;
602 numvalue = argvalues[fmtpos].
l;
604 numvalue = argvalues[fmtpos].
i;
609 numvalue = va_arg(
args,
long long);
611 numvalue = va_arg(
args,
long);
613 numvalue = va_arg(
args,
int);
615 fmtint(numvalue, ch, forcesign, leftjust, fieldwidth, zpad,
616 precision, pointflag, target);
632 numvalue = (
unsigned long long) argvalues[fmtpos].ll;
634 numvalue = (
unsigned long) argvalues[fmtpos].l;
636 numvalue = (
unsigned int) argvalues[fmtpos].
i;
641 numvalue = (
unsigned long long) va_arg(
args,
long long);
643 numvalue = (
unsigned long) va_arg(
args,
long);
645 numvalue = (
unsigned int) va_arg(
args,
int);
647 fmtint(numvalue, ch, forcesign, leftjust, fieldwidth, zpad,
648 precision, pointflag, target);
659 cvalue = (
unsigned char) argvalues[fmtpos].
i;
661 cvalue = (
unsigned char) va_arg(
args,
int);
662 fmtchar(cvalue, leftjust, fieldwidth, target);
673 strvalue = argvalues[fmtpos].
cptr;
675 strvalue = va_arg(
args,
char *);
677 if (strvalue == NULL)
679 fmtstr(strvalue, leftjust, fieldwidth, precision, pointflag,
685 strvalue = argvalues[fmtpos].
cptr;
687 strvalue = va_arg(
args,
char *);
688 fmtptr((
const void *) strvalue, target);
703 fvalue = argvalues[fmtpos].
d;
705 fvalue = va_arg(
args,
double);
706 fmtfloat(fvalue, ch, forcesign, leftjust,
708 precision, pointflag,
715 errbuf,
sizeof(errbuf));
717 dostr(errm, strlen(errm), target);
785 longflag = longlongflag = 0;
805 accum = accum * 10 + (ch -
'0');
821 if (argtypes[accum] &&
825 last_dollar =
Max(last_dollar, accum);
839#if SIZEOF_INTMAX_T == SIZEOF_LONG
841#elif SIZEOF_INTMAX_T == SIZEOF_LONG_LONG
844#error "cannot find integer type of the same size as intmax_t"
848#if SIZEOF_SIZE_T == SIZEOF_LONG
850#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
853#error "cannot find integer type of the same size as size_t"
876 if (argtypes[fmtpos] &&
877 argtypes[fmtpos] != atype)
879 argtypes[fmtpos] = atype;
880 last_dollar =
Max(last_dollar, fmtpos);
888 if (argtypes[fmtpos] &&
892 last_dollar =
Max(last_dollar, fmtpos);
901 if (argtypes[fmtpos] &&
905 last_dollar =
Max(last_dollar, fmtpos);
917 if (argtypes[fmtpos] &&
921 last_dollar =
Max(last_dollar, fmtpos);
946 for (
i = 1;
i <= last_dollar;
i++)
953 argvalues[
i].
i = va_arg(
args,
int);
956 argvalues[
i].
l = va_arg(
args,
long);
959 argvalues[
i].
ll = va_arg(
args,
long long);
962 argvalues[
i].
d = va_arg(
args,
double);
965 argvalues[
i].
cptr = va_arg(
args,
char *);
987 vallen = strlen(
value);
1018 int minlen,
int zpad,
int precision,
int pointflag,
1021 unsigned long long uvalue;
1024 const char *cvt =
"0123456789abcdef";
1051 cvt =
"0123456789ABCDEF";
1061#pragma warning(push)
1062#pragma warning(disable: 4146)
1066 uvalue = -(
unsigned long long)
value;
1068 uvalue = (
unsigned long long)
value;
1077 if (
value == 0 && pointflag && precision == 0)
1092 uvalue = uvalue / 10;
1095 else if (base == 16)
1100 uvalue = uvalue / 16;
1108 uvalue = uvalue / 8;
1113 zeropad =
Max(0, precision - vallen);
1147 int minlen,
int zpad,
int precision,
int pointflag,
1177 prec =
Min(precision, 350);
1193 static const double dzero = 0.0;
1197 memcmp(&
value, &dzero,
sizeof(
double)) != 0)),
1198 forcesign, &signvalue))
1209 zeropadlen = precision - prec;
1235 char *epos = strrchr(
convert,
'e');
1299 else if (precision > 32)
1313 static const double dzero = 0.0;
1317 memcmp(&
value, &dzero,
sizeof(
double)) != 0))
1370 if (target->
bufend != NULL)
1377 if (target->
stream == NULL)
1385 avail =
Min(avail, slen);
1399 if (target->
stream == NULL)
1423 if (target->
bufend != NULL)
1430 if (target->
stream == NULL)
1438 avail =
Min(avail, slen);
1439 memset(target->
bufptr,
c, avail);
1465 padlen = minlen - vallen;
1479 if (*padlen > 0 && zpad)
1493 maxpad = (signvalue != 0);
1494 if (*padlen > maxpad)
1504 else if (*padlen < 0)
Assert(PointerIsAligned(start, uint64))
#define PG_STRERROR_R_BUFLEN
size_t strnlen(const char *str, size_t maxlen)
static void dostr(const char *str, int slen, PrintfTarget *target)
static void dopr_outch(int c, PrintfTarget *target)
static void fmtint(long long value, char type, int forcesign, int leftjust, int minlen, int zpad, int precision, int pointflag, PrintfTarget *target)
static void leading_pad(int zpad, int signvalue, int *padlen, PrintfTarget *target)
int pg_strfromd(char *str, size_t count, int precision, double value)
static void fmtptr(const void *value, PrintfTarget *target)
static void flushbuffer(PrintfTarget *target)
int pg_printf(const char *fmt,...)
static void fmtchar(int value, int leftjust, int minlen, PrintfTarget *target)
static void fmtstr(const char *value, int leftjust, int minlen, int maxwidth, int pointflag, PrintfTarget *target)
int pg_vprintf(const char *fmt, va_list args)
int pg_snprintf(char *str, size_t count, const char *fmt,...)
static int compute_padlen(int minlen, int vallen, int leftjust)
int pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
static void trailing_pad(int padlen, PrintfTarget *target)
static void fmtfloat(double value, char type, int forcesign, int leftjust, int minlen, int zpad, int precision, int pointflag, PrintfTarget *target)
int pg_sprintf(char *str, const char *fmt,...)
static bool find_arguments(const char *format, va_list args, PrintfArgValue *argvalues)
int pg_vsprintf(char *str, const char *fmt, va_list args)
static void dopr(PrintfTarget *target, const char *format, va_list args)
static void dopr_outchmulti(int c, int slen, PrintfTarget *target)
int pg_fprintf(FILE *stream, const char *fmt,...)
int pg_vfprintf(FILE *stream, const char *fmt, va_list args)
static int adjust_sign(int is_negative, int forcesign, int *signvalue)
static void convert(const int_fast32_t val, char *const buf)