#compdef gs ghostscript

if compset -N --; then
  if [[ CURRENT -eq 1 ]]; then
    _pspdf
  else
    _message -e arguments 'userdict ARGUMENTS'
    return 1
  fi
else
  local curcontext="$curcontext" state line ret=1
  typeset -A opt_args

  _x_arguments -C \
    '-q[quiet startup]' \
    '-g-[set device size]:device size (<width>x<height>):' \
    '-r-[set resolution]:resolution (<val> or <x>x<y>):' \
    '-I[add search paths]:search paths:_dir_list' \
    \*-{d,D}'-[define name with definition]:def:->dname' \
    \*-{s,S}'-[define name with value]:def:->sname' \
    '*:PostScript or PDF file:_pspdf' && ret=0

  case "$state" in
  dname)
    if [[ "$PREFIX" = *\=* ]]; then
      _message -e definition-values 'systemdict definition value'
    else
      _wanted names expl 'systemdict definition name' \
          compadd -M 'm:{a-z}={A-Z}' - \
                  DISKFONTS NOCACHE NOBIND NODISPLAY NOPAUSE PLATFONTS SAFER \
                  WRITESYSTEMDICT && ret=0
    fi
    ;;
  sname)
    if compset -P '*='; then
      case "$IPREFIX" in
      *DEVICE\=)
        _wanted devices expl 'ghostscript device' \
            compadd - "${(@)${=${$(_call_program devices gs -h)##* devices:}%%Search path:*}:#}" && ret=0
        ;;
      *OutputFile\=)
        _description files expl 'output file'
        _files "$expl[@]" && ret=0
        ;;
      *)
        _message -e values 'systemdict value'
        return 1
      esac
    else
      _wanted names expl 'systemdict name' \
          compadd -S\= -M 'm:{a-z}={A-Z}' - DEVICE OutputFile && ret=0
    fi
    ;;
  esac

  return ret
fi
