add PIC_USE_FILE and PIC_USE_READ flags
This commit is contained in:
parent
4e4360a0e8
commit
70e2a8cbba
|
@ -6,7 +6,7 @@
|
|||
|
||||
#include "picrin.h"
|
||||
|
||||
#if PIC_USE_LIBC
|
||||
#if PIC_USE_FILE
|
||||
|
||||
static int
|
||||
file_read(pic_state *PIC_UNUSED(pic), void *cookie, char *ptr, int size) {
|
||||
|
@ -75,13 +75,11 @@ pic_fopen(pic_state *pic, FILE *fp, const char *mode) {
|
|||
}
|
||||
|
||||
void
|
||||
pic_init_file(pic_state *PIC_UNUSED(pic))
|
||||
pic_init_file(pic_state *pic)
|
||||
{
|
||||
#if PIC_USE_STDIO
|
||||
pic_defvar(pic, "current-input-port", pic_fopen(pic, stdin, "r"));
|
||||
pic_defvar(pic, "current-output-port", pic_fopen(pic, stdout, "w"));
|
||||
pic_defvar(pic, "current-error-port", pic_fopen(pic, stdout, "w"));
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -17,7 +17,7 @@ main(int argc, char *argv[])
|
|||
if (argc == 1) { /* repl */
|
||||
while (1) {
|
||||
pic_printf(pic, "> ");
|
||||
e = pic_read(pic, pic_stdin(pic));
|
||||
e = pic_funcall(pic, "read", 0);
|
||||
if (pic_eof_p(pic, e))
|
||||
break;
|
||||
pic_printf(pic, "~s\n", pic_funcall(pic, "eval", 1, e));
|
||||
|
@ -30,7 +30,7 @@ main(int argc, char *argv[])
|
|||
}
|
||||
port = pic_fopen(pic, file, "r");
|
||||
while (1) {
|
||||
e = pic_read(pic, port);
|
||||
e = pic_funcall(pic, "read", 1, port);
|
||||
if (pic_eof_p(pic, e))
|
||||
break;
|
||||
pic_void(pic, pic_funcall(pic, "eval", 1, e));
|
||||
|
@ -46,7 +46,7 @@ main(int argc, char *argv[])
|
|||
}
|
||||
port = pic_fopen(pic, file, "r");
|
||||
}
|
||||
pic_printf(pic, "~s\n", pic_funcall(pic, "compile", 1, pic_read(pic, port)));
|
||||
pic_printf(pic, "~s\n", pic_funcall(pic, "compile", 1, pic_funcall(pic, "read", 1, port)));
|
||||
} else {
|
||||
fprintf(stderr, "usage: mini-picrin [-c] [file]\n");
|
||||
exit(1);
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#include "picrin/extra.h"
|
||||
#include "../object.h"
|
||||
|
||||
#if PIC_USE_READ
|
||||
|
||||
#undef EOF
|
||||
#define EOF (-1)
|
||||
|
||||
|
@ -25,7 +27,7 @@ typedef pic_value (*pic_reader_t)(pic_state *, pic_value port, int c, struct rea
|
|||
static pic_reader_t reader_table[256];
|
||||
static pic_reader_t reader_dispatch[256];
|
||||
|
||||
static pic_value read_value(pic_state *pic, pic_value port, int c, struct reader_control *p);
|
||||
static pic_value read_core(pic_state *pic, pic_value port, int c, struct reader_control *p);
|
||||
static pic_value read_nullable(pic_state *pic, pic_value port, int c, struct reader_control *p);
|
||||
|
||||
PIC_NORETURN static void
|
||||
|
@ -123,7 +125,7 @@ read_block_comment(pic_state *pic, pic_value port, int PIC_UNUSED(c), struct rea
|
|||
static pic_value
|
||||
read_datum_comment(pic_state *pic, pic_value port, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
read_value(pic, port, next(pic, port), p);
|
||||
read_core(pic, port, next(pic, port), p);
|
||||
|
||||
return pic_invalid_value(pic);
|
||||
}
|
||||
|
@ -152,13 +154,13 @@ read_directive(pic_state *pic, pic_value port, int c, struct reader_control *p)
|
|||
static pic_value
|
||||
read_quote(pic_state *pic, pic_value port, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "quote"), read_value(pic, port, next(pic, port), p));
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "quote"), read_core(pic, port, next(pic, port), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_quasiquote(pic_state *pic, pic_value port, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "quasiquote"), read_value(pic, port, next(pic, port), p));
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "quasiquote"), read_core(pic, port, next(pic, port), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
|
@ -172,19 +174,19 @@ read_unquote(pic_state *pic, pic_value port, int PIC_UNUSED(c), struct reader_co
|
|||
} else {
|
||||
tag = pic_intern_lit(pic, "unquote");
|
||||
}
|
||||
return pic_list(pic, 2, tag, read_value(pic, port, next(pic, port), p));
|
||||
return pic_list(pic, 2, tag, read_core(pic, port, next(pic, port), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_syntax_quote(pic_state *pic, pic_value port, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quote"), read_value(pic, port, next(pic, port), p));
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quote"), read_core(pic, port, next(pic, port), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
read_syntax_quasiquote(pic_state *pic, pic_value port, int PIC_UNUSED(c), struct reader_control *p)
|
||||
{
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quasiquote"), read_value(pic, port, next(pic, port), p));
|
||||
return pic_list(pic, 2, pic_intern_lit(pic, "syntax-quasiquote"), read_core(pic, port, next(pic, port), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
|
@ -198,7 +200,7 @@ read_syntax_unquote(pic_state *pic, pic_value port, int PIC_UNUSED(c), struct re
|
|||
} else {
|
||||
tag = pic_intern_lit(pic, "syntax-unquote");
|
||||
}
|
||||
return pic_list(pic, 2, tag, read_value(pic, port, next(pic, port), p));
|
||||
return pic_list(pic, 2, tag, read_core(pic, port, next(pic, port), p));
|
||||
}
|
||||
|
||||
static pic_value
|
||||
|
@ -474,7 +476,7 @@ read_pair(pic_state *pic, pic_value port, int c, struct reader_control *p)
|
|||
return pic_nil_value(pic);
|
||||
}
|
||||
if (c == '.' && isdelim(peek(pic, port))) {
|
||||
cdr = read_value(pic, port, next(pic, port), p);
|
||||
cdr = read_core(pic, port, next(pic, port), p);
|
||||
|
||||
closing:
|
||||
if ((c = skip(pic, port, ' ')) != tCLOSE) {
|
||||
|
@ -503,7 +505,7 @@ read_vector(pic_state *pic, pic_value port, int c, struct reader_control *p)
|
|||
pic_value list, it, elem, vec;
|
||||
int i = 0;
|
||||
|
||||
list = read_value(pic, port, c, p);
|
||||
list = read_core(pic, port, c, p);
|
||||
|
||||
vec = pic_make_vec(pic, pic_length(pic, list), NULL);
|
||||
|
||||
|
@ -530,7 +532,7 @@ read_label_set(pic_state *pic, pic_value port, int i, struct reader_control *p)
|
|||
|
||||
kh_val(h, it) = val = pic_cons(pic, pic_undef_value(pic), pic_undef_value(pic));
|
||||
|
||||
tmp = read_value(pic, port, c, p);
|
||||
tmp = read_core(pic, port, c, p);
|
||||
pair_ptr(pic, val)->car = pic_car(pic, tmp);
|
||||
pair_ptr(pic, val)->cdr = pic_cdr(pic, tmp);
|
||||
|
||||
|
@ -551,7 +553,7 @@ read_label_set(pic_state *pic, pic_value port, int i, struct reader_control *p)
|
|||
|
||||
kh_val(h, it) = val = pic_make_vec(pic, 0, NULL);
|
||||
|
||||
tmp = read_value(pic, port, c, p);
|
||||
tmp = read_core(pic, port, c, p);
|
||||
PIC_SWAP(pic_value *, vec_ptr(pic, tmp)->data, vec_ptr(pic, val)->data);
|
||||
PIC_SWAP(int, vec_ptr(pic, tmp)->len, vec_ptr(pic, val)->len);
|
||||
|
||||
|
@ -562,7 +564,7 @@ read_label_set(pic_state *pic, pic_value port, int i, struct reader_control *p)
|
|||
}
|
||||
default:
|
||||
{
|
||||
kh_val(h, it) = val = read_value(pic, port, c, p);
|
||||
kh_val(h, it) = val = read_core(pic, port, c, p);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
@ -640,7 +642,7 @@ read_nullable(pic_state *pic, pic_value port, int c, struct reader_control *p)
|
|||
}
|
||||
|
||||
static pic_value
|
||||
read_value(pic_state *pic, pic_value port, int c, struct reader_control *p)
|
||||
read_core(pic_state *pic, pic_value port, int c, struct reader_control *p)
|
||||
{
|
||||
pic_value val;
|
||||
|
||||
|
@ -718,8 +720,8 @@ reader_destroy(pic_state *pic, struct reader_control *p)
|
|||
kh_destroy(read, &p->labels);
|
||||
}
|
||||
|
||||
pic_value
|
||||
pic_read(pic_state *pic, pic_value port)
|
||||
static pic_value
|
||||
read_value(pic_state *pic, pic_value port)
|
||||
{
|
||||
struct reader_control p;
|
||||
size_t ai = pic_enter(pic);
|
||||
|
@ -759,7 +761,7 @@ pic_read_read(pic_state *pic)
|
|||
|
||||
pic_get_args(pic, "|p", &port);
|
||||
|
||||
return pic_read(pic, port);
|
||||
return read_value(pic, port);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -769,3 +771,5 @@ pic_init_read(pic_state *pic)
|
|||
|
||||
pic_defun(pic, "read", pic_read_read);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -5,12 +5,11 @@
|
|||
/** enable libc */
|
||||
/* #define PIC_USE_LIBC 1 */
|
||||
|
||||
/** enable stdio */
|
||||
/* #define PIC_USE_STDIO 1 */
|
||||
|
||||
/** enable specific features */
|
||||
/* #define PIC_USE_READ 1 */
|
||||
/* #define PIC_USE_WRITE 1 */
|
||||
/* #define PIC_USE_EVAL 1 */
|
||||
/* #define PIC_USE_FILE 1 */
|
||||
|
||||
/** essential external functions */
|
||||
/* #define PIC_JMPBUF jmp_buf */
|
||||
|
|
|
@ -15,8 +15,6 @@ void *pic_default_allocf(void *, void *, size_t);
|
|||
pic_value pic_fopen(pic_state *, FILE *, const char *mode);
|
||||
#endif
|
||||
|
||||
pic_value pic_read(pic_state *, pic_value port);
|
||||
|
||||
/* for debug */
|
||||
|
||||
#if PIC_USE_WRITE
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
# define PIC_USE_LIBC 1
|
||||
#endif
|
||||
|
||||
#ifndef PIC_USE_STDIO
|
||||
# define PIC_USE_STDIO 1
|
||||
#ifndef PIC_USE_READ
|
||||
# define PIC_USE_READ 1
|
||||
#endif
|
||||
|
||||
#ifndef PIC_USE_WRITE
|
||||
|
@ -20,6 +20,17 @@
|
|||
# define PIC_USE_EVAL 1
|
||||
#endif
|
||||
|
||||
#ifndef PIC_USE_FILE
|
||||
# define PIC_USE_FILE 1
|
||||
#endif
|
||||
|
||||
#if !PIC_USE_READ && PIC_USE_EVAL
|
||||
# error PIC_USE_EVAL requires PIC_USE_READ
|
||||
#endif
|
||||
#if !PIC_USE_LIBC && PIC_USE_FILE
|
||||
# error PIC_USE_FILE requires PIC_USE_LIBC
|
||||
#endif
|
||||
|
||||
#ifndef PIC_JMPBUF
|
||||
# include <setjmp.h>
|
||||
# define PIC_JMPBUF jmp_buf
|
||||
|
@ -383,8 +394,11 @@ pic_atod(const char *str)
|
|||
return atof(str);
|
||||
}
|
||||
|
||||
#if PIC_USE_STDIO
|
||||
#if PIC_USE_FILE
|
||||
# include <stdio.h>
|
||||
#endif
|
||||
|
||||
#if PIC_USE_LIBC
|
||||
|
||||
PIC_STATIC_INLINE void
|
||||
pic_dtoa(double dval, char *buf)
|
||||
|
|
11
lib/load.c
11
lib/load.c
|
@ -181,15 +181,8 @@ pic_load_native(pic_state *pic, const char *str)
|
|||
|
||||
pic_try {
|
||||
size_t ai = pic_enter(pic);
|
||||
|
||||
while (1) {
|
||||
pic_value form = pic_read(pic, port);
|
||||
if (pic_eof_p(pic, form)) {
|
||||
break;
|
||||
}
|
||||
pic_load(pic, form);
|
||||
pic_leave(pic, ai);
|
||||
}
|
||||
pic_load(pic, pic_funcall(pic, "read", 1, port));
|
||||
pic_leave(pic, ai);
|
||||
}
|
||||
pic_catch(e) {
|
||||
pic_fclose(pic, port);
|
||||
|
|
|
@ -136,14 +136,16 @@ pic_init_core(pic_state *pic)
|
|||
pic_init_dict(pic); DONE;
|
||||
pic_init_record(pic); DONE;
|
||||
pic_init_weak(pic); DONE;
|
||||
pic_init_state(pic); DONE;
|
||||
pic_init_load(pic); DONE;
|
||||
pic_init_read(pic); DONE;
|
||||
pic_init_state(pic); DONE;
|
||||
|
||||
#if PIC_USE_READ
|
||||
pic_init_read(pic); DONE;
|
||||
#endif
|
||||
#if PIC_USE_WRITE
|
||||
pic_init_write(pic); DONE;
|
||||
#endif
|
||||
#if PIC_USE_LIBC
|
||||
#if PIC_USE_FILE
|
||||
pic_init_file(pic); DONE;
|
||||
#endif
|
||||
#if PIC_USE_EVAL
|
||||
|
|
Loading…
Reference in New Issue