| 1 | Index: library.scm
|
|---|
| 2 | ===================================================================
|
|---|
| 3 | --- library.scm (revision 14448)
|
|---|
| 4 | +++ library.scm (working copy)
|
|---|
| 5 | @@ -1736,19 +1736,16 @@
|
|---|
| 6 | (##core#inline "C_flush_output" p) )
|
|---|
| 7 | (lambda (p) ; char-ready?
|
|---|
| 8 | (##core#inline "C_char_ready_p" p) )
|
|---|
| 9 | - #f ; read-string!
|
|---|
| 10 | - #; ;UNUSED
|
|---|
| 11 | - (lambda (p n dest start) ; read-string!
|
|---|
| 12 | + (lambda (p n dest start) ; read-string!
|
|---|
| 13 | (let loop ([rem (or n (fx- (##sys#size dest) start))] [act 0] [start start])
|
|---|
| 14 | (let ([len (##core#inline "fast_read_string_from_file" dest p rem start)])
|
|---|
| 15 | - (cond [(eof-object? len)
|
|---|
| 16 | - (if (eq? 0 act) #!eof act)]
|
|---|
| 17 | - [(not len)
|
|---|
| 18 | - act]
|
|---|
| 19 | + (cond [(or (not len) ; error returns EOF
|
|---|
| 20 | + (eof-object? len)) ; EOF returns 0 bytes read
|
|---|
| 21 | + act]
|
|---|
| 22 | [(fx< len rem)
|
|---|
| 23 | - (loop (fx- rem len) (fx+ act len) (fx+ start len))]
|
|---|
| 24 | + (loop (fx- rem len) (fx+ act len) (fx+ start len))]
|
|---|
| 25 | [else
|
|---|
| 26 | - act ] ) ) ) )
|
|---|
| 27 | + (fx+ act len) ] ) )))
|
|---|
| 28 | (lambda (p limit) ; read-line
|
|---|
| 29 | (if limit (##sys#check-exact limit 'read-line))
|
|---|
| 30 | (let ((sblen read-line-buffer-initial-size))
|
|---|
| 31 | Index: extras.scm
|
|---|
| 32 | ===================================================================
|
|---|
| 33 | --- extras.scm (revision 14448)
|
|---|
| 34 | +++ extras.scm (working copy)
|
|---|
| 35 | @@ -204,19 +204,26 @@
|
|---|
| 36 | (##core#inline "C_setsubchar" dest start (##sys#read-char-0 port))
|
|---|
| 37 | (set! start (fx+ start 1)) )
|
|---|
| 38 | (let ((rdstring (##sys#slot (##sys#slot port 2) 7)))
|
|---|
| 39 | - (let loop ((start start) (n n) (m 0))
|
|---|
| 40 | - (let ((n2 (if rdstring
|
|---|
| 41 | - (rdstring port n dest start) ; *** doesn't update port-position!
|
|---|
| 42 | - (let ((c (##sys#read-char-0 port)))
|
|---|
| 43 | + (if rdstring
|
|---|
| 44 | + (let loop ((start start) (n n) (m 0))
|
|---|
| 45 | + (let ((n2 (rdstring port n dest start)))
|
|---|
| 46 | + (##sys#setislot port 5 ; update port-position
|
|---|
| 47 | + (fx+ (##sys#slot port 5) n2))
|
|---|
| 48 | + (cond ((eq? n2 0) m)
|
|---|
| 49 | + ((or (not n) (fx< n2 n))
|
|---|
| 50 | + (loop (fx+ start n2) (and n (fx- n n2)) (fx+ m n2)))
|
|---|
| 51 | + (else (fx+ n2 m)))))
|
|---|
| 52 | + (let loop ((start start) (n n) (m 0))
|
|---|
| 53 | + (let ((n2 (let ((c (##sys#read-char-0 port)))
|
|---|
| 54 | (if (eof-object? c)
|
|---|
| 55 | 0
|
|---|
| 56 | (begin
|
|---|
| 57 | (##core#inline "C_setsubchar" dest start c)
|
|---|
| 58 | - 1) ) ) ) ) )
|
|---|
| 59 | - (cond ((eq? n2 0) m)
|
|---|
| 60 | - ((or (not n) (fx< n2 n))
|
|---|
| 61 | - (loop (fx+ start n2) (and n (fx- n n2)) (fx+ m n2)) )
|
|---|
| 62 | - (else (fx+ n2 m))) ) ) ))))
|
|---|
| 63 | + 1) ) ) ) )
|
|---|
| 64 | + (cond ((eq? n2 0) m)
|
|---|
| 65 | + ((or (not n) (fx< n2 n))
|
|---|
| 66 | + (loop (fx+ start n2) (and n (fx- n n2)) (fx+ m n2)) )
|
|---|
| 67 | + (else (fx+ n2 m))) )))))))
|
|---|
| 68 |
|
|---|
| 69 | (define (read-string! n dest #!optional (port ##sys#standard-input) (start 0))
|
|---|
| 70 | (##sys#check-port port 'read-string!)
|
|---|
| 71 | @@ -228,6 +235,7 @@
|
|---|
| 72 | (##sys#check-exact start 'read-string!)
|
|---|
| 73 | (##sys#read-string! n dest port start) )
|
|---|
| 74 |
|
|---|
| 75 | +(define-constant read-string-buffer-size 2048)
|
|---|
| 76 | (define ##sys#read-string/port
|
|---|
| 77 | (let ((open-output-string open-output-string)
|
|---|
| 78 | (get-output-string get-output-string) )
|
|---|
| 79 | @@ -240,15 +248,16 @@
|
|---|
| 80 | str
|
|---|
| 81 | (##sys#substring str 0 n2))))
|
|---|
| 82 | (else
|
|---|
| 83 | - (let ([str (open-output-string)])
|
|---|
| 84 | - (let loop ([n n])
|
|---|
| 85 | - (or (and (eq? n 0) (get-output-string str))
|
|---|
| 86 | - (let ([c (##sys#read-char-0 p)])
|
|---|
| 87 | - (if (eof-object? c)
|
|---|
| 88 | - (get-output-string str)
|
|---|
| 89 | - (begin
|
|---|
| 90 | - (##sys#write-char/port c str)
|
|---|
| 91 | - (loop (and n (fx- n 1))) ) ) ) ) ) ) ) ) ) ) )
|
|---|
| 92 | + (let ([out (open-output-string)]
|
|---|
| 93 | + (buf (make-string read-string-buffer-size)))
|
|---|
| 94 | + (let loop ()
|
|---|
| 95 | + (let ((n (##sys#read-string! read-string-buffer-size
|
|---|
| 96 | + buf p 0)))
|
|---|
| 97 | + (cond ((eq? n 0)
|
|---|
| 98 | + (get-output-string out))
|
|---|
| 99 | + (else
|
|---|
| 100 | + (write-string buf n out)
|
|---|
| 101 | + (loop)))))))))))
|
|---|
| 102 |
|
|---|
| 103 | (define (read-string #!optional n (port ##sys#standard-input))
|
|---|
| 104 | (##sys#read-string/port n port) )
|
|---|