181404Speter#!/bin/sh
281404Speter
3175261Sobrien# Copyright (C) 2000-2005 The Free Software Foundation, Inc.
4175261Sobrien
5175261Sobrien# This program is free software; you can redistribute it and/or modify
6175261Sobrien# it under the terms of the GNU General Public License as published by
7175261Sobrien# the Free Software Foundation; either version 2, or (at your option)
8175261Sobrien# any later version.
981404Speter#
10175261Sobrien# This program is distributed in the hope that it will be useful,
11175261Sobrien# but WITHOUT ANY WARRANTY; without even the implied warranty of
12175261Sobrien# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13175261Sobrien# GNU General Public License for more details.
14175261Sobrien
15175261Sobrien#
1681404Speter# This program is intended to take a check.log file generated by a failed run of
1781404Speter# sanity.sh as input and run expr line by line on it.  It seems a much easier
1881404Speter# way of spotting a single failed line in a 100 line test result.
1981404Speter#
2081404Speter
2181404Speter#
2281404Speter# Contributed by Derek R. Price <derek.price@openavenue.com>
2381404Speter#
2481404Speter
2581404Speter
2681404Speter
2781404Speterusage ()
2881404Speter{
2981404Speter	echo "\
3081404Speterusage: $0 [-afh] [file...]
3181404Speter
3281404Speter       -a          process alternate pattern
3381404Speter       -f          process first pattern (default)
3481404Speter       -h          print this text
3581404Speter
3681404Speter     file          files to process (default = check.log)"
3781404Speter}
3881404Speter
3981404Speter# Do a line by line match with expr
4081404Speter#
4181404Speter# INPUTS
4281404Speter#    $1 = text file name
4381404Speter#    $2 = pattern file name
4481404Speterexpr_line_by_line ()
4581404Speter{
4681404Speter	dcl_line=0
4781404Speter	dcl_wrong=
4881404Speter	# We are assuming a newline at the end of the file.  The way sanity.sh
4981404Speter	# uses echo to create the log message guarantees this newline and since
5081404Speter	# expr ignores the last newline when the anchor is present anyhow, no
5181404Speter	# information is being lost in the transition
5281404Speter	while test $dcl_line -lt `wc -l <$1` -a $dcl_line -lt `wc -l <$2`; do
5381404Speter		dcl_line=`expr $dcl_line + 1`
5481404Speter		if test `sed -ne${dcl_line}p <$1 |wc -c` -eq 1 \
5581404Speter				-a `sed -ne${dcl_line}p <$2 |wc -c` -eq 1; then
5681404Speter			# This is a workaround for what I am calling a bug in GNU
5781404Speter			# expr - it won't match the empty string to the empty
5881404Speter			# string.  In this case the assumption is that a single
5981404Speter			# character is always a newline.  Since we already checked
6081404Speter			# for the end of the file, we know sed will echo the
6181404Speter			# newline.
6281404Speter			: 
6381404Speter		elif expr "`sed -ne${dcl_line}p <$1`" : \
6481404Speter				"`sed -ne${dcl_line}p <$2`\$" >/dev/null; then
6581404Speter			:
6681404Speter		else
6781404Speter			echo "$dcl_line: `sed -ne${dcl_line}p <$1`"
6881404Speter			echo "$dcl_line: `sed -ne${dcl_line}p <$2`\$"
6981404Speter			dcl_wrong="$dcl_wrong $dcl_line"
7081404Speter		fi
7181404Speter	done
7281404Speter	if test `wc -l <$1` -ne `wc -l <$2`; then
7381404Speter		echo "output & pattern contain differing number of lines"
7481404Speter	elif test -z "$dcl_wrong"; then
7581404Speter		echo "no mismatched lines"
7681404Speter	else
7781404Speter		echo "mismatched lines: $dcl_wrong"
7881404Speter	fi
7981404Speter}
8081404Speter
8181404Speter# Process a single check.log file
8281404Speter#
8381404Speter# INPUTS
8481404Speter#    $1 = filename
8581404Speterprocess_check_log ()
8681404Speter{
8781404Speter	# abort if we can't find any expressions
8881404Speter	if grep '^\*\* got: $' <$1 >/dev/null; then
8981404Speter		:
9081404Speter	else
9181404Speter		echo "WARNING:  No expressions in file: $1" >&2
9281404Speter		echo "          Either not a check.log or sanity.sh exited for some other reason," >&2
9381404Speter		echo "          like bad exit status.  Try tail." >&2
9481404Speter		return
9581404Speter	fi
9681404Speter
9781404Speter	dcl_exprfiles=""
9881404Speter	if grep '^\*\* or: $' <$1 >/dev/null; then
9981404Speter		# file contains a second regex
10081404Speter		if test $dcl_dofirst -eq 1; then
10181404Speter			# get the first pattern
10281404Speter			sed -ne '/^\*\* expected: $/,/^\*\* or: $/p' <$1 >/tmp/dcle$$
10381404Speter			dcl_exprfiles="$dcl_exprfiles /tmp/dcle$$"
10481404Speter		fi
10581404Speter		if test $dcl_doalternate -eq 1; then
10681404Speter			# get the alternate pattern
10781404Speter			sed -ne '/^\*\* or: $/,/^\*\* got: $/p' <$1 >/tmp/dclo$$
10881404Speter			dcl_exprfiles="$dcl_exprfiles /tmp/dclo$$"
10981404Speter		else
11081404Speter			echo "WARNING:  Ignoring alternate pattern in file: $1" >&2
11181404Speter		fi
11281404Speter	else
11381404Speter		# file doesn't contain a second regex
11481404Speter		if test $dcl_dofirst = 1; then
11581404Speter			# get the only pattern
11681404Speter			sed -ne '/^\*\* expected: $/,/^\*\* got: $/p' <$1 >/tmp/dcle$$
11781404Speter			dcl_exprfiles="$dcl_exprfiles /tmp/dcle$$"
11881404Speter		fi
11981404Speter		if test $dcl_doalternate -eq 1; then
12081404Speter			echo "WARNING:  No alternate pattern in file:  $1" >&2
12181404Speter		fi
12281404Speter	fi
12381404Speter
12481404Speter	# and get the actual output
12581404Speter	sed -ne '/^\*\* got: $/,$p' <$1 >/tmp/dclg$$
12681404Speter	sed -ne '1D
12781404Speter$D
12881404Speterp' </tmp/dclg$$ >/tmp/dclh$$
12981404Speter	mv /tmp/dclh$$ /tmp/dclg$$
13081404Speter
13181404Speter	# compare the output against each pattern requested
13281404Speter	for dcl_f in $dcl_exprfiles; do
13381404Speter		sed -ne '1D
13481404Speter$D
13581404Speterp' <$dcl_f >/tmp/dclp$$
13681404Speter		mv /tmp/dclp$$ $dcl_f
13781404Speter
13881404Speter		case $dcl_f in
13981404Speter			/tmp/dcle*)
14081404Speter				echo "********** $1 : Primary **********"
14181404Speter				;;
14281404Speter			/tmp/dclo*)
14381404Speter				echo "********** $1 : Alternate **********"
14481404Speter				;;
14581404Speter		esac
14681404Speter
14781404Speter		expr_line_by_line /tmp/dclg$$ $dcl_f
14881404Speter
14981404Speter		rm $dcl_f
15081404Speter	done
15181404Speter
15281404Speter	rm /tmp/dclg$$
15381404Speter}
15481404Speter
15581404Speter###
15681404Speter### MAIN
15781404Speter###
15881404Speter
15981404Speter# set up defaults
16081404Speterdcl_doalternate=0
16181404Speterdcl_dofirst=0
16281404Speter
16381404Speter# process options
16481404Speterwhile getopts afh arg; do
16581404Speter	case $arg in
16681404Speter		a)
16781404Speter			dcl_doalternate=1
16881404Speter			;;
16981404Speter		f)
17081404Speter			dcl_dofirst=1
17181404Speter			;;
17281404Speter		\?|h)
17381404Speter			usage
17481404Speter			exit 1
17581404Speter			;;
17681404Speter	esac
17781404Speterdone
17881404Speter
17981404Speter# dispose of processed args
18081404Spetershift `expr $OPTIND - 1`
18181404SpeterOPTIND=1
18281404Speter
18381404Speter# set the default mode
18481404Speterif test $dcl_doalternate -eq 0; then
18581404Speter	dcl_dofirst=1
18681404Speterfi
18781404Speter
18881404Speter# set default arg
18981404Speterif test $# -eq 0; then
190107484Speter	if test -f src/check.log && test -r src/check.log; then
191107484Speter		set src/check.log
192107484Speter	else
193107484Speter		set check.log
194107484Speter	fi
19581404Speterfi
19681404Speter
197107484Speterfor file in "$@"; do
198107484Speter	process_check_log $file;
19981404Speterdone
20081404Speter
20181404Speterexit 0
202