remove read.h
This commit is contained in:
parent
5bd390aa79
commit
2ee33b5d57
|
@ -1,33 +0,0 @@
|
|||
/**
|
||||
* See Copyright Notice in picrin.h
|
||||
*/
|
||||
|
||||
#ifndef PICRIN_READ_H
|
||||
#define PICRIN_READ_H
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
KHASH_DECLARE(read, int, pic_value)
|
||||
|
||||
typedef pic_value (*pic_reader_t)(pic_state *, xFILE *file, int c);
|
||||
|
||||
typedef struct {
|
||||
enum pic_typecase {
|
||||
PIC_CASE_DEFAULT,
|
||||
PIC_CASE_FOLD
|
||||
} typecase;
|
||||
khash_t(read) labels;
|
||||
pic_reader_t table[256];
|
||||
pic_reader_t dispatch[256];
|
||||
} pic_reader;
|
||||
|
||||
void pic_reader_init(pic_state *);
|
||||
void pic_reader_destroy(pic_state *);
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
|
@ -13,7 +13,6 @@ extern "C" {
|
|||
#include "picrin/private/file.h"
|
||||
|
||||
#include "picrin/private/irep.h"
|
||||
#include "picrin/private/read.h"
|
||||
#include "picrin/private/gc.h"
|
||||
|
||||
struct pic_lib {
|
||||
|
@ -68,7 +67,6 @@ struct pic_state {
|
|||
khash_t(ltable) ltable;
|
||||
struct pic_list ireps; /* chain */
|
||||
|
||||
pic_reader reader;
|
||||
xFILE files[XOPEN_MAX];
|
||||
pic_code iseq[2]; /* for pic_apply_trampoline */
|
||||
|
||||
|
|
|
@ -5,15 +5,28 @@
|
|||
#include "picrin.h"
|
||||
#include "picrin/extra.h"
|
||||
#include "picrin/private/object.h"
|
||||
#include "picrin/private/state.h"
|
||||
|
||||
#undef EOF
|
||||
#define EOF (-1)
|
||||
|
||||
KHASH_DECLARE(read, int, pic_value)
|
||||
KHASH_DEFINE(read, int, pic_value, kh_int_hash_func, kh_int_hash_equal)
|
||||
|
||||
static pic_value read(pic_state *pic, xFILE *file, int c);
|
||||
static pic_value read_nullable(pic_state *pic, xFILE *file, int c);
|
||||
struct reader_control {
|
||||
int typecase;
|
||||
khash_t(read) labels;
|
||||
};
|
||||
|
||||
#define CASE_DEFAULT 0
|
||||
#define CASE_FOLD 1
|
||||
|
||||
typedef pic_value (*pic_reader_t)(pic_state *, xFILE *file, int c, struct reader_control *);
|
||||
|
||||
static pic_reader_t reader_table[256];
|
||||
static pic_reader_t reader_dispatch[256];
|
||||
|
||||
static pic_value read(pic_state *pic, xFILE *file, int c, struct reader_control *p);
|
||||
static pic_value read_nullable(pic_state *pic, xFILE *file, int c, struct reader_control *p);
|
||||
|
||||
PIC_NORETURN static void
|
||||
read_error(pic_state *pic, const char *msg, pic_value irritants)
|
||||
|
@ -79,16 +92,16 @@ strcaseeq(const char *s1, const char *s2)
|
|||
}
|
||||
|
||||
static int
|
||||
case_fold(pic_state *pic, int c)
|
||||
case_fold(int c, struct reader_control *p)
|
||||
{
|
||||
if (pic->reader.typecase == PIC_CASE_FOLD) {
|
||||
if (p->typecase == CASE_FOLD) {
|
||||
c = tolower(c);
|
||||
}
|
||||
return c;
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_comment(pic_state PIC_UNUSED(*pic), xFILE *file, int c)
|
||||
read_comment(pic_state *pic, xFILE *file, int c, struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
do {
|
||||
c = next(pic, file);
|
||||
|
@ -98,7 +111,7 @@ read_comment(pic_state PIC_UNUSED(*pic), xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_block_comment(pic_state PIC_UNUSED(*pic), xFILE *file, int PIC_UNUSED(c))
|
||||
read_block_comment(pic_state *pic, xFILE *file, int PIC_UNUSED(c), struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
int x, y;
|
||||
int i = 1;
|
||||
|
@ -120,48 +133,48 @@ read_block_comment(pic_state PIC_UNUSED(*pic), xFILE *file, int PIC_UNUSED(c))
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_datum_comment(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
||||
read_datum_comment(pic_state *pic, xFILE *file, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
read(pic, file, next(pic, file));
|
||||
read(pic, file, next(pic, file), p);
|
||||
|
||||
return pic_invalid_value(pic);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_directive(pic_state *pic, xFILE *file, int c)
|
||||
read_directive(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
switch (peek(pic, file)) {
|
||||
case 'n':
|
||||
if (expect(pic, file, "no-fold-case")) {
|
||||
pic->reader.typecase = PIC_CASE_DEFAULT;
|
||||
p->typecase = CASE_DEFAULT;
|
||||
return pic_invalid_value(pic);
|
||||
}
|
||||
break;
|
||||
case 'f':
|
||||
if (expect(pic, file, "fold-case")) {
|
||||
pic->reader.typecase = PIC_CASE_FOLD;
|
||||
p->typecase = CASE_FOLD;
|
||||
return pic_invalid_value(pic);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return read_comment(pic, file, c);
|
||||
return read_comment(pic, file, c, p);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_quote(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
||||
read_quote(pic_state *pic, xFILE *file, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "quote"), read(pic, file, next(pic, file)));
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "quote"), read(pic, file, next(pic, file), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_quasiquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
||||
read_quasiquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "quasiquote"), read(pic, file, next(pic, file)));
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "quasiquote"), read(pic, file, next(pic, file), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
||||
read_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
pic_value tag;
|
||||
|
||||
|
@ -171,23 +184,23 @@ read_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
|||
} else {
|
||||
tag = pic_intern_lit(pic, "unquote");
|
||||
}
|
||||
return pic_list(pic, 2, tag, read(pic, file, next(pic, file)));
|
||||
return pic_list(pic, 2, tag, read(pic, file, next(pic, file), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_syntax_quote(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
||||
read_syntax_quote(pic_state *pic, xFILE *file, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quote"), read(pic, file, next(pic, file)));
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quote"), read(pic, file, next(pic, file), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_syntax_quasiquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
||||
read_syntax_quasiquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quasiquote"), read(pic, file, next(pic, file)));
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quasiquote"), read(pic, file, next(pic, file), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_syntax_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
||||
read_syntax_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
pic_value tag;
|
||||
|
||||
|
@ -197,11 +210,11 @@ read_syntax_unquote(pic_state *pic, xFILE *file, int PIC_UNUSED(c))
|
|||
} else {
|
||||
tag = pic_intern_lit(pic, "syntax-unquote");
|
||||
}
|
||||
return pic_list(pic, 2, tag, read(pic, file, next(pic, file)));
|
||||
return pic_list(pic, 2, tag, read(pic, file, next(pic, file), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_symbol(pic_state *pic, xFILE *file, int c)
|
||||
read_symbol(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
int len;
|
||||
char *buf;
|
||||
|
@ -209,14 +222,14 @@ read_symbol(pic_state *pic, xFILE *file, int c)
|
|||
|
||||
len = 1;
|
||||
buf = pic_malloc(pic, len + 1);
|
||||
buf[0] = case_fold(pic, c);
|
||||
buf[0] = case_fold(c, p);
|
||||
buf[1] = 0;
|
||||
|
||||
while (! isdelim(peek(pic, file))) {
|
||||
c = next(pic, file);
|
||||
len += 1;
|
||||
buf = pic_realloc(pic, buf, len + 1);
|
||||
buf[len - 1] = case_fold(pic, c);
|
||||
buf[len - 1] = case_fold(c, p);
|
||||
buf[len] = 0;
|
||||
}
|
||||
|
||||
|
@ -227,7 +240,7 @@ read_symbol(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static unsigned
|
||||
read_uinteger(pic_state *pic, xFILE *file, int c)
|
||||
read_uinteger(pic_state *pic, xFILE *file, int c, struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
unsigned u = 0;
|
||||
|
||||
|
@ -244,7 +257,7 @@ read_uinteger(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_unsigned(pic_state *pic, xFILE *file, int c)
|
||||
read_unsigned(pic_state *pic, xFILE *file, int c, struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
#define ATOF_BUF_SIZE (64)
|
||||
char buf[ATOF_BUF_SIZE];
|
||||
|
@ -301,9 +314,9 @@ read_unsigned(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_number(pic_state *pic, xFILE *file, int c)
|
||||
read_number(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
return read_unsigned(pic, file, c);
|
||||
return read_unsigned(pic, file, c, p);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
|
@ -317,15 +330,15 @@ negate(pic_state *pic, pic_value n)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_minus(pic_state *pic, xFILE *file, int c)
|
||||
read_minus(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
pic_value sym;
|
||||
|
||||
if (isdigit(peek(pic, file))) {
|
||||
return negate(pic, read_unsigned(pic, file, next(pic, file)));
|
||||
return negate(pic, read_unsigned(pic, file, next(pic, file), p));
|
||||
}
|
||||
else {
|
||||
sym = read_symbol(pic, file, c);
|
||||
sym = read_symbol(pic, file, c, p);
|
||||
if (strcaseeq(pic_str(pic, pic_sym_name(pic, sym)), "-inf.0")) {
|
||||
return pic_float_value(pic, -(1.0 / 0.0));
|
||||
}
|
||||
|
@ -337,15 +350,15 @@ read_minus(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_plus(pic_state *pic, xFILE *file, int c)
|
||||
read_plus(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
pic_value sym;
|
||||
|
||||
if (isdigit(peek(pic, file))) {
|
||||
return read_unsigned(pic, file, next(pic, file));
|
||||
return read_unsigned(pic, file, next(pic, file), p);
|
||||
}
|
||||
else {
|
||||
sym = read_symbol(pic, file, c);
|
||||
sym = read_symbol(pic, file, c, p);
|
||||
if (strcaseeq(pic_str(pic, pic_sym_name(pic, sym)), "+inf.0")) {
|
||||
return pic_float_value(pic, 1.0 / 0.0);
|
||||
}
|
||||
|
@ -357,7 +370,7 @@ read_plus(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_true(pic_state *pic, xFILE *file, int c)
|
||||
read_true(pic_state *pic, xFILE *file, int c, struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
if ((c = peek(pic, file)) == 'r') {
|
||||
if (! expect(pic, file, "rue")) {
|
||||
|
@ -371,7 +384,7 @@ read_true(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_false(pic_state *pic, xFILE *file, int c)
|
||||
read_false(pic_state *pic, xFILE *file, int c, struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
if ((c = peek(pic, file)) == 'a') {
|
||||
if (! expect(pic, file, "alse")) {
|
||||
|
@ -385,7 +398,7 @@ read_false(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_char(pic_state *pic, xFILE *file, int c)
|
||||
read_char(pic_state *pic, xFILE *file, int c, struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
c = next(pic, file);
|
||||
|
||||
|
@ -420,7 +433,7 @@ read_char(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_string(pic_state *pic, xFILE *file, int c)
|
||||
read_string(pic_state *pic, xFILE *file, int c, struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
char *buf;
|
||||
int size, cnt;
|
||||
|
@ -455,7 +468,7 @@ read_string(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_pipe(pic_state *pic, xFILE *file, int c)
|
||||
read_pipe(pic_state *pic, xFILE *file, int c, struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
char *buf;
|
||||
int size, cnt;
|
||||
|
@ -499,7 +512,7 @@ read_pipe(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_blob(pic_state *pic, xFILE *file, int c)
|
||||
read_blob(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
int nbits, n;
|
||||
int len;
|
||||
|
@ -524,7 +537,7 @@ read_blob(pic_state *pic, xFILE *file, int c)
|
|||
dat = NULL;
|
||||
c = next(pic, file);
|
||||
while ((c = skip(pic, file, c)) != ')') {
|
||||
n = read_uinteger(pic, file, c);
|
||||
n = read_uinteger(pic, file, c, p);
|
||||
if (n < 0 || (1 << nbits) <= n) {
|
||||
read_error(pic, "invalid element in bytevector literal", pic_list(pic, 1, pic_int_value(pic, n)));
|
||||
}
|
||||
|
@ -541,7 +554,7 @@ read_blob(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_undef_or_blob(pic_state *pic, xFILE *file, int c)
|
||||
read_undef_or_blob(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
if ((c = peek(pic, file)) == 'n') {
|
||||
if (! expect(pic, file, "ndefined")) {
|
||||
|
@ -552,11 +565,11 @@ read_undef_or_blob(pic_state *pic, xFILE *file, int c)
|
|||
if (! isdigit(c)) {
|
||||
read_error(pic, "expect #undefined or #u8(...), but illegal character given", pic_list(pic, 1, pic_char_value(pic, c)));
|
||||
}
|
||||
return read_blob(pic, file, 'u');
|
||||
return read_blob(pic, file, 'u', p);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_pair(pic_state *pic, xFILE *file, int c)
|
||||
read_pair(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
static const int tCLOSE = ')';
|
||||
pic_value car, cdr;
|
||||
|
@ -569,11 +582,11 @@ read_pair(pic_state *pic, xFILE *file, int c)
|
|||
return pic_nil_value(pic);
|
||||
}
|
||||
if (c == '.' && isdelim(peek(pic, file))) {
|
||||
cdr = read(pic, file, next(pic, file));
|
||||
cdr = read(pic, file, next(pic, file), p);
|
||||
|
||||
closing:
|
||||
if ((c = skip(pic, file, ' ')) != tCLOSE) {
|
||||
if (pic_invalid_p(pic, read_nullable(pic, file, c))) {
|
||||
if (pic_invalid_p(pic, read_nullable(pic, file, c, p))) {
|
||||
goto closing;
|
||||
}
|
||||
read_error(pic, "unmatched parenthesis", pic_nil_value(pic));
|
||||
|
@ -581,24 +594,24 @@ read_pair(pic_state *pic, xFILE *file, int c)
|
|||
return cdr;
|
||||
}
|
||||
else {
|
||||
car = read_nullable(pic, file, c);
|
||||
car = read_nullable(pic, file, c, p);
|
||||
|
||||
if (pic_invalid_p(pic, car)) {
|
||||
goto retry;
|
||||
}
|
||||
|
||||
cdr = read_pair(pic, file, '(');
|
||||
cdr = read_pair(pic, file, '(', p);
|
||||
return pic_cons(pic, car, cdr);
|
||||
}
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_vector(pic_state *pic, xFILE *file, int c)
|
||||
read_vector(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
pic_value list, it, elem, vec;
|
||||
int i = 0;
|
||||
|
||||
list = read(pic, file, c);
|
||||
list = read(pic, file, c, p);
|
||||
|
||||
vec = pic_make_vec(pic, pic_length(pic, list), NULL);
|
||||
|
||||
|
@ -610,12 +623,11 @@ read_vector(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_label_set(pic_state *pic, xFILE *file, int i)
|
||||
read_label_set(pic_state *pic, xFILE *file, int i, struct reader_control *p)
|
||||
{
|
||||
khash_t(read) *h = &pic->reader.labels;
|
||||
khash_t(read) *h = &p->labels;
|
||||
pic_value val;
|
||||
int c, ret;
|
||||
int it;
|
||||
int c, ret, it;
|
||||
|
||||
it = kh_put(read, h, i, &ret);
|
||||
|
||||
|
@ -626,7 +638,7 @@ read_label_set(pic_state *pic, xFILE *file, int i)
|
|||
|
||||
kh_val(h, it) = val = pic_cons(pic, pic_undef_value(pic), pic_undef_value(pic));
|
||||
|
||||
tmp = read(pic, file, c);
|
||||
tmp = read(pic, file, c, p);
|
||||
pic_pair_ptr(pic, val)->car = pic_car(pic, tmp);
|
||||
pic_pair_ptr(pic, val)->cdr = pic_cdr(pic, tmp);
|
||||
|
||||
|
@ -647,7 +659,7 @@ read_label_set(pic_state *pic, xFILE *file, int i)
|
|||
|
||||
kh_val(h, it) = val = pic_make_vec(pic, 0, NULL);
|
||||
|
||||
tmp = read(pic, file, c);
|
||||
tmp = read(pic, file, c, p);
|
||||
PIC_SWAP(pic_value *, pic_vec_ptr(pic, tmp)->data, pic_vec_ptr(pic, val)->data);
|
||||
PIC_SWAP(int, pic_vec_ptr(pic, tmp)->len, pic_vec_ptr(pic, val)->len);
|
||||
|
||||
|
@ -658,7 +670,7 @@ read_label_set(pic_state *pic, xFILE *file, int i)
|
|||
}
|
||||
default:
|
||||
{
|
||||
kh_val(h, it) = val = read(pic, file, c);
|
||||
kh_val(h, it) = val = read(pic, file, c, p);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
@ -666,9 +678,9 @@ read_label_set(pic_state *pic, xFILE *file, int i)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_label_ref(pic_state *pic, xFILE PIC_UNUSED(*file), int i)
|
||||
read_label_ref(pic_state *pic, xFILE PIC_UNUSED(*file), int i, struct reader_control *p)
|
||||
{
|
||||
khash_t(read) *h = &pic->reader.labels;
|
||||
khash_t(read) *h = &p->labels;
|
||||
int it;
|
||||
|
||||
it = kh_get(read, h, i);
|
||||
|
@ -679,7 +691,7 @@ read_label_ref(pic_state *pic, xFILE PIC_UNUSED(*file), int i)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_label(pic_state *pic, xFILE *file, int c)
|
||||
read_label(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -689,22 +701,22 @@ read_label(pic_state *pic, xFILE *file, int c)
|
|||
} while (isdigit(c = next(pic, file)));
|
||||
|
||||
if (c == '=') {
|
||||
return read_label_set(pic, file, i);
|
||||
return read_label_set(pic, file, i, p);
|
||||
}
|
||||
if (c == '#') {
|
||||
return read_label_ref(pic, file, i);
|
||||
return read_label_ref(pic, file, i, p);
|
||||
}
|
||||
read_error(pic, "broken label expression", pic_nil_value(pic));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_unmatch(pic_state *pic, xFILE PIC_UNUSED(*file), int PIC_UNUSED(c))
|
||||
read_unmatch(pic_state *pic, xFILE PIC_UNUSED(*file), int PIC_UNUSED(c), struct reader_control PIC_UNUSED(*p))
|
||||
{
|
||||
read_error(pic, "unmatched parenthesis", pic_nil_value(pic));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_dispatch(pic_state *pic, xFILE *file, int c)
|
||||
read_dispatch(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
c = next(pic, file);
|
||||
|
||||
|
@ -712,15 +724,15 @@ read_dispatch(pic_state *pic, xFILE *file, int c)
|
|||
read_error(pic, "unexpected EOF", pic_nil_value(pic));
|
||||
}
|
||||
|
||||
if (pic->reader.dispatch[c] == NULL) {
|
||||
if (reader_dispatch[c] == NULL) {
|
||||
read_error(pic, "invalid character at the seeker head", pic_list(pic, 1, pic_char_value(pic, c)));
|
||||
}
|
||||
|
||||
return pic->reader.dispatch[c](pic, file, c);
|
||||
return reader_dispatch[c](pic, file, c, p);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_nullable(pic_state *pic, xFILE *file, int c)
|
||||
read_nullable(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
c = skip(pic, file, c);
|
||||
|
||||
|
@ -728,20 +740,20 @@ read_nullable(pic_state *pic, xFILE *file, int c)
|
|||
read_error(pic, "unexpected EOF", pic_nil_value(pic));
|
||||
}
|
||||
|
||||
if (pic->reader.table[c] == NULL) {
|
||||
if (reader_table[c] == NULL) {
|
||||
read_error(pic, "invalid character at the seeker head", pic_list(pic, 1, pic_char_value(pic, c)));
|
||||
}
|
||||
|
||||
return pic->reader.table[c](pic, file, c);
|
||||
return reader_table[c](pic, file, c, p);
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read(pic_state *pic, xFILE *file, int c)
|
||||
read(pic_state *pic, xFILE *file, int c, struct reader_control *p)
|
||||
{
|
||||
pic_value val;
|
||||
|
||||
retry:
|
||||
val = read_nullable(pic, file, c);
|
||||
val = read_nullable(pic, file, c, p);
|
||||
|
||||
if (pic_invalid_p(pic, val)) {
|
||||
c = next(pic, file);
|
||||
|
@ -752,95 +764,97 @@ read(pic_state *pic, xFILE *file, int c)
|
|||
}
|
||||
|
||||
static void
|
||||
reader_table_init(pic_reader *reader)
|
||||
reader_table_init(void)
|
||||
{
|
||||
int c;
|
||||
|
||||
reader->table[0] = NULL;
|
||||
for (c = 0; c < 256; ++c) {
|
||||
reader_table[c] = NULL;
|
||||
}
|
||||
for (c = 0; c < 256; ++c) {
|
||||
reader_dispatch[c] = NULL;
|
||||
}
|
||||
|
||||
/* default reader */
|
||||
for (c = 1; c < 256; ++c) {
|
||||
reader->table[c] = read_symbol;
|
||||
reader_table[c] = read_symbol;
|
||||
}
|
||||
|
||||
reader->table[')'] = read_unmatch;
|
||||
reader->table[';'] = read_comment;
|
||||
reader->table['\''] = read_quote;
|
||||
reader->table['`'] = read_quasiquote;
|
||||
reader->table[','] = read_unquote;
|
||||
reader->table['"'] = read_string;
|
||||
reader->table['|'] = read_pipe;
|
||||
reader->table['+'] = read_plus;
|
||||
reader->table['-'] = read_minus;
|
||||
reader->table['('] = read_pair;
|
||||
reader->table['#'] = read_dispatch;
|
||||
reader_table[')'] = read_unmatch;
|
||||
reader_table[';'] = read_comment;
|
||||
reader_table['\''] = read_quote;
|
||||
reader_table['`'] = read_quasiquote;
|
||||
reader_table[','] = read_unquote;
|
||||
reader_table['"'] = read_string;
|
||||
reader_table['|'] = read_pipe;
|
||||
reader_table['+'] = read_plus;
|
||||
reader_table['-'] = read_minus;
|
||||
reader_table['('] = read_pair;
|
||||
reader_table['#'] = read_dispatch;
|
||||
|
||||
/* read number */
|
||||
for (c = '0'; c <= '9'; ++c) {
|
||||
reader->table[c] = read_number;
|
||||
reader_table[c] = read_number;
|
||||
}
|
||||
|
||||
reader->dispatch['!'] = read_directive;
|
||||
reader->dispatch['|'] = read_block_comment;
|
||||
reader->dispatch[';'] = read_datum_comment;
|
||||
reader->dispatch['t'] = read_true;
|
||||
reader->dispatch['f'] = read_false;
|
||||
reader->dispatch['\''] = read_syntax_quote;
|
||||
reader->dispatch['`'] = read_syntax_quasiquote;
|
||||
reader->dispatch[','] = read_syntax_unquote;
|
||||
reader->dispatch['\\'] = read_char;
|
||||
reader->dispatch['('] = read_vector;
|
||||
reader->dispatch['u'] = read_undef_or_blob;
|
||||
reader_dispatch['!'] = read_directive;
|
||||
reader_dispatch['|'] = read_block_comment;
|
||||
reader_dispatch[';'] = read_datum_comment;
|
||||
reader_dispatch['t'] = read_true;
|
||||
reader_dispatch['f'] = read_false;
|
||||
reader_dispatch['\''] = read_syntax_quote;
|
||||
reader_dispatch['`'] = read_syntax_quasiquote;
|
||||
reader_dispatch[','] = read_syntax_unquote;
|
||||
reader_dispatch['\\'] = read_char;
|
||||
reader_dispatch['('] = read_vector;
|
||||
reader_dispatch['u'] = read_undef_or_blob;
|
||||
|
||||
/* read labels */
|
||||
for (c = '0'; c <= '9'; ++c) {
|
||||
reader->dispatch[c] = read_label;
|
||||
reader_dispatch[c] = read_label;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pic_reader_init(pic_state *pic)
|
||||
static void
|
||||
reader_init(pic_state PIC_UNUSED(*pic), struct reader_control *p)
|
||||
{
|
||||
int c;
|
||||
|
||||
pic->reader.typecase = PIC_CASE_DEFAULT;
|
||||
kh_init(read, &pic->reader.labels);
|
||||
|
||||
for (c = 0; c < 256; ++c) {
|
||||
pic->reader.table[c] = NULL;
|
||||
}
|
||||
|
||||
for (c = 0; c < 256; ++c) {
|
||||
pic->reader.dispatch[c] = NULL;
|
||||
}
|
||||
|
||||
reader_table_init(&pic->reader);
|
||||
p->typecase = CASE_DEFAULT;
|
||||
kh_init(read, &p->labels);
|
||||
}
|
||||
|
||||
void
|
||||
pic_reader_destroy(pic_state *pic)
|
||||
static void
|
||||
reader_destroy(pic_state *pic, struct reader_control *p)
|
||||
{
|
||||
kh_destroy(read, &pic->reader.labels);
|
||||
kh_destroy(read, &p->labels);
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_read(pic_state *pic, pic_value port)
|
||||
{
|
||||
struct reader_control p;
|
||||
size_t ai = pic_enter(pic);
|
||||
pic_value val;
|
||||
xFILE *file = pic_fileno(pic, port);
|
||||
int c;
|
||||
|
||||
while ((c = skip(pic, file, next(pic, file))) != EOF) {
|
||||
val = read_nullable(pic, file, c);
|
||||
reader_init(pic, &p);
|
||||
|
||||
if (! pic_invalid_p(pic, val)) {
|
||||
break;
|
||||
pic_try {
|
||||
while ((c = skip(pic, file, next(pic, file))) != EOF) {
|
||||
val = read_nullable(pic, file, c, &p);
|
||||
|
||||
if (! pic_invalid_p(pic, val)) {
|
||||
break;
|
||||
}
|
||||
pic_leave(pic, ai);
|
||||
}
|
||||
if (c == EOF) {
|
||||
val = pic_eof_object(pic);
|
||||
}
|
||||
pic_leave(pic, ai);
|
||||
}
|
||||
if (c == EOF) {
|
||||
return pic_eof_object(pic);
|
||||
pic_catch {
|
||||
reader_destroy(pic, &p);
|
||||
pic_raise(pic, pic_err(pic));
|
||||
}
|
||||
|
||||
pic_leave(pic, ai);
|
||||
|
@ -879,5 +893,7 @@ pic_read_read(pic_state *pic)
|
|||
void
|
||||
pic_init_read(pic_state *pic)
|
||||
{
|
||||
reader_table_init();
|
||||
|
||||
pic_defun(pic, "read", pic_read_read);
|
||||
}
|
||||
|
|
|
@ -308,9 +308,6 @@ pic_open(pic_allocf allocf, void *userdata)
|
|||
pic->cp->depth = 0;
|
||||
pic->cp->in = pic->cp->out = NULL;
|
||||
|
||||
/* reader */
|
||||
pic_reader_init(pic);
|
||||
|
||||
/* parameter table */
|
||||
pic->ptable = pic_cons(pic, pic_make_weak(pic), pic_nil_value(pic));
|
||||
|
||||
|
@ -378,9 +375,6 @@ pic_close(pic_state *pic)
|
|||
/* free heaps */
|
||||
pic_heap_close(pic, pic->heap);
|
||||
|
||||
/* free reader struct */
|
||||
pic_reader_destroy(pic);
|
||||
|
||||
/* free runtime context */
|
||||
allocf(pic->userdata, pic->stbase, 0);
|
||||
allocf(pic->userdata, pic->cibase, 0);
|
||||
|
|
|
@ -163,8 +163,10 @@ write_str(pic_state *pic, pic_value str, xFILE *file, struct writer_control *p)
|
|||
}
|
||||
|
||||
static void
|
||||
write_float(pic_state *pic, double f, xFILE *file)
|
||||
write_float(pic_state *pic, pic_value flo, xFILE *file)
|
||||
{
|
||||
double f = pic_float(pic, flo);
|
||||
|
||||
if (f != f) {
|
||||
xfprintf(pic, file, "+nan.0");
|
||||
} else if (f == 1.0 / 0.0) {
|
||||
|
@ -321,12 +323,12 @@ write_core(pic_state *pic, pic_value obj, xFILE *file, struct writer_control *p)
|
|||
case PIC_TYPE_INT:
|
||||
xfprintf(pic, file, "%d", pic_int(pic, obj));
|
||||
break;
|
||||
case PIC_TYPE_FLOAT:
|
||||
write_float(pic, pic_float(pic, obj), file);
|
||||
break;
|
||||
case PIC_TYPE_SYMBOL:
|
||||
xfprintf(pic, file, "%s", pic_str(pic, pic_sym_name(pic, obj)));
|
||||
break;
|
||||
case PIC_TYPE_FLOAT:
|
||||
write_float(pic, obj, file);
|
||||
break;
|
||||
case PIC_TYPE_BLOB:
|
||||
write_blob(pic, obj, file);
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue