summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-bin-mirb
diff options
context:
space:
mode:
authorYasuhiro Matsumoto <[email protected]>2015-09-11 11:56:15 +0900
committerYasuhiro Matsumoto <[email protected]>2015-09-12 13:23:22 +0900
commite20c2d78d136e23163aeeca208b47adf5e806c83 (patch)
treeb6aff9b1e20d879a2c09097f27b850a3866b5c87 /mrbgems/mruby-bin-mirb
parent8277e950eee4e8c6135eca281a7d5ca91077d2b4 (diff)
downloadmruby-e20c2d78d136e23163aeeca208b47adf5e806c83.tar.gz
mruby-e20c2d78d136e23163aeeca208b47adf5e806c83.zip
mirb should take filename and arguments.
Diffstat (limited to 'mrbgems/mruby-bin-mirb')
-rw-r--r--mrbgems/mruby-bin-mirb/tools/mirb/mirb.c45
1 files changed, 43 insertions, 2 deletions
diff --git a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
index 37fda352c..481d5ca43 100644
--- a/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
+++ b/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
@@ -194,6 +194,7 @@ is_code_block_open(struct mrb_parser_state *parser)
}
struct _args {
+ FILE *rfp;
mrb_bool verbose : 1;
int argc;
char** argv;
@@ -251,12 +252,30 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
return EXIT_FAILURE;
}
}
+
+ if (args->rfp == NULL) {
+ if (*argv != NULL) {
+ args->rfp = fopen(argv[0], "r");
+ if (args->rfp == NULL) {
+ printf("Cannot open program file. (%s)\n", *argv);
+ return EXIT_FAILURE;
+ }
+ argc--; argv++;
+ }
+ }
+ args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1));
+ memcpy(args->argv, argv, (argc+1) * sizeof(char*));
+ args->argc = argc;
+
return EXIT_SUCCESS;
}
static void
cleanup(mrb_state *mrb, struct _args *args)
{
+ if (args->rfp)
+ fclose(args->rfp);
+ mrb_free(mrb, args->argv);
mrb_close(mrb);
}
@@ -323,7 +342,9 @@ main(int argc, char **argv)
mrb_state *mrb;
mrb_value result;
struct _args args;
+ mrb_value ARGV;
int n;
+ int i;
mrb_bool code_block_open = FALSE;
int ai;
unsigned int stack_keep = 0;
@@ -334,7 +355,6 @@ main(int argc, char **argv)
fputs("Invalid mrb interpreter, exiting mirb\n", stderr);
return EXIT_FAILURE;
}
- mrb_define_global_const(mrb, "ARGV", mrb_ary_new_capa(mrb, 0));
n = parse_args(mrb, argc, argv, &args);
if (n == EXIT_FAILURE) {
@@ -343,6 +363,16 @@ main(int argc, char **argv)
return n;
}
+ ARGV = mrb_ary_new_capa(mrb, args.argc);
+ for (i = 0; i < args.argc; i++) {
+ char* utf8 = mrb_utf8_from_locale(args.argv[i], -1);
+ if (utf8) {
+ mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, utf8));
+ mrb_utf8_free(utf8);
+ }
+ }
+ mrb_define_global_const(mrb, "ARGV", ARGV);
+
#ifdef ENABLE_READLINE
history_path = get_history_path(mrb);
if (history_path == NULL) {
@@ -366,8 +396,17 @@ main(int argc, char **argv)
ai = mrb_gc_arena_save(mrb);
while (TRUE) {
+#ifdef ENABLE_READLINE
+ char* line;
+#endif
char *utf8;
+ if (args.rfp) {
+ if (fgets(last_code_line, sizeof(last_code_line)-1, args.rfp) != NULL)
+ goto done;
+ break;
+ }
+
#ifndef ENABLE_READLINE
print_cmdline(code_block_open);
@@ -388,7 +427,7 @@ main(int argc, char **argv)
last_code_line[char_index++] = '\n';
last_code_line[char_index] = '\0';
#else
- char* line = MIRB_READLINE(code_block_open ? "* " : "> ");
+ line = MIRB_READLINE(code_block_open ? "* " : "> ");
if (line == NULL) {
printf("\n");
break;
@@ -403,6 +442,8 @@ main(int argc, char **argv)
free(line);
#endif
+done:
+
if (code_block_open) {
if (strlen(ruby_code)+strlen(last_code_line) > sizeof(ruby_code)-1) {
fputs("concatenated input string too long\n", stderr);