# \[#19002\] RUBY\_\* constants

**URL:** <https://www.ruby-forum.com/t/19002-ruby-constants/138946>\
**Category:** Development\
**Created:** [May 29, 2008, 6:54am UTC](https://www.ruby-forum.com/t/19002-ruby-constants/138946 "2008-05-29T06:54:15Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/77aa72/32.png) [@Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/u/Kazuhiro_NISHIYAMA)\
**Post date:** [May 29, 2008, 6:54am UTC](https://www.ruby-forum.com/t/19002-ruby-constants/138946/1 "2008-05-29T06:54:15Z")

</div>

e$B@\>;3OB9-$G$9!#e(B

[http://rubyforge.org/tracker/index.php?func=detail&aid=19002&group\_id=426&atid=22040](http://rubyforge.org/tracker/index.php?func=detail&aid=19002&group_id=426&atid=22040)  
e$B$N%Q%C%A$G$9!#e(B

r14469e$B$r85$K$7$F$$$^$9!#e(B  
error.ce$B$NJQ99$Ge(B[ruby-dev:34826]e$B$bD\>$j$^$9!#e(B

e$B%P%C%/%]!\<%H$N%Q%C%A$r:n@.$7$F$$$F5$$K$J$C$?$N$G$9$,!“e(B  
trunke$B$NJ}$Ge(Bconst int ruby\_patchlevele$B$O$”$k$N$Ke(B  
const int ruby\_revisione$B$,$J$$$N$O$$$$$N$G$7$g$&$+e(B?

# Index: error.c

— error.c (revision 16676)  
+++ error.c (working copy)  
@@ -29,8 +29,7 @@  
#define EXIT\_SUCCESS 0  
#endif

-extern const char ruby\_version[], ruby\_release\_date[], ruby\_platform[];  
-extern const int ruby\_patchlevel;  
+extern const char ruby\_description[];

int ruby\_nerrs;

@@ -209,8 +208,7 @@  
va\_init\_list(args, fmt);  
vfprintf(out, fmt, args);  
va\_end(args);

- fprintf(out, “\nruby %s (%s patchlevel %d) [%s]\n\n”,
- ruby\_version, ruby\_release\_date, ruby\_patchlevel, ruby\_platform);

- fprintf(out, “\n%s\n\n”, ruby\_description);  
}  
abort();  
}  
Index: configure.in  
===================================================================  
— configure.in (revision 16676)  
+++ configure.in (working copy)  
@@ -290,6 +290,41 @@  
AC\_DEFINE(TOKEN\_PASTE(x,y),[x/\*\*/y])  
fi

+AC\_CACHE\_CHECK(stringization, rb\_cv\_stringization, [

- rb\_cv\_stringization=no
- for string in “#expr” ‘“expr”’; do
- AC\_COMPILE\_IFELSE([
- 

```
 AC_LANG_BOOL_COMPILE_TRY([

```

+#define STRINGIZE0(expr) $string  
+#define STRINGIZE(expr) STRINGIZE0(expr)  
+#undef real\_test\_for\_stringization  
+#define test\_for\_stringization -.real\_test\_for\_stringization.-  
+const char stringized[[]] = STRINGIZE(test\_for\_stringization);  
+], [sizeof(stringized) == 32])],

- 

```
 [rb_cv_stringization="$string"; break],

```

- 

```
 [rb_cv_stringization=no])

```

- done]  
+)  
+AC\_DEFINE(STRINGIZE(expr),STRINGIZE0(expr))  
+if test x"$rb\_cv\_stringization" != xno -a “$rb\_cv\_stringization” !=  
“#expr”; then
- AC\_DEFINE\_UNQUOTED(STRINGIZE0(expr),$rb\_cv\_stringization)
- AC\_DEFINE(OLD\_FASHIONED\_STRINGIZATION,1)  
+fi
- 

+AC\_CACHE\_CHECK([string literal concatenation],

- rb\_cv\_string\_literal\_concatenation, [
- AC\_COMPILE\_IFELSE([
- AC\_LANG\_BOOL\_COMPILE\_TRY([  
+const char concatenated\_literal[[]] = “literals” “to”
- “be” “concatenated.”;  
+], [sizeof(concatenated\_literal) == 26])],
- [rb\_cv\_string\_literal\_concatenation=yes],
- [rb\_cv\_string\_literal\_concatenation=no])]  
+)  
+if test “$rb\_cv\_string\_literal\_concatenation” = no; then
- AC\_DEFINE(NO\_STRING\_LITERAL\_CONCATENATION,1)  
+fi
- 

# AC\_CACHE\_CHECK(for variable length prototypes and stdarg.h, rb\_cv\_stdarg, [AC\_TRY\_COMPILE([ #include \<stdarg.h\> Index: version.c

— version.c (revision 16676)  
+++ version.c (working copy)  
@@ -14,22 +14,29 @@  
#include “version.h”  
#include \<stdio.h\>

+#define PRINT(type) puts(ruby\_##type)  
+#define MKSTR(type) rb\_obj\_freeze(rb\_str\_new(ruby\_##type,  
sizeof(ruby\_##type)-1))  
+  
const char ruby\_version[] = RUBY\_VERSION;  
const char ruby\_release\_date[] = RUBY\_RELEASE\_DATE;  
const char ruby\_platform[] = RUBY\_PLATFORM;  
const int ruby\_patchlevel = RUBY\_PATCHLEVEL;  
+const char ruby\_description[] = RUBY\_DESCRIPTION;  
+const char ruby\_copyright[] = RUBY\_COPYRIGHT;

void  
Init\_version()  
{

- VALUE v = rb\_obj\_freeze(rb\_str\_new2(ruby\_version));
- VALUE d = rb\_obj\_freeze(rb\_str\_new2(ruby\_release\_date));
- VALUE p = rb\_obj\_freeze(rb\_str\_new2(ruby\_platform));

- VALUE v = MKSTR(version);

- VALUE d = MKSTR(release\_date);

- VALUE p = MKSTR(platform);

- rb\_define\_global\_const(“RUBY\_DESCRIPTION”, MKSTR(description));

- rb\_define\_global\_const(“RUBY\_COPYRIGHT”, MKSTR(copyright));

- printf(“ruby %s (%s patchlevel %d) [%s]\n”, RUBY\_VERSION,  
RUBY\_RELEASE\_DATE, RUBY\_PATCHLEVEL, RUBY\_PLATFORM);

- PRINT(description);  
fflush(stdout);  
}

void  
ruby\_show\_copyright()  
{

- printf(“ruby - Copyright (C) 1993-%d Yukihiro M.\n”,  
RUBY\_RELEASE\_YEAR);

- PRINT(copyright);  
exit(0);  
}  
Index: version.h  
===================================================================  
— version.h (revision 16676)  
+++ version.h (working copy)  
@@ -1,7 +1,7 @@  
#define RUBY\_VERSION “1.8.7”  
-#define RUBY\_RELEASE\_DATE “2008-05-28”  
+#define RUBY\_RELEASE\_DATE “2008-05-29”  
#define RUBY\_VERSION\_CODE 187  
-#define RUBY\_RELEASE\_CODE 20080528  
+#define RUBY\_RELEASE\_CODE 20080529  
#define RUBY\_PATCHLEVEL 5000

#define RUBY\_VERSION\_MAJOR 1  
@@ -9,11 +9,33 @@  
#define RUBY\_VERSION\_TEENY 7  
#define RUBY\_RELEASE\_YEAR 2008  
#define RUBY\_RELEASE\_MONTH 5  
-#define RUBY\_RELEASE\_DAY 28  
+#define RUBY\_RELEASE\_DAY 29

#ifdef RUBY\_EXTERN  
RUBY\_EXTERN const char ruby\_version[];  
RUBY\_EXTERN const char ruby\_release\_date[];  
RUBY\_EXTERN const char ruby\_platform[];  
RUBY\_EXTERN const int ruby\_patchlevel;  
+RUBY\_EXTERN const char ruby\_description[];  
+RUBY\_EXTERN const char ruby\_copyright[];  
#endif  
+  
+#define RUBY\_AUTHOR “Yukihiro M.”  
+#define RUBY\_BIRTH\_YEAR 1993  
+#define RUBY\_BIRTH\_MONTH 2  
+#define RUBY\_BIRTH\_DAY 24  
+  
+#define RUBY\_RELEASE\_STR “patchlevel”  
+#define RUBY\_RELEASE\_NUM RUBY\_PATCHLEVEL  
+  
+# define RUBY\_DESCRIPTION \

- "ruby "RUBY\_VERSION \
- " (“RUBY\_RELEASE\_DATE” " \
- RUBY\_RELEASE\_STR" " \
- STRINGIZE(RUBY\_RELEASE\_NUM)") " \
- “[“RUBY\_PLATFORM”]”  
+# define RUBY\_COPYRIGHT \
- "ruby - Copyright (C) " \
- STRINGIZE(RUBY\_BIRTH\_YEAR)“-” \
- STRINGIZE(RUBY\_RELEASE\_YEAR)" " \
- RUBY\_AUTHOR  
Index: defines.h  
===================================================================  
— defines.h (revision 16676)  
+++ defines.h (working copy)  
@@ -51,6 +51,11 @@  
void _xrealloc \_((void_,long));  
void xfree \_((void\*));

+#define STRINGIZE(expr) STRINGIZE0(expr)  
+#ifndef STRINGIZE0  
+#define STRINGIZE0(expr) #expr  
+#endif  
+  
#if SIZEOF\_LONG\_LONG \> 0

# define LONG\_LONG long long

#elif SIZEOF\_\_\_INT64 \> 0

---

<div class="post-metadata">

**Author:** ![Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/77aa72/32.png) [@Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/u/Kazuhiro_NISHIYAMA)\
**Post date:** [May 29, 2008, 8:51am UTC](https://www.ruby-forum.com/t/19002-ruby-constants/138946/2 "2008-05-29T08:51:08Z")

</div>

e$B$J$+$@$G$9!#e(B

At Thu, 29 May 2008 13:53:22 +0900,  
Kazuhiro NISHIYAMA wrote in [ruby-dev:34883]:

> e$B@\>;3OB9-$G$9!#e(B
> 
> [http://rubyforge.org/tracker/index.php?func=detail&aid=19002&group\_id=426&atid=22040](http://rubyforge.org/tracker/index.php?func=detail&aid=19002&group_id=426&atid=22040)  
> e$B$N%Q%C%A$G$9!#e(B
> 
> r14469e$B$r85$K$7$F$$$^$9!#e(B  
> error.ce$B$NJQ99$Ge(B[ruby-dev:34826]e$B$bD\>$j$^$9!#e(B

STRINGIZEe$B$O$H$b$+$/!"e(BNO\_STRING\_LITERAL\_CONCATENATIONe$B$N\>l9g$O$I$&e(B  
e$B$J$k$s$G$7$g$&!#e(B

> e$B%P%C%/%]!\<%H$N%Q%C%A$r:n@.$7$F$$$F5$$K$J$C$?$N$G$9$,!“e(B  
> trunke$B$NJ}$Ge(Bconst int ruby\_patchlevele$B$O$”$k$N$Ke(B  
> const int ruby\_revisione$B$,$J$$$N$O$$$$$N$G$7$g$&$+e(B?

e$B$$$j$^$9e(B?

---

<div class="post-metadata">

**Author:** ![Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/77aa72/32.png) [@Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/u/Kazuhiro_NISHIYAMA)\
**Post date:** [May 29, 2008, 11:15am UTC](https://www.ruby-forum.com/t/19002-ruby-constants/138946/3 "2008-05-29T11:15:36Z")

</div>

e$B@\>;3OB9-$G$9!#e(B

At Thu, 29 May 2008 15:50:09 +0900,  
Nobuyoshi N. wrote:

> STRINGIZEe$B$O$H$b$+$/!"e(BNO\_STRING\_LITERAL\_CONCATENATIONe$B$N\>l9g$O$I$&e(B  
> e$B$J$k$s$G$7$g$&!#e(B

1.9e$B$NJ}$O2?$b$7$F$$$J$$$h$&$G$9$,!"e(B1.8e$B$O$=$&$$$&4D6-$bBP1~$7$F$$$ke(B  
e$B$N$G$7$g$&$+e(B?

> > e$B%P%C%/%]!\<%H$N%Q%C%A$r:n@.$7$F$$$F5$$K$J$C$?$N$G$9$,!“e(B  
> > trunke$B$NJ}$Ge(Bconst int ruby\_patchlevele$B$O$”$k$N$Ke(B  
> > const int ruby\_revisione$B$,$J$$$N$O$$$$$N$G$7$g$&$+e(B?
> 
> e$B$$$j$^$9e(B?

RUBY\_REVISIONe$B$G$H$l$k$N$G$J$/$F$bNI$5$=$&$J5$$,$7$^$9!#e(B

---

<div class="post-metadata">

**Author:** ![Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/77aa72/32.png) [@Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/u/Kazuhiro_NISHIYAMA)\
**Post date:** [May 30, 2008, 4:59pm UTC](https://www.ruby-forum.com/t/19002-ruby-constants/138946/4 "2008-05-30T16:59:56Z")

</div>

e$B$J$+$@$G$9!#e(B

At Thu, 29 May 2008 18:14:35 +0900,  
Kazuhiro NISHIYAMA wrote in [ruby-dev:34887]:

> > STRINGIZEe$B$O$H$b$+$/!"e(BNO\_STRING\_LITERAL\_CONCATENATIONe$B$N\>l9g$O$I$&e(B  
> > e$B$J$k$s$G$7$g$&!#e(B
> 
> 1.9e$B$NJ}$O2?$b$7$F$$$J$$$h$&$G$9$,!"e(B1.8e$B$O$=$&$$$&4D6-$bBP1~$7$F$$$ke(B  
> e$B$N$G$7$g$&$+e(B?

e$B4pK\E\*$Oe(BK&Re$B$G$9$+$i!#e(Bstringizatione$B$O8E$$%3%s%Q%$%i$G$bBeBX\<jCJ$,e(B  
e$B$"$k2DG=@-$,$"$j$^$9$,!"e(Bstring literal  
concatenatione$B$Oe(BC89e$B$+$i$7e(B  
e$B$+$J$$$G$9$h$M$’!#e(B

---

<div class="post-metadata">

**Author:** ![Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/k/77aa72/32.png) [@Kazuhiro\_NISHIYAMA](https://www.ruby-forum.com/u/Kazuhiro_NISHIYAMA)\
**Post date:** [May 30, 2008, 5:45pm UTC](https://www.ruby-forum.com/t/19002-ruby-constants/138946/5 "2008-05-30T17:45:44Z")

</div>

e$B@\>;3OB9-$G$9!#e(B

At Fri, 30 May 2008 11:27:21 +0900,  
Nobuyoshi N. wrote:

> e$B4pK\E\*$Oe(BK&Re$B$G$9$+$i!#e(Bstringizatione$B$O8E$$%3%s%Q%$%i$G$bBeBX\<jCJ$,e(B  
> e$B$"$k2DG=@-$,$"$j$^$9$,!"e(Bstring literal concatenatione$B$Oe(BC89e$B$+$i$7e(B  
> e$B$+$J$$$G$9$h$M$’!#e(B

snprintfe$B$G@8@.$9$k$h$&$K$7$F$\_$^$7$?!#e(B

# Index: error.c

— error.c (revision 16703)  
+++ error.c (working copy)  
@@ -29,8 +29,7 @@  
#define EXIT\_SUCCESS 0  
#endif

-extern const char ruby\_version[], ruby\_release\_date[], ruby\_platform[];  
-extern const int ruby\_patchlevel;  
+extern const char \*ruby\_description;

int ruby\_nerrs;

@@ -209,8 +208,7 @@  
va\_init\_list(args, fmt);  
vfprintf(out, fmt, args);  
va\_end(args);

- fprintf(out, “\nruby %s (%s patchlevel %d) [%s]\n\n”,
- ruby\_version, ruby\_release\_date, ruby\_patchlevel, ruby\_platform);

- fprintf(out, “\n%s\n\n”, ruby\_description);  
}  
abort();  
}  
Index: version.c  
===================================================================  
— version.c (revision 16703)  
+++ version.c (working copy)  
@@ -14,23 +14,44 @@  
#include “version.h”  
#include \<stdio.h\>

+#define PRINT(type) puts(ruby\_##type)  
+#define MKSTR(type) rb\_obj\_freeze(rb\_str\_new(ruby\_##type,  
sizeof(ruby\_##type)-1))  
+  
const char ruby\_version[] = RUBY\_VERSION;  
const char ruby\_release\_date[] = RUBY\_RELEASE\_DATE;  
const char ruby\_platform[] = RUBY\_PLATFORM;  
const int ruby\_patchlevel = RUBY\_PATCHLEVEL;  
+const char \*ruby\_description;  
+const char \*ruby\_copyright;

void  
Init\_version()  
{

- VALUE v = rb\_obj\_freeze(rb\_str\_new2(ruby\_version));
- VALUE d = rb\_obj\_freeze(rb\_str\_new2(ruby\_release\_date));
- VALUE p = rb\_obj\_freeze(rb\_str\_new2(ruby\_platform));

- static char description[128];

- static char copyright[128];

- VALUE v = MKSTR(version);

- VALUE d = MKSTR(release\_date);

- VALUE p = MKSTR(platform);

- VALUE tmp;

- snprintf(description, sizeof(description), “ruby %s (%s %s %d)  
[%s]”,

- 

```
        RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_RELEASE_STR,

```

- 

```
        RUBY_RELEASE_NUM, RUBY_PLATFORM);

```

- ruby\_description = description;

- tmp = rb\_obj\_freeze(rb\_str\_new2(description));

- rb\_define\_global\_const(“RUBY\_DESCRIPTION”, tmp);

- 
- snprintf(copyright, sizeof(copyright), “ruby - Copyright © %d-%d  
%s”,

- 

```
        RUBY_BIRTH_YEAR, RUBY_RELEASE_YEAR, RUBY_AUTHOR);

```

- ruby\_copyright = copyright;

- tmp = rb\_obj\_freeze(rb\_str\_new2(copyright));

- rb\_define\_global\_const(“RUBY\_COPYRIGHT”, tmp);

- /\* obsolete constants \*/  
rb\_define\_global\_const(“VERSION”, v);  
rb\_define\_global\_const(“RELEASE\_DATE”, d);  
@@ -40,13 +61,13 @@  
void  
ruby\_show\_version()  
{

- printf(“ruby %s (%s patchlevel %d) [%s]\n”, RUBY\_VERSION,  
RUBY\_RELEASE\_DATE, RUBY\_PATCHLEVEL, RUBY\_PLATFORM);

- PRINT(description);  
fflush(stdout);  
}

void  
ruby\_show\_copyright()  
{

- printf(“ruby - Copyright © 1993-%d Yukihiro M.\n”,  
RUBY\_RELEASE\_YEAR);

- PRINT(copyright);  
exit(0);  
}  
Index: version.h  
===================================================================  
— version.h (revision 16703)  
+++ version.h (working copy)  
@@ -16,4 +16,14 @@  
RUBY\_EXTERN const char ruby\_release\_date[];  
RUBY\_EXTERN const char ruby\_platform[];  
RUBY\_EXTERN const int ruby\_patchlevel;  
+RUBY\_EXTERN const char \*ruby\_description;  
+RUBY\_EXTERN const char \*ruby\_copyright;  
#endif
- 

+#define RUBY\_AUTHOR “Yukihiro M.”  
+#define RUBY\_BIRTH\_YEAR 1993  
+#define RUBY\_BIRTH\_MONTH 2  
+#define RUBY\_BIRTH\_DAY 24  
+  
+#define RUBY\_RELEASE\_STR “patchlevel”  
+#define RUBY\_RELEASE\_NUM RUBY\_PATCHLEVEL
