mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-10-16 12:21:18 +02:00
19339: minor TCP function suite additions
This commit is contained in:
parent
66329cbe4c
commit
a892f5e24c
4 changed files with 46 additions and 17 deletions
|
@ -1,3 +1,9 @@
|
|||
2004-01-06 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 19339: Doc/Zsh/tcpsys.yo, Functions/TCP/tcp_fd_handler,
|
||||
Functions/TCP/tcp_read: test for whether we are in a zle handler;
|
||||
allow filter to abort output.
|
||||
|
||||
2004-01-05 Peter Stephenson <pws@csr.com>
|
||||
|
||||
* 19336: Src/Zle/compmatch.c: Matches were compared in length
|
||||
|
|
|
@ -506,6 +506,11 @@ zmanref(zshzle)
|
|||
ifnzman(\
|
||||
noderef(Zle Builtins)
|
||||
).
|
||||
|
||||
While active, the function sets the parameter tt(TCP_HANDLER_ACTIVE) to 1.
|
||||
This allows shell code called internally (for example, by setting
|
||||
tt(tcp_on_read)) to tell if is being called when the shell is otherwise
|
||||
idle at the editor prompt.
|
||||
)
|
||||
findex(tcp_output)
|
||||
item(tt(tcp_output [ -q ] -P) var(prompt) tt(-F) var(fd) tt(-S) var(sess))(
|
||||
|
@ -571,6 +576,12 @@ if matched in tt(tcp_output), will cause the line not to be printed to
|
|||
standard output. The patterns should be defined as described for the
|
||||
arguments to tt(tcp_expect). Output of line to log files is not affected.
|
||||
)
|
||||
vindex(TCP_HANDLER_ACTIVE)
|
||||
item(tt(TCP_HANDLER_ACTIVE))(
|
||||
Scalar. Set to 1 within tt(tcp_fd_handler) to indicate to functions
|
||||
called recursively that they have been called during an editor session.
|
||||
Otherwise unset.
|
||||
)
|
||||
vindex(TCP_LINE)
|
||||
item(tt(TCP_LINE))(
|
||||
The last line read by tt(tcp_read), and hence also tt(tcp_expect).
|
||||
|
@ -691,6 +702,13 @@ tt(tcp_read) (which includes lines read by tt(tcp_expect)) is compared
|
|||
against the pattern. If the line matches, the command given in the key is
|
||||
called with two arguments: the name of the session from which the line was
|
||||
read, and the line itself.
|
||||
|
||||
If any function called to handle a line returns a non-zero status, the
|
||||
line is not output. Thus a tt(tcp_on_read) handler containing only
|
||||
the instruction `tt(return 1)' can be used to suppress output of
|
||||
particular lines (see, however, tt(tcp_filter) above). However, the line
|
||||
is still stored in tt(TCP_LINE) and tt(tcp_lines); this occurs after all
|
||||
tt(tcp_on_read) processing.
|
||||
)
|
||||
enditem()
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
local line name=${tcp_by_fd[$1]}
|
||||
local TCP_HANDLER_ACTIVE=1
|
||||
if [[ -n $name ]]
|
||||
then
|
||||
local TCP_INVALIDATE_ZLE
|
||||
|
|
|
@ -60,7 +60,7 @@ setopt extendedglob cbases
|
|||
|
||||
zmodload -i zsh/mathfunc
|
||||
|
||||
local opt drain line quiet block read_fd all sess key val
|
||||
local opt drain line quiet block read_fd all sess key val noprint
|
||||
local -A read_fds
|
||||
read_fds=()
|
||||
float timeout timeout_all endtime
|
||||
|
@ -140,10 +140,10 @@ local helper_stat=2 skip tpat reply REPLY
|
|||
float newtimeout
|
||||
|
||||
if [[ ${(t)SECONDS} != float* ]]; then
|
||||
# If called from another function, don't override
|
||||
typeset -F TCP_SECONDS_START=$SECONDS
|
||||
# Get extra accuracy by making SECONDS floating point locally
|
||||
typeset -F SECONDS
|
||||
# If called from another function, don't override
|
||||
typeset -F TCP_SECONDS_START=$SECONDS
|
||||
# Get extra accuracy by making SECONDS floating point locally
|
||||
typeset -F SECONDS
|
||||
fi
|
||||
|
||||
if (( timeout_all )); then
|
||||
|
@ -198,23 +198,27 @@ while (( ${#read_fds} )); do
|
|||
|
||||
helper_stat=0
|
||||
sess=${tcp_by_fd[$read_fd]}
|
||||
|
||||
# Handle user-defined triggers
|
||||
noprint=${TCP_SILENT:+-q}
|
||||
if (( ${+tcp_on_read} )); then
|
||||
# Call the function given in the key for each matching value.
|
||||
# It is this way round because function names must be
|
||||
# unique, while patterns do not need to be. Furthermore,
|
||||
# this keeps the use of subscripting under control.
|
||||
for key val in ${(kv)tcp_on_read}; do
|
||||
if [[ $line = ${~val} ]]; then
|
||||
$key "$sess" "$line" || noprint=-q
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
tcp_output -P "${TCP_PROMPT=<-[%s] }" -S $sess -F $read_fd \
|
||||
${TCP_SILENT:+-q} "$line"
|
||||
$noprint "$line"
|
||||
# REPLY is now set to the line with an appropriate prompt.
|
||||
tcp_lines+=($REPLY)
|
||||
TCP_LINE=$REPLY TCP_LINE_FD=$read_fd
|
||||
|
||||
# Handle user-defined triggers
|
||||
if (( ${+tcp_on_read} )); then
|
||||
# Call the function given in the key for each matching value.
|
||||
# It is this way round because function names must be
|
||||
# unique, while patterns do not need to be. Furthermore,
|
||||
# this keeps the use of subscripting under control.
|
||||
for key val in ${(kv)tcp_on_read}; do
|
||||
[[ $line = ${~val} ]] && $key "$sess" "$line"
|
||||
done
|
||||
fi
|
||||
|
||||
# Only handle one line from one device at a time unless draining.
|
||||
[[ -z $drain ]] && return $stat
|
||||
done
|
||||
|
|
Loading…
Reference in a new issue