#! /usr/bin/perl
#
#  TOPPERS Software
#      Toyohashi Open Platform for Embedded Real-Time Systems
# 
#  Copyright (C) 2003 by Embedded and Real-Time Systems Laboratory
#                              Toyohashi Univ. of Technology, JAPAN
#  Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
#              Graduate School of Information Science, Nagoya Univ., JAPAN
# 
#  嵭Ԥϡʲ(1)(4)ξ˸¤ꡤܥեȥ
#  ܥեȥѤΤޤࡥʲƱˤѡʣ
#  ѡۡʰʲѤȸƤ֡ˤ뤳Ȥ̵ǵ롥
#  (1) ܥեȥ򥽡ɤηѤˤϡ嵭
#      ɽѾ浪Ӳ̵ݾڵ꤬Τޤޤηǥ
#      ˴ޤޤƤ뤳ȡ
#  (2) ܥեȥ򡤥饤֥ʤɡ¾Υեȥȯ˻
#      ѤǤǺۤˤϡۤȼɥȡ
#      ԥޥ˥奢ʤɡˤˡ嵭ɽѾ浪Ӳ
#      ̵ݾڵǺܤ뤳ȡ
#  (3) ܥեȥ򡤵Ȥ߹ʤɡ¾Υեȥȯ˻
#      ѤǤʤǺۤˤϡΤ줫ξ
#      ȡ
#    (a) ۤȼɥȡѼԥޥ˥奢ʤɡˤˡ嵭
#        ɽѾ浪Ӳ̵ݾڵǺܤ뤳ȡ
#    (b) ۤη֤̤ˡˤäơTOPPERSץȤ
#        𤹤뤳ȡ
#  (4) ܥեȥѤˤľŪޤϴŪ뤤ʤ»
#      ⡤嵭ԤTOPPERSץȤդ뤳ȡ
#      ޤܥեȥΥ桼ޤϥɥ桼Τʤ
#      ͳ˴Ťᤫ⡤嵭ԤTOPPERSץȤ
#      դ뤳ȡ
# 
#  ܥեȥϡ̵ݾڤ󶡤ƤΤǤ롥嵭Ԥ
#  TOPPERSץȤϡܥեȥ˴ؤơλŪ
#  ФŬޤơʤݾڤԤʤޤܥեȥ
#  ѤˤľŪޤϴŪʤ»˴ؤƤ⡤
#  Ǥʤ
# 
#  @(#) $Id: genrename 509 2007-08-22 23:09:56Z hiro $
# 

#
#  ƬˤĤʸ
#
sub prefix_string {
	local($sym) = @_;

	if ($sym =~ /[a-z]/) {
		return("_kernel_");
	}
	else {
		return("_KERNEL_");
	}
}

#
#  ͡
#
sub generate_define
{
	local($sym, $prefix) = @_;

	print FILE "#define ",$prefix,$sym;
	print FILE "\t" if (length($prefix.$sym) < 4);
	print FILE "\t" if (length($prefix.$sym) < 8);
	print FILE "\t" if (length($prefix.$sym) < 12);
	print FILE "\t" if (length($prefix.$sym) < 16);
	print FILE "\t" if (length($prefix.$sym) < 20);
	print FILE "\t" if (length($prefix.$sym) < 24);
	print FILE "\t",$prefix,do prefix_string($sym),$sym,"\n";
}

#
#  ͡
#
sub generate_undef
{
	local($sym, $prefix) = @_;

	print FILE "#undef ",$prefix,$sym,"\n";
}

#
#  󥯥롼ɥǥ쥯ƥ֤
#
sub generate_include
{
	local($file, $prefix) = @_;

	$file =~ s/([>"])$/_$prefix.h$1/;
	$includes .= "#include ".$file."\n";
}

#
#  顼å
#
if ($#ARGV != 0) {
	die "Usage: genrename <prefix>\n";
}

#
#  
#
@syms = ();
$name = $ARGV[0];
$NAME = $name; $NAME =~ y/a-z/A-Z/;

$infile = $name."_rename.def";
$header_defsym = "TOPPERS_".$NAME."_RENAME_H";

#
#  ܥꥹȤɤ߹
#
open(INFILE, $infile) || die "Cannot open $infile";
while ($line = <INFILE>) {
	chomp $line;
	@syms = (@syms, $line);
}
close(INFILE);

#
#  ???_rename.h 
#
$includes = "";
$file = $name."_rename.h";
open(FILE, "> ".$file);

print FILE <<END;
/* This file is generated from $infile by genrename. */

#ifndef $header_defsym
#define $header_defsym

END

foreach $sym (@syms) {
	if ($sym =~ /^#(.*)$/) {
		print FILE "/*\n";
		print FILE " * ",$1,"\n";
		print FILE " */\n";
	}
	elsif ($sym =~ /^INCLUDE[ \t]+(.*)$/) {
		do generate_include($1, "rename");
	}
	elsif ($sym ne "") {
		do generate_define($sym, "");
	}
	else {
		print FILE "\n";
	}
}

print FILE <<END;

#ifdef TOPPERS_LABEL_ASM

END

foreach $sym (@syms) {
	if ($sym =~ /^#(.*)$/) {
		print FILE "/*\n";
		print FILE " * ",$1,"\n";
		print FILE " */\n";
	}
	elsif ($sym =~ /^INCLUDE[ \t]+(.*)$/) {
		# do nothing
	}
	elsif ($sym ne "") {
		do generate_define($sym, "_");
	}
	else {
		print FILE "\n";
	}
}

print FILE <<END;

#endif /* TOPPERS_LABEL_ASM */

$includes
#endif /* $header_defsym */
END

#
#  ???_unrename.h 
#
$includes = "";
$file = $name."_unrename.h";
open(FILE, "> ".$file);

print FILE <<END;
/* This file is generated from $infile by genrename. */

/* This file is included only when $name\_rename.h has been included. */
#ifdef $header_defsym
#undef $header_defsym

END

foreach $sym (@syms) {
	if ($sym =~ /^#(.*)$/) {
		print FILE "/*\n";
		print FILE " * ",$1,"\n";
		print FILE " */\n";
	}
	elsif ($sym =~ /^INCLUDE[ \t]+(.*)$/) {
		do generate_include($1, "unrename");
	}
	elsif ($sym ne "") {
		do generate_undef($sym, "");
	}
	else {
		print FILE "\n";
	}
}

print FILE <<END;

#ifdef TOPPERS_LABEL_ASM

END

foreach $sym (@syms) {
	if ($sym =~ /^#(.*)$/) {
		print FILE "/*\n";
		print FILE " * ",$1,"\n";
		print FILE " */\n";
	}
	elsif ($sym =~ /^INCLUDE[ \t]+(.*)$/) {
		# do nothing
	}
	elsif ($sym ne "") {
		do generate_undef($sym, "_");
	}
	else {
		print FILE "\n";
	}
}

print FILE <<END;

#endif /* TOPPERS_LABEL_ASM */

$includes
#endif /* $header_defsym */
END

close(FILE);
