#!/usr/bin/perl -w
undef $/;
my $DEB_HOST_MULTIARCH = (split /\n/, qx/dpkg-architecture -qDEB_HOST_MULTIARCH/)[0];
sub file_replace($)
{
    my $f=$_[0];
    my $foutname = $f;
    $foutname =~ s/[@]NAME[@]/$name/;
    open IN, "<debian/$f.in" or die "Can't read debian/$f.in: $!\n";
    local $_=<IN>;
    close IN;

    s/[@]NAME[@]/$name/g;
    s/[@]DEB_HOST_MULTIARCH[@]/$DEB_HOST_MULTIARCH/g;
    open OUT, ">debian/$foutname"
	or die "Can't write debian/$foutname: $!\n";
    print OUT;
    close OUT;
}

my $control;

my $ctemplate;
my $cfilename = "test.c.in";
open(my $fctemplate, '<', $cfilename) or die "cannot open file $cfilename";
{
    local $/ = undef;
    $ctemplate = <$fctemplate>;
}
close($fctemplate);

# dpkg-shlibdeps now looks inside, but is ok with an empty file.
system("touch debian/control");

my @control_in;
open IN, "<debian/control.d/control.in" or die "Can't read debian/control.d/control.in: $!\n";
$_=<IN>;
@control_in = grep !/^\s*$/s, split /\n\s*\n/s;
close IN;

open ISA_LIST, "<isa-list" or die "Can't read isa-list: $!\n";
$_=<ISA_LIST>;
close ISA_LIST;

my %archlist;


for (split /\n\s*\n/s)
{
    s/^#.*//gm;
    next if /^\s*$/s;
    my %field;
    $field{$1}=$2 while (/\G^([!-9;-~]+):[ \t]*((?:[^\n]|\n[ \t]+)+)\n?/gsm);
    $archlist{$field{'Architecture'}} = 1;

    $name=$field{'Name'};
    $name=~/^[a-z0-9\.+_]+$/ or die "Bad package/isa name: \"$name\".\n";

    my @c = @control_in;
    foreach (@c) {
	s/[@]NAME[@]/$name/g;
	s/[@]ARCHITECTURE[@]/$field{'Architecture'}/g;
        s/[@]DEB_HOST_MULTIARCH[@]/$DEB_HOST_MULTIARCH/g;
	$control.="\n".$_;
    }

    open C, '>', "test-$name.c";
    my $test=$field{'Test'}//"return !__builtin_cpu_supports(\"$name\");";
    my $cfile = $ctemplate;
    $cfile =~ s/[@]TEST[@]/$test/g;
    print C $cfile;
    file_replace $_ for qw(@NAME@-support.preinst @NAME@-support.templates @NAME@-support.lintian-overrides @NAME@-support.maintscript);
}
my $all_architectures = join(' ',sort(keys %archlist));

my $control_base;
my $filename = "debian/control.d/control-base.in";
open(my $fh, '<', $filename) or die "cannot open file $filename";
{
    local $/ = undef;
    $control_base = <$fh>;
}
close($fh);
$control_base =~ s/[@]ALL_ARCHITECTURES[@]/$all_architectures/g;
$control=$control_base.$control;

open CONTROL, ">debian/control" or die "Can't write to debian/control: $!\n";
print CONTROL $control;
close CONTROL;
