funky-cli 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }