#
# ksh-compat -- functions and aliases to provide the beginnings of a ksh 
#	        environment for bash.
#
# Chet Ramey
# chet@ins.CWRU.Edu
#
#
# These are definitions for the ksh compiled-in `exported aliases'.  There
# are others, but we already have substitutes for them: "history", "type",
# and "hash".
#
alias r="fc -e -"
alias functions="typeset -f"
alias integer="typeset -i"
alias nohup="nohup "
alias true=":"
alias false="let 0"

#
# An almost-ksh compatible `whence' command.  This is as hairy as it is 
# because of the desire to exactly mimic ksh (whose behavior was determined
# empirically).
# 
# This depends somewhat on knowing the format of the output of the bash
# `builtin type' command.
#

whence ()
{
  local vflag
  local path

  vflag=
  path=

  if [ "$#" = "0" ]; then
    echo "whence: argument expected"
    return 1
  fi

  case "$1" in
    -v) vflag=1
      shift 1
      ;;
    -*) echo "whence: bad option: $1"
      return 1
      ;;
    *) ;;
  esac

  if [ "$#" = "0" ]; then
    echo "whence: bad argument count"
    return 1
  fi

  for cmd; do
    if [ "$vflag" ]; then
      echo $(builtin type $cmd | sed 1q)
    else
      path=$(builtin type -path $cmd)

      if [ "$path" ]; then
        echo $path
      else
        case "$cmd" in
          /*) echo ""
            ;;
          *)
            case "$(builtin type -type $cmd)" in
              "") echo ""
                ;;
              *) echo "$cmd"
                ;;
            esac
          ;;
        esac
      fi
    fi
  done
  return 0
}

#
# For real ksh homeboy fanatics, redefine the `type' builtin with a ksh
# version.
#
#type()
#{
#	whence -v "$*"
#}

cd ()
{
  case $# in
    0) builtin cd "$HOME" ;;
    1) builtin cd "$@" ;;
    2) old="$1"
       new="$2"
       dir=$(echo "$PWD" | sed "s:$old:$new:g")

       case "$dir" in
         "$PWD") echo "bash: cd: bad substitution" >&2 ; return 1 ;;
         *)      echo "$dir"
                 builtin cd "$dir"
           ;;
       esac
      ;;
    *) echo "cd: wrong arg count" >&2 ; return 1 ;;
  esac
}

#
# ksh print emulation
#
#	print [-Rnprsu[n]] [arg ...]
#
#	-	end of options
#	-R	BSD-style -- only accept -n, no escapes
#	-n	do not add trailing newline
#	-p	no-op (no coprocesses)
#	-r	no escapes
#	-s	no-op (print to the history file)
#	-u n	redirect output to fd n
#

print()
{
  local eflag=-e
  local nflag=
  local fd=1

  OPTIND=1

  while getopts "Rnprsu:" c; do
    case $c in
      R|r) eflag= ;;
      n)   nflag=-n ;;
      u)   redir=">&$OPTARG"
           fd=$OPTARG
        ;;
      p|s) ;;
    esac
  done

  shift $[ $OPTIND - 1 ]
  echo $eflag $nflag "$@" >&$fd
}
