* Added uint-list->bytevector and sint-list->bytevector.
This commit is contained in:
parent
d62c01dfa7
commit
913bd590b6
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -6,7 +6,8 @@
|
|||
bytevector-fill! bytevector-copy bytevector=?
|
||||
bytevector-uint-ref bytevector-sint-ref
|
||||
bytevector-uint-set! bytevector-sint-set!
|
||||
bytevector->uint-list bytevector->sint-list)
|
||||
bytevector->uint-list bytevector->sint-list
|
||||
uint-list->bytevector sint-list->bytevector)
|
||||
(import
|
||||
(except (ikarus)
|
||||
make-bytevector bytevector-length bytevector-s8-ref
|
||||
|
@ -15,7 +16,8 @@
|
|||
bytevector-fill! bytevector-copy bytevector=?
|
||||
bytevector-uint-ref bytevector-sint-ref
|
||||
bytevector-uint-set! bytevector-sint-set!
|
||||
bytevector->uint-list bytevector->sint-list)
|
||||
bytevector->uint-list bytevector->sint-list
|
||||
uint-list->bytevector sint-list->bytevector)
|
||||
(ikarus system $fx)
|
||||
(ikarus system $bignums)
|
||||
(ikarus system $pairs)
|
||||
|
@ -393,64 +395,72 @@
|
|||
(unless ($fx= i j)
|
||||
($bytevector-set! x i 0)
|
||||
(bv-zero! x ($fxadd1 i) j)))
|
||||
(define (lbn-neg-copy! x xi n ni xj nj c)
|
||||
(cond
|
||||
[($fx= ni nj)
|
||||
(case ($fxsra c 7)
|
||||
[(#x01) ;;; borrow is 0, last byte was negative
|
||||
(bv-neg-zero! x xi xj)]
|
||||
[(#x00) ;;; borrow is 0, last byte was positive
|
||||
(if ($fx< xi xj)
|
||||
(bv-neg-zero! x xi xj)
|
||||
(error 'bytevector-sint-set! "number ~s does not fit" n))]
|
||||
[else (error 'lbn-neg-copy! "BUG: not handled ~s" c)])]
|
||||
[else
|
||||
(let ([c ($fx- ($fx+ 255 ($fxsra c 8)) ($bignum-byte-ref n ni))])
|
||||
(lbn-neg-copy! x ($fxadd1 xi) n ($fxadd1 ni) xj nj c)
|
||||
($bytevector-set! x xi ($fxlogand c 255)))]))
|
||||
(define (bbn-neg-copy! x xi n ni xj nj c)
|
||||
(cond
|
||||
[($fx= ni nj)
|
||||
(case ($fxsra c 7)
|
||||
[(#x01) ;;; borrow is 0, last byte was negative
|
||||
(bv-neg-zero! x xi xj)]
|
||||
[(#x00) ;;; borrow is 0, last byte was positive
|
||||
(if ($fx< xi xj)
|
||||
(bv-neg-zero! x xi xj)
|
||||
(error 'bytevector-sint-set! "number ~s does not fit" n))]
|
||||
[else (error 'bbn-neg-copy! "BUG: not handled ~s" c)])]
|
||||
[else
|
||||
(let ([c ($fx- ($fx+ 255 ($fxsra c 8)) ($bignum-byte-ref n ni))]
|
||||
[xj ($fxsub1 xj)])
|
||||
(bbn-neg-copy! x xi n ($fxadd1 ni) xj nj c)
|
||||
($bytevector-set! x xj ($fxlogand c 255)))]))
|
||||
(define (lbn-pos-copy! x xi n ni nj xj c)
|
||||
(cond
|
||||
[($fx= ni nj)
|
||||
(cond
|
||||
[(or ($fx<= c 127) ($fx< xi xj))
|
||||
;;; last byte was positive
|
||||
(bv-zero! x xi xj)]
|
||||
[else
|
||||
(error 'bytevector-sint-set! "number ~s does not fit" n)])]
|
||||
[else
|
||||
(let ([c ($bignum-byte-ref n ni)])
|
||||
(lbn-pos-copy! x ($fxadd1 xi) n ($fxadd1 ni) nj xj c)
|
||||
($bytevector-set! x xi ($fxlogand c 255)))]))
|
||||
(define (bbn-pos-copy! x xi n ni nj xj c)
|
||||
(cond
|
||||
[($fx= ni nj)
|
||||
(cond
|
||||
[(or ($fx<= c 127) ($fx< xi xj))
|
||||
;;; last byte was positive
|
||||
(bv-zero! x xi xj)]
|
||||
[else
|
||||
(error 'bytevector-sint-set! "number ~s does not fit" n)])]
|
||||
[else
|
||||
(let ([c ($bignum-byte-ref n ni)]
|
||||
[xj ($fxsub1 xj)])
|
||||
(bbn-pos-copy! x xi n ($fxadd1 ni) nj xj c)
|
||||
($bytevector-set! x xj ($fxlogand c 255)))]))
|
||||
(define (make-lbn-neg-copy! who)
|
||||
(define (lbn-neg-copy! x xi n ni xj nj c)
|
||||
(cond
|
||||
[($fx= ni nj)
|
||||
(case ($fxsra c 7)
|
||||
[(#x01) ;;; borrow is 0, last byte was negative
|
||||
(bv-neg-zero! x xi xj)]
|
||||
[(#x00) ;;; borrow is 0, last byte was positive
|
||||
(if ($fx< xi xj)
|
||||
(bv-neg-zero! x xi xj)
|
||||
(error who "number ~s does not fit" n))]
|
||||
[else (error 'lbn-neg-copy! "BUG: not handled ~s" c)])]
|
||||
[else
|
||||
(let ([c ($fx- ($fx+ 255 ($fxsra c 8)) ($bignum-byte-ref n ni))])
|
||||
(lbn-neg-copy! x ($fxadd1 xi) n ($fxadd1 ni) xj nj c)
|
||||
($bytevector-set! x xi ($fxlogand c 255)))]))
|
||||
lbn-neg-copy!)
|
||||
(define (make-bbn-neg-copy! who)
|
||||
(define (bbn-neg-copy! x xi n ni xj nj c)
|
||||
(cond
|
||||
[($fx= ni nj)
|
||||
(case ($fxsra c 7)
|
||||
[(#x01) ;;; borrow is 0, last byte was negative
|
||||
(bv-neg-zero! x xi xj)]
|
||||
[(#x00) ;;; borrow is 0, last byte was positive
|
||||
(if ($fx< xi xj)
|
||||
(bv-neg-zero! x xi xj)
|
||||
(error who "number ~s does not fit" n))]
|
||||
[else (error 'bbn-neg-copy! "BUG: not handled ~s" c)])]
|
||||
[else
|
||||
(let ([c ($fx- ($fx+ 255 ($fxsra c 8)) ($bignum-byte-ref n ni))]
|
||||
[xj ($fxsub1 xj)])
|
||||
(bbn-neg-copy! x xi n ($fxadd1 ni) xj nj c)
|
||||
($bytevector-set! x xj ($fxlogand c 255)))]))
|
||||
bbn-neg-copy!)
|
||||
(define (make-lbn-pos-copy! who)
|
||||
(define (lbn-pos-copy! x xi n ni nj xj c)
|
||||
(cond
|
||||
[($fx= ni nj)
|
||||
(cond
|
||||
[(or ($fx<= c 127) ($fx< xi xj))
|
||||
;;; last byte was positive
|
||||
(bv-zero! x xi xj)]
|
||||
[else
|
||||
(error who "number ~s does not fit" n)])]
|
||||
[else
|
||||
(let ([c ($bignum-byte-ref n ni)])
|
||||
(lbn-pos-copy! x ($fxadd1 xi) n ($fxadd1 ni) nj xj c)
|
||||
($bytevector-set! x xi ($fxlogand c 255)))]))
|
||||
lbn-pos-copy!)
|
||||
(define (make-bbn-pos-copy! who)
|
||||
(define (bbn-pos-copy! x xi n ni nj xj c)
|
||||
(cond
|
||||
[($fx= ni nj)
|
||||
(cond
|
||||
[(or ($fx<= c 127) ($fx< xi xj))
|
||||
;;; last byte was positive
|
||||
(bv-zero! x xi xj)]
|
||||
[else
|
||||
(error who "number ~s does not fit" n)])]
|
||||
[else
|
||||
(let ([c ($bignum-byte-ref n ni)]
|
||||
[xj ($fxsub1 xj)])
|
||||
(bbn-pos-copy! x xi n ($fxadd1 ni) nj xj c)
|
||||
($bytevector-set! x xj ($fxlogand c 255)))]))
|
||||
bbn-pos-copy!)
|
||||
(define (bv-neg-zero! x i j)
|
||||
(unless ($fx= i j)
|
||||
($bytevector-set! x i 255)
|
||||
|
@ -470,9 +480,8 @@
|
|||
i-2))
|
||||
i-1))
|
||||
i))))
|
||||
(define bytevector-uint-set!
|
||||
(define (make-bytevector-uint-set! who)
|
||||
(lambda (x k n endianness size)
|
||||
(define who 'bytevector-uint-set!)
|
||||
(unless (bytevector? x) (error who "~s is not a bytevector" x))
|
||||
(unless (and (fixnum? k) ($fx>= k 0)) (error who "invalid index ~s" k))
|
||||
(unless (and (fixnum? size) ($fx>= size 1)) (error who "invalid size ~s" size))
|
||||
|
@ -508,9 +517,13 @@
|
|||
(error who "value ~s must be positive" n))]
|
||||
[else (error who "invalid value argument ~s" n)])]
|
||||
[else (error who "invalid endianness ~s" endianness)])))
|
||||
(define bytevector-sint-set!
|
||||
(define bytevector-uint-set! (make-bytevector-uint-set! 'bytevector-uint-set!))
|
||||
(define (make-bytevector-sint-set! who)
|
||||
(define bbn-neg-copy! (make-bbn-neg-copy! who))
|
||||
(define bbn-pos-copy! (make-bbn-pos-copy! who))
|
||||
(define lbn-neg-copy! (make-lbn-neg-copy! who))
|
||||
(define lbn-pos-copy! (make-lbn-pos-copy! who))
|
||||
(lambda (x k n endianness size)
|
||||
(define who 'bytevector-sint-set!)
|
||||
(unless (bytevector? x) (error who "~s is not a bytevector" x))
|
||||
(unless (and (fixnum? k) ($fx>= k 0)) (error who "invalid index ~s" k))
|
||||
(unless (and (fixnum? size) ($fx>= size 1)) (error who "invalid size ~s" size))
|
||||
|
@ -547,7 +560,40 @@
|
|||
(bbn-neg-copy! x k n 0 size sz 256)]
|
||||
[else (error who "number ~s does not fit" n)])))]
|
||||
[else (error who "invalid value argument ~s" n)])]
|
||||
[else (error who "invalid endianness ~s" endianness)]))))
|
||||
[else (error who "invalid endianness ~s" endianness)])))
|
||||
(define bytevector-sint-set! (make-bytevector-sint-set! 'bytevector-sint-set!)))
|
||||
|
||||
(module (uint-list->bytevector sint-list->bytevector)
|
||||
(define (make-xint-list->bytevector who bv-set!)
|
||||
(define (race h t ls idx endianness size)
|
||||
(if (pair? h)
|
||||
(let ([h ($cdr h)] [a ($car h)])
|
||||
(if (pair? h)
|
||||
(if (not (eq? h t))
|
||||
(let ([bv (race ($cdr h) ($cdr t) ls
|
||||
($fx+ idx ($fx+ size size))
|
||||
endianness size)])
|
||||
(bv-set! bv idx a endianness size)
|
||||
(bv-set! bv ($fx+ idx size) ($car h) endianness size)
|
||||
bv)
|
||||
(error who "circular list ~s" ls))
|
||||
(if (null? h)
|
||||
(let ([bv (make-bytevector ($fx+ idx size))])
|
||||
(bv-set! bv idx a endianness size)
|
||||
bv)
|
||||
(error who "~s is not a proper list" ls))))
|
||||
(if (null? h)
|
||||
(make-bytevector idx)
|
||||
(error who "~s is not a proper list" ls))))
|
||||
(lambda (ls endianness size)
|
||||
(race ls ls ls 0 endianness size)))
|
||||
(define uint-list->bytevector
|
||||
(make-xint-list->bytevector
|
||||
'uint-list->bytevector bytevector-uint-set!))
|
||||
(define sint-list->bytevector
|
||||
(make-xint-list->bytevector
|
||||
'sint-list->bytevector bytevector-sint-set!)))
|
||||
|
||||
)
|
||||
|
||||
|
||||
|
|
|
@ -289,6 +289,8 @@
|
|||
[bytevector-sint-set! i]
|
||||
[bytevector->uint-list i]
|
||||
[bytevector->sint-list i]
|
||||
[uint-list->bytevector i]
|
||||
[sint-list->bytevector i]
|
||||
|
||||
[for-each i r]
|
||||
[map i r]
|
||||
|
|
Loading…
Reference in New Issue