########################################################################
#                                                                      #
#               This software is part of the ast package               #
#          Copyright (c) 1982-2011 AT&T Intellectual Property          #
#                      and is licensed under the                       #
#                 Eclipse Public License, Version 1.0                  #
#                    by AT&T Intellectual Property                     #
#                                                                      #
#                A copy of the License is available at                 #
#          http://www.eclipse.org/org/documents/epl-v10.html           #
#         (with md5 checksum b35adb5213ca9657e911e9befb180842)         #
#                                                                      #
#              Information and Software Systems Research               #
#                            AT&T Research                             #
#                           Florham Park NJ                            #
#                                                                      #
#                    David Korn <dgkorn@gmail.com>                     #
#                                                                      #
########################################################################

function grep
{
    #
    #    SHELL VERSION OF GREP
    #
    vflag= xflag= cflag= lflag= nflag=
    set -f
    while ((1))                # look for grep options
    do
        case "$1" in
            -v*)    vflag=1;;
            -x*)    xflag=1;;
            -c*)    cflag=1;;
            -l*)    lflag=1;;
            -n*)    nflag=1;;
            -b*)    print 'b option not supported';;
            -e*)    shift;expr="$1";;
            -f*)    shift;expr=$(< $1);;
            -*)    print $0: 'unknown flag';return 2;;
            *)
                if test "$expr" = ''
                then
                    expr="$1";shift
                fi

                test "$xflag" || expr="*${expr}*"
                break;;
        esac
        shift                # next argument
    done
    noprint=$vflag$cflag$lflag        # don't print if these flags are set
    integer n=0 c=0 tc=0 nargs=$#        # initialize counters
    for i in "$@"                # go thru the files
    do
        if ((nargs<=1))
        then
            fname=''
        else
            fname="$i":
        fi

        test "$i"  &&  exec 0< $i    # open file if necessary
        while read -r line        # read in a line
        do
            let n=n+1
            case    "$line" in
            $expr)            # line matches pattern
                test "$noprint" || print -r -- "$fname${nflag:+$n:}$line"
                let c=c+1 ;;
            *)            # not a match
                if test "$vflag"
                then    print -r -- "$fname${nflag:+$n:}$line"
                fi;;
            esac
        done
        if test "$lflag" && ((c))
        then
            print -r -- "$i"
        fi

        let tc=tc+c n=0 c=0
    done
    test "$cflag" && print $tc        #  print count if cflag is set
    let tc                    #  set the return value
}

cat > $TEST_DIR/grep <<\!
this is a food bar test
to see how many lines find both foo and bar.
Some line contain foo only,
and some lines contain bar only.
However, many lines contain both foo and also bar.
A line containing foobar should also be counted.
There should be six lines with foo and bar.
There are only two line with out foo but with bar.
!

if (( $(grep -c 'foo*bar' $TEST_DIR/grep ) != 6))
then
    log_error
fi
