#!/usr/bin/perl
###############################################################################
#
#  機能 :
#         セグメントマップを生成
#  書式 :
#         MkSegmentMap.pl <makeromからの標準出力結果のファイル>
#
#   $Id: MkSegmentMap.pl,v 1.4 2000-05-25 11:54:20+09 otsuki Exp $
#
###############################################################################
{
    $total_head = ">>> Total "; 
    $key_sym1 = "SegmentRomStart";
    $key_sym2 = "SegmentRomEnd";

    # セグメント情報ファイルの名前を取得する #
    open(MAKEROM_STDOUT_F, $ARGV[0])
	|| die "ファイル $ARGV[$0] をオープンできない!!\n";
    while($_ = <MAKEROM_STDOUT_F>) {
	if ($_ =~ /Creating segment symbol source file in /) {
	    s/Creating segment symbol source file in //;
	    chop;
	    $segmentInf_file = $_;
	    print $segmentInf_file;
	}
    }
    close(MAKEROM_STDOUT_F);

    # セグメント情報ファイルからセグメントマップ情報を出力する #
    open(SEGMENT_INF_F, $segmentInf_file)
	|| die "ファイル $segmentInf_file をオープンできない!!\n";

    $total_size = 0;

    while($_ = <SEGMENT_INF_F>) {
	if ($_ =~ /$key_sym1/) {
	    s/(\.globl )//;
	    s/_[a-z_A-Z0-9]*$key_sym1; //;
	    s/$key_sym1//;
	    s/ = / : /;
	    chop;
	    print $_;

	    s/[0-9a-zA-Z_: ]*0x//;
	    $start_addr = hex($_);
	}
	else {
	    if ($_ =~ /$key_sym2/) {
		s/(\.globl )//;
		s/_[a-z_A-Z0-9]*$key_sym2; //;
		s/_[a-z_A-Z0-9]*$key_sym2//;
		s/ = / 〜 /;
		chop;
		print $_;

		s/ 〜 //;
		$size = hex($_) - $start_addr;
		print " = ".$size." byte\n";

		$total_size += $size;
	    }
	}
    }
    close(SEGMENT_INF_F);

    print "\n $total_head $total_size byte \n";
}
