#compdef pidof

local curcontext="$curcontext" state line expl ret=1
typeset -A opt_args

_pick_variant -r variant procps='--separator' $OSTYPE -h

case $variant in
  (procps)
    local exargs="-h --help -V --version"
    _arguments -C -s -w \
      '(- *)'{-h,--help}'[display help information]' \
      '(- *)'{-V,--version}'[print program version]' \
      "(-s --single-shot $exargs)"{-s,--single-shot}'[return one PID only]' \
      "(-c --check-root $exargs)"{-c,--check-root}'[omit processes with different root]' \
      '-q[quiet mode, only set the exit code]' \
      '(-w --with-workers)'{-w,--with-workers}'[show kernel workers too]' \
      "(-x $exargs)"-x'[include shells running named scripts]' \
      "($exargs)"\*{-o+,--omit-pid=}'[omit processes with PIDs]:pids:_sequence -s , _pids' \
      '(-t --lightweight)'{-t,--lightweight}'[list threads too]' \
      '(-S --separator)'{-S+,--separator=}'[specify separator put between PIDs]:separator' \
      '*:process:->procnames' \
      && return 0
    ;;
  (darwin*)
    # Night Production pidof
    _arguments -s -w \
      '(- *)'{-h,-\?}'[display help information]' \
      '(- *)-v[print out version info on pidof]' \
      '-l[print output in long format]' \
      '-k[kill processes by name]' \
      '*:process:_process_names -a' \
      && return 0
    ;;
  (*)
    # sysvinit-utils
    _arguments -C -s -w \
      '(- *)-h[display help information]' \
      '-c[return PIDs with the same root directory]' \
      '-d[use the provided character as output separator]:separator' \
      '-n[avoid using stat system function on network shares]' \
      '-o[omit results with a given PID]:pid:_sequence -s , _pids' \
      '-s[return one PID only]' \
      '-q[quiet mode. Do not display output]' \
      '-s[only return one PID]' \
      '-x[return PIDs of shells running scripts with a matching name]' \
      '-z[list zombie and I/O waiting processes. May cause pidof to hang]' \
      '*:process:->procnames' \
      && return 0
    ;;
esac

case $state in
  procnames)
    # Handle defunct processes and "avahi-daemon:"
    _wanted process-names expl process compadd ${${${${${(@)${(f)"$(ps -N --ppid 2 -p 2 o args=)"}%% *}##*/}%:}#\[}%]} && ret=0
  ;;
esac

return ret
