summaryrefslogtreecommitdiff
path: root/module/rnrs/io
diff options
context:
space:
mode:
authorAndreas Rottmann <a.rottmann@gmx.at>2011-03-13 22:39:14 +0100
committerLudovic Courtès <ludo@gnu.org>2011-03-13 22:39:14 +0100
commita6c377f7d8a311b0ce4f9c5900b1c81c27b2d60c (patch)
tree7a4bc6be9ea639d40c53385b1e2858ed717a8099 /module/rnrs/io
parentca33b501a93f8de389c1e3e1bc987f63b6912029 (diff)
downloadguile-a6c377f7d8a311b0ce4f9c5900b1c81c27b2d60c.tar.gz
Add `get-string-n' and `get-string-n!' for R6RS ports
* libguile/r6rs-ports.c (scm_get_string_n_x): Implement `get-string-n!' in C for efficiency. * libguile/r6rs-ports.h: Add prototype for this function. * module/ice-9/binary-ports.scm: Export `get-string-n!'. * module/rnrs/io/ports.scm (get-string-n): Implement based on `get-string-n!'. Export both `get-string-n!' and `get-string-n'. * module/rnrs.scm: Also export these. * test-suite/tests/r6rs-ports.test (8.2.9 Textual input): Add a few tests for `get-string-n' and `get-string-n!'. Signed-off-by: Ludovic Courtès <ludo@gnu.org>
Diffstat (limited to 'module/rnrs/io')
-rw-r--r--module/rnrs/io/ports.scm16
1 files changed, 14 insertions, 2 deletions
diff --git a/module/rnrs/io/ports.scm b/module/rnrs/io/ports.scm
index d3a81b7c7..d3b16ac63 100644
--- a/module/rnrs/io/ports.scm
+++ b/module/rnrs/io/ports.scm
@@ -68,8 +68,9 @@
put-u8 put-bytevector
;; textual input
- get-char get-datum get-line get-string-all lookahead-char
-
+ get-char get-datum get-line get-string-all get-string-n get-string-n!
+ lookahead-char
+
;; textual output
put-char put-datum put-string
@@ -386,6 +387,17 @@ return the characters accumulated in that port."
(define (get-string-all port)
(with-i/o-decoding-error (read-delimited "" port 'concat)))
+(define (get-string-n port count)
+ "Read up to @var{count} characters from @var{port}.
+If no characters could be read before encountering the end of file,
+return the end-of-file object, otherwise return a string containing
+the characters read."
+ (let* ((s (make-string count))
+ (rv (get-string-n! port s 0 count)))
+ (cond ((eof-object? rv) rv)
+ ((= rv count) s)
+ (else (substring/shared s 0 rv)))))
+
(define (lookahead-char port)
(with-i/o-decoding-error (peek-char port)))