#!/bin/bash

# Default extraction target CWD
exdir="."


_unzip() {
	unzip "$1" -d "$exdir"
}


while [ -n "$1" ]; do
case "$1" in

"-h")
	echo "Usage:  unpack [-D dir] [files]
   -D dir   Set output directory
   files    Files to extract/decompress"
	exit 0
	;;
"-D")
	shift
	# ignore checks
	# [ -d "$1" -a -w "$1" ] && exdir="$1"
	# `readlink' important when $exdir compared with `pwd'
	exdir="`readlink -f \"$1\"`"
	;;
-*)
	# switches
	;;
*)
	break
	;;
esac
shift
done

while [ -n "$1" ]; do

bfn="${1##*/}"		# base file name
fn="${bfn%.*}"		# without extension
exfn="${exdir}/${fn}"	# base file in output dir
lcbfn=`echo "${1##*/}" | tr "[:upper:]" "[:lower:]"`;	# lower case base file name
apn=`readlink -f "$1"`	# absolute path name


case "$lcbfn" in
*.tar)
	tar -C "$exdir" -xvf "$1";;
*.tgz|*.tar.gz|*.dsl)
	tar -C "$exdir" -xvzf "$1";;
*.tbz2|*.tar.bz2|*.tbz)
	tar -C "$exdir" -xvjf "$1";;
*.tar.z|*.taz)
	tar -C "$exdir" -xvZf "$1";;
*.z)
	if [ "`pwd`" = "$exdir" ]; then
		uncompress "$1"
	else
		uncompress -c "$1" > "${exfn}"
	fi;;
*.gz)
	if [ "`pwd`" = "$exdir" ]; then
		gunzip -dv "$1"
	else
		gunzip -dcv "$1" > "${exfn}"
	fi;;
*.bz2)
	if [ "`pwd`" = "$exdir" ]; then
		bunzip2 -dv "$1"
	else
		bunzip2 -dcv "$1" > "${exfn}"
	fi;;
*.arj)
	arj e "$1" "$exdir";;
*.lzh|*.lha)
	lha -xvw="$exdir" "$1";;
*.rar)
	unrar x "$1" "$exdir";;
*.zip|*.wsz|*.xpi)
	_unzip "$1";;
*.odt|*.ods)
	_unzip "$1";;
*.docx|*.pptx|*.xlsx)
	_unzip "$1";;
*.jar)
	if [ -x "`which jar`" ]; then
		jar -xvf "$1"
	else
		_unzip "$1"
	fi;;
*.zoo)
	if cd "$exdir"; then
		zoo x "$apn"
		cd -
	fi;;
*.deb)
	dpkg -X "$1" "$exdir";;
*.rpm)
	if cd "$exdir"; then
		rpm2cpio "$apn" | cpio -vid
		cd -
	fi;;
*.7z)
	7zr x -o"$exdir" "$1";;
*.cab|*.msi)
	cabextract -d "$exdir" "$1";;
*.ace)
	if cd "$exdir"; then
		unace e "$apn"
		cd -
	fi;;
*.ha)
	if cd "$exdir"; then
		ha xa "$apn"
		cd -
	fi;;
*.alz)
	unalz -d "$exdir" "$1";;
*.arc|*.ark)
	if cd "$exdir"; then
		nomarch "$apn"
		cd -
	fi;;
#*.uha
#	dosemu uharcd.exe x -t"$exdir" "$1";;
#*.dar
#	true;;
*.a|*.ar)
	ar xo "$1";;
*.iso)
	exdir="$exdir" unpack-iso "$1";;
thumbs.db|ehthumbs.db|thumbcache_*.db)
	vinetto -o "$exdir" "$1";;
*)
	mime="`file -i "$1"`"
	case "$mime" in
	"application/x-zip")
		_unzip "$1";;
	*)
		echo "unpack: Unknown compression type." >&2
		file -k "$1" >&2;;
	esac;;
esac
shift

done

exit $?