summaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/mrbc/Makefile1
-rw-r--r--tools/mrbc/mrbc.c10
-rw-r--r--tools/mruby/Makefile1
-rw-r--r--tools/mruby/mruby.c136
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;
}