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->tok_buf_len = ((port_type *) obj)->tok_buf_len;
hp->mem_buf = ((port_type *)obj)->mem_buf; hp->mem_buf = ((port_type *)obj)->mem_buf;
hp->mem_buf_len = ((port_type *)obj)->mem_buf_len; hp->mem_buf_len = ((port_type *)obj)->mem_buf_len;
hp->read_len = ((port_type *)obj)->read_len;
return (char *)hp; return (char *)hp;
} }
case bignum_tag:{ case bignum_tag:{

View file

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

View file

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