diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/mrbc/Makefile | 1 | ||||
| -rw-r--r-- | tools/mrbc/mrbc.c | 10 | ||||
| -rw-r--r-- | tools/mruby/Makefile | 1 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 136 |
4 files changed, 98 insertions, 50 deletions
diff --git a/tools/mrbc/Makefile b/tools/mrbc/Makefile index ba7764b78..7271a2fed 100644 --- a/tools/mrbc/Makefile +++ b/tools/mrbc/Makefile @@ -69,5 +69,6 @@ $(YC) : $(YSRC) clean : -rm -f $(EXE) $(OBJS) $(OBJY) $(YC) -rm -f $(OBJS:.o=.d) $(OBJY:.o=.d) + -rm -f $(patsubst %.c,%.o,$(EXCEPT1)) $(patsubst %.c,%.d,$(EXCEPT1)) @echo "make: removing targets, objects and depend files of `pwd`" diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c index 1e54edbdf..cf73ef1d5 100644 --- a/tools/mrbc/mrbc.c +++ b/tools/mrbc/mrbc.c @@ -1,11 +1,11 @@ #include "mruby.h" #include "mruby/proc.h" +#include "mruby/dump.h" +#include "mruby/cdump.h" #include "compile.h" -#include "dump.h" -#include "cdump.h" -#include "stdio.h" -#include "memory.h" -#include "stdlib.h" +#include <stdio.h> +#include <memory.h> +#include <stdlib.h> #define RITEBIN_EXT ".mrb" #define C_EXT ".c" diff --git a/tools/mruby/Makefile b/tools/mruby/Makefile index dfb8b7f7c..62d7cdd3f 100644 --- a/tools/mruby/Makefile +++ b/tools/mruby/Makefile @@ -86,4 +86,5 @@ clean : $(MAKE) clean -C ../../mrblib $(MAKE_FLAGS) -rm -f $(EXE) $(OBJS) $(OBJY) $(YC) $(EXTS) -rm -f $(OBJS:.o=.d) $(OBJY:.o=.d) $(EXTS:.o=.d) + -rm -f $(patsubst %.c,%.o,$(EXCEPT1)) $(patsubst %.c,%.d,$(EXCEPT1)) @echo "make: removing targets, objects and depend files of `pwd`" diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 769746530..ef513312b 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -1,9 +1,11 @@ #include "mruby.h" #include "mruby/proc.h" +#include "mruby/array.h" +#include "mruby/string.h" #include "compile.h" -#include "dump.h" -#include "stdio.h" -#include "string.h" +#include "mruby/dump.h" +#include <stdio.h> +#include <string.h> void ruby_show_version(mrb_state *); void ruby_show_copyright(mrb_state *); @@ -12,9 +14,12 @@ void codedump_all(mrb_state*, int); struct _args { FILE *rfp; + char* cmdline; int mrbfile : 1; int check_syntax : 1; int verbose : 1; + int argc; + char** argv; }; static void @@ -24,6 +29,7 @@ usage(const char *name) "switches:", "-b load and execute RiteBinary (mrb) file", "-c check syntax only", + "-e 'command' one line of script", "-v print version number, then run in verbose mode", "--verbose run in verbose mode", "--version print the version", @@ -45,52 +51,80 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) memset(args, 0, sizeof(*args)); for (argc--,argv++; argc > 0; argc--,argv++) { - if (**argv == '-') { - if (strlen(*argv) <= 1) - return -1; - - switch ((*argv)[1]) { - case 'b': - args->mrbfile = 1; - break; - case 'c': - args->check_syntax = 1; - break; - case 'v': - ruby_show_version(mrb); - args->verbose = 1; - break; - case '-': - if (strcmp((*argv) + 2, "version") == 0) { - ruby_show_version(mrb); - } - else if (strcmp((*argv) + 2, "verbose") == 0) { - args->verbose = 1; - break; - } - else if (strcmp((*argv) + 2, "copyright") == 0) { - ruby_show_copyright(mrb); - } - else return -3; - return 0; + if (argv[0][0] != '-') break; + + if (strlen(*argv) <= 1) + return -1; + + switch ((*argv)[1]) { + case 'b': + args->mrbfile = 1; + break; + case 'c': + args->check_syntax = 1; + break; + case 'e': + if (argc > 1) { + argc--; argv++; + if (!args->cmdline) { + char *buf; + + buf = mrb_malloc(mrb, strlen(argv[0])+1); + strcpy(buf, argv[0]); + args->cmdline = buf; + } + else { + args->cmdline = mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(argv[0])+2); + strcat(args->cmdline, "\n"); + strcat(args->cmdline, argv[0]); + } } - } - else if (args->rfp == NULL) { - if ((args->rfp = fopen(*argv, args->mrbfile ? "rb" : "r")) == NULL) { - printf("%s: Cannot open program file. (%s)\n", *origargv, *argv); - return 0; + else { + printf("%s: No code specified for -e\n", *origargv); + return 0; + } + break; + case 'v': + ruby_show_version(mrb); + args->verbose = 1; + break; + case '-': + if (strcmp((*argv) + 2, "version") == 0) { + ruby_show_version(mrb); + } + else if (strcmp((*argv) + 2, "verbose") == 0) { + args->verbose = 1; + break; + } + else if (strcmp((*argv) + 2, "copyright") == 0) { + ruby_show_copyright(mrb); } + else return -3; + return 0; } } + + if (args->rfp == NULL && args->cmdline == NULL && (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*)); + args->argc = argc; + return 0; } static void -cleanup(struct _args *args) +cleanup(mrb_state *mrb, struct _args *args) { if (args->rfp) fclose(args->rfp); + if (args->cmdline) + mrb_free(mrb, args->cmdline); + if (args->argv) + mrb_free(mrb, args->argv); } int @@ -98,12 +132,13 @@ main(int argc, char **argv) { mrb_state *mrb = mrb_open(); int n = -1; + int i; struct _args args; struct mrb_parser_state *p; n = parse_args(mrb, argc, argv, &args); - if (n < 0 || args.rfp == NULL) { - cleanup(&args); + if (n < 0 || (args.cmdline == NULL && args.rfp == NULL)) { + cleanup(mrb, &args); usage(argv[0]); return n; } @@ -112,9 +147,14 @@ main(int argc, char **argv) n = mrb_load_irep(mrb, args.rfp); } else { - p = mrb_parse_file(mrb, args.rfp); + if (args.cmdline) { + p = mrb_parse_string(mrb, (char*)args.cmdline); + } + else { + p = mrb_parse_file(mrb, args.rfp); + } if (!p || !p->tree || p->nerr) { - cleanup(&args); + cleanup(mrb, &args); return -1; } @@ -126,18 +166,24 @@ main(int argc, char **argv) } if (n >= 0) { + mrb_value ARGV = mrb_ary_new(mrb); + for (i = 0; i < args.argc; i++) { + mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i]))); + } + mrb_define_global_const(mrb, "ARGV", ARGV); + if (args.verbose) codedump_all(mrb, n); if (!args.check_syntax) { - mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value()); + mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb)); if (mrb->exc) { - mrb_funcall(mrb, mrb_nil_value(), "p", 1, mrb_obj_value(mrb->exc)); + mrb_p(mrb, mrb_obj_value(mrb->exc)); } } } - cleanup(&args); + cleanup(mrb, &args); - return n; + return n > 0 ? 0 : 1; } |
