192 lines
4.3 KiB
Bash
Executable File
192 lines
4.3 KiB
Bash
Executable File
#!/bin/sh
|
|
# Check GNU m4 against examples from the manual source.
|
|
# Copyright (C) 1992, 2006, 2007, 2008 Free Software Foundation, Inc.
|
|
#
|
|
# This file is part of GNU M4.
|
|
#
|
|
# GNU M4 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 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# GNU M4 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 this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
# Clean up temp files on exit
|
|
pwd=`pwd`
|
|
tmp=m4-tmp.$$
|
|
trap 'stat=$?; cd "$pwd"; rm -rf $tmp && exit $stat' 0
|
|
trap '(exit $?); exit $?' 1 2 13 15
|
|
|
|
# Create scratch dir
|
|
framework_failure=0
|
|
mkdir $tmp || framework_failure=1
|
|
|
|
if test $framework_failure = 1; then
|
|
echo "$0: failure in testing framework" 1>&2
|
|
(exit 1); exit 1
|
|
fi
|
|
|
|
out=$tmp/m4-out
|
|
err=$tmp/m4-err
|
|
xout=$tmp/m4-xout
|
|
xerr=$tmp/m4-xerr
|
|
failed=
|
|
skipped=
|
|
strip_needed=false
|
|
diffopts=-c
|
|
|
|
# Allow user to select sed
|
|
: ${SED=sed}
|
|
|
|
# Find out where the examples live.
|
|
examples=.
|
|
if test "x$1" = x-I ; then
|
|
examples="$2"
|
|
shift; shift
|
|
fi
|
|
|
|
# Find out how to run m4.
|
|
m4=m4
|
|
if test "x$1" = x-m ; then
|
|
m4="$2"
|
|
shift; shift
|
|
fi
|
|
|
|
# Find out how the executable prints argv[0]
|
|
m4name=`"$m4" --help | ${SED} -e 's/Usage: \(.*\) \[OPTION.*/\1/' \
|
|
-e 's/\\\\/\\\\\\\\/g' -e 1q`
|
|
|
|
# Find out if we should strip \r in the output
|
|
"$m4" --version | tee $out
|
|
"$m4" --version | tr -d '\015' > $xout
|
|
if cmp -s $out $xout; then
|
|
:
|
|
else
|
|
echo "Ignoring carriage returns"
|
|
strip_needed=:
|
|
fi
|
|
|
|
# Find out if diff supports useful options.
|
|
if diff -u /dev/null /dev/null 2>/dev/null ; then
|
|
diffopts="-u"
|
|
fi
|
|
if diff -a /dev/null /dev/null 2>/dev/null ; then
|
|
diffopts="$diffopts -a"
|
|
fi
|
|
|
|
# Run the tests.
|
|
for file
|
|
do
|
|
test -f "$file" || {
|
|
echo "No such file: $file"
|
|
continue
|
|
}
|
|
echo "Checking $file"
|
|
|
|
case $file in
|
|
*stackovf.test)
|
|
"$file" "$m4"
|
|
case $? in
|
|
77) skipped="$skipped $file";;
|
|
0) ;;
|
|
*) failed="$failed $file"
|
|
esac
|
|
continue ;;
|
|
esac
|
|
|
|
options=`${SED} -ne '3s/^dnl @ extra options: //p;3q' "$file"`
|
|
${SED} -e '/^dnl @/d' -e '/^\^D$/q' "$file" \
|
|
| LC_MESSAGES=C M4PATH=$examples "$m4" -d $options - >$out 2>$err
|
|
stat=$?
|
|
|
|
xstat=`${SED} -ne '2s/^dnl @ expected status: //p;2q' "$file"`
|
|
case $stat in
|
|
77)
|
|
skipped="$skipped $file"
|
|
cat $err
|
|
continue
|
|
;;
|
|
$xstat) ;;
|
|
*)
|
|
failed="$failed $file:status"
|
|
echo `${SED} -e 's/^dnl //' -e 1q $file`
|
|
echo "$file: status was $stat, expected $xstat"
|
|
;;
|
|
esac
|
|
|
|
xoutfile=`${SED} -n 's/^dnl @ expected output: //p' "$file"`
|
|
if test -z "$xoutfile" ; then
|
|
${SED} -e '/^dnl @result{}/!d' -e 's///' -e "s|examples/|$examples/|" \
|
|
"$file" > $xout
|
|
else
|
|
cp "$examples/$xoutfile" $xout
|
|
fi
|
|
|
|
xerrfile=`${SED} -n 's/^dnl @ expected error: //p' "$file"`
|
|
case $xerrfile in
|
|
ignore)
|
|
cp $err $xerr ;;
|
|
'')
|
|
${SED} '/^dnl @error{}/!d
|
|
s///; '"s|^m4:|$m4name:|; s|examples/|$examples/|" \
|
|
"$file" > $xerr ;;
|
|
*)
|
|
${SED} "s|^m4:|$m4name:|; s|examples/|$examples/|" \
|
|
"$examples/$xerrfile" > $xerr ;;
|
|
esac
|
|
|
|
# For the benefit of mingw, normalize \r\n line endings
|
|
if $strip_needed ; then
|
|
tr -d '\015' < $out > $out.t
|
|
mv $out.t $out
|
|
tr -d '\015' < $xout > $xout.t
|
|
mv $xout.t $xout
|
|
tr -d '\015' < $err > $err.t
|
|
mv $err.t $err
|
|
tr -d '\015' < $xerr > $xerr.t
|
|
mv $xerr.t $xerr
|
|
fi
|
|
|
|
if cmp -s $out $xout; then
|
|
:
|
|
else
|
|
failed="$failed $file:out"
|
|
echo `${SED} -e 's/^dnl //' -e 1q $file`
|
|
echo "$file: stdout mismatch"
|
|
diff $diffopts $xout $out
|
|
fi
|
|
|
|
if cmp -s $err $xerr; then
|
|
:
|
|
else
|
|
failed="$failed $file:err"
|
|
echo `${SED} -e 's/^dnl //' -e 1q $file`
|
|
echo "$file: stderr mismatch"
|
|
diff $diffopts $xerr $err
|
|
fi
|
|
|
|
done
|
|
|
|
rm -f $out $err $xout $xerr
|
|
|
|
echo
|
|
if test -n "$skipped"; then
|
|
echo "Skipped checks were:"
|
|
echo " $skipped"
|
|
fi
|
|
if test -z "$failed"; then
|
|
echo "All checks successful"
|
|
stat=0
|
|
else
|
|
echo "Failed checks were:"
|
|
echo " $failed"
|
|
stat=1
|
|
fi
|
|
(exit $stat); exit $stat
|