Added put-bytevector.
This commit is contained in:
parent
fd75cfc02f
commit
cc7066441c
|
@ -39,7 +39,7 @@
|
||||||
;port-has-set-port-position!? set-port-position!
|
;port-has-set-port-position!? set-port-position!
|
||||||
call-with-port
|
call-with-port
|
||||||
flush-output-port
|
flush-output-port
|
||||||
put-u8
|
put-u8 put-bytevector
|
||||||
put-char write-char
|
put-char write-char
|
||||||
put-string
|
put-string
|
||||||
open-bytevector-output-port
|
open-bytevector-output-port
|
||||||
|
@ -93,7 +93,7 @@
|
||||||
;port-has-set-port-position!? set-port-position!
|
;port-has-set-port-position!? set-port-position!
|
||||||
call-with-port
|
call-with-port
|
||||||
flush-output-port
|
flush-output-port
|
||||||
put-u8
|
put-u8 put-bytevector
|
||||||
put-char write-char
|
put-char write-char
|
||||||
put-string
|
put-string
|
||||||
open-bytevector-output-port
|
open-bytevector-output-port
|
||||||
|
@ -1883,7 +1883,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
(module (put-u8)
|
(module (put-u8 put-bytevector)
|
||||||
(import UNSAFE)
|
(import UNSAFE)
|
||||||
(define (put-u8-byte-mode p b who)
|
(define (put-u8-byte-mode p b who)
|
||||||
(let ([write! ($port-write! p)])
|
(let ([write! ($port-write! p)])
|
||||||
|
@ -1922,7 +1922,63 @@
|
||||||
[else
|
[else
|
||||||
(if (output-port? p)
|
(if (output-port? p)
|
||||||
(die who "not a binary port" p)
|
(die who "not a binary port" p)
|
||||||
(die who "not an output port" p))]))))
|
(die who "not an output port" p))])))
|
||||||
|
;;;
|
||||||
|
(define ($put-bytevector p bv i c)
|
||||||
|
(define who 'put-bytevector)
|
||||||
|
(define (copy! src dst si di c)
|
||||||
|
(when (fx> c 0)
|
||||||
|
(bytevector-u8-set! dst di (bytevector-u8-ref src si))
|
||||||
|
(copy! src dst (fx+ si 1) (fx+ di 1) (fx- c 1))))
|
||||||
|
(let ([m ($port-fast-attrs p)])
|
||||||
|
(cond
|
||||||
|
[(eq? m fast-put-byte-tag)
|
||||||
|
(let ([idx ($port-index p)])
|
||||||
|
(let ([room (fx- ($port-size p) idx)])
|
||||||
|
(cond
|
||||||
|
[(fx>= room c)
|
||||||
|
;; hurray
|
||||||
|
($set-port-index! p (fx+ idx c))
|
||||||
|
(copy! bv ($port-buffer p) i idx c)]
|
||||||
|
[else
|
||||||
|
($set-port-index! p (fx+ idx room))
|
||||||
|
(copy! bv ($port-buffer p) i idx room)
|
||||||
|
(flush-output-port p)
|
||||||
|
($put-bytevector p bv (fx+ i room) (fx- c room))])))]
|
||||||
|
[else
|
||||||
|
(if (output-port? p)
|
||||||
|
(die who "not a binary port" p)
|
||||||
|
(die who "not an output port" p))])))
|
||||||
|
(define put-bytevector
|
||||||
|
(case-lambda
|
||||||
|
[(p bv)
|
||||||
|
(if (bytevector? bv)
|
||||||
|
($put-bytevector p bv 0 (bytevector-length bv))
|
||||||
|
(die 'put-bytevector "not a bytevector" bv))]
|
||||||
|
[(p bv i)
|
||||||
|
(if (bytevector? bv)
|
||||||
|
(if (fixnum? i)
|
||||||
|
(let ([n (bytevector-length bv)])
|
||||||
|
(if (and (fx< i n) (fx>= i 0))
|
||||||
|
($put-bytevector p bv i (fx- n i))
|
||||||
|
(die 'put-bytevector "index out of range" i)))
|
||||||
|
(die 'put-bytevector "invalid index" i))
|
||||||
|
(die 'put-bytevector "not a bytevector" bv))]
|
||||||
|
[(p bv i c)
|
||||||
|
(if (bytevector? bv)
|
||||||
|
(if (fixnum? i)
|
||||||
|
(let ([n (bytevector-length bv)])
|
||||||
|
(if (and (fx< i n) (fx>= i 0))
|
||||||
|
(if (fixnum? c)
|
||||||
|
(if (and (fx>= c 0) (fx>= (fx- n c) i))
|
||||||
|
($put-bytevector p bv i c)
|
||||||
|
(die 'put-bytevector "count out of range" c))
|
||||||
|
(die 'put-bytevector "invalid count" c))
|
||||||
|
(die 'put-bytevector "index out of range" i)))
|
||||||
|
(die 'put-bytevector "invalid index" i))
|
||||||
|
(die 'put-bytevector "not a bytevector" bv))]))
|
||||||
|
;;; module
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
1353
|
1354
|
||||||
|
|
Loading…
Reference in New Issue