summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--tools/mruby/mruby.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c
index 879a9b4d2..259076434 100644
--- a/tools/mruby/mruby.c
+++ b/tools/mruby/mruby.c
@@ -12,6 +12,7 @@ void codedump_all(mrb_state*, int);
struct _args {
FILE *rfp;
+ char* cmdline;
int mrbfile : 1;
int check_syntax : 1;
int verbose : 1;
@@ -24,6 +25,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",
@@ -41,6 +43,7 @@ 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));
@@ -56,6 +59,9 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
case 'c':
args->check_syntax = 1;
break;
+ case 'e':
+ cmdline = 1;
+ break;
case 'v':
ruby_show_version(mrb);
args->verbose = 1;
@@ -75,6 +81,9 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
return 0;
}
}
+ else if (cmdline) {
+ args->cmdline = strdup(*argv);
+ }
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);
@@ -91,6 +100,8 @@ cleanup(struct _args *args)
{
if (args->rfp)
fclose(args->rfp);
+ if (args->cmdline)
+ free(args->cmdline);
}
int
@@ -102,7 +113,7 @@ main(int argc, char **argv)
struct mrb_parser_state *p;
n = parse_args(mrb, argc, argv, &args);
- if (n < 0 || args.rfp == NULL) {
+ if (n < 0 || (args.cmdline == NULL && args.rfp == NULL)) {
cleanup(&args);
usage(argv[0]);
return n;
@@ -112,7 +123,12 @@ 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);
return -1;