[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: divert(-1) does not work in argument

From: Eric Blake
Subject: Re: divert(-1) does not work in argument
Date: Mon, 18 Nov 2019 14:43:20 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.1.1

On 11/18/19 2:13 PM, Enshan Wang wrote:
enswan@ws/bin$ m4 <<<'changequote()changequote([,])divert(-1)good[]divert[]show'
enswan@ws/bin$ m4 
m4:stdin:1: cannot open `goodshow': No such file or directory

Maybe it's not a bug, but I think the 2nd m4 call should show that `show': No 
such file or directory.
Looks include call still see the `good' which I want to divert to -1 i.e. it 
should be discarded.

Not a bug in m4, but in your expectations. Let's follow exactly what happens as m4 expands things:

First version:
m4 <<<'changequote()changequote([,])divert(-1)good[]divert[]show'

m4 parses 'changequote(' and sees that it has to collect arguments; it then parses ')' and calls changequote with a single empty argument '' which expands to the empty string to the current output stream 0 (plus the side effect of resetting quote chars). Next, m4 parses 'changequote(', sees that it has to collect arguments, and collects the two arguments '[' and ']' before the closing ')', which again expands to the empty string '' to the current output stream 0 (as well as a side effect of new quote chars). Next, m4 parses 'divert(', collects the single argument '-1', and expands the macro upon seeing ')'; this expands to the empty string but had the side effect of setting the current stream to -1 for discarding all expanded output. Next m4 parses 'good', sees that it is not a macro, and outputs it as-is (but output to stream -1 does nothing), parses '[]' as a string and outputs it with the quotes removed (but the empty string has nothing to output), then parses 'divert' and sees that it is a macro, and invokes it with 0 arguments. This expands to empty text, but has the side effect of restoring the output stream back to 0. Next m4 parses '[]' as another string that results in no output, then the text 'show' which is not a macro name and is output as-is.

Your other example:
m4 <<<'changequote()changequote([,])include(divert(-1)good[]divert[]show)'

starts the same for the two changequote macros. Then m4 parses 'include(' and sees that it has to perform argument collection. During that argument collection, it parses 'divert(' and sees that it has to start a nested macro invocation. It then parses '-1' as the argument and ')' to expand the divert macro, which changes the output stream to -1; but we are still collecting arguments to 'include' rather than generating output to the output stream; so far, we collected an empty string '' from the expansion of divert. Next, m4 parses 'good', sees that it is not a macro name, and appends it to the argument being collected. Similarly for parsing '[]' which gets quotes stripped and appends '' to the argument being collected. Then 'divert' which is a macro call with 0 arguments, restoring the output stream to 0 with NO output having been produced to any output stream in the meantime, appending another '' to the argument collection. Then '[]' which appends another '', and finally 'show' which is appended as is. Putting it all together, when m4 finally sees ')', it has collected a single argument 'goodshow', which m4 correctly tells you is not the name of an existing file to be included.

My version is 1.4.18. I did not try 1.6 version of m4. (BTW what's the status 
of m4 1.6? should I use m4 1.6 or 1.4...?)

m4 1.4.x is the latest stable version. I need to post a refresh version (there have been FTBFS reports where the existing m4 release is incompatible with newer glibc headers), but that's not difficult. Getting 1.6 complete will require more time on my part, which I have not seemed to have lately.

CONFIDENTIALITY AND PRIVACY NOTICE: This e-mail and any attachments are for the 
exclusive and confidential

Claims like this are unenforceable on publicly-archived mailing lists. You may wish to send future emails from other than your employer's servers that slams this garbage legalese on your outgoing mails.

Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org

reply via email to

[Prev in Thread] Current Thread [Next in Thread]