Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gV3E0-0008Qt-L4 for pgsql-bugs@arkaria.postgresql.org; Thu, 06 Dec 2018 23:38:32 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.89) (envelope-from ) id 1gV3Dy-0004gc-Pt for pgsql-bugs@arkaria.postgresql.org; Thu, 06 Dec 2018 23:38:30 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gV3Dx-0004gV-Jg for pgsql-bugs@lists.postgresql.org; Thu, 06 Dec 2018 23:38:29 +0000 Received: from sss.pgh.pa.us ([66.207.139.130]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.89) (envelope-from ) id 1gV3Dt-00082X-N6 for pgsql-bugs@lists.postgresql.org; Thu, 06 Dec 2018 23:38:28 +0000 Received: from sss1.sss.pgh.pa.us (localhost [127.0.0.1]) by sss.pgh.pa.us (8.14.4/8.14.4) with ESMTP id wB6NcLPD003315; Thu, 6 Dec 2018 18:38:21 -0500 From: Tom Lane To: Alvaro Herrera cc: ertugrul9090@gmail.com, Peter Eisentraut , pgsql-bugs@lists.postgresql.org Subject: Re: BUG #15511: Drop table error "invalid argument" In-reply-to: <30307.1544130494@sss.pgh.pa.us> References: <20181206210042.6fu2tkbxy3vehwul@alvherre.pgsql> <30307.1544130494@sss.pgh.pa.us> Comments: In-reply-to Tom Lane message dated "Thu, 06 Dec 2018 16:08:14 -0500" MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----- =_aaaaaaaaaa0" Content-ID: <3097.1544139122.0@sss.pgh.pa.us> Date: Thu, 06 Dec 2018 18:38:21 -0500 Message-ID: <3314.1544139501@sss.pgh.pa.us> List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Precedence: bulk ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="us-ascii" Content-ID: <3097.1544139122.1@sss.pgh.pa.us> ... so my preliminary result is that there's a *boatload* of "invalid" format strings in our translation files, all of them apparently with the extra-space disease. See attached. While it looks like every one of these is a typo, I'm beginning to have second thoughts about the premise here. Presumably, the reason we've not noticed this issue before is that almost all non-Windows platforms were using libc's printf, which is going to implement the full set of POSIX-specified flags including space. As of HEAD that is no longer the case, because we use snprintf.c everywhere. While it might not be a problem for our own code if snprintf.c is a couple of flags short of full POSIX, I'm worrying that third-party code might be unhappy if *printf in the PG environment behaves oddly. So maybe the best compromise is to upgrade snprintf.c. I think it'd only take a few more lines to implement the space flag per spec. The other flags that we aren't implementing are '#' ("alternate form") and "'" (thousands grouping). For those, I'd be a bit inclined to accept them but treat 'em as no-ops. On the other hand, that still leaves some daylight between us and POSIX, in the form of stuff like "long double" support, and I still don't want to go near that. Thoughts? For the archives' sake, I attach the code I used for this. I'm now thinking maybe we wouldn't commit it, though. regards, tom lane ------- =_aaaaaaaaaa0 Content-Type: text/plain; charset="utf8"; name="scan-results" Content-ID: <3097.1544139122.2@sss.pgh.pa.us> Content-Description: scan-results Content-Transfer-Encoding: quoted-printable invalid format string in file "src/bin/initdb/po/he.po" for ../../common/r= estricted_token.c:77 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F = =D7=9C=D7=A4=D7=AA=D7=95=D7=97 =D7=90=D7=AA =D7=94=D7=AA=D7=94=D7=9C=D7=99= =D7=9A token: =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu " invalid format string in file "src/bin/initdb/po/he.po" for ../../common/r= estricted_token.c:90 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F = =D7=9C=D7=94=D7=A7=D7=A6=D7=95=D7=AA SID: =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7= =99=D7=90=D7=94 % lu " invalid format string in file "src/bin/initdb/po/he.po" for ../../common/r= estricted_token.c:132 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F= =D7=9C=D7=94=D7=A4=D7=A2=D7=99=D7=9C =D7=AA=D7=94=D7=9C=D7=99=D7=9A =D7=A2= =D7=91=D7=95=D7=A8 =D7=94=D7=A4=D7=A7=D7=95=D7=93=D7=94 "%s": =D7=A7=D7=95= =D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu " invalid format string in file "src/bin/initdb/po/he.po" for ../../common/r= estricted_token.c:170 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F= =D7=9C=D7=91=D7=A6=D7=A2 =D7=9E=D7=97=D7=93=D7=A9 =D7=A2=D7=9D =D7=90=D7=A1= =D7=99=D7=9E=D7=95=D7=9F =D7=92=D7=99=D7=A9=D7=94 =D7=9E=D7=95=D7=92=D7=91= =D7=9C: =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu " invalid format string in file "src/bin/initdb/po/he.po" for ../../common/r= estricted_token.c:186 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F= =D7=9C=D7=A7=D7=91=D7=9C =D7=A7=D7=95=D7=93 =D7=94=D7=99=D7=A6=D7=99=D7=90= =D7=94 =D7=9E=D7=9F =D7=AA=D7=94=D7=9C=D7=99=D7=9A =D7=9E=D7=A9=D7=A0=D7=94= : =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu " invalid format string in file "src/bin/initdb/po/he.po" for ../../common/u= sername.c:43 "=D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C =D7=9C=D7=97=D7=A4=D7=A9 =D7=99=D7=A2= =D7=99=D7=9C =D7=90=D7=AA =D7=94=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9 =D7=A2=D7=9D= =D7=9E=D7=96=D7=94=D7=94 % ld: %s" invalid format string in file "src/bin/initdb/po/he.po" for ../../common/u= sername.c:60 "=D7=9B=D7=99=D7=A9=D7=9C=D7=95=D7=9F =D7=91=D7=93=D7=99=D7=A7=D7=94 =D7=A2= =D7=91=D7=95=D7=A8 =D7=A9=D7=9D =D7=94=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9: =D7=A7= =D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu" invalid format string in file "src/bin/initdb/po/tr.po" for initdb.c:2171 "% s: ge=C3=A7ersiz yerel ayarlar; LANG ve LC_ * ortam de=C4=9Fi=C5=9Fkenl= erini denetleyin. " invalid format string in file "src/bin/initdb/po/tr.po" for initdb.c:3195 "% s: superuser ad=C4=B1 "% s" izin verilmiyor; rol adlar=C4=B1 "pg_" ile = ba=C5=9Flayamaz " invalid format string in file "src/bin/scripts/po/he.po" for ../../common/= username.c:43 "=D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C =D7=9C=D7=97=D7=A4=D7=A9 =D7=99=D7=A2= =D7=99=D7=9C =D7=90=D7=AA =D7=94=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9 =D7=A2=D7=9D= =D7=9E=D7=96=D7=94=D7=94 % ld: %s" invalid format string in file "src/bin/scripts/po/he.po" for ../../common/= username.c:60 "=D7=9B=D7=99=D7=A9=D7=9C=D7=95=D7=9F =D7=91=D7=93=D7=99=D7=A7=D7=94 =D7=A2= =D7=91=D7=95=D7=A8 =D7=A9=D7=9D =D7=94=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9: =D7=A7= =D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu" invalid format string in file "src/bin/scripts/po/he.po" for ../../fe_util= s/print.c:353 "(% lu =D7=A9=D7=95=D7=A8=D7=94)" invalid format string in file "src/bin/scripts/po/he.po" for ../../fe_util= s/print.c:353 "(% lu =D7=A9=D7=95=D7=A8=D7=94)" invalid format string in file "src/bin/scripts/po/he.po" for ../../fe_util= s/print.c:353 "(% lu =D7=A9=D7=95=D7=A8=D7=95=D7=AA)" invalid format string in file "src/bin/psql/po/he.po" for ../../common/use= rname.c:43 "=D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C =D7=9C=D7=97=D7=A4=D7=A9 =D7=99=D7=A2= =D7=99=D7=9C =D7=90=D7=AA =D7=94=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9 =D7=A2=D7=9D= =D7=9E=D7=96=D7=94=D7=94 % ld: %s" invalid format string in file "src/bin/psql/po/he.po" for ../../common/use= rname.c:60 "=D7=9B=D7=99=D7=A9=D7=9C=D7=95=D7=9F =D7=91=D7=93=D7=99=D7=A7=D7=94 =D7=A2= =D7=91=D7=95=D7=A8 =D7=A9=D7=9D =D7=94=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9: =D7=A7= =D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu" invalid format string in file "src/bin/psql/po/he.po" for ../../fe_utils/p= rint.c:353 "(% lu =D7=A9=D7=95=D7=A8=D7=94)" invalid format string in file "src/bin/psql/po/he.po" for ../../fe_utils/p= rint.c:353 "(% lu =D7=A9=D7=95=D7=A8=D7=94)" invalid format string in file "src/bin/psql/po/he.po" for ../../fe_utils/p= rint.c:353 "(% lu =D7=A9=D7=95=D7=A8=D7=95=D7=AA)" invalid format string in file "src/bin/psql/po/he.po" for command.c:553 "=D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F =D7=9C=D7=A7=D7=91=D7=9C =D7=90=D7=AA= =D7=A1=D7=A4=D7=A8=D7=99=D7=99=D7=AA =D7=94=D7=91=D7=99=D7=AA =D7=A2=D7=91= =D7=95=D7=A8 =D7=9E=D7=A9=D7=AA=D7=9E=D7=A9 =D7=A2=D7=9D =D7=9E=D7=96=D7=94= =D7=94 % ld: %s " invalid format string in file "src/bin/psql/po/he.po" for common.c:608 "=D7=96=D7=9E=D7=9F: %.3f ms (% 02d:%06.3f) " invalid format string in file "src/bin/psql/po/he.po" for common.c:617 "=D7=96=D7=9E=D7=9F: %.3f ms (% 02d:%02d:%06.3f) " invalid format string in file "src/bin/pg_basebackup/po/he.po" for pg_base= backup.c:965 "=D7=AA=D7=9B=D7=A0=D7=AA=D7=99 %s: =D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 = =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA =D7=9C=D7=94=D7=92=D7=93=D7=99=D7=A8 = =D7=90=D7=AA =D7=A8=D7=9E=D7=AA =D7=94=D7=93=D7=97=D7=99=D7=A1=D7=94 % d: = %s " invalid format string in file "src/bin/pg_basebackup/po/he.po" for pg_recv= logical.c:135 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9E=D7=90=D7=A9=D7=A8 =D7=9C=D7=9B=D7= =AA=D7=95=D7=91 =D7=A2=D7=93 % X/%X, =D7=A1=D7=95=D7=9E=D7=A7 =D7=9C %X/%X= (=D7=97=D7=A8=D7=99=D7=A5 %s) " invalid format string in file "src/bin/pg_basebackup/po/he.po" for receive= log.c:278 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=A9=D7=A8=D7=AA =D7=93=D7=99=D7=95=D7= =95=D7=97 =D7=A9=D7=9D =D7=A7=D7=95=D7=91=D7=A5 =D7=94=D7=99=D7=A1=D7=98=D7= =95=D7=A8=D7=99=D7=94 =D7=9C=D7=90 =D7=A6=D7=A4=D7=95=D7=99 =D7=A2=D7=91=D7= =95=D7=A8 =D7=A6=D7=99=D7=A8 =D7=94=D7=96=D7=9E=D7=9F % u: %s " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:495 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94= =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA =D7=9C=D7=94=D7=A4=D7=A2=D7=99=D7=9C= =D7=A9=D7=A8=D7=AA: =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % l= u " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:967 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C = =D7=9C=D7=94=D7=A4=D7=A1=D7=99=D7=A7 =D7=90=D7=AA =D7=94=D7=A9=D7=A8=D7=AA= ; =D7=9E=D7=95=D7=A4=D7=A2=D7=9C =D7=A9=D7=A8=D7=AA =D7=9C=D7=9E=D7=A9=D7=AA= =D7=9E=D7=A9 =D7=99=D7=97=D7=99=D7=93 (PID: % ld) " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:975 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 = =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA =D7=9C=D7=A9=D7=9C=D7=95=D7=97 =D7=90= =D7=95=D7=AA =D7=A2=D7=A6=D7=99=D7=A8=D7=94 (PID: % ld): %s " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1058 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F = =D7=9C=D7=94=D7=A4=D7=A2=D7=99=D7=9C =D7=9E=D7=97=D7=93=D7=A9 =D7=90=D7=AA= =D7=94=D7=A9=D7=A8=D7=AA; =D7=9E=D7=95=D7=A4=D7=A2=D7=9C =D7=A9=D7=A8=D7=AA= =D7=9C=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9 =D7=99=D7=97=D7=99=D7=93 (PID: % ld) " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1120 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=AA=D7=94=D7=9C=D7=99=D7=9A =D7=94=D7= =A9=D7=A8=D7=AA =D7=94=D7=99=D7=A9=D7=9F (PID: % ld) =D7=9B=D7=A0=D7=A8=D7= =90=D7=94 =D7=A4=D7=95=D7=A2=D7=9C " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1143 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F = =D7=9C=D7=94=D7=A4=D7=A2=D7=99=D7=9C =D7=9E=D7=97=D7=93=D7=A9 =D7=90=D7=AA= =D7=94=D7=A9=D7=A8=D7=AA; =D7=9E=D7=95=D7=A4=D7=A2=D7=9C =D7=A9=D7=A8=D7=AA= =D7=9C=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9 =D7=99=D7=97=D7=99=D7=93 (PID: % ld) " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1152 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 = =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA =D7=9C=D7=A9=D7=9C=D7=95=D7=97 =D7=90= =D7=95=D7=AA =D7=9C=D7=94=D7=A4=D7=A2=D7=9C=D7=94 =D7=9E=D7=97=D7=93=D7=A9= (PID: % ld): %s " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1182 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F = =D7=9C=D7=A7=D7=93=D7=9D =D7=A9=D7=A8=D7=AA; =D7=9E=D7=95=D7=A4=D7=A2=D7=9C= =D7=A9=D7=A8=D7=AA =D7=9C=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9 =D7=99=D7=97=D7=99= =D7=93 (PID: % ld) " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1219 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 = =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA =D7=9C=D7=A9=D7=9C=D7=95=D7=97 =D7=90= =D7=AA =D7=94=D7=90=D7=95=D7=AA =D7=9C=D7=A7=D7=93=D7=9D(PID: % ld): %s " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1301 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=A9=D7=A8=D7=AA =D7=9E=D7=A9=D7=AA=D7= =9E=D7=A9 =D7=99=D7=97=D7=99=D7=93 =D7=A4=D7=95=D7=A2=D7=9C (PID: % ld) " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1314 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=A9=D7=A8=D7=AA =D7=A4=D7=95=D7=A2=D7= =9C (PID: % ld) " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1348 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 = =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA =D7=9C=D7=A9=D7=9C=D7=95=D7=97 =D7=90= =D7=95=D7=AA %d (PID: % ld): %s " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1502 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=90=D7=99=D7=9F =D7=90=D7=A4=D7=A9=D7= =A8=D7=95=D7=AA =D7=9C=D7=A8=D7=A9=D7=95=D7=9D =D7=90=D7=AA =D7=94=D7=A9=D7= =99=D7=A8=D7=95=D7=AA "%s": =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7= =94 % lu " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1532 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 = =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA =D7=9C=D7=A4=D7=AA=D7=95=D7=97 =D7=A9= =D7=99=D7=A8=D7=95=D7=AA '%s': =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90= =D7=94 % lu " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1541 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C = =D7=9C=D7=91=D7=98=D7=9C =D7=90=D7=AA =D7=94=D7=A9=D7=99=D7=A8=D7=95=D7=AA= "%s": =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1690 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 = =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA =D7=9C=D7=94=D7=A4=D7=A2=D7=99=D7=9C = =D7=A9=D7=99=D7=A8=D7=95=D7=AA '%s': =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99= =D7=90=D7=94 % lu " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1777 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F = =D7=9C=D7=A4=D7=AA=D7=95=D7=97 =D7=90=D7=AA =D7=94=D7=AA=D7=94=D7=9C=D7=99= =D7=9A token: =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu " invalid format string in file "src/bin/pg_ctl/po/he.po" for pg_ctl.c:1791 "=D7=AA=D7=9B=D7=A0=D7=99=D7=AA %s: =D7=9C=D7=90 =D7=A0=D7=99=D7=AA=D7=9F = =D7=9C=D7=94=D7=A7=D7=A6=D7=95=D7=AA SID: =D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7= =99=D7=90=D7=94 % lu " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:1302 "=D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA= =D7=9C=D7=99=D7=A6=D7=95=D7=A8 =D7=90=D7=95=D7=91=D7=99=D7=99=D7=A7=D7=98= =D7=92=D7=93=D7=95=D7=9C % u: %s" invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:1307 "=D7=9C=D7=90 =D7=94=D7=99=D7=AA=D7=94 =D7=90=D7=A4=D7=A9=D7=A8=D7=95=D7=AA= =D7=9C=D7=A4=D7=AA=D7=95=D7=97 =D7=90=D7=AA =D7=90=D7=95=D7=91=D7=99=D7=99= =D7=A7=D7=98 =D7=92=D7=93=D7=95=D7=9C % u: %s" invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:1652 "=D7=A0=D7=9B=D7=AA=D7=91 % lu =D7=91=D7=99=D7=AA =D7=A9=D7=9C =D7=A0=D7=AA= =D7=95=D7=A0=D7=99 =D7=94=D7=90=D7=95=D7=91=D7=99=D7=99=D7=A7=D7=98 =D7=94= =D7=92=D7=93=D7=95=D7=9C (=D7=AA=D7=95=D7=A6=D7=90=D7=94 =3D % lu) " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:1652 "=D7=A0=D7=9B=D7=AA=D7=91 % lu =D7=91=D7=99=D7=AA =D7=A9=D7=9C =D7=A0=D7=AA= =D7=95=D7=A0=D7=99 =D7=94=D7=90=D7=95=D7=91=D7=99=D7=99=D7=A7=D7=98 =D7=94= =D7=92=D7=93=D7=95=D7=9C (=D7=AA=D7=95=D7=A6=D7=90=D7=94 =3D % lu) " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:1652 "=D7=A0=D7=9B=D7=AA=D7=91=D7=95 % lu =D7=91=D7=AA=D7=99=D7=9D =D7=A9=D7=9C= =D7=A0=D7=AA=D7=95=D7=A0=D7=99 =D7=94=D7=90=D7=95=D7=91=D7=99=D7=99=D7=A7= =D7=98 =D7=94=D7=92=D7=93=D7=95=D7=9C (=D7=AA=D7=95=D7=A6=D7=90=D7=94 =3D = % lu) " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:1658 "=D7=9C=D7=90 =D7=9E=D7=A6=D7=9C=D7=99=D7=97 =D7=9C=D7=9B=D7=AA=D7=95=D7=91= =D7=A2=D7=9C =D7=90=D7=95=D7=91=D7=99=D7=99=D7=A7=D7=98 =D7=92=D7=93=D7=95= =D7=9C (=D7=AA=D7=95=D7=A6=D7=90=D7=94: % lu, =D7=A6=D7=A4=D7=95=D7=99: % = lu) " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:2147 "=D7=A7=D7=95=D7=91=D7=A5 =D7=94=D7=A7=D7=9C=D7=98 =D7=A7=D7=A6=D7=A8 =D7=9E= =D7=93=D7=99 (=D7=9C=D7=A7=D7=A8=D7=95=D7=90 % lu, =D7=9E=D7=A6=D7=95=D7=A4= =D7=94 5) " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:2562 "=D7=9E=D7=96=D7=94=D7=94 =D7=9B=D7=A0=D7=99=D7=A1=D7=94% d =D7=9E=D7=97=D7= =95=D7=A5 =D7=9C=D7=98=D7=95=D7=95=D7=97 - =D7=90=D7=95=D7=9C=D7=99 TOC =D7= =9E=D7=95=D7=A9=D7=97=D7=AA " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:3659 "=D7=92=D7=99=D7=A8=D7=A1=D7=94 =D7=9C=D7=90 =D7=A0=D7=AA=D7=9E=D7=9B=D7=AA= (% d.%d) =D7=91=D7=9B=D7=95=D7=AA=D7=A8=D7=AA =D7=94=D7=A7=D7=95=D7=91=D7= =A5 " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_arc= hiver.c:3664 "=D7=91=D7=93=D7=99=D7=A7=D7=AA =D7=A9=D7=A4=D7=99=D7=95=D7=AA =D7=A2=D7=9C= =D7=92=D7=95=D7=93=D7=9C =D7=9E=D7=A1=D7=A4=D7=A8 =D7=A9=D7=9C=D7=9D (% l= u) =D7=A0=D7=9B=D7=A9=D7=9C=D7=94 " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_cus= tom.c:451 "=D7=A1=D7=95=D7=92 =D7=91=D7=9C=D7=95=D7=A7 =D7=A0=D7=AA=D7=95=D7=A0=D7=99= =D7=9D =D7=9C=D7=90 =D7=9E=D7=96=D7=95=D7=94=D7=94 (% d) =D7=91=D7=A2=D7=AA= =D7=97=D7=99=D7=A4=D7=95=D7=A9 =D7=91=D7=90=D7=A8=D7=9B=D7=99=D7=95=D7=9F " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_cus= tom.c:472 "=D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C =D7=9C=D7=9E=D7=A6=D7=95=D7=90 =D7=90= =D7=AA =D7=9E=D7=96=D7=94=D7=94 =D7=94=D7=91=D7=9C=D7=95=D7=A7 % d =D7=91=D7= =90=D7=A8=D7=9B=D7=99=D7=95=D7=9F - =D7=90=D7=95=D7=9C=D7=99 =D7=91=D7=A9=D7= =9C =D7=91=D7=A7=D7=A9=D7=AA =D7=A9=D7=97=D7=96=D7=95=D7=A8 =D7=A9=D7=90=D7= =99=D7=A0=D7=94 =D7=9E=D7=A1=D7=95=D7=93=D7=A8=D7=AA, =D7=A9=D7=9C=D7=90 =D7= =A0=D7=99=D7=AA=D7=9F =D7=9C=D7=98=D7=A4=D7=9C =D7=91=D7=94 =D7=A2=D7=A7=D7= =91 =D7=97=D7=95=D7=A1=D7=A8 =D7=A7=D7=99=D7=96=D7=95=D7=96 =D7=A0=D7=AA=D7= =95=D7=A0=D7=99=D7=9D =D7=91=D7=90=D7=A8=D7=9B=D7=99=D7=95=D7=9F " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_cus= tom.c:477 "=D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C =D7=9C=D7=9E=D7=A6=D7=95=D7=90 =D7=90= =D7=AA =D7=9E=D7=96=D7=94=D7=94 =D7=94=D7=91=D7=9C=D7=95=D7=A7% d =D7=91=D7= =90=D7=A8=D7=9B=D7=99=D7=95=D7=9F - =D7=90=D7=95=D7=9C=D7=99 =D7=91=D7=A9=D7= =9C =D7=91=D7=A7=D7=A9=D7=AA =D7=A9=D7=97=D7=96=D7=95=D7=A8 =D7=A9=D7=90=D7= =99=D7=A0=D7=94 =D7=9E=D7=A1=D7=95=D7=93=D7=A8=D7=AA, =D7=A9=D7=9C=D7=90 =D7= =A0=D7=99=D7=AA=D7=9F =D7=9C=D7=98=D7=A4=D7=9C =D7=91=D7=94 =D7=A2=D7=A7=D7= =91 =D7=A7=D7=95=D7=91=D7=A5 =D7=A7=D7=9C=D7=98 =D7=A9=D7=90=D7=99=D7=A0=D7= =95 =D7=A0=D7=99=D7=AA=D7=9F =D7=9C=D7=97=D7=99=D7=A4=D7=95=D7=A9 =D7=91=D7= =95 " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_cus= tom.c:482 "=D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C =D7=9C=D7=9E=D7=A6=D7=95=D7=90 =D7=90= =D7=AA =D7=9E=D7=96=D7=94=D7=94 =D7=94=D7=91=D7=9C=D7=95=D7=A7% d =D7=91=D7= =90=D7=A8=D7=9B=D7=99=D7=95=D7=9F - =D7=90=D7=95=D7=9C=D7=99 =D7=91=D7=A9=D7= =9C =D7=91=D7=A7=D7=A9=D7=AA =D7=A9=D7=97=D7=96=D7=95=D7=A8 =D7=A9=D7=90=D7= =99=D7=A0=D7=94 =D7=9E=D7=A1=D7=95=D7=93=D7=A8=D7=AA, =D7=A9=D7=9C=D7=90 =D7= =A0=D7=99=D7=AA=D7=9F =D7=9C=D7=98=D7=A4=D7=9C =D7=91=D7=94 =D7=A2=D7=A7=D7= =91 =D7=A7=D7=95=D7=91=D7=A5 =D7=90=D7=A8=D7=9B=D7=99=D7=95=D7=9F =D7=9E=D7= =95=D7=A9=D7=97=D7=AA " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_tar= .c:1237 "=D7=9B=D7=95=D7=AA=D7=A8=D7=AA tar =D7=9C=D7=90 =D7=A9=D7=9C=D7=9E=D7=94 = =D7=A0=D7=9E=D7=A6=D7=90=D7=94 (% lu =D7=91=D7=99=D7=AA) " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_tar= .c:1237 "=D7=9B=D7=95=D7=AA=D7=A8=D7=AA tar =D7=9C=D7=90 =D7=A9=D7=9C=D7=9E=D7=94 = =D7=A0=D7=9E=D7=A6=D7=90=D7=94 (% lu =D7=91=D7=99=D7=AA) " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_backup_tar= .c:1237 "=D7=9B=D7=95=D7=AA=D7=A8=D7=AA tar =D7=9C=D7=90 =D7=A9=D7=9C=D7=9E=D7=94 = =D7=A0=D7=9E=D7=A6=D7=90=D7=94 (% lu =D7=91=D7=AA=D7=99=D7=9D) " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_dump.c:100= 0 "=D7=A6=D7=95=D7=99=D7=9F =D7=A7=D7=99=D7=93=D7=95=D7=93 =D7=9C=D7=A7=D7=95= =D7=97 =D7=9C=D7=90 =D7=97=D7=95=D7=A7=D7=99 "% s" " invalid format string in file "src/bin/pg_dump/po/he.po" for pg_dump.c:309= 5 "=D7=A9=D7=92=D7=99=D7=90=D7=94 =D7=91=D7=A2=D7=AA =D7=A7=D7=A8=D7=99=D7=90= =D7=AA =D7=90=D7=95=D7=91=D7=99=D7=99=D7=A7=D7=98 =D7=92=D7=93=D7=95=D7=9C= % u: %s" invalid format string in file "src/backend/po/id.po" for commands/vacuumla= zy.c:1093 "% .0f mati versi baris tidak dapat dihapus belum. Ada % .0f item pointer yang tidak terpakai. halaman%u sepenuhnya kosong. %s." invalid format string in file "src/backend/po/id.po" for executor/function= s.c:225 "tidak bisa menentukan pernyataan tipe argumen yang sebenarnya % s" invalid format string in file "src/backend/po/id.po" for executor/function= s.c:638 "tidak bisa menentukan hasil yang sebenarnya untuk pernyataan kepada penge= mbalian tipe % s" invalid format string in file "src/backend/po/id.po" for libpq/auth.c:2203 "tidak dapat melakukan pengumpulan inisialisasi LDAP untuk ldapbinddn =C2=AB= %s =C2=BB pada server =C2=AB %s =C2=BB:% s" invalid format string in file "src/backend/po/id.po" for libpq/auth.c:2283 "tidak dapat melepaskan setelah mencari pengguna =C2=AB %s =C2=BB di serve= r =C2=AB %s =C2=BB:% s" invalid format string in file "src/backend/po/fr.po" for catalog/objectadd= ress.c:1903 "le droit par d=C3=A9faut pour l'utilisateur =C2=AB % s=C2=BB dans le sch=C3= =A9ma =C2=AB %s =C2=BB de %s n'existe pas" invalid format string in file "src/interfaces/libpq/po/he.po" for fe-auth.= c:1045 "=D7=9B=D7=99=D7=A9=D7=9C=D7=95=D7=9F =D7=91=D7=93=D7=99=D7=A7=D7=94 =D7=A2= =D7=91=D7=95=D7=A8 =D7=A9=D7=9D =D7=94=D7=9E=D7=A9=D7=AA=D7=9E=D7=A9: =D7=A7= =D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=94 % lu " invalid format string in file "src/interfaces/libpq/po/he.po" for fe-auth.= c:1055 "=D7=9C=D7=90 =D7=99=D7=9B=D7=95=D7=9C =D7=9C=D7=97=D7=A4=D7=A9 =D7=9E=D7=A9= =D7=AA=D7=9E=D7=A9 =D7=9E=D7=A7=D7=95=D7=9E=D7=99 =D7=A2=D7=9D =D7=9E=D7=96= =D7=94=D7=94 % d: %s " invalid format string in file "src/interfaces/libpq/po/he.po" for fe-conne= ct.c:1561 "=D7=A0=D7=9B=D7=A9=D7=9C WSAIoctl(SIO_KEEPALIVE_VALS): % ui " invalid format string in file "src/interfaces/libpq/po/he.po" for fe-misc.= c:292 "=D7=9E=D7=A1=D7=A4=D7=A8 =D7=A9=D7=9C=D7=9D =D7=91=D7=92=D7=95=D7=93=D7=9C= % lu =D7=90=D7=99=D7=A0=D7=95 =D7=A0=D7=AA=D7=9E=D7=9A =D7=A2=D7=9C =D7=99= =D7=93=D7=99 pqGetInt" invalid format string in file "src/interfaces/libpq/po/he.po" for fe-misc.= c:328 "=D7=9E=D7=A1=D7=A4=D7=A8 =D7=A9=D7=9C=D7=9D =D7=91=D7=92=D7=95=D7=93=D7=9C= % lu =D7=90=D7=99=D7=A0=D7=95 =D7=A0=D7=AA=D7=9E=D7=9A =D7=A2=D7=9C =D7=99= =D7=93=D7=99 pqPutInt" invalid format string in file "src/interfaces/libpq/po/he.po" for fe-proto= col2.c:529 "=D7=AA=D7=95 =D7=9C=D7=90 =D7=A6=D7=A4=D7=95=D7=99% c =D7=91=D7=A2=D7=A7=D7= =91=D7=95=D7=AA =D7=AA=D7=92=D7=95=D7=91=D7=AA =D7=A9=D7=90=D7=99=D7=9C=D7= =AA=D7=94 =D7=A8=D7=99=D7=A7=D7=94 (=D7=94=D7=95=D7=93=D7=A2=D7=AA "I")" invalid format string in file "src/interfaces/libpq/po/he.po" for fe-proto= col3.c:1316 "=D7=94=D7=A9=D7=95=D7=A8=D7=94 % d: " invalid format string in file "src/interfaces/libpq/po/he.po" for fe-secur= e-openssl.c:1465 "=D7=A7=D7=95=D7=93 =D7=A9=D7=92=D7=99=D7=90=D7=AA SSL % lu" invalid format string in file "src/pl/plpython/po/vi.po" for plpy_typeio.c= :1541 "thu=E1=BB=99c t=C3=ADnh "% s" kh=C3=B4ng t=E1=BB=93n t=E1=BA=A1i trong =C4= =91=E1=BB=91i t=C6=B0=E1=BB=A3ng Python" ------- =_aaaaaaaaaa0 Content-Type: text/x-diff; name="test-po-files.patch"; charset="us-ascii" Content-ID: <3097.1544139122.3@sss.pgh.pa.us> Content-Description: test-po-files.patch Content-Transfer-Encoding: quoted-printable diff --git a/src/port/snprintf.c b/src/port/snprintf.c index a773381..42aaea8 100644 *** a/src/port/snprintf.c --- b/src/port/snprintf.c *************** *** 110,115 **** --- 110,129 ---- #undef printf = /* + * If this file is compiled with SNPRINTF_VALIDATE defined, it doesn't + * provide any of the normal *printf functions, but instead exports + * a function "pg_validate_printf_format()" that just detects whether a + * supplied format string is syntactically valid. We implement that + * by running the normal snprintf code with a fake output buffer, and + * suppressing all attempts to fetch variable arguments (since those + * won't be there). + */ + #ifdef SNPRINTF_VALIDATE + #undef va_arg + #define va_arg(args, type) ((type) 0) + #endif + = + /* * Info about where the formatted output is going. * * dopr and subroutines will not write at/past bufend, but snprintf *************** static void dopr(PrintfTarget *target, c *** 170,175 **** --- 184,191 ---- * they not change the value of "errno" before reaching dopr(). */ = + #ifndef SNPRINTF_VALIDATE + = int pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args) { *************** pg_printf(const char *fmt,...) *** 290,295 **** --- 306,335 ---- return len; } = + #else /* SNPRINTF_VALIDATE */ + = + /* + * Returns 1 if "fmt" is syntactically valid, -1 if not. + * In the latter case, errno is set (but it'll always be EINVAL). + */ + int + pg_validate_printf_format(const char *fmt) + { + /* Code is basically the same as pg_vsnprintf with NULL str argument */ + PrintfTarget target; + char onebyte[1]; + = + target.bufstart =3D target.bufptr =3D onebyte; + target.bufend =3D onebyte; + target.stream =3D NULL; + target.nchars =3D 0; + target.failed =3D false; + dopr(&target, fmt, NULL); + return target.failed ? -1 : 1; + } + = + #endif /* SNPRINTF_VALIDATE */ + = /* * Attempt to write the entire buffer to target->stream; discard the ent= ire * buffer in any case. Call this only when target->stream is defined. *************** dopr(PrintfTarget *target, const char *f *** 438,445 **** --- 478,489 ---- if (*format =3D=3D 's') { format++; + #ifndef SNPRINTF_VALIDATE strvalue =3D va_arg(args, char *); Assert(strvalue !=3D NULL); + #else + strvalue =3D ""; + #endif dostr(strvalue, strlen(strvalue), target); if (target->failed) break; *************** nextch2: *** 666,677 **** --- 710,726 ---- else fieldwidth =3D accum; } + #ifndef SNPRINTF_VALIDATE if (have_dollar) strvalue =3D argvalues[fmtpos].cptr; else strvalue =3D va_arg(args, char *); /* Whine if someone tries to print a NULL string */ Assert(strvalue !=3D NULL); + #else + /* va_arg would return NULL, so inject empty string instead */ + strvalue =3D ""; + #endif fmtstr(strvalue, leftjust, fieldwidth, precision, pointflag, target); break; *************** fail: *** 1252,1257 **** --- 1301,1308 ---- target->failed =3D true; } = + #ifndef SNPRINTF_VALIDATE + = /* * Nonstandard entry point to print a double value efficiently. * *************** fail: *** 1352,1357 **** --- 1403,1410 ---- + target.nchars); } = + #endif /* SNPRINTF_VALIDATE */ + = = static void dostr(const char *str, int slen, PrintfTarget *target) diff --git a/src/port/test_po_file.c b/src/port/test_po_file.c index ...8dc063c . *** a/src/port/test_po_file.c --- b/src/port/test_po_file.c *************** *** 0 **** --- 1,150 ---- + /*----------------------------------------------------------------------= --- + * + * test_po_file.c + * Test messages in a .po file to see if our version of snprintf likes= them. + * + * Copyright (c) 2018, PostgreSQL Global Development Group + * + * + * IDENTIFICATION + * src/port/test_po_file.c + * + *----------------------------------------------------------------------= --- + */ + = + #include "c.h" + = + #include + = + /* snprintf.c will provide this below */ + extern int pg_validate_printf_format(const char *fmt); + = + = + /* Error handlers required by recent libgettextpo versions */ + static void + xerror(int severity, + po_message_t message, + const char *filename, size_t lineno, size_t column, + int multiline_p, const char *message_text) + { + fprintf(stderr, "PO error: %s\n", message_text); + if (filename) + fprintf(stderr, "Error occurred in file \"%s\" at line %d:\n", + filename, (int) lineno); + if (severity =3D=3D PO_SEVERITY_FATAL_ERROR) + exit(1); + } + = + static void + xerror2(int severity, + po_message_t message1, + const char *filename1, size_t lineno1, size_t column1, + int multiline_p1, const char *message_text1, + po_message_t message2, + const char *filename2, size_t lineno2, size_t column2, + int multiline_p2, const char *message_text2) + { + fprintf(stderr, "PO error: %s ...\n", message_text1); + if (filename1) + fprintf(stderr, "Error occurred in file \"%s\" at line %d:\n", + filename1, (int) lineno1); + fprintf(stderr, "PO error: ... %s\n", message_text2); + if (filename2) + fprintf(stderr, "Error occurred in file \"%s\" at line %d:\n", + filename2, (int) lineno2); + if (severity =3D=3D PO_SEVERITY_FATAL_ERROR) + exit(1); + } + = + static const struct po_xerror_handler handler =3D { + xerror, xerror2 + }; + = + = + /* + * Main program. + * + * Test each .po file named on the command line. + */ + int + main(int argc, char **argv) + { + for (int i =3D 1; i < argc; i++) + { + const char *filename =3D argv[i]; + po_file_t file =3D po_file_read(filename, &handler); + const char *const *domains; + const char *const *domainp; + = + if (file =3D=3D NULL) + { + fprintf(stderr, "could not open file \"%s\": %s\n", + filename, strerror(errno)); + exit(1); + } + = + domains =3D po_file_domains(file); + for (domainp =3D domains; *domainp; domainp++) + { + const char *domain =3D *domainp; + po_message_iterator_t iterator =3D po_message_iterator(file, domain); + = + for (;;) + { + po_message_t message =3D po_next_message(iterator); + po_filepos_t pos; + char location[256]; + const char *fmt; + = + if (message =3D=3D NULL) + break; + = + if (!po_message_is_format(message, "c-format")) + continue; + = + pos =3D po_message_filepos(message, 0); + if (pos) + snprintf(location, sizeof(location), "for %s:%ld", + po_filepos_file(pos), + (long) po_filepos_start_line(pos)); + else + strcpy(location, "unknown location"); + = + fmt =3D po_message_msgid(message); + if (fmt && pg_validate_printf_format(fmt) < 0) + fprintf(stderr, "invalid format string in file \"%s\" %s\n\"%s\"\n"= , + filename, location, fmt); + fmt =3D po_message_msgid_plural(message); + if (fmt && pg_validate_printf_format(fmt) < 0) + fprintf(stderr, "invalid format string in file \"%s\" %s\n\"%s\"\n"= , + filename, location, fmt); + fmt =3D po_message_msgstr(message); + if (fmt && pg_validate_printf_format(fmt) < 0) + fprintf(stderr, "invalid format string in file \"%s\" %s\n\"%s\"\n"= , + filename, location, fmt); + for (int ndx =3D 0;; ndx++) + { + fmt =3D po_message_msgstr_plural(message, ndx); + if (!fmt) + break; + if (pg_validate_printf_format(fmt) < 0) + fprintf(stderr, "invalid format string in file \"%s\" %s\n\"%s\"\n= ", + filename, location, fmt); + } + } + po_message_iterator_free(iterator); + } + po_file_free(file); + } + = + return 0; + } + = + /* + * Now include snprintf.c with the desired variant compilation flag. + * We put this at the end so that its messing about with #define's + * won't mess up code in this file. + */ + #define SNPRINTF_VALIDATE 1 + = + #include "snprintf.c" ------- =_aaaaaaaaaa0--