summaryrefslogtreecommitdiff
path: root/module/rnrs
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2016-06-21 11:27:21 +0200
committerAndy Wingo <wingo@pobox.com>2016-06-21 11:29:14 +0200
commit4e27e3c054442189f05355f631176d94b4f5019f (patch)
treecc11727a020d3a152f08936d3f55bd6e30d242fd /module/rnrs
parent59f062ec78bca8ac08284771cc09fdb272888f07 (diff)
downloadguile-4e27e3c054442189f05355f631176d94b4f5019f.tar.gz
Add R6RS bytevector->string, string->bytevector
* module/rnrs/io/ports.scm (string->bytevector): (bytevector->string): New procedures. * module/rnrs.scm: Export new procedures. * test-suite/tests/r6rs-ports.test: Add string->bytevector and bytevector->string tests.
Diffstat (limited to 'module/rnrs')
-rw-r--r--module/rnrs/io/ports.scm31
1 files changed, 31 insertions, 0 deletions
diff --git a/module/rnrs/io/ports.scm b/module/rnrs/io/ports.scm
index 8ff674894..5ddc3d58d 100644
--- a/module/rnrs/io/ports.scm
+++ b/module/rnrs/io/ports.scm
@@ -36,6 +36,9 @@
transcoder-error-handling-mode native-transcoder
latin-1-codec utf-8-codec utf-16-codec
+ ;; transcoding bytevectors
+ bytevector->string string->bytevector
+
;; input & output ports
port? input-port? output-port?
port-eof?
@@ -110,6 +113,7 @@
(only (ice-9 ports internal)
port-write-buffer port-buffer-bytevector port-line-buffered?)
(only (rnrs bytevectors) bytevector-length)
+ (prefix (ice-9 iconv) iconv:)
(rnrs enums)
(rnrs records syntactic)
(rnrs exceptions)
@@ -173,6 +177,33 @@
;;;
+;;; Transcoding bytevectors
+;;;
+
+(define (string->bytevector str transcoder)
+ "Encode @var{str} using @var{transcoder}, returning a bytevector."
+ (iconv:string->bytevector
+ str
+ (transcoder-codec transcoder)
+ (case (transcoder-error-handling-mode transcoder)
+ ((raise) 'error)
+ ((replace) 'substitute)
+ (else (error "unsupported error handling mode"
+ (transcoder-error-handling-mode transcoder))))))
+
+(define (bytevector->string bv transcoder)
+ "Decode @var{bv} using @var{transcoder}, returning a string."
+ (iconv:bytevector->string
+ bv
+ (transcoder-codec transcoder)
+ (case (transcoder-error-handling-mode transcoder)
+ ((raise) 'error)
+ ((replace) 'substitute)
+ (else (error "unsupported error handling mode"
+ (transcoder-error-handling-mode transcoder))))))
+
+
+;;;
;;; Internal helpers
;;;