funky-cli 0.0.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f56bde6982bfdedb5db4bf82420cc2bd615860fe
4
- data.tar.gz: 23a432baa90d51b61959b08b4cfc379ffba6deef
3
+ metadata.gz: 60569a154fee04e94e0a645a553e1b11dd6f6acc
4
+ data.tar.gz: 2d2777172480c008f8646076e39d4cbde708e3f0
5
5
  SHA512:
6
- metadata.gz: cda5dbcdb7d788d73273dac914bd74afc860feafa688bc9c636c571f361952348a56d950a0512574548a46d3058b821d33a222dc943a97dda959501209466f71
7
- data.tar.gz: e5e6d948be3426f55bbda59756733e4183600febd4e33620b6aea4fec5f466b214be61ee084b2a89f67d577b6f3ce92c90683d4846e1c3c45f4b88f15e8223ce
6
+ metadata.gz: b3b9ffca21d7cc07a00417a205c0868ac2abdea28a51e411cb7615a5902dbcaccd8199e9596d51d3c0405e1b3f3d616bbd197aeb7c76746f51a9b5284c238baa
7
+ data.tar.gz: cdcd0fd7e955b299e794576ba1d261363d5a7654994a5a7d6065f271bd5527147f8cf7aece9f732cddebec12e22d89482aa47b949c7523864758afef1b1e63a7
data/Rakefile CHANGED
@@ -98,3 +98,4 @@ desc "cleanup"
98
98
  task :clean do
99
99
  sh "rake deep_clean"
100
100
  end
101
+
data/build_config.rb CHANGED
@@ -1,5 +1,49 @@
1
1
  def gem_config(conf)
2
- #conf.gembox 'default'
2
+ conf.gem :core => "mruby-sprintf"
3
+ conf.gem :mgem => 'mruby-mtest'
4
+ conf.gem :core => "mruby-print"
5
+ conf.gem :core => "mruby-math"
6
+ conf.gem :core => "mruby-time"
7
+ conf.gem :core => "mruby-struct"
8
+ conf.gem :core => "mruby-enum-ext"
9
+ conf.gem :core => "mruby-string-ext"
10
+ conf.gem :core => "mruby-numeric-ext"
11
+ conf.gem :core => "mruby-array-ext"
12
+ conf.gem :core => "mruby-hash-ext"
13
+ conf.gem :core => "mruby-range-ext"
14
+ conf.gem :core => "mruby-proc-ext"
15
+ conf.gem :core => "mruby-symbol-ext"
16
+ conf.gem :core => "mruby-random"
17
+ conf.gem :core => "mruby-object-ext"
18
+ conf.gem :core => "mruby-objectspace"
19
+ conf.gem :core => "mruby-fiber"
20
+ conf.gem :core => "mruby-enumerator"
21
+ conf.gem :core => "mruby-enum-lazy"
22
+ conf.gem :core => "mruby-toplevel-ext"
23
+ conf.gem :core => "mruby-kernel-ext"
24
+ conf.gem :core => "mruby-eval"
25
+ conf.gem :core => "mruby-exit"
26
+
27
+ conf.gem :github => "scalone/mruby-hs-regexp"
28
+ conf.gem :mgem => "mruby-io"
29
+ conf.gem :mgem => "mruby-dir"
30
+ conf.gem :mgem => "mruby-tempfile"
31
+ conf.gem :github => "iij/mruby-require"
32
+ conf.gem :mgem => "mruby-socket"
33
+ conf.gem :mgem => "mruby-pack"
34
+ conf.gem :mgem => "mruby-polarssl"
35
+ #conf.gem :github => "sadasant/mruby-qrcode", :check_sum => "83205181508fe77f9fa7e556002334e439bcbc7b"
36
+ conf.gem :github => "scalone/mruby-miniz"
37
+ conf.gem :mgem => "mruby-sleep"
38
+ conf.gem :mgem => "mruby-msgpack"
39
+ conf.gem :mgem => "mruby-json"
40
+ conf.gem :github => "scalone/mruby-context"
41
+ conf.gem :github => "scalone/mruby-ripemd"
42
+ conf.gem :github => "scalone/mruby-hmac"
43
+ conf.gem :mgem => "mruby-sha2"
44
+ conf.gem :mgem => "mruby-sha1"
45
+ conf.gem :mgem => "mruby-base58"
46
+ conf.gem :mgem => "mruby-bignum"
3
47
 
