m4-discuss
[Top][All Lists]
Advanced

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

Suggestion to allow macros that don't expand within "string"


From: Daniel Goldman
Subject: Suggestion to allow macros that don't expand within "string"
Date: Wed, 18 Jun 2014 14:10:54 -0700
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0

For some future m4 version, I'd like to suggest an alternative "m4_define2" (or other more clever name) that is the same as m4_define, but the newly defined macro does not expand if within a double-quoted "string". This would be useful for me, and I think for others too.

To clarify, current m4_define works as follows:

m4_define(foo, bar)     foo -> bar     "foo" -> "bar"

Proposed alternative would work as follows:

m4_define2(foo, bar)    foo -> bar     "foo" -> "foo"

Perhaps the strongest, most obvious, argument for this addition is that cpp does not substitute a macro when it occurs within quotes:

#define foo bar         foo -> bar     "foo" -> "foo"

There is a reason cpp has this behavior - it's useful. I use it to display names of macros and their values in a diagnostic log file. I think it's a flaw that m4 lacks the cpp behavior (and a flaw that cpp lacks the m4 behavior, which is also useful). I think m4 could give the user both choices.

As a workaround, the input file can (possibly) be modified to produce the needed results. It seems the diagnostic macros I use might need to be modified to add another argument with double quote delimiters. In other words, DIAG_INT(MACRO_1) might need to be changed to something like DIAG_INT(MACRO_1, ``MACRO_1''). But this is tedious, and puts the effort on the user. And I already tried it. It's not trivial getting it to work correctly. Instead of making the user flail around, I think it's better to improve m4.

The only reason I see against making this change is that it's work to modify the m4 source code. But since cpp already does the behavior, it's doable, and the cpp source might help figure out the logic.

Perhaps there are some special conditions or complications that need to be taken into account that I am not aware of. But on the face of it, the logic seems maybe simple:

** Maintain a field in the macro data structure (I'm assuming there is such a data structure!) to store whether the macro is defined with m4_define or m4_define2. ** Add "in_quote" variable to the C function that reads input tokens. ** For each line of input read, in_quote starts out FALSE. ** Each input token is either within a quoted string or not. ** When we encounter un-escaped " character on the input line, toggle in_quote variable. ** If in_quote is TRUE and the macro is defined by m4_define2, don't expand the macro. Otherwise, expand it.

Thanks,
Daniel





reply via email to

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