about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--Completion/Unix/Command/_whois224
1 files changed, 224 insertions, 0 deletions
diff --git a/Completion/Unix/Command/_whois b/Completion/Unix/Command/_whois
new file mode 100644
index 000000000..76d5a5b4a
--- /dev/null
+++ b/Completion/Unix/Command/_whois
@@ -0,0 +1,224 @@
+#compdef whois fwhois
+
+_whois () {
+  _whois_setup
+  case "$0" in
+  fwhois) _whois_fwhois;;
+  *) $_whois_comp;;
+  esac
+}
+
+(( $+functions[_whois_setup] )) ||
+_whois_setup () {
+  (( $+_whois_defaultserver )) ||
+    _whois_defaultserver='whois.internic.net'
+
+  (( $+_whois_servers )) || {
+    typeset -gUa _whois_servers
+    _whois_servers=(
+      $_whois_defaultserver
+      domain-registry.nl
+      is.nic.pw
+      whois.apnic.net:p
+      whois.arin.net:a
+      whois.aunic.net
+      whois.berkeley.edu
+      whois.cdnnet.ca
+      whois.dns.pt
+      whois.funet.fi
+      whois.gb.com
+      whois.gb.net
+      whois.internic.net
+      whois.jpl.nasa.gov
+      whois.nic-se.se
+      whois.nic.ad.jp
+      whois.nic.af
+      whois.nic.as
+      whois.nic.br
+      whois.nic.bt
+      whois.nic.ch
+      whois.nic.cx
+      whois.nic.fr
+      whois.nic.gov:g
+      whois.nic.hm
+      whois.nic.it
+      whois.nic.li
+      whois.nic.lk
+      whois.nic.mil:d
+      whois.nic.mx
+      whois.nic.nu
+      whois.nic.or.kr
+      whois.nic.sh
+      whois.nic.tj
+      whois.nic.tm
+      whois.nic.uk
+      whois.ripe.net:r
+      whois.ripn.net:R
+      whois.sics.se
+      whois.stanford.edu
+      whois.uk.com
+      www.nic.at
+      $(functions -m '_whois:*' |
+	awk '/^undefined _whois:/ {print substr($2,8,length($2)-7)}
+	     /^_whois:/ {print substr($1,8,length($1)-7)}')
+    )
+  }
+
+  (( $+_whois_arguments )) || {
+    local help="$(whois </dev/null 2>&1)"
+    local tmp opt opts
+    local hostopt=-h+
+
+    if [[ $help = *"user[@<whois.server>]"* ]]; then
+      _whois_comp=_whois_fwhois
+    elif [[ $help = *(name\ ...|OBJECT...)* ]]; then
+      _whois_comp=_whois_multi
+    else
+      _whois_comp=_whois_single
+      hostopt=-h
+    fi
+
+    _whois_arguments=()
+
+    if [[ $help = *"-p PORT"* ]]; then
+      _whois_arguments=("$_whois_arguments[@]"
+        '-p[port]:port:_whois_ports'
+      )
+    fi
+
+    tmp="${(j::)${(@)${(@M)_whois_servers:#*:?}##*:}}" 
+    if [[ $help = (#b)*\[-([$tmp]##)\]* ]]; then
+      tmp=(${(s::)match[1]})
+    else
+      tmp=()
+    fi
+
+    if [[ $help = *"-h host"* ]]; then
+      tmp=($tmp h)
+    fi
+
+    for opt in $tmp; do
+      opts=(-${^tmp:#$opt})
+      if (( $#opts )); then opts="($opts)"; else opts=; fi
+      if [[ $opt = h ]]; then
+	_whois_arguments=("$_whois_arguments[@]"
+	  "${opts}${hostopt}:host:_whois_hosts")
+      else
+	_whois_arguments=("$_whois_arguments[@]"
+	  "${opts}-${opt}[${${(@M)_whois_servers:#*:$opt}%:?}]")
+      fi
+    done
+  }
+}
+
+_whois_single () {
+  local curcontext="$curcontext" state line expl
+  typeset -A opt_args
+  local tmp host
+
+  _arguments -C \
+    "$_whois_arguments[@]" \
+    ':identifier:->identifier' && return 0
+
+  case "$state" in
+  identifier)
+    if [[ -z "$QIPREFIX" && -z "$PREFIX" ]]; then
+      compadd -QS '' \'
+      return
+    fi
+    compset -q
+    host="${opt_args[-h]:-$_whois_defaultserver}"
+    for tmp in $_whois_servers; do
+      if [[ $tmp = *:? && $+opt_args[-${tmp##*:}] -ne 0 ]]; then
+	host="${tmp%:?}"
+        break
+      fi
+    done
+    if (( $+functions[_whois:$host] )); then
+      "_whois:$host" "$expl[@]"
+    else
+      _message "identifier"
+    fi
+    ;;
+  esac
+}
+
+_whois_multi () {
+  local curcontext="$curcontext" state line expl
+  typeset -A opt_args
+  local tmp host
+
+  _arguments -C \
+    "$_whois_arguments[@]" \
+    '*::identifier:->identifier' && return 0
+
+  case "$state" in
+  identifier)
+    host="${opt_args[-h]:-$_whois_defaultserver}"
+    for tmp in $_whois_servers; do
+      if [[ $tmp = *:? && $+opt_args[-${tmp##*:}] -ne 0 ]]; then
+	host="${tmp%:?}"
+        break
+      fi
+    done
+    if (( $+functions[_whois:$host] )); then
+      "_whois:$host" "$expl[@]"
+    else
+      _message "identifier"
+    fi
+    ;;
+  esac
+}
+
+_whois_fwhois () {
+  if compset -P '*@'; then
+    _whois_hosts "$@"
+  else
+    if [[ -z "$QIPREFIX" && -z "$PREFIX" ]]; then
+      compadd -QS '' \'
+      return
+    fi
+    compset -q
+    host="$_whois_defaultserver"
+    if (( $+functions[_whois:$host] )); then
+      "_whois:$host" "$@"
+    else
+      _message "identifier"
+    fi
+  fi
+}
+
+_whois_hosts () {
+  _tags hosts &&
+    compadd "$@" \
+      -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' \
+      - ${_whois_servers%:?} || _hosts "$@"
+}
+
+_whois_ports () {
+  _tags ports && compadd "$@" - whois || _ports "$@"
+}
+
+(( $+functions[_whois:whois.internic.net] )) ||
+_whois:whois.internic.net () {
+  if (( CURRENT == 1 )); then
+    local expl
+
+    _wanted strings expl string compadd HELP DOMAIN HOST
+  else
+    _message 'string'
+  fi
+}
+
+(( $+functions[_whois:whois.nic.ad.jp] )) ||
+_whois:whois.nic.ad.jp () {
+  if (( CURRENT == 1 )); then
+    local expl
+
+    _wanted strings expl string compadd HELP DOM NET HOST PERSON CONN COM
+  else
+    _message 'string'
+  fi
+}
+
+_whois "$@"