# LHA/TAR/UNZIP installer on Windows
#
# Copyright (C) TOYODA Eizi, 1998, 1999.  All rights reserved.

	$TMPDIR = $ENV{"TMP"} || $ENV{"TEMP"}
		|| die "%TEMP% not set\n";
	$TMPDIR =~ s/\\$//;
	$TMPDIR .= "\\lha";

	$SRCDIR = `COMMAND /C CHDIR`;
	chop $SRCDIR;
	($lhapack = &NewestFile($SRCDIR, 'lha.*\.exe'))
		|| die "lha package not found\n";
	($unzpack = &NewestFile($SRCDIR, 'unz.*\.exe'))
		|| die "unzip package not found\n";
	($tarpack = &NewestFile($SRCDIR, 'tarnt.*\.lzh'))
		|| die "tar package not found\n";
	($gzippack = &NewestFile($SRCDIR, 'gz.*\.lzh'))
		|| die "gzip package not found\n";
	
	&setBINDIR;

	&mkdir($BINDIR);
	&mkdir($MANDIR) if $MANDIR;
	&mkdir($TMPDIR);
	&chdir($TMPDIR);

	&cleandir;
	&invoke($lhapack);
	&invoke("copy lha.exe $BINDIR");
	&invoke("copy lha.doc $MANDIR") if $MANDIR;

	&cleandir;
	&invoke($unzpack);
	&invoke("copy unzip.exe $BINDIR");
	&invoke("copy unzip.doc $MANDIR") if $MANDIR;

	&cleandir;
	&invoke("$BINDIR\\lha e $tarpack");
	&invoke("copy tar32.exe $BINDIR\\tar.exe");
	&invoke("copy tarnt.txt $MANDIR\\tar.doc") if $MANDIR;

	&cleandir;
	&invoke("$BINDIR\\lha e $gzippack");
	&invoke("copy gzip.exe $BINDIR");
	&invoke("copy gzip_doc.jpn $MANDIR\\gzip.doc") if $MANDIR;

	&chdir($SRCDIR);
	&invoke("deltree $TMPDIR");

	&setup_env if $newHOME;
	print "インストールが終わりました\n";
	&okay;
exit 0;

sub setup_env {
	$AUTOEXEC = "C:\\AUTOEXEC.BAT";
	print "$AUTOEXEC に環境変数設定を追加します\n";
	&okay;
	open(AUTOEXEC, ">>$AUTOEXEC")
		|| die "cannot open $AUTOEXEC for append\n";
	print AUTOEXEC "REM begin lha/unzip 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 lha/unzip tools (toyoda installer)\n";
	close(AUTOEXEC);
	print "$AUTOEXEC の書き換えは再起動後に有効になります\n";
}

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 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 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>;
}

sub setBINDIR {
	$newHOME = 0;
	$HOME = $ENV{'HOME'};
	unless ($HOME) {
		print <<EOF;
これから Unix Like tools などのコマンドラインツールをインストール
する場合、環境変数 HOME を設定して %HOME%\\BIN ディレクトリに
コマンドを、%HOME%\\MAN ディレクトリにマニュアルをインストール
することをお勧めします。
この場合インストール後に C:\\AUTOEXEC.BAT へ環境変数の定義を
書き込みますので Windows を再起動してください。

このような設定を行いたくない場合は nul と入力してください。
プログラムは c:\\windows\\command にインストールされます。
EOF
		$HOME = &ask("環境変数 HOME", "C:\\HOME");
		if ($HOME eq "nul") {
			$HOME = undef;
		} else {
			$newHOME = 1 if $HOME;
		}
	}

	if (&dir_in_path("$HOME\\bin") || $newHOME) {
		$BINDIR = "$HOME\\bin";
	} else {
		$BINDIR = "C:\\WINDOWS\\COMMAND";
	}

	if (&dir_in_path("$HOME\\man", "MANPATH") || $newHOME) {
		$MANDIR = "$HOME\\man";
	} else {
		$MANDIR = undef;
	}

	print "プログラムを $BINDIR にインストールします\n";
	print "マニュアルを $MANDIR にインストールします\n" if $MANDIR;
}

sub ask {
	local($title, $def) = @_;
	print "$title [$def]\n";
	local($in) = scalar <STDIN>;
	chop $in;
	$def = $in if $in;
	$def;
}
