function _copy
# DOS copy
{
	trap 'set +f' 0
	typeset a d df f ifs mat mode plus=y root tgt=y x y
	typeset -i j n=0
	for a
		do case $a in
			/[VABvab])	;;
			*)		y="$y $a";;
			esac
		done
	set -- $y
	case $* in
		*+*)	case $# in
				1)	tgt=n;;
				*)	let j=$#-1
					eval "x=\$$j\ \$$#"
					case $x in  *+\ *|*\ *+*) tgt=n;; esac;;
				esac
			IFS="+$IFS" ifs="$IFS"
			set -- $*
			IFS="$ifs"
			set -- $*;;
		*)	case $# in
				0)	echo 'copy: no arguments' >&2; return;;
				[12])	plus=n;;
				esac;;
		esac
	case $# in 1) set -- $1 .;; esac
	for a
		do let n=$n+1
		test $n -le 2 && { test -d $a && df[$n]=d || df[$n]=f; }
		case $a in
			*/*)	d[$n]=${a%/*}/
				f=${a##*/};;
			*)	d[$n]=
				f=$a;;
			esac
		case $f in
			[*?]*)	mode[$n]=p
				x="$f."
				x=${x%%[!*?]*}
				case $x in \*) x=?;; esac
				root[$n]=${f#$x};;
			*[*?])	mode[$n]=s
				x=${f##*[!*?]}
				case $x in \*) x=?;; esac
				root[$n]=${f%$x};;
			*)	mode[$n]=x
				root[$n]=$f;;
			esac
		done
	case $plus in
		n)	case $1 in "$2") echo copy: 'input=output' >&2; return;; esac
			case ${df[1]}${mode[1]}:${df[2]}${mode[2]} in
				dx:dx)		_Ducmd "cp $1/* $2";;
				dx:fx)		_Ducmd "cat $1/* >$2";;
				fx:?x|f?:dx)	_Ducmd "cp $1 $2";;
				f?:fx)		_Ducmd "cat $1 >$2";;
				f?:f?)		plus=y;;
				*)		echo 'copy error' >&2; return;;
				esac;;
		esac
	case $plus in n) return;; esac
	case $tgt in
		y)	y= x=
			for a
				do y="$y $x"
				x=$a
				done
			set -- $y;;
		n)	let n=$n+1
			d[$n]=${d[1]}
			root[$n]=${root[1]}
			mode[$n]=${mode[1]};;
		esac
	tgt=${d[$n]}${root[$n]}
	case ${mode[1]} in
		x)	case $#${mode[2]} in
			 *x)	_Ducmd "cat $* >${d[$n]}DOStemp;" \
					"mv ${d[$n]}DOStemp $tgt";;
			 2?)	_Ducmd "cat $2 >${d}DOStemp;" \
					"mv ${d}DOStemp ${d[1]}${root[1]}";;
			 *)	echo 'copy error' >&2; return;;
			 esac;;
		*)	_Ducmd ">${d[$n]}DOStemp"
			for f in `set +f; ls $1`
				do mat=${f#${d[1]}}
				case ${mode[1]} in
					p)	mat=${mat%${root[1]}};;
					s)	mat=${mat#${root[1]}};;
					esac
				y=
				j=0
				while test $j -lt $n
					do let j=$j+1
					case ${mode[$j]} in
						p) x=${d[$j]}$mat${root[$j]};;
						s) x=${d[$j]}${root[$j]}$mat;;
						esac
					case $j in
						$n)	;;
						*)	y="$y $x";;
						esac
					done
				_Ducmd "cat -s $y >>${d[$n]}DOStemp"
				case ${mode[$n]} in
					[ps])	_Ducmd "mv ${d[$n]}DOStemp $x";;
					esac
				done
			case ${mode[$n]} in
				x)	_Ducmd "mv ${d[$n]}DOStemp $tgt";;
				esac;;
		esac
}

alias -x COPY='set -f; _copy'\
	copy='set -f; _copy'
typeset -xf _copy
