pushd revision 1.10
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
84pushd () {
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
108popd () {
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
123dirs () {
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