#! perl

use strict;
use warnings FATAL => 'all';
use autodie;

open my $fh, '<', 'scriptconfig';

my %invars = map { chomp; split /=/, $_, 2 } <$fh>;
my %outvars;

close($fh);

for(;;) {
	my $changed;
	while(my ($key, $val) = each %invars) {
		next unless $val =~ /^(?:[^\\\$\`]|\$(?:\{\w+}|\w+)|\\.)+$/;
		$val =~ s{\\(.)|\$(?:\{(\w+)\}|(\w+))}{$1 // $outvars{$2 // $3} // ''}eg;
		next if exists $outvars{$key} && $val eq $outvars{$key};
		$outvars{$key} = $val;
		$changed = 1;
	}
	last unless $changed;
}

my $lang = shift @ARGV;

if($lang eq 'perl') {
	print "#! $outvars{PERL}\n\nBEGIN {\n";

	foreach my $key (sort keys %outvars) {
		my $val = $outvars{$key};
		$val =~ s/[\\"\$\@]/\\$&/g;
		print "\tour \$$key = \"$val\";\n";
	}

	print "}\n\n";

	my $pod;
	while(<ARGV>) {
		$pod = 1 if /^=\w+/;
		print unless $pod;
		$pod = 0 if /^=cut(?:\s|$)/
	}
} elsif($lang eq 'python') {
	open my $fh, '-|', $outvars{PYTHON}, "-c", "import keyword\nfor x in keyword.kwlist: print(x)";
	my %resvars = map { chomp; ($_, undef) } <$fh>;
	close($fh);

	print "#! $outvars{PYTHON} -O\n\nclass autoconf:\n";

	foreach my $key (sort keys %outvars) {
		my $val = $outvars{$key};
		$val =~ s/[\\"]/\\$&/g;
		if(exists $resvars{$key}) {
			print "\tac_$key = \"$val\"\n";
		} else {
			print "\t$key = \"$val\"\n";
		}
	}

	print "\n";

	print or die $! while <ARGV>;
} else {
	die "unknown language '$lang'\n";
}
