]> granicus.if.org Git - postgresql/commitdiff
Always use our own versions of *printf().
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 26 Sep 2018 17:13:57 +0000 (13:13 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Wed, 26 Sep 2018 17:13:57 +0000 (13:13 -0400)
We've spent an awful lot of effort over the years in coping with
platform-specific vagaries of the *printf family of functions.  Let's just
forget all that mess and standardize on always using src/port/snprintf.c.
This gets rid of a lot of configure logic, and it will allow a saner
approach to dealing with %m (though actually changing that is left for
a follow-on patch).

Preliminary performance testing suggests that as it stands, snprintf.c is
faster than the native printf functions for some tasks on some platforms,
and slower for other cases.  A pending patch will improve that, though
cases with floating-point conversions will doubtless remain slower unless
we want to put a *lot* of effort into that.  Still, we've not observed
that *printf is really a performance bottleneck for most workloads, so
I doubt this matters much.

Patch by me, reviewed by Michael Paquier

Discussion: https://postgr.es/m/2975.1526862605@sss.pgh.pa.us

16 files changed:
config/c-compiler.m4
config/c-library.m4
configure
configure.in
src/include/c.h
src/include/pg_config.h.in
src/include/pg_config.h.win32
src/include/port.h
src/interfaces/ecpg/compatlib/Makefile
src/interfaces/ecpg/ecpglib/Makefile
src/interfaces/ecpg/pgtypeslib/Makefile
src/interfaces/libpq/Makefile
src/pl/plperl/plperl.h
src/pl/plpython/plpython.h
src/port/Makefile
src/port/README

index eedaf12d69cfdf0f6443f4f859d67c67836429c2..fb58c94d4b00efeb4a826945aa9478ae71ab26fc 100644 (file)
@@ -20,15 +20,8 @@ fi])# PGAC_C_SIGNED
 # PGAC_C_PRINTF_ARCHETYPE
 # -----------------------
 # Select the format archetype to be used by gcc to check printf-type functions.
-# We prefer "gnu_printf", which matches the features glibc supports, notably
-# %m, 'z' and 'll' width modifiers ('ll' only matters if int64 requires it),
-# and argument order control if we're doing --enable-nls.  On platforms where
-# the native printf doesn't have 'z'/'ll' or arg control, we replace it with
-# src/port/snprintf.c which does, so that the only potential mismatch here is
-# whether or not %m is supported.  We need that for elog/ereport, so we live
-# with the fact that erroneous use of %m in plain printf calls won't be
-# detected.  (It appears that many versions of gcc/clang wouldn't report it
-# even if told to check according to plain printf archetype, anyway.)
+# We prefer "gnu_printf", as that most closely matches the features supported
+# by src/port/snprintf.c (particularly the %m conversion spec).
 AC_DEFUN([PGAC_PRINTF_ARCHETYPE],
 [AC_CACHE_CHECK([for printf format archetype], pgac_cv_printf_archetype,
 [ac_save_c_werror_flag=$ac_c_werror_flag
index da7fa7730374ef6863d8c8d25be6723bcf342b0d..d371f1ba6ee2b915d1d72a33da9b608e313491a7 100644 (file)
@@ -171,106 +171,6 @@ AC_DEFUN([PGAC_STRUCT_ADDRINFO],
 ])])# PGAC_STRUCT_ADDRINFO
 
 
-# PGAC_FUNC_SNPRINTF_ARG_CONTROL
-# ---------------------------------------
-# Determine if snprintf supports %1$ argument selection, e.g. %5$ selects
-# the fifth argument after the printf format string.
-# This is not in the C99 standard, but in the Single Unix Specification (SUS).
-# It is used in our language translation strings.
-#
-AC_DEFUN([PGAC_FUNC_SNPRINTF_ARG_CONTROL],
-[AC_MSG_CHECKING([whether snprintf supports argument control])
-AC_CACHE_VAL(pgac_cv_snprintf_arg_control,
-[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
-#include <string.h>
-
-int main()
-{
-  char buf[100];
-
-  /* can it swap arguments? */
-  snprintf(buf, 100, "%2\$d %1\$d", 3, 4);
-  if (strcmp(buf, "4 3") != 0)
-    return 1;
-  return 0;
-}]])],
-[pgac_cv_snprintf_arg_control=yes],
-[pgac_cv_snprintf_arg_control=no],
-[pgac_cv_snprintf_arg_control=cross])
-])dnl AC_CACHE_VAL
-AC_MSG_RESULT([$pgac_cv_snprintf_arg_control])
-])# PGAC_FUNC_SNPRINTF_ARG_CONTROL
-
-# PGAC_FUNC_SNPRINTF_SIZE_T_SUPPORT
-# ---------------------------------
-# Determine if snprintf supports the z length modifier for printing
-# size_t-sized variables. That's supported by C99 and POSIX but not
-# all platforms play ball, so we must test whether it's working.
-#
-AC_DEFUN([PGAC_FUNC_SNPRINTF_SIZE_T_SUPPORT],
-[AC_MSG_CHECKING([whether snprintf supports the %z modifier])
-AC_CACHE_VAL(pgac_cv_snprintf_size_t_support,
-[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
-#include <string.h>
-
-int main()
-{
-  char bufz[100];
-  char buf64[100];
-
-  /*
-   * Print the largest unsigned number fitting in a size_t using both %zu
-   * and the previously-determined format for 64-bit integers.  Note that
-   * we don't run this code unless we know snprintf handles 64-bit ints.
-   */
-  bufz[0] = '\0';  /* in case snprintf fails to emit anything */
-  snprintf(bufz, sizeof(bufz), "%zu", ~((size_t) 0));
-  snprintf(buf64, sizeof(buf64), "%" INT64_MODIFIER "u",
-    (unsigned PG_INT64_TYPE) ~((size_t) 0));
-  if (strcmp(bufz, buf64) != 0)
-    return 1;
-  return 0;
-}]])],
-[pgac_cv_snprintf_size_t_support=yes],
-[pgac_cv_snprintf_size_t_support=no],
-[pgac_cv_snprintf_size_t_support=cross])
-])dnl AC_CACHE_VAL
-AC_MSG_RESULT([$pgac_cv_snprintf_size_t_support])
-])# PGAC_FUNC_SNPRINTF_SIZE_T_SUPPORT
-
-# PGAC_FUNC_SNPRINTF_C99_RESULT
-# -----------------------------
-# Determine whether snprintf returns the desired buffer length when
-# it overruns the actual buffer length.  That's required by C99 and POSIX
-# but ancient platforms don't behave that way, so we must test.
-# While we're at it, let's just verify that it doesn't physically overrun
-# the buffer.
-#
-AC_DEFUN([PGAC_FUNC_SNPRINTF_C99_RESULT],
-[AC_MSG_CHECKING([whether snprintf handles buffer overrun per C99])
-AC_CACHE_VAL(pgac_cv_snprintf_c99_result,
-[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <stdio.h>
-#include <string.h>
-
-int main()
-{
-  char buf[10];
-
-  strcpy(buf, "abcdefghi");
-  if (snprintf(buf, 4, "%d", 123456) != 6)
-    return 1;
-  if (strcmp(buf, "123") != 0 || buf[4] != 'e')
-    return 1;
-  return 0;
-}]])],
-[pgac_cv_snprintf_c99_result=yes],
-[pgac_cv_snprintf_c99_result=no],
-[pgac_cv_snprintf_c99_result=cross])
-])dnl AC_CACHE_VAL
-AC_MSG_RESULT([$pgac_cv_snprintf_c99_result])
-])# PGAC_FUNC_SNPRINTF_C99_RESULT
-
-
 # PGAC_TYPE_LOCALE_T
 # ------------------
 # Check for the locale_t type and find the right header file.  macOS
index 508e3ce9c5331bcc3666c77e480887628e437f2a..c4ce1506b06f9340d3c7ae1788a8570c19435b63 100755 (executable)
--- a/configure
+++ b/configure
@@ -15367,97 +15367,6 @@ $as_echo "#define HAVE_PS_STRINGS 1" >>confdefs.h
 fi
 
 
-# We use our snprintf.c emulation if either snprintf() or vsnprintf()
-# is missing.  Yes, there are machines that have only one.  We may
-# also decide to use snprintf.c if snprintf() is present but does not
-# have all the features we need --- see below.
-
-if test "$PORTNAME" = "win32"; then
-  # Win32 gets snprintf.c built unconditionally.
-  #
-  # To properly translate all NLS languages strings, we must support the
-  # *printf() %$ format, which allows *printf() arguments to be selected
-  # by position in the translated string.
-  #
-  # libintl versions < 0.13 use the native *printf() functions, and Win32
-  # *printf() doesn't understand %$, so we must use our /port versions,
-  # which do understand %$. libintl versions >= 0.13 include their own
-  # *printf versions on Win32.  The libintl 0.13 release note text is:
-  #
-  #   C format strings with positions, as they arise when a translator
-  #   needs to reorder a sentence, are now supported on all platforms.
-  #   On those few platforms (NetBSD and Woe32) for which the native
-  #   printf()/fprintf()/... functions don't support such format
-  #   strings, replacements are provided through <libintl.h>.
-  #
-  # We could use libintl >= 0.13's *printf() if we were sure that we had
-  # a libintl >= 0.13 at runtime, but seeing that there is no clean way
-  # to guarantee that, it is best to just use our own, so we are sure to
-  # get %$ support. In include/port.h we disable the *printf() macros
-  # that might have been defined by libintl.
-  #
-  # We do this unconditionally whether NLS is used or not so we are sure
-  # that all Win32 libraries and binaries behave the same.
-  pgac_need_repl_snprintf=yes
-else
-  pgac_need_repl_snprintf=no
-  for ac_func in snprintf
-do :
-  ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf"
-if test "x$ac_cv_func_snprintf" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_SNPRINTF 1
-_ACEOF
-
-else
-  pgac_need_repl_snprintf=yes
-fi
-done
-
-  for ac_func in vsnprintf
-do :
-  ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf"
-if test "x$ac_cv_func_vsnprintf" = xyes; then :
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_VSNPRINTF 1
-_ACEOF
-
-else
-  pgac_need_repl_snprintf=yes
-fi
-done
-
-fi
-
-
-# Check whether <stdio.h> declares snprintf() and vsnprintf(); if not,
-# include/c.h will provide declarations.  Note this is a separate test
-# from whether the functions exist in the C library --- there are
-# systems that have the functions but don't bother to declare them :-(
-
-ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default"
-if test "x$ac_cv_have_decl_snprintf" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_SNPRINTF $ac_have_decl
-_ACEOF
-ac_fn_c_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default"
-if test "x$ac_cv_have_decl_vsnprintf" = xyes; then :
-  ac_have_decl=1
-else
-  ac_have_decl=0
-fi
-
-cat >>confdefs.h <<_ACEOF
-#define HAVE_DECL_VSNPRINTF $ac_have_decl
-_ACEOF
-
-
-
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf" >&5
 $as_echo_n "checking for isinf... " >&6; }
 if ${ac_cv_func_isinf+:} false; then :
 # Run tests below here
 # --------------------
 
-# For NLS, force use of our snprintf if system's doesn't do arg control.
-# See comment above at snprintf test for details.
-if test "$enable_nls" = yes -a "$pgac_need_repl_snprintf" = no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf supports argument control" >&5
-$as_echo_n "checking whether snprintf supports argument control... " >&6; }
-if ${pgac_cv_snprintf_arg_control+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  pgac_cv_snprintf_arg_control=cross
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <string.h>
-
-int main()
-{
-  char buf[100];
-
-  /* can it swap arguments? */
-  snprintf(buf, 100, "%2\$d %1\$d", 3, 4);
-  if (strcmp(buf, "4 3") != 0)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  pgac_cv_snprintf_arg_control=yes
-else
-  pgac_cv_snprintf_arg_control=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_snprintf_arg_control" >&5
-$as_echo "$pgac_cv_snprintf_arg_control" >&6; }
-
-  if test $pgac_cv_snprintf_arg_control != yes ; then
-    pgac_need_repl_snprintf=yes
-  fi
-fi
-
-
 
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether long int is 64 bits" >&5
 $as_echo_n "checking whether long int is 64 bits... " >&6; }
@@ -16401,8 +16263,6 @@ _ACEOF
 
 
 # Select the printf length modifier that goes with that, too.
-# (This used to be bound up with replacement-snprintf selection, but now
-# we assume that the native *printf functions use standard length modifiers.)
 if test x"$pg_int64_type" = x"long long int" ; then
   INT64_MODIFIER='"ll"'
 else
