#! /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
# 
#  L쌠҂́Cȉ(1)`(4)̏𖞂ꍇɌC{\tgEF
#  Ai{\tgEFAς̂܂ށDȉjgpEE
#  ρEĔzziȉCpƌĂԁj邱Ƃ𖳏ŋD
#  (1) {\tgEFA\[XR[ȟ`ŗpꍇɂ́CL̒
#      \C̗pщL̖ۏ؋K肪Ĉ܂܂̌`Ń\[
#      XR[hɊ܂܂Ă邱ƁD
#  (2) {\tgEFACCu`ȂǁC̃\tgEFAJɎg
#      pł`ōĔzzꍇɂ́CĔzzɔhLgip
#      ҃}jAȂǁjɁCL̒쌠\C̗pщL
#      ̖ۏ؋Kfڂ邱ƁD
#  (3) {\tgEFAC@ɑgݍނȂǁC̃\tgEFAJɎg
#      płȂ`ōĔzzꍇɂ́Ĉꂩ̏𖞂
#      ƁD
#    (a) ĔzzɔhLgip҃}jAȂǁjɁCL̒
#        쌠\C̗pщL̖ۏ؋Kfڂ邱ƁD
#    (b) Ĕzž`ԂCʂɒ߂@ɂāCTOPPERSvWFNg
#        񍐂邱ƁD
#  (4) {\tgEFA̗pɂ蒼ړI܂͊ԐړIɐ邢Ȃ鑹
#      QCL쌠҂TOPPERSvWFNgƐӂ邱ƁD
#      ܂C{\tgEFÃ[U܂̓Gh[ÛȂ闝
#      RɊÂCL쌠҂TOPPERSvWFNg
#      Ɛӂ邱ƁD
# 
#  {\tgEFÁCۏ؂Œ񋟂Ă̂łDL쌠҂
#  TOPPERSvWFNǵC{\tgEFAɊւāC̎gpړI
#  ɑ΂K܂߂āCȂۏ؂sȂD܂C{\tgEF
#  A̗pɂ蒼ړI܂͊ԐړIɐȂ鑹QɊւĂC
#  ̐ӔC𕉂ȂD
# 
#  @(#) $Id: genrename 509 2007-08-22 23:09:56Z hiro $
# 

#
#  擪ɂ镶
#
sub prefix_string {
	local($sym) = @_;

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

#
#  l[`𐶐
#
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";
}

#
#  l[𐶐
#
sub generate_undef
{
	local($sym, $prefix) = @_;

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

#
#  CN[hfBNeBu𐶐
#
sub generate_include
{
	local($file, $prefix) = @_;

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

#
#  G[`FbN
#
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";

#
#  V{Xgǂݍ
#
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);
