mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	refactoring for options
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@10054 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									2025346077
								
							
						
					
					
						commit
						6e154b9743
					
				
					 4 changed files with 159 additions and 156 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,9 @@
 | 
			
		|||
Sun Mar 26 22:02:51 2006  K.Kosako  <sndgk393 AT ybb.ne.jp>
 | 
			
		||||
 | 
			
		||||
	* re.c: refactoring for options.
 | 
			
		||||
 | 
			
		||||
	* parse.y: ditto.
 | 
			
		||||
 | 
			
		||||
Fri Mar 24 21:11:02 2006  K.Kosako  <sndgk393 AT ybb.ne.jp>
 | 
			
		||||
 | 
			
		||||
	* re.c (match_aref): RDoc description updated.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										43
									
								
								parse.y
									
										
									
									
									
								
							
							
						
						
									
										43
									
								
								parse.y
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -4986,41 +4986,24 @@ parser_tokadd_escape(struct parser_params *parser, int term)
 | 
			
		|||
static int
 | 
			
		||||
parser_regx_options(struct parser_params *parser)
 | 
			
		||||
{
 | 
			
		||||
    char kcode = 0;
 | 
			
		||||
    extern int rb_char_to_option_kcode(int c, int *option, int *kcode);
 | 
			
		||||
 | 
			
		||||
    int kcode   = 0;
 | 
			
		||||
    int options = 0;
 | 
			
		||||
    int c;
 | 
			
		||||
    int c, opt, kc, found;
 | 
			
		||||
 | 
			
		||||
    newtok();
 | 
			
		||||
    while (c = nextc(), ISALPHA(c)) {
 | 
			
		||||
	switch (c) {
 | 
			
		||||
	  case 'i':
 | 
			
		||||
	    options |= ONIG_OPTION_IGNORECASE;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'x':
 | 
			
		||||
	    options |= ONIG_OPTION_EXTEND;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'm':
 | 
			
		||||
	    options |= ONIG_OPTION_MULTILINE;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'o':
 | 
			
		||||
	    options |= RE_OPTION_ONCE;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'n':
 | 
			
		||||
	    kcode = 16;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'e':
 | 
			
		||||
	    kcode = 32;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 's':
 | 
			
		||||
	    kcode = 48;
 | 
			
		||||
	    break;
 | 
			
		||||
	  case 'u':
 | 
			
		||||
	    kcode = 64;
 | 
			
		||||
	    break;
 | 
			
		||||
	  default:
 | 
			
		||||
        if (c == 'o') {
 | 
			
		||||
            options |= RE_OPTION_ONCE;
 | 
			
		||||
        }
 | 
			
		||||
        else if (rb_char_to_option_kcode(c, &opt, &kc)) {
 | 
			
		||||
            options |= opt;
 | 
			
		||||
            if (kc != 0) kcode = kc;
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
	    tokadd(c);
 | 
			
		||||
	    break;
 | 
			
		||||
	}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    pushback(c);
 | 
			
		||||
    if (toklen()) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										260
									
								
								re.c
									
										
									
									
									
								
							
							
						
						
									
										260
									
								
								re.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -81,7 +81,7 @@ rb_memcicmp(char *p1, char *p2, long len)
 | 
			
		|||
    int tmp;
 | 
			
		||||
 | 
			
		||||
    while (len--) {
 | 
			
		||||
	if (tmp = casetable[(unsigned)*p1++] - casetable[(unsigned)*p2++])
 | 
			
		||||
	if ((tmp = casetable[(unsigned)*p1++] - casetable[(unsigned)*p2++]))
 | 
			
		||||
	    return tmp;
 | 
			
		||||
    }
 | 
			
		||||
    return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -159,37 +159,127 @@ rb_memsearch(char *x0, long m, char *y0, long n)
 | 
			
		|||
#define KCODE_FIXED FL_USER4
 | 
			
		||||
#define KCODE_MASK (KCODE_EUC|KCODE_SJIS|KCODE_UTF8)
 | 
			
		||||
 | 
			
		||||
#define ARG_REG_OPTION_MASK   0x0f
 | 
			
		||||
#define ARG_KCODE_UNIT        16
 | 
			
		||||
#define ARG_KCODE_NONE       (ARG_KCODE_UNIT * 1)
 | 
			
		||||
#define ARG_KCODE_EUC        (ARG_KCODE_UNIT * 2)
 | 
			
		||||
#define ARG_KCODE_SJIS       (ARG_KCODE_UNIT * 3)
 | 
			
		||||
#define ARG_KCODE_UTF8       (ARG_KCODE_UNIT * 4)
 | 
			
		||||
#define ARG_KCODE_MASK       (ARG_KCODE_UNIT * 7)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int reg_kcode = DEFAULT_KCODE;
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
kcode_euc(struct RRegexp *re)
 | 
			
		||||
 | 
			
		||||
static int char_to_option(int c)
 | 
			
		||||
{
 | 
			
		||||
    FL_UNSET(re, KCODE_MASK);
 | 
			
		||||
    FL_SET(re, KCODE_EUC);
 | 
			
		||||
    FL_SET(re, KCODE_FIXED);
 | 
			
		||||
  int val;
 | 
			
		||||
 | 
			
		||||
  switch (c) {
 | 
			
		||||
    case 'i':
 | 
			
		||||
      val = ONIG_OPTION_IGNORECASE;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'x':
 | 
			
		||||
      val = ONIG_OPTION_EXTEND;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'm':
 | 
			
		||||
      val = ONIG_OPTION_MULTILINE;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      val = 0;
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
  return val;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extern int rb_char_to_option_kcode(int c, int *option, int *kcode)
 | 
			
		||||
{
 | 
			
		||||
  *option = 0;
 | 
			
		||||
 | 
			
		||||
  switch (c) {
 | 
			
		||||
    case 'n':
 | 
			
		||||
      *kcode = ARG_KCODE_NONE;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'e':
 | 
			
		||||
      *kcode = ARG_KCODE_EUC;
 | 
			
		||||
      break;
 | 
			
		||||
    case 's':
 | 
			
		||||
      *kcode = ARG_KCODE_SJIS;
 | 
			
		||||
      break;
 | 
			
		||||
    case 'u':
 | 
			
		||||
      *kcode = ARG_KCODE_UTF8;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      *kcode  = 0;
 | 
			
		||||
      *option = char_to_option(c);
 | 
			
		||||
      break;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return ((*kcode == 0 && *option == 0) ? 0 : 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int char_to_arg_kcode(int c)
 | 
			
		||||
{
 | 
			
		||||
  int kcode, option;
 | 
			
		||||
 | 
			
		||||
  if (ISUPPER(c))  c = tolower(c);
 | 
			
		||||
 | 
			
		||||
  (void )rb_char_to_option_kcode(c, &option, &kcode);
 | 
			
		||||
  return kcode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
kcode_to_arg_value(unsigned int kcode)
 | 
			
		||||
{
 | 
			
		||||
  switch (kcode & KCODE_MASK) {
 | 
			
		||||
    case KCODE_NONE:
 | 
			
		||||
      return ARG_KCODE_NONE;
 | 
			
		||||
    case KCODE_EUC:
 | 
			
		||||
      return ARG_KCODE_EUC;
 | 
			
		||||
    case KCODE_SJIS:
 | 
			
		||||
      return ARG_KCODE_SJIS;
 | 
			
		||||
    case KCODE_UTF8:
 | 
			
		||||
      return ARG_KCODE_UTF8;
 | 
			
		||||
    default:
 | 
			
		||||
      return 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
kcode_sjis(struct RRegexp *re)
 | 
			
		||||
set_re_kcode_by_option(struct RRegexp *re, int options)
 | 
			
		||||
{
 | 
			
		||||
    FL_UNSET(re, KCODE_MASK);
 | 
			
		||||
    FL_SET(re, KCODE_SJIS);
 | 
			
		||||
    FL_SET(re, KCODE_FIXED);
 | 
			
		||||
  switch (options & ARG_KCODE_MASK) {
 | 
			
		||||
    case ARG_KCODE_NONE:
 | 
			
		||||
      FL_UNSET(re, KCODE_MASK);
 | 
			
		||||
      FL_SET(re, KCODE_FIXED);
 | 
			
		||||
      break;
 | 
			
		||||
    case ARG_KCODE_EUC:
 | 
			
		||||
      FL_UNSET(re, KCODE_MASK);
 | 
			
		||||
      FL_SET(re, KCODE_EUC);
 | 
			
		||||
      FL_SET(re, KCODE_FIXED);
 | 
			
		||||
      break;
 | 
			
		||||
    case ARG_KCODE_SJIS:
 | 
			
		||||
      FL_UNSET(re, KCODE_MASK);
 | 
			
		||||
      FL_SET(re, KCODE_SJIS);
 | 
			
		||||
      FL_SET(re, KCODE_FIXED);
 | 
			
		||||
      break;
 | 
			
		||||
    case ARG_KCODE_UTF8:
 | 
			
		||||
      FL_UNSET(re, KCODE_MASK);
 | 
			
		||||
      FL_SET(re, KCODE_UTF8);
 | 
			
		||||
      FL_SET(re, KCODE_FIXED);
 | 
			
		||||
      break;
 | 
			
		||||
 | 
			
		||||
    case 0:
 | 
			
		||||
    default:
 | 
			
		||||
      FL_SET(re, reg_kcode);
 | 
			
		||||
      break;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
kcode_utf8(struct RRegexp *re)
 | 
			
		||||
static int
 | 
			
		||||
re_to_kcode_arg_value(VALUE re)
 | 
			
		||||
{
 | 
			
		||||
    FL_UNSET(re, KCODE_MASK);
 | 
			
		||||
    FL_SET(re, KCODE_UTF8);
 | 
			
		||||
    FL_SET(re, KCODE_FIXED);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void
 | 
			
		||||
kcode_none(struct RRegexp *re)
 | 
			
		||||
{
 | 
			
		||||
    FL_UNSET(re, KCODE_MASK);
 | 
			
		||||
    FL_SET(re, KCODE_FIXED);
 | 
			
		||||
  return kcode_to_arg_value(RBASIC(re)->flags);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int curr_kcode;
 | 
			
		||||
| 
						 | 
				
			
			@ -412,7 +502,7 @@ rb_reg_inspect(VALUE re)
 | 
			
		|||
static VALUE
 | 
			
		||||
rb_reg_to_s(VALUE re)
 | 
			
		||||
{
 | 
			
		||||
    int options;
 | 
			
		||||
    int options, opt;
 | 
			
		||||
    const int embeddable = ONIG_OPTION_MULTILINE|ONIG_OPTION_IGNORECASE|ONIG_OPTION_EXTEND;
 | 
			
		||||
    long len;
 | 
			
		||||
    const char* ptr;
 | 
			
		||||
| 
						 | 
				
			
			@ -429,16 +519,13 @@ rb_reg_to_s(VALUE re)
 | 
			
		|||
	ptr += 2;
 | 
			
		||||
	if ((len -= 2) > 0) {
 | 
			
		||||
	    do {
 | 
			
		||||
		if (*ptr == 'm') {
 | 
			
		||||
		    options |= ONIG_OPTION_MULTILINE;
 | 
			
		||||
		}
 | 
			
		||||
		else if (*ptr == 'i') {
 | 
			
		||||
		    options |= ONIG_OPTION_IGNORECASE;
 | 
			
		||||
		}
 | 
			
		||||
		else if (*ptr == 'x') {
 | 
			
		||||
		    options |= ONIG_OPTION_EXTEND;
 | 
			
		||||
		}
 | 
			
		||||
		else break;
 | 
			
		||||
                opt = char_to_option((int )*ptr);
 | 
			
		||||
                if (opt != 0) {
 | 
			
		||||
                    options |= opt;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
		++ptr;
 | 
			
		||||
	    } while (--len > 0);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -446,16 +533,13 @@ rb_reg_to_s(VALUE re)
 | 
			
		|||
	    ++ptr;
 | 
			
		||||
	    --len;
 | 
			
		||||
	    do {
 | 
			
		||||
		if (*ptr == 'm') {
 | 
			
		||||
		    options &= ~ONIG_OPTION_MULTILINE;
 | 
			
		||||
		}
 | 
			
		||||
		else if (*ptr == 'i') {
 | 
			
		||||
		    options &= ~ONIG_OPTION_IGNORECASE;
 | 
			
		||||
		}
 | 
			
		||||
		else if (*ptr == 'x') {
 | 
			
		||||
		    options &= ~ONIG_OPTION_EXTEND;
 | 
			
		||||
		}
 | 
			
		||||
		else break;
 | 
			
		||||
                opt = char_to_option((int )*ptr);
 | 
			
		||||
                if (opt != 0) {
 | 
			
		||||
                    options &= ~opt;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
		++ptr;
 | 
			
		||||
	    } while (--len > 0);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -1344,13 +1428,7 @@ VALUE rb_cRegexp;
 | 
			
		|||
 | 
			
		||||
static void
 | 
			
		||||
rb_reg_initialize(VALUE obj, const char *s, long len,
 | 
			
		||||
    int options,		/* CASEFOLD  = 1 */
 | 
			
		||||
				/* EXTENDED  = 2 */
 | 
			
		||||
				/* MULTILINE = 4 */
 | 
			
		||||
				/* CODE_NONE = 16 */
 | 
			
		||||
				/* CODE_EUC  = 32 */
 | 
			
		||||
				/* CODE_SJIS = 48 */
 | 
			
		||||
				/* CODE_UTF8 = 64 */
 | 
			
		||||
    int options,
 | 
			
		||||
    int ce)			/* call rb_compile_error() */
 | 
			
		||||
{
 | 
			
		||||
    struct RRegexp *re = RREGEXP(obj);
 | 
			
		||||
| 
						 | 
				
			
			@ -1360,38 +1438,21 @@ rb_reg_initialize(VALUE obj, const char *s, long len,
 | 
			
		|||
    re->ptr = 0;
 | 
			
		||||
    re->str = 0;
 | 
			
		||||
 | 
			
		||||
    switch (options & ~0xf) {
 | 
			
		||||
      case 0:
 | 
			
		||||
      default:
 | 
			
		||||
	FL_SET(re, reg_kcode);
 | 
			
		||||
	break;
 | 
			
		||||
      case 16:
 | 
			
		||||
	kcode_none(re);
 | 
			
		||||
	break;
 | 
			
		||||
      case 32:
 | 
			
		||||
	kcode_euc(re);
 | 
			
		||||
	break;
 | 
			
		||||
      case 48:
 | 
			
		||||
	kcode_sjis(re);
 | 
			
		||||
	break;
 | 
			
		||||
      case 64:
 | 
			
		||||
	kcode_utf8(re);
 | 
			
		||||
	break;
 | 
			
		||||
    }
 | 
			
		||||
    set_re_kcode_by_option(re, options);
 | 
			
		||||
 | 
			
		||||
    if (options & ~0xf) {
 | 
			
		||||
    if (options & ARG_KCODE_MASK) {
 | 
			
		||||
	kcode_set_option((VALUE)re);
 | 
			
		||||
    }
 | 
			
		||||
    if (ruby_ignorecase) {
 | 
			
		||||
	options |= ONIG_OPTION_IGNORECASE;
 | 
			
		||||
	FL_SET(re, REG_CASESTATE);
 | 
			
		||||
    }
 | 
			
		||||
    re->ptr = make_regexp(s, len, options & 0xf, ce);
 | 
			
		||||
    re->ptr = make_regexp(s, len, options & ARG_REG_OPTION_MASK, ce);
 | 
			
		||||
    re->str = ALLOC_N(char, len+1);
 | 
			
		||||
    memcpy(re->str, s, len);
 | 
			
		||||
    re->str[len] = '\0';
 | 
			
		||||
    re->len = len;
 | 
			
		||||
    if (options & ~0xf) {
 | 
			
		||||
    if (options & ARG_KCODE_MASK) {
 | 
			
		||||
	kcode_reset_option();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1704,24 +1765,9 @@ rb_reg_initialize_m(int argc, VALUE *argv, VALUE self)
 | 
			
		|||
	    rb_warn("flags%s ignored", (argc == 3) ? " and encoding": "");
 | 
			
		||||
	}
 | 
			
		||||
	rb_reg_check(argv[0]);
 | 
			
		||||
	flags = RREGEXP(argv[0])->ptr->options & 0xf;
 | 
			
		||||
	flags = RREGEXP(argv[0])->ptr->options & ARG_REG_OPTION_MASK;
 | 
			
		||||
	if (FL_TEST(argv[0], KCODE_FIXED)) {
 | 
			
		||||
	    switch (RBASIC(argv[0])->flags & KCODE_MASK) {
 | 
			
		||||
	      case KCODE_NONE:
 | 
			
		||||
		flags |= 16;
 | 
			
		||||
		break;
 | 
			
		||||
	      case KCODE_EUC:
 | 
			
		||||
		flags |= 32;
 | 
			
		||||
		break;
 | 
			
		||||
	      case KCODE_SJIS:
 | 
			
		||||
		flags |= 48;
 | 
			
		||||
		break;
 | 
			
		||||
	      case KCODE_UTF8:
 | 
			
		||||
		flags |= 64;
 | 
			
		||||
		break;
 | 
			
		||||
	      default:
 | 
			
		||||
		break;
 | 
			
		||||
	    }
 | 
			
		||||
            flags |= re_to_kcode_arg_value(argv[0]);
 | 
			
		||||
	}
 | 
			
		||||
	s = RREGEXP(argv[0])->str;
 | 
			
		||||
	len = RREGEXP(argv[0])->len;
 | 
			
		||||
| 
						 | 
				
			
			@ -1734,23 +1780,8 @@ rb_reg_initialize_m(int argc, VALUE *argv, VALUE self)
 | 
			
		|||
	if (argc == 3 && !NIL_P(argv[2])) {
 | 
			
		||||
	    char *kcode = StringValuePtr(argv[2]);
 | 
			
		||||
 | 
			
		||||
	    flags &= ~0x70;
 | 
			
		||||
	    switch (kcode[0]) {
 | 
			
		||||
	      case 'n': case 'N':
 | 
			
		||||
		flags |= 16;
 | 
			
		||||
		break;
 | 
			
		||||
	      case 'e': case 'E':
 | 
			
		||||
		flags |= 32;
 | 
			
		||||
		break;
 | 
			
		||||
	      case 's': case 'S':
 | 
			
		||||
		flags |= 48;
 | 
			
		||||
		break;
 | 
			
		||||
	      case 'u': case 'U':
 | 
			
		||||
		flags |= 64;
 | 
			
		||||
		break;
 | 
			
		||||
	      default:
 | 
			
		||||
		break;
 | 
			
		||||
	    }
 | 
			
		||||
	    flags &= ~ARG_KCODE_MASK;
 | 
			
		||||
	    flags |= char_to_arg_kcode((int )kcode[0]);
 | 
			
		||||
	}
 | 
			
		||||
	s = StringValuePtr(argv[0]);
 | 
			
		||||
	len = RSTRING(argv[0])->len;
 | 
			
		||||
| 
						 | 
				
			
			@ -1891,23 +1922,6 @@ rb_kcode(void)
 | 
			
		|||
    rb_bug("wrong reg_kcode value (0x%x)", reg_kcode);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
rb_reg_get_kcode(VALUE re)
 | 
			
		||||
{
 | 
			
		||||
    switch (RBASIC(re)->flags & KCODE_MASK) {
 | 
			
		||||
      case KCODE_NONE:
 | 
			
		||||
	return 16;
 | 
			
		||||
      case KCODE_EUC:
 | 
			
		||||
	return 32;
 | 
			
		||||
      case KCODE_SJIS:
 | 
			
		||||
	return 48;
 | 
			
		||||
      case KCODE_UTF8:
 | 
			
		||||
	return 64;
 | 
			
		||||
      default:
 | 
			
		||||
	return 0;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
rb_reg_options(VALUE re)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1917,7 +1931,7 @@ rb_reg_options(VALUE re)
 | 
			
		|||
    options = RREGEXP(re)->ptr->options &
 | 
			
		||||
	(ONIG_OPTION_IGNORECASE|ONIG_OPTION_MULTILINE|ONIG_OPTION_EXTEND);
 | 
			
		||||
    if (FL_TEST(re, KCODE_FIXED)) {
 | 
			
		||||
	options |= rb_reg_get_kcode(re);
 | 
			
		||||
	options |= re_to_kcode_arg_value(re);
 | 
			
		||||
    }
 | 
			
		||||
    return options;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,14 @@
 | 
			
		|||
#define RUBY_VERSION "1.9.0"
 | 
			
		||||
#define RUBY_RELEASE_DATE "2006-03-24"
 | 
			
		||||
#define RUBY_RELEASE_DATE "2006-03-26"
 | 
			
		||||
#define RUBY_VERSION_CODE 190
 | 
			
		||||
#define RUBY_RELEASE_CODE 20060324
 | 
			
		||||
#define RUBY_RELEASE_CODE 20060326
 | 
			
		||||
 | 
			
		||||
#define RUBY_VERSION_MAJOR 1
 | 
			
		||||
#define RUBY_VERSION_MINOR 9
 | 
			
		||||
#define RUBY_VERSION_TEENY 0
 | 
			
		||||
#define RUBY_RELEASE_YEAR 2006
 | 
			
		||||
#define RUBY_RELEASE_MONTH 3
 | 
			
		||||
#define RUBY_RELEASE_DAY 24
 | 
			
		||||
#define RUBY_RELEASE_DAY 26
 | 
			
		||||
 | 
			
		||||
RUBY_EXTERN const char ruby_version[];
 | 
			
		||||
RUBY_EXTERN const char ruby_release_date[];
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue