m4-discuss
[Top][All Lists]
Advanced

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

Re: Any basic cpp capability m4 cannot do?


From: Daniel Goldman
Subject: Re: Any basic cpp capability m4 cannot do?
Date: Thu, 08 May 2014 11:32:25 -0700
User-agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0

Hi Raphael,

Thanks, you're right. I looked into this. For stringifying an argument, if the sequence does not contain strings, they work the same:

$ cat stringify-01.h
#define DEBUG(var, txt) debug (var, #var ": " txt)
DEBUG(var_1, "Description of var 1")

$ cat stringify-01.m4
m4_define(DEBUG, `debug ($1, "$1" ": " $2)')
DEBUG(var_1, "Description of var 1")

$ cpp -P stringify-01.h
debug (var_1, "var_1" ": " "Description of var 1")

$ m4 -P stringify-01.m4 | grep -v "^ *$"
debug (var_1, "var_1" ": " "Description of var 1")

--------

And both can stringify the contents of other macros:

$ cat stringify-03.h
#define STRINGIFY(txt) HIDDEN_STRINGIFY(txt)
#define HIDDEN_STRINGIFY(txt) #txt
STRINGIFY(XXX)
#define XXX YYY
STRINGIFY(XXX)

$ cat stringify-03.m4
m4_define(STRINGIFY, "$1")
STRINGIFY(XXX)
m4_define(XXX, YYY)
STRINGIFY(XXX)

$ cpp -P stringify-03.h
"XXX"
"YYY"

$ m4 -P stringify-03.m4 | grep -v "^ *$"
"XXX"
"YYY"

-----------------

But if the sequence already contains strings, cpp "knows" to escape the internal double quotes, m4 apparently does not:

$ cat stringify-04.h
#define STRINGIFY(txt) HIDDEN_STRINGIFY(txt)
#define HIDDEN_STRINGIFY(txt) #txt
#define XXX The "right stuff"
STRINGIFY(XXX)

$ cat stringify-04.m4
m4_define(STRINGIFY, "$1")
m4_define(XXX, The "right stuff")
STRINGIFY(XXX)

$ cpp -P stringify-04.h
"The \"right stuff\""

$ m4 -P stringify-04.m4 | grep -v "^ *$"
"The "right stuff""

Luckily, I have never had to stringify any sequences that contain strings. For some reason, this has never come up in my code, so this difference will not be a barrier for me. I suppose if this comes up I might have to resort to single quotes. :(

Thanks again. Any other differences anyone might suggest, basic capabilities cpp can do that m4 cannot do?

Daniel

On 5/7/2014 11:36 PM, Raphael 'kena' Poss wrote:
Hi Daniel,

You may want to check cpp's ability with # to turn an arbitrary enclosed
sequence of C tokens into a single C string that is properly quoted.
Especially if said sequence already contains strings. This I found
relatively difficult to imitate with m4.

Best,




reply via email to

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