mirror of
git://git.code.sf.net/p/zsh/code
synced 2024-12-28 04:05:12 +01:00
unposted: elaboration on Roman's "slurp" implementation from zsh-users
This commit is contained in:
parent
c039a74e09
commit
2744208ab3
2 changed files with 34 additions and 0 deletions
|
@ -1,5 +1,8 @@
|
|||
2024-02-03 Bart Schaefer <schaefer@zsh.org>
|
||||
|
||||
* unposted: cf. Roman in users/29472: Functions/Misc/zslurp:
|
||||
Efficient lossless read of stdin into $REPLY
|
||||
|
||||
* unposted: Src/Zle/zle_tricky.c, Src/parse.c, Src/pattern.c:
|
||||
Record as comments some notes about namespace usage exceptions.
|
||||
|
||||
|
|
31
Functions/Misc/zslurp
Normal file
31
Functions/Misc/zslurp
Normal file
|
@ -0,0 +1,31 @@
|
|||
#!/bin/zsh -f
|
||||
|
||||
# Read stdin verbatim and as efficiently as possible into $REPLY,
|
||||
# stopping without any change to $REPLY in the event of any error.
|
||||
# Benchmarked by Roman Perepelitsa in zsh-users/29472
|
||||
|
||||
# Although this function faithfully records the input stream, later
|
||||
# references to $REPLY with the multibyte option back in effect will
|
||||
# (re-)interpret the content as multibyte characters. This may not be
|
||||
# what is desired.
|
||||
|
||||
emulate -L zsh -o no_multibyte
|
||||
|
||||
### Alternate formulation, faster on bigger files
|
||||
# # /dev/fd/0 is treated specially by -f so also check /dev/fd
|
||||
# if [[ -d /dev/fd && -f /dev/fd/0 ]] && zmodload zsh/mapfile
|
||||
# then
|
||||
# local +h -Ar mapfile
|
||||
# typeset -g REPLY="${mapfile[/dev/fd/0]}" && return
|
||||
# fi
|
||||
# # else fall through to read from pipe/socket
|
||||
|
||||
zmodload zsh/system || return
|
||||
local -a content
|
||||
local -i i=0
|
||||
while true; do
|
||||
sysread 'content[++i]' && continue
|
||||
(( $? == 5 )) || return
|
||||
break
|
||||
done
|
||||
typeset -g REPLY=${(j::)content}
|
Loading…
Reference in a new issue