#!/bin/sh

prog=`basename $0`

echo "$prog Version 1.0 Programmed in 1993 by Marko M\"akel\"a"

[ $SFX_ML. = . ] && SFX_ML=$HOME/bin/sfx.ml

if [ ! -f $SFX_ML ]
then
	echo $prog: Fatal: SFX header not available!
	exit 1
fi

if [ $# -eq 0 ]
then
	cat <<- END_OF_USAGE

		Usage:	$prog archive1 [archive2 [...]]

		Converts .ARK, .LNX, .ARC and .SDA archives to .SFX or .LZH.
	END_OF_USAGE
	exit 1
fi

rm -fr $HOME/tmp && mkdir $HOME/tmp && mkdir $HOME/tmp/files ||
{
	echo $prog: Unable to create work directory.
	exit 2
}

while [ $# -gt 0 ]
do
	dir=`dirname $1`
	base=`basename $1`
	ext=`expr $base : ".*\.\(.*\)"`
	base=`expr $base : "\(.*\)\..*" \| $base`

	case $ext in
	lnx | LNX)
		unlynx $1 $HOME/tmp/files/ > $HOME/tmp/$base.list &&
		lha cgo $HOME/tmp/$base.lzh $HOME/tmp/files/* > /dev/null &&
		lzhconvert $HOME/tmp/$base.lzh $HOME/tmp/$base.lhx \
		< $HOME/tmp/$base.list ||
		{
			echo $prog: $1: Error, aborting.
			exit 3
		}
		;;
	ark | ARK)
		unark $1 $HOME/tmp/files/ > $HOME/tmp/$base.list &&
		lha cgo $HOME/tmp/$base.lzh $HOME/tmp/files/* > /dev/null &&
		lzhconvert $HOME/tmp/$base.lzh $HOME/tmp/$base.lhx \
		< $HOME/tmp/$base.list ||
		{
			echo $prog: $1: Error, aborting.
			exit 3
		}
		;;
	arc | ARC | sda | SDA)
		unarc $1 $HOME/tmp/files/ > $HOME/tmp/$base.list &&
		lha cgo $HOME/tmp/$base.lzh $HOME/tmp/files/* > /dev/null &&
		lzhconvert $HOME/tmp/$base.lzh $HOME/tmp/$base.lhx \
		< $HOME/tmp/$base.list ||
		{
			echo $prog: $1: Error, aborting.
			exit 3
		}
		;;
	*)
		echo $prog: $1: Cannot determine archive type by filename.
		exit 3
		;;
	esac


	first=`grep -v \^\; $HOME/tmp/$base.list | head -1 | cut -f2`

	if [ "$first." = . ]; then
		echo $prog: No files in the archive $1.
		exit 3
	fi

	if [ $ext = "sda" -o $ext = "SDA" ] && [ "$first" != \"title\\0S\" ]
	then
		cat <<- END_OF_QUESTION
$prog: Some SDA headers extract the first file of the archive on screen.
$prog: The SFX header shows them only if they are named "title".
$prog: Archive $1's first filename is $first.
$prog: Rename it to "title" (Y/N)?
		END_OF_QUESTION

		read i || i=" "

		if [ $i. != . ] && [ $i = "y" -o $i = "Y" ]
		then
			echo $prog: Renaming $first to \"title\\0S\".

			echo $first \"title\\0S\" | lzhconvert 2> /dev/null \
			$HOME/tmp/$base.lhx $HOME/tmp/$base.lzh &&
			mv -f $HOME/tmp/$base.lzh $HOME/tmp/$base.lhx ||
			{
				echo $prog: Failed in renaming the file.
				exit 4
			}
		else
			echo $prog: Not renaming first file of $1.
		fi
	fi

	if [ `wc -c $HOME/tmp/$base.lhx | cut -f1 -d/` -gt 47478 ]
	then
		echo $prog: $1 results in too large an SFX, creating an LZH.
		mv $HOME/tmp/$base.lhx $dir/$base.lzh ||
		{
			echo $prog: Fatal: Could not create $dir/$base.lzh.
			exit 4
		}
	elif grep \\\\0R $HOME/tmp/$base.list > /dev/null
	then
		echo $prog: $1 contains relative files, creating an LZH.
		mv $HOME/tmp/$base.lhx $dir/$base.lzh ||
		{
			echo $prog: Fatal: Could not create $dir/$base.lzh.
			exit 4
		}
	else
		cat $HOME/bin/sfx.ml $HOME/tmp/$base.lhx > $dir/$base.sfx ||
		{
			echo $prog: Fatal: Could not create $dir/$base.sfx.
			exit 4
		}
	fi

	rm -f $HOME/tmp/files/* $HOME/tmp/* 2> /dev/null
	shift
done

rm -fr $HOME/tmp
echo $prog: All done.
exit 0
