~ chicken-core (master) 5911cfe6c2be053ec380a58ece2aeea3643b7d7c
commit 5911cfe6c2be053ec380a58ece2aeea3643b7d7c
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Jul 31 14:48:35 2026 +0200
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Fri Jul 31 14:48:35 2026 +0200
when reading line from file-port, take current peek-buffer into account
diff --git a/library.scm b/library.scm
index c91945fa..400396b5 100644
--- a/library.scm
+++ b/library.scm
@@ -72,18 +72,21 @@
#define C_flush_all_files(dummy) (C_fflush(NULL), C_SCHEME_UNDEFINED)
static C_word
-fast_read_line_from_file(C_word str, C_word port, C_word size) {
+fast_read_line_from_file(C_word str, C_word start, C_word port, C_word size) {
int n = C_unfix(size);
int i;
int c;
- char *buf = C_c_string(str);
+ int p = C_unfix(start);
+ char *buf = C_c_string(str) + p;
C_FILEPTR fp = C_port_file(port);
if ((c = C_getc(fp)) == EOF) {
if (ferror(fp)) {
clearerr(fp);
+ if(p) return p;
return C_fix(-1);
} else { /* feof (fp) */
+ if(p) return p;
return C_SCHEME_END_OF_FILE;
}
}
@@ -95,16 +98,17 @@ fast_read_line_from_file(C_word str, C_word port, C_word size) {
if(c == EOF && ferror(fp)) {
clearerr(fp);
- return C_fix(-(i + 1));
+ return C_fix(-(i + 1) + p);
}
switch (c) {
case '\r': if ((c = C_getc(fp)) != '\n') C_ungetc(c, fp);
case EOF: clearerr(fp);
- case '\n': return C_fix(i);
+ case '\n': return C_fix(i + p);
}
buf[i] = c;
}
+ if(p) return p;
return C_SCHEME_FALSE;
}
@@ -4155,17 +4159,26 @@ EOF
(else (fx+ act len) ) ) ))))
(lambda (p rlimit) ; read-line
(when rlimit (##sys#check-fixnum rlimit 'read-line))
- (let ((sblen read-line-buffer-initial-size))
- (unless (##sys#slot p 12)
- (##sys#setslot p 12 (##sys#make-bytevector sblen)))
+ (let ((sblen read-line-buffer-initial-size)
+ (pb (##sys#slot p 10))
+ (buffer (##sys#slot p 12))
+ (bpos 0))
+ (unless buffer
+ (set! buffer (##sys#make-bytevector sblen))
+ (##sys#setslot p 12 buffer))
+ (when pb
+ (set! bpos (##sys#size pb))
+ (##core#inline "C_copy_memory_with_offset" buffer pb 0 0 bpos)
+ (##sys#setislot p 10 #f))
(let loop ([len sblen]
[limit (or rlimit maximal-string-length)]
- [buffer (##sys#slot p 12)]
+ [buffer buffer]
[result ""]
[f #f])
(let* ((nlimit (fxmin limit len))
- (n (##core#inline "fast_read_line_from_file" buffer
+ (n (##core#inline "fast_read_line_from_file" buffer bpos
p nlimit)))
+ (set! bpos 0)
(cond ((eof-object? n) (if f result #!eof))
((not n)
(let ((prev (##sys#buffer->string/encoding buffer 0 nlimit
Trap