44 #define PG_NL_ARGMAX 31
253 target.
bufend = buffer +
sizeof(buffer);
306 if (!target->
failed && nc > 0)
311 target->
nchars += written;
321 static 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,
334 static int adjust_sign(
int is_negative,
int forcesign,
int *signvalue);
336 static void leading_pad(
int zpad,
int signvalue,
int *padlen,
347 #ifndef HAVE_STRCHRNUL
349 static inline const char *
352 while (*s !=
'\0' && *s !=
c)
378 int save_errno = errno;
379 const char *first_pct = NULL;
397 const char *strvalue;
421 if (*next_pct ==
'\0')
431 if (first_pct == NULL)
441 strvalue = va_arg(
args,
char *);
442 if (strvalue == NULL)
444 dostr(strvalue, strlen(strvalue), target);
450 fieldwidth = precision = zpad = leftjust = forcesign = 0;
451 longflag = longlongflag = pointflag = 0;
453 have_star = afterstar =
false;
466 if (accum == 0 && !pointflag)
478 accum = accum * 10 + (ch -
'0');
501 int starval = va_arg(
args,
int);
514 fieldwidth = starval;
518 fieldwidth = -fieldwidth;
537 int starval = argvalues[accum].
i;
550 fieldwidth = starval;
554 fieldwidth = -fieldwidth;
570 #if SIZEOF_SIZE_T == 8
571 #ifdef HAVE_LONG_INT_64
573 #elif defined(HAVE_LONG_LONG_INT_64)
576 #error "Don't know how to print 64bit integers"
598 numvalue = argvalues[fmtpos].
ll;
600 numvalue = argvalues[fmtpos].
l;
602 numvalue = argvalues[fmtpos].
i;
607 numvalue = va_arg(
args,
long long);
609 numvalue = va_arg(
args,
long);
611 numvalue = va_arg(
args,
int);
613 fmtint(numvalue, ch, forcesign, leftjust, fieldwidth, zpad,
614 precision, pointflag, target);
630 numvalue = (
unsigned long long) argvalues[fmtpos].ll;
632 numvalue = (
unsigned long) argvalues[fmtpos].l;
634 numvalue = (
unsigned int) argvalues[fmtpos].
i;
639 numvalue = (
unsigned long long) va_arg(
args,
long long);
641 numvalue = (
unsigned long) va_arg(
args,
long);
643 numvalue = (
unsigned int) va_arg(
args,
int);
645 fmtint(numvalue, ch, forcesign, leftjust, fieldwidth, zpad,
646 precision, pointflag, target);
657 cvalue = (
unsigned char) argvalues[fmtpos].
i;
659 cvalue = (
unsigned char) va_arg(
args,
int);
660 fmtchar(cvalue, leftjust, fieldwidth, target);
671 strvalue = argvalues[fmtpos].
cptr;
673 strvalue = va_arg(
args,
char *);
675 if (strvalue == NULL)
677 fmtstr(strvalue, leftjust, fieldwidth, precision, pointflag,
683 strvalue = argvalues[fmtpos].
cptr;
685 strvalue = va_arg(
args,
char *);
686 fmtptr((
const void *) strvalue, target);
701 fvalue = argvalues[fmtpos].
d;
703 fvalue = va_arg(
args,
double);
704 fmtfloat(fvalue, ch, forcesign, leftjust,
706 precision, pointflag,
713 errbuf,
sizeof(errbuf));
715 dostr(errm, strlen(errm), target);
764 MemSet(argtypes, 0,
sizeof(argtypes));
787 longflag = longlongflag = 0;
807 accum = accum * 10 + (ch -
'0');
823 if (argtypes[accum] &&
827 last_dollar =
Max(last_dollar, accum);
841 #if SIZEOF_SIZE_T == 8
842 #ifdef HAVE_LONG_INT_64
844 #elif defined(HAVE_LONG_LONG_INT_64)
847 #error "Don't know how to print 64bit integers"
873 if (argtypes[fmtpos] &&
874 argtypes[fmtpos] != atype)
876 argtypes[fmtpos] = atype;
877 last_dollar =
Max(last_dollar, fmtpos);
885 if (argtypes[fmtpos] &&
889 last_dollar =
Max(last_dollar, fmtpos);
898 if (argtypes[fmtpos] &&
902 last_dollar =
Max(last_dollar, fmtpos);
914 if (argtypes[fmtpos] &&
918 last_dollar =
Max(last_dollar, fmtpos);
943 for (
i = 1;
i <= last_dollar;
i++)
950 argvalues[
i].
i = va_arg(
args,
int);
953 argvalues[
i].
l = va_arg(
args,
long);
956 argvalues[
i].
ll = va_arg(
args,
long long);
959 argvalues[
i].
d = va_arg(
args,
double);
962 argvalues[
i].
cptr = va_arg(
args,
char *);
984 vallen = strlen(
value);
1015 int minlen,
int zpad,
int precision,
int pointflag,
1018 unsigned long long uvalue;
1021 const char *cvt =
"0123456789abcdef";
1048 cvt =
"0123456789ABCDEF";
1058 #pragma warning(push)
1059 #pragma warning(disable: 4146)
1063 uvalue = -(
unsigned long long)
value;
1065 uvalue = (
unsigned long long)
value;
1067 #pragma warning(pop)
1074 if (
value == 0 && pointflag && precision == 0)
1089 uvalue = uvalue / 10;
1092 else if (base == 16)
1097 uvalue = uvalue / 16;
1105 uvalue = uvalue / 8;
1110 zeropad =
Max(0, precision - vallen);
1144 int minlen,
int zpad,
int precision,
int pointflag,
1174 prec =
Min(precision, 350);
1190 static const double dzero = 0.0;
1194 memcmp(&
value, &dzero,
sizeof(
double)) != 0)),
1195 forcesign, &signvalue))
1206 zeropadlen = precision - prec;
1248 char *epos = strrchr(
convert,
'e');
1312 else if (precision > 32)
1326 static const double dzero = 0.0;
1330 memcmp(&
value, &dzero,
sizeof(
double)) != 0))
1394 if (target->
bufend != NULL)
1401 if (target->
stream == NULL)
1409 avail =
Min(avail, slen);
1423 if (target->
stream == NULL)
1447 if (target->
bufend != NULL)
1454 if (target->
stream == NULL)
1462 avail =
Min(avail, slen);
1463 memset(target->
bufptr,
c, avail);
1489 padlen = minlen - vallen;
1503 if (*padlen > 0 && zpad)
1517 maxpad = (signvalue != 0);
1518 if (*padlen > maxpad)
1528 else if (*padlen < 0)
#define MemSet(start, val, len)
Assert(fmt[strlen(fmt) - 1] !='\n')
static void const char * fmt
#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 const char * strchrnul(const char *s, int c)
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)