I have added the following comments about the interaction of libintl and *printf macros so we will not get confused in the future. Autoconf run, backpatched to 8.1.X.
One question I have is why ecpglib didn't need to use our snprintf.c in the past. Didn't our macros spill in to ecpglib before? -- Bruce Momjian | http://candle.pha.pa.us email@example.com | (610) 359-1001 + If your life is a hard drive, | 13 Roberts Road + Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: configure.in =================================================================== RCS file: /cvsroot/pgsql/configure.in,v retrieving revision 1.435 diff -c -c -r1.435 configure.in *** configure.in 6 Dec 2005 04:53:02 -0000 1.435 --- configure.in 6 Dec 2005 18:33:26 -0000 *************** *** 858,868 **** # have all the features we need --- see below. if test "$PORTNAME" = "win32"; then ! # Win32 gets this built unconditionally ! # libintl versions prior to 0.13 use the native *printf functions. ! # Win32 *printf does not understand %$, so on Win32 using pre-0.13 libintl ! # it is necessary to use the pg versions of *printf to properly process ! # NLS strings that use the %$ format. pgac_need_repl_snprintf=yes else pgac_need_repl_snprintf=no --- 858,888 ---- # 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 litint >= 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 *************** *** 1059,1067 **** *** for the exact reason.]])], [AC_MSG_RESULT([cross-compiling])]) # Force use of our snprintf if system's doesn't do arg control ! # 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 --- 1079,1090 ---- *** for the exact reason.]])], [AC_MSG_RESULT([cross-compiling])]) + # -------------------- + # Run tests below here + # -------------------- # 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_PRINTF_ARG_CONTROL if test $pgac_cv_printf_arg_control != yes ; then Index: src/include/port.h =================================================================== RCS file: /cvsroot/pgsql/src/include/port.h,v retrieving revision 1.86 diff -c -c -r1.86 port.h *** src/include/port.h 6 Dec 2005 05:13:46 -0000 1.86 --- src/include/port.h 6 Dec 2005 18:33:30 -0000 *************** *** 115,122 **** #ifdef USE_REPL_SNPRINTF /* ! * 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 --- 115,123 ---- #ifdef USE_REPL_SNPRINTF /* ! * Versions of libintl >= 0.13 try to replace printf() and friends with ! * macros to their own versions that understand the %$ format. We do the ! * same, so disable their macros, if they exist. */ #ifdef vsnprintf #undef vsnprintf
---------------------------(end of broadcast)--------------------------- TIP 5: don't forget to increase your free space map settings