@@ -16415,120 +16275,6 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
-# Force use of our snprintf if the system's doesn't support the %z flag.
-# (Note this test uses PG_INT64_TYPE and INT64_MODIFIER.)
-if test "$pgac_need_repl_snprintf" = no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf supports the %z modifier" >&5
-$as_echo_n "checking whether snprintf supports the %z modifier... " >&6; }
-if ${pgac_cv_snprintf_size_t_support+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  pgac_cv_snprintf_size_t_support=cross
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <string.h>
-
-int main()
-{
-  char bufz[100];
-  char buf64[100];
-
-  /*
-   * Print the largest unsigned number fitting in a size_t using both %zu
-   * and the previously-determined format for 64-bit integers.  Note that
-   * we don't run this code unless we know snprintf handles 64-bit ints.
-   */
-  bufz[0] = '\0';  /* in case snprintf fails to emit anything */
-  snprintf(bufz, sizeof(bufz), "%zu", ~((size_t) 0));
-  snprintf(buf64, sizeof(buf64), "%" INT64_MODIFIER "u",
-    (unsigned PG_INT64_TYPE) ~((size_t) 0));
-  if (strcmp(bufz, buf64) != 0)
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  pgac_cv_snprintf_size_t_support=yes
-else
-  pgac_cv_snprintf_size_t_support=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_snprintf_size_t_support" >&5
-$as_echo "$pgac_cv_snprintf_size_t_support" >&6; }
-
-  if test "$pgac_cv_snprintf_size_t_support" != yes; then
-    pgac_need_repl_snprintf=yes
-  fi
-fi
-
-# Force use of our snprintf if the system's doesn't handle buffer overrun
-# as specified by C99.
-if test "$pgac_need_repl_snprintf" = no; then
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf handles buffer overrun per C99" >&5
-$as_echo_n "checking whether snprintf handles buffer overrun per C99... " >&6; }
-if ${pgac_cv_snprintf_c99_result+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if test "$cross_compiling" = yes; then :
-  pgac_cv_snprintf_c99_result=cross
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-#include <stdio.h>
-#include <string.h>
-
-int main()
-{
-  char buf[10];
-
-  strcpy(buf, "abcdefghi");
-  if (snprintf(buf, 4, "%d", 123456) != 6)
-    return 1;
-  if (strcmp(buf, "123") != 0 || buf[4] != 'e')
-    return 1;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_run "$LINENO"; then :
-  pgac_cv_snprintf_c99_result=yes
-else
-  pgac_cv_snprintf_c99_result=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
-  conftest.$ac_objext conftest.beam conftest.$ac_ext
-fi
-
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_snprintf_c99_result" >&5
-$as_echo "$pgac_cv_snprintf_c99_result" >&6; }
-
-  if test "$pgac_cv_snprintf_c99_result" != yes; then
-    pgac_need_repl_snprintf=yes
-  fi
-fi
-
-# Now we have checked all the reasons to replace snprintf
-if test $pgac_need_repl_snprintf = yes; then
-
-$as_echo "#define USE_REPL_SNPRINTF 1" >>confdefs.h
-
-  case " $LIBOBJS " in
-  *" snprintf.$ac_objext "* ) ;;
-  *) LIBOBJS="$LIBOBJS snprintf.$ac_objext"
- ;;
-esac
-
-fi
-
 # has to be down here, rather than with the other builtins, because
 # the test uses PG_INT64_TYPE.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_mul_overflow" >&5
index 70de4a1aa7a921483bbbc8190b6649a952be93c7..158d5a1ac826b89505edd2605c53d36cc40ae318 100644 (file)
@@ -1622,53 +1622,6 @@ if test "$pgac_cv_var_PS_STRINGS" = yes ; then
 fi
 
 
