#!/usr/bin/perl -w

use strict;
#use warnings;

## http://www.din.or.jp/~ohzaki/regex.htm#GetNestedParen
my $macro_re;
$macro_re = qr/%\{[^{}]*(?:(??{$macro_re})[^{}]*)*\}/;

my %v = ();

sub subst
{
  my $str = shift;

  $str =~ s/($macro_re)/subst2($1)/ge;

  return $str;
}

sub subst2
{
  my $str = shift;

  my ($opt, $name, $value) = $str =~ /^%\{(\W)?(\w+)(?::(.*))?\}$/;

  return '' if (defined($opt) && $opt eq '?' && !defined($v{$name}));
  return subst($value) if (defined($value));
  return defined($v{$name}) ? $v{$name} : "*** UNDEFINED VALUE: $name ***";
}

while (<>) {
    chomp;

    if (/^source\d*:\s(.*)$/i) {
	my $s = subst($1);
	#$s =~ s/%\{(\w+)\}/defined($v{$1}) ? $v{$1} : '*** UNDEFINED VALUE ***'/ge;
	$s =~ s#.*/##;
	print "$s\n";
    }
    elsif (/^(\w+):\s+(.*)$/) {
	my ($l, $r) = (lc($1), $2);
	$v{$l} = subst($r);
    }
    elsif (/^%define\s+(\w+)\s+(.*)$/) {
	my ($l, $r) = (lc($1), $2);
	$v{$l} = subst($r);
    }
}

exit(0);

