From a7af480101881af9e007453c0003328fde89f3b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Sun, 3 Nov 2019 14:44:27 +0100 Subject: Move strbuf to own file. --- module/util/strbuf.scm | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 module/util/strbuf.scm (limited to 'module/util/strbuf.scm') diff --git a/module/util/strbuf.scm b/module/util/strbuf.scm new file mode 100644 index 00000000..9c1b1e6a --- /dev/null +++ b/module/util/strbuf.scm @@ -0,0 +1,47 @@ +(define-module (util strbuf) + :use-module (srfi srfi-9) + :use-module (rnrs bytevectors) + :use-module ((rnrs io ports) + :select (bytevector->string native-transcoder)) + :use-module ((ice-9 optargs) :select (define*-public)) + ) + +(define-record-type + (make-strbuf% len bytes) + strbuf? + (len get-length set-length!) + (bytes get-bytes set-bytes!)) + +(define-public (make-strbuf) + (make-strbuf% 0 (make-u8vector #x1000))) + +(define (strbuf-realloc! strbuf) + (let* ((len (u8vector-length (get-bytes strbuf))) + (nv (make-u8vector (ash len 1)))) + (bytevector-copy! (get-bytes strbuf) 0 + nv 0 len) + (set-bytes! strbuf nv))) + +;; TODO charset +(define*-public (strbuf->string strbuf #:optional + (transcoder (native-transcoder))) + (let ((bv (make-u8vector (get-length strbuf)))) + (bytevector-copy! (get-bytes strbuf) 0 + bv 0 + (get-length strbuf)) + (bytevector->string bv transcoder))) + +(define-public (strbuf-reset! strbuf) + (set-length! strbuf 0)) + +(define-public (strbuf-append! strbuf u8) + (catch 'out-of-range + (lambda () + (u8vector-set! (get-bytes strbuf) + (get-length strbuf) + u8)) + (lambda (err . args) + (strbuf-realloc! strbuf) + (strbuf-append! strbuf u8))) + (set-length! strbuf (1+ (get-length strbuf)))) + -- cgit v1.2.3 From 56a72ae506821cc37a6bdf1e74d0bfb158c36f99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Sun, 3 Nov 2019 14:45:52 +0100 Subject: Add descirption to strbuf. --- module/util/strbuf.scm | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'module/util/strbuf.scm') diff --git a/module/util/strbuf.scm b/module/util/strbuf.scm index 9c1b1e6a..2b574e82 100644 --- a/module/util/strbuf.scm +++ b/module/util/strbuf.scm @@ -1,3 +1,8 @@ +;;; Description: +;; Alternative class to regular string, optimized for really fast appending, +;; Works on a byte level, and isn't really good for anything else. +;;; Code: + (define-module (util strbuf) :use-module (srfi srfi-9) :use-module (rnrs bytevectors) -- cgit v1.2.3