Return buffer if not empty upon EOF

This commit is contained in:
Justin Ethier 2017-08-16 12:05:55 +00:00
parent 2d5aa2c3b1
commit 5ecf409f54

View file

@ -6064,10 +6064,14 @@ void _read_return_atom(void *data, object cont, port_type *p)
} }
} }
/**
* Helper macro for Cyc_io_read_token
*/
#define _read_next_char(data, cont, p) \ #define _read_next_char(data, cont, p) \
if (p->mem_buf_len == 0 || p->mem_buf_len == p->buf_idx) { \ if (p->mem_buf_len == 0 || p->mem_buf_len == p->buf_idx) { \
int rv = read_from_port(p); \ int rv = read_from_port(p); \
if (!rv) { \ if (!rv) { \
if (p->tok_end) _read_return_atom(data, cont, p); \
return_thread_runnable(data, Cyc_EOF); \ return_thread_runnable(data, Cyc_EOF); \
} \ } \
} }
@ -6081,13 +6085,8 @@ void Cyc_io_read_token(void *data, object cont, object port)
// Find and return (to cont, so want to minimize stack growth if possible) next token from buf // Find and return (to cont, so want to minimize stack growth if possible) next token from buf
set_thread_blocked(data, cont); set_thread_blocked(data, cont);
while (1) { while (1) {
// Read data if buffer is full/empty // Do an I/O read for more data if buffer is full/empty
if (p->mem_buf_len == 0 || p->mem_buf_len == p->buf_idx) { _read_next_char(data, cont, p);
int rv = read_from_port(p);
if (!rv) {
return_thread_runnable(data, Cyc_EOF);
}
}
// Process input one char at a time // Process input one char at a time
c = p->mem_buf[p->buf_idx++]; c = p->mem_buf[p->buf_idx++];