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) ) |
---|