gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet-scheme] 31/324: fix netstruct, and implement wrap-reader-setter


From: gnunet
Subject: [gnunet-scheme] 31/324: fix netstruct, and implement wrap-reader-setter
Date: Tue, 21 Sep 2021 13:21:11 +0200

This is an automated email from the git hooks/post-receive script.

maxime-devos pushed a commit to branch master
in repository gnunet-scheme.

commit 643cb8be6ea2bf7930340df128650945b5292967
Author: Maxime Devos <maximedevos@telenet.be>
AuthorDate: Mon Jan 4 16:29:28 2021 +0100

    fix netstruct, and implement wrap-reader-setter
---
 gnu/gnunet/utils/netstruct.scm | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/gnu/gnunet/utils/netstruct.scm b/gnu/gnunet/utils/netstruct.scm
index b7ca44b..913e064 100644
--- a/gnu/gnunet/utils/netstruct.scm
+++ b/gnu/gnunet/utils/netstruct.scm
@@ -32,7 +32,8 @@
          u16/big u32/big u64/big
          u16/little u32/little u64/little
          structure/packed
-         sizeof offset select read% set!%)
+         wrap-reader-setter
+         sizeof offset select read% set%!)
   (import (rnrs base)
          (srfi srfi-26)
          (gnu gnunet utils bv-slice))
@@ -141,6 +142,9 @@
     ((4 slice-u32-ref slice-u64-set!) (u32/big u32/little))
     ((8 slice-u32-ref slice-u64-set!) (u64/big u64/little)))
 
+  ;; FIXME ideally field names would be symbols,
+  ;; not strings, but I can't get this to work
+  ;; with symbols.
   (define-syntax structure/packed
     (syntax-rules ::: ()
       ((_)
@@ -151,8 +155,7 @@
       ((_ (field-name field-type) (field-name* field-type*) :::)
        (syntax-rules (:sizeof :offset :select
                      :reader-for-field :setter-for-field
-                     :reader :setter
-                     field-name field-name* :::)
+                     :reader :setter)
         ((% :sizeof ())
          (+ (field-type :sizeof ())
             (field-type* :sizeof ())
@@ -207,6 +210,25 @@
              (lambda (slice x)
                (fset (fsel slice) x)))))))))
 
+  (define-syntax wrap-reader-setter
+    (syntax-rules ()
+      ((_ internal internal->wrap wrap->internal)
+       (syntax-rules (:sizeof :offset :reader :setter)
+        ((% :sizeof rest)
+         (internal :sizeof rest))
+        ((% :offset ())
+         (internal :offset ()))
+        ((% :reader ())
+         (let ((internal-reader (internal :reader ()))
+               (internal->wrap/expanded internal->wrap))
+           (lambda (slice)
+             (internal->wrap (internal-reader slice)))))
+        ((% :setter ())
+         (let ((internal-setter (internal :setter ()))
+               (wrap->internal/expanded wrap->internal))
+           (lambda (slice wrapped)
+             (internal-setter slice (wrap->internal wrapped)))))))))
+
   (define-syntax syntax-method
     (syntax-rules ()
       ((_ () method)

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]