get-bytevector-some - read some unspecified number of bytes from a port
LIBRARY
(import (rnrs)) ;R6RS
(import (rnrs io ports)) ;R6RS
SYNOPSIS
(get-bytevector-some binary-input-port)
DESCRIPTION
Reads from
binary-input-port,
blocking as necessary, until bytes are available from
binary-input-port
or until an end of file is reached.
If bytes become available, returns a freshly allocated bytevector
containing the initial available bytes (at least one), and updates
binary-input-port
to point just past these bytes.
If no input bytes are seen before an end of file is reached,
the end-of-file object is returned.
IMPLEMENTATION NOTES
The implementation should allocate a buffer and ask the operating
system to read data into the buffer, then use whatever number of bytes
the operating system wrote into the buffer. This typically does the
right thing on Unix-like systems.
RETURN VALUES
Returns a single value; a bytevector or the end-of-file object.
EXAMPLES
(import (rnrs))
(define (char-rot13 c)
(cond ((and (char<=? #\a c #\z))
(integer->char
(+ (char->integer #\a)
(mod (+ (- (char->integer c) (char->integer #\a)) 13)
26))))
((and (char<=? #\A c #\Z))
(integer->char
(+ (char->integer #\A)
(mod (+ (- (char->integer c) (char->integer #\A)) 13)
26))))
(else c)))
;; This example unnecessarily works with binary ports
;; to demonstrate get-bytevector-some.
(let ((in (standard-input-port))
(out (standard-output-port)))
(let lp ()
(let ((bv (get-bytevector-some in)))
(unless (eof-object? bv)
(do ((i 0 (+ i 1)))
((= i (bytevector-length bv)))
(let* ((b (bytevector-u8-ref bv i))
(c (integer->char b))
(b^ (char->integer (char-rot13 c))))
(bytevector-u8-set! bv i b^)))
(put-bytevector out bv)
(flush-output-port out)
(lp)))))
APPLICATION USAGE
This procedure is normally used when the port is expected to be
connected to some byte source other than a file and the amount of data
to read is not known in advance. It may be an interactive terminal or
a network connection. The program above can be run interactively and
produce line-by-line output.
RATIONALE
Binary input ports are not always the simple streams of bytes they
seem to be. The other end of the port may be connected to a file, in
which case things are relatively simple. But the other end may also be
some type of buffer that is filled in bursts, possibly delimited by
end-of-file objects.
TCP sockets produce data in bursts and end with an infinite sequence
of end-of-file objects (or an I/O error). UDP sockets produce data in
one burst per datagram and can also signal errors via ICMP packets.
Interactive terminals produce data in bursts (one per character or
approximately one per line), and they can also produce end-of-file
objects (typically mapped to Ctrl-D).
The other procedures for reading from binary input ports, i.e.,
get-bytevector-n(3scm),
get-bytevector-n!(3scm),
and
get-bytevector-all(3scm),
specify a length or read all data and block as necessary to read that
number of bytes, or until an end-of-file is received. These procedures
therefore don't work when the data is produced in bursts that are not
separated by end-of-file objects.
COMPATIBILITY
This procedure is unique to R6RS and cannot be implemented in terms of
the other standard I/O procedures.
ERRORS
This procedure can raise exceptions with the following condition types:
- &assertion (R6RS)
-
The wrong number of arguments was passed or an argument was outside its domain.
In particular,
binary-input-port
must be an open binary input port.
- &i/o-read (R6RS)
-
There was an I/O error during the read operation.
- &i/o-port (R6RS)
-
This condition specifies the port object related to an
&i/o-read
condition.
SEE ALSO
get-bytevector-n(3scm),
open-file-input-port(3scm),
standard-input-port(3scm)
STANDARDS
R6RS
HISTORY
This procedure first appeared in R6RS. It corresponds to the semantics
of the
read(2)
syscall with some unspecified byte count.
AUTHORS
This page is part of the
scheme-manpages
project.
It includes materials from the RnRS documents.
More information can be found at
https://github.com/schemedoc/manpages/
.
Markup created by unroff 1.0sc, March 04, 2023.