[Top][All Lists]

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

Re: asterisks, dollar signs and percent signs!

From: Eric Blake
Subject: Re: asterisks, dollar signs and percent signs!
Date: Tue, 01 May 2012 15:25:35 -0600
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20120424 Thunderbird/12.0

On 05/01/2012 01:57 PM, Anonymous wrote:
> Hello, I am trying to use m4 to write assembly language macros.
> My first effort is almost working but I can't get the last part to work.

Hello, and thanks for the question.

> Here is what I have so far.
> define(entry,`

Unrelated to your question, but it's generally a good habit to get into
quoting the name of the macro you are defining (so that if you hit the
define() a second time, you redefine the intended macro name, rather
than defining a completely unrelated macro from the expansion of the old

define(`entry',` ...

>       entry
>       call printf
>       exit
> This works as desired except I want to change the macro names to $entry and
> $exit.

By default, m4 only recognizes the pattern '[a-zA-Z_][a-zA-Z_0-9]*' as a
macro name to check for expansion.  If your version of m4 was compiled
with the changeword() builtin (a conscious decision at compile time),
then you can specify a different regex that includes a leading $ as a
candidate macro name.  But be aware that a non-default regex introduces
a speed penalty to everything m4 does.

The eventual m4 2.0 release will solve this problem differently with a
new changesyntax() builtin that lets you choose which syntax category
each character belongs to (so you could set $ into the alphanumeric
category), and doesn't have the speed penalty of m4 1.4.x's
changeword(), but development on m4 has not been very fast.

> I can't figure out how to quote the names or what I am doing wrong,
> it produces no output or produces wrong output and loops depending on
> what I try. I would like to be able to create a $main macro but main: is a
> text token in the definition and I also have problems with that. I looked
> over the manual and I obviously missed something. Thanks for any help and
> sorry if this is a stupid question.

It is also possible to invoke a macro via the indir() builtin, without
having to use changeword() (on its way out) or changesyntax() (not yet


call printf


but that's not the clean syntax you were looking for.  Hope that helps.

Eric Blake   address@hidden    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

reply via email to

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