-# We use our snprintf.c emulation if either snprintf() or vsnprintf()
-# is missing.  Yes, there are machines that have only one.  We may
-# also decide to use snprintf.c if snprintf() is present but does not
-# have all the features we need --- see below.
-
-if test "$PORTNAME" = "win32"; then
-  # Win32 gets snprintf.c built unconditionally.
-  #
-  # To properly translate all NLS languages strings, we must support the
-  # *printf() %$ format, which allows *printf() arguments to be selected
-  # by position in the translated string.
-  #
-  # libintl versions < 0.13 use the native *printf() functions, and Win32
-  # *printf() doesn't understand %$, so we must use our /port versions,
-  # which do understand %$. libintl versions >= 0.13 include their own
-  # *printf versions on Win32.  The libintl 0.13 release note text is:
-  #
-  #   C format strings with positions, as they arise when a translator
-  #   needs to reorder a sentence, are now supported on all platforms.
-  #   On those few platforms (NetBSD and Woe32) for which the native
-  #   printf()/fprintf()/... functions don't support such format
-  #   strings, replacements are provided through <libintl.h>.
-  #
-  # We could use libintl >= 0.13's *printf() if we were sure that we had
-  # a libintl >= 0.13 at runtime, but seeing that there is no clean way
-  # to guarantee that, it is best to just use our own, so we are sure to
-  # get %$ support. In include/port.h we disable the *printf() macros
-  # that might have been defined by libintl.
-  #
-  # We do this unconditionally whether NLS is used or not so we are sure
-  # that all Win32 libraries and binaries behave the same.
-  pgac_need_repl_snprintf=yes
-else
-  pgac_need_repl_snprintf=no
-  AC_CHECK_FUNCS(snprintf, [], pgac_need_repl_snprintf=yes)
-  AC_CHECK_FUNCS(vsnprintf, [], pgac_need_repl_snprintf=yes)
-fi
-
-
-# Check whether <stdio.h> declares snprintf() and vsnprintf(); if not,
-# include/c.h will provide declarations.  Note this is a separate test
-# from whether the functions exist in the C library --- there are
-# systems that have the functions but don't bother to declare them :-(
-
-AC_CHECK_DECLS([snprintf, vsnprintf])
-
-
 dnl Cannot use AC_CHECK_FUNC because isinf may be a macro
 AC_CACHE_CHECK([for isinf], ac_cv_func_isinf,
 [AC_LINK_IFELSE([AC_LANG_PROGRAM([
@@ -1838,16 +1791,6 @@ for the exact reason.]])],
 # Run tests below here
 # --------------------
 
-# For NLS, force use of our snprintf if system's doesn't do arg control.
-# See comment above at snprintf test for details.
-if test "$enable_nls" = yes -a "$pgac_need_repl_snprintf" = no; then
-  PGAC_FUNC_SNPRINTF_ARG_CONTROL
-  if test $pgac_cv_snprintf_arg_control != yes ; then
-    pgac_need_repl_snprintf=yes
-  fi
-fi
-
-
 dnl Check to see if we have a working 64-bit integer type.
 dnl Since Postgres 8.4, we no longer support compilers without a working
 dnl 64-bit type; but we have to determine whether that type is called
@@ -1870,8 +1813,6 @@ AC_DEFINE_UNQUOTED(PG_INT64_TYPE, $pg_int64_type,
   [Define to the name of a signed 64-bit integer type.])
 
 # Select the printf length modifier that goes with that, too.
-# (This used to be bound up with replacement-snprintf selection, but now
-# we assume that the native *printf functions use standard length modifiers.)
 if test x"$pg_int64_type" = x"long long int" ; then
   INT64_MODIFIER='"ll"'
 else
@@ -1881,30 +1822,6 @@ fi
 AC_DEFINE_UNQUOTED(INT64_MODIFIER, $INT64_MODIFIER,
                    [Define to the appropriate printf length modifier for 64-bit ints.])
 
-# Force use of our snprintf if the system's doesn't support the %z flag.
-# (Note this test uses PG_INT64_TYPE and INT64_MODIFIER.)
-if test "$pgac_need_repl_snprintf" = no; then
-  PGAC_FUNC_SNPRINTF_SIZE_T_SUPPORT
-  if test "$pgac_cv_snprintf_size_t_support" != yes; then
-    pgac_need_repl_snprintf=yes
-  fi
-fi
-
-# Force use of our snprintf if the system's doesn't handle buffer overrun
-# as specified by C99.
-if test "$pgac_need_repl_snprintf" = no; then
-  PGAC_FUNC_SNPRINTF_C99_RESULT
-  if test "$pgac_cv_snprintf_c99_result" != yes; then
-    pgac_need_repl_snprintf=yes
-  fi
-fi
-
-# Now we have checked all the reasons to replace snprintf
-if test $pgac_need_repl_snprintf = yes; then
-  AC_DEFINE(USE_REPL_SNPRINTF, 1, [Use replacement snprintf() functions.])
-  AC_LIBOBJ(snprintf)
-fi
-
 # has to be down here, rather than with the other builtins, because
 # the test uses PG_INT64_TYPE.
 PGAC_C_BUILTIN_OP_OVERFLOW
index 13c794d8eaa53123a9668de82a5933481c937beb..25d7d6036d445e573c8184b4064214e3e9264bda 100644 (file)
@@ -1147,14 +1147,6 @@ typedef union PGAlignedXLogBlock
  * standard C library.
  */
 
-#if !HAVE_DECL_SNPRINTF
-extern int     snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3, 4);
-#endif
-
-#if !HAVE_DECL_VSNPRINTF
-extern int     vsnprintf(char *str, size_t count, const char *fmt, va_list args);
-#endif
-
 #if defined(HAVE_FDATASYNC) && !HAVE_DECL_FDATASYNC
 extern int     fdatasync(int fildes);
 #endif
index e576831a71521e1a0959a0bb4ff919cbc5c9f178..7cabcd1e7537c5be127d8222448405a2c2287214 100644 (file)
    don't. */
 #undef HAVE_DECL_RTLD_NOW
 
-/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
-   don't. */
-#undef HAVE_DECL_SNPRINTF
-
 /* Define to 1 if you have the declaration of `strlcat', and to 0 if you
    don't. */
 #undef HAVE_DECL_STRLCAT
    don't. */
 #undef HAVE_DECL_SYS_SIGLIST
 
-/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
-   don't. */
-#undef HAVE_DECL_VSNPRINTF
-
 /* Define to 1 if you have the `dlopen' function. */
 #undef HAVE_DLOPEN
 
 /* Define to 1 if you have the `shm_open' function. */
 #undef HAVE_SHM_OPEN
 
-/* Define to 1 if you have the `snprintf' function. */
-#undef HAVE_SNPRINTF
-
 /* Define to 1 if you have spinlocks. */
 #undef HAVE_SPINLOCKS
 
 /* Define to 1 if you have the <uuid/uuid.h> header file. */
 #undef HAVE_UUID_UUID_H
 
-/* Define to 1 if you have the `vsnprintf' function. */
-#undef HAVE_VSNPRINTF
-
 /* Define to 1 if you have the <wchar.h> header file. */
 #undef HAVE_WCHAR_H
 
 /* Define to 1 to build with PAM support. (--with-pam) */
 #undef USE_PAM
 
-/* Use replacement snprintf() functions. */
-#undef USE_REPL_SNPRINTF
-
 /* Define to 1 to use software CRC-32C implementation (slicing-by-8). */
 #undef USE_SLICING_BY_8_CRC32C
 
index 536f06c38cbcd1977f7359cea0290c01340c2dec..45d47e996a0339ac381e818d866a0bfd64b4afe4 100644 (file)
    don't. */
 #define HAVE_DECL_RTLD_NOW 0
 
-/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
-   don't. */
-#define HAVE_DECL_SNPRINTF 1
-
 /* Define to 1 if you have the declaration of `strnlen', and to 0 if you
    don't. */
 #define HAVE_DECL_STRNLEN 1
    don't. */
 #define HAVE_DECL_STRTOULL 1
 
-/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
-   don't. */
-#define HAVE_DECL_VSNPRINTF 1
-
 /* Define to 1 if you have the `dlopen' function. */
 /* #undef HAVE_DLOPEN */
 
 /* Define to 1 if you have the `setsid' function. */
 /* #undef HAVE_SETSID */
 
-/* Define to 1 if you have the `snprintf' function. */
-/* #undef HAVE_SNPRINTF */
-
 /* Define to 1 if you have spinlocks. */
 #define HAVE_SPINLOCKS 1
 
 /* Define to 1 if you have the <utime.h> header file. */
 #define HAVE_UTIME_H 1
 
-/* Define to 1 if you have the `vsnprintf' function. */
-#define HAVE_VSNPRINTF 1
-
 /* Define to 1 if you have the <wchar.h> header file. */
 #define HAVE_WCHAR_H 1
 
 /* Define to 1 to build with PAM support. (--with-pam) */
 /* #undef USE_PAM */
 
-/* Use replacement snprintf() functions. */
-#define USE_REPL_SNPRINTF 1
-
 /* Define to 1 to use software CRC-32C implementation (slicing-by-8). */
 #if (_MSC_VER < 1500)
 #define USE_SLICING_BY_8_CRC32C 1
index abbe1ad9a1a6db87bf44c4ff0f32501be384cc44..597d05e55345c90bd28ff0b4f6ec211fa832cdcf 100644 (file)
@@ -134,7 +134,12 @@ extern unsigned char pg_tolower(unsigned char ch);
 extern unsigned char pg_ascii_toupper(unsigned char ch);
 extern unsigned char pg_ascii_tolower(unsigned char ch);
 
-#ifdef USE_REPL_SNPRINTF
+/*
+ * Beginning in v12, we always replace snprintf() and friends with our own
+ * implementation.  This symbol is no longer consulted by the core code,
+ * but keep it defined anyway in case any extensions are looking at it.
+ */
+#define USE_REPL_SNPRINTF 1
 
 /*
  * Versions of libintl >= 0.13 try to replace printf() and friends with
@@ -187,7 +192,6 @@ extern int  pg_printf(const char *fmt,...) pg_attribute_printf(1, 2);
 #define fprintf                        pg_fprintf
 #define printf                 pg_printf
 #endif
-#endif                                                 /* USE_REPL_SNPRINTF */
 
 /* Replace strerror() with our own, somewhat more robust wrapper */
 extern char *pg_strerror(int errnum);
index b7bd16290279207a470c2fe7cc926722efea2804..e07a7fa8134a9f500bc0057aaaf2e41d8da02a84 100644 (file)
@@ -31,7 +31,8 @@ SHLIB_EXPORTS = exports.txt
 # Need to recompile any libpgport object files
 LIBS := $(filter-out -lpgport, $(LIBS))
 
-OBJS= informix.o strerror.o $(filter snprintf.o strnlen.o, $(LIBOBJS)) $(WIN32RES)
+OBJS= informix.o snprintf.o strerror.o \
+       $(filter strnlen.o, $(LIBOBJS)) $(WIN32RES)
 
 PKG_CONFIG_REQUIRES_PRIVATE = libecpg libpgtypes
 
index 005d25a2bcdc9c0df7beb6fbe9b47e77f9b71069..b381623f18e014a541639020fff5778ce4cdab0c 100644 (file)
@@ -26,8 +26,8 @@ override CFLAGS += $(PTHREAD_CFLAGS)
 LIBS := $(filter-out -lpgport, $(LIBS))
 
 OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \
-       connect.o misc.o path.o pgstrcasecmp.o strerror.o \
-       $(filter snprintf.o strlcpy.o strnlen.o win32setlocale.o isinf.o, $(LIBOBJS)) \
+       connect.o misc.o path.o pgstrcasecmp.o snprintf.o strerror.o \
+       $(filter strlcpy.o strnlen.o win32setlocale.o isinf.o, $(LIBOBJS)) \
        $(WIN32RES)
 
 # thread.c is needed only for non-WIN32 implementation of path.c
index 18b2402d0f3b4cd130a69fb84160549c5492aad0..15d7f336640c1e39a12efe13bbde2a874545bedf 100644 (file)
@@ -30,8 +30,8 @@ SHLIB_LINK += $(filter -lm, $(LIBS))
 SHLIB_EXPORTS = exports.txt
 
 OBJS= numeric.o datetime.o common.o dt_common.o timestamp.o interval.o \
-       pgstrcasecmp.o strerror.o \
-       $(filter rint.o snprintf.o strnlen.o, $(LIBOBJS)) \
+       pgstrcasecmp.o snprintf.o strerror.o \
+       $(filter rint.o strnlen.o, $(LIBOBJS)) \
        string.o \
        $(WIN32RES)
 
index 8324f4f057d34fbbc3ac81e843c0b4ffafe73f72..a106088a9ffde637b18c62a0b2b200a20c5b341c 100644 (file)
@@ -36,9 +36,9 @@ OBJS= fe-auth.o fe-auth-scram.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-l
        libpq-events.o
 # libpgport C files we always use
 OBJS += chklocale.o inet_net_ntop.o noblock.o pgstrcasecmp.o pqsignal.o \
-       strerror.o thread.o
+       snprintf.o strerror.o thread.o
 # libpgport C files that are needed if identified by configure
-OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o system.o snprintf.o strlcpy.o strnlen.o win32error.o win32setlocale.o, $(LIBOBJS))
+OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o system.o strlcpy.o strnlen.o win32error.o win32setlocale.o, $(LIBOBJS))
 
 ifeq ($(enable_strong_random), yes)
 OBJS += pg_strong_random.o
