source: EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecs/mruby/nMruby_tMrubyProc.c@ 321

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

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.3 KB
Line 
1/*
2 * This file comes from mruby. (renamed from tools/mruby/mruby.c)
3 * This file is distributed under ruby's license. (not under TOPPERS license)
4 * see https://github.com/mruby/mruby
5 * A little modification is done to to call initializer registering TECS components.
6 *
7 * このファイルは、mruby のものです。
8 * mruby のライセンスのもとで、配布されます。(TOPPERS ライセンスではありません)
9 * 参照: https://github.com/mruby/mruby
10 * TECS コンポーネントを登録する初期化子を呼ぶため、少しの修正がなされています。
11 */
12
13#include "nMruby_tMrubyProc_tecsgen.h"
14
15#include <stdio.h>
16#include <stdlib.h>
17#include <string.h>
18#include "mruby.h"
19#include "mruby/array.h"
20#include "mruby/compile.h"
21#include "mruby/dump.h"
22#include "mruby/variable.h"
23
24#ifndef ENABLE_STDIO
25static void
26p(mrb_state *mrb, mrb_value obj)
27{
28 obj = mrb_funcall(mrb, obj, "inspect", 0);
29 fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stdout);
30 putc('\n', stdout);
31}
32#else
33#define p(mrb,obj) mrb_p(mrb,obj)
34#endif
35
36void mrb_show_version(mrb_state *);
37void mrb_show_copyright(mrb_state *);
38
39struct _args {
40 FILE *rfp;
41 char* cmdline;
42 mrb_bool fname : 1;
43 mrb_bool mrbfile : 1;
44 mrb_bool check_syntax : 1;
45 mrb_bool verbose : 1;
46 int argc;
47 char** argv;
48};
49
50static void
51usage(const char *name)
52{
53 static const char *const usage_msg[] = {
54 "switches:",
55 "-b load and execute RiteBinary (mrb) file",
56 "-c check syntax only",
57 "-e 'command' one line of script",
58 "-v print version number, then run in verbose mode",
59 "--verbose run in verbose mode",
60 "--version print the version",
61 "--copyright print the copyright",
62 NULL
63 };
64 const char *const *p = usage_msg;
65
66 printf("Usage: %s [switches] programfile\n", name);
67 while (*p)
68 printf(" %s\n", *p++);
69}
70
71static int
72parse_args(mrb_state *mrb, int argc, char **argv, struct _args *args)
73{
74 char **origargv = argv;
75 static const struct _args args_zero = { 0 };
76
77 *args = args_zero;
78
79 for (argc--,argv++; argc > 0; argc--,argv++) {
80 char *item;
81 if (argv[0][0] != '-') break;
82
83 if (strlen(*argv) <= 1) {
84 argc--; argv++;
85 args->rfp = stdin;
86 break;
87 }
88
89 item = argv[0] + 1;
90 switch (*item++) {
91 case 'b':
92 args->mrbfile = TRUE;
93 break;
94 case 'c':
95 args->check_syntax = TRUE;
96 break;
97 case 'e':
98 if (item[0]) {
99 goto append_cmdline;
100 }
101 else if (argc > 1) {
102 argc--; argv++;
103 item = argv[0];
104append_cmdline:
105 if (!args->cmdline) {
106 size_t buflen;
107 char *buf;
108
109 buflen = strlen(item) + 1;
110 buf = (char *)mrb_malloc(mrb, buflen);
111 memcpy(buf, item, buflen);
112 args->cmdline = buf;
113 }
114 else {
115 size_t cmdlinelen;
116 size_t itemlen;
117
118 cmdlinelen = strlen(args->cmdline);
119 itemlen = strlen(item);
120 args->cmdline =
121 (char *)mrb_realloc(mrb, args->cmdline, cmdlinelen + itemlen + 2);
122 args->cmdline[cmdlinelen] = '\n';
123 memcpy(args->cmdline + cmdlinelen + 1, item, itemlen + 1);
124 }
125 }
126 else {
127 printf("%s: No code specified for -e\n", *origargv);
128 return EXIT_SUCCESS;
129 }
130 break;
131 case 'v':
132 if (!args->verbose) mrb_show_version(mrb);
133 args->verbose = TRUE;
134 break;
135 case '-':
136 if (strcmp((*argv) + 2, "version") == 0) {
137 mrb_show_version(mrb);
138 exit(EXIT_SUCCESS);
139 }
140 else if (strcmp((*argv) + 2, "verbose") == 0) {
141 args->verbose = TRUE;
142 break;
143 }
144 else if (strcmp((*argv) + 2, "copyright") == 0) {
145 mrb_show_copyright(mrb);
146 exit(EXIT_SUCCESS);
147 }
148 default:
149 return EXIT_FAILURE;
150 }
151 }
152
153 if (args->rfp == NULL && args->cmdline == NULL) {
154 if (*argv == NULL) args->rfp = stdin;
155 else {
156 args->rfp = fopen(argv[0], args->mrbfile ? "rb" : "r");
157 if (args->rfp == NULL) {
158 printf("%s: Cannot open program file. (%s)\n", *origargv, *argv);
159 return EXIT_FAILURE;
160 }
161 args->fname = TRUE;
162 args->cmdline = argv[0];
163 argc--; argv++;
164 }
165 }
166 args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1));
167 memcpy(args->argv, argv, (argc+1) * sizeof(char*));
168 args->argc = argc;
169
170 return EXIT_SUCCESS;
171}
172
173static void
174cleanup(mrb_state *mrb, struct _args *args)
175{
176 if (args->rfp && args->rfp != stdin)
177 fclose(args->rfp);
178 if (args->cmdline && !args->fname)
179 mrb_free(mrb, args->cmdline);
180 if (args->argv)
181 mrb_free(mrb, args->argv);
182 mrb_close(mrb);
183}
184
185int
186// main(int argc, char **argv)
187eMain_main( CELLIDX idx, int argc, const char **argv)
188
189{
190 CELLCB *p_cellcb = GET_CELLCB( idx );
191 mrb_state *mrb = mrb_open();
192 int n = -1;
193 int i;
194 struct _args args;
195 mrb_value ARGV;
196 mrbc_context *c;
197 mrb_value v;
198 mrb_sym zero_sym;
199
200 cInit_initializeBridge( mrb ); // TECS
201
202
203 if (mrb == NULL) {
204 fputs("Invalid mrb_state, exiting mruby\n", stderr);
205 return EXIT_FAILURE;
206 }
207
208 n = parse_args(mrb, argc, (char **)argv, &args);
209 if (n == EXIT_FAILURE || (args.cmdline == NULL && args.rfp == NULL)) {
210 cleanup(mrb, &args);
211 usage(argv[0]);
212 return n;
213 }
214
215 ARGV = mrb_ary_new_capa(mrb, args.argc);
216 for (i = 0; i < args.argc; i++) {
217 mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, args.argv[i]));
218 }
219 mrb_define_global_const(mrb, "ARGV", ARGV);
220
221 c = mrbc_context_new(mrb);
222 if (args.verbose)
223 c->dump_result = TRUE;
224 if (args.check_syntax)
225 c->no_exec = TRUE;
226
227 /* Set $0 */
228 zero_sym = mrb_intern_lit(mrb, "$0");
229 if (args.rfp) {
230 char *cmdline;
231 cmdline = args.cmdline ? args.cmdline : "-";
232 mrbc_filename(mrb, c, cmdline);
233 mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, cmdline));
234 }
235 else {
236 mrbc_filename(mrb, c, "-e");
237 mrb_gv_set(mrb, zero_sym, mrb_str_new_lit(mrb, "-e"));
238 }
239
240 /* Load program */
241 if (args.mrbfile) {
242 v = mrb_load_irep_file_cxt(mrb, args.rfp, c);
243 }
244 else if (args.rfp) {
245 v = mrb_load_file_cxt(mrb, args.rfp, c);
246 }
247 else {
248 v = mrb_load_string_cxt(mrb, args.cmdline, c);
249 }
250
251 mrbc_context_free(mrb, c);
252 if (mrb->exc) {
253 if (!mrb_undef_p(v)) {
254 mrb_print_error(mrb);
255 }
256 n = -1;
257 }
258 else if (args.check_syntax) {
259 printf("Syntax OK\n");
260 }
261 cleanup(mrb, &args);
262
263 return n == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
264}
Note: See TracBrowser for help on using the repository browser.