#! /bin/sh
# quote.test - make sure that shell metacharacters do not blow up libtool
#
#   Copyright (C) 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
#   Written by Gary V. Vaughan, 2003
#
#   This file is part of GNU Libtool.
#
# GNU Libtool is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of
# the License, or (at your option) any later version.
#
# GNU Libtool is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GNU Libtool; see the file COPYING.  If not, a copy
# can be downloaded from  http://www.gnu.org/licenses/gpl.html,
# or obtained by writing to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
####

. tests/defs || exit 1

# Do the torture test.
status=$EXIT_SUCCESS

case $1 in
  --no-reexec)
    ;;
  *)
    func_get_config "SHELL" "$LIBTOOL --config"
    exec $SHELL "$0" --no-reexec ${1+"$@"}
    ;;
esac

func_get_config "ECHO wl" "$LIBTOOL --config"

for mode in compile link install; do
  echo "== $mode mode"

  # Unfortunately, without an array data type, it is nearly impossible
  # to protect libtool from metacharacters in filenames.  So, we just
  # try metacharacters in the options it needs to pass to other programs.

  # preargs and postargs need to go through libtool unmodified.
  case $mode in
  compile)
    preargs="$CC -c"
    preflag=
    match_preflag=
    flag=-DVAR=
    postargs=foo.c
    ;;

  link)
    preargs="$CC -o hell -g -O"
    preflag=-Wl,
    match_preflag=$wl
    flag=-someflag=
    postargs=foo.o
    ;;

  install)
    preargs="install -c"
    preflag=
    match_preflag=
    flag=--something=
    postargs="hell /usr/local/bin/hell"
    ;;
  esac

  # Trivial.
  echo "= trying: no quoting"
  result=`$LIBTOOL -n --mode=$mode $preargs $preflag"$flag:test" $postargs` || status=$EXIT_FAILURE
  # We used to have the contents of $match in the case statement,
  # without an intermediate variable, but it would fail on at least
  # Solaris' and HP-UX's /bin/sh.  Ugh!
  # We must not attempt to match $preargs in the output, because libtool
  # may modify them.  For example, on Cygwin, ``libtool --mode=link gcc -o
  # foo foo.o''  becomes ``gcc -o foo.exe foo.o''.
  match="$match_preflag$flag:test "
  case $result in
  *"$match"*)
    $ECHO "= passed: $result"
    ;;
  *)
    $ECHO "= failed: $result"
    status=$EXIT_FAILURE
    ;;
  esac

  # Metacharacters that should be backslashified.
  for mchar in \\ \" \` \$; do
    $ECHO "= trying: \\$mchar quoting"
    result=`$LIBTOOL -n --mode=$mode $preargs $preflag"$flag$mchar:test$mchar" $postargs` || status=$EXIT_FAILURE
    match="$match_preflag$flag\\$mchar:test\\$mchar "
    alt_match="$match_preflag\"$flag\\$mchar:test\\$mchar\" "
    case $result in
    *"$match"*)
      $ECHO "= passed: $result"
      ;;
    *"$alt_match"*)
      $ECHO "= passed (harmless ksh bug): $result"
      ;;
    *)
      $ECHO "= failed: $result"
      status=$EXIT_FAILURE
      ;;
    esac
  done

  # Metacharacters that should be double quoted.
  for mchar in "[" "]" "~" "#" "^" "&" "*" "(" ")" "{" "}" "|" ";" "<" ">" "?" \
      "'" " " "	"; do

    $ECHO "= trying: \"$mchar\" quoting"
    result=`$LIBTOOL -n --mode=$mode $preargs $preflag"$flag$mchar:test$mchar" $postargs` || status=$EXIT_FAILURE
    match="$match_preflag\"$flag$mchar:test$mchar\" "
    case $result in
    *"$match"*)
      $ECHO "= passed: $result"
      ;;
    *)
      $ECHO "= failed: $result"
      status=$EXIT_FAILURE
      ;;
    esac
  done
done

exit $status
