On Tue, Oct 25, 2011 at 10:35:53AM +0100, Stuart Henderson wrote:
> Thanks for the analysis and diff.
>
> As I'm sure you noticed, OpenBSD m4 has a GNU-compatible mode (-g),
> and the standard POSIX mode; this diff changes behaviour in both.
>
> Does anyone reading have another m4 implementation (esp. solaris)
> handy to test what that does with test.m4? (I'm wondering whether it
> should just be restricted to -g or applied everywhere).
Is this what you asked for?
$ cat test.m4
divert(0)A regexp(`
C', `^C', `B')D
$ uname -a
SunOS anonymous 5.8 Generic_117350-49 sun4u sparc SUNW,Sun-Blade-1500
$ /usr/ccs/bin/m4 test.m4
A regexp(
C, ^C, B)D
$ /usr/xpg4/bin/m4 test.m4
A regexp(
C, ^C, B)D
$ uname -a
Sun Microsystems Inc. SunOS 5.10 Generic January 2005
$ /usr/ccs/bin/m4 test.m4
A regexp(
C, ^C, B)D
$ /usr/xpg4/bin/m4 test.m4
A regexp(
C, ^C, B)D
>
>
> On 2011/10/25 08:25, Robert Young wrote:
> > # uname -ap
> > OpenBSD 4.9 GENERIC.MP#819 amd64 Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
> > #
> > # #From: http://ftp.openbsd.org/pub/OpenBSD/4.9/packages/amd64/m4-1.4.13.tgz
> > # /usr/bin/gm4 --version
> > m4 (GNU M4) 1.4.13
> > Copyright (C) 2009 Free Software Foundation, Inc.
> > License GPLv3+: GNU GPL version 3 or later
> > <http://gnu.org/licenses/gpl.html>.
> > This is free software: you are free to change and redistribute it.
> > There is NO WARRANTY, to the extent permitted by law.
> >
> > Written by Rene' Seindal.
> > #
> >
> > let's inspect a sample:
> > test.m4:
> > divert(0)A regexp(`
> > C', `^C', `B')D
> >
> > The output of GNU-M4:
> > # /usr/bin/gm4 test.m4 > test.gnu.c
> > # cat test.gnu.c
> > A BD
> > #
> >
> > The output of BSD-M4:
> > # /usr/bin/m4 -g test.m4 > test.bsd.c
> > # cat test.bsd.c
> > A D
> > #
> >
> > differ:
> > # diff -u test.gnu.c test.bsd.c
> > --- test.gnu.c Tue Oct 25 07:48:24 2011
> > +++ test.bsd.c Tue Oct 25 07:50:06 2011
> > @@ -1 +1 @@
> > -A BD
> > +A D
> > #
> >
> > let's fix it:
> > # git diff old master
> > diff --git a/usr/src/usr.bin/m4/gnum4.c b/usr/src/usr.bin/m4/gnum4.c
> > index 5f6568a..b2d6522 100644
> > --- a/usr/src/usr.bin/m4/gnum4.c
> > +++ b/usr/src/usr.bin/m4/gnum4.c
> > @@ -497,7 +497,7 @@ doregexp(const char *argv[], int argc)
> > pbstr(argv[4]);
> > }
> > error = regcomp(&re, mimic_gnu ? twiddle(argv[3]) : argv[3],
> > - REG_EXTENDED);
> > + REG_EXTENDED|REG_NEWLINE);
> > if (error != 0)
> > exit_regerror(error, &re);
> >
> > #
> >
> > Now they are compatible:
> > # /usr/src/usr.bin/m4/m4 -g test.m4 > test.bsd.patched.c
> > # diff -s test.gnu.c test.bsd.patched.c
> > Files test.gnu.c and test.bsd.patched.c are identical
> > #
> >
> > Consequence of imcompatibility:
> > An error occurs during compiling PostgreSQL:
> >
> > gmake[4]: Entering directory `/tmp/pgxc/git/src/pl/plpgsql/src'
> > /usr/bin/bison -d -o pl_gram.c gram.y
> > gcc -DPGXC -Wall -Wmissing-prototypes -Wpointer-arith
> > -Wdeclaration-after-statement -Wendif-labels -Wformat-security
> > -fno-strict-aliasing -fwrapv -fpic -DPIC -I. -I.
> > -I../../../../src/include -c -o pl_gram.o pl_gram.c
> > gram.y: In function 'plpgsql_yyparse':
> > gram.y:875: warning: passing argument 2 of 'tok_is_keyword' from
> > incompatible pointer type
> > ...
> > gram.y:3379: warning: passing argument 2 of 'tok_is_keyword' from
> > incompatible pointer type
> > gmake[4]: *** [pl_gram.o] Error 1
> > gmake[4]: Leaving directory `/tmp/pgxc/git/src/pl/plpgsql/src'
> >
> > Further reading:
> > http://archives.postgresql.org/pgsql-bugs/2011-10/msg00161.php
> >
> > Thank You!
--
/ Raimo Niskanen, Erlang/OTP, Ericsson AB