#compdef xxd

local arguments

# Output options compatibility matrix
#
# 0 - options conflict
# 1 - options coexist
#
# (The matrix is symmetric, so implied values are not shown.)
#
#     bEipru
#    bx10000
#    E-x0001
#    i--x001
#    p---x11
#    r----x0
#    u-----x

# xxd supports either double or single dashes on long options.
[[ -prefix -- ]] && compset -P -

arguments=(
  # output options
  '(-b -bits -i -include -t -p -postscript -plain -ps -r -revert -u -uppercase)'{-b,-bits}'[output in binary digits, rather than hex]'
  '(-E -EBCDIC -i -include -t -p -postscript -plain -ps -r -revert)'{-E,-EBCDIC}'[print human-readable part in EBCDIC rather than ASCII]'
  '(-i -include -t -p -postscript -plain -ps -r -revert)-e[little-endian dump]'
  '(-E -EBCDIC -i -include -p -postscript -plain -ps -r -revert)'{-i,-include}'[output in C include file style]'
  '(-E -EBCDIC -p -postscript -plain -ps -r -revert)-t[append terminating zero to C include output]'
  '(-b -bits -E -EBCDIC -i -include -t -p -postscript -plain -ps -C -capitalize)'{-p,-postscript,-plain,-ps}'[read or write a plain hexdump (no line numbers or ASCII rendering)]'

  '(-b -bits -E -EBCDIC -i -include -t -r -revert -u -uppercase)'{-r,-revert}'[reverse mode\: read a hex dump and output binary data]'
  '(-b -bits                                                  -r -revert -u -uppercase)'{-u,-uppercase}'[output upper-case hex digits]'

  '(- :)'{-h,-help}'[display usage message]'
  '(- :)'{-v,-version}'[show program version]'
  '*'{-a,-autoskip}"[a single '*' replaces runs of NUL (toggleable)]"
  '(-C -capitalize)'{-C,-capitalize}'[capitalize variable names in C include file style]'
  '(-c -cols)'{-c+,-cols}'[specify number of octets per line]: :_guard "(0x|)[0-9a-fA-Fx]#" "number of octets per line"'
  '(-g -groupsize)'{-g+,-groupsize}'[specify the number of octets per group]: :_guard "(0x|)[0-9a-fA-F]#" "number of octets per group"'
  '(-l -len)'{-l+,-len}'[specify number of octets to output]: :_guard "(0x|)[0-9a-fA-F]#" "number of octets to output"'
  '(-n -name)'{-n+,-name}'[override the variable name output when -i is used]:variable name'
  '(-o -offset)'{-o+,-offset}'[add specified offset to displayed file position]:offset'
  '-d[show offset in decimal instead of hex]'
  '-R+[colorize the output]:when:(always auto never)'
  '(-s -skip -seek)'{-s+,-skip,-seek}'[specify file offset to dump from]: :_guard "([+-]|)(0x|)[0-9a-fA-F]#" "file offset to dump from (bytes, absolute or +/- relative)"'

  ': :_files'
)

_arguments -S $arguments
