From bd9733926076885e3417b74de76e4c9c7bc56254 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Mon, 20 Feb 2017 00:05:28 -0800 Subject: Import Upstream version 2c7 --- lineio.scm | 68 +++++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 50 insertions(+), 18 deletions(-) (limited to 'lineio.scm') diff --git a/lineio.scm b/lineio.scm index ad8320b..c80ece8 100644 --- a/lineio.scm +++ b/lineio.scm @@ -17,34 +17,66 @@ ;promotional, or sales literature without prior written consent in ;each case. -(define (read-line . arg) - (let* ((char (apply read-char arg))) + +;;@args +;;@args port +;;Returns a string of the characters up to, but not including a +;;newline or end of file, updating @var{port} to point to the +;;character following the newline. If no characters are available, an +;;end of file object is returned. The @var{port} argument may be +;;omitted, in which case it defaults to the value returned by +;;@code{current-input-port}. +(define (read-line . port) + (let* ((char (apply read-char port))) (if (eof-object? char) char - (do ((char char (apply read-char arg)) + (do ((char char (apply read-char port)) (clist '() (cons char clist))) ((or (eof-object? char) (char=? #\newline char)) (list->string (reverse clist))))))) -(define (read-line! str . arg) - (let* ((char (apply read-char arg)) - (len (+ -1 (string-length str)))) +;;@args string +;;@args string port +;;Fills @1 with characters up to, but not including a newline or end +;;of file, updating the @var{port} to point to the last character read +;;or following the newline if it was read. If no characters are +;;available, an end of file object is returned. If a newline or end +;;of file was found, the number of characters read is returned. +;;Otherwise, @code{#f} is returned. The @var{port} argument may be +;;omitted, in which case it defaults to the value returned by +;;@code{current-input-port}. +(define (read-line! str . port) + (let* ((char (apply read-char port)) + (midx (+ -1 (string-length str)))) (if (eof-object? char) char - (do ((char char (apply read-char arg)) + (do ((char char (apply read-char port)) (i 0 (+ 1 i))) ((or (eof-object? char) (char=? #\newline char) - (>= i len)) - (cond ((or (eof-object? char) (char=? #\newline char)) - i) - (else - (string-set! str i char) - (set! char (apply peek-char arg)) - (if (or (eof-object? char) (char=? #\newline char)) - (+ 1 i) #f)))) + (> i midx)) + (if (> i midx) #f i)) (string-set! str i char))))) -(define (write-line str . arg) - (apply display str arg) - (apply newline arg)) +;;@args string +;;@args string port +;;Writes @1 followed by a newline to the given @var{port} and returns +;;an unspecified value. The @var{Port} argument may be omited, in +;;which case it defaults to the value returned by +;;@code{current-input-port}.@refill +(define (write-line str . port) + (apply display str port) + (apply newline port)) + +;;@args path +;;@args path port +;;Displays the contents of the file named by @1 to @var{port}. The +;;@var{port} argument may be ommited, in which case it defaults to the +;;value returned by @code{current-output-port}. +(define (display-file path . port) + (set! port (if (null? port) (current-output-port) (car port))) + (call-with-input-file path + (lambda (inport) + (do ((line (read-line inport) (read-line inport))) + ((eof-object? line)) + (write-line line port))))) -- cgit v1.2.3