#!/bin/sh
#
# uz [file...]
# lz [file...]
#
# 1994/02/19	DCN	Created (as a trivial, but useful script)
# 1994/12/01	DCN	Combined uz and lz, added suffix handling
# 1999/04/17	hjb	Replaced tar by cpio which can also handle tar format
#			Added support for bzip2, lzo, rpm, and zip
# 1999/04/18	hjb	Added support for many more formats
# 1999/04/19	hjb	Version 0.1 released
# 1999/04/25	hjb	Added support for spm
# 1999/05/04	hjb	Added support for jar
# 1999/08/03	hjb	Added support for nif
# 1999/09/22	hjb	Added support for AIX backup files (bff)
# 2000/03/17	hjb	Added support for lrp
# 2001/03/16	hjb	Added support for wsz and ice
# 2001/11/17	hjb	Added support for tbz2
# 2003/04/03	hjb	Added support for ace
# 2004/03/01	hjb	Added support for dump/restore
# 2004/09/30	hjb	Added support for 7z
# 2005/04/03	hjb	Added support for tbz (= tar.bz2)
# 2007/04/08	hjb	Added support for odt (= zip)
# 2014/10/24	hjb	Added support for xz
#
# Copyright (C) 1994 David C. Niemi (niemidc@erols.com)
# The author requires that any copies or derived works include this
# copyright notice; no other restrictions are placed on its use.
#
# Changes by Hans-Joachim Baader (baader@gmx.net)
# See http://hjbaader.de/download/lz_e.html for more info.
#

set -u

PATH=$PATH:/sbin

case "$0" in
*uz)
	param="xvpS"
	zipparam="-a"
	zooparam="-e"
	arcparam="ei"
	arjparam="x"
	aceparam="x"
	rarparam="x"
	lhaparam="x"
	arparam="xv"
	haparam="x"
	p7zparam="x"
	sitparam="-v"
	restoreparam="-rqf"
	action="Extracting from"
	;;
*lz)
	param="t"
	zipparam="-l"
	zooparam="-l"
	arcparam="l"
	arjparam="l"
	aceparam="v"
	rarparam="l"
	lhaparam="l"
	arparam="t"
	haparam="l"
	p7zparam="l"
	sitparam="-l"
	restoreparam="-Tqf"
	action="Reading directory of"
	;;
*)
	echo "$0: expect to be named either \"uz\" or \"lz\"." >&2
	exit 1
	;;
esac

CPIO="tar"		# Alternatives: afio, pax
REALCPIO="cpio"		# Don't use tar for this

if [ $# = 0 ]; then
	echo "$action standard input." >&2
	gzip -cd - | "${CPIO}" $param
	exit 0
fi

while [ $# -ge 1 ]; do
	echo >&2
	name="$1"

	# If filename starts with -, add "./"
	case "$name" in
	-*)
		name="./$name"
		;;
	esac

	(file "$name" | grep " dump file ") > /dev/null
	if [ $? = 0 ]
	then
		restore -tf "$name"
		shift
		continue
	fi

	echo "$action \"$name\"." >&2
	lowername=$(echo $name | tr [:upper:] [:lower:])

	case "$lowername" in
	*.gz|*.z|*.t[gpa]z|*.nif|*.lrp)
		gzip -cd -- "$name" | "${CPIO}" $param
		;;
	*.bz2|*.ice|*.tbz2|*.tbz|*.TBZ)
		bzip2 -cd "$name" | "${CPIO}" $param
		;;
	*.lzo)
		lzop -cd "$name" | "${CPIO}" $param
		;;
	*.xz)
		xzcat -cd "$name" | "${CPIO}" $param
		;;
	*.bz)
		bzip -cd "$name" | "${CPIO}" $param
		;;
	*.f)
		freeze -cd "$name" | "${CPIO}" $param
		;;
	*.sq)
		unsqueeze < "$name" | "${CPIO}" $param
		;;
	*.[rs]pm)
		rpm2cpio "$name" | "${REALCPIO}" $param
		;;
	*.deb)
		ar p "$name" data.tar.gz | gzip -d | "${CPIO}" $param
		;;
	*.zip|*.jar|*.wsz|*.odt)
		unzip $zipparam "$name"
		;;
	*.lha|*.lzh)
		lha $lhaparam "$name"
		;;
	*.zoo)
		zoo $zooparam "$name"
		;;
	*.arc)
		arc $arcparam "$name"
		;;
	*.arj)
		unarj $arjparam "$name"
		;;
	*.ace)
		unace $aceparam "$name"
		;;
	*.rar)
		unrar $rarparam "$name"
		;;
	*.7z)
		7za $p7zparam "$name"
		;;
	*.ha)
		ha $haparam "$name"
		;;
	*.a)
		ar $arparam "$name"
		;;
	*.sit)
		unsit $sitparam "$name"
		;;
	*.bff)
		restore $restoreparam "$name"
		;;
	*)
		# Last resort: try uncompressed archive.
		"${CPIO}" $param < "$1"
		;;
	esac

	shift
done

exit 0
