#compdef strings gstrings eu-strings

local args variant format bytes
format='[precede each string by its byte offset in the file]:format:((d\:decimal o\:octal x\:hexadecimal))'
bytes='[specify minimum string length]:length (bytes) [4]'
args=(
  '(-t --radix)-o[precede each string by its decimal byte offset]'
  '!(-n --bytes)-'{1,2,3,4,5,6,7,8,9}
)

if _pick_variant -r variant binutils=GNU elftoolchain=elftoolchain elfutils=elfutils unix -V; then
  args+=(
    '(-a --all -d --data)'{-a,--all}'[look everywhere in file, not just initialised data space of object files]'
    '(-e --encoding)'{-e+,--encoding=}'[select character size and endianness]:character type:((
      s\:7-bit
      S\:8-bit
      b\:16-bit\ big-endian
      l\:16-bit\ little-endian
      B\:32-bit\ big-endian
      L\:32-bit\ little-endian))'
    '(-f --print-file-name)'{-f,--print-file-name}'[print name of the file before each string]'
    '(-n --bytes)'{-n+,--bytes=}"$bytes"
    '(-d -t --radix)'{-t+,--radix=}"$format"
    '(- *)--help[display help information]'
    '(- *)--version[display version information]'
  )
  case $variant in
    elfutils|binutils)
      args+=( '(- *)-V[display version information]' )
    ;|
    elftoolchain|binutils)
      args+=(
        '(- *)-h[display help information]'
	'(- *)-v[display version information]'
      )
    ;|
    binutils)
      args+=(
	'(-a --all -d --data)'{-d,--data}'[only print strings from file data sections]'
	'(-w --include-all-whitespace)'{-w,--include-all-whitespace}'[include all whitespace as valid string characters]'
	'(-T --target)'{-T+,--target=}'[specify binary file format]:format:compadd - ${(z)${(M)${(f)"$(_call_program targets strings --help)"}##* supported targets*}##*\: }'
	'(-s --output-separator)'{-s+,--output-separator=}'[specify string used to separate strings in output]:separator'
      )
    ;;
    elfutils)
      args+=(
	'(- *)--usage[display a short usage message]'
	'(- *)-?[display help information]'
      )
    ;;
  esac
else
  args+=(
    "(-d)-t+$format"
    "-n+$bytes"
    '-a[look everywhere in file, not just initialised data space of object files]'
  )
  case $OSTYPE in
    darwin*)
      local -a arch
      arch=( ${(z)${${"$(_call_program architectures strings -arch - 2>&1)"}#*flags are: }%%$'\n'*} all )
      args+=( '-arch[specify the architecture]:architecture:compadd -a arch' )
    ;;
  esac
fi

if compset -P '@'; then
  _files
  return
fi

_arguments -S -s $args \
  '*:file:_files'
