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;
572#if SIZEOF_VOID_P == SIZEOF_LONG
574#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
577#error "cannot find integer type of the same size as intptr_t"
589#if SIZEOF_SIZE_T == SIZEOF_LONG
591#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
594#error "cannot find integer type of the same size as size_t"
613 numvalue = argvalues[fmtpos].
ll;
615 numvalue = argvalues[fmtpos].
l;
617 numvalue = argvalues[fmtpos].
i;
622 numvalue = va_arg(
args,
long long);
624 numvalue = va_arg(
args,
long);
626 numvalue = va_arg(
args,
int);
628 fmtint(numvalue, ch, forcesign, leftjust, fieldwidth, zpad,
629 precision, pointflag, target);
645 numvalue = (
unsigned long long) argvalues[fmtpos].ll;
647 numvalue = (
unsigned long) argvalues[fmtpos].l;
649 numvalue = (
unsigned int) argvalues[fmtpos].
i;
654 numvalue = (
unsigned long long) va_arg(
args,
long long);
656 numvalue = (
unsigned long) va_arg(
args,
long);
658 numvalue = (
unsigned int) va_arg(
args,
int);
660 fmtint(numvalue, ch, forcesign, leftjust, fieldwidth, zpad,
661 precision, pointflag, target);
672 cvalue = (
unsigned char) argvalues[fmtpos].
i;
674 cvalue = (
unsigned char) va_arg(
args,
int);
675 fmtchar(cvalue, leftjust, fieldwidth, target);
686 strvalue = argvalues[fmtpos].
cptr;
688 strvalue = va_arg(
args,
char *);
690 if (strvalue == NULL)
692 fmtstr(strvalue, leftjust, fieldwidth, precision, pointflag,
698 strvalue = argvalues[fmtpos].
cptr;
700 strvalue = va_arg(
args,
char *);
701 fmtptr((
const void *) strvalue, target);
716 fvalue = argvalues[fmtpos].
d;
718 fvalue = va_arg(
args,
double);
719 fmtfloat(fvalue, ch, forcesign, leftjust,
721 precision, pointflag,
728 errbuf,
sizeof(errbuf));
730 dostr(errm, strlen(errm), target);
798 longflag = longlongflag = 0;
818 accum = accum * 10 + (ch -
'0');
834 if (argtypes[accum] &&
838 last_dollar =
Max(last_dollar, accum);
857#if SIZEOF_VOID_P == SIZEOF_LONG
859#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
862#error "cannot find integer type of the same size as intptr_t"
874#if SIZEOF_SIZE_T == SIZEOF_LONG
876#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
879#error "cannot find integer type of the same size as size_t"
902 if (argtypes[fmtpos] &&
903 argtypes[fmtpos] != atype)
905 argtypes[fmtpos] = atype;
906 last_dollar =
Max(last_dollar, fmtpos);
914 if (argtypes[fmtpos] &&
918 last_dollar =
Max(last_dollar, fmtpos);
927 if (argtypes[fmtpos] &&
931 last_dollar =
Max(last_dollar, fmtpos);
943 if (argtypes[fmtpos] &&
947 last_dollar =
Max(last_dollar, fmtpos);
972 for (
i = 1;
i <= last_dollar;
i++)
979 argvalues[
i].
i = va_arg(
args,
int);
982 argvalues[
i].
l = va_arg(
args,
long);
985 argvalues[
i].
ll = va_arg(
args,
long long);
988 argvalues[
i].
d = va_arg(
args,
double);
991 argvalues[
i].
cptr = va_arg(
args,
char *);
1013 vallen = strlen(
value);
1044 int minlen,
int zpad,
int precision,
int pointflag,
1047 unsigned long long uvalue;
1050 const char *cvt =
"0123456789abcdef";
1077 cvt =
"0123456789ABCDEF";
1087#pragma warning(push)
1088#pragma warning(disable: 4146)
1092 uvalue = -(
unsigned long long)
value;
1094 uvalue = (
unsigned long long)
value;
1103 if (
value == 0 && pointflag && precision == 0)
1118 uvalue = uvalue / 10;
1121 else if (base == 16)
1126 uvalue = uvalue / 16;
1134 uvalue = uvalue / 8;
1139 zeropad =
Max(0, precision - vallen);
1173 int minlen,
int zpad,
int precision,
int pointflag,
1203 prec =
Min(precision, 350);
1219 static const double dzero = 0.0;
1223 memcmp(&
value, &dzero,
sizeof(
double)) != 0)),
1224 forcesign, &signvalue))
1235 zeropadlen = precision - prec;
1277 char *epos = strrchr(
convert,
'e');
1341 else if (precision > 32)
1355 static const double dzero = 0.0;
1359 memcmp(&
value, &dzero,
sizeof(
double)) != 0))
1423 if (target->
bufend != NULL)
1430 if (target->
stream == NULL)
1438 avail =
Min(avail, slen);
1452 if (target->
stream == NULL)
1476 if (target->
bufend != NULL)
1483 if (target->
stream == NULL)
1491 avail =
Min(avail, slen);
1492 memset(target->
bufptr,
c, avail);
1518 padlen = minlen - vallen;
1532 if (*padlen > 0 && zpad)
1546 maxpad = (signvalue != 0);
1547 if (*padlen > maxpad)
1557 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 int32 val, char *const buf)