diff options
author | Maxime Devos <maximedevos@telenet.be> | 2021-03-16 21:29:48 +0100 |
---|---|---|
committer | Maxime Devos <maximedevos@telenet.be> | 2021-09-21 12:08:37 +0200 |
commit | 82826b558a1a50239e55c533574aeb1491f1086e (patch) | |
tree | c7e736f212ce048d2a3863e30ce8d0c3235c7425 /gnu/gnunet/utils | |
parent | 22c3902c579d830027a6823816102482bd067ff1 (diff) | |
download | gnunet-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.scm | 46 |
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 | ||
203 | the 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))) | ||