#compdef grep egrep fgrep
# Ulrik Haugen 2001

local arguments matchers

(( $+_is_gnu )) || typeset -gA _is_gnu

if (( ! $+_is_gnu[$words[1]] )); then
  if [[ $(_call_program version $words[1] --help </dev/null 2>/dev/null) = *gnu* ]]
  then
    _is_gnu[$words[1]]=yes
  else
    _is_gnu[$words[1]]=
  fi
fi

if [[ $service != [ef]grep ]]; then
  matchers='(--extended-regexp --fixed-strings --basic-regexp -E -F -G)'
  arguments=(
    $matchers{--extended-regexp,-E}'[use extended regular expression]'
    $matchers{--fixed-strings,-F}'[use literal strings]'
    $matchers{--basic-regexp,-G}'[use basic regular expression]'
  )
fi

arguments=( $arguments[@]
  '(--after-context -A)'{--after-context=,-A+}'[specify lines of trailing context]:lines'
  '(--text -a --binary-files -I)'{--text,-a}'[process binary file as if it were text]'
  '(--before-context -B)'{--before-context=,-B+}'[specify lines of leading context]:lines'
  '(--context,-C)'{--context=,-C+}'[specify lines of context]:lines'
  '(--byte-offset -b -c)'{--byte-offset,-b}'[print the byte offset with output lines]'
  '(--text -a -I)--binary-files=[specify type to assume for binary files]:file type:(binary without-match text)'
  '(--count -c --byte-offset -b --line-number -n)'{--count,-c}'[only print a count of matching lines]'
  '(--directories -d -r --recursive)'{--directories=,-d+}'[specify handling of directories]:action on directory:(read skip recurse)'
  '(1)*'{--regexp=,-e+}'[specify pattern]:pattern'
  '(1)*'{--file=,-f+}'[specify pattern file]:file:_files'
  '(--with-filename -H --no-filename -h)'{--with-filename,-H}'[print filename with each match]'
  '(--no-filename -h --with-filename -H --null -Z --files-without-match -L --file-with-matches -l)'{--no-filename,-h}'[suppress printing of filenames]'
  '(--text -a --binary-files)-I[process binary files as if non-matching]'
  '(--ignore-case -i -y)'{--ignore-case,-i,-y}'[case-insensitive]'
  '(--files-without-match -L --file-with-matches -l --no-filename -h)'{--files-without-match,-L}"[output non-matching files' names only]"
  '(--files-with-matches -l --files-without-match -L --no-filename -h)'{--files-with-matches,-l}"[output matching files' names only]"
  '(--line-number -n -c)'{--line-number,-n}'[prefix output with line numbers]'
  '(--quiet --silent -q)'{--quiet,--silent,-q}'[suppress normal output]'
  '(--recursive -r -d --directories)'{--recursive,-r}'[recurse subdirectories]'
  '(--no-mesages -s)'{--no-messages,-s}'[suppress messages about unreadable]'
  '(--version -V)'{--version,-V}'[display version info]'
  '(--invert-match -v)'{--invert-match,-v}'[select non-matching lines]'
  '(--word-regexp -w --line-regexp -x)'{--word-regexp,-w}'[force pattern to match only whole words]'
  '(--line-regexp -x --word-regexp -w)'{--line-regexp,-x}'[force pattern to match only whole lines]'
  '(--null -Z --no-filename -h)'{--null,-Z}'[print 0 byte after FILE name]'
  '--help[display help]'
  '--mmap[memory map input]'
  '(-e --regexp -f --file)1:pattern:_guard "^--*"'
  '*:files:_files'
)

# remove long options?
[[ -z "$_is_gnu[$words[1]]" ]] &&
    arguments=( ${arguments:#(|*\)(\*|))--*} )

_arguments -s $arguments[@]