4
48
  # be sure to include this gem (the cli app)
5
49
  conf.gem File.expand_path(File.dirname(__FILE__))
@@ -12,7 +56,10 @@ MRuby::Build.new do |conf|
12
56
  conf.enable_debug
13
57
  conf.enable_test
14
58
 
15
- gem_config(conf)
59
+ conf.gem :mgem => 'mruby-mtest'
60
+ conf.gem :core => "mruby-print"
61
+
62
+ #gem_config(conf)
16
63
  end
17
64
 
18
65
  MRuby::Build.new('x86_64-pc-linux-gnu') do |conf|
@@ -92,3 +139,4 @@ MRuby::CrossBuild.new('i686-w64-mingw32') do |conf|
92
139
 
93
140
  gem_config(conf)
94
141
  end
142
+
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/mrbgem.rake CHANGED
@@ -4,6 +4,50 @@ MRuby::Gem::Specification.new('funky-cli') do |spec|
4
4
  spec.summary = 'funky-cli'
5
5
  spec.bins = ['funky-cli']
6
6
 
7
- spec.add_dependency 'mruby-print', :core => 'mruby-print'
7
+ spec.add_dependency "mruby-sprintf", :core => "mruby-sprintf"
8
8
  spec.add_dependency 'mruby-mtest', :mgem => 'mruby-mtest'
9
+ spec.add_dependency "mruby-print", :core => "mruby-print"
10
+ spec.add_dependency "mruby-math", :core => "mruby-math"
11
+ spec.add_dependency "mruby-time", :core => "mruby-time"
12
+ spec.add_dependency "mruby-struct", :core => "mruby-struct"
13
+ spec.add_dependency "mruby-enum-ext", :core => "mruby-enum-ext"
14
+ spec.add_dependency "mruby-string-ext", :core => "mruby-string-ext"
15
+ spec.add_dependency "mruby-numeric-ext", :core => "mruby-numeric-ext"
16
+ spec.add_dependency "mruby-array-ext", :core => "mruby-array-ext"
17
+ spec.add_dependency "mruby-hash-ext", :core => "mruby-hash-ext"
18
+ spec.add_dependency "mruby-range-ext", :core => "mruby-range-ext"
19
+ spec.add_dependency "mruby-proc-ext", :core => "mruby-proc-ext"
20
+ spec.add_dependency "mruby-symbol-ext", :core => "mruby-symbol-ext"
21
+ spec.add_dependency "mruby-random", :core => "mruby-random"
22
+ spec.add_dependency "mruby-object-ext", :core => "mruby-object-ext"
23
+ spec.add_dependency "mruby-objectspace", :core => "mruby-objectspace"
24
+ spec.add_dependency "mruby-fiber", :core => "mruby-fiber"
25
+ spec.add_dependency "mruby-enumerator", :core => "mruby-enumerator"
26
+ spec.add_dependency "mruby-enum-lazy", :core => "mruby-enum-lazy"
27
+ spec.add_dependency "mruby-toplevel-ext", :core => "mruby-toplevel-ext"
28
+ spec.add_dependency "mruby-kernel-ext", :core => "mruby-kernel-ext"
29
+ spec.add_dependency "mruby-eval", :core => "mruby-eval"
30
+ spec.add_dependency "mruby-exit", :core => "mruby-exit"
31
+
32
+ spec.add_dependency "mruby-hs-regexp", :github => "scalone/mruby-hs-regexp"
33
+ spec.add_dependency "mruby-io", :mgem => "mruby-io"
34
+ spec.add_dependency "mruby-dir", :mgem => "mruby-dir"
35
+ spec.add_dependency "mruby-tempfile", :mgem => "mruby-tempfile"
36
+ spec.add_dependency "mruby-require", :github => "iij/mruby-require"
37
+ spec.add_dependency "mruby-socket", :mgem => "mruby-socket"
38
+ spec.add_dependency "mruby-pack", :mgem => "mruby-pack"
39
+ spec.add_dependency "mruby-polarssl", :mgem => "mruby-polarssl"
40
+ #spec.add_dependency "mruby-qrcode", :github => "sadasant/mruby-qrcode", :check_sum => "83205181508fe77f9fa7e556002334e439bcbc7b"
41
+ spec.add_dependency "mruby-miniz", :github => "scalone/mruby-miniz"
42
+ spec.add_dependency "mruby-sleep", :mgem => "mruby-sleep"
43
+ spec.add_dependency "mruby-msgpack", :mgem => "mruby-msgpack"
44
+ spec.add_dependency "mruby-json", :mgem => "mruby-json"
45
+ spec.add_dependency "mruby-context", :github => "scalone/mruby-context"
46
+ spec.add_dependency "mruby-ripemd", :github => "scalone/mruby-ripemd"
47
+ spec.add_dependency "mruby-hmac", :github => "scalone/mruby-hmac"
48
+ spec.add_dependency "mruby-sha2", :mgem => "mruby-sha2"
49
+ spec.add_dependency "mruby-sha1", :mgem => "mruby-sha1"
50
+ spec.add_dependency "mruby-base58", :mgem => "mruby-base58"
51
+ spec.add_dependency "mruby-bignum", :mgem => "mruby-bignum"
9
52
  end
