#! /usr/bin/perl
#
#   TINET (TCP/IP Protocol Stack)
#  
#  Copyright (C) 2001-2003 by Embedded and Real-Time Systems Laboratory
#                              Toyohashi Univ. of Technology, JAPAN
#  Copyright (C) 2006-2008 by Embedded and Real-Time Systems Laboratory
#              Graduate School of Information Science, Nagoya Univ., JAPAN
#  Copyright (C) 2001-2007 by Dep. of Computer Science and Engineering
#                   Tomakomai National College of Technology, 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
#  (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: tinet_asp_configure,v 1.5 2009/12/24 06:42:46 abe Exp abe $
# 

require "getopt.pl";

#  IvV̒`
#
#  -T <target>		^[QbgiK{j
#  -A <applname>	AvP[VvO
#  -a <appldir>		AvP[ṼfBNg
#  -U <applobjs>	̃AvP[VvOt@C
#			i.ot@CŎwDwj
#  -L <kernel_lib>	J[lCuilibkernel.aj̃fBNg
#			iȗꍇCJ[lCumakej
#  -f			J[l֐PʂŃRpC邩ǂ̎w
#  -D <srcdir>		J[l̃\[X̒uĂfBNg
#  -l <srclang>		vO~Oi_łcc++̂݃T|[gj
#  -t <templatedir>	ev[gfBNgwiftHgtinet/asp_samplej
#  -d <dbgenv>		s̖
#  -r			g[XOL^̃TvR[hgp邩ǂ̎w
#  -p <perl>		perl̃pXiIɎw肷ꍇj
#  -g <cfg>		RtBM[^icfgj̃pX
#  -e <tinetdir>	TINET ̃\[X̒uĂfBNg
#  -i <net_if>		lbg[NC^tF[XiK{j
#			etherApppAloop ̉ꂩw肷B
#  -v <net_dev>		C[TlbgEfBoCXhCo
#  			ilbg[NC^tF[X ether w肵ꍇ͕K{j
#  -n <net_proto>	lbg[NwvgRiK{j
#			inet4Ainet6 ̉ꂩw肷B
#  -s <trans_proto>	gX|[gwvgRiK{j
#			tcpAudpAtcp/udp ̉ꂩw肷B

#  gp(1)
#
#  % ../tinet/tinet_asp_configure -T akih8_3069f_gcc -A echos4 -i ether -v if_ed -n inet4 -s tcp

#
#  IvV̏
#
do Getopt("TAaULDltdpgiensv");

#
#  ϐ̏
#

$target = $opt_T;
$applname = $opt_A ? $opt_A : "";
$appldir = $opt_a ? $opt_a : "";
$applobjs = $opt_U ? $opt_U : "";
$kernel_lib = $opt_L ? $opt_L : "";
$kernel_funcobjs = $opt_f ? "true" : "";
$srclang = $opt_l ? $opt_l : "c";
$templatedir = $opt_t ? $opt_t : "asp_sample";
$dbgenv = $opt_d ? "TOPPERS_".$opt_d : "";
$enable_trace = $opt_r ? "true" : "";
$net_if = $opt_i;
$net_dev = $opt_v;
$net_proto = $opt_n;
$trans_proto = $opt_s;

#
#  IuWFNgt@C̊gqԂ
#
sub get_objext {
	local(@uname);

	use POSIX;
	@uname = do uname();
	if ($uname[0] =~ /^cygwin/i) {
		return("exe");
	}
	else {
		return("");
	}
}

#
#  vȌꏊ
#
sub get_path {
	local($progname, @pathlist) = @_;
	local($path);

	foreach $path (@pathlist) {
		if (-x $path."/".$progname) {
			return($path."/".$progname);
		}
	}
	return("");
}

#
#  t@Cϊ
#
sub convert {
	local($infile, $outfile) = @_;
	local($line, $varname, $varval);

	print STDERR "tinet_asp_configure: Generating $outfile from $infile.\n";
	if (-f $outfile) {
		print STDERR "tinet_asp_configure: $outfile exists.",
						"  Save as $outfile.bak.\n";
		rename($outfile, $outfile.".bak");
	}
	unless (open(INFILE, $infile)) {
		print STDERR "tinet_asp_configure: can't open $infile\n";
		exit(1);
	}
	unless (open(OUTFILE, "> ".$outfile)) {
		print STDERR "tinet_asp_configure: can't open $outfile\n";
		exit(1);
	}

	while ($line = <INFILE>) {
		chop $line;
		while ($line =~ /^(.*)\@\(([A-Za-z0-9_]+)\)(.*)$/) {
			$line = $1.$vartable{$2}.$3;
		}
		print OUTFILE $line,"\n";
	}

	close(INFILE);
	close(OUTFILE);
}

#
#  Tvăt@C𐶐
#
sub generate {
	local($file, $mandatory) = @_;
	local($path);

	$path = $sampledir.$file.".".$applname;
	if (-f $path) {
		do convert($path, $file);
		return;
	}	

	$path = $sampledir.$file;
	if ($mandatory || -f $path) {
		do convert($path, $file);
	}	
}

#
#  TINET ̃\[XfBNgo
#
$pwd = `pwd`; chop $pwd;
if ($opt_e) {
	$tinetabsdir = $tinetdir = $opt_e;
}
elsif ($0 =~ /(.*)\/tinet_asp_configure/) {
	$tinetdir = $1;
	if ($tinetdir =~ /^\//) {
		$tinetabsdir = $tinetdir;
	}
	else {
		$tinetabsdir = $pwd."/".$tinetdir;
	}
}
else {
	$tinetabsdir = $tinetdir = $pwd;
}
$sampledir = $tinetdir."/".$templatedir."/";

