#compdef rasm2
local context state state_descr line
local -i ret=1

r2_qc() {
  r2 -qc $1 --
}

_rasm2() {
  local -a options=(
  '-a+[Set architecture to assemble/disassemble (see -L)]: :->arch'
  '-A[Show Analysis information from given hexpairs]'
  '-b+[Set cpu register size (8, 16, 32, 64) (RASM2_BITS)]:bits:(8 16 32 64)'
  '-c+[Select specific CPU (depends on arch)]:cpu'
  '-C[Output in C format]'
  '(-d -D)'{-d,-D}'[Disassemble from hexpair bytes (-D show hexpairs)]'
  '-e[Use big endian instead of little endian]'
  '-E[Display ESIL expression (same input as in -d)]'
  '-f+[Read data from file]: :_files'
  '-F+[Specify input and/or output filters (att2intel, x86.pseudo, ...)]:in\:out'
  '(-h, -hh)'{-h,-hh}'[show help message, -hh for long]'
  '-i+[ignore/skip N bytes of the input buffer]:bytes'
  '(-j -r)-j[output in json format]'
  '-k+[Select operating system (linux, windows, darwin, ..)]: :->asm.os'
  '-l+[Input/Output length]:len'
  '-L[List Asm plugins: (a=asm, d=disasm, A=analyze, e=ESIL)]'
  '-o+[Set start address for code (default 0)]:offset'
  '-O+[Output file name (rasm2 -Bf a.asm -O a)]: :_files'
  '-p[Run SPP over input for assembly]'
  '(-j -r)-r[output in radare commands]'
  '-s+[Select syntax (intel, att)]: :->syntax'
  '-B[Binary input/output (-l is mandatory for binary input)]'
  '-v[Show version information]'
  "-w[What's this instruction for? describe opcode]"
  '-q[quiet mode]'
  )

  _arguments -S -s : $options '1:code|hex|-' && ret=0

  case $state in
    arch)
      local -a sub=(${(f)"$(rasm2 -L | cut -c 18-28 | tr -d ' ')"})
      _values 'arch' $sub && ret=0
      ;;
    asm.os)
      _values 'asm.os' $(r2_qc 'e asm.os=?') && ret=0
      ;;
    syntax)
      _values 'syntax' $(rasm2 '-s?') && ret=0
      ;;
  esac
  return ret
}

_rasm2 "$@"

# Local Variables:
# mode: shell-script
# coding: utf-8-unix
# indent-tabs-mode: nil
# sh-indentation: 2
# sh-basic-offset: 2
# End:
# vim: ft=zsh sw=2 sts=2 et