53
+
@@ -0,0 +1,13 @@
1
+ module FunkyCli
2
+ class Helper
3
+ def self.run
4
+ puts "funky-cli [switches] [arguments]"
5
+ puts "funky-cli help : show this message"
6
+ puts "funky-cli new <name> : create app"
7
+ puts "funky-cli compile -o<out> <file1> <file2> : compile ruby to mrb"
8
+ puts "funky-cli console : mirb console"
9
+ puts "funky-cli run -b <out>, <file1> : run ruby or binary file"
10
+ puts "funky-cli version : print funky-cli version"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,24 @@
1
+ module FunkyCli
2
+ class Mruby
3
+ def self.run(*args)
4
+ FunkyCli.mruby(args.size + 1, args.insert(0, "mruby"))
5
+ end
6
+
7
+ def self.compile(*args)
8
+ FunkyCli.mrbc(args.size + 1, args.insert(0, "mrbc"))
9
+ end
10
+
11
+ def self.console(*args)
12
+ path = File.expand_path("./")
13
+ app = File.basename(path)
14
+ if File.exists?(File.join(path, "out", app, "main.mrb"))
15
+ Dir.chdir("out")
16
+ $LOAD_PATH.unshift "./#{app}"
17
+ require "da_funk"
18
+ require "main"
19
+ end
20
+ FunkyCli.mirb
21
+ end
22
+ end
23
+ end
24
+
@@ -0,0 +1,140 @@
1
+ module FunkyCli
2
+ class Setup
3
+ def self.run(name)
4
+ Dir.mkdir(name) unless Dir.exist?(name)
5
+ Dir.chdir(name) do
6
+ write_file(".gitignore", gitignore)
7
+ write_file("Gemfile", gemfile)
8
+ write_file("Rakefile", rakefile)
9
+ create_dir_p("lib")
10
+ write_file("lib/main.rb", main)
11
+ create_dir_p("test/unit")
12
+ create_dir_p("test/integration")
13
+ write_file("test/test_helper.rb", helper)
14
+ write_file("test/unit/#{name}_test.rb", unit(name))
15
+ write_file("test/integration/#{name}_test.rb", integration)
16
+ end
17
+ end
18
+
19
+ def self.gitignore
20
+ <<IGNORE
21
+ out/
22
+ IGNORE
23
+ end
24
+
25
+ def self.create_dir_p(dir)
26
+ dir.split("/").inject("") do |parent, base|
27
+ new_dir =
28
+ if parent == ""
29
+ base
30
+ else
31
+ "#{parent}/#{base}"
32
+ end
33
+
34
+ create_dir(new_dir)
35
+
36
+ new_dir
37
+ end
38
+ end
39
+
40
+ def self.create_dir(dir)
41
+ if Dir.exist?(dir)
42
+ puts " skip #{dir}"
43
+ else
44
+ puts " create #{dir}/"
45
+ Dir.mkdir(dir)
46
+ end
47
+ end
48
+
49
+ def self.write_file(file, contents)
50
+ puts " create #{file}"
51
+ File.open(file, 'w') {|file| file.puts contents }
52
+ end
53
+
54
+ def self.gemfile
55
+ <<GEMFILE
56
+ source 'https://rubygems.org'
57
+
58
+ gem 'da_funk'
59
+ gem 'funky-cli'
60
+ gem 'rake'
61
+ GEMFILE
62
+ end
63
+
64
+ def self.rakefile
65
+ <<RAKEFILE
66
+ #!/usr/bin/env rake
67
+
68
+ require 'rake'
69
+ require 'fileutils'
70
+ require 'bundler/setup'
71
+
72
+ Bundler.require(:default)
73
+
74
+ DaFunk::RakeTask.new do |t|
75
+ t.mrbc = "funky-cli compile"
76
+ t.mruby = "funky-cli run -b"
77
+ end
78
+ RAKEFILE
79
+ end
80
+
81
+ def self.main
82
+ <<MAIN
83
+ class Main < Device
84
+ def self.call
85
+ puts "Hello World!"
86
+ getc
87
+ true
88
+ end
89
+
90
+ def self.foo
91
+ :foo
92
+ end
93
+
94
+ def self.version
95
+ "0.0.1"
96
+ end
97
+ end
98
+ MAIN
99
+ end
100
+
101
+ def self.helper
102
+ <<HELPER
103
+ ROOT_PATH = File.expand_path("../")
104
+ APP_NAME = File.basename(ROOT_PATH)
105
+
106
+ $LOAD_PATH.unshift "./\#{APP_NAME}"
107
+ require 'da_funk'
108
+
109
+ DaFunk::Test.configure do |t|
110
+ t.root_path = ROOT_PATH
111
+ t.name = APP_NAME
112
+ end
113
+ HELPER
114
+ end
115
+
116
+ def self.integration
117
+ <<INTEGRATION
118
+ class MainTest < DaFunk::Test.case
119
+ def test_true
120
+ assert Main.call
121
+ end
122
+ end
123
+ INTEGRATION
124
+ end
125
+
126
+ def self.unit(name)
127
+ <<UNIT
128
+ class #{Util.camelize(name)}Test < DaFunk::Test.case
129
+ def test_foo0
130
+ assert_equal :foo, Main.foo
131
+ end
132
+
133
+ def test_foo1
134
+ assert_equal :foo, Main.foo
135
+ end
136
+ end
137
+ UNIT
138
+ end
139
+ end
140
+ end
@@ -1,3 +1,3 @@
1
1
  module FunkyCli
