diff options
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/mruby/mruby.c | 127 |
1 files changed, 73 insertions, 54 deletions
diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c index 0a2aa85e9..ef513312b 100644 --- a/tools/mruby/mruby.c +++ b/tools/mruby/mruby.c @@ -1,5 +1,7 @@ #include "mruby.h" #include "mruby/proc.h" +#include "mruby/array.h" +#include "mruby/string.h" #include "compile.h" #include "mruby/dump.h" #include <stdio.h> @@ -16,6 +18,8 @@ struct _args { int mrbfile : 1; int check_syntax : 1; int verbose : 1; + int argc; + char** argv; }; static void @@ -43,76 +47,84 @@ static int parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args) { char **origargv = argv; - int cmdline = 0; 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 'e': - cmdline = 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; - } - } - else if (cmdline) { - if (!args->cmdline) { - char *buf; + if (argv[0][0] != '-') break; + + if (strlen(*argv) <= 1) + return -1; - buf = mrb_malloc(mrb, strlen(argv[0])+1); - strcpy(buf, argv[0]); - args->cmdline = buf; + 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 { - args->cmdline = mrb_realloc(mrb, args->cmdline, strlen(args->cmdline)+strlen(argv[0])+2); - strcat(args->cmdline, "\n"); - strcat(args->cmdline, argv[0]); + printf("%s: No code specified for -e\n", *origargv); + return 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; + 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) - free(args->cmdline); + mrb_free(mrb, args->cmdline); + if (args->argv) + mrb_free(mrb, args->argv); } int @@ -120,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.cmdline == NULL && args.rfp == NULL)) { - cleanup(&args); + cleanup(mrb, &args); usage(argv[0]); return n; } @@ -141,7 +154,7 @@ main(int argc, char **argv) p = mrb_parse_file(mrb, args.rfp); } if (!p || !p->tree || p->nerr) { - cleanup(&args); + cleanup(mrb, &args); return -1; } @@ -153,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_top_self(mrb)); if (mrb->exc) { - mrb_p(mrb, mrb_obj_value(mrb->exc)); + mrb_p(mrb, mrb_obj_value(mrb->exc)); } } } - cleanup(&args); + cleanup(mrb, &args); return n > 0 ? 0 : 1; } |
