Blame src/cmd/ksh93/fun/popd

Packit Service a8c26c
#
Packit Service a8c26c
# DIRECTORY MANIPULATION FUNCTIONS PUSHD, POPD AND DIRS
Packit Service a8c26c
#
Packit Service a8c26c
# Uses global parameters _push_max _push_top _push_stack
Packit Service a8c26c
integer _push_max=100 _push_top=100
Packit Service a8c26c
# Display directory stack -- $HOME displayed as ~
Packit Service a8c26c
function dirs
Packit Service a8c26c
{
Packit Service a8c26c
    typeset dir="${PWD#$HOME/}"
Packit Service a8c26c
    case $dir in
Packit Service a8c26c
    $HOME)
Packit Service a8c26c
        dir=\~
Packit Service a8c26c
        ;;
Packit Service a8c26c
    /*) ;;
Packit Service a8c26c
    *)  dir=\~/$dir
Packit Service a8c26c
    esac
Packit Service a8c26c
    print -r - "$dir ${_push_stack[@]}"
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
# Change directory and put directory on front of stack
Packit Service a8c26c
function pushd
Packit Service a8c26c
{
Packit Service a8c26c
    typeset dir= type=0
Packit Service a8c26c
    integer i
Packit Service a8c26c
    case $1 in
Packit Service a8c26c
    "") # pushd
Packit Service a8c26c
        if    ((_push_top >= _push_max))
Packit Service a8c26c
        then  print pushd: No other directory.
Packit Service a8c26c
              return 1
Packit Service a8c26c
        fi
Packit Service a8c26c
        type=1 dir=${_push_stack[_push_top]}
Packit Service a8c26c
        ;;
Packit Service a8c26c
    +[1-9]|+[1-9][0-9]) # pushd +n
Packit Service a8c26c
        integer i=_push_top$1-1
Packit Service a8c26c
        if    ((i >= _push_max))
Packit Service a8c26c
        then  print pushd: Directory stack not that deep.
Packit Service a8c26c
              return 1
Packit Service a8c26c
        fi
Packit Service a8c26c
        type=2 dir=${_push_stack[i]}
Packit Service a8c26c
        ;;
Packit Service a8c26c
    *)  if    ((_push_top <= 0))
Packit Service a8c26c
        then  print pushd: Directory stack overflow.
Packit Service a8c26c
              return 1
Packit Service a8c26c
        fi
Packit Service a8c26c
    esac
Packit Service a8c26c
    case $dir in
Packit Service a8c26c
    \~*)   dir=$HOME${dir#\~}
Packit Service a8c26c
    esac
Packit Service a8c26c
    cd "${dir:-$1}" > /dev/null || return 1
Packit Service a8c26c
    dir=${OLDPWD#$HOME/}
Packit Service a8c26c
    case $dir in
Packit Service a8c26c
    $HOME)
Packit Service a8c26c
        dir=\~
Packit Service a8c26c
        ;;
Packit Service a8c26c
    /*) ;;
Packit Service a8c26c
    *)  dir=\~/$dir
Packit Service a8c26c
    esac
Packit Service a8c26c
    case $type in
Packit Service a8c26c
    0)  # pushd name
Packit Service a8c26c
        _push_stack[_push_top=_push_top-1]=$dir
Packit Service a8c26c
        ;;
Packit Service a8c26c
    1)  # pushd
Packit Service a8c26c
        _push_stack[_push_top]=$dir
Packit Service a8c26c
        ;;
Packit Service a8c26c
    2)  # push +n
Packit Service a8c26c
        type=${1#+} i=_push_top-1
Packit Service a8c26c
        set -- "${_push_stack[@]}" "$dir" "${_push_stack[@]}"
Packit Service a8c26c
        shift $type
Packit Service a8c26c
        for dir
Packit Service a8c26c
        do  (((i=i+1) < _push_max)) || break
Packit Service a8c26c
            _push_stack[i]=$dir
Packit Service a8c26c
        done
Packit Service a8c26c
    esac
Packit Service a8c26c
    dirs
Packit Service a8c26c
}
Packit Service a8c26c
Packit Service a8c26c
# Pops the top directory
Packit Service a8c26c
function popd
Packit Service a8c26c
{
Packit Service a8c26c
    typeset dir
Packit Service a8c26c
    if    ((_push_top >= _push_max))
Packit Service a8c26c
    then  print popd: Nothing to pop.
Packit Service a8c26c
          return 1
Packit Service a8c26c
    fi
Packit Service a8c26c
    case $1 in  
Packit Service a8c26c
    "")
Packit Service a8c26c
        dir=${_push_stack[_push_top]}
Packit Service a8c26c
        case $dir in
Packit Service a8c26c
        \~*)   dir=$HOME${dir#\~}
Packit Service a8c26c
        esac
Packit Service a8c26c
        cd "$dir" || return 1
Packit Service a8c26c
        ;;
Packit Service a8c26c
    +[1-9]|+[1-9][0-9])
Packit Service a8c26c
        typeset savedir
Packit Service a8c26c
        integer i=_push_top$1-1
Packit Service a8c26c
        if    ((i >= _push_max))
Packit Service a8c26c
        then  print pushd: Directory stack not that deep.
Packit Service a8c26c
              return 1
Packit Service a8c26c
        fi
Packit Service a8c26c
        while ((i > _push_top))
Packit Service a8c26c
        do _push_stack[i]=${_push_stack[i-1]}
Packit Service a8c26c
              i=i-1
Packit Service a8c26c
        done
Packit Service a8c26c
        ;;
Packit Service a8c26c
    *)  print pushd: Bad directory.
Packit Service a8c26c
        return 1
Packit Service a8c26c
    esac
Packit Service a8c26c
    unset '_push_stack[_push_top]'
Packit Service a8c26c
    _push_top=_push_top+1
Packit Service a8c26c
    dirs
Packit Service a8c26c
}