diff options
author | Neil Jerram <neil@ossau.uklinux.net> | 2001-03-10 14:07:19 +0000 |
---|---|---|
committer | Neil Jerram <neil@ossau.uklinux.net> | 2001-03-10 14:07:19 +0000 |
commit | 451d273ac98c0b7f0e5e2c9e267ff14170babf23 (patch) | |
tree | fb9b9a4c6d83dc83bcd3399fbdc85ee55f54ad28 | |
parent | 97d0e20b2e19ac8e8b7310ce2a72a69f02ee6a60 (diff) | |
download | guile-451d273ac98c0b7f0e5e2c9e267ff14170babf23.tar.gz |
Make (ice-9 buffered-input) more general
-rw-r--r-- | ice-9/ChangeLog | 9 | ||||
-rw-r--r-- | ice-9/buffered-input.scm | 52 |
2 files changed, 44 insertions, 17 deletions
diff --git a/ice-9/ChangeLog b/ice-9/ChangeLog index d414850dc..0d43f134d 100644 --- a/ice-9/ChangeLog +++ b/ice-9/ChangeLog @@ -1,3 +1,12 @@ +2001-03-10 Neil Jerram <neil@ossau.uklinux.net> + + * buffered-input.scm (make-buffered-input-port): New, more general + buffered input procedure. Does not assume that a newline + character should be interpolated between chunks of input returned + by the reader proc. + (make-line-buffered-input-port): Redefine in terms of + make-buffered-input-port. + 2001-03-09 Keisuke Nishida <kxn30@po.cwru.edu> * match.scm: Don't export defstruct. Use (unquote defstruct) instead. diff --git a/ice-9/buffered-input.scm b/ice-9/buffered-input.scm index df42cd533..c289a58a3 100644 --- a/ice-9/buffered-input.scm +++ b/ice-9/buffered-input.scm @@ -18,7 +18,8 @@ ;;;; Boston, MA 02111-1307 USA (define-module (ice-9 buffered-input) - #:export (make-line-buffered-input-port + #:export (make-buffered-input-port + make-line-buffered-input-port set-buffered-input-continuation?!)) ;; @code{buffered-input-continuation?} is a property of the ports @@ -29,20 +30,18 @@ (define (set-buffered-input-continuation?! port val) "Set the read continuation flag for @var{port} to @var{val}. -See @code{make-line-buffered-input-port} for the meaning and use of -this flag." +See @code{make-buffered-input-port} for the meaning and use of this +flag." (set! (buffered-input-continuation? port) val)) -(define (make-line-buffered-input-port reader) +(define (make-buffered-input-port reader) "Construct a line-buffered input port from the specified @var{reader}. @var{reader} should be a procedure of one argument that somehow reads -a line of input and returns it as a string @emph{without} the -terminating newline character. +a chunk of input and returns it as a string. -The port created by @code{make-line-buffered-input-port} automatically -adds a newline character after each string returned by @var{reader}; -this makes these ports useful for reading strings that extend across -more than one input line. +The port created by @code{make-buffered-input-port} does @emph{not} +interpolate any additional characters between the strings returned by +@var{reader}. @var{reader} should take a boolean @var{continuation?} argument. @var{continuation?} indicates whether @var{reader} is being called to @@ -54,12 +53,12 @@ use the @var{continuation?} argument to determine what prompt to display to the user. The new/continuation distinction is largely an application-level -concept, and @code{set-buffered-input-continuation?!} allows an -application some control over when a read operation is considered to -be new. But note that if there is data already buffered in the port -when a new read operation starts, this data will be read before the -first call to @var{reader}, and so @var{reader} will be called with -@var{continuation?} set to @code{#t}." +concept: @code{set-buffered-input-continuation?!} allows an +application to specify when a read operation is considered to be new. +But note that if there is non-whitespace data already buffered in the +port when a new read operation starts, this data will be read before +the first call to @var{reader}, and so @var{reader} will be called +with @var{continuation?} set to @code{#t}." (let ((read-string "") (string-index -1)) (letrec ((get-character @@ -69,7 +68,7 @@ first call to @var{reader}, and so @var{reader} will be called with read-string) ((>= string-index (string-length read-string)) (set! string-index -1) - #\nl) + (get-character)) ((= string-index -1) (set! read-string (reader (buffered-input-continuation? port))) (set! string-index 0) @@ -87,4 +86,23 @@ first call to @var{reader}, and so @var{reader} will be called with (set! (buffered-input-continuation? port) #f) port))) +(define (make-line-buffered-input-port reader) + "Construct a line-buffered input port from the specified @var{reader}. +@var{reader} should be a procedure of one argument that somehow reads +a line of input and returns it as a string @emph{without} the +terminating newline character. + +The port created by @code{make-line-buffered-input-port} automatically +interpolates a newline character after each string returned by +@var{reader}. + +@var{reader} should take a boolean @var{continuation?} argument. For +the meaning and use of this argument, see +@code{make-buffered-input-port}." + (make-buffered-input-port (lambda (continuation?) + (let ((str (reader continuation?))) + (if (eof-object? str) + str + (string-append str "\n")))))) + ;;; buffered-input.scm ends here |