1
0
Fork 0
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:
Peter Stephenson 2004-01-06 13:56:12 +00:00
parent 66329cbe4c
commit a892f5e24c
4 changed files with 46 additions and 17 deletions

View file

@ -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

View file

@ -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()

View file

@ -1,4 +1,5 @@
local line name=${tcp_by_fd[$1]}
local TCP_HANDLER_ACTIVE=1
if [[ -n $name ]]
then
local TCP_INVALIDATE_ZLE

View file

@ -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