dirs revision 1.10 1 # $NetBSD: dirs,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 # @(#)dirs 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