sub demacro($)
{
my $text = shift;
while (($macro,$pkg) = each %macro )
{
my $defn = $$pkg[0];
if (defined $$pkg[1]) {
my @args = @{$$pkg[1]};
while ($text =~ m/($macro\((.*?)\))/g) {
my $oA = length($`), $oZ = length($&);
my @vals = split /\s*,\s*/, $2;
(@args eq @vals)
or die "Bad arg count for macro '$macro'\n";
my $_defn = $defn;
for ($i=0; $i<@args; $i++) {
$_defn =~ s/$args[$i]/($vals[$i])/g;
}
substr($text, $oA, $oZ) = $_defn;
}
}
else {
$text =~ s/$macro/$defn/;
}
}
return $text;
}
####
macrodef : '#define' /[a-z]\w*/i
'(' ')' /.*/
{ $::macro{$item[2]} = [ $item[-1], $item[4] ]; }
| '#define' /[a-z]\w*/i /.*/
{ $::macro{$item[2]} = [ $item[-1] ]; }
####
#define add(a,b,c) (a+b+c)
#define mult(d,e) (d*e)
#define pi (3.1415)
main( ) {
add(1,2,3);
mult(4,5);
float p = pi;
}