From e0e7589169fb0246dd5c6accc64b66820f4549af Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 6 Dec 2005 02:29:04 +0000 Subject: [PATCH] Make Win32 build use our port/snprintf.c routines, instead of depending on libintl which may or may not provide what we need. Make a few marginal cleanups to ensure this works. Andrew Dunstan and Tom Lane. --- configure | 19 +++++++++---------- configure.in | 25 ++++++++++++------------- src/include/c.h | 7 +++---- src/include/pg_config.h.in | 2 +- src/include/pg_config.h.win32 | 4 ---- src/include/port.h | 28 +++++++++++++++++++++++++--- src/interfaces/ecpg/ecpglib/Makefile | 16 +++++++--------- src/interfaces/libpq/win32.h | 3 --- 8 files changed, 57 insertions(+), 47 deletions(-) diff --git a/configure b/configure index 089573a0a7..48d5324209 100755 --- a/configure +++ b/configure @@ -13893,7 +13893,11 @@ fi # also decide to use snprintf.c if snprintf() is present but does not # have all the features we need --- see below. -pgac_need_repl_snprintf=no +if test "$PORTNAME" = "win32"; then + # Win32 gets this built unconditionally + pgac_need_repl_snprintf=yes +else + pgac_need_repl_snprintf=no for ac_func in snprintf do @@ -14102,6 +14106,7 @@ else fi done +fi # Check whether declares snprintf() and vsnprintf(); if not, @@ -17151,14 +17156,8 @@ fi # Force use of our snprintf if system's doesn't do arg control -# This feature is used by NLS -if test "$enable_nls" = yes && - test $pgac_need_repl_snprintf = no && -# On Win32, libintl replaces snprintf() with its own version that -# understands arg control, so we don't need our own. In fact, it -# also uses macros that conflict with ours, so we _can't_ use -# our own. - test "$PORTNAME" != "win32"; then +# This feature is needed by NLS +if test "$enable_nls" = yes -a "$pgac_need_repl_snprintf" = no; then echo "$as_me:$LINENO: checking whether printf supports argument control" >&5 echo $ECHO_N "checking whether printf supports argument control... $ECHO_C" >&6 if test "${pgac_cv_printf_arg_control+set}" = set; then @@ -17645,7 +17644,7 @@ _ACEOF if test $pgac_need_repl_snprintf = yes; then cat >>confdefs.h <<\_ACEOF -#define USE_SNPRINTF 1 +#define USE_REPL_SNPRINTF 1 _ACEOF case $LIBOBJS in diff --git a/configure.in b/configure.in index 99ad9be36d..b78f4a1129 100644 --- a/configure.in +++ b/configure.in @@ -1,5 +1,5 @@ dnl Process this file with autoconf to produce a configure script. -dnl $PostgreSQL: pgsql/configure.in,v 1.433 2005/12/04 03:52:24 momjian Exp $ +dnl $PostgreSQL: pgsql/configure.in,v 1.434 2005/12/06 02:29:03 tgl Exp $ dnl dnl Developers, please strive to achieve this order: dnl @@ -857,9 +857,14 @@ fi # also decide to use snprintf.c if snprintf() is present but does not # have all the features we need --- see below. -pgac_need_repl_snprintf=no -AC_CHECK_FUNCS(snprintf, [], pgac_need_repl_snprintf=yes) -AC_CHECK_FUNCS(vsnprintf, [], pgac_need_repl_snprintf=yes) +if test "$PORTNAME" = "win32"; then + # Win32 gets this built unconditionally + 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 declares snprintf() and vsnprintf(); if not, @@ -1052,14 +1057,8 @@ AC_MSG_ERROR([[ # Force use of our snprintf if system's doesn't do arg control -# This feature is used by NLS -if test "$enable_nls" = yes && - test $pgac_need_repl_snprintf = no && -# On Win32, libintl replaces snprintf() with its own version that -# understands arg control, so we don't need our own. In fact, it -# also uses macros that conflict with ours, so we _can't_ use -# our own. - test "$PORTNAME" != "win32"; then +# This feature is needed by NLS +if test "$enable_nls" = yes -a "$pgac_need_repl_snprintf" = no; then PGAC_FUNC_PRINTF_ARG_CONTROL if test $pgac_cv_printf_arg_control != yes ; then pgac_need_repl_snprintf=yes @@ -1134,7 +1133,7 @@ AC_DEFINE_UNQUOTED(UINT64_FORMAT, $UINT64_FORMAT, # Now we have checked all the reasons to replace snprintf if test $pgac_need_repl_snprintf = yes; then - AC_DEFINE(USE_SNPRINTF, 1, [Use replacement snprintf() functions.]) + AC_DEFINE(USE_REPL_SNPRINTF, 1, [Use replacement snprintf() functions.]) AC_LIBOBJ(snprintf) fi diff --git a/src/include/c.h b/src/include/c.h index fb7361905d..16b9f25a78 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -12,7 +12,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/c.h,v 1.191 2005/11/17 22:14:54 tgl Exp $ + * $PostgreSQL: pgsql/src/include/c.h,v 1.192 2005/12/06 02:29:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -101,9 +101,8 @@ #endif /* - * These strings are to be translation via xgettext. We can't - * call gettext() because it is located in variable initialization and - * a function call can not be used. + * Use this to mark strings to be translated by gettext, in places where + * you don't want an actual function call to occur (eg, constant tables). */ #define gettext_noop(x) (x) diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 06aca08d90..b1daceeecf 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -640,7 +640,7 @@ #undef USE_PAM /* Use replacement snprintf() functions. */ -#undef USE_SNPRINTF +#undef USE_REPL_SNPRINTF /* Define to build with (Open)SSL support. (--with-openssl) */ #undef USE_SSL diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32 index eb308a36f5..97b9aa219c 100644 --- a/src/include/pg_config.h.win32 +++ b/src/include/pg_config.h.win32 @@ -23,10 +23,6 @@ #define HAVE_RANDOM #endif -/* use _snprintf instead of snprintf */ -#define HAVE_DECL_SNPRINTF 1 -#define snprintf _snprintf - /* defines for dynamic linking on Win32 platform */ #ifdef __CYGWIN__ diff --git a/src/include/port.h b/src/include/port.h index a61abe719f..5f5673a99f 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/port.h,v 1.84 2005/10/15 02:49:41 momjian Exp $ + * $PostgreSQL: pgsql/src/include/port.h,v 1.85 2005/12/06 02:29:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -112,7 +112,8 @@ extern int pg_strncasecmp(const char *s1, const char *s2, size_t n); extern unsigned char pg_toupper(unsigned char ch); extern unsigned char pg_tolower(unsigned char ch); -#ifdef USE_SNPRINTF +#ifdef USE_REPL_SNPRINTF + extern int pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args); extern int pg_snprintf(char *str, size_t count, const char *fmt,...) @@ -131,6 +132,26 @@ pg_printf(const char *fmt,...) /* This extension allows gcc to check the format string */ __attribute__((format(printf, 1, 2))); +/* + * Some versions of libintl try to replace printf and friends with macros; + * if we are doing likewise, make sure our versions win. + */ +#ifdef vsnprintf +#undef vsnprintf +#endif +#ifdef snprintf +#undef snprintf +#endif +#ifdef sprintf +#undef sprintf +#endif +#ifdef fprintf +#undef fprintf +#endif +#ifdef printf +#undef printf +#endif + /* * The GCC-specific code below prevents the __attribute__(... 'printf') * above from being replaced, and this is required because gcc doesn't @@ -149,7 +170,8 @@ __attribute__((format(printf, 1, 2))); #define fprintf pg_fprintf #define printf pg_printf #endif -#endif + +#endif /* USE_REPL_SNPRINTF */ /* Portable prompt handling */ extern char *simple_prompt(const char *prompt, int maxlen, bool echo); diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile index deaf695d97..9de4b003e4 100644 --- a/src/interfaces/ecpg/ecpglib/Makefile +++ b/src/interfaces/ecpg/ecpglib/Makefile @@ -4,7 +4,7 @@ # # Copyright (c) 1994, Regents of the University of California # -# $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/Makefile,v 1.34 2005/11/30 12:49:49 meskes Exp $ +# $PostgreSQL: pgsql/src/interfaces/ecpg/ecpglib/Makefile,v 1.35 2005/12/06 02:29:04 tgl Exp $ # #------------------------------------------------------------------------- @@ -21,11 +21,12 @@ override CPPFLAGS := -DFRONTEND -I$(top_srcdir)/src/interfaces/ecpg/include \ -I$(libpq_srcdir) -I$(top_builddir)/src/port $(CPPFLAGS) override CFLAGS += $(PTHREAD_CFLAGS) -# Need to recomple any libpgport object files -LIBS := $(patsubst -lpgport,, $(LIBS)) +# Need to recompile any libpgport object files +LIBS := $(filter-out -lpgport, $(LIBS)) OBJS= execute.o typename.o descriptor.o data.o error.o prepare.o memory.o \ - connect.o misc.o path.o exec.o + connect.o misc.o path.o exec.o \ + $(filter snprintf.o, $(LIBOBJS)) SHLIB_LINK = -L../pgtypeslib -lpgtypes $(libpq) \ $(filter -lintl -lssl -lcrypto -lkrb5 -lcrypt -lm, $(LIBS)) $(PTHREAD_LIBS) @@ -45,10 +46,7 @@ include $(top_srcdir)/src/Makefile.shlib # necessarily use the same object files as the backend uses. Instead, # symlink the source files in here and build our own object file. -path.c: % : $(top_srcdir)/src/port/% - rm -f $@ && $(LN_S) $< . - -exec.c: % : $(top_srcdir)/src/port/% +path.c exec.c snprintf.c: % : $(top_srcdir)/src/port/% rm -f $@ && $(LN_S) $< . path.o: path.c $(top_builddir)/src/port/pg_config_paths.h @@ -64,7 +62,7 @@ installdirs: uninstall: uninstall-lib clean distclean maintainer-clean: clean-lib - rm -f $(OBJS) path.c exec.c + rm -f $(OBJS) path.c exec.c snprintf.c depend dep: $(CC) -MM $(CFLAGS) *.c >depend diff --git a/src/interfaces/libpq/win32.h b/src/interfaces/libpq/win32.h index 14f1a7e09e..f3c61c798f 100644 --- a/src/interfaces/libpq/win32.h +++ b/src/interfaces/libpq/win32.h @@ -16,9 +16,6 @@ #define write(a,b,c) _write(a,b,c) #endif -#define vsnprintf(a,b,c,d) _vsnprintf(a,b,c,d) -#define snprintf _snprintf - #undef EAGAIN /* doesn't apply on sockets */ #undef EINTR #define EINTR WSAEINTR