Added new read_len field for fread

This commit is contained in:
Justin Ethier 2017-08-17 13:54:44 +00:00
parent cc9a16b033
commit 4c5191f2b8
3 changed files with 12 additions and 8 deletions

1
gc.c
View file

@ -495,6 +495,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
hp->tok_buf_len = ((port_type *) obj)->tok_buf_len;
hp->mem_buf = ((port_type *)obj)->mem_buf;
hp->mem_buf_len = ((port_type *)obj)->mem_buf_len;
hp->read_len = ((port_type *)obj)->read_len;
return (char *)hp;
}
case bignum_tag:{

View file

@ -788,9 +788,10 @@ typedef struct {
size_t tok_buf_len;
char *mem_buf;
size_t mem_buf_len;
unsigned short read_len;
} port_type;
#define CYC_IO_BUF_LEN 1024
#define CYC_IO_BUF_LEN 4096
/** Create a new port object in the nursery */
#define make_port(p,f,m) \
@ -809,15 +810,16 @@ typedef struct {
p.tok_buf = NULL; \
p.tok_buf_len = 0; \
p.mem_buf = NULL; \
p.mem_buf_len = 0;
p.mem_buf_len = 0; \
p.read_len = 1;
#define make_file_backed_port(p,f,m) \
#define make_input_port(p,f,rl) \
port_type p; \
p.hdr.mark = gc_color_red; \
p.hdr.grayed = 0; \
p.tag = port_tag; \
p.fp = f; \
p.mode = m; \
p.mode = 1; \
p.flags = 1; \
p.line_num = 1; \
p.col_num = 1; \
@ -827,7 +829,8 @@ typedef struct {
p.tok_buf = malloc(CYC_IO_BUF_LEN); \
p.tok_buf_len = CYC_IO_BUF_LEN; \
p.mem_buf = malloc(CYC_IO_BUF_LEN); \
p.mem_buf_len = 0;
p.mem_buf_len = 0; \
p.read_len = rl;
/**
* @brief Vector type

View file

@ -3382,7 +3382,7 @@ port_type Cyc_stdout()
port_type Cyc_stdin()
{
make_port(p, stdin, 1);
make_input_port(p, stdin, 1);
return p;
}
@ -3397,7 +3397,7 @@ port_type Cyc_io_open_input_file(void *data, object str)
const char *fname;
Cyc_check_str(data, str);
fname = ((string_type *) str)->str;
make_file_backed_port(p, NULL, 1);
make_input_port(p, NULL, CYC_IO_BUF_LEN);
p.fp = fopen(fname, "r");
if (p.fp == NULL) {
Cyc_rt_raise2(data, "Unable to open file", str);
@ -5694,7 +5694,7 @@ int read_from_port(port_type *p)
while(1) {
errno = 0;
rv = fread(buf, sizeof(char), CYC_IO_BUF_LEN, fp);
rv = fread(buf, sizeof(char), p->read_len, fp);
if (rv != 0 || !ferror(fp) || errno != EINTR) {
break;