index e6241f03ea00df6b48273215064964d305f73ab2..f8888a451ec52980051a0362298e8e849a8f5f9f 100644 (file)
  * Sometimes perl carefully scribbles on our *printf macros.
  * So we undefine them here and redefine them after it's done its dirty deed.
  */
-
-#ifdef USE_REPL_SNPRINTF
 #undef snprintf
 #undef vsnprintf
-#endif
 
 /*
  * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's
@@ -99,7 +96,6 @@
 #endif
 
 /* put back our snprintf and vsnprintf */
-#ifdef USE_REPL_SNPRINTF
 #ifdef snprintf
 #undef snprintf
 #endif
 #define vsnprintf              pg_vsnprintf
 #define snprintf               pg_snprintf
 #endif                                                 /* __GNUC__ */
-#endif                                                 /* USE_REPL_SNPRINTF */
 
 /* perl version and platform portability */
 #define NEED_eval_pv
index 6cc323a568d19ea148ee7004ca99e8ce68bebed4..aefbfc2f82b0c1d0170ab8087cbd11cd0cf90b2d 100644 (file)
  * Sometimes python carefully scribbles on our *printf macros.
  * So we undefine them here and redefine them after it's done its dirty deed.
  */
-
-#ifdef USE_REPL_SNPRINTF
 #undef snprintf
 #undef vsnprintf
-#endif
 
 #if defined(_MSC_VER) && defined(_DEBUG)
 /* Python uses #pragma to bring in a non-default libpython on VC++ if
@@ -124,7 +121,6 @@ typedef int Py_ssize_t;
 #include <eval.h>
 
 /* put back our snprintf and vsnprintf */
-#ifdef USE_REPL_SNPRINTF
 #ifdef snprintf
 #undef snprintf
 #endif
@@ -138,7 +134,6 @@ typedef int Py_ssize_t;
 #define vsnprintf                              pg_vsnprintf
 #define snprintf                               pg_snprintf
 #endif                                                 /* __GNUC__ */
-#endif                                                 /* USE_REPL_SNPRINTF */
 
 /*
  * Used throughout, and also by the Python 2/3 porting layer, so it's easier to
index b3a10ba014f4932d4f141235757c26f7c25e96af..a2ee8e2d6d0bd64fe3712cd4589cbdcc0ef4d264 100644 (file)
@@ -33,7 +33,8 @@ LIBS += $(PTHREAD_LIBS)
 OBJS = $(LIBOBJS) $(PG_CRC32C_OBJS) chklocale.o erand48.o inet_net_ntop.o \
        noblock.o path.o pgcheckdir.o pgmkdirp.o pgsleep.o \
        pgstrcasecmp.o pqsignal.o \
-       qsort.o qsort_arg.o quotes.o sprompt.o strerror.o tar.o thread.o
+       qsort.o qsort_arg.o quotes.o snprintf.o sprompt.o strerror.o \
+       tar.o thread.o
 
 ifeq ($(enable_strong_random), yes)
 OBJS += pg_strong_random.o
index 4ae96da0158875b82ca88ce74a41e2121449bc25..c446b46e26ef3f1243f73a4d9b330f2690bc569d 100644 (file)
@@ -18,7 +18,7 @@ and adding infrastructure to recompile the object files:
 
         OBJS= execute.o typename.o descriptor.o data.o error.o prepare.o memory.o \
                 connect.o misc.o path.o exec.o \
-                $(filter snprintf.o, $(LIBOBJS))
+                $(filter strlcat.o, $(LIBOBJS))
 
 The problem is that there is no testing of which object files need to be
 added, but missing functions usually show up when linking user