Bugfixes bytevectors.
authorJan Nieuwenhuizen <janneke@gnu.org>
Wed, 4 Jan 2017 19:20:15 +0000 (20:20 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Wed, 4 Jan 2017 20:44:38 +0000 (21:44 +0100)
* math.c (modulo): Modulo of negative value correctly.
* module/mes/bytevectors.mes (bytevector-u32-native-set!):
  (bytevector-u16-native-set!): Use ash instead of quotient.

math.c
module/rnrs/bytevectors.mes

diff --git a/math.c b/math.c
index 8b7ebb35796784dc329937a6e9c80a2062a60e82..b2ca402edd13ec4c7574fa8411d9f2618513fea2 100644 (file)
--- a/math.c
+++ b/math.c
@@ -115,7 +115,9 @@ modulo (SCM a, SCM b)
 {
   assert (TYPE (a) == NUMBER);
   assert (TYPE (b) == NUMBER);
-  return MAKE_NUMBER (VALUE (a) % VALUE (b));
+  int x = VALUE (a);
+  while (x < 0) x += VALUE (b);
+  return MAKE_NUMBER (x % VALUE (b));
 }
 
 SCM
index 15fc1883945706f9ef891732193899d139117eba..2deb0107211f389ef2e490d8945fc2a039dc32ea 100644 (file)
@@ -1,7 +1,7 @@
 ;;; -*-scheme-*-
 
 ;;; Mes --- Maxwell Equations of Software
-;;; Copyright © 2016 Jan Nieuwenhuizen <janneke@gnu.org>
+;;; Copyright © 2016,2017 Jan Nieuwenhuizen <janneke@gnu.org>
 ;;;
 ;;; This file is part of Mes.
 ;;;
   (when (not (= 0 index)) (error "bytevector-u32-native-set! index not zero: " index " value: " value))
   (let ((x (list
             (modulo value #x100)
-            (quotient (modulo value #x10000) #x100)
-            (quotient (modulo value #x1000000) #x10000)
-            (quotient value #x1000000))))
+            (modulo (ash value -8) #x100)
+            (modulo (ash value -16) #x100)
+            (modulo (ash value -24) #x100))))
     (set-car! bv (car x))
     (set-cdr! bv (cdr x))
     x))
 
 (define (bytevector-u16-native-set! bv index value)
   (when (not (= 0 index)) (error "bytevector-u16-native-set! index not zero: " index " value: " value))
-  (let ((x (list (modulo value #x100)
-                 (quotient (modulo value #x10000) #x100))))
+  (let ((x (list
+            (modulo value #x100)
+            (modulo (ash value -8) #x100))))
     (set-car! bv (car x))
     (set-cdr! bv (cdr x))
     x))