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