🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: gnu.bash.bug
Article #861

complex functions

#861
From: David Becker
Date: Tue, 23 Jan 1990 17:13
147 lines
3241 bytes
I have a script from a friend that gives cd a history in ksh.  I've
found it handier than CDPATH.  Anyways bash barfs.

In particular it doesn't take the typedef flags which isn't too big a
deal but it also won't swallow ((i=cdlen)).  The double parentheses cause a
syntax error.

Should in its present incarnation handle this stuff(ie there's a bug) or
is bash not up to these functions yet?   The texinfo on bash shell
scripts didn't say much.

The first syntax error occurs on line 38 at the ((
#
# CD History function originally by Shane McCaron
# external shell variables
#	CDHISTFILE - where you want the history kept
#

alias cd=_cd

function _cd
{
	typeset -i cdlen i
	typeset t

	if [ $# -eq 0 ]
	then
		set -- $HOME
	fi

	if [ "$CDHISTFILE" -a -r "$CDHISTFILE" ] # if directory history exists
	then
		typeset CDHIST
		i=-1
		while read -r t			# read directory history file
		do
			CDHIST[i=i+1]=$t
		done <$CDHISTFILE
	fi

	if [ "${CDHIST[0]}" != "$PWD" -a "$PWD" != "" ]
	then
		_cdins				# insert $PWD into cd history
	fi

	cdlen=${#CDHIST[*]}			# number of elements in history

	case "$@" in
	-)					# cd to new dir
		if [ "$OLDPWD" = "" ] && ((cdlen>1))  # SYNTAX HERE from BASH
		then
			print ${CDHIST[1]}
			'cd' ${CDHIST[1]}
		else
			'cd' $@
		fi
		;;
	-l)					# print directory list
		typeset -R3 num
		((i=cdlen))
		while (((i=i-1)>=0))
		do
			num=$i
			print "$num ${CDHIST[i]}"
		done
		return
		;;
	-[0-9]|-[0-9][0-9])			# cd to dir in list
		if (((i=${1#-})<cdlen))
		then
			print ${CDHIST[i]}
			'cd' ${CDHIST[i]}
		else
			'cd' $@
		fi
		;;
	-*)					# cd to matched dir in list
		t=${1#-}
		i=1
		while ((i<cdlen))
		do
			case ${CDHIST[i]} in
			*$t*)
				print ${CDHIST[i]}
				'cd' ${CDHIST[i]}
				break
				;;
			esac
			((i=i+1))
		done
		if ((i>=cdlen))
		then
			'cd' $@
		fi
		;;
	*)					# cd to new dir
		'cd' $@
		;;
	esac


	_cdins					# insert $PWD into cd history

	if [ "$CDHISTFILE" ]
	then
		cdlen=${#CDHIST[*]}		# number of elements in history

		i=0
		while ((i<cdlen))
		do
			print -r ${CDHIST[i]}	# update directory history
			((i=i+1))
		done >$CDHISTFILE
	fi
#	set_prompt
	return 0
}

function _cdins					# insert $PWD into cd history
{						# meant to be called only by _cd
	typeset -i i

	((i=0))
	while ((i<${#CDHIST[*]}))		# see if dir is already in list
	do
		if [ "${CDHIST[$i]}" = "$PWD" ]
		then
			break
		fi
		((i=i+1))
	done

	if ((i>22))				# limit max size of list
	then
		i=22
	fi

	while (((i=i-1)>=0))			# bump old dirs in list
	do
		CDHIST[i+1]=${CDHIST[i]}
	done

	CDHIST[0]=$PWD				# insert new directory in list
}


David Becker  beckerd@cs.unc.edu
Technical Details
Message-ID: <11606@thorin.cs.unc.edu>
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!usc!rutgers!mcnc!thorin!grover!beckerd

Show Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!usc!rutgers!mcnc!thorin!grover!beckerd
From: beckerd@grover.cs.unc.edu (David Becker)
Newsgroups: gnu.bash.bug
Subject: complex functions
Summary: can bash handle this?
Message-ID: <11606@thorin.cs.unc.edu>
Date: 23 Jan 90 17:13:30 GMT
Sender: news@thorin.cs.unc.edu
Reply-To: beckerd@grover.cs.unc.edu (David Becker)
Distribution: na
Organization: University Of North Carolina, Chapel Hill
Lines: 147