1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-29 16:30:19 +02:00

* rdelim.scm: new file implementing module (ice-9 rdelim).

* ice-9.scm (scm-line-incrementors read-line! read-delimited!
	read-delimited read-line): moved to rdelim.scm.
	scm-line-incrementors is not exported.
	* boot-9.scm: import (ice-9 rdelim) for backwards compatibility,
	for now.
	* lineio.scm: use module (ice-9 rdelim).
	* Makefile.am (ice9_sources): add rdelim.scm.
This commit is contained in:
Gary Houston 2001-01-21 22:11:29 +00:00
parent 4567ed787c
commit 9d7748147e
6 changed files with 218 additions and 162 deletions

37
NEWS
View file

@ -8,9 +8,7 @@ Changes since Guile 1.4:
* Changes to the distribution * Changes to the distribution
** New modules (oop goops) etc ** New modules (oop goops) etc.:
The new modules
(oop goops) (oop goops)
(oop goops describe) (oop goops describe)
@ -18,14 +16,8 @@ The new modules
(oop goops active-slot) (oop goops active-slot)
(oop goops composite-slot) (oop goops composite-slot)
plus some GOOPS utility modules have been added. The Guile Object Oriented Programming System (GOOPS) has been
integrated into Guile.
* Changes to the stand-alone interpreter
** GOOPS has been merged into Guile
The Guile Object Oriented Programming System has been integrated into
Guile.
Type Type
@ -75,6 +67,27 @@ Asking for the type of an object
See further in the GOOPS tutorial available in the guile-doc See further in the GOOPS tutorial available in the guile-doc
distribution in info (goops.info) and texinfo formats. distribution in info (goops.info) and texinfo formats.
** New module (ice-9 rdelim).
This exports the following procedures which were previously defined
in the root module:
read-line read-line! read-delimited read-delimited!
;; TODO: read-string!/partial %read-delimited! %read-line write-line
For backwards compatibility the definitions are also imported into the
root module in this version of Guile. However you should add:
(use-modules (ice-9 rdelim))
to any program which uses the definitions, since this may be removed
in in a future version.
Alternatively, if guile-scsh is installed, the (scsh rdelim) module
can be used for similar functionality.
* Changes to the stand-alone interpreter
** It's now possible to create modules with controlled environments ** It's now possible to create modules with controlled environments
Example: Example:
@ -283,7 +296,7 @@ current values of file descriptors 0, 1, and 2 in the parent process.
There is no such concept as a weak binding any more. There is no such concept as a weak binding any more.
** Removed constants: bignum-radix ** Removed constants: bignum-radix, scm-line-incrementors
* Changes to the gh_ interface * Changes to the gh_ interface

View file

@ -1,3 +1,14 @@
2001-01-21 Gary Houston <ghouston@arglist.com>
* rdelim.scm: new file implementing module (ice-9 rdelim).
* ice-9.scm (scm-line-incrementors read-line! read-delimited!
read-delimited read-line): moved to rdelim.scm.
scm-line-incrementors is not exported.
* boot-9.scm: import (ice-9 rdelim) for backwards compatibility,
for now.
* lineio.scm: use module (ice-9 rdelim).
* Makefile.am (ice9_sources): add rdelim.scm.
2000-12-29 Dirk Herrmann <D.Herrmann@tu-bs.de> 2000-12-29 Dirk Herrmann <D.Herrmann@tu-bs.de>
* boot-9.scm (root-module-closure, scm-module-closure): Remove * boot-9.scm (root-module-closure, scm-module-closure): Remove

View file

@ -28,7 +28,7 @@ ice9_sources = \
format.scm getopt-long.scm hcons.scm lineio.scm ls.scm \ format.scm getopt-long.scm hcons.scm lineio.scm ls.scm \
mapping.scm networking.scm null.scm optargs.scm poe.scm popen.scm \ mapping.scm networking.scm null.scm optargs.scm poe.scm popen.scm \
posix.scm psyntax.pp psyntax.ss q.scm r4rs.scm r5rs.scm \ posix.scm psyntax.pp psyntax.ss q.scm r4rs.scm r5rs.scm \
receive.scm srfi-8.scm \ rdelim.scm receive.scm srfi-8.scm \
regex.scm runq.scm safe-r5rs.scm safe.scm session.scm slib.scm \ regex.scm runq.scm safe-r5rs.scm safe.scm session.scm slib.scm \
streams.scm string-fun.scm syncase.scm tags.scm threads.scm streams.scm string-fun.scm syncase.scm tags.scm threads.scm

View file

