Home | History | Annotate | Line # | Download | only in funcs
      1 #	$NetBSD: pushd,v 1.10 2025/04/09 13:44:12 kre Exp $
      2 # Copyright (c) 1991, 1993
      3 #	The Regents of the University of California.  All rights reserved.
      4 #
      5 # This code is derived from software contributed to Berkeley by
      6 # Kenneth Almquist.
      7 #
      8 # Redistribution and use in source and binary forms, with or without
      9 # modification, are permitted provided that the following conditions
     10 # are met:
     11 # 1. Redistributions of source code must retain the above copyright
     12 #    notice, this list of conditions and the following disclaimer.
     13 # 2. Redistributions in binary form must reproduce the above copyright
     14 #    notice, this list of conditions and the following disclaimer in the
     15 #    documentation and/or other materials provided with the distribution.
     16 #
     17 # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     18 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     19 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     20 # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     21 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     22 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     23 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     24 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     25 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     26 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     27 # SUCH DAMAGE.
     28 #
     29 #	@(#)pushd	8.2 (Berkeley) 5/4/95
     30 
     31 # pushd, popd, and dirs --- written by Chris Bertin
     32 # Pixel Computer Inc. ...!wjh12!pixel!pixutl!chris
     33 # as modified by Patrick Elam of GTRI and Kenneth Almquist at UW
     34 
     35 # produce decidely sub-optimal quoting, but adequate for the purpose
     36 __ds_quote()
     37 {
     38 	local A QA PP
     39 
     40 	case "$1" in
     41 	-z)	DSTACK=;&		# zero, then...
     42 	-a)	PP=false;;		# append (retain arg order)
     43 
     44 	-r)	DSTACK=;&		# zero, then...
     45 	-p)	PP=true;;		# prepend (reverse arg order)
     46 
     47 	*)	printf '__ds_quote usage error\n' >&2; return 1;;
     48 	esac
     49 	shift
     50 
     51 	for A
     52 	do
     53 		QA=
     54 		while case "${A}" in
     55 		\'?*)
     56 			QA="${QA}'\\''"
     57 			A=${A#?}
     58 			;;
     59 		?*\'?*)
     60 			QA="${QA}${A%%\'*}"
     61 			A=\'${A#*\'}
     62 			;;
     63 		*\')
     64 			QA="${QA}'\\"
     65 			A=
     66 			;&
     67 		*)
     68 			false
     69 			;;
     70 		esac do
     71 			continue
     72 		done
     73 
     74 		if "${PP}"
     75 		then
     76 			DSTACK="'${QA}${A}'${DSTACK:+ }${DSTACK}"
     77 		else
     78 			DSTACK="${DSTACK}${DSTACK:+ }'${QA}${A}'"
     79 		fi
     80 	done
     81 	return 0
     82 }
     83 
     84 pushd () {
     85 	local IFS=' ' SAVE
     86 
     87 	SAVE=${PWD}
     88 	if [ "$#" = 0 ]
     89 	then
     90 		if [ "${#DSTACK}" = 0 ]
     91 		then
     92 			printf 'pushd: directory stack empty.\n' >&2
     93 			return 1
     94 		fi
     95 		eval set -- ${DSTACK}
     96 		cd -P ${1:+"$1"} || return
     97 		shift
     98 		__ds_quote -z "$@" || return
     99 	else
    100 		cd -P ${1:+"$1"} > /dev/null || return
    101 	fi
    102 
    103 	__ds_quote -p "${SAVE}" || return
    104 
    105 	dirs
    106 }
    107 
    108 popd () {
    109 	local IFS=' '
    110 
    111 	if [ "${#DSTACK}" = 0 ]
    112 	then
    113 		printf 'popd: directory stack empty.\n' >&2
    114 		return 1
    115 	fi
    116 	eval set -- ${DSTACK}
    117 	cd -P ${1:+"$1"}
    118 	shift
    119 	__ds_quote -z "$@" || return
    120 	dirs
    121 }
    122 
    123 dirs () {
    124 	local IFS=' '
    125 
    126 	printf %s "${PWD}"
    127 	eval set -- ${DSTACK}
    128 	test "$#" != 0 && printf " %s" "$@"
    129 	printf \\n
    130 	return 0
    131 }
    132