* Output string ports now use bytevectors for their internal buffer.
This commit is contained in:
parent
3f220faf13
commit
08176e3b91
BIN
src/ikarus.boot
BIN
src/ikarus.boot
Binary file not shown.
|
@ -91,71 +91,39 @@
|
||||||
(integer->char ($bytevector-u8-ref src si)))
|
(integer->char ($bytevector-u8-ref src si)))
|
||||||
(f di si))]))))
|
(f di si))]))))
|
||||||
|
|
||||||
|
(define bv-copy
|
||||||
|
(lambda (src)
|
||||||
|
(let ([n ($bytevector-length src)])
|
||||||
|
(let f ([src src] [dst ($make-bytevector n)] [i 0] [n n])
|
||||||
|
(cond
|
||||||
|
[($fx= i n) dst]
|
||||||
|
[else
|
||||||
|
($bytevector-set! dst i ($bytevector-u8-ref src i))
|
||||||
|
(f src dst ($fxadd1 i) n)])))))
|
||||||
|
|
||||||
|
|
||||||
(define make-output-string-handler-old
|
|
||||||
(lambda ()
|
|
||||||
(define buffer-list '())
|
|
||||||
(define open? #t)
|
|
||||||
(define output-handler
|
|
||||||
(lambda (msg . args)
|
|
||||||
(message-case msg args
|
|
||||||
[(write-char c p)
|
|
||||||
(if (char? c)
|
|
||||||
(if (output-port? p)
|
|
||||||
(let ([idx ($port-output-index p)])
|
|
||||||
(if ($fx< idx ($port-output-size p))
|
|
||||||
(begin
|
|
||||||
(string-set! ($port-output-buffer p) idx c)
|
|
||||||
($set-port-output-index! p ($fxadd1 idx)))
|
|
||||||
(if open?
|
|
||||||
(begin
|
|
||||||
(set! buffer-list
|
|
||||||
(cons (string-copy (port-output-buffer p))
|
|
||||||
buffer-list))
|
|
||||||
($set-port-output-size! p
|
|
||||||
(string-length ($port-output-buffer p)))
|
|
||||||
($write-char c p))
|
|
||||||
(error 'write-char "port ~s is closed" p))))
|
|
||||||
(error 'write-char "~s is not an output-port" p))
|
|
||||||
(error 'write-char "~s is not a character" c))]
|
|
||||||
[(write-byte b p) (output-handler 'write-char (integer->char b) p)]
|
|
||||||
[(flush-output-port p)
|
|
||||||
(void)]
|
|
||||||
[(close-port p)
|
|
||||||
(set! open? #f)]
|
|
||||||
[(port-name p) 'string-port]
|
|
||||||
[(get-output-string p)
|
|
||||||
(concat ($port-output-buffer p)
|
|
||||||
($port-output-index p)
|
|
||||||
buffer-list)]
|
|
||||||
[else (error 'output-handler
|
|
||||||
"unhandled message ~s" (cons msg args))])))
|
|
||||||
output-handler))
|
|
||||||
|
|
||||||
(define make-output-string-handler
|
(define make-output-string-handler
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(define buffer-list '())
|
(define buffer-list '())
|
||||||
(define open? #t)
|
(define open? #t)
|
||||||
(define idx 0)
|
|
||||||
(define buff ($make-bytevector 59))
|
|
||||||
(define size 59)
|
|
||||||
(define output-handler
|
(define output-handler
|
||||||
(lambda (msg . args)
|
(lambda (msg . args)
|
||||||
(message-case msg args
|
(message-case msg args
|
||||||
[(write-byte b p)
|
[(write-byte b p)
|
||||||
(if (and (fixnum? b) ($fx<= 0 b) ($fx<= b 255))
|
(if (and (fixnum? b) ($fx<= 0 b) ($fx<= b 255))
|
||||||
(if (output-port? p)
|
(if (output-port? p)
|
||||||
(if ($fx< idx size)
|
(let ([idx ($port-output-index p)])
|
||||||
(begin
|
(if ($fx< idx ($port-output-size p))
|
||||||
($bytevector-set! buff idx b)
|
|
||||||
(set! idx ($fxadd1 idx)))
|
|
||||||
(if open?
|
|
||||||
(begin
|
(begin
|
||||||
(set! buffer-list (cons buff buffer-list))
|
($bytevector-set! ($port-output-buffer p) idx b)
|
||||||
(set! buff ($make-bytevector 59))
|
($set-port-output-index! p ($fxadd1 idx)))
|
||||||
($bytevector-set! buff 0 b)
|
(if open?
|
||||||
(set! idx 1))
|
(let ([buff ($port-output-buffer p)])
|
||||||
(error 'write-byte "port ~s is closed" p)))
|
(set! buffer-list (cons (bv-copy buff) buffer-list))
|
||||||
|
($bytevector-set! buff 0 b)
|
||||||
|
(set! idx 1))
|
||||||
|
(error 'write-byte "port ~s is closed" p))))
|
||||||
(error 'write-byte "~s is not an output-port" p))
|
(error 'write-byte "~s is not an output-port" p))
|
||||||
(error 'write-byte "~s is not a byte" b))]
|
(error 'write-byte "~s is not a byte" b))]
|
||||||
[(write-char c p)
|
[(write-char c p)
|
||||||
|
@ -173,7 +141,9 @@
|
||||||
(set! open? #f)]
|
(set! open? #f)]
|
||||||
[(port-name p) 'string-port]
|
[(port-name p) 'string-port]
|
||||||
[(get-output-string p)
|
[(get-output-string p)
|
||||||
(concat buff idx buffer-list)]
|
(concat ($port-output-buffer p)
|
||||||
|
($port-output-index p)
|
||||||
|
buffer-list)]
|
||||||
[else (error 'output-handler
|
[else (error 'output-handler
|
||||||
"unhandled message ~s" (cons msg args))])))
|
"unhandled message ~s" (cons msg args))])))
|
||||||
output-handler))
|
output-handler))
|
||||||
|
@ -182,7 +152,7 @@
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(make-output-port
|
(make-output-port
|
||||||
(make-output-string-handler)
|
(make-output-string-handler)
|
||||||
($make-bytevector 0))))
|
($make-bytevector 59))))
|
||||||
|
|
||||||
(define get-output-string
|
(define get-output-string
|
||||||
(lambda (p)
|
(lambda (p)
|
||||||
|
|
Loading…
Reference in New Issue