summaryrefslogtreecommitdiff
path: root/module
diff options
context:
space:
mode:
authorAdam Faiz <adam.faiz@disroot.org>2024-12-19 22:36:38 +0100
committerMikael Djurfeldt <mikael@djurfeldt.com>2024-12-19 22:36:38 +0100
commitc2829e4a86d6fc72520930825bd44900d876db1d (patch)
tree9a4882c7a6202346cb9d254a08654ccc0e7552db /module
parenta9c079b13b74e46ccdea6e2d4b5209b0f7a2005a (diff)
downloadguile-c2829e4a86d6fc72520930825bd44900d876db1d.tar.gz
New line or field iteration procedures in (ice-9 rdelim)
* NEWS: Update * module/ice-9/rdelim (for-rdelim-from-port, for-delimited-from-port, for-line-in-file): New procedures. * doc/ref/api-io.texi: Documentation of `for-rdelim-for-port`-related procedures. * test-suite/tests/rdelim.test: Tests for `for-rdelim-for-port`-related procedures. Signed-off-by: Mikael Djurfeldt <mikael@djurfeldt.com>
Diffstat (limited to 'module')
-rw-r--r--module/ice-9/rdelim.scm35
1 files changed, 34 insertions, 1 deletions
diff --git a/module/ice-9/rdelim.scm b/module/ice-9/rdelim.scm
index d2cd081d7..65d1932fc 100644
--- a/module/ice-9/rdelim.scm
+++ b/module/ice-9/rdelim.scm
@@ -23,7 +23,10 @@
;;; similar to (scsh rdelim) but somewhat incompatible.
(define-module (ice-9 rdelim)
- #:export (read-line
+ #:export (for-delimited-from-port
+ for-line-in-file
+ for-rdelim-from-port
+ read-line
read-line!
read-delimited
read-delimited!
@@ -206,3 +209,33 @@ characters to read. By default, there is no limit."
line)
(else
(error "unexpected handle-delim value: " handle-delim)))))
+
+(define* (for-rdelim-from-port port proc rdelim-proc
+ #:key (stop-pred eof-object?))
+ "Call PROC for every (RDELIM-PROC PORT) from PORT until STOP-PRED returns #t.
+RDELIM-PROC has to advance through PORT with every call."
+ (let loop ((rdelim (rdelim-proc port)))
+ (cond ((stop-pred rdelim)
+ (close-port port))
+ (else
+ (proc rdelim)
+ (loop (rdelim-proc port))))))
+
+(define* (for-delimited-from-port port proc
+ #:key (delims "\n") (handle-delim 'trim))
+ "Call PROC for every delimited line from PORT until the eof-object is reached."
+ (for-rdelim-from-port port proc
+ (lambda (port)
+ (read-delimited delims port handle-delim))))
+
+(define* (for-line-in-file file proc
+ #:key (encoding #f) (guess-encoding #f))
+ "Call PROC for every line in FILE until the eof-object is reached.
+FILE must be a filename string.
+
+The line provided to PROC is guaranteed to be a string."
+ (call-with-input-file
+ file
+ (lambda (port)
+ (for-delimited-from-port port proc))
+ #:encoding encoding #:guess-encoding guess-encoding))