diff options
| author | take_cheeze <[email protected]> | 2014-05-15 15:09:08 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-05-15 15:15:06 +0900 |
| commit | e0064acac71a28b75797c3e3ea1b8aca1ce8a796 (patch) | |
| tree | b40492fef958e057ec4cab5a4d9d1298bc8a6995 /mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c | |
| parent | 30e0dc79566430a176dd2cfab593cd3620ba69da (diff) | |
| download | mruby-e0064acac71a28b75797c3e3ea1b8aca1ce8a796.tar.gz mruby-e0064acac71a28b75797c3e3ea1b8aca1ce8a796.zip | |
Implement `LVAR` section removing option in mruby-strip.
Diffstat (limited to 'mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c')
| -rw-r--r-- | mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c | 67 |
1 files changed, 62 insertions, 5 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 dee3e0cd6..dca50f03f 100644 --- a/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c +++ b/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c @@ -1,24 +1,76 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> #include "mruby.h" #include "mruby/irep.h" #include "mruby/dump.h" +struct strip_args { + mrb_bool lvar; +}; + +static void +print_usage(const char *f) +{ + printf("Usage: %s [options] irepfiles\n", f); + printf("options:\n"); + printf(" -l, --lvar remove LVAR section too.\n"); +} + +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; + + for (i = 1; i < argc; ++i) { + size_t const len = strlen(argv[i]); + if (len >= 2 && argv[i][0] == '-') { + switch(argv[i][1]) { + case 'l': + args->lvar = TRUE; + break; + case '-': + if (strncmp((*argv) + 2, "lvar", len) == 0) { + args->lvar = TRUE; + break; + } + default: + return -1; + } + } else { + break; + } + } + + return i; +} + int main(int argc, char **argv) { - int i, dump_result; + struct strip_args args; + int args_result, i, dump_result; FILE **files; mrb_irep **ireps; mrb_state *mrb; if (argc <= 1) { - fprintf(stderr, "no files to strip\n"); + printf("no files to strip\n"); + print_usage(argv[0]); + return EXIT_FAILURE; + } + + args_result = parse_args(argc, argv, &args); + if (args_result < 0) { + print_usage(argv[0]); return EXIT_FAILURE; } files = (FILE**)malloc(sizeof(FILE*) * argc); - for (i = 1; i < argc; ++i) { + for (i = args_result; i < argc; ++i) { files[i] = fopen(argv[i], "rb"); if (!files[i]) { @@ -30,7 +82,7 @@ main(int argc, char **argv) mrb = mrb_open(); ireps = (mrb_irep**)malloc(sizeof(mrb_irep*) * argc); - for (i = 1; i < argc; ++i) { + 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]); @@ -44,7 +96,12 @@ main(int argc, char **argv) } } - for (i = 1; i < argc; ++i) { + for (i = args_result; i < argc; ++i) { + /* clear lv if --lvar is enabled */ + if (args.lvar) { + mrb_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) { |
