diff options
author | Hugo Hörnquist <hugo@hornquist.se> | 2019-11-03 14:46:28 +0100 |
---|---|---|
committer | Hugo Hörnquist <hugo@hornquist.se> | 2019-11-03 14:46:28 +0100 |
commit | 0f65e75ec0f56d3067a15e3671d9250fd2c1637a (patch) | |
tree | 40ddc24f08b42c767e02b6482133e9f7efe4b524 /module/util | |
parent | Remove 'none' output. (diff) | |
parent | Add descirption to strbuf. (diff) | |
download | calp-0f65e75ec0f56d3067a15e3671d9250fd2c1637a.tar.gz calp-0f65e75ec0f56d3067a15e3671d9250fd2c1637a.tar.xz |
Merge branch 'restruct'
Diffstat (limited to '')
-rw-r--r-- | module/util.scm | 12 | ||||
-rw-r--r-- | module/util/strbuf.scm | 52 |
2 files changed, 63 insertions, 1 deletions
diff --git a/module/util.scm b/module/util.scm index 89f6dab6..707cba90 100644 --- a/module/util.scm +++ b/module/util.scm @@ -11,7 +11,7 @@ quote? re-export-modules use-modules* - -> set + -> set aif tree-map let-lazy) #:replace (let* set! define-syntax when unless if)) @@ -44,6 +44,13 @@ ((@ (guile) if) p t (begin f ...))])) +(define-syntax aif + (lambda (stx) + (syntax-case stx () + [(_ condition true-clause false-clause) + (with-syntax ((it (datum->syntax stx 'it))) + #'(let ((it condition)) + (if it true-clause false-clause)))]))) (define-public upstring->symbol (compose string->symbol string-upcase)) @@ -356,6 +363,9 @@ (-> (func obj) rest ...)])) +;; Non-destructive set, syntax extension from set-fields from (srfi +;; srfi-9 gnu). Also doubles as a non-destructive mod!, if the `=' +;; operator is used. (define-syntax set (syntax-rules (=) [(set (acc obj) value) diff --git a/module/util/strbuf.scm b/module/util/strbuf.scm new file mode 100644 index 00000000..2b574e82 --- /dev/null +++ b/module/util/strbuf.scm @@ -0,0 +1,52 @@ +;;; 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) + :use-module ((rnrs io ports) + :select (bytevector->string native-transcoder)) + :use-module ((ice-9 optargs) :select (define*-public)) + ) + +(define-record-type <strbuf> + (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)))) + |