From 70e2a8cbba2b2cacba046fb24693375ffa62d148 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sat, 15 Apr 2017 01:00:18 +0900 Subject: [PATCH] add PIC_USE_FILE and PIC_USE_READ flags --- lib/ext/file.c | 6 ++---- lib/ext/main.c | 6 +++--- lib/ext/read.c | 38 +++++++++++++++++++++----------------- lib/include/picconf.h | 5 ++--- lib/include/picrin/extra.h | 2 -- lib/include/picrin/setup.h | 20 +++++++++++++++++--- lib/load.c | 11 ++--------- lib/state.c | 8 +++++--- 8 files changed, 52 insertions(+), 44 deletions(-) diff --git a/lib/ext/file.c b/lib/ext/file.c index 02b07a55..925fc171 100644 --- a/lib/ext/file.c +++ b/lib/ext/file.c @@ -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 diff --git a/lib/ext/main.c b/lib/ext/main.c index 5e04da35..8b6aa43b 100644 --- a/lib/ext/main.c +++ b/lib/ext/main.c @@ -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); diff --git a/lib/ext/read.c b/lib/ext/read.c index 9569fc8b..23e9e19f 100644 --- a/lib/ext/read.c +++ b/lib/ext/read.c @@ -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 diff --git a/lib/include/picconf.h b/lib/include/picconf.h index e896685c..130b7cda 100644 --- a/lib/include/picconf.h +++ b/lib/include/picconf.h @@ -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 */ diff --git a/lib/include/picrin/extra.h b/lib/include/picrin/extra.h index f7588a1d..f2df3326 100644 --- a/lib/include/picrin/extra.h +++ b/lib/include/picrin/extra.h @@ -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 diff --git a/lib/include/picrin/setup.h b/lib/include/picrin/setup.h index 773b6bfa..b490fe14 100644 --- a/lib/include/picrin/setup.h +++ b/lib/include/picrin/setup.h @@ -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 # 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 +#endif + +#if PIC_USE_LIBC PIC_STATIC_INLINE void pic_dtoa(double dval, char *buf) diff --git a/lib/load.c b/lib/load.c index 6f5d46a6..79af07d4 100644 --- a/lib/load.c +++ b/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); diff --git a/lib/state.c b/lib/state.c index ef4f06bb..083a1d42 100644 --- a/lib/state.c +++ b/lib/state.c @@ -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