summaryrefslogtreecommitdiff
path: root/Functions/TCP/tcp_alias
diff options
context:
space:
mode:
authorPeter Stephenson <pws@users.sourceforge.net>2003-02-06 12:21:49 +0000
committerPeter Stephenson <pws@users.sourceforge.net>2003-02-06 12:21:49 +0000
commit5c1f3b65a6f5abeae8459f41adb8fd2316971515 (patch)
tree21a82daa1abab96c967d731c7afe2a3a2bd07fff /Functions/TCP/tcp_alias
parent809ab19dff75185a805b4cbb31a6b89f225167f4 (diff)
downloadzsh-5c1f3b65a6f5abeae8459f41adb8fd2316971515.tar.gz
zsh-5c1f3b65a6f5abeae8459f41adb8fd2316971515.zip
18202: New TCP function system plus small error message change in ztcp.
Diffstat (limited to 'Functions/TCP/tcp_alias')
-rw-r--r--Functions/TCP/tcp_alias156
1 files changed, 156 insertions, 0 deletions
diff --git a/Functions/TCP/tcp_alias b/Functions/TCP/tcp_alias
new file mode 100644
index 000000000..9d6a28da0
--- /dev/null
+++ b/Functions/TCP/tcp_alias
@@ -0,0 +1,156 @@
+# Create an alias for a TCP session.
+#
+# The syntax is similar to the `alias' builtin. Aliases with a trailing
+# `=' are assigned, while those without are listed.
+#
+# The alias can be used to refer to the session, however any output
+# from the session will be shown using information for the base
+# session name. Likewise, any other reference to the session's file
+# descriptor will cause the original session name rather than the alias to
+# be used.
+#
+# It is an error to attempt to create an alias for a non-existent session.
+# The alias will be removed when the session is closed.
+#
+# An alias can be reused without the session having to be closed.
+# However, a base session name cannot be used as an alias. If this
+# becomes necessary, the base session should be renamed with tcp_rename
+# first.
+#
+# With no arguments, list aliases.
+#
+# With the option -d, delete the alias. No value is allowed in this case.
+#
+# With the option -q (quiet), just return status 1 on failure. This
+# does not apply to bad syntax, which is always reported. Bad syntax
+# includes deleting aliases when supplying a value.
+
+emulate -L zsh
+setopt extendedglob cbases
+
+local opt quiet base value alias delete arg match mbegin mend fd array
+integer stat index
+
+while getopts "qd" opt; do
+ case $opt in
+ (q) quiet=1
+ ;;
+ (d) delete=1
+ ;;
+ (*) return 1
+ ;;
+ esac
+done
+(( OPTIND > 1 )) && shift $(( OPTIND - 1 ))
+
+if (( ! $# )); then
+ if (( ${#tcp_aliases} )); then
+ for fd value in ${(kv)tcp_aliases}; do
+ for alias in ${=value}; do
+ print -r - \
+ "${alias}: alias for session ${tcp_by_fd[$fd]:-unnamed fd $fd}"
+ done
+ done
+ fi
+ return 0
+fi
+
+for arg in $*; do
+ if [[ $arg = (#b)([^=]##)=(*) ]]; then
+ if [[ -n $delete ]]; then
+ print "$0: value given with deletion command." >&2
+ stat=1
+ continue
+ fi
+ alias=$match[1]
+ base=$match[2]
+ if [[ -z $base ]]; then
+ # hmm, this is very nearly a syntax error...
+ [[ -z $quiet ]] && print "$0: empty value for alias $alias" >&2
+ stat=1
+ continue
+ fi
+ if [[ ${+tcp_by_name} -eq 0 || -z ${tcp_by_name[$base]} ]]; then
+ [[ -z $quiet ]] && print "$0: no base session \`$base' for alias"
+ stat=1
+ continue
+ fi
+ if [[ -n ${tcp_by_name[$alias]} ]]; then
+ # already exists, OK if this is an alias...
+ fd=${tcp_by_name[$alias]}
+ array=(${=tcp_aliases[$fd]})
+ if [[ -n ${array[(r)$alias]} ]]; then
+ # yes, we're OK; delete the old alias.
+ unset "tcp_by_name[$alias]"
+ index=${array[(i)$alias]}
+ array=(${array[1,index-1]} ${array[index+1,-1]})
+ if [[ -z "$array" ]]; then
+ unset "tcp_aliase[$fd]"
+ else
+ tcp_aliases[$fd]="$array"
+ fi
+ else
+ # oops
+ if [[ -z $quiet ]]; then
+ print "$0: \`$alias' is already a session name." >&2
+ fi
+ stat=1
+ continue
+ fi
+ fi
+ (( ! ${+tcp_aliases} )) && typeset -gA tcp_aliases
+ fd=${tcp_by_name[$base]}
+ if [[ -n ${tcp_aliases[$fd]} ]]; then
+ tcp_aliases[$fd]+=" $alias"
+ else
+ tcp_aliases[$fd]=$alias
+ fi
+ tcp_by_name[$alias]=$fd
+ if zmodload -i zsh/parameter; then
+ if (( ${+functions[tcp_on_alias]} )); then
+ tcp_on_alias $alias $fd
+ fi
+ fi
+ else
+ alias=$arg
+ fd=${tcp_by_name[$alias]}
+ if [[ -z $fd ]]; then
+ print "$0: no such alias \`$alias'" >&2
+ stat=1
+ continue
+ fi
+ # OK if this is an alias...
+ array=(${=tcp_aliases[$fd]})
+ if [[ -n ${array[(r)$alias]} ]]; then
+ # yes, we're OK
+ if [[ -n $delete ]]; then
+ unset "tcp_by_name[$alias]"
+ index=${array[(i)$alias]}
+ array=(${array[1,index-1]} ${array[index+1,-1]})
+ if [[ -z "$array" ]]; then
+ unset "tcp_aliases[$fd]"
+ else
+ tcp_aliases[$fd]="$array"
+ fi
+
+ if zmodload -i zsh/parameter; then
+ if (( ${+functions[tcp_on_unalias]} )); then
+ tcp_on_unalias $alias $fd
+ fi
+ fi
+ else
+ print -r - \
+ "${alias}: alias for session ${tcp_by_fd[$fd]:-unnamed fd $fd}"
+ fi
+ else
+ # oops
+ if [[ -z $quiet ]]; then
+ print "$0: \`$alias' is a session name." >&2
+ fi
+ stat=1
+ continue
+ fi
+ fi
+done
+
+return $stat