# Unix Like Tools installer on Windows
#
# Copyright (C) TOYODA Eizi, 1998, 1999.  All rights reserved.

	$TMPDIR = $ENV{"TMP"} || $ENV{"TEMP"}
		|| die "環境変数 TEMP が設定されていません\n";
	$TMPDIR =~ s/\\$//;
	$TMPDIR .= "\\uxtl";

	$SRCDIR = `COMMAND /C CHDIR`;
	chop $SRCDIR;
	@extpath = ($SRCDIR, "$SRCDIR\\..", "$SRCDIR\\..\\..");
	$TAR = &which("tar.exe", @extpath)
		|| die "tar がインストールされていません\n";
	($uxtlpack = &NewestFile($SRCDIR, 'uxtl.*\.tgz'))
		|| die "UnixLike tools パッケージが見当たりません\n";
	print "$uxtlpack をインストールします。\n";

	&setBINDIR;
	&setMANDIR;
	print "プログラム置き場: $BINDIR\n";
	print "ドキュメント置き場: $MANDIR\n";
	&okay;

	&mkdir($BINDIR);
	&mkdir($MANDIR);
	&mkdir($TMPDIR);
	&chdir($TMPDIR);

	&invoke("$TAR xvfz $uxtlpack");
	$uxtldir = &NewestFile(".", 'uxtl.*');
	&chdir($uxtldir);
	
	if (&which("df.exe") && &which("f90.exe")) {
		print <<EOF;
DF.EXE という名前は DEC Fortran が使っているので DFF.EXE に変更します
EOF
		&invoke("rename bin\\df.exe dff.exe");
		&invoke("rename man\\df.man dff.man");
	}
	print "word.com という名前は問題を起こすので fword.com に変更します\n";
	&invoke("rename bin\\scripts\\word.com fword.com");
	&invoke("rename man\\scripts\\word.man fword.man");

	&invoke("move bin\\scripts\\* $BINDIR");
	&invoke("rmdir bin\\scripts");
	&invoke("move bin\\* $BINDIR");
	# 後に fin をインストールするときに備え an.fma を入れておく
	&invoke("move src\\man\\an.fma $BINDIR\\an.fma");
	
	&invoke("move man\\scripts\\* $MANDIR");
	&invoke("rmdir man\\scripts");
	&invoke("move man\\* $MANDIR");

	&chdir($SRCDIR);
	&invoke("deltree $TMPDIR");

	&setup_env;
	print "インストールが終わりました\n";
	&okay;
exit 0;

sub setup_env {
	if (defined $ENV{'HOME'}
		&& &dir_in_path($BINDIR)
		&& &dir_in_path($MANDIR, 'MANPATH')) {
		print "必要な環境変数はすべて設定されています\n";
		return;
	}
	$AUTOEXEC = "C:\\AUTOEXEC.BAT";
	print "$AUTOEXEC に環境変数設定を追加します\n";
	&okay;
	open(AUTOEXEC, ">>$AUTOEXEC")
		|| die "cannot open $AUTOEXEC for append\n";
	print AUTOEXEC "REM begin unix like tools (toyoda installer)\n";
	print AUTOEXEC "SET HOME=", &parent_dir($BINDIR), "\n"
		unless defined $ENV{'HOME'};
	unless (&dir_in_path($MANDIR, 'MANPATH')) {
		if (defined $ENV{'MANPATH'}) {
			print AUTOEXEC "SET MANPATH=$MANDIR;\%MANPATH\%\n";
		} else {
			print AUTOEXEC "SET MANPATH=$MANDIR\n";
		}
	}
	unless (&dir_in_path($BINDIR)) {
		print AUTOEXEC "PATH=$BINDIR;\%PATH\%\n";
	}
	print AUTOEXEC "REM end unix like tools (toyoda installer)\n";
	close(AUTOEXEC);
	print "$AUTOEXEC の書き換えは再起動後に有効になります\n";
}

sub setMANDIR {
	if (defined $ENV{'HOME'}) {
		$MANDIR = $ENV{'HOME'} ."\\MAN";
	} else {
		$MANDIR = "C:\\HOME\\MAN";
	}
	$MANDIR = &ask("マニュアルのインストール先", $MANDIR);
}

sub setBINDIR {
	if (defined $ENV{'HOME'}) {
		$BINDIR = $ENV{'HOME'} ."\\BIN";
	} else {
		$BINDIR = "C:\\HOME\\BIN";
	}
	$BINDIR = &ask("プログラムのインストール先", $BINDIR);
}

sub dir_in_path {
	local($dir, $pathvar) = @_;
	$pathvar = $pathvar || "PATH";
	$dir = uc($dir);
	return undef unless -d $dir;
	local(@path) = split(/;/, $ENV{$pathvar});
	local($path);
	foreach $path (@path) {
		return $dir if ($dir eq uc($path));
	}
	undef;
}

sub ask {
	local($title, $def) = @_;
	print "$title [$def]\n";
	local($in) = scalar <STDIN>;
	chop $in;
	$def = $in if $in;
	$def;
}

sub cleandir {
	&invoke("erase *.*");
}

sub invoke {
	local($cmd) = @_;
	print "> ", $cmd, "\n";
	&okay;
	system $cmd;
}

sub mkdir {
	local($dir) = @_;
	return if -d $dir;
	local($parent) = &parent_dir($dir);
	&mkdir($parent) unless -d $parent;
	print "! mkdir $dir\n";
	mkdir($dir, 0777) || die "mkdir";
}

sub parent_dir {
	local($dir) = @_;
	$dir =~ s/[\/\\][^\/\\]+$//;
	$dir;
}

sub rmdir {
	local($dir) = @_;
	rmdir $dir;
}

sub chdir {
	local($dir) = @_;
	print "cd $dir\n";
	chdir($dir) || die "chdir $dir failed\n";
}

sub which {
	local($command, @extpath) = @_;
	local(@path) = split(/;/, $ENV{'PATH'});
	local($dir, $fullpath);
	foreach $dir (@path, @extpath) {
		$fullpath = "$dir\\$command";
		return $fullpath if -x $fullpath;
	}
	undef;
}

sub NewestFile {
	local($dir, $pattern) = @_;
	opendir DIR, $dir;
	local(@list) = grep(/$pattern/i, readdir(DIR));
	closedir DIR;
	return undef unless @list;
	sort @list;
	$dir . '\\' . $list[$#list];
}

sub okay {
	print "pause -- hit Ctrl-C or Break to STOP\n";
	scalar <STDIN>;
}

