m4-discuss
[Top][All Lists]
Advanced

[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
name):

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
released):

indir(`$entry')

call printf

indir(`$exit')

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]