From 8df63b4d1f51814b86fa0db39d664d8fa37f148d Mon Sep 17 00:00:00 2001 From: cremno Date: Wed, 9 Jul 2014 14:18:37 +0200 Subject: check `mrb_open` return value --- mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c index f209fa060..b89b3d32d 100644 --- a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +++ b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c @@ -96,6 +96,10 @@ main(int argc, char **argv) } mrb = mrb_open(); + if (mrb == NULL) { + fputs("Invalid mrb_state, exiting mruby-strip\n", stderr); + return EXIT_FAILURE; + } ireps = (mrb_irep**)malloc(sizeof(mrb_irep*) * argc); for (i = args_result; i < argc; ++i) { -- cgit v1.2.3 From 41961ae6d0bfabdd00d47c75ae0c6339272e8592 Mon Sep 17 00:00:00 2001 From: cremno Date: Wed, 9 Jul 2014 15:32:13 +0200 Subject: rewrite stripping Previous version ignored some errors, and didn't free memory and close files. Now no memory will be dynamically allocated to simplify error handling. This commit also fixes a wrong check: files[i] = fopen(argv[i], "wb"); if (!ireps[i]) { Improve error messages a bit and add missing newline to one. --- .../tools/mruby-strip/mruby-strip.c | 103 +++++++++++++-------- 1 file changed, 62 insertions(+), 41 deletions(-) diff --git a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c index b89b3d32d..f4b821d4b 100644 --- a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +++ b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c @@ -6,6 +6,9 @@ #include "mruby/dump.h" struct strip_args { + int argc_start; + int argc; + char **argv; mrb_bool lvar; }; @@ -64,14 +67,65 @@ parse_args(int argc, char **argv, struct strip_args *args) return i; } +static int +strip(mrb_state *mrb, struct strip_args *args) +{ + int i; + + for (i = args->argc_start; i < args->argc; ++i) { + char *filename; + FILE *rfile; + mrb_irep *irep; + FILE *wfile; + int dump_result; + + filename = args->argv[i]; + rfile = fopen(filename, "rb"); + if (rfile == NULL) { + fprintf(stderr, "can't open file for reading %s\n", filename); + return EXIT_FAILURE; + } + + irep = mrb_read_irep_file(mrb, rfile); + fclose(rfile); + if (irep == NULL) { + fprintf(stderr, "can't read irep file %s\n", filename); + return EXIT_FAILURE; + } + + /* clear lv if --lvar is enabled */ + if (args->lvar) { + irep_remove_lv(mrb, irep); + } + + wfile = fopen(filename, "wb"); + if (wfile == NULL) { + fprintf(stderr, "can't open file for writing %s\n", filename); + mrb_irep_decref(mrb, irep); + return EXIT_FAILURE; + } + + /* debug flag must always be false */ + dump_result = mrb_dump_irep_binary(mrb, irep, FALSE, wfile); + + fclose(wfile); + mrb_irep_decref(mrb, irep); + + if (dump_result != MRB_DUMP_OK) { + fprintf(stderr, "error occurred during dumping %s\n", filename); + return EXIT_FAILURE; + } + } + return EXIT_SUCCESS; +} + int main(int argc, char **argv) { struct strip_args args; - int args_result, i, dump_result; - FILE **files; - mrb_irep **ireps; + int args_result; mrb_state *mrb; + int ret; if (argc <= 1) { printf("no files to strip\n"); @@ -85,15 +139,9 @@ main(int argc, char **argv) return EXIT_FAILURE; } - files = (FILE**)malloc(sizeof(FILE*) * argc); - for (i = args_result; i < argc; ++i) { - files[i] = fopen(argv[i], "rb"); - - if (!files[i]) { - fprintf(stderr, "can't open file %s\n", argv[i]); - return EXIT_FAILURE; - } - } + args.argc_start = args_result; + args.argc = argc; + args.argv = argv; mrb = mrb_open(); if (mrb == NULL) { @@ -101,35 +149,8 @@ main(int argc, char **argv) return EXIT_FAILURE; } - ireps = (mrb_irep**)malloc(sizeof(mrb_irep*) * argc); - for (i = args_result; i < argc; ++i) { - ireps[i] = mrb_read_irep_file(mrb, files[i]); - if (!ireps[i]) { - fprintf(stderr, "can't read irep file %s\n", argv[i]); - return EXIT_FAILURE; - } - fclose(files[i]); - files[i] = fopen(argv[i], "wb"); - if (!ireps[i]) { - fprintf(stderr, "can't reopen irep file %s\n", argv[i]); - return EXIT_FAILURE; - } - } - - for (i = args_result; i < argc; ++i) { - /* clear lv if --lvar is enabled */ - if (args.lvar) { - irep_remove_lv(mrb, ireps[i]); - } - - /* debug flag must be alway false */ - dump_result = mrb_dump_irep_binary(mrb, ireps[i], FALSE, files[i]); - if (dump_result != MRB_DUMP_OK) { - fprintf(stderr, "error occur when dumping %s", argv[i]); - return EXIT_FAILURE; - } - } + ret = strip(mrb, &args); mrb_close(mrb); - return EXIT_SUCCESS; + return ret; } -- cgit v1.2.3 From b4c1a943d17930bc24b076a952e36b3448c6aeb6 Mon Sep 17 00:00:00 2001 From: cremno Date: Wed, 9 Jul 2014 16:42:11 +0200 Subject: update expected error message in bintest --- mrbgems/mruby-bin-strip/bintest/mruby-strip.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb b/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb index 770ea0638..e74a74f10 100644 --- a/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb +++ b/mrbgems/mruby-bin-strip/bintest/mruby-strip.rb @@ -9,7 +9,7 @@ end assert('file not found') do o = `bin/mruby-strip not_found.mrb 2>&1` assert_equal 1, $?.exitstatus - assert_equal "can't open file not_found.mrb\n", o + assert_equal "can't open file for reading not_found.mrb\n", o end assert('not irep file') do -- cgit v1.2.3 From c90d923273cf49ea6d20351c3035e13ebedfb795 Mon Sep 17 00:00:00 2001 From: cremno Date: Wed, 9 Jul 2014 15:39:54 +0200 Subject: coding style adjustments --- mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c index f4b821d4b..28bb2ca76 100644 --- a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +++ b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c @@ -45,9 +45,9 @@ parse_args(int argc, char **argv, struct strip_args *args) *args = initial_args; for (i = 1; i < argc; ++i) { - size_t const len = strlen(argv[i]); + const size_t len = strlen(argv[i]); if (len >= 2 && argv[i][0] == '-') { - switch(argv[i][1]) { + switch (argv[i][1]) { case 'l': args->lvar = TRUE; break; @@ -59,7 +59,8 @@ parse_args(int argc, char **argv, struct strip_args *args) default: return -1; } - } else { + } + else { break; } } -- cgit v1.2.3 From 10bd78e85ddf3ba6238e7a37cef4ccad08dee51f Mon Sep 17 00:00:00 2001 From: cremno Date: Wed, 9 Jul 2014 16:36:07 +0200 Subject: initialize `args` in `parse_args` --- mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c index 28bb2ca76..75d6d49fd 100644 --- a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +++ b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c @@ -39,10 +39,12 @@ print_usage(const char *f) static int parse_args(int argc, char **argv, struct strip_args *args) { - static const struct strip_args initial_args = {0}; int i; - *args = initial_args; + args->argc_start = 0; + args->argc = argc; + args->argv = argv; + args->lvar = FALSE; for (i = 1; i < argc; ++i) { const size_t len = strlen(argv[i]); @@ -65,6 +67,7 @@ parse_args(int argc, char **argv, struct strip_args *args) } } + args->argc_start = i; return i; } @@ -139,11 +142,6 @@ main(int argc, char **argv) print_usage(argv[0]); return EXIT_FAILURE; } - - args.argc_start = args_result; - args.argc = argc; - args.argv = argv; - mrb = mrb_open(); if (mrb == NULL) { fputs("Invalid mrb_state, exiting mruby-strip\n", stderr); -- cgit v1.2.3