111 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| #
 | |
| # An almost ksh-compatible `autoload'.  A function declared as `autoload' will
 | |
| # be read in from a file the same name as the function found by searching the
 | |
| # $FPATH (which works the same as $PATH), then that definition will be run.
 | |
| #
 | |
| # To do this without source support, we define a dummy function that, when
 | |
| # executed, will load the file (thereby re-defining the function), then 
 | |
| # execute that newly-redefined function with the original arguments.
 | |
| #
 | |
| # It's not identical to ksh because ksh apparently does lazy evaluation
 | |
| # and looks for the file to load from only when the function is referenced.
 | |
| # This one requires that the file exist when the function is declared as
 | |
| # `autoload'.
 | |
| #
 | |
| # usage: autoload func [func...]
 | |
| #
 | |
| # The first cut of this was by Bill Trost, trost@reed.bitnet
 | |
| #
 | |
| # Chet Ramey
 | |
| # chet@ins.CWRU.Edu
 | |
| 
 | |
| #
 | |
| # Declare a function ($1) to be autoloaded from a file ($2) when it is first
 | |
| # called.  This defines a `temporary' function that will `.' the file 
 | |
| # containg the real function definition, then execute that new definition with
 | |
| # the arguments given to this `fake' function.  The autoload function defined
 | |
| # by the file and the file itself *must* be named identically.
 | |
| #
 | |
| 
 | |
| aload()
 | |
| {
 | |
| 	eval $1 '() {  . '$2' ; '$1' "$@" ; return $? ; }'
 | |
| }
 | |
| 
 | |
| #
 | |
| # Search $FPATH for a file the same name as the function given as $1, and
 | |
| # autoload the function from that file.  There is no default $FPATH.
 | |
| #
 | |
| 
 | |
| autoload()
 | |
| {
 | |
| 	#
 | |
| 	# Save the list of functions; we're going to blow away the arguments
 | |
| 	# in a second.  If any of the names contain white space, TFB.
 | |
| 	#
 | |
| 
 | |
| 	local args="$*"
 | |
| 
 | |
| 	#
 | |
| 	# This should, I think, list the functions marked as autoload and not
 | |
| 	# yet defined, but we don't have enough information to do that here.
 | |
| 	#
 | |
| 	if [ $# -eq 0 ] ; then
 | |
| 		echo "usage: autoload function [function...]" >&2
 | |
| 		return 1
 | |
| 	fi
 | |
| 
 | |
| 	#
 | |
| 	# If there is no $FPATH, there is no work to be done
 | |
| 	#
 | |
| 
 | |
| 	if [ -z "$FPATH" ] ; then
 | |
| 		echo autoload: FPATH not set or null >&2
 | |
| 		return 1
 | |
| 	fi
 | |
| 
 | |
| 	#
 | |
| 	# This treats FPATH exactly like PATH: a null field anywhere in the
 | |
| 	# FPATH is treated the same as the current directory.
 | |
| 	#
 | |
| 	# The path splitting command is taken from Kernighan and Pike
 | |
| 	#
 | |
| 
 | |
| #	fp=$(echo $FPATH | sed 's/^:/.:/
 | |
| #				s/::/:.:/g
 | |
| #				s/:$/:./
 | |
| #				s/:/ /g')
 | |
| 
 | |
| 	# replaced with builtin mechanisms 2001 Oct 10
 | |
| 
 | |
| 	fp=${FPATH/#:/.:}
 | |
| 	fp=${fp//::/:.:}
 | |
| 	fp=${fp/%:/:.}
 | |
| 	fp=${fp//:/ }
 | |
| 
 | |
| 	for FUNC in $args ; do
 | |
| 		#
 | |
| 		# We're blowing away the arguments to autoload here...
 | |
| 		# We have to; there are no arrays (well, there are, but
 | |
| 		# this doesn't use them yet).
 | |
| 		#
 | |
| 		set -- $fp
 | |
| 
 | |
| 		while [ $# -ne 0 ] ; do
 | |
| 			if [ -f $1/$FUNC ] ; then
 | |
| 				break			# found it! 
 | |
| 			fi
 | |
| 			shift
 | |
| 		done
 | |
| 
 | |
| 		if [ $# -eq 0 ] ; then
 | |
| 			echo "$FUNC: autoload function not found" >&2
 | |
| 			continue
 | |
| 		fi
 | |
| 
 | |
| #		echo auto-loading $FUNC from $1/$FUNC
 | |
| 		aload $FUNC $1/$FUNC
 | |
| 	done
 | |
| 
 | |
| 	return 0
 | |
| }
 | 
