# $NetBSD: logic,v 1.14 2006/12/15 13:15:07 martti Exp $
#
# Copyright (c) 2004 The NetBSD Foundation, Inc.
# All rights reserved.
#
# This code is derived from software contributed to The NetBSD Foundation
# by Johnny C. Lam.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. All advertising materials mentioning features or use of this software
#    must display the following acknowledgement:
#        This product includes software developed by the NetBSD
#        Foundation, Inc. and its contributors.
# 4. Neither the name of The NetBSD Foundation nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.

# Empty out the argument buffer and fill up the command buffer.
skipargs=0
while ! queue_is_empty argbuf; do
	#
	# Grab the next argument from the head of the argument buffer
	# and return it in $arg.
	#
	argok=no
	while $test "$argok" = "no"; do
		if queue_is_empty argbuf; then
			argok=yes
			continue
		fi
		pop_queue argbuf arg
		$debug_log $wrapperlog "    (logic) pop:  $arg"
		#
		# Toggle whether we want to transform $arg or if we
		# want to pass it unmodified into the command buffer.
		#
		if $test $skipargs -eq 0; then
			do_transform=yes
		else
			skipargs=`$expr $skipargs - 1 || true`
			do_transform=no
			argok=yes
			continue
		fi
		argmatch=no
		. $arg_pp_main
		case $argmatch in
		yes)	continue ;;
		esac
		. $arg_pp
		case $argmatch in
		yes)	continue ;;
		esac
		argok=yes
	done
	#
	# Try to look up the transformed $arg in the cache, but if
	# not there, then apply the transformations and save the result
	# in the cache.
	#
	case $do_transform in
	yes)
		. $cache
		case $cachehit in
		yes)
			# The cache was hit and $arg is set.
			$debug_log $wrapperlog "    (logic) to:   $arg [cached]"
			;;
		*)
			# Apply transformations to $arg.
			addtocache=no
			split_arg=no
			case $skip_transform in
			yes)
				$debug_log $wrapperlog "    (logic) to:   $arg [untransformed]"
				;;
			*)
				shquote "$arg"; cachearg="$shquoted"
				case $arg in
				-*|/*)
					case $transform_sed in
					"")	;;
					*)
						arg=`$echo "X$arg" | $Xsed $transform_sed`
						$debug_log $wrapperlog "    (logic) to:   $arg"
						addtocache=yes
						;;
					esac
					;;
				*)
					$debug_log $wrapperlog "    (logic) to:   $arg [untransformed]"
					;;
				esac

				# Apply wrapper-specific transformations
				# to $arg.
				#
				. $transform
				;;
			esac

			##############################################
			# Split all -l options along whitespace.  This
			# disallows library names with whitespace, but it
			# allows us to handle transformations that look
			# like, e.g. "-lreadline" -> "-ledit -ltermcap".
			##############################################
			case $arg in
			-l*)	split_arg=yes ;;
			esac

			# Re-create the cache file if we're adding to it.
			case $updatecache,$addtocache in
			yes,yes)
				shquote "$arg"; cachedarg="$shquoted"
				$cat >> $cache_body << EOF
$cachearg) arg=$cachedarg; split_arg=$split_arg; cachehit=yes ;;
EOF
				{ echo "case \$arg in"
				  $cat $cache_body
				  echo "*) cachehit=no ;;"
				  echo "esac"
				} > $cache-$$.tmp
				$mv -f $cache-$$.tmp $cache
				;;
			esac
			;;
		esac

		case $split_arg in
		######################################################
		# Split some options along whitespace.  This disallows
		# options that contain whitespace, but it allows us to
		# handle transformations that transform one arg into
		# several.
		######################################################
		yes)
			for i in $arg; do
				append_queue cmdbuf "$i"
				$debug_log $wrapperlog "    (logic) push: $i [split]"
			done
			;;
		######################################################
		# Everything else goes into the command buffer unchanged.
		######################################################
		no)
			append_queue cmdbuf "$arg"
			$debug_log $wrapperlog "    (logic) push: $arg"
			;;
		esac
		;;
	*)
		append_queue cmdbuf "$arg"
		$debug_log $wrapperlog "    (logic) push: $arg [skipped]"
		;;
	esac
done
