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:
parent
4567ed787c
commit
9d7748147e
6 changed files with 218 additions and 162 deletions
37
NEWS
37
NEWS
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
154
ice-9/boot-9.scm
154
ice-9/boot-9.scm
|
@ -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.
|
||||||
|
|
|
@ -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
173
ice-9/rdelim.scm
Normal 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)))))
|
Loading…
Add table
Add a link
Reference in a new issue