2
- VERSION = "0.0.1"
2
+ VERSION = "0.2.0"
3
3
  end
data/mrblib/funky-cli.rb CHANGED
@@ -1,7 +1,18 @@
1
1
  def __main__(argv)
2
- if argv[1] == "version"
2
+ case argv[1]
3
+ when "version"
3
4
  puts "v#{FunkyCli::VERSION}"
5
+ when "new"
6
+ FunkyCli::Setup.run(argv[2])
7
+ when "help"
8
+ FunkyCli::Helper.run
9
+ when "compile"
10
+ FunkyCli::Mruby.compile(*argv[2..-1])
11
+ when "run"
12
+ FunkyCli::Mruby.run(*argv[2..-1])
13
+ when "console"
14
+ FunkyCli::Mruby.console
4
15
  else
5
- puts "Hello World"
16
+ FunkyCli::Helper.run
6
17
  end
7
18
  end
data/mrblib/util.rb ADDED
@@ -0,0 +1,10 @@
1
+ class Util
2
+ class << self
3
+ def camelize(string)
4
+ string.split("-").map {|w| w.capitalize }.map {|w|
5
+ w.split("_").map {|w2| w2.capitalize }.join('')
6
+ }.join('')
7
+ end
8
+ end
9
+ end
10
+
@@ -0,0 +1,316 @@
1
+ #include <stdlib.h>
2
+ #include <stdio.h>
3
+ #include <string.h>
4
+
5
+ #include "mruby.h"
6
+ #include "mruby/compile.h"
7
+ #include "mruby/value.h"
8
+ #include "mruby/array.h"
9
+ #include "mruby/string.h"
10
+ #include "mruby/hash.h"
11
+ #include "mruby/dump.h"
12
+ #include "mruby/proc.h"
13
+
14
+ #define DONE mrb_gc_arena_restore(mrb, 0)
15
+
16
+ #define RITEBIN_EXT ".mrb"
17
+ #define C_EXT ".c"
18
+
19
+ struct mrbc_args {
20
+ int argc;
21
+ char **argv;
22
+ int idx;
23
+ const char *prog;
24
+ const char *outfile;
25
+ const char *initname;
26
+ mrb_bool check_syntax : 1;
27
+ mrb_bool verbose : 1;
28
+ unsigned int flags : 4;
29
+ };
30
+
31
+ static char *
32
+ get_outfilename(mrb_state *mrb, char *infile, const char *ext)
33
+ {
34
+ size_t infilelen;
35
+ size_t extlen;
36
+ char *outfile;
37
+ char *p;
38
+
39
+ infilelen = strlen(infile);
40
+ extlen = strlen(ext);
41
+ outfile = (char*)mrb_malloc(mrb, infilelen + extlen + 1);
42
+ memcpy(outfile, infile, infilelen + 1);
43
+ if (*ext) {
44
+ if ((p = strrchr(outfile, '.')) == NULL)
45
+ p = outfile + infilelen;
46
+ memcpy(p, ext, extlen + 1);
47
+ }
48
+
49
+ return outfile;
50
+ }
51
+
52
+ static int
53
+ parse_args(mrb_state *mrb, int argc, char **argv, struct mrbc_args *args)
54
+ {
55
+ char *outfile = NULL;
56
+ static const struct mrbc_args args_zero = { 0 };
57
+ int i;
58
+
59
+ *args = args_zero;
60
+ args->argc = argc;
61
+ args->argv = argv;
62
+ args->prog = argv[0];
63
+
64
+ for (i=1; i<argc; i++) {
65
+ if (argv[i][0] == '-') {
66
+ /*fprintf(stderr, "[%d]", (argv[i])[1]);*/
67
+ switch ((argv[i])[1]) {
68
+ case 'o':
69
+ if (args->outfile) {
70
+ fprintf(stderr, "%s: an output file is already specified. (%s)\n",
71
+ args->prog, outfile);
72
+ return -1;
73
+ }
74
+ if (argv[i][2] == '\0' && argv[i+1]) {
75
+ i++;
76
+ args->outfile = get_outfilename(mrb, argv[i], "");
77
+ }
78
+ else {
79
+ args->outfile = get_outfilename(mrb, argv[i] + 2, "");
80
+ }
81
+ break;
82
+ case 'B':
83
+ if (argv[i][2] == '\0' && argv[i+1]) {
84
+ i++;
85
+ args->initname = argv[i];
86
+ }
87
+ else {
88
+ args->initname = argv[i]+2;
89
+ }
90
+ if (*args->initname == '\0') {
91
+ fprintf(stderr, "%s: function name is not specified.\n", args->prog);
92
+ return -1;
93
+ }
94
+ break;
95
+ case 'c':
96
+ args->check_syntax = TRUE;
97
+ break;
98
+ case 'v':
99
+ if (!args->verbose) mrb_show_version(mrb);
100
+ args->verbose = TRUE;
101
+ break;
102
+ case 'g':
103
+ args->flags |= DUMP_DEBUG_INFO;
104
+ break;
105
+ case 'E':
106
+ args->flags = DUMP_ENDIAN_BIG | (args->flags & ~DUMP_ENDIAN_MASK);
107
+ break;
108
+ case 'e':
109
+ args->flags = DUMP_ENDIAN_LIL | (args->flags & ~DUMP_ENDIAN_MASK);
110
+ break;
111
+ case 'h':
112
+ return -1;
113
+ case '-':
114
+ if (argv[i][1] == '\n') {
115
+ return i;
116
+ }
117
+ if (strcmp(argv[i] + 2, "version") == 0) {
118
+ mrb_show_version(mrb);
119
+ exit(EXIT_SUCCESS);
120
+ }
121
+ else if (strcmp(argv[i] + 2, "verbose") == 0) {
122
+ args->verbose = TRUE;
123
+ break;
124
+ }
125
+ else if (strcmp(argv[i] + 2, "copyright") == 0) {
126
+ mrb_show_copyright(mrb);
127
+ exit(EXIT_SUCCESS);
128
+ }
129
+ return -1;
130
+ default:
131
+ return i;
132
+ }
133
+ }
134
+ else {
135
+ break;
136
+ }
137
+ }
138
+ if (args->verbose && args->initname && (args->flags & DUMP_ENDIAN_MASK) == 0) {
139
+ fprintf(stderr, "%s: generating %s endian C file. specify -e/-E for cross compiling.\n",
140
+ args->prog, bigendian_p() ? "big" : "little");
141
+ }
142
+ return i;
143
+ }
144
+
145
+ static int
146
+ partial_hook(struct mrb_parser_state *p)
147
+ {
148
+ mrbc_context *c = p->cxt;
149
+ struct mrbc_args *args = (struct mrbc_args *)c->partial_data;
150
+ const char *fn;
151
+
152
+ if (p->f) fclose(p->f);
153
+ if (args->idx >= args->argc) {
154
+ p->f = NULL;
155
+ return -1;
156
+ }
157
+ fn = args->argv[args->idx++];
158
+ p->f = fopen(fn, "r");
159
+ if (p->f == NULL) {
160
+ fprintf(stderr, "%s: cannot open program file. (%s)\n", args->prog, fn);
161
+ return -1;
162
+ }
163
+ mrb_parser_set_filename(p, fn);
164
+ return 0;
165
+ }
166
+
167
+ static mrb_value
168
+ load_file(mrb_state *mrb, struct mrbc_args *args)
169
+ {
170
+ mrbc_context *c;
171
+ mrb_value result;
172
+ char *input = args->argv[args->idx];
173
+ FILE *infile;
174
+ mrb_bool need_close = FALSE;
175
+
176
+ c = mrbc_context_new(mrb);
177
+ if (args->verbose)
178
+ c->dump_result = TRUE;
179
+ c->no_exec = TRUE;
180
+ if (input[0] == '-' && input[1] == '\0') {
181
+ infile = stdin;
182
+ }
183
+ else {
184
+ need_close = TRUE;
185
+ if ((infile = fopen(input, "r")) == NULL) {
186
+ fprintf(stderr, "%s: cannot open program file. (%s)\n", args->prog, input);
187
+ return mrb_nil_value();
188
+ }
189
+ }
190
+ mrbc_filename(mrb, c, input);
191
+ args->idx++;
192
+ if (args->idx < args->argc) {
193
+ need_close = FALSE;
194
+ mrbc_partial_hook(mrb, c, partial_hook, (void*)args);
195
+ }
196
+
197
+ result = mrb_load_file_cxt(mrb, infile, c);
198
+ if (need_close) fclose(infile);
199
+ mrbc_context_free(mrb, c);
200
+ if (mrb_undef_p(result)) {
201
+ return mrb_nil_value();
202
+ }
203
+ return result;
204
+ }
205
+
206
+ static int
207
+ dump_file(mrb_state *mrb, FILE *wfp, const char *outfile, struct RProc *proc, struct mrbc_args *args)
208
+ {
209
+ int n = MRB_DUMP_OK;
210
+ mrb_irep *irep = proc->body.irep;
211
+
212
+ if (args->initname) {
213
+ n = mrb_dump_irep_cfunc(mrb, irep, args->flags, wfp, args->initname);
214
+ if (n == MRB_DUMP_INVALID_ARGUMENT) {
215
+ fprintf(stderr, "%s: invalid C language symbol name\n", args->initname);
216
+ }
217
+ }
218
+ else {
219
+ n = mrb_dump_irep_binary(mrb, irep, args->flags, wfp);
220
+ }
221
+ if (n != MRB_DUMP_OK) {
222
+ fprintf(stderr, "%s: error in mrb dump (%s) %d\n", args->prog, outfile, n);
223
+ }
224
+ return n;
225
+ }
226
+
227
+ static mrb_value
228
+ mrb_mruby_cli_mrbc(mrb_state *mrb, mrb_value klass)
229
+ {
230
+ FILE *wfp;
231
+ char *argv[255];
232
+ struct mrbc_args args;
233
+ mrb_int n, result, i, argc;
234
+ mrb_value load, array, element;
235
+
236
+ mrb_get_args(mrb, "io", &argc, &array);
237
+
238
+ for (i = 0; i < argc; i++) {
239
+ element = mrb_ary_shift(mrb, array);
240
+ argv[i] = RSTRING_PTR(element);
241
+ }
242
+
243
+ if (mrb == NULL) {
244
+ fputs("Invalid mrb_state, exiting funky-cli\n", stderr);
245
+ return mrb_fixnum_value(EXIT_FAILURE);
246
+ }
247
+
248
+ n = parse_args(mrb, argc, argv, &args);
249
+ if (n == argc) {
250
+ fprintf(stderr, "%s: no program file given\n", args.prog);
251
+ return mrb_fixnum_value(EXIT_FAILURE);
252
+ }
253
+ if (args.outfile == NULL && !args.check_syntax) {
254
+ if (n + 1 == argc) {
255
+ args.outfile = get_outfilename(mrb, argv[n], args.initname ? C_EXT : RITEBIN_EXT);
256
+ }
257
+ else {
258
+ fprintf(stderr, "%s: output file should be specified to compile multiple files\n", args.prog);
259
+ return mrb_fixnum_value(EXIT_FAILURE);
260
+ }
261
+ }
262
+
263
+ args.idx = n;
264
+ load = load_file(mrb, &args);
265
+ if (mrb_nil_p(load)) {
266
+ return mrb_fixnum_value(EXIT_FAILURE);
267
+ }
268
+ if (args.check_syntax) {
269
+ printf("%s:%s:Syntax OK\n", args.prog, argv[n]);
270
+ }
271
+
272
+ if (args.check_syntax) {
273
+ return mrb_fixnum_value(EXIT_SUCCESS);
274
+ }
275
+
276
+ if (args.outfile) {
277
+ if (strcmp("-", args.outfile) == 0) {
278
+ wfp = stdout;
279
+ }
280
+ else if ((wfp = fopen(args.outfile, "wb")) == NULL) {
281
+ fprintf(stderr, "%s: cannot open output file:(%s)\n", args.prog, args.outfile);
282
+ return mrb_fixnum_value(EXIT_FAILURE);
283
+ }
284
+ }
285
+ else {
286
+ fprintf(stderr, "Output file is required\n");
287
+ return mrb_fixnum_value(EXIT_FAILURE);
288
+ }
289
+ result = dump_file(mrb, wfp, args.outfile, mrb_proc_ptr(load), &args);
290
+ fclose(wfp);
291
+ if (result != MRB_DUMP_OK) {
292
+ return mrb_fixnum_value(EXIT_FAILURE);
293
+ }
294
+
295
+ return mrb_fixnum_value(EXIT_SUCCESS);
296
+ }
297
+
298
+ mrb_value mrb_mruby_cli_mirb(mrb_state *mrb, mrb_value klass);
299
+ mrb_value mrb_mruby_cli_mruby(mrb_state *mrb, mrb_value klass);
300
+
301
+ void
302
+ mrb_funky_cli_gem_init(mrb_state* mrb)
303
+ {
304
+ struct RClass *cli;
305
+
306
+ cli = mrb_define_module(mrb, "FunkyCli");
307
+ mrb_define_class_method(mrb , cli , "mrbc" , mrb_mruby_cli_mrbc , MRB_ARGS_REQ(2));
308
+ mrb_define_class_method(mrb , cli , "mirb" , mrb_mruby_cli_mirb , MRB_ARGS_NONE());
309
+ mrb_define_class_method(mrb , cli , "mruby" , mrb_mruby_cli_mruby , MRB_ARGS_REQ(2));
310
+ DONE;
311
+ }
312
+
313
+ void
314
+ mrb_funky_cli_gem_final(mrb_state* mrb)
315
+ {
316
+ }