#!/usr/local/bin/perl

sub usage();

$PRAM_HOME    = "/home/pram/";
$PRAM_BIN_DIR = $PRAM_HOME."bin/";

if($#ARGV != 1)
{
    usage();
}

$OBJFILE = $ARGV[0];
$C_FILE	 = $ARGV[1].".c";
$H_FILE	 = $ARGV[1].".h";


$ignore{'___default_io_functions'}   = 1;
$ignore{'___default_room_functions'} = 1;
$ignore{'_sys_errlist'}              = 1;
$ignore{'_stdout'}                   = 1;
$ignore{'_stdin'}                    = 1;
$ignore{'_stderr'}		     = 1;
$ignore{'___stdio_head'}             = 1;


open(OBJDUMP, "$PRAM_BIN_DIR/objdump --header $OBJFILE|");

SECTION_NUMBERS: while(<OBJDUMP>)
{
	if(/\.gpbss/)
	{
	    ($sec_num{'.gpbss'}) = split;
	    next SECTION_NUMBERS;
	}
	if(/\.gpdata/)
	{
	    ($sec_num{'.gpdata'}) = split;
	    next SECTION_NUMBERS;
	}
	if(/\.gsbss/)
	{
	    ($sec_num{'.gsbss'}) = split;
	    next SECTION_NUMBERS;
	}
	if(/\.gsdata/)
	{
	    ($sec_num{'.gsdata'}) = split;
	    next SECTION_NUMBERS;
	}
    }
close(OBJDUMP);

foreach $key (keys sec_num)
{
    $sec_num{$key}++;
}

#foreach $key (keys sec_num)
#{
#    printf "hallo %10s %2d\n", $key, $sec_num{$key};
#}


open(OBJDUMP, "$PRAM_BIN_DIR/objdump --syms $OBJFILE|");
while($line = <OBJDUMP>)
{
    if($line =~ /^\[...\]\(sec\s*([0-9])+\).*\s+([^\s]+)$/)
    {
	$sec_num = $1;
	$symbol = $2;
#	print "'$sec_num' '$symbol'";
	if(!$ignore{$symbol} && $symbol =~ /^_([_a-zA-Z]\w*)$/)
	{
	    $symbol = $1;
#	    print " ***** '$sym'";
	    $sym_sec{$symbol}=$sec_num;
	}
#	print "\n";
    }
}
close(OBJDUMP);

open (OUTC, ">$C_FILE") || die "Can't open '$C_FILE' for writing\7\n";
open (OUTH, ">$H_FILE") || die "Can't open '$H_FILE' for writing\7\n";

print (OUTC "#include <stdio.h>\n"
	   ."#include \"$H_FILE\"\n"
           ."void print_symbols(unsigned long hash)\n{");

foreach $section(keys sec_num)
{
    print "******************** $section ********************\n";
    $sec_num = $sec_num{$section};

    foreach $symbol(keys sym_sec)
    {
	if($sym_sec{$symbol} == $sec_num)
	{
	    printf OUTC "\tprintf(\"%-8s: &%-30s = 0x%%08x (0x%%08lx hashed)\\n\", (unsigned)(&%s), ((unsigned)(&%s))*hash);\n",
		        $section, $symbol, $symbol, $symbol;
	    print OUTH "extern int $symbol;\n";
	}
    }
}

print OUTC "}\n";

close OUTC;
close OUTH;

exit 0;

sub usage()
{
    print STDERR "usage: $0 <object-file> <outfile-prefix>\7\n";
    exit 1;
}

