aboutsummaryrefslogtreecommitdiff
path: root/gnu/gnunet/utils
diff options
context:
space:
mode:
authorMaxime Devos <maximedevos@telenet.be>2021-03-16 21:29:48 +0100
committerMaxime Devos <maximedevos@telenet.be>2021-09-21 12:08:37 +0200
commit82826b558a1a50239e55c533574aeb1491f1086e (patch)
treec7e736f212ce048d2a3863e30ce8d0c3235c7425 /gnu/gnunet/utils
parent22c3902c579d830027a6823816102482bd067ff1 (diff)
downloadgnunet-scheme-82826b558a1a50239e55c533574aeb1491f1086e.tar.gz
gnunet-scheme-82826b558a1a50239e55c533574aeb1491f1086e.zip
Define slice-copy! and slice-zero!.
These will be used for the ancillary message parsing code, which will be used to generate more detailed network error messages than what can be interferenced from the errno. * tests/bv-slice.scm: New test file, testing slice-copy! and slice-zero! * gnu/gnunet/utils/bv-slice.scm (slice-zero!, slice-copy!): New procedures. Also comment the module more. * Makefile.am (SCM_TESTS): Register tests/bv-slice.scm.
Diffstat (limited to 'gnu/gnunet/utils')
-rw-r--r--gnu/gnunet/utils/bv-slice.scm46
1 files changed, 38 insertions, 8 deletions
diff --git a/gnu/gnunet/utils/bv-slice.scm b/gnu/gnunet/utils/bv-slice.scm
index 4dfbc2c..a4156b9 100644
--- a/gnu/gnunet/utils/bv-slice.scm
+++ b/gnu/gnunet/utils/bv-slice.scm
@@ -1,5 +1,5 @@
1;; This file is part of scheme-GNUnet, a partial Scheme port of GNUnet. 1;; This file is part of scheme-GNUnet, a partial Scheme port of GNUnet.
2;; Copyright (C) 2020 Maxime Devos <maxime.devos@student.kuleuven.be> 2;; Copyright (C) 2020, 2021 Maxime Devos <maximedevos@telenet.be>
3;; 3;;
4;; scheme-GNUnet is free software: you can redistribute it and/or modify it 4;; scheme-GNUnet is free software: you can redistribute it and/or modify it
5;; under the terms of the GNU Affero General Public License as published 5;; under the terms of the GNU Affero General Public License as published
@@ -15,11 +15,6 @@
15;; along with this program. If not, see <http://www.gnu.org/licenses/>. 15;; along with this program. If not, see <http://www.gnu.org/licenses/>.
16;; 16;;
17;; SPDX-License-Identifier: AGPL-3.0-or-later 17;; SPDX-License-Identifier: AGPL-3.0-or-later
18;;
19;; As a special exception to the GNU Affero General Public License,
20;; the file may be relicensed under any license used for
21;; most source code of GNUnet 0.13.1, or later versions, as published by
22;; GNUnet e.V.
23 18
24;; Author: Maxime Devos 19;; Author: Maxime Devos
25;; Source: gnu/gnunet/utils/bv-slice.scm 20;; Source: gnu/gnunet/utils/bv-slice.scm
@@ -28,6 +23,7 @@
28 23
29(library (gnu gnunet utils bv-slice) 24(library (gnu gnunet utils bv-slice)
30 (export slice? 25 (export slice?
26 ;; Slicing
31 slice-bv 27 slice-bv
32 slice-offset 28 slice-offset
33 slice-length 29 slice-length
@@ -39,6 +35,7 @@
39 slice/read-only 35 slice/read-only
40 slice/write-only 36 slice/write-only
41 slice/read-write 37 slice/read-write
38 ;; Small operations
42 slice-u8-ref 39 slice-u8-ref
43 slice-u16-ref 40 slice-u16-ref
44 slice-u32-ref 41 slice-u32-ref
@@ -46,13 +43,18 @@
46 slice-u8-set! 43 slice-u8-set!
47 slice-u16-set! 44 slice-u16-set!
48 slice-u32-set! 45 slice-u32-set!
49 slice-u64-set!) 46 slice-u64-set!
47 ;; Large operations
48 slice-copy!
49 slice-zero!)
50 (import (rnrs arithmetic bitwise) 50 (import (rnrs arithmetic bitwise)
51 (rnrs base) 51 (rnrs base)
52 (rnrs bytevectors) 52 (rnrs bytevectors)
53 (rnrs control) 53 (rnrs control)
54 (rnrs records syntactic) 54 (rnrs records syntactic)
55 (srfi srfi-31)) 55 (srfi srfi-31))
56
57 ;; Slicing
56 58
57 (define-record-type (<slice> %make-slice slice?) 59 (define-record-type (<slice> %make-slice slice?)
58 ;; TODO: perhaps use pointer->bytevector 60 ;; TODO: perhaps use pointer->bytevector
@@ -150,6 +152,9 @@ the bytevector in place."
150 (define slice/read-write 152 (define slice/read-write
151 (make-select-capabilities (bitwise-ior CAP_READ CAP_WRITE))) 153 (make-select-capabilities (bitwise-ior CAP_READ CAP_WRITE)))
152 154
155
156 ;; ‘Small’ operations
157
153 (define (wrap-rnrs-ref rnrs-ref ok? size) 158 (define (wrap-rnrs-ref rnrs-ref ok? size)
154 (lambda (slice index . rest) 159 (lambda (slice index . rest)
155 (assert (and (exact? index) 160 (assert (and (exact? index)
@@ -177,4 +182,29 @@ the bytevector in place."
177 (define slice-u32-set! 182 (define slice-u32-set!
178 (wrap-rnrs-ref bytevector-u32-set! slice-writable? 4)) 183 (wrap-rnrs-ref bytevector-u32-set! slice-writable? 4))
179 (define slice-u64-set! 184 (define slice-u64-set!
180 (wrap-rnrs-ref bytevector-u64-set! slice-writable? 8))) 185 (wrap-rnrs-ref bytevector-u64-set! slice-writable? 8))
186
187
188 ;; ‘Large’ operations.
189
190 (define (slice-zero! slice)
191 "Zero out the writable slice @var{slice}."
192 (assert (slice-writable? slice))
193 ;; TODO optimise this and/or optimise guile's compiler
194 ;; w.r.t. bytevectors, structs and type inference.
195 (let loop ((i 0))
196 (when (< i (slice-length slice))
197 (slice-u8-set! slice i 0)
198 (loop (+ i 1))))
199 (values))
200
201 (define (slice-copy! from to)
202 "Copy the contents of the readable slice @var{from} to
203the writable slice @var{slice}. The slices may overlap."
204 (assert (slice-readable? from))
205 (assert (slice-writable? to))
206 (assert (= (slice-length from) (slice-length to)))
207 (bytevector-copy! (slice-bv from) (slice-offset from)
208 (slice-bv to) (slice-offset to)
209 (slice-length from))
210 (values)))