use pic_alloc/pic_free in initializing struct pic_reader
This commit is contained in:
parent
42cc5042f3
commit
3d1098967c
|
@ -21,7 +21,8 @@ struct pic_reader {
|
||||||
pic_reader_t dispatch[256];
|
pic_reader_t dispatch[256];
|
||||||
};
|
};
|
||||||
|
|
||||||
void pic_init_reader(pic_state *);
|
struct pic_reader *pic_reader_open(pic_state *);
|
||||||
|
void pic_reader_close(pic_state *, struct pic_reader *);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
|
|
|
@ -727,57 +727,82 @@ read(pic_state *pic, struct pic_port *port, int c)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
pic_init_reader(pic_state *pic)
|
reader_table_init(struct pic_reader *reader)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
pic->reader->table[0] = NULL;
|
reader->table[0] = NULL;
|
||||||
|
|
||||||
/* default reader */
|
/* default reader */
|
||||||
for (c = 1; c < 256; ++c) {
|
for (c = 1; c < 256; ++c) {
|
||||||
pic->reader->table[c] = read_symbol;
|
reader->table[c] = read_symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
pic->reader->table[')'] = read_unmatch;
|
reader->table[')'] = read_unmatch;
|
||||||
pic->reader->table[';'] = read_comment;
|
reader->table[';'] = read_comment;
|
||||||
pic->reader->table['\''] = read_quote;
|
reader->table['\''] = read_quote;
|
||||||
pic->reader->table['`'] = read_quasiquote;
|
reader->table['`'] = read_quasiquote;
|
||||||
pic->reader->table[','] = read_unquote;
|
reader->table[','] = read_unquote;
|
||||||
pic->reader->table['"'] = read_string;
|
reader->table['"'] = read_string;
|
||||||
pic->reader->table['|'] = read_pipe;
|
reader->table['|'] = read_pipe;
|
||||||
pic->reader->table['+'] = read_plus;
|
reader->table['+'] = read_plus;
|
||||||
pic->reader->table['-'] = read_minus;
|
reader->table['-'] = read_minus;
|
||||||
pic->reader->table['('] = read_pair;
|
reader->table['('] = read_pair;
|
||||||
pic->reader->table['['] = read_pair;
|
reader->table['['] = read_pair;
|
||||||
pic->reader->table['#'] = read_dispatch;
|
reader->table['#'] = read_dispatch;
|
||||||
|
|
||||||
/* read number */
|
/* read number */
|
||||||
for (c = '0'; c <= '9'; ++c) {
|
for (c = '0'; c <= '9'; ++c) {
|
||||||
pic->reader->table[c] = read_number;
|
reader->table[c] = read_number;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* default dispatch reader */
|
reader->dispatch['!'] = read_directive;
|
||||||
for (c = 0; c < 256; ++c) {
|
reader->dispatch['|'] = read_block_comment;
|
||||||
pic->reader->dispatch[c] = NULL;
|
reader->dispatch[';'] = read_datum_comment;
|
||||||
}
|
reader->dispatch['t'] = read_true;
|
||||||
|
reader->dispatch['f'] = read_false;
|
||||||
pic->reader->dispatch['!'] = read_directive;
|
reader->dispatch['\\'] = read_char;
|
||||||
pic->reader->dispatch['|'] = read_block_comment;
|
reader->dispatch['('] = read_vector;
|
||||||
pic->reader->dispatch[';'] = read_datum_comment;
|
reader->dispatch['u'] = read_blob;
|
||||||
pic->reader->dispatch['t'] = read_true;
|
reader->dispatch['.'] = read_eval;
|
||||||
pic->reader->dispatch['f'] = read_false;
|
|
||||||
pic->reader->dispatch['\\'] = read_char;
|
|
||||||
pic->reader->dispatch['('] = read_vector;
|
|
||||||
pic->reader->dispatch['u'] = read_blob;
|
|
||||||
pic->reader->dispatch['.'] = read_eval;
|
|
||||||
|
|
||||||
/* read labels */
|
/* read labels */
|
||||||
for (c = '0'; c <= '9'; ++c) {
|
for (c = '0'; c <= '9'; ++c) {
|
||||||
pic->reader->dispatch[c] = read_label;
|
reader->dispatch[c] = read_label;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct pic_reader *
|
||||||
|
pic_reader_open(pic_state *pic)
|
||||||
|
{
|
||||||
|
struct pic_reader *reader;
|
||||||
|
int c;
|
||||||
|
|
||||||
|
reader = pic_alloc(pic, sizeof(struct pic_reader));
|
||||||
|
reader->typecase = PIC_CASE_DEFAULT;
|
||||||
|
xh_init_int(&reader->labels, sizeof(pic_value));
|
||||||
|
|
||||||
|
for (c = 0; c < 256; ++c) {
|
||||||
|
reader->table[c] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (c = 0; c < 256; ++c) {
|
||||||
|
reader->dispatch[c] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
reader_table_init(reader);
|
||||||
|
|
||||||
|
return reader;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pic_reader_close(pic_state *pic, struct pic_reader *reader)
|
||||||
|
{
|
||||||
|
xh_destroy(&reader->labels);
|
||||||
|
pic_free(pic, reader);
|
||||||
|
}
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_read(pic_state *pic, struct pic_port *port)
|
pic_read(pic_state *pic, struct pic_port *port)
|
||||||
{
|
{
|
||||||
|
|
|
@ -170,12 +170,7 @@ pic_open(int argc, char *argv[], char **envp)
|
||||||
pic->wind->in = pic->wind->out = NULL;
|
pic->wind->in = pic->wind->out = NULL;
|
||||||
|
|
||||||
/* reader */
|
/* reader */
|
||||||
pic->reader = malloc(sizeof(struct pic_reader));
|
pic->reader = pic_reader_open(pic);
|
||||||
pic->reader->typecase = PIC_CASE_DEFAULT;
|
|
||||||
xh_init_int(&pic->reader->labels, sizeof(pic_value));
|
|
||||||
|
|
||||||
/* init readers */
|
|
||||||
pic_init_reader(pic);
|
|
||||||
|
|
||||||
/* standard libraries */
|
/* standard libraries */
|
||||||
pic->PICRIN_BASE = pic_open_library(pic, pic_read_cstr(pic, "(picrin base)"));
|
pic->PICRIN_BASE = pic_open_library(pic, pic_read_cstr(pic, "(picrin base)"));
|
||||||
|
@ -234,15 +229,14 @@ pic_close(pic_state *pic)
|
||||||
/* free heaps */
|
/* free heaps */
|
||||||
pic_heap_close(pic, pic->heap);
|
pic_heap_close(pic, pic->heap);
|
||||||
|
|
||||||
|
/* free reader struct */
|
||||||
|
pic_reader_close(pic, pic->reader);
|
||||||
|
|
||||||
/* free runtime context */
|
/* free runtime context */
|
||||||
free(pic->stbase);
|
free(pic->stbase);
|
||||||
free(pic->cibase);
|
free(pic->cibase);
|
||||||
free(pic->xpbase);
|
free(pic->xpbase);
|
||||||
|
|
||||||
/* free reader struct */
|
|
||||||
xh_destroy(&pic->reader->labels);
|
|
||||||
free(pic->reader);
|
|
||||||
|
|
||||||
/* free global stacks */
|
/* free global stacks */
|
||||||
xh_destroy(&pic->syms);
|
xh_destroy(&pic->syms);
|
||||||
xh_destroy(&pic->attrs);
|
xh_destroy(&pic->attrs);
|
||||||
|
|
Loading…
Reference in New Issue