1da2e3ebdSchin########################################################################
2da2e3ebdSchin#                                                                      #
3da2e3ebdSchin#               This software is part of the ast package               #
4*b30d1939SAndy Fiddaman#          Copyright (c) 1982-2011 AT&T Intellectual Property          #
5da2e3ebdSchin#                      and is licensed under the                       #
6*b30d1939SAndy Fiddaman#                 Eclipse Public License, Version 1.0                  #
77c2fbfb3SApril Chin#                    by AT&T Intellectual Property                     #
8da2e3ebdSchin#                                                                      #
9da2e3ebdSchin#                A copy of the License is available at                 #
10*b30d1939SAndy Fiddaman#          http://www.eclipse.org/org/documents/epl-v10.html           #
11*b30d1939SAndy Fiddaman#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
12da2e3ebdSchin#                                                                      #
13da2e3ebdSchin#              Information and Software Systems Research               #
14da2e3ebdSchin#                            AT&T Research                             #
15da2e3ebdSchin#                           Florham Park NJ                            #
16da2e3ebdSchin#                                                                      #
17da2e3ebdSchin#                  David Korn <dgk@research.att.com>                   #
18da2e3ebdSchin#                                                                      #
19da2e3ebdSchin########################################################################
20da2e3ebdSchinfunction err_exit
21da2e3ebdSchin{
22da2e3ebdSchin	print -u2 -n "\t"
23da2e3ebdSchin	print -u2 -r ${Command}[$1]: "${@:2}"
24da2e3ebdSchin	let Errors+=1
25da2e3ebdSchin}
26da2e3ebdSchinalias err_exit='err_exit $LINENO'
27da2e3ebdSchin
28da2e3ebdSchinCommand=${0##*/}
29da2e3ebdSchininteger Errors=0
30da2e3ebdSchin
3134f9b3eeSRoland Mainztmp=$(mktemp -dt) || { err_exit mktemp -dt failed; exit 1; }
3234f9b3eeSRoland Mainztrap "cd /; rm -rf $tmp" EXIT
3334f9b3eeSRoland Mainz
34da2e3ebdSchinfunction grep
35da2e3ebdSchin{
36da2e3ebdSchin	#
37da2e3ebdSchin	#	SHELL VERSION OF GREP
38da2e3ebdSchin	#
39da2e3ebdSchin	vflag= xflag= cflag= lflag= nflag=
40da2e3ebdSchin	set -f
41da2e3ebdSchin	while	((1))				# look for grep options
42da2e3ebdSchin	do	case	"$1" in
43da2e3ebdSchin		-v*)	vflag=1;;
44da2e3ebdSchin		-x*)	xflag=1;;
45da2e3ebdSchin		-c*)	cflag=1;;
46da2e3ebdSchin		-l*)	lflag=1;;
47da2e3ebdSchin		-n*)	nflag=1;;
48da2e3ebdSchin		-b*)	print 'b option not supported';;
49da2e3ebdSchin		-e*)	shift;expr="$1";;
50da2e3ebdSchin		-f*)	shift;expr=$(< $1);;
51da2e3ebdSchin		-*)	print $0: 'unknown flag';return 2;;
52da2e3ebdSchin		*)
53da2e3ebdSchin			if	test "$expr" = ''
54da2e3ebdSchin			then	expr="$1";shift
55da2e3ebdSchin			fi
56da2e3ebdSchin			test "$xflag" || expr="*${expr}*"
57da2e3ebdSchin			break;;
58da2e3ebdSchin		esac
59da2e3ebdSchin		shift				# next argument
60da2e3ebdSchin	done
61da2e3ebdSchin	noprint=$vflag$cflag$lflag		# don't print if these flags are set
62da2e3ebdSchin	integer n=0 c=0 tc=0 nargs=$#		# initialize counters
63da2e3ebdSchin	for i in "$@"				# go thru the files
64da2e3ebdSchin	do	if	((nargs<=1))
65da2e3ebdSchin		then	fname=''
66da2e3ebdSchin		else	fname="$i":
67da2e3ebdSchin		fi
68da2e3ebdSchin		test "$i"  &&  exec 0< $i	# open file if necessary
69da2e3ebdSchin		while	read -r line		# read in a line
70da2e3ebdSchin		do	let n=n+1
71da2e3ebdSchin			case	"$line" in
72da2e3ebdSchin			$expr)			# line matches pattern
73da2e3ebdSchin				test "$noprint" || print -r -- "$fname${nflag:+$n:}$line"
74da2e3ebdSchin				let c=c+1 ;;
75da2e3ebdSchin			*)			# not a match
76da2e3ebdSchin				if	test "$vflag"
77da2e3ebdSchin				then	print -r -- "$fname${nflag:+$n:}$line"
78da2e3ebdSchin				fi;;
79da2e3ebdSchin			esac
80da2e3ebdSchin		done
81da2e3ebdSchin		if	test "$lflag" && ((c))
82da2e3ebdSchin		then	print -r -- "$i"
83da2e3ebdSchin		fi
84da2e3ebdSchin		let tc=tc+c n=0 c=0
85da2e3ebdSchin	done
86da2e3ebdSchin	test "$cflag" && print $tc		#  print count if cflag is set
87da2e3ebdSchin	let tc					#  set the return value
88da2e3ebdSchin}
89da2e3ebdSchin
9034f9b3eeSRoland Mainzcat > $tmp/grep <<\!
91da2e3ebdSchinthis is a food bar test
92da2e3ebdSchinto see how many lines find both foo and bar.
93da2e3ebdSchinSome line contain foo only,
94da2e3ebdSchinand some lines contain bar only.
95da2e3ebdSchinHowever, many lines contain both foo and also bar.
96da2e3ebdSchinA line containing foobar should also be counted.
97da2e3ebdSchinThere should be six lines with foo and bar.
98da2e3ebdSchinThere are only two line with out foo but with bar.
99da2e3ebdSchin!
100da2e3ebdSchin
10134f9b3eeSRoland Mainzif	(( $(grep -c 'foo*bar' $tmp/grep ) != 6))
102da2e3ebdSchinthen	err_exit
103da2e3ebdSchinfi
104*b30d1939SAndy Fiddaman
105*b30d1939SAndy Fiddamanexit $((Errors<125?Errors:125))
106