#
#  \[XfBNgo
#
$pwd = `pwd`; chop $pwd;
if ($opt_D) {
	$srcabsdir = $srcdir = $opt_D;
}
elsif ($0 =~ /(.*)\/tinet\/tinet_asp_configure/) {
	$srcdir = $1;
	if ($srcdir =~ /^\//) {
		$srcabsdir = $srcdir;
	}
	else {
		$srcabsdir = $pwd."/".$srcdir;
	}
}
else {
	$srcabsdir = $srcdir = $pwd;
}

$perl = $opt_p ? $opt_p : do get_path("perl", ("/usr/local/bin", "/usr/bin"));
$cfg = $opt_g ? $opt_g : "\$(SRCDIR)/cfg/cfg/cfg";
$cfgfile = $opt_g ? $opt_g : $srcdir."/cfg/cfg/cfg";

#
#  IvV̊mF
#
unless ($opt_T) {
	print STDERR "tinet_asp_configure: -T option is mandatory\n";
	print STDERR "Installed targets are:\n";
	foreach $targetname (<$srcdir/target/[a-zA-Z1-9]*>) {
		$targetname =~ s|$srcdir/target/||;
		print STDERR "\t$targetname\n";
	}
	exit(1);
}
unless ($opt_i) {
	print STDERR "tinet_jsp_configure: -i option is mandatory\n";
	exit(1);
}
else {
	unless ($opt_v) {
		print STDERR "tinet_jsp_configure: -v option is mandatory\n";
		exit(1);
	}
}
if ($opt_n) {
	unless ($opt_n eq "inet4" || $opt_n eq "inet6") {
		print STDERR "tinet_jsp_configure: inet4 or inet6 expected in -n option\n";
		exit(1);
	}
}
else {
	print STDERR "tinet_jsp_configure: -n option is mandatory\n";
	exit(1);
}
if ($opt_s) {
	unless ($opt_s eq "tcp" || $opt_s eq "udp" || $opt_s eq "tcp/udp") {
		print STDERR "tinet_jsp_configure: tcp, udp or tcp/udp expected in -s option\n";
		exit(1);
	}
}
else {
	print STDERR "tinet_jsp_configure: -s option is mandatory\n";
	exit(1);
}

#
#  ϐe[u̍쐬
#
%vartable = ();
$vartable{"TARGET"} = $target;
$vartable{"APPLNAME"} = $applname;
$vartable{"APPLDIR"} = $appldir;
$vartable{"APPLOBJS"} = $applobjs;
$vartable{"KERNEL_LIB"} = $kernel_lib;
$vartable{"KERNEL_FUNCOBJS"} = $kernel_funcobjs;
$vartable{"SRCDIR"} = $srcdir;
$vartable{"SRCABSDIR"} = $srcabsdir;
$vartable{"SRCLANG"} = $srclang;
$vartable{"DBGENV"} = $dbgenv;
$vartable{"ENABLE_TRACE"} = $enable_trace;
$vartable{"PERL"} = $perl;
$vartable{"CFG"} = $cfg;
$objext = do get_objext();
$vartable{"OBJEXT"} = $objext;
$vartable{"TINETDIR"} = $tinetdir;
$vartable{"TINETABSDIR"} = $tinetabsdir;
$vartable{"NET_IF"} = $net_if;
$vartable{"NET_DEV"} = $net_dev;

#
#  -n IvV̏
#

$vartable{"SUPPORT_INET4"} = "#SUPPORT_INET4 = true";
$vartable{"SUPPORT_INET6"} = "#SUPPORT_INET6 = true";
if ($net_proto eq "inet4") {
	$vartable{"SUPPORT_INET4"} = "SUPPORT_INET4 = true";
}
if ($net_proto eq "inet6") {
	$vartable{"SUPPORT_INET6"} = "SUPPORT_INET6 = true";
}

#
#  -s IvV̏
#

$vartable{"SUPPORT_TCP"} = "#SUPPORT_TCP = true";
$vartable{"SUPPORT_UDP"} = "#SUPPORT_UDP = true";
if ($trans_proto eq "tcp" || $trans_proto eq "tcp/udp") {
	$vartable{"SUPPORT_TCP"} = "SUPPORT_TCP = true";
}
if ($trans_proto eq "udp" || $trans_proto eq "tcp/udp") {
	$vartable{"SUPPORT_UDP"} = "SUPPORT_UDP = true";
}

#
#  ^[QbgfBNg̃`FbN
#

if (! -d $srcdir."/target/".$target) {
	print STDERR "tinet_asp_configure: $srcdir/target/$target not exist\n";
	exit(1);
}

#
#  Makefile ƃAvP[Vt@C̐
#

do generate("Makefile", 1);
do generate($applname.".c", 0);
do generate($applname.".cpp", 0);
do generate($applname.".h", 0);
do generate($applname.".cfg", 0);
do generate("tinet_".$applname.".cfg", 0);
do generate("route_cfg.c", 0);
do generate("tinet_app_config.h", 0);

#
#  cfg łĂ邩̃`FbN
#

if (!(-x ($objext == "" ? $cfgfile : $cfgfile.".".$objext))) {
	print STDERR "Please compile the configurator (cfg).\n";
}
