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).


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!

Reply via email to