- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecs/mruby/nMruby_tMrubyProc.c
r321 r429 1 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. 2 * Copyright (C) 2008-2017 by TOPPERS Project 6 3 * 7 * このファイルは、mruby のものです。 8 * mruby のライセンスのもとで、配布されます。(TOPPERS ライセンスではありません) 9 * 参照: https://github.com/mruby/mruby 10 * TECS コンポーネントを登録する初期化子を呼ぶため、少しの修正がなされています。 4 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 5 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 6 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 7 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 8 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 9 * スコード中に含まれていること. 10 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 11 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 12 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 13 * の無保証規定を掲載すること. 14 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 15 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 16 * と. 17 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 18 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 19 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 20 * 報告すること. 21 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 22 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 23 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 24 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 25 * 免責すること. 26 * 27 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 28 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 29 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 30 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 31 * の責任を負わない. 32 * 33 * @(#) $Id$ 11 34 */ 12 35 13 #include "nMruby_tMrubyProc_tecsgen.h" 36 /* 37 * 以前の nMruby_tMrubyProc.c は、mruby の本体に含まれていた 38 * mrbgems/mruby-bin-mruby/tools/mruby/mruby.c 39 * をベースに TECS のコードを足していたが、TOPPERS ライセンスと異なるため 40 * 新たに書き下ろした。(小さなコードのため、概ね似たようなものになるが。 41 */ 14 42 15 43 #include <stdio.h> … … 17 45 #include <string.h> 18 46 #include "mruby.h" 47 #include "mruby/string.h" 19 48 #include "mruby/array.h" 20 49 #include "mruby/compile.h" … … 22 51 #include "mruby/variable.h" 23 52 24 #ifndef ENABLE_STDIO 25 static void 26 p(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) 53 /* #[<PREAMBLE>]# 54 * Don't edit the comments between #[<...>]# and #[</...>]# 55 * These comment are used by tecsmerege when merging. 56 * 57 * attr access macro #_CAAM_# 58 * mrb mrb_state* VAR_mrb 59 * 60 * call port function #_TCPF_# 61 * call port: cInit signature: nMruby_sInitializeBridge context:task optional:true 62 * bool_t is_cInit_joined() check if joined 63 * void cInit_initializeBridge( const mrb_state* mrb ); 64 * 65 * #[</PREAMBLE>]# */ 66 67 /* プロトタイプ宣言や変数の定義をここに書きます #_PAC_# */ 68 #include "nMruby_tMrubyProc_tecsgen.h" 69 70 #ifndef E_OK 71 #define E_OK 0 /* success */ 72 #define E_ID (-18) /* illegal ID */ 34 73 #endif 35 74 36 void mrb_show_version(mrb_state *); 37 void mrb_show_copyright(mrb_state *); 75 /* 受け口関数 #_TEPF_# */ 76 /* #[<ENTRY_PORT>]# eMain 77 * entry port: eMain 78 * signature: nPosix_sMain 79 * context: task 80 * #[</ENTRY_PORT>]# */ 38 81 39 struct _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 }; 82 /* #[<ENTRY_FUNC>]# eMain_main 83 * name: eMain_main 84 * global_name: nMruby_tMrubyProc_eMain_main 85 * oneway: false 86 * #[</ENTRY_FUNC>]# */ 87 int 88 eMain_main(CELLIDX idx, int argc, const char** argv) 89 { 90 CELLCB *p_cellcb; 91 mrb_state *mrb; 92 mrbc_context* context; 93 if (VALID_IDX(idx)) { 94 p_cellcb = GET_CELLCB(idx); 95 } 96 else { 97 /* エラー処理コードをここに記述します */ 98 return -1; 99 } /* end if VALID_IDX(idx) */ 49 100 50 static void 51 usage(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 NULL63 };64 const char *const *p = usage_msg;101 /* ここに処理本体を記述します #_TEFB_# */ 102 if (argc != 2) { 103 printf("usage: %s script.rb\n", argv[0]); 104 goto error_return; 105 } 106 mrb = mrb_open(); 107 if( mrb == 0 ){ 108 printf("%s: mrb_open() failed\n", argv[0]); 109 goto error_return; 110 } 111 context = mrbc_context_new(mrb); 112 if (context == 0) { 113 printf("%s: mrbc_context_new() failed\n", argv[0]); 114 goto error_close; 115 } 65 116 66 printf("Usage: %s [switches] programfile\n", name); 67 while (*p) 68 printf(" %s\n", *p++); 117 /*-------- ARGV ----------*/ 118 { 119 mrb_value ARGV = mrb_ary_new_capa(mrb, argc); 120 int i; 121 for (i = 0; i < argc; i++) { 122 mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, argv[i])); 123 } 124 mrb_define_global_const(mrb, "ARGV", ARGV); 125 } 126 /*-------- $0 ----------*/ 127 { 128 mrb_sym zero_sym = mrb_intern_lit(mrb, "$0"); 129 mrbc_filename(mrb, context, argv[0]); 130 mrb_gv_set(mrb, zero_sym, mrb_str_new_cstr(mrb, argv[0])); 131 } 132 133 /* ------- register TECS bridge classes -------*/ 134 if (is_cInit_joined()) { 135 cInit_initializeBridge(mrb); 136 } 137 138 /*-------- load .rb file -------*/ 139 { 140 FILE *file = fopen(argv[1], "r"); 141 if (file == NULL) { 142 printf("file not found: %s\n", argv[1]); 143 goto error_free; 144 } 145 146 mrb_value val = mrb_load_file_cxt(mrb, file, context); 147 if (mrb->exc) { 148 if(! mrb_undef_p(val)){ 149 mrb_print_error(mrb); 150 } 151 } 152 } 153 154 /*---------- success case --------*/ 155 mrbc_context_free(mrb, context); 156 mrb_close( mrb ); 157 return 0; 158 159 /*---------- error case ----------*/ 160 error_free: 161 mrbc_context_free(mrb, context); 162 error_close: 163 mrb_close( mrb ); 164 error_return: 165 166 return -1; 69 167 } 70 168 71 static int 72 parse_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]; 104 append_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 173 static void 174 cleanup(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 185 int 186 // main(int argc, char **argv) 187 eMain_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 } 169 /* #[<POSTAMBLE>]# 170 * Put non-entry functions below. 171 * #[</POSTAMBLE>]#*/
Note:
See TracChangeset
for help on using the changeset viewer.