~ chicken-core (chicken-5) df85f4fcbe8803afc3af3fbadc9c06d0a80f88a2
commit df85f4fcbe8803afc3af3fbadc9c06d0a80f88a2 Author: Peter Bex <peter@more-magic.net> AuthorDate: Thu Jun 25 20:03:49 2015 +0200 Commit: Evan Hanson <evhan@foldling.org> CommitDate: Mon Jul 13 22:35:37 2015 +1200 Improve read-u8vector performance This also adds a few basic test cases for read-u8vector and makes the implicit depency of the srfi-4 unit on the extras unit explicit. Signed-off-by: Evan Hanson <evhan@foldling.org> diff --git a/NEWS b/NEWS index 47e82ef9..00a26ed8 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,8 @@ - Unit srfi-4: - write-u8vector has been made more efficient (thanks to Thomas Hintz). + - read-u8vector has been made more efficient (thanks to Andy Bennett + for pointing this out and testing an improvement). - Unit lolevel: - Restore long-lost but still documented "vector-like?" procedure (#983) diff --git a/manual/Acknowledgements b/manual/Acknowledgements index 107a9444..e10cd087 100644 --- a/manual/Acknowledgements +++ b/manual/Acknowledgements @@ -4,11 +4,11 @@ Many thanks to Jules Altfas, Nico Amtsberg, Alonso Andres, William Annis, Jason E. Aten, Marc Baily, Peter Barabas, Andrei Barbu, Jonah -Beckford, Arto Bendiken, Kevin Beranek, Peter Bex, Jean-Francois -Bignolles, Oivind Binde, Alaric Blagrave-Snellpym, Dave Bodenstab, -Fabian Böhlke, T. Kurt Bond, Ashley Bone, Dominique Boucher, Terence -Brannon, Roy Bryant, Adam Buchbinder, Hans Bulfone, "Category 5", -Taylor Campbell, Naruto Canada, Mark Carter, Esteban U. Caamano +Beckford, Arto Bendiken, Andy Bennett, Kevin Beranek, Peter Bex, +Jean-Francois Bignolles, Oivind Binde, Alaric Blagrave Snell-Pym, Dave +Bodenstab, Fabian Böhlke, T. Kurt Bond, Ashley Bone, Dominique Boucher, +Terence Brannon, Roy Bryant, Adam Buchbinder, Hans Bulfone, "Category +5", Taylor Campbell, Naruto Canada, Mark Carter, Esteban U. Caamano Castro, Semih Cemiloglu, Alex Charlton, Franklin Chen, Joo ChurlSoo, Thomas Chust, Gian Paolo Ciceri, Fulvio Ciriaco, Paul Colby, Tobia Conforto, John Cowan, Grzegorz Chrupala, James Crippen, Evan Hanson, diff --git a/srfi-4.scm b/srfi-4.scm index dfa8150b..83f86203 100644 --- a/srfi-4.scm +++ b/srfi-4.scm @@ -26,10 +26,11 @@ (declare - (unit srfi-4) - (disable-interrupts) - (not inline ##sys#user-print-hook ##sys#number-hash-hook) - (foreign-declare #<<EOF + (unit srfi-4) + (uses extras) + (disable-interrupts) + (not inline ##sys#user-print-hook ##sys#number-hash-hook) + (foreign-declare #<<EOF #define C_copy_subvector(to, from, start_to, start_from, bytes) \ (C_memcpy((C_char *)C_data_pointer(to) + C_unfix(start_to), (C_char *)C_data_pointer(from) + C_unfix(start_from), C_unfix(bytes)), \ C_SCHEME_UNDEFINED) @@ -664,34 +665,9 @@ EOF (set! n (fx- size start))) (##sys#read-string! n dest port start))) -(define read-u8vector - (let () - (define (wrap str n) - (##sys#make-structure - 'u8vector - (let ((str2 (##sys#allocate-vector n #t #f #t))) - (##core#inline "C_string_to_bytevector" str2) - (##core#inline "C_substring_copy" str str2 0 n 0) - str2) ) ) - (lambda (#!optional n (p ##sys#standard-input)) - (##sys#check-input-port p #t 'read-u8vector) - (cond (n (##sys#check-exact n 'read-u8vector) - (let* ((str (##sys#allocate-vector n #t #f #t)) - (n2 (##sys#read-string! n str p 0)) ) - (##core#inline "C_string_to_bytevector" str) - (if (eq? n n2) - (##sys#make-structure 'u8vector str) - (wrap str n2) ) ) ) - (else - (let ([str (open-output-string)]) - (let loop () - (let ([c (##sys#read-char-0 p)]) - (if (eof-object? c) - (let* ((s (get-output-string str)) - (n (##sys#size s)) ) - (wrap s n) ) - (begin - (##sys#write-char/port c str) - (loop))))))))))) +(define (read-u8vector #!optional n (p ##sys#standard-input)) + (let ((str (##sys#read-string/port n p))) + (##core#inline "C_string_to_bytevector" str) + (##sys#make-structure 'u8vector str))) (register-feature! 'srfi-4) diff --git a/tests/srfi-4-tests.scm b/tests/srfi-4-tests.scm index 8b781403..9daaa78e 100644 --- a/tests/srfi-4-tests.scm +++ b/tests/srfi-4-tests.scm @@ -55,6 +55,20 @@ (assert (= 6 (read-u8vector! 10 u8vec input))) (assert (equal? u8vec #u8(117 118 119 120 121 122 108 109 110 111)))) +(let ((input (open-input-string "abcdefghijklmnopqrs"))) + (assert (equal? (read-u8vector 5 input) + #u8(97 98 99 100 101))) + (assert (equal? (read-u8vector 5 input) #u8(102 103 104 105 106))) + (assert (equal? (read-u8vector #f input) + #u8(107 108 109 110 111 112 113 114 115))) + (with-input-from-string "abcdefghijklmnopqrs" + (lambda () + (assert (equal? (read-u8vector 5) + #u8(97 98 99 100 101))) + (assert (equal? (read-u8vector 5) #u8(102 103 104 105 106))) + (assert (equal? (read-u8vector) + #u8(107 108 109 110 111 112 113 114 115)))))) + (assert (string=? "abc" (with-output-to-stringTrap