- Timestamp:
- Jan 21, 2018, 12:10:09 AM (6 years ago)
- Location:
- EcnlProtoTool/trunk/mruby-1.3.0
- Files:
-
- 1 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/mruby-1.3.0/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c
r321 r331 11 11 #include <stdio.h> 12 12 #include <ctype.h> 13 14 #include <signal.h> 15 #include <setjmp.h> 13 16 14 17 #ifdef ENABLE_READLINE … … 30 33 #endif 31 34 32 #include "mruby.h" 33 #include "mruby/array.h" 34 #include "mruby/proc.h" 35 #include "mruby/compile.h" 36 #include "mruby/string.h" 35 #ifndef _WIN32 36 #define MIRB_SIGSETJMP(env) sigsetjmp(env, 1) 37 #define MIRB_SIGLONGJMP(env, val) siglongjmp(env, val) 38 #define SIGJMP_BUF sigjmp_buf 39 #else 40 #define MIRB_SIGSETJMP(env) setjmp(env) 41 #define MIRB_SIGLONGJMP(env, val) longjmp(env, val) 42 #define SIGJMP_BUF jmp_buf 43 #endif 44 45 #include <mruby.h> 46 #include <mruby/array.h> 47 #include <mruby/proc.h> 48 #include <mruby/compile.h> 49 #include <mruby/string.h> 37 50 38 51 #ifdef ENABLE_READLINE … … 195 208 196 209 struct _args { 210 FILE *rfp; 197 211 mrb_bool verbose : 1; 198 212 int argc; … … 252 266 } 253 267 } 268 269 if (args->rfp == NULL) { 270 if (*argv != NULL) { 271 args->rfp = fopen(argv[0], "r"); 272 if (args->rfp == NULL) { 273 printf("Cannot open program file. (%s)\n", *argv); 274 return EXIT_FAILURE; 275 } 276 argc--; argv++; 277 } 278 } 279 args->argv = (char **)mrb_realloc(mrb, args->argv, sizeof(char*) * (argc + 1)); 280 memcpy(args->argv, argv, (argc+1) * sizeof(char*)); 281 args->argc = argc; 282 254 283 return EXIT_SUCCESS; 255 284 } … … 258 287 cleanup(mrb_state *mrb, struct _args *args) 259 288 { 289 if (args->rfp) 290 fclose(args->rfp); 291 mrb_free(mrb, args->argv); 260 292 mrb_close(mrb); 261 293 } … … 308 340 } 309 341 342 343 #ifndef ENABLE_READLINE 344 volatile sig_atomic_t input_canceled = 0; 345 void 346 ctrl_c_handler(int signo) 347 { 348 input_canceled = 1; 349 } 350 #else 351 SIGJMP_BUF ctrl_c_buf; 352 void 353 ctrl_c_handler(int signo) 354 { 355 MIRB_SIGLONGJMP(ctrl_c_buf, 1); 356 } 357 #endif 358 310 359 int 311 360 main(int argc, char **argv) 312 361 { 313 char ruby_code[ 1024] = { 0 };362 char ruby_code[4096] = { 0 }; 314 363 char last_code_line[1024] = { 0 }; 315 364 #ifndef ENABLE_READLINE 316 365 int last_char; 317 int char_index;366 size_t char_index; 318 367 #else 319 368 char *history_path; 369 char* line; 320 370 #endif 321 371 mrbc_context *cxt; … … 324 374 mrb_value result; 325 375 struct _args args; 376 mrb_value ARGV; 326 377 int n; 378 int i; 327 379 mrb_bool code_block_open = FALSE; 328 380 int ai; … … 335 387 return EXIT_FAILURE; 336 388 } 337 mrb_define_global_const(mrb, "ARGV", mrb_ary_new_capa(mrb, 0));338 389 339 390 n = parse_args(mrb, argc, argv, &args); … … 343 394 return n; 344 395 } 396 397 ARGV = mrb_ary_new_capa(mrb, args.argc); 398 for (i = 0; i < args.argc; i++) { 399 char* utf8 = mrb_utf8_from_locale(args.argv[i], -1); 400 if (utf8) { 401 mrb_ary_push(mrb, ARGV, mrb_str_new_cstr(mrb, utf8)); 402 mrb_utf8_free(utf8); 403 } 404 } 405 mrb_define_global_const(mrb, "ARGV", ARGV); 345 406 346 407 #ifdef ENABLE_READLINE … … 369 430 char *utf8; 370 431 432 if (args.rfp) { 433 if (fgets(last_code_line, sizeof(last_code_line)-1, args.rfp) != NULL) 434 goto done; 435 break; 436 } 437 371 438 #ifndef ENABLE_READLINE 372 439 print_cmdline(code_block_open); 373 440 441 signal(SIGINT, ctrl_c_handler); 374 442 char_index = 0; 375 443 while ((last_char = getchar()) != '\n') { 376 444 if (last_char == EOF) break; 377 if (char_index > sizeof(last_code_line)-2) {445 if (char_index >= sizeof(last_code_line)-2) { 378 446 fputs("input string too long\n", stderr); 379 447 continue; 380 448 } 381 449 last_code_line[char_index++] = last_char; 450 } 451 signal(SIGINT, SIG_DFL); 452 if (input_canceled) { 453 ruby_code[0] = '\0'; 454 last_code_line[0] = '\0'; 455 code_block_open = FALSE; 456 puts("^C"); 457 input_canceled = 0; 458 continue; 382 459 } 383 460 if (last_char == EOF) { … … 389 466 last_code_line[char_index] = '\0'; 390 467 #else 391 char* line = MIRB_READLINE(code_block_open ? "* " : "> "); 468 if (MIRB_SIGSETJMP(ctrl_c_buf) == 0) { 469 ; 470 } 471 else { 472 ruby_code[0] = '\0'; 473 last_code_line[0] = '\0'; 474 code_block_open = FALSE; 475 puts("^C"); 476 } 477 signal(SIGINT, ctrl_c_handler); 478 line = MIRB_READLINE(code_block_open ? "* " : "> "); 479 signal(SIGINT, SIG_DFL); 480 392 481 if (line == NULL) { 393 482 printf("\n"); … … 403 492 free(line); 404 493 #endif 494 495 done: 405 496 406 497 if (code_block_open) { … … 454 545 mrb_codedump_all(mrb, proc); 455 546 } 456 /* pass a proc for eva ulation */547 /* pass a proc for evaluation */ 457 548 /* evaluate the bytecode */ 458 result = mrb_ context_run(mrb,549 result = mrb_vm_run(mrb, 459 550 proc, 460 551 mrb_top_self(mrb),
Note:
See TracChangeset
for help on using the changeset viewer.