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_SIZE_T == SIZEOF_LONG
569#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
572#error "cannot find integer type of the same size as size_t"
591 numvalue = argvalues[fmtpos].
ll;
593 numvalue = argvalues[fmtpos].
l;
595 numvalue = argvalues[fmtpos].
i;
600 numvalue = va_arg(
args,
long long);
602 numvalue = va_arg(
args,
long);
604 numvalue = va_arg(
args,
int);
606 fmtint(numvalue, ch, forcesign, leftjust, fieldwidth, zpad,
607 precision, pointflag, target);
623 numvalue = (
unsigned long long) argvalues[fmtpos].ll;
625 numvalue = (
unsigned long) argvalues[fmtpos].l;
627 numvalue = (
unsigned int) argvalues[fmtpos].
i;
632 numvalue = (
unsigned long long) va_arg(
args,
long long);
634 numvalue = (
unsigned long) va_arg(
args,
long);
636 numvalue = (
unsigned int) va_arg(
args,
int);
638 fmtint(numvalue, ch, forcesign, leftjust, fieldwidth, zpad,
639 precision, pointflag, target);
650 cvalue = (
unsigned char) argvalues[fmtpos].
i;
652 cvalue = (
unsigned char) va_arg(
args,
int);
653 fmtchar(cvalue, leftjust, fieldwidth, target);
664 strvalue = argvalues[fmtpos].
cptr;
666 strvalue = va_arg(
args,
char *);
668 if (strvalue == NULL)
670 fmtstr(strvalue, leftjust, fieldwidth, precision, pointflag,
676 strvalue = argvalues[fmtpos].
cptr;
678 strvalue = va_arg(
args,
char *);
679 fmtptr((
const void *) strvalue, target);
694 fvalue = argvalues[fmtpos].
d;
696 fvalue = va_arg(
args,
double);
697 fmtfloat(fvalue, ch, forcesign, leftjust,
699 precision, pointflag,
706 errbuf,
sizeof(errbuf));
708 dostr(errm, strlen(errm), target);
776 longflag = longlongflag = 0;
796 accum = accum * 10 + (ch -
'0');
812 if (argtypes[accum] &&
816 last_dollar =
Max(last_dollar, accum);
830#if SIZEOF_SIZE_T == SIZEOF_LONG
832#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG
835#error "cannot find integer type of the same size as size_t"
858 if (argtypes[fmtpos] &&
859 argtypes[fmtpos] != atype)
861 argtypes[fmtpos] = atype;
862 last_dollar =
Max(last_dollar, fmtpos);
870 if (argtypes[fmtpos] &&
874 last_dollar =
Max(last_dollar, fmtpos);
883 if (argtypes[fmtpos] &&
887 last_dollar =
Max(last_dollar, fmtpos);
899 if (argtypes[fmtpos] &&
903 last_dollar =
Max(last_dollar, fmtpos);
928 for (
i = 1;
i <= last_dollar;
i++)
935 argvalues[
i].
i = va_arg(
args,
int);
938 argvalues[
i].
l = va_arg(
args,
long);
941 argvalues[
i].
ll = va_arg(
args,
long long);
944 argvalues[
i].
d = va_arg(
args,
double);
947 argvalues[
i].
cptr = va_arg(
args,
char *);
969 vallen = strlen(
value);
1000 int minlen,
int zpad,
int precision,
int pointflag,
1003 unsigned long long uvalue;
1006 const char *cvt =
"0123456789abcdef";
1033 cvt =
"0123456789ABCDEF";
1043#pragma warning(push)
1044#pragma warning(disable: 4146)
1048 uvalue = -(
unsigned long long)
value;
1050 uvalue = (
unsigned long long)
value;
1059 if (
value == 0 && pointflag && precision == 0)
1074 uvalue = uvalue / 10;
1077 else if (base == 16)
1082 uvalue = uvalue / 16;
1090 uvalue = uvalue / 8;
1095 zeropad =
Max(0, precision - vallen);
1129 int minlen,
int zpad,
int precision,
int pointflag,
1159 prec =
Min(precision, 350);
1175 static const double dzero = 0.0;
1179 memcmp(&
value, &dzero,
sizeof(
double)) != 0)),
1180 forcesign, &signvalue))
1191 zeropadlen = precision - prec;
1217 char *epos = strrchr(
convert,
'e');
1281 else if (precision > 32)
1295 static const double dzero = 0.0;
1299 memcmp(&
value, &dzero,
sizeof(
double)) != 0))
1352 if (target->
bufend != NULL)
1359 if (target->
stream == NULL)
1367 avail =
Min(avail, slen);
1381 if (target->
stream == NULL)
1405 if (target->
bufend != NULL)
1412 if (target->
stream == NULL)
1420 avail =
Min(avail, slen);
1421 memset(target->
bufptr,
c, avail);
1447 padlen = minlen - vallen;
1461 if (*padlen > 0 && zpad)
1475 maxpad = (signvalue != 0);
1476 if (*padlen > maxpad)
1486 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)