diff options
| author | Daniel Bovensiepen <[email protected]> | 2012-11-01 16:12:57 +0800 |
|---|---|---|
| committer | Daniel Bovensiepen <[email protected]> | 2012-11-01 16:12:57 +0800 |
| commit | cdb72a05a294eb8521dd40c011160228496312cb (patch) | |
| tree | 283586ad23f2dc6dfd1fd1aaa354f18c23d8c0d6 /tools | |
| parent | 88dfaf19aa0808f78d13133d61ea433d043923f9 (diff) | |
| parent | 57910ca5353e1feba1fb069a876b84a52f33d39f (diff) | |
| download | mruby-cdb72a05a294eb8521dd40c011160228496312cb.tar.gz mruby-cdb72a05a294eb8521dd40c011160228496312cb.zip | |
Merge remote-tracking branch 'upstream/master' into mrbgems
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/mrbc/mrbc.c | 55 | ||||
| -rw-r--r-- | tools/mruby/mruby.c | 53 |
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; } |
