#!/usr/bin/perl
# $Id$
# $Source$

########################################################################
### Automatically insert header text into given file
########################################################################

if ($#ARGV < 1) {
    die "Usage: autoheader <filename> <headerfile> [type] [key]\n";
}

$filename = $ARGV[0];

$headerfile = $ARGV[1];

if ($#ARGV >= 2) {
    $type = $ARGV[2];
}
else {
    $type = "auto";
}

if ($#ARGV >= 3) {
    $key = $ARGV[3];
}
else {
    $key = "\@HEADER";
}

$tmpname = "$filename.~autoheader~";
open INFILE, "<$filename" or die "couldn't open input file $filename\n";
open OUTFILE, ">$tmpname" or die "couldn't open output file $tmpname\n";

$cnt = 0;
while (<INFILE>) {

    if (/$key/) {
	print OUTFILE $_;
	$cnt = $cnt + 1;
	($cnt == 1) && (&insert_header);
    }
    elsif ($cnt != 1) {
	print OUTFILE $_;
    }
}

close INFILE;
close OUTFILE;

#error check on cnt
if ($cnt < 2) {
    unlink $tmpname;
    die "Error: The key \"$key\" did not appear at least two times in $filename.\n";
}

#diff check
@diff = `diff $filename $tmpname`;
if ($#diff >= 0) {
    rename($tmpname, $filename) or 
	die "Autoheader failed to replace old file with new file for $filename.\n";
}
else {
    unlink $tmpname;
}


sub insert_header{

    if ($type =~ /^auto$/) {

	(($filename =~ /.ac$/) && ($type = "plain")) or
	(($filename =~ /.[CH]$/) && ($type = "C++")) or
	(($filename =~ /.hpp$/) && ($type = "C++")) or
	(($filename =~ /.cpp$/) && ($type = "C++")) or
	(($filename =~ /.[ch]$/) && ($type = "C")) or
	($type = "plain");
    }

    $begin = "";
    $per = "";
    $end = "";

    if ($type =~ /^C\+\+$/) {
	$per = "// ";
    }
    elsif ($type =~ /^C$/) {
	$begin = "/*\n";
	$end = "*/\n";
    }
    else {
	$per = "# ";
    }

    @header = `cat $headerfile`;

    print OUTFILE "$begin";
    foreach (@header) {

	print OUTFILE "$per$_";

    }
    print OUTFILE "$end";
}
