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