#! /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);
