Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

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  
    1111#include <stdio.h>
    1212#include <ctype.h>
     13
     14#include <signal.h>
     15#include <setjmp.h>
    1316
    1417#ifdef ENABLE_READLINE
     
    3033#endif
    3134
    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>
    3750
    3851#ifdef ENABLE_READLINE
     
    195208
    196209struct _args {
     210  FILE *rfp;
    197211  mrb_bool verbose      : 1;
    198212  int argc;
     
    252266    }
    253267  }
     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
    254283  return EXIT_SUCCESS;
    255284}
     
    258287cleanup(mrb_state *mrb, struct _args *args)
    259288{
     289  if (args->rfp)
     290    fclose(args->rfp);
     291  mrb_free(mrb, args->argv);
    260292  mrb_close(mrb);
    261293}
     
    308340}
    309341
     342
     343#ifndef ENABLE_READLINE
     344volatile sig_atomic_t input_canceled = 0;
     345void
     346ctrl_c_handler(int signo)
     347{
     348  input_canceled = 1;
     349}
     350#else
     351SIGJMP_BUF ctrl_c_buf;
     352void
     353ctrl_c_handler(int signo)
     354{
     355  MIRB_SIGLONGJMP(ctrl_c_buf, 1);
     356}
     357#endif
     358
    310359int
    311360main(int argc, char **argv)
    312361{
    313   char ruby_code[1024] = { 0 };
     362  char ruby_code[4096] = { 0 };
    314363  char last_code_line[1024] = { 0 };
    315364#ifndef ENABLE_READLINE
    316365  int last_char;
    317   int char_index;
     366  size_t char_index;
    318367#else
    319368  char *history_path;
     369  char* line;
    320370#endif
    321371  mrbc_context *cxt;
     
    324374  mrb_value result;
    325375  struct _args args;
     376  mrb_value ARGV;
    326377  int n;
     378  int i;
    327379  mrb_bool code_block_open = FALSE;
    328380  int ai;
     
    335387    return EXIT_FAILURE;
    336388  }
    337   mrb_define_global_const(mrb, "ARGV", mrb_ary_new_capa(mrb, 0));
    338389
    339390  n = parse_args(mrb, argc, argv, &args);
     
    343394    return n;
    344395  }
     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);
    345406
    346407#ifdef ENABLE_READLINE
     
    369430    char *utf8;
    370431
     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
    371438#ifndef ENABLE_READLINE
    372439    print_cmdline(code_block_open);
    373440
     441    signal(SIGINT, ctrl_c_handler);
    374442    char_index = 0;
    375443    while ((last_char = getchar()) != '\n') {
    376444      if (last_char == EOF) break;
    377       if (char_index > sizeof(last_code_line)-2) {
     445      if (char_index >= sizeof(last_code_line)-2) {
    378446        fputs("input string too long\n", stderr);
    379447        continue;
    380448      }
    381449      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;
    382459    }
    383460    if (last_char == EOF) {
     
    389466    last_code_line[char_index] = '\0';
    390467#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
    392481    if (line == NULL) {
    393482      printf("\n");
     
    403492    free(line);
    404493#endif
     494
     495done:
    405496
    406497    if (code_block_open) {
     
    454545          mrb_codedump_all(mrb, proc);
    455546        }
    456         /* pass a proc for evaulation */
     547        /* pass a proc for evaluation */
    457548        /* evaluate the bytecode */
    458         result = mrb_context_run(mrb,
     549        result = mrb_vm_run(mrb,
    459550            proc,
    460551            mrb_top_self(mrb),
Note: See TracChangeset for help on using the changeset viewer.