@ -166,152 +166,6 @@
;;; {Line and Delimited I/O}
;;; corresponds to SCM_LINE_INCREMENTORS in libguile.
(define scm-line-incrementors "\n")
(define (read-line! string . maybe-port)
(let* ((port (if (pair? maybe-port)
(car maybe-port)
(current-input-port))))
(let* ((rv (%read-delimited! scm-line-incrementors
string
#t
port))
(terminator (car rv))
(nchars (cdr rv)))
(cond ((and (= nchars 0)
(eof-object? terminator))
terminator)
((not terminator) #f)
(else nchars)))))
(define (read-delimited! delims buf . args)
(let* ((num-args (length args))
(port (if (> num-args 0)
(car args)
(current-input-port)))
(handle-delim (if (> num-args 1)
(cadr args)
'trim))
(start (if (> num-args 2)
(caddr args)
0))
(end (if (> num-args 3)
(cadddr args)
(string-length buf))))
(let* ((rv (%read-delimited! delims
buf
(not (eq? handle-delim 'peek))
port
start
end))
(terminator (car rv))
(nchars (cdr rv)))
(cond ((or (not terminator) ; buffer filled
(eof-object? terminator))
(if (zero? nchars)
(if (eq? handle-delim 'split)
(cons terminator terminator)
terminator)
(if (eq? handle-delim 'split)
(cons nchars terminator)
nchars)))
(else
(case handle-delim
((trim peek) nchars)
((concat) (string-set! buf (+ nchars start) terminator)
(+ nchars 1))
((split) (cons nchars terminator))
(else (error "unexpected handle-delim value: "
handle-delim))))))))
(define (read-delimited delims . args)
(let* ((port (if (pair? args)
(let ((pt (car args)))
(set! args (cdr args))
pt)
(current-input-port)))
(handle-delim (if (pair? args)
(car args)
'trim)))
(let loop ((substrings ())
(total-chars 0)
(buf-size 100)) ; doubled each time through.
(let* ((buf (make-string buf-size))
(rv (%read-delimited! delims
buf
(not (eq? handle-delim 'peek))
port))
(terminator (car rv))
(nchars (cdr rv))
(join-substrings
(lambda ()
(apply string-append
(reverse
(cons (if (and (eq? handle-delim 'concat)
(not (eof-object? terminator)))
(string terminator)
"")
(cons (substring buf 0 nchars)
substrings))))))
(new-total (+ total-chars nchars)))
(cond ((not terminator)
;; buffer filled.
(loop (cons (substring buf 0 nchars) substrings)
new-total
(* buf-size 2)))
((eof-object? terminator)
(if (zero? new-total)
(if (eq? handle-delim 'split)
(cons terminator terminator)
terminator)
(if (eq? handle-delim 'split)
(cons (join-substrings) terminator)
(join-substrings))))
(else
(case handle-delim
((trim peek concat) (join-substrings))
((split) (cons (join-substrings) terminator))
(else (error "unexpected handle-delim value: "
handle-delim)))))))))
;;; read-line [PORT [HANDLE-DELIM]] reads a newline-terminated string
;;; from PORT. The return value depends on the value of HANDLE-DELIM,
;;; which may be one of the symbols `trim', `concat', `peek' and
;;; `split'. If it is `trim' (the default), the trailing newline is
;;; removed and the string is returned. If `concat', the string is
;;; returned with the trailing newline intact. If `peek', the newline
;;; is left in the input port buffer and the string is returned. If
;;; `split', the newline is split from the string and read-line
;;; returns a pair consisting of the truncated string and the newline.
(define (read-line . args)
(let* ((port (if (null? args)
(current-input-port)
(car args)))
(handle-delim (if (> (length args) 1)
(cadr args)
'trim))
(line/delim (%read-line port))
(line (car line/delim))
(delim (cdr line/delim)))
(case handle-delim
((trim) line)
((split) line/delim)
((concat) (if (and (string? line) (char? delim))
(string-append line (string delim))
line))
((peek) (if (char? delim)
(unread-char delim port))
line)
(else
(error "unexpected handle-delim value: " handle-delim)))))
;;; {Arrays} ;;; {Arrays}
;;; ;;;
@ -2483,6 +2337,7 @@
(read (current-input-port)))) (read (current-input-port))))
(define (scm-style-repl) (define (scm-style-repl)
(letrec ( (letrec (
(start-gc-rt #f) (start-gc-rt #f)
(start-rt #f) (start-rt #f)
@ -2770,6 +2625,7 @@
;;; {Load emacs interface support if emacs option is given.} ;;; {Load emacs interface support if emacs option is given.}
(define (load-emacs-interface) (define (load-emacs-interface)
@ -2779,14 +2635,16 @@
;; temporary, for backwards compatibility.
(use-modules (ice-9 rdelim))
(define using-readline? (define using-readline?
(let ((using-readline? (make-fluid))) (let ((using-readline? (make-fluid)))
(make-procedure-with-setter (make-procedure-with-setter
(lambda () (fluid-ref using-readline?)) (lambda () (fluid-ref using-readline?))
(lambda (v) (fluid-set! using-readline? v))))) (lambda (v) (fluid-set! using-readline? v)))))
;; this is just (scm-style-repl) with a wrapper to install and remove
;; signal handlers.
(define (top-repl) (define (top-repl)
;; Load emacs interface support if emacs option is given. ;; Load emacs interface support if emacs option is given.

View file

@ -20,7 +20,8 @@
(define-module (ice-9 lineio)) (define-module (ice-9 lineio)
:use-module (ice-9 readline))
;;; {Line Buffering Input Ports} ;;; {Line Buffering Input Ports}

173
ice-9/rdelim.scm Normal file
View file

@ -0,0 +1,173 @@
;;; installed-scm-file
;;;; Copyright (C) 1997 1999 2000 2001 Free Software Foundation, Inc.
;;;;
;;;; This program is free software; you can redistribute it and/or modify
;;;; it under the terms of the GNU General Public License as published by
;;;; the Free Software Foundation; either version 2, or (at your option)
;;;; any later version.
;;;;
;;;; This program is distributed in the hope that it will be useful,
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;;;; GNU General Public License for more details.
;;;;
;;;; You should have received a copy of the GNU General Public License
;;;; along with this software; see the file COPYING. If not, write to
;;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
;;;; Boston, MA 02111-1307 USA
;;;;
;;; Module for delimited I/O. This is similar to (scsh rdelim) but is
;;; somewhat incompatible.
(define-module (ice-9 rdelim))
(export read-line read-line! read-delimited read-delimited!)
;; TODO: split the C part of this module out of libguile and into its
;; own top-level directory.
;; (export read-string!/partial %read-delimited! %read-line write-line)
(define (read-line! string . maybe-port)
;; corresponds to SCM_LINE_INCREMENTORS in libguile.
(define scm-line-incrementors "\n")
(let* ((port (if (pair? maybe-port)
(car maybe-port)
(current-input-port))))
(let* ((rv (%read-delimited! scm-line-incrementors
string
#t
port))
(terminator (car rv))
(nchars (cdr rv)))
(cond ((and (= nchars 0)
(eof-object? terminator))
terminator)
((not terminator) #f)
(else nchars)))))
(define (read-delimited! delims buf . args)
(let* ((num-args (length args))
(port (if (> num-args 0)
(car args)
(current-input-port)))
(handle-delim (if (> num-args 1)
(cadr args)
'trim))
(start (if (> num-args 2)
(caddr args)
0))
(end (if (> num-args 3)
(cadddr args)
(string-length buf))))
(let* ((rv (%read-delimited! delims
buf
(not (eq? handle-delim 'peek))
port
start
end))
(terminator (car rv))
(nchars (cdr rv)))
(cond ((or (not terminator) ; buffer filled
(eof-object? terminator))
(if (zero? nchars)
(if (eq? handle-delim 'split)
(cons terminator terminator)
terminator)
(if (eq? handle-delim 'split)
(cons nchars terminator)
nchars)))
(else
(case handle-delim
((trim peek) nchars)
((concat) (string-set! buf (+ nchars start) terminator)
(+ nchars 1))
((split) (cons nchars terminator))
(else (error "unexpected handle-delim value: "
handle-delim))))))))
(define (read-delimited delims . args)
(let* ((port (if (pair? args)
(let ((pt (car args)))
(set! args (cdr args))
pt)
(current-input-port)))
(handle-delim (if (pair? args)
(car args)
'trim)))
(let loop ((substrings ())
(total-chars 0)
(buf-size 100)) ; doubled each time through.
(let* ((buf (make-string buf-size))
(rv (%read-delimited! delims
buf
(not (eq? handle-delim 'peek))
port))
(terminator (car rv))
(nchars (cdr rv))
(join-substrings
(lambda ()
(apply string-append
(reverse
(cons (if (and (eq? handle-delim 'concat)
(not (eof-object? terminator)))
(string terminator)
"")
(cons (substring buf 0 nchars)
substrings))))))
(new-total (+ total-chars nchars)))
(cond ((not terminator)
;; buffer filled.
(loop (cons (substring buf 0 nchars) substrings)
new-total
(* buf-size 2)))
((eof-object? terminator)
(if (zero? new-total)
(if (eq? handle-delim 'split)
(cons terminator terminator)
terminator)
(if (eq? handle-delim 'split)
(cons (join-substrings) terminator)
(join-substrings))))
(else
(case handle-delim
((trim peek concat) (join-substrings))
((split) (cons (join-substrings) terminator))
(else (error "unexpected handle-delim value: "
handle-delim)))))))))
;;; read-line [PORT [HANDLE-DELIM]] reads a newline-terminated string
;;; from PORT. The return value depends on the value of HANDLE-DELIM,
;;; which may be one of the symbols `trim', `concat', `peek' and
;;; `split'. If it is `trim' (the default), the trailing newline is
;;; removed and the string is returned. If `concat', the string is
;;; returned with the trailing newline intact. If `peek', the newline
;;; is left in the input port buffer and the string is returned. If
;;; `split', the newline is split from the string and read-line
;;; returns a pair consisting of the truncated string and the newline.
(define (read-line . args)
(let* ((port (if (null? args)
(current-input-port)
(car args)))
(handle-delim (if (> (length args) 1)
(cadr args)
'trim))
(line/delim (%read-line port))
(line (car line/delim))
(delim (cdr line/delim)))
(case handle-delim
((trim) line)
((split) line/delim)
((concat) (if (and (string? line) (char? delim))
(string-append line (string delim))
line))
((peek) (if (char? delim)
(unread-char delim port))
line)
(else
(error "unexpected handle-delim value: " handle-delim)))))