Ignore:
Timestamp:
Jul 9, 2020, 8:51:43 AM (4 years ago)
Author:
coas-nagasima
Message:

mrubyを2.1.1に更新

Location:
EcnlProtoTool/trunk/mruby-2.1.1
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-2.1.1/mrbgems/mruby-test/driver.c

    r331 r439  
    1919#include <mruby/array.h>
    2020
    21 void
    22 mrb_init_mrbtest(mrb_state *);
     21extern const uint8_t mrbtest_assert_irep[];
     22
     23void mrbgemtest_init(mrb_state* mrb);
     24void mrb_init_test_vformat(mrb_state* mrb);
    2325
    2426/* Print a short remark for the user */
     
    3032
    3133static int
    32 check_error(mrb_state *mrb)
    33 {
    34   /* Error check */
    35   /* $ko_test and $kill_test should be 0 */
    36   mrb_value ko_test = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$ko_test"));
    37   mrb_value kill_test = mrb_gv_get(mrb, mrb_intern_lit(mrb, "$kill_test"));
    38 
    39   return mrb_fixnum_p(ko_test) && mrb_fixnum(ko_test) == 0 && mrb_fixnum_p(kill_test) && mrb_fixnum(kill_test) == 0;
    40 }
    41 
    42 static int
    4334eval_test(mrb_state *mrb)
    4435{
    4536  /* evaluate the test */
    46   mrb_funcall(mrb, mrb_top_self(mrb), "report", 0);
     37  mrb_value result = mrb_funcall(mrb, mrb_top_self(mrb), "report", 0);
    4738  /* did an exception occur? */
    4839  if (mrb->exc) {
     
    5142    return EXIT_FAILURE;
    5243  }
    53   else if (!check_error(mrb)) {
    54     return EXIT_FAILURE;
    55   }
    56   return EXIT_SUCCESS;
    57 }
    58 
    59 static void
    60 t_printstr(mrb_state *mrb, mrb_value obj)
    61 {
    62   char *s;
    63   int len;
    64 
    65   if (mrb_string_p(obj)) {
    66     s = RSTRING_PTR(obj);
    67     len = RSTRING_LEN(obj);
    68     fwrite(s, len, 1, stdout);
    69   }
    70 }
    71 
    72 mrb_value
    73 mrb_t_printstr(mrb_state *mrb, mrb_value self)
    74 {
    75   mrb_value argv;
    76 
    77   mrb_get_args(mrb, "o", &argv);
    78   t_printstr(mrb, argv);
    79 
    80   return argv;
     44  else {
     45    return mrb_bool(result) ? EXIT_SUCCESS : EXIT_FAILURE;
     46  }
     47}
     48
     49/* Implementation of print due to the reason that there might be no print */
     50static mrb_value
     51t_print(mrb_state *mrb, mrb_value self)
     52{
     53  mrb_value *argv;
     54  mrb_int argc;
     55  mrb_int i;
     56
     57  mrb_get_args(mrb, "*!", &argv, &argc);
     58  for (i = 0; i < argc; ++i) {
     59    mrb_value s = mrb_obj_as_string(mrb, argv[i]);
     60    fwrite(RSTRING_PTR(s), RSTRING_LEN(s), 1, stdout);
     61  }
     62  fflush(stdout);
     63
     64  return mrb_nil_value();
     65}
     66
     67#define UNESCAPE(p, endp) ((p) != (endp) && *(p) == '\\' ? (p)+1 : (p))
     68#define CHAR_CMP(c1, c2) ((unsigned char)(c1) - (unsigned char)(c2))
     69
     70static const char *
     71str_match_bracket(const char *p, const char *pat_end,
     72                  const char *s, const char *str_end)
     73{
     74  mrb_bool ok = FALSE, negated = FALSE;
     75
     76  if (p == pat_end) return NULL;
     77  if (*p == '!' || *p == '^') {
     78    negated = TRUE;
     79    ++p;
     80  }
     81
     82  while (*p != ']') {
     83    const char *t1 = p;
     84    if ((t1 = UNESCAPE(t1, pat_end)) == pat_end) return NULL;
     85    if ((p = t1 + 1) == pat_end) return NULL;
     86    if (p[0] == '-' && p[1] != ']') {
     87      const char *t2 = p + 1;
     88      if ((t2 = UNESCAPE(t2, pat_end)) == pat_end) return NULL;
     89      p = t2 + 1;
     90      if (!ok && CHAR_CMP(*t1, *s) <= 0 && CHAR_CMP(*s, *t2) <= 0) ok = TRUE;
     91    }
     92    else {
     93      if (!ok && CHAR_CMP(*t1, *s) == 0) ok = TRUE;
     94    }
     95  }
     96
     97  return ok == negated ? NULL : p + 1;
     98}
     99
     100static mrb_bool
     101str_match_no_brace_p(const char *pat, mrb_int pat_len,
     102                     const char *str, mrb_int str_len)
     103{
     104  const char *p = pat, *s = str;
     105  const char *pat_end = pat + pat_len, *str_end = str + str_len;
     106  const char *p_tmp = NULL, *s_tmp = NULL;
     107
     108  for (;;) {
     109    if (p == pat_end) return s == str_end;
     110    switch (*p) {
     111      case '*':
     112        do { ++p; } while (p != pat_end && *p == '*');
     113        if (UNESCAPE(p, pat_end) == pat_end) return TRUE;
     114        if (s == str_end) return FALSE;
     115        p_tmp = p;
     116        s_tmp = s;
     117        continue;
     118      case '?':
     119        if (s == str_end) return FALSE;
     120        ++p;
     121        ++s;
     122        continue;
     123      case '[': {
     124        const char *t;
     125        if (s == str_end) return FALSE;
     126        if ((t = str_match_bracket(p+1, pat_end, s, str_end))) {
     127          p = t;
     128          ++s;
     129          continue;
     130        }
     131        goto L_failed;
     132      }
     133    }
     134
     135    /* ordinary */
     136    p = UNESCAPE(p, pat_end);
     137    if (s == str_end) return p == pat_end;
     138    if (p == pat_end) goto L_failed;
     139    if (*p++ != *s++) goto L_failed;
     140    continue;
     141
     142    L_failed:
     143    if (p_tmp && s_tmp) {
     144      /* try next '*' position */
     145      p = p_tmp;
     146      s = ++s_tmp;
     147      continue;
     148    }
     149
     150    return FALSE;
     151  }
     152}
     153
     154#define COPY_AND_INC(dst, src, len) \
     155  do { memcpy(dst, src, len); dst += len; } while (0)
     156
     157static mrb_bool
     158str_match_p(mrb_state *mrb,
     159            const char *pat, mrb_int pat_len,
     160            const char *str, mrb_int str_len)
     161{
     162  const char *p = pat, *pat_end = pat + pat_len;
     163  const char *lbrace = NULL, *rbrace = NULL;
     164  int nest = 0;
     165  mrb_bool ret = FALSE;
     166
     167  for (; p != pat_end; ++p) {
     168    if (*p == '{' && nest++ == 0) lbrace = p;
     169    else if (*p == '}' && lbrace && --nest == 0) { rbrace = p; break; }
     170    else if (*p == '\\' && ++p == pat_end) break;
     171  }
     172
     173  if (lbrace && rbrace) {
     174    /* expand brace */
     175    char *ex_pat = (char *)mrb_malloc(mrb, pat_len-2);  /* expanded pattern */
     176    char *ex_p = ex_pat;
     177
     178    COPY_AND_INC(ex_p, pat, lbrace-pat);
     179    p = lbrace;
     180    while (p < rbrace) {
     181      char *orig_ex_p = ex_p;
     182      const char *t = ++p;
     183      for (nest = 0; p < rbrace && !(*p == ',' && nest == 0); ++p) {
     184        if (*p == '{') ++nest;
     185        else if (*p == '}') --nest;
     186        else if (*p == '\\' && ++p == rbrace) break;
     187      }
     188      COPY_AND_INC(ex_p, t, p-t);
     189      COPY_AND_INC(ex_p, rbrace+1, pat_end-rbrace-1);
     190      if ((ret = str_match_p(mrb, ex_pat, ex_p-ex_pat, str, str_len))) break;
     191      ex_p = orig_ex_p;
     192    }
     193    mrb_free(mrb, ex_pat);
     194  }
     195  else if (!lbrace && !rbrace) {
     196    ret = str_match_no_brace_p(pat, pat_len, str, str_len);
     197  }
     198
     199  return ret;
     200}
     201
     202static mrb_value
     203m_str_match_p(mrb_state *mrb, mrb_value self)
     204{
     205  const char *pat, *str;
     206  mrb_int pat_len, str_len;
     207
     208  mrb_get_args(mrb, "ss", &pat, &pat_len, &str, &str_len);
     209  return mrb_bool_value(str_match_p(mrb, pat, pat_len, str, str_len));
    81210}
    82211
     
    87216
    88217  krn = mrb->kernel_module;
    89   mrb_define_method(mrb, krn, "__t_printstr__", mrb_t_printstr, MRB_ARGS_REQ(1));
     218  mrb_define_method(mrb, krn, "t_print", t_print, MRB_ARGS_ANY());
     219  mrb_define_method(mrb, krn, "_str_match?", m_str_match_p, MRB_ARGS_REQ(2));
    90220
    91221  mrbtest = mrb_define_module(mrb, "Mrbtest");
     
    95225  mrb_define_const(mrb, mrbtest, "FIXNUM_BIT", mrb_fixnum_value(MRB_INT_BIT));
    96226
     227#ifndef MRB_WITHOUT_FLOAT
    97228#ifdef MRB_USE_FLOAT
    98229  mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-6));
     
    100231  mrb_define_const(mrb, mrbtest, "FLOAT_TOLERANCE", mrb_float_value(mrb, 1e-12));
    101232#endif
     233#endif
     234
     235  mrb_init_test_vformat(mrb);
    102236
    103237  if (verbose) {
     
    128262  TEST_COUNT_PASS(ko_test);
    129263  TEST_COUNT_PASS(kill_test);
     264  TEST_COUNT_PASS(warning_test);
     265  TEST_COUNT_PASS(skip_test);
    130266
    131267#undef TEST_COUNT_PASS
     
    165301
    166302  mrb_init_test_driver(mrb, verbose);
    167   mrb_init_mrbtest(mrb);
     303  mrb_load_irep(mrb, mrbtest_assert_irep);
     304  mrbgemtest_init(mrb);
    168305  ret = eval_test(mrb);
    169306  mrb_close(mrb);
Note: See TracChangeset for help on using the changeset viewer.