diff options
| -rw-r--r-- | include/mruby/compile.h (renamed from src/compile.h) | 26 | ||||
| -rw-r--r-- | include/mruby/data.h | 7 | ||||
| -rw-r--r-- | src/codegen.c | 2 | ||||
| -rw-r--r-- | src/gc.h | 8 | ||||
| -rw-r--r-- | src/init.c | 3 | ||||
| -rw-r--r-- | src/parse.y | 98 | ||||
| -rw-r--r-- | src/print.c | 13 | ||||
| -rw-r--r-- | src/version.c | 81 | ||||
| -rw-r--r-- | src/version.h | 38 | ||||
| -rw-r--r-- | test/Makefile | 16 | ||||
| -rw-r--r-- | test/driver.c | 27 | ||||
| -rw-r--r-- | test/init_mrbtest.c | 4 | ||||
| -rw-r--r-- | tools/mirb/mirb.c | 11 | ||||
| -rw-r--r-- | tools/mrbc/mrbc.c | 16 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 31 |
15 files changed, 145 insertions, 236 deletions
diff --git a/src/compile.h b/include/mruby/compile.h index ba1dfd2ee..2a47b569a 100644 --- a/src/compile.h +++ b/include/mruby/compile.h @@ -4,6 +4,13 @@ ** See Copyright Notice in mruby.h */ +#ifndef MRUBY_COMPILE_H +#define MRUBY_COMPILE_H 1 + +#if defined(__cplusplus) +extern "C" { +#endif + #include "mruby.h" #include <stdio.h> #include <setjmp.h> @@ -77,15 +84,24 @@ struct mrb_parser_state { jmp_buf jmp; }; -struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*,const char*,int); +/* parser structure */ +struct mrb_parser_state* mrb_parser_new(mrb_state*); +const char *mrb_parser_filename(struct mrb_parser_state*, const char*); +int mrb_parser_lineno(struct mrb_parser_state*, int); +void mrb_parser_parse(struct mrb_parser_state*); + +/* utility functions */ +struct mrb_parser_state* mrb_parse_file(mrb_state*,FILE*); struct mrb_parser_state* mrb_parse_string(mrb_state*,const char*); struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t); -struct mrb_parser_state* mrb_parse_nstring_ext(mrb_state*,const char*,size_t); int mrb_generate_code(mrb_state*, mrb_ast_node*); -int mrb_compile_file(mrb_state*,FILE*,const char*,int); +int mrb_compile_file(mrb_state*,FILE*); int mrb_compile_string(mrb_state*,char*); int mrb_compile_nstring(mrb_state*,char*,size_t); -const char *mrb_parser_filename(struct mrb_parser_state *p, const char *s); -int mrb_parser_lineno(struct mrb_parser_state *p, int n); +#if defined(__cplusplus) +} /* extern "C" { */ +#endif + +#endif /* MRUBY_COMPILE_H */ diff --git a/include/mruby/data.h b/include/mruby/data.h index d4ce82e40..4c136555c 100644 --- a/include/mruby/data.h +++ b/include/mruby/data.h @@ -4,14 +4,13 @@ ** See Copyright Notice in mruby.h */ -#ifndef RUBY_DATA_H -#define RUBY_DATA_H 1 +#ifndef MRUBY_DATA_H +#define MRUBY_DATA_H 1 #if defined(__cplusplus) extern "C" { #endif - struct mrb_data_type { const char *struct_name; void (*dfree)(mrb_state *mrb, void*); @@ -48,4 +47,4 @@ void *mrb_check_datatype(mrb_state *mrb, mrb_value, const struct mrb_data_type*) } /* extern "C" { */ #endif -#endif /* RUBY_DATA_H */ +#endif /* MRUBY_DATA_H */ diff --git a/src/codegen.c b/src/codegen.c index 0abd9e67e..e039e72dc 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -9,7 +9,7 @@ #include "mruby.h" #include "mruby/irep.h" -#include "compile.h" +#include "mruby/compile.h" #include "mruby/proc.h" #include "opcode.h" #include "mruby/string.h" @@ -7,6 +7,10 @@ #ifndef MRUBY_GC_H #define MRUBY_GC_H +#if defined(__cplusplus) +extern "C" { +#endif + typedef struct { union { struct free_obj { @@ -41,4 +45,8 @@ void mrb_gc_mark_ht(mrb_state*, struct RHash*); size_t mrb_gc_mark_ht_size(mrb_state*, struct RHash*); void mrb_gc_free_ht(mrb_state*, struct RHash*); +#if defined(__cplusplus) +} /* extern "C" { */ +#endif + #endif /* MRUBY_GC_H */ diff --git a/src/init.c b/src/init.c index 0d4b9721d..ea5591278 100644 --- a/src/init.c +++ b/src/init.c @@ -28,8 +28,6 @@ void mrb_init_file(mrb_state *); void mrb_init_thread(mrb_state *); void mrb_init_struct(mrb_state *); void mrb_init_gc(mrb_state *); -void Init_var_tables(mrb_state *mrb); -void Init_version(mrb_state *mrb); void mrb_init_print(mrb_state *mrb); void mrb_init_mrblib(mrb_state *mrb); void mrb_init_math(mrb_state *mrb); @@ -48,7 +46,6 @@ mrb_init_core(mrb_state *mrb) mrb_init_symbols(mrb); mrb_init_proc(mrb); mrb_init_string(mrb); - Init_version(mrb); /* after init_string */ mrb_init_array(mrb); mrb_init_hash(mrb); mrb_init_numeric(mrb); diff --git a/src/parse.y b/src/parse.y index fb3526034..41363b49e 100644 --- a/src/parse.y +++ b/src/parse.y @@ -14,7 +14,7 @@ #include "mruby.h" #include "st.h" -#include "compile.h" +#include "mruby/compile.h" #include <stdio.h> #include <errno.h> #include <ctype.h> @@ -967,12 +967,11 @@ var_reference(parser_state *p, node *lhs) %% program : { p->lstate = EXPR_BEG; - local_nest(p); + if (!p->locals) p->locals = cons(0,0); } top_compstmt { p->tree = new_scope(p, $2); - local_unnest(p); } ; @@ -2955,9 +2954,9 @@ yywarn(parser_state *p, const char *s) n = strlen(s); c = parser_palloc(p, n + 1); memcpy(c, s, n + 1); - p->error_buffer[p->nwarn].message = c; - p->error_buffer[p->nwarn].lineno = p->lineno; - p->error_buffer[p->nwarn].column = p->column; + p->warn_buffer[p->nwarn].message = c; + p->warn_buffer[p->nwarn].lineno = p->lineno; + p->warn_buffer[p->nwarn].column = p->column; } p->nwarn++; } @@ -4618,8 +4617,8 @@ yylex(void *lval, parser_state *p) return t; } -static void -start_parser(parser_state *p) +void +mrb_parser_parse(parser_state *p) { node *tree; @@ -4631,6 +4630,9 @@ start_parser(parser_state *p) } yyparse(p); tree = p->tree; + if ((int)tree->car == NODE_SCOPE) { + p->locals = cons(tree->cdr->car, 0); + } if (!tree) { if (p->begin_tree) { tree = p->begin_tree; @@ -4645,8 +4647,8 @@ start_parser(parser_state *p) } } -static parser_state* -parser_new(mrb_state *mrb) +parser_state* +mrb_parser_new(mrb_state *mrb) { mrb_pool *pool; parser_state *p; @@ -4661,6 +4663,9 @@ parser_new(mrb_state *mrb) p->pool = pool; p->in_def = p->in_single = 0; + p->s = p->send = NULL; + p->f = NULL; + p->cmd_start = TRUE; p->in_def = p->in_single = FALSE; @@ -4674,50 +4679,51 @@ parser_new(mrb_state *mrb) return p; } -parser_state* -mrb_parse_file(mrb_state *mrb, FILE *f, const char *fn, int line) +const char* +mrb_parser_filename(parser_state *p, const char *s) { - parser_state *p; - - p = parser_new(mrb); - if (!p) return 0; - p->s = p->send = NULL; - p->f = f; - if (line) p->lineno = line; - if (fn) mrb_parser_filename(p, fn); + if (s) { + p->filename = strdup(s); + } + return p->filename; +} - start_parser(p); - return p; +int +mrb_parser_lineno(struct mrb_parser_state *p, int n) +{ + if (n <= 0) { + return p->lineno; + } + p->column = 0; + p->lineno = n; + return n; } parser_state* -mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len) +mrb_parse_file(mrb_state *mrb, FILE *f) { parser_state *p; - - p = parser_new(mrb); + + p = mrb_parser_new(mrb); if (!p) return 0; - p->s = s; - p->send = s + len; - p->f = NULL; + p->s = p->send = NULL; + p->f = f; - start_parser(p); + mrb_parser_parse(p); return p; } parser_state* -mrb_parse_nstring_ext(mrb_state *mrb, const char *s, size_t len) +mrb_parse_nstring(mrb_state *mrb, const char *s, size_t len) { parser_state *p; - p = parser_new(mrb); + p = mrb_parser_new(mrb); if (!p) return 0; p->s = s; p->send = s + len; - p->f = NULL; - p->capture_errors = 1; - start_parser(p); + mrb_parser_parse(p); return p; } @@ -4732,12 +4738,12 @@ mrb_parse_string(mrb_state *mrb, const char *s) void parser_dump(mrb_state *mrb, node *tree, int offset); int -mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line) +mrb_compile_file(mrb_state * mrb, FILE *f) { parser_state *p; int n; - p = mrb_parse_file(mrb, f, fn, line); + p = mrb_parse_file(mrb, f); if (!p) return -1; if (!p->tree) return -1; if (p->nerr) return -1; @@ -4750,26 +4756,6 @@ mrb_compile_file(mrb_state * mrb, FILE *f,const char *fn, int line) return n; } -const char* -mrb_parser_filename(parser_state *p, const char *s) -{ - if (s) { - p->filename = strdup(s); - } - return p->filename; -} - -int -mrb_parser_lineno(struct mrb_parser_state *p, int n) -{ - if (n <= 0) { - return p->lineno; - } - p->column = 0; - p->lineno = n; - return n; -} - int mrb_compile_nstring(mrb_state *mrb, char *s, size_t len) { diff --git a/src/print.c b/src/print.c index 35fde4896..f9034470b 100644 --- a/src/print.c +++ b/src/print.c @@ -73,3 +73,16 @@ mrb_init_print(mrb_state *mrb) mrb_define_method(mrb, krn, "__printstr__", mrb_printstr, ARGS_REQ(1)); mrb_define_method(mrb, krn, "p", p_m, ARGS_ANY()); /* 15.3.1.3.34 */ } + + +void +mrb_show_version(mrb_state *mrb) +{ + printf("mruby - Embeddable Ruby Copyright (c) 2010-2012 mruby developers\n"); +} + +void +mrb_show_copyright(mrb_state *mrb) +{ + printf("mruby - Copyright (c) 2010-2012 mruby developers\n"); +} diff --git a/src/version.c b/src/version.c deleted file mode 100644 index 142c2239f..000000000 --- a/src/version.c +++ /dev/null @@ -1,81 +0,0 @@ -/* -** version.c - version information -** -** See Copyright Notice in mruby.h -*/ - -#include "mruby.h" -#include "version.h" -#include <stdio.h> -#include "mruby/string.h" -#include "mruby/variable.h" - -#define PRINT(type) puts(ruby_##type) -//#define MKSTR(type) mrb_obj_freeze(mrb_str_new(ruby_##type, sizeof(ruby_##type)-1)) -#define MKSTR(type) mrb_str_new(mrb, ruby_##type, sizeof(ruby_##type)-1) - -const char ruby_version[] = RUBY_VERSION; -const char ruby_release_date[] = RUBY_RELEASE_DATE; -const char ruby_platform[] = RUBY_PLATFORM; -const int ruby_patchlevel = RUBY_PATCHLEVEL; -const char ruby_engine[] = RUBY_ENGINE; - -void -Init_version(mrb_state *mrb) -{ - char description[128]; - char copyright[128]; - mrb_value v = MKSTR(version); - mrb_value d = MKSTR(release_date); - mrb_value p = MKSTR(platform); - mrb_value e = MKSTR(engine); - mrb_value tmp; - - mrb_define_global_const(mrb, "RUBY_VERSION", v); - mrb_define_global_const(mrb, "RUBY_RELEASE_DATE", d); - mrb_define_global_const(mrb, "RUBY_PLATFORM", p); - mrb_define_global_const(mrb, "RUBY_PATCHLEVEL", mrb_fixnum_value(RUBY_PATCHLEVEL)); - mrb_define_global_const(mrb, "RUBY_ENGINE", e); - - snprintf(description, sizeof(description), "ruby %s (%s %s %d) [%s]", - RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_RELEASE_STR, - RUBY_RELEASE_NUM, RUBY_PLATFORM); - //tmp = mrb_obj_freeze(mrb_str_new2(description)); - tmp = mrb_str_new2(mrb, description); - mrb_define_global_const(mrb, "RUBY_DESCRIPTION", tmp); - - snprintf(copyright, sizeof(copyright), "ruby - Copyright (C) %d-%d %s", - RUBY_BIRTH_YEAR, RUBY_RELEASE_YEAR, RUBY_AUTHOR); - //tmp = mrb_obj_freeze(mrb_str_new2(copyright)); - tmp = mrb_str_new2(mrb, copyright); - mrb_define_global_const(mrb, "RUBY_COPYRIGHT", tmp); - - /* obsolete constants */ - mrb_define_global_const(mrb, "VERSION", v); - mrb_define_global_const(mrb, "RELEASE_DATE", d); - mrb_define_global_const(mrb, "PLATFORM", p); -} - -void -ruby_show_version(mrb_state *mrb) -{ - mrb_value v = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern(mrb, "RUBY_DESCRIPTION")); - - if (mrb_type(v) != MRB_TT_STRING) - return; - - puts(RSTRING_PTR(v)); - fflush(stdout); -} - -void -ruby_show_copyright(mrb_state *mrb) -{ - mrb_value v = mrb_const_get(mrb, mrb_obj_value(mrb->object_class), mrb_intern(mrb, "RUBY_COPYRIGHT")); - - if (mrb_type(v) != MRB_TT_STRING) - return; - - puts(RSTRING_PTR(v)); - exit(0); -} diff --git a/src/version.h b/src/version.h deleted file mode 100644 index fed532886..000000000 --- a/src/version.h +++ /dev/null @@ -1,38 +0,0 @@ -/* -** version.h - version information -** -** See Copyright Notice in mruby.h -*/ - -#define RUBY_VERSION "1.8.7" -#define RUBY_RELEASE_DATE "2010-08-16" -#define RUBY_VERSION_CODE 187 -#define RUBY_RELEASE_CODE 20100816 -#define RUBY_PATCHLEVEL 302 - -#define RUBY_VERSION_MAJOR 1 -#define RUBY_VERSION_MINOR 8 -#define RUBY_VERSION_TEENY 7 -#define RUBY_RELEASE_YEAR 2010 -#define RUBY_RELEASE_MONTH 8 -#define RUBY_RELEASE_DAY 16 - -#ifdef RUBY_EXTERN -RUBY_EXTERN const char ruby_version[]; -RUBY_EXTERN const char ruby_release_date[]; -RUBY_EXTERN const char ruby_platform[]; -RUBY_EXTERN const int ruby_patchlevel; -RUBY_EXTERN const char *ruby_description; -RUBY_EXTERN const char *ruby_copyright; -#endif - -#define RUBY_AUTHOR "Yukihiro Matsumoto" -#define RUBY_BIRTH_YEAR 1993 -#define RUBY_BIRTH_MONTH 2 -#define RUBY_BIRTH_DAY 24 - -#define RUBY_RELEASE_STR "patchlevel" -#define RUBY_RELEASE_NUM RUBY_PATCHLEVEL - -#define RUBY_PLATFORM "i386-mingw32" -#define RUBY_ENGINE "ruby" diff --git a/test/Makefile b/test/Makefile index 8ee12dbf1..cb6ac3a5e 100644 --- a/test/Makefile +++ b/test/Makefile @@ -57,21 +57,16 @@ else CFLAGS = -O3 endif ALL_CFLAGS = -Wall -Werror-implicit-function-declaration $(CFLAGS) -ifeq ($(OS),Windows_NT) - MAKE_FLAGS = CC=$(CC) LL=$(LL) ALL_CFLAGS="$(ALL_CFLAGS)" -else - MAKE_FLAGS = CC='$(CC)' LL='$(LL)' ALL_CFLAGS='$(ALL_CFLAGS)' -endif ############################## # generic build targets, rules .PHONY : test -all : $(LIBR) $(EXE) +all : $(EXE) ./$(EXE) # executable constructed using linker from object files -$(EXE) : $(LIBR) $(OBJS) +$(EXE) : $(OBJS) $(LL) -o $@ $(CFLAGS) $(OBJS) $(LIBR) $(LIBS) -include $(OBJS:.o=.d) @@ -80,17 +75,10 @@ $(EXE) : $(LIBR) $(OBJS) $(OBJS) : %.o : %.c $(CC) $(ALL_CFLAGS) -MMD $(INCLUDES) -c $< -o $@ -# C library compile -$(LIBR) : - @$(MAKE) -C $(BASEDIR) $(MAKE_FLAGS) - # Compile C source from merged mruby source $(CLIB) : $(RLIB) $(MRBC) $(INIT) $(MRBC) -Bmrbtest_irep -o$(DLIB) $(RLIB); cat $(INIT) $(DLIB) > $@ -$(MRBC) : ../src/opcode.h ../src/codegen.c ../src/parse.y - $(MAKE) -C ../tools/mrbc $(MAKE_FLAGS) - # merge mruby sources $(RLIB) : $(ASSLIB) $(MRBS) cat $? > $@ diff --git a/test/driver.c b/test/driver.c index 90fa6a6d0..afc93b10b 100644 --- a/test/driver.c +++ b/test/driver.c @@ -10,7 +10,7 @@ #include <mruby.h> #include <mruby/proc.h> #include <mruby/data.h> -#include <compile.h> +#include <mruby/compile.h> void mrb_init_mrbtest(mrb_state *); @@ -27,29 +27,30 @@ int main(void) { struct mrb_parser_state *parser; - mrb_state *mrb_interpreter; - mrb_value mrb_return_value; + mrb_state *mrb; + mrb_value return_value; int byte_code; + const char *prog = "report()"; print_hint(); /* new interpreter instance */ - mrb_interpreter = mrb_open(); - mrb_init_mrbtest(mrb_interpreter); - parser = mrb_parse_nstring_ext(mrb_interpreter, "report()", strlen("report()")); + mrb = mrb_open(); + mrb_init_mrbtest(mrb); + parser = mrb_parse_nstring(mrb, prog, strlen(prog)); /* generate bytecode */ - byte_code = mrb_generate_code(mrb_interpreter, parser->tree); + byte_code = mrb_generate_code(mrb, parser->tree); /* evaluate the bytecode */ - mrb_return_value = mrb_run(mrb_interpreter, + return_value = mrb_run(mrb, /* pass a proc for evaulation */ - mrb_proc_new(mrb_interpreter, mrb_interpreter->irep[byte_code]), - mrb_top_self(mrb_interpreter)); + mrb_proc_new(mrb, mrb->irep[byte_code]), + mrb_top_self(mrb)); /* did an exception occur? */ - if (mrb_interpreter->exc) { - mrb_p(mrb_interpreter, mrb_return_value); - mrb_interpreter->exc = 0; + if (mrb->exc) { + mrb_p(mrb, return_value); + mrb->exc = 0; } else { /* no */ diff --git a/test/init_mrbtest.c b/test/init_mrbtest.c index 5d977da34..b9f09dd2f 100644 --- a/test/init_mrbtest.c +++ b/test/init_mrbtest.c @@ -12,5 +12,9 @@ mrb_init_mrbtest(mrb_state *mrb) int n = mrb_read_irep(mrb, mrbtest_irep); mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + exit(0); + } } diff --git a/tools/mirb/mirb.c b/tools/mirb/mirb.c index 11bdcfcf8..df7c29df6 100644 --- a/tools/mirb/mirb.c +++ b/tools/mirb/mirb.c @@ -11,7 +11,7 @@ #include <mruby.h> #include <mruby/proc.h> #include <mruby/data.h> -#include <compile.h> +#include <mruby/compile.h> /* Guess if the user might want to enter more * or if he wants an evaluation of his code now */ @@ -161,8 +161,10 @@ main(void) print_hint(); - /* new interpreter instance */ + /* new interpreter instance */ mrb_interpreter = mrb_open(); + /* new parser instance */ + parser = mrb_parser_new(mrb_interpreter); memset(ruby_code, 0, sizeof(*ruby_code)); memset(last_code_line, 0, sizeof(*last_code_line)); @@ -205,7 +207,10 @@ main(void) } /* parse code */ - parser = mrb_parse_nstring_ext(mrb_interpreter, ruby_code, strlen(ruby_code)); + parser->s = ruby_code; + parser->send = ruby_code + strlen(ruby_code); + parser->capture_errors = 1; + mrb_parser_parse(parser); code_block_open = is_code_block_open(parser); if (code_block_open) { diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 1f74defdf..dd210bfa9 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -2,15 +2,15 @@ #include "mruby/proc.h" #include "mruby/dump.h" #include "mruby/cdump.h" -#include "compile.h" +#include "mruby/compile.h" #include <stdio.h> #include <string.h> #include <stdlib.h> #define RITEBIN_EXT ".mrb" #define C_EXT ".c" -void ruby_show_version(mrb_state *); -void ruby_show_copyright(mrb_state *); +void mrb_show_version(mrb_state *); +void mrb_show_copyright(mrb_state *); void parser_dump(mrb_state*, struct mrb_ast_node*, int); void codedump_all(mrb_state*, int); @@ -96,19 +96,21 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) args->check_syntax = 1; break; case 'v': - ruby_show_version(mrb); + mrb_show_version(mrb); args->verbose = 1; break; case '-': if (strcmp((*argv) + 2, "version") == 0) { - ruby_show_version(mrb); + mrb_show_version(mrb); + exit(0); } else if (strcmp((*argv) + 2, "verbose") == 0) { args->verbose = 1; break; } else if (strcmp((*argv) + 2, "copyright") == 0) { - ruby_show_copyright(mrb); + mrb_show_copyright(mrb); + exit(0); } else return -3; return 0; @@ -164,7 +166,7 @@ main(int argc, char **argv) return n; } - p = mrb_parse_file(mrb, args.rfp, 0, 0); + p = mrb_parse_file(mrb, args.rfp); if (!p || !p->tree || p->nerr) { cleanup(&args); return -1; diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index f59cbcace..154f266d1 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -2,13 +2,13 @@ #include "mruby/proc.h" #include "mruby/array.h" #include "mruby/string.h" -#include "compile.h" +#include "mruby/compile.h" #include "mruby/dump.h" #include <stdio.h> #include <string.h> -void ruby_show_version(mrb_state *); -void ruby_show_copyright(mrb_state *); +void mrb_show_version(mrb_state *); +void mrb_show_copyright(mrb_state *); void parser_dump(mrb_state*, struct mrb_ast_node*, int); void codedump_all(mrb_state*, int); @@ -85,19 +85,21 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) } break; case 'v': - ruby_show_version(mrb); + mrb_show_version(mrb); args->verbose = 1; break; case '-': if (strcmp((*argv) + 2, "version") == 0) { - ruby_show_version(mrb); + mrb_show_version(mrb); + exit(0); } else if (strcmp((*argv) + 2, "verbose") == 0) { args->verbose = 1; break; } else if (strcmp((*argv) + 2, "copyright") == 0) { - ruby_show_copyright(mrb); + mrb_show_copyright(mrb); + exit(0); } else return -3; return 0; @@ -105,10 +107,12 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) } - if (args->rfp == NULL && args->cmdline == NULL && - (*argv == NULL || (args->rfp = fopen(*argv, args->mrbfile ? "rb" : "r")) == NULL)) { - printf("%s: Cannot open program file. (%s)\n", *origargv, *argv); - return 0; + if (args->rfp == NULL && args->cmdline == NULL) { + if (*argv == NULL) args->rfp = stdin; + else if ((args->rfp = fopen(*argv, args->mrbfile ? "rb" : "r")) == NULL) { + printf("%s: Cannot open program file. (%s)\n", *origargv, *argv); + return 0; + } } args->argv = mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1)); memcpy(args->argv, argv, (argc+1) * sizeof(char*)); @@ -152,7 +156,12 @@ main(int argc, char **argv) p = mrb_parse_string(mrb, (char*)args.cmdline); } else { - p = mrb_parse_file(mrb, args.rfp, argv[1], 0); + p = mrb_parser_new(mrb); + if (p) { + mrb_parser_filename(p, argv[1]); + p->f = args.rfp; + mrb_parser_parse(p); + } } if (!p || !p->tree || p->nerr) { cleanup(mrb, &args); |
