summaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorDaniel Bovensiepen <[email protected]>2012-11-01 16:12:57 +0800
committerDaniel Bovensiepen <[email protected]>2012-11-01 16:12:57 +0800
commitcdb72a05a294eb8521dd40c011160228496312cb (patch)
tree283586ad23f2dc6dfd1fd1aaa354f18c23d8c0d6 /tools
parent88dfaf19aa0808f78d13133d61ea433d043923f9 (diff)
parent57910ca5353e1feba1fb069a876b84a52f33d39f (diff)
downloadmruby-cdb72a05a294eb8521dd40c011160228496312cb.tar.gz
mruby-cdb72a05a294eb8521dd40c011160228496312cb.zip
Merge remote-tracking branch 'upstream/master' into mrbgems
Diffstat (limited to 'tools')
-rw-r--r--tools/mrbc/mrbc.c55
-rw-r--r--tools/mruby/mruby.c53
2 files changed, 66 insertions, 42 deletions
diff --git a/tools/mrbc/mrbc.c b/tools/mrbc/mrbc.c
index 62bc34700..6d9c85fa9 100644
--- a/tools/mrbc/mrbc.c
+++ b/tools/mrbc/mrbc.c
@@ -70,6 +70,7 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
char *infile = NULL;
char *outfile = NULL;
char **origargv = argv;
+ int result = 0;
static const struct _args args_zero = { 0 };
*args = args_zero;
@@ -77,8 +78,11 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
for (argc--,argv++; argc > 0; argc--,argv++) {
if (**argv == '-') {
- if (strlen(*argv) <= 1)
- return -1;
+ if (strlen(*argv) == 1) {
+ args->filename = infile = "-";
+ args->rfp = stdin;
+ break;
+ }
switch ((*argv)[1]) {
case 'o':
@@ -90,7 +94,8 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
args->initname = (*argv) + 2;
if (*args->initname == '\0') {
printf("%s: Function name is not specified.\n", *origargv);
- return -2;
+ result = -2;
+ goto exit;
}
args->dump_type = ((*argv)[1] == 'B') ? DUMP_TYPE_BIN : DUMP_TYPE_CODE;
break;
@@ -114,8 +119,8 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
mrb_show_copyright(mrb);
exit(0);
}
- else return -3;
- return 0;
+ result = -3;
+ goto exit;
default:
break;
}
@@ -124,28 +129,36 @@ parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
args->filename = infile = *argv;
if ((args->rfp = fopen(infile, "r")) == NULL) {
printf("%s: Cannot open program file. (%s)\n", *origargv, infile);
- return 0;
+ goto exit;
}
}
}
- if (infile == NULL)
- return -4;
- if (args->check_syntax)
- return 0;
-
- if (outfile == NULL)
- outfile = get_outfilename(infile, args->ext);
-
- if (strcmp("-", outfile) == 0) {
- args->wfp = stdout;
+ if (infile == NULL) {
+ result = -4;
+ goto exit;
}
- else if ((args->wfp = fopen(outfile, "wb")) == NULL) {
- printf("%s: Cannot open output file. (%s)\n", *origargv, outfile);
- return 0;
+ if (!args->check_syntax) {
+ if (outfile == NULL) {
+ if (strcmp("-", infile) == 0) {
+ outfile = infile;
+ }
+ else {
+ outfile = get_outfilename(infile, args->ext);
+ }
+ }
+ if (strcmp("-", outfile) == 0) {
+ args->wfp = stdout;
+ }
+ else if ((args->wfp = fopen(outfile, "wb")) == NULL) {
+ printf("%s: Cannot open output file. (%s)\n", *origargv, outfile);
+ result = -1;
+ goto exit;
+ }
}
-
- return 0;
+ exit:
+ if (outfile && infile != outfile) free(outfile);
+ return result;
}
static void
diff --git a/tools/mruby/mruby.c b/tools/mruby/mruby.c
index 444170270..db26d23a1 100644
--- a/tools/mruby/mruby.c
+++ b/tools/mruby/mruby.c
@@ -25,6 +25,7 @@ void mrb_show_copyright(mrb_state *);
struct _args {
FILE *rfp;
char* cmdline;
+ int fname : 1;
int mrbfile : 1;
int check_syntax : 1;
int verbose : 1;
@@ -112,7 +113,7 @@ append_cmdline:
case '-':
if (strcmp((*argv) + 2, "version") == 0) {
mrb_show_version(mrb);
- exit(0);
+ exit(0);
}
else if (strcmp((*argv) + 2, "verbose") == 0) {
args->verbose = 1;
@@ -120,7 +121,7 @@ append_cmdline:
}
else if (strcmp((*argv) + 2, "copyright") == 0) {
mrb_show_copyright(mrb);
- exit(0);
+ exit(0);
}
else return -3;
return 0;
@@ -131,9 +132,15 @@ append_cmdline:
if (args->rfp == NULL && args->cmdline == NULL) {
if (*argv == NULL) args->rfp = stdin;
- else if ((args->rfp = fopen(*argv, args->mrbfile ? "rb" : "r")) == NULL) {
- printf("%s: Cannot open program file. (%s)\n", *origargv, *argv);
- return 0;
+ else {
+ args->rfp = fopen(argv[0], args->mrbfile ? "rb" : "r");
+ if (args->rfp == NULL) {
+ printf("%s: Cannot open program file. (%s)\n", *origargv, *argv);
+ return 0;
+ }
+ args->fname = 1;
+ args->cmdline = argv[0];
+ argc--; argv++;
}
}
args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1));
@@ -148,7 +155,7 @@ cleanup(mrb_state *mrb, struct _args *args)
{
if (args->rfp && args->rfp != stdin)
fclose(args->rfp);
- if (args->cmdline)
+ if (args->cmdline && !args->fname)
mrb_free(mrb, args->cmdline);
if (args->argv)
mrb_free(mrb, args->argv);
@@ -165,7 +172,7 @@ main(int argc, char **argv)
mrb_value ARGV;
if (mrb == NULL) {
- fprintf(stderr, "Invalid mrb_state, exiting mruby");
+ fprintf(stderr, "Invalid mrb_state, exiting mruby\n");
return EXIT_FAILURE;
}
@@ -176,7 +183,7 @@ main(int argc, char **argv)
return n;
}
- ARGV = mrb_ary_new(mrb);
+ ARGV = mrb_ary_new_capa(mrb, args.argc);
for (i = 0; i < args.argc; i++) {
mrb_ary_push(mrb, ARGV, mrb_str_new(mrb, args.argv[i], strlen(args.argv[i])));
}
@@ -184,12 +191,15 @@ main(int argc, char **argv)
if (args.mrbfile) {
n = mrb_load_irep(mrb, args.rfp);
- if (n >= 0) {
- if (!args.check_syntax) {
- mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
- if (mrb->exc) {
- p(mrb, mrb_obj_value(mrb->exc));
- }
+ if (n < 0) {
+ fprintf(stderr, "failed to load mrb file: %s\n", args.cmdline);
+ }
+ else if (!args.check_syntax) {
+ mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_top_self(mrb));
+ n = 0;
+ if (mrb->exc) {
+ p(mrb, mrb_obj_value(mrb->exc));
+ n = -1;
}
}
}
@@ -202,19 +212,20 @@ main(int argc, char **argv)
if (args.check_syntax)
c->no_exec = 1;
- if (args.cmdline) {
- mrbc_filename(mrb, c, "-e");
- v = mrb_load_string_cxt(mrb, (char*)args.cmdline, c);
+ if (args.rfp) {
+ mrbc_filename(mrb, c, args.cmdline ? args.cmdline : "-");
+ v = mrb_load_file_cxt(mrb, args.rfp, c);
}
else {
- mrbc_filename(mrb, c, args.argv[0]);
- v = mrb_load_file_cxt(mrb, args.rfp, c);
+ mrbc_filename(mrb, c, "-e");
+ v = mrb_load_string_cxt(mrb, args.cmdline, c);
}
mrbc_context_free(mrb, c);
if (mrb->exc) {
if (!mrb_undef_p(v)) {
- p(mrb, mrb_obj_value(mrb->exc));
+ p(mrb, mrb_obj_value(mrb->exc));
}
+ n = -1;
}
else if (args.check_syntax) {
printf("Syntax OK\n");
@@ -222,5 +233,5 @@ main(int argc, char **argv)
}
cleanup(mrb, &args);
- return n > 0 ? 0 : 1;
+ return n == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}