source: EcnlProtoTool/trunk/mruby-1.2.0/mrbgems/mruby-bin-strip/tools/mruby-strip/mruby-strip.c@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 3.0 KB
RevLine 
[270]1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include "mruby.h"
5#include "mruby/irep.h"
6#include "mruby/dump.h"
7
8struct strip_args {
9 int argc_start;
10 int argc;
11 char **argv;
12 mrb_bool lvar;
13};
14
15
16static void
17irep_remove_lv(mrb_state *mrb, mrb_irep *irep)
18{
19 size_t i;
20
21 if (irep->lv) {
22 mrb_free(mrb, irep->lv);
23 irep->lv = NULL;
24 }
25
26 for (i = 0; i < irep->rlen; ++i) {
27 irep_remove_lv(mrb, irep->reps[i]);
28 }
29}
30
31static void
32print_usage(const char *f)
33{
34 printf("Usage: %s [switches] irepfiles\n", f);
35 printf("switches:\n");
36 printf(" -l, --lvar remove LVAR section too.\n");
37}
38
39static int
40parse_args(int argc, char **argv, struct strip_args *args)
41{
42 int i;
43
44 args->argc_start = 0;
45 args->argc = argc;
46 args->argv = argv;
47 args->lvar = FALSE;
48
49 for (i = 1; i < argc; ++i) {
50 const size_t len = strlen(argv[i]);
51 if (len >= 2 && argv[i][0] == '-') {
52 switch (argv[i][1]) {
53 case 'l':
54 args->lvar = TRUE;
55 break;
56 case '-':
57 if (strncmp((*argv) + 2, "lvar", len) == 0) {
58 args->lvar = TRUE;
59 break;
60 }
61 default:
62 return -1;
63 }
64 }
65 else {
66 break;
67 }
68 }
69
70 args->argc_start = i;
71 return i;
72}
73
74static int
75strip(mrb_state *mrb, struct strip_args *args)
76{
77 int i;
78
79 for (i = args->argc_start; i < args->argc; ++i) {
80 char *filename;
81 FILE *rfile;
82 mrb_irep *irep;
83 FILE *wfile;
84 int dump_result;
85
86 filename = args->argv[i];
87 rfile = fopen(filename, "rb");
88 if (rfile == NULL) {
89 fprintf(stderr, "can't open file for reading %s\n", filename);
90 return EXIT_FAILURE;
91 }
92
93 irep = mrb_read_irep_file(mrb, rfile);
94 fclose(rfile);
95 if (irep == NULL) {
96 fprintf(stderr, "can't read irep file %s\n", filename);
97 return EXIT_FAILURE;
98 }
99
100 /* clear lv if --lvar is enabled */
101 if (args->lvar) {
102 irep_remove_lv(mrb, irep);
103 }
104
105 wfile = fopen(filename, "wb");
106 if (wfile == NULL) {
107 fprintf(stderr, "can't open file for writing %s\n", filename);
108 mrb_irep_decref(mrb, irep);
109 return EXIT_FAILURE;
110 }
111
112 /* debug flag must always be false */
113 dump_result = mrb_dump_irep_binary(mrb, irep, FALSE, wfile);
114
115 fclose(wfile);
116 mrb_irep_decref(mrb, irep);
117
118 if (dump_result != MRB_DUMP_OK) {
119 fprintf(stderr, "error occurred during dumping %s\n", filename);
120 return EXIT_FAILURE;
121 }
122 }
123 return EXIT_SUCCESS;
124}
125
126int
127main(int argc, char **argv)
128{
129 struct strip_args args;
130 int args_result;
131 mrb_state *mrb;
132 int ret;
133
134 if (argc <= 1) {
135 printf("no files to strip\n");
136 print_usage(argv[0]);
137 return EXIT_FAILURE;
138 }
139
140 args_result = parse_args(argc, argv, &args);
141 if (args_result < 0) {
142 print_usage(argv[0]);
143 return EXIT_FAILURE;
144 }
145 mrb = mrb_open_core(mrb_default_allocf, NULL);
146 if (mrb == NULL) {
147 fputs("Invalid mrb_state, exiting mruby-strip\n", stderr);
148 return EXIT_FAILURE;
149 }
150
151 ret = strip(mrb, &args);
152
153 mrb_close(mrb);
154 return ret;
155}
Note: See TracBrowser for help on using the repository browser.