# $NetBSD: logic,v 1.17 2018/08/22 20:48:37 maya 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. # # 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. . $cache 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_lookup 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 "cache_lookup() {" echo "case \$arg in" $cat $cache_body echo "*) cachehit=no ;;" echo "esac" echo "}" } > $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 [untransformed]" ;; esac done