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 | 439376D9.9080708@dunslane.net Whole thread Raw |
| In response to | Re: [PATCHES] snprintf() argument reordering not working (Bruce Momjian <pgman@candle.pha.pa.us>) |
| Responses |
Re: [PATCHES] snprintf() argument reordering not working
|
| List | pgsql-hackers |
Bruce Momjian wrote:
>Tom Lane wrote:
>
>
>>Andrew Dunstan <andrew@dunslane.net> writes:
>>
>>
>>>That got me through the backend compile and through libpq to ecpg, which
>>>fell over at the link stage complaining about missing references to
>>>pg_sprintf and pg_snprintf ... not sure how to fix that - windows
>>>experts, please advise.
>>>
>>>
>>Plan A would be to make libpq export pg_snprintf and friends, Plan B
>>would be to give ecpg its own copy of snprintf.o. Plan A is probably
>>better since you're going to hit the same issue no doubt in all of the
>>src/bin programs.
>>
>>
>
>I am confused why we would need either of these. All apps use
>libpgport, and that pg_*printf should be in that library. The original
>work Andrew did has problems particularly with ecpg, but why does ecpg
>cause problems? Doesn't it link in pgport?
>
>
>
libpgtypes doesn't link with either libpgport or libpq.
What I have done to get a working build in addition to the previous
report is to undef snprintf and sprintf in
interfaces/pgtypeslib/extern.h (instead of creating an additional link
burden), and to add entries for pg_snprintf, pg_sprintf and pg_fprintf
to interfaces/libpq/exports.txt. That let me get a clean compile and
regression run. The diff against 8.1 is attached for comment.
I suspect we should probably add all the pg_*printf functions to
exports.txt.
(Of course, first you need to install gettext and libintl from the
gnuwin32 project, or you can't even configure with --enable-nls)
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 4 Dec 2005 22:56:58 -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 4 Dec 2005 22:57:02 -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 4 Dec 2005 22:57:05 -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/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 4 Dec 2005 22:57:06 -0000
***************
*** 125,127 ****
--- 125,130 ----
lo_create 123
PQinitSSL 124
PQregisterThreadLock 125
+ pg_sprintf 126
+ pg_snprintf 127
+ pg_fprintf 128
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 4 Dec 2005 22:57:06 -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: