mirror of
https://github.com/justinethier/cyclone.git
synced 2025-07-13 07:47:39 +02:00
WIP
This commit is contained in:
parent
91c0ccdd4c
commit
e9dc22a296
3 changed files with 58 additions and 8 deletions
1
gc.c
1
gc.c
|
@ -488,6 +488,7 @@ char *gc_copy_obj(object dest, char *obj, gc_thread_data * thd)
|
||||||
hp->flags = ((port_type *) obj)->flags;
|
hp->flags = ((port_type *) obj)->flags;
|
||||||
hp->line_num = ((port_type *) obj)->line_num;
|
hp->line_num = ((port_type *) obj)->line_num;
|
||||||
hp->col_num = ((port_type *) obj)->col_num;
|
hp->col_num = ((port_type *) obj)->col_num;
|
||||||
|
hp->buf_idx = ((port_type *) obj)->buf_idx;
|
||||||
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;
|
||||||
return (char *)hp;
|
return (char *)hp;
|
||||||
|
|
|
@ -781,6 +781,7 @@ typedef struct {
|
||||||
unsigned char flags;
|
unsigned char flags;
|
||||||
unsigned int line_num;
|
unsigned int line_num;
|
||||||
unsigned int col_num;
|
unsigned int col_num;
|
||||||
|
unsigned int buf_idx;
|
||||||
char *mem_buf;
|
char *mem_buf;
|
||||||
size_t mem_buf_len;
|
size_t mem_buf_len;
|
||||||
} port_type;
|
} port_type;
|
||||||
|
@ -798,6 +799,7 @@ typedef struct {
|
||||||
p.flags = 0; \
|
p.flags = 0; \
|
||||||
p.line_num = 0; \
|
p.line_num = 0; \
|
||||||
p.col_num = 0; \
|
p.col_num = 0; \
|
||||||
|
p.buf_idx = 0; \
|
||||||
p.mem_buf = NULL; \
|
p.mem_buf = NULL; \
|
||||||
p.mem_buf_len = 0;
|
p.mem_buf_len = 0;
|
||||||
|
|
||||||
|
@ -811,6 +813,7 @@ typedef struct {
|
||||||
p.flags = 1; \
|
p.flags = 1; \
|
||||||
p.line_num = 0; \
|
p.line_num = 0; \
|
||||||
p.col_num = 0; \
|
p.col_num = 0; \
|
||||||
|
p.buf_idx = 0; \
|
||||||
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;
|
||||||
|
|
||||||
|
|
50
runtime.c
50
runtime.c
|
@ -5675,10 +5675,42 @@ void Cyc_import_shared_object(void *data, object cont, object filename, object e
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Read */
|
/** Read */
|
||||||
|
int read_from_port(port_type *p)
|
||||||
|
{
|
||||||
|
size_t rv;
|
||||||
|
FILE *fp = p->fp;
|
||||||
|
char *buf = p->mem_buf;
|
||||||
|
|
||||||
|
rv = fread(buf, sizeof(char), CYC_IO_BUF_LEN, fp);
|
||||||
|
p->mem_buf_len = rv;
|
||||||
|
p->buf_idx = 0;
|
||||||
|
return (rv == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _read_line_comment(port_type *p)
|
||||||
|
{
|
||||||
|
while(1) {
|
||||||
|
// Read more data into buffer, if needed
|
||||||
|
if (p->buf_idx == p->mem_buf_len) {
|
||||||
|
if (!read_from_port(p)){
|
||||||
|
break; // Return if buf is empty
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p->mem_buf[p->buf_idx++] == '\n') {
|
||||||
|
p->line_num++; // TODO: do we care about col_num above?
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _read_multiline_comment(port_type *p) {}
|
||||||
|
void _read_whitespace(port_type *p) {}
|
||||||
|
|
||||||
void Cyc_read(void *data, object cont, object port)
|
void Cyc_read(void *data, object cont, object port)
|
||||||
{
|
{
|
||||||
Cyc_check_port(data, port);
|
Cyc_check_port(data, port);
|
||||||
//port_type *p = (port_type *)port;
|
port_type *p = (port_type *)port;
|
||||||
|
char c;
|
||||||
/* needs to work with this data structure:
|
/* needs to work with this data structure:
|
||||||
I suppose if buf len is 0, try reading more...
|
I suppose if buf len is 0, try reading more...
|
||||||
#define make_file_backed_port(p,f,m)
|
#define make_file_backed_port(p,f,m)
|
||||||
|
@ -5695,13 +5727,27 @@ void Cyc_read(void *data, object cont, object port)
|
||||||
p.mem_buf_len = 0;
|
p.mem_buf_len = 0;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Read data if buffer is full/empty
|
|
||||||
// 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
|
||||||
|
while (1) {
|
||||||
|
// Read data if buffer is full/empty
|
||||||
|
if (p->mem_buf_len == 0 || p->mem_buf_len == p->buf_idx) {
|
||||||
|
int rv = read_from_port(p);
|
||||||
|
if (!rv) {
|
||||||
|
return_closcall1(data, cont, Cyc_EOF);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Process input one char at a time
|
// Process input one char at a time
|
||||||
|
c = p->mem_buf[p->buf_idx++];
|
||||||
// If comment found, eat up comment chars
|
// If comment found, eat up comment chars
|
||||||
|
if (c == ';') {
|
||||||
|
_read_line_comment(p);
|
||||||
|
// TODO: but then what, want to go back
|
||||||
|
}
|
||||||
// Want to use buffer instead of copying chars each time, but
|
// Want to use buffer instead of copying chars each time, but
|
||||||
// need a solution when another read is required, since that would
|
// need a solution when another read is required, since that would
|
||||||
// overwrite buffer
|
// overwrite buffer
|
||||||
// Raise an exception if any errors are found
|
// Raise an exception if any errors are found
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue