Re: [PATCHES] snprintf() argument reordering not working - Mailing list pgsql-hackers
From | Andrew Dunstan |
---|---|
Subject | Re: [PATCHES] snprintf() argument reordering not working |
Date | |
Msg-id | 43948EAF.3080801@dunslane.net Whole thread Raw |
In response to | Re: [PATCHES] snprintf() argument reordering not working (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: [PATCHES] snprintf() argument reordering not working
|
List | pgsql-hackers |
Tom Lane wrote: >Andrew Dunstan <andrew@dunslane.net> writes: > > >>The bad news: if we aren't compiling with NLS enabled, having those >>entries in exports.txt makes the libpq build blow up. So either we need >>to use pg_*printf unconditionally on Windows, or we need a little >>Makefile + sed magic to strip those entries out of exports.txt when it >>is used, if we're not doing NLS, or something of that kind. >> >> > >I think it's a bad idea for exports.txt not to be the same in all >builds. So yeah, if we export these names at all then it has to be >unconditional. > >What about Plan B? Per Bruce's comment, it should really only be ecpg >that needs an extra copy of snprintf.o, and it's not like ecpg doesn't >already pull in various port/ files for itself. > > > > The problem is that the alias will be picked up by every libpq client. I got around the problem with ecpg's libpgtypes by unaliasing sprintf and snprintf. But we can't do that everywhere. I'm not sure I see the objection to stripping these out of the *.def files. I can't spend any more time on this now - I have spent far too much on it already. My working patch is attached. Maybe I can look at it again in a few days. cheers andrew Index: configure =================================================================== RCS file: /projects/cvsroot/pgsql/configure,v retrieving revision 1.461 diff -c -r1.461 configure *** configure 5 Nov 2005 04:01:38 -0000 1.461 --- configure 5 Dec 2005 18:56:04 -0000 *************** *** 17111,17123 **** # 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 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 --- 17111,17117 ---- # 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 ; 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 Index: src/include/c.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/include/c.h,v retrieving revision 1.190 diff -c -r1.190 c.h *** src/include/c.h 15 Oct 2005 02:49:41 -0000 1.190 --- src/include/c.h 5 Dec 2005 18:56:23 -0000 *************** *** 96,101 **** --- 96,122 ---- #ifdef ENABLE_NLS #include <libintl.h> + #ifdef WIN32 + #ifdef USE_SNPRINTF + + #ifdef printf + #undef printf + #endif + #ifdef fprintf + #undef fprintf + #endif + #ifdef sprintf + #undef sprintf + #endif + #ifdef snprintf + #undef snprintf + #endif + #ifdef vsnprintf + #undef vsnprintf + #endif + + #endif + #endif #else #define gettext(x) (x) #endif Index: src/interfaces/ecpg/pgtypeslib/extern.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/ecpg/pgtypeslib/extern.h,v retrieving revision 1.7 diff -c -r1.7 extern.h *** src/interfaces/ecpg/pgtypeslib/extern.h 15 Oct 2005 02:49:47 -0000 1.7 --- src/interfaces/ecpg/pgtypeslib/extern.h 5 Dec 2005 18:56:24 -0000 *************** *** 1,6 **** --- 1,14 ---- #ifndef __PGTYPES_COMMON_H__ #define __PGTYPES_COMMON_H__ + + #ifdef sprintf + #undef sprintf + #endif + #ifdef snprintf + #undef snprintf + #endif + #include "pgtypes_error.h" /* These are the constants that decide which printf() format we'll use in Index: src/interfaces/libpq/Makefile =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/libpq/Makefile,v retrieving revision 1.138 diff -c -r1.138 Makefile *** src/interfaces/libpq/Makefile 29 Aug 2005 00:47:35 -0000 1.138 --- src/interfaces/libpq/Makefile 5 Dec 2005 18:56:24 -0000 *************** *** 25,30 **** --- 25,34 ---- override CFLAGS += $(PTHREAD_CFLAGS) endif + ifneq ($(enable_nls), yes) + NONLS = -e '/^pg_.*printf/d' + endif + # Need to recomple any libpgport object files LIBS := $(patsubst -lpgport,, $(LIBS)) *************** *** 103,126 **** echo 'LIBRARY LIBPQ' >> $@ echo 'DESCRIPTION "PostgreSQL Client Library"' >> $@ echo 'EXPORTS' >> $@ ! sed -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/ \1@ \2/' < $< >> $@ $(srcdir)/libpqddll.def: exports.txt echo '; DEF file for MS VC++' > $@ echo 'LIBRARY LIBPQD' >> $@ echo 'DESCRIPTION "PostgreSQL Client Library"' >> $@ echo 'EXPORTS' >> $@ ! sed -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/ \1@ \2/' < $< >> $@ $(srcdir)/blibpqdll.def: exports.txt echo '; DEF file for Borland C++ Builder' > $@ echo 'LIBRARY BLIBPQ' >> $@ echo 'DESCRIPTION "PostgreSQL Client Library"' >> $@ echo 'EXPORTS' >> $@ ! sed -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/ _\1@ \2/' < $< >> $@ echo '' >> $@ echo '; Aliases for MS compatible names' >> $@ ! sed -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/ \1= _\1/' < $< | sed 's/ *$$//' >> $@ # depend on Makefile.global to force rebuild on re-run of configure $(srcdir)/libpq.rc: libpq.rc.in $(top_builddir)/src/Makefile.global --- 107,130 ---- echo 'LIBRARY LIBPQ' >> $@ echo 'DESCRIPTION "PostgreSQL Client Library"' >> $@ echo 'EXPORTS' >> $@ ! sed $(NONLS) -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/ \1@ \2/' < $< >> $@ $(srcdir)/libpqddll.def: exports.txt echo '; DEF file for MS VC++' > $@ echo 'LIBRARY LIBPQD' >> $@ echo 'DESCRIPTION "PostgreSQL Client Library"' >> $@ echo 'EXPORTS' >> $@ ! sed $(NONLS) -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/ \1@ \2/' < $< >> $@ $(srcdir)/blibpqdll.def: exports.txt echo '; DEF file for Borland C++ Builder' > $@ echo 'LIBRARY BLIBPQ' >> $@ echo 'DESCRIPTION "PostgreSQL Client Library"' >> $@ echo 'EXPORTS' >> $@ ! sed $(NONLS) -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/ _\1@ \2/' < $< >> $@ echo '' >> $@ echo '; Aliases for MS compatible names' >> $@ ! sed $(NONLS) -e '/^#/d' -e 's/^\(.* \)\([0-9][0-9]*\)/ \1= _\1/' < $< | sed 's/ *$$//' >> $@ # depend on Makefile.global to force rebuild on re-run of configure $(srcdir)/libpq.rc: libpq.rc.in $(top_builddir)/src/Makefile.global Index: src/interfaces/libpq/exports.txt =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/libpq/exports.txt,v retrieving revision 1.5 diff -c -r1.5 exports.txt *** src/interfaces/libpq/exports.txt 21 Oct 2005 15:21:21 -0000 1.5 --- src/interfaces/libpq/exports.txt 5 Dec 2005 18:56:24 -0000 *************** *** 125,127 **** --- 125,132 ---- lo_create 123 PQinitSSL 124 PQregisterThreadLock 125 + pg_sprintf 126 + pg_snprintf 127 + pg_fprintf 128 + pg_printf 129 + pg_vsnprintf 130 Index: src/interfaces/libpq/win32.h =================================================================== RCS file: /projects/cvsroot/pgsql/src/interfaces/libpq/win32.h,v retrieving revision 1.27 diff -c -r1.27 win32.h *** src/interfaces/libpq/win32.h 31 Jul 2004 06:19:23 -0000 1.27 --- src/interfaces/libpq/win32.h 5 Dec 2005 18:56:24 -0000 *************** *** 16,21 **** --- 16,27 ---- #define write(a,b,c) _write(a,b,c) #endif + #ifdef vsnprintf + #undef vsnprintf + #endif + #ifdef snprintf + #undef snprintf + #endif #define vsnprintf(a,b,c,d) _vsnprintf(a,b,c,d) #define snprintf _snprintf
pgsql-hackers by date: