summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-03-22 07:26:42 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-03-22 07:26:42 +0000
commit2bd0c2bf73acd0841619f67e3448573e5b6e3064 (patch)
tree8d1f8bb30c4092ea1c809a0f7bfe65bb0cd94d66
parent890521d11783ac21503052e2a5f86c4ddfc6a9d8 (diff)
* the VMS support patch submitted by Akiyoshi, Masamichi
<Masamichi.Akiyoshi@jp.compaq.com> is merged. * eval.c (exec_under): changing ruby_class is OK, but should not alter cbase. * eval.c (yield_under_i): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2258 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog12
-rw-r--r--bignum.c6
-rw-r--r--defines.h4
-rw-r--r--dln.c34
-rw-r--r--error.c2
-rw-r--r--eval.c50
-rw-r--r--ext/socket/socket.c112
-rw-r--r--io.c13
-rw-r--r--missing/vsnprintf.c2
-rw-r--r--numeric.c15
-rw-r--r--process.c27
-rw-r--r--ruby.h5
-rw-r--r--st.c1
-rw-r--r--time.c2
-rw-r--r--vms/config.h_in61
-rw-r--r--vms/vms.h6
16 files changed, 259 insertions, 93 deletions
diff --git a/ChangeLog b/ChangeLog
index 79d1a76..0ca9d42 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Mar 22 16:22:55 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * the VMS support patch submitted by Akiyoshi, Masamichi
+ <Masamichi.Akiyoshi@jp.compaq.com> is merged.
+
Fri Mar 22 16:27:24 2002 Minero Aoki <aamine@loveruby.net>
* lib/racc/parser.rb: new file.
@@ -8,6 +13,13 @@ Fri Mar 22 16:27:24 2002 Minero Aoki <aamine@loveruby.net>
* ext/Setup*: add racc/cparse.
+Fri Mar 22 15:04:03 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * eval.c (exec_under): changing ruby_class is OK, but should not
+ alter cbase.
+
+ * eval.c (yield_under_i): ditto.
+
Fri Mar 22 15:44:38 2002 Minero Aoki <aamine@loveruby.net>
* ext/strscan/MANIFEST, strscan.c, depend, extconf.rb: new files.
diff --git a/bignum.c b/bignum.c
index e090f9b..1332273 100644
--- a/bignum.c
+++ b/bignum.c
@@ -290,7 +290,8 @@ rb_quad_pack(buf, val)
if (!RBIGNUM(val)->sign) {
len = QUAD_SIZE;
while (len--) {
- *buf = ~*buf++;
+ *buf = ‾*buf;
+ buf++;
}
}
}
@@ -311,7 +312,8 @@ rb_quad_unpack(buf, sign)
RBIGNUM(big)->sign = 0;
while (len--) {
- *tmp = ~*tmp++;
+ *tmp = ~*tmp;
+ tmp++;
}
}
diff --git a/defines.h b/defines.h
index d8b7242..c79178a 100644
--- a/defines.h
+++ b/defines.h
@@ -88,6 +88,10 @@ void xfree _((void*));
#include "win32/win32.h"
#endif
+#if defined(__VMS)
+#include "vms/vms.h"
+#endif
+
#if defined __CYGWIN__
# undef EXTERN
# if defined USEIMPORTLIB
diff --git a/dln.c b/dln.c
index 100fa08..4e39bc8 100644
--- a/dln.c
+++ b/dln.c
@@ -48,7 +48,7 @@ void *xrealloc();
#endif
#include <stdio.h>
-#ifdef NT
+#if defined(NT) || defined(__VMS)
#include "missing/file.h"
#endif
#include <sys/types.h>
@@ -72,6 +72,11 @@ void *xrealloc();
char *getenv();
#endif
+#if defined(__VMS)
+#pragma builtins
+#include <dlfcn.h>
+#endif
+
#ifdef __MACOS__
# include <TextUtils.h>
# include <CodeFragments.h>
@@ -1517,6 +1522,33 @@ dln_load(file)
}
#endif /* __MACOS__ */
+#if defined(__VMS)
+#define DLN_DEFINED
+ {
+ void *handle, (*init_fct)();
+ char *fname, *p1, *p2;
+
+ fname = (char *)__alloca(strlen(file)+1);
+ strcpy(fname,file);
+ if (p1 = strrchr(fname,'/'))
+ fname = p1 + 1;
+ if (p2 = strrchr(fname,'.'))
+ *p2 = '¥0';
+
+ if ((handle = (void*)dlopen(fname, 0)) == NULL) {
+ goto failed;
+ }
+
+ if ((init_fct = (void (*)())dlsym(handle, buf)) == NULL) {
+ dlclose(handle);
+ goto failed;
+ }
+ /* Call the init code */
+ (*init_fct)();
+ return handle;
+ }
+#endif /* __VMS */
+
#ifndef DLN_DEFINED
rb_notimplement("dynamic link not supported");
#endif
diff --git a/error.c b/error.c
index e52f2e9..ecec654 100644
--- a/error.c
+++ b/error.c
@@ -718,7 +718,7 @@ void
rb_sys_fail(mesg)
const char *mesg;
{
-#ifndef NT
+#if !defined(NT) && !defined(__VMS)
char *strerror();
#endif
char *err;
diff --git a/eval.c b/eval.c
index 32f7972..7446149 100644
--- a/eval.c
+++ b/eval.c
@@ -87,6 +87,10 @@ struct timeval {
#include <signal.h>
#include <errno.h>
+#if defined(__VMS)
+#pragma nostandard
+#endif
+
#ifdef HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
@@ -3110,7 +3114,7 @@ rb_eval(self, n)
body = search_method(ruby_class, node->nd_mid, &origin);
if (body){
if (RTEST(ruby_verbose) && ruby_class == origin && body->nd_cnt == 0) {
- rb_warning("discarding old %s", rb_id2name(node->nd_mid));
+ rb_warning("method redefined; discarding old %s", rb_id2name(node->nd_mid));
}
if (node->nd_noex) { /* toplevel */
/* should upgrade to rb_warn() if no super was called inside? */
@@ -5106,9 +5110,9 @@ rb_f_eval(argc, argv, self)
/* function to call func under the specified class/module context */
static VALUE
-exec_under(func, under, args)
+exec_under(func, under, cbase, args)
VALUE (*func)();
- VALUE under;
+ VALUE under, cbase;
void *args;
{
VALUE val; /* OK */
@@ -5123,10 +5127,12 @@ exec_under(func, under, args)
ruby_frame->last_class = _frame.prev->last_class;
ruby_frame->argc = _frame.prev->argc;
ruby_frame->argv = _frame.prev->argv;
- if (ruby_cbase != under) {
- ruby_frame->cbase = (VALUE)rb_node_newnode(NODE_CREF,under,0,ruby_frame->cbase);
+ if (cbase) {
+ if (ruby_cbase != cbase) {
+ ruby_frame->cbase = (VALUE)rb_node_newnode(NODE_CREF,under,0,ruby_frame->cbase);
+ }
+ PUSH_CREF(cbase);
}
- PUSH_CREF(under);
mode = scope_vmode;
SCOPE_SET(SCOPE_PUBLIC);
@@ -5135,7 +5141,7 @@ exec_under(func, under, args)
val = (*func)(args);
}
POP_TAG();
- POP_CREF();
+ if (cbase) POP_CREF();
SCOPE_SET(mode);
POP_FRAME();
POP_CLASS();
@@ -5170,39 +5176,13 @@ eval_under(under, self, src, file, line)
args[1] = src;
args[2] = (VALUE)file;
args[3] = (VALUE)line;
- return exec_under(eval_under_i, under, args);
+ return exec_under(eval_under_i, under, under, args);
}
static VALUE
yield_under_i(self)
VALUE self;
{
- if (ruby_block->flags & BLOCK_DYNAMIC) {
- struct BLOCK * volatile old_block = ruby_block;
- struct BLOCK block;
-
- /* cbase should be pointed from volatile local variable */
- /* to be protected from GC. */
- VALUE result;
- int state;
-
- /* copy the block to avoid modifying global data. */
- block = *ruby_block;
- block.frame.cbase = ruby_frame->cbase;
- ruby_block = &block;
-
- PUSH_TAG(PROT_NONE);
- if ((state = EXEC_TAG()) == 0) {
- result = rb_yield_0(self, self, ruby_class, 0);
- }
- POP_TAG();
- ruby_block = old_block;
- if (state) JUMP_TAG(state);
-
- return result;
- }
- /* static block, no need to restore */
- ruby_block->frame.cbase = ruby_frame->cbase;
return rb_yield_0(self, self, ruby_class, 0);
}
@@ -5211,7 +5191,7 @@ static VALUE
yield_under(under, self)
VALUE under, self;
{
- return exec_under(yield_under_i, under, self);
+ return exec_under(yield_under_i, under, 0, self);
}
static VALUE
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 281a1fe..dcd4cd7 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -401,9 +401,9 @@ bsock_send(argc, argv, sock)
return INT2FIX(n);
}
-static VALUE ipaddr _((struct sockaddr *));
+static VALUE ipaddr _((struct sockaddr*));
#ifdef HAVE_SYS_UN_H
-static VALUE unixaddr _((struct sockaddr_un *));
+static VALUE unixaddr _((struct sockaddr_un*));
#endif
enum sock_recv_type {
@@ -465,10 +465,10 @@ s_recvfrom(sock, argc, argv, from)
rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
}
#endif
- return rb_assoc_new(str, ipaddr((struct sockaddr *)buf));
+ return rb_assoc_new(str, ipaddr((struct sockaddr*)buf));
#ifdef HAVE_SYS_UN_H
case RECV_UNIX:
- return rb_assoc_new(str, unixaddr((struct sockaddr_un *)buf));
+ return rb_assoc_new(str, unixaddr((struct sockaddr_un*)buf));
#endif
case RECV_SOCKET:
return rb_assoc_new(str, rb_tainted_str_new(buf, alen));
@@ -535,7 +535,7 @@ mkinetaddr(host, buf, len)
sin.sin_family = AF_INET;
SET_SIN_LEN(&sin, sizeof(sin));
sin.sin_addr.s_addr = host;
- mkipaddr0((struct sockaddr *)&sin, buf, len);
+ mkipaddr0((struct sockaddr*)&sin, buf, len);
}
static struct addrinfo*
@@ -590,6 +590,7 @@ ip_addrsetup(host, port)
MEMZERO(&hints, struct addrinfo, 1);
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_DGRAM;
+ hints.ai_flags = AI_CANONNAME;
error = getaddrinfo(hostp, portp, &hints, &res);
if (error) {
if (hostp && hostp[strlen(hostp)-1] == '\n') {
@@ -972,17 +973,19 @@ static VALUE
tcp_s_gethostbyname(obj, host)
VALUE obj, host;
{
+#if 0
struct sockaddr_storage addr;
struct hostent *h;
char **pch;
VALUE ary, names;
+ size_t size;
rb_secure(3);
if (rb_obj_is_kind_of(host, rb_cInteger)) {
long i = NUM2LONG(host);
struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
+ sin = (struct sockaddr_in*)&addr;
MEMZERO(sin, struct sockaddr_in, 1);
sin->sin_family = AF_INET;
SET_SIN_LEN(sin, sizeof(*sin));
@@ -995,8 +998,8 @@ tcp_s_gethostbyname(obj, host)
case AF_INET:
{
struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
- h = gethostbyaddr((char *)&sin->sin_addr,
+ sin = (struct sockaddr_in*)&addr;
+ h = gethostbyaddr((char*)&sin->sin_addr,
sizeof(sin->sin_addr),
sin->sin_family);
break;
@@ -1005,8 +1008,8 @@ tcp_s_gethostbyname(obj, host)
case AF_INET6:
{
struct sockaddr_in6 *sin6;
- sin6 = (struct sockaddr_in6 *)&addr;
- h = gethostbyaddr((char *)&sin6->sin6_addr,
+ sin6 = (struct sockaddr_in6*)&addr;
+ h = gethostbyaddr((char*)&sin6->sin6_addr,
sizeof(sin6->sin6_addr),
sin6->sin6_family);
break;
@@ -1019,7 +1022,7 @@ tcp_s_gethostbyname(obj, host)
if (h == NULL) {
#ifdef HAVE_HSTERROR
extern int h_errno;
- rb_raise(rb_eSocket, "%s", (char *)hsterror(h_errno));
+ rb_raise(rb_eSocket, "%s", (char*)hsterror(h_errno));
#else
rb_raise(rb_eSocket, "host not found");
#endif
@@ -1033,48 +1036,83 @@ tcp_s_gethostbyname(obj, host)
}
rb_ary_push(ary, INT2NUM(h->h_addrtype));
#ifdef h_addr
- for (pch = h->h_addr_list; *pch; pch++) {
+ for (pch = h->h_addr_list; *pch; pch++)
+ ;
+ pch++;
+ size = (char*)pch - (char*)h->h_addr_list;
+ pch = (char**)alloca(size);
+ memcpy((char*)pch, (char *)h->h_addr_list, size);
+ size = h->h_length;
+ for (; *pch && h; pch++) {
switch (addr.ss_family) {
- case AF_INET:
- {
+ case AF_INET: {
struct sockaddr_in sin;
+
MEMZERO(&sin, struct sockaddr_in, 1);
sin.sin_family = AF_INET;
SET_SIN_LEN(&sin, sizeof(sin));
- memcpy((char *) &sin.sin_addr, *pch, h->h_length);
- h = gethostbyaddr((char *)&sin.sin_addr,
+ memcpy((char*)&sin.sin_addr, *pch, size);
+ h = gethostbyaddr((char*)&sin.sin_addr,
sizeof(sin.sin_addr),
sin.sin_family);
- rb_ary_push(ary, mkipaddr((struct sockaddr *)&sin));
+ rb_ary_push(ary, mkipaddr((struct sockaddr*)&sin));
break;
}
#ifdef INET6
- case AF_INET6:
- {
+ case AF_INET6: {
struct sockaddr_in6 sin6;
+
MEMZERO(&sin6, struct sockaddr_in6, 1);
sin6.sin6_family = AF_INET;
#ifdef SIN6_LEN
sin6.sin6_len = sizeof(sin6);
#endif
- memcpy((char *) &sin6.sin6_addr, *pch, h->h_length);
- h = gethostbyaddr((char *)&sin6.sin6_addr,
+ memcpy((char*)&sin6.sin6_addr, *pch, size);
+ h = gethostbyaddr((char*)&sin6.sin6_addr,
sizeof(sin6.sin6_addr),
sin6.sin6_family);
- rb_ary_push(ary, mkipaddr((struct sockaddr *)&sin6));
+ rb_ary_push(ary, mkipaddr((struct sockaddr*)&sin6));
break;
}
#endif
- default:
+ default:
h = NULL;
+ break;
}
}
#else
- memcpy((char *)&addr.sin_addr, h->h_addr, h->h_length);
- rb_ary_push(ary, mkipaddr((struct sockaddr *)&addr));
+ memcpy((char*)&addr.sin_addr, h->h_addr, h->h_length);
+ rb_ary_push(ary, mkipaddr((struct sockaddr*)&addr));
#endif
return ary;
+#else
+
+ struct addrinfo hints, *res, *r;
+ VALUE ary, names;
+ int error;
+
+ rb_secure(3);
+ MEMZERO(&hints, struct addrinfo, 1);
+ hints.ai_family = PF_UNSPEC;
+ hints.ai_socktype = SOCK_STREAM;
+ r = res = ip_addrsetup(host, Qnil);
+ ary = rb_ary_new();
+ rb_ary_push(ary, rb_tainted_str_new2(r->ai_canonname));
+ r = r->ai_next;
+ names = rb_ary_new();
+ rb_ary_push(ary, names);
+ rb_ary_push(ary, INT2NUM(res->ai_family));
+ for (r = res; r; r = r->ai_next) {
+ if (r != res) {
+ rb_ary_push(names, rb_tainted_str_new2(r->ai_canonname));
+ }
+ rb_ary_push(ary, mkipaddr(r->ai_addr));
+ }
+ freeaddrinfo(res);
+
+ return ary;
+#endif
}
static VALUE
@@ -1202,7 +1240,7 @@ ip_addr(sock)
if (getsockname(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0)
rb_sys_fail("getsockname(2)");
- return ipaddr((struct sockaddr *)&addr);
+ return ipaddr((struct sockaddr*)&addr);
}
static VALUE
@@ -1217,7 +1255,7 @@ ip_peeraddr(sock)
if (getpeername(fileno(fptr->f), (struct sockaddr*)&addr, &len) < 0)
rb_sys_fail("getpeername(2)");
- return ipaddr((struct sockaddr *)&addr);
+ return ipaddr((struct sockaddr*)&addr);
}
static VALUE
@@ -1236,7 +1274,7 @@ ip_s_getaddress(obj, host)
struct sockaddr_storage addr;
setipaddr(host, &addr);
- return mkipaddr((struct sockaddr *)&addr);
+ return mkipaddr((struct sockaddr*)&addr);
}
static VALUE
@@ -1876,7 +1914,7 @@ mkhostent(h)
if (h == NULL) {
#ifdef HAVE_HSTRERROR
extern int h_errno;
- rb_raise(rb_eSocket, "%s", (char *)hstrerror(h_errno));
+ rb_raise(rb_eSocket, "%s", (char*)hstrerror(h_errno));
#else
rb_raise(rb_eSocket, "host not found");
#endif
@@ -1935,21 +1973,21 @@ sock_s_gethostbyname(obj, host)
if (rb_obj_is_kind_of(host, rb_cInteger)) {
long i = NUM2LONG(host);
struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
+ sin = (struct sockaddr_in*)&addr;
MEMZERO(sin, struct sockaddr_in, 1);
sin->sin_family = AF_INET;
SET_SIN_LEN(sin, sizeof(*sin));
sin->sin_addr.s_addr = htonl(i);
}
else {
- setipaddr(host, (struct sockaddr *)&addr);
+ setipaddr(host, (struct sockaddr*)&addr);
}
switch (addr.ss_family) {
case AF_INET:
{
struct sockaddr_in *sin;
- sin = (struct sockaddr_in *)&addr;
- h = gethostbyaddr((char *)&sin->sin_addr,
+ sin = (struct sockaddr_in*)&addr;
+ h = gethostbyaddr((char*)&sin->sin_addr,
sizeof(sin->sin_addr),
sin->sin_family);
break;
@@ -1958,8 +1996,8 @@ sock_s_gethostbyname(obj, host)
case AF_INET6:
{
struct sockaddr_in6 *sin6;
- sin6 = (struct sockaddr_in6 *)&addr;
- h = gethostbyaddr((char *)&sin6->sin6_addr,
+ sin6 = (struct sockaddr_in6*)&addr;
+ h = gethostbyaddr((char*)&sin6->sin6_addr,
sizeof(sin6->sin6_addr),
sin6->sin6_family);
break;
@@ -2127,10 +2165,10 @@ sock_s_getnameinfo(argc, argv)
rb_raise(rb_eTypeError, "sockaddr length too big");
}
memcpy(&ss, RSTRING(sa)->ptr, RSTRING(sa)->len);
- if (RSTRING(sa)->len != SA_LEN((struct sockaddr *)&ss)) {
+ if (RSTRING(sa)->len != SA_LEN((struct sockaddr*)&ss)) {
rb_raise(rb_eTypeError, "sockaddr size differs - should not happen");
}
- sap = (struct sockaddr *)&ss;
+ sap = (struct sockaddr*)&ss;
}
else if (TYPE(sa) == T_ARRAY) {
MEMZERO(&hints, struct addrinfo, 1);
diff --git a/io.c b/io.c
index 9d38811..f170c4c 100644
--- a/io.c
+++ b/io.c
@@ -12,6 +12,11 @@
**********************************************************************/
+#if defined(__VMS)
+#define _XOPEN_SOURCE
+#define _POSIX_C_SOURCE 2
+#endif
+
#include "ruby.h"
#include "rubyio.h"
#include "rubysig.h"
@@ -131,6 +136,8 @@ static VALUE lineno;
# define READ_DATA_PENDING(fp) (fp->_state._eof == 0)
#elif defined(__UCLIBC__)
# define READ_DATA_PENDING(fp) ((fp)->bufpos < (fp)->bufend)
+#elif defined(__VMS)
+# define READ_DATA_PENDING(fp) (((unsigned int)((*(fp))->_flag) & _IOEOF) == 0)
#else
/* requires systems own version of the ReadDataPending() */
extern int ReadDataPending();
@@ -1643,7 +1650,7 @@ rb_file_sysopen(fname, flags, mode)
return rb_file_sysopen_internal(io, fname, flags, mode);
}
-#if defined (NT) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__)
+#if defined (NT) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__) || defined(__VMS)
static struct pipe_list {
OpenFile *fptr;
struct pipe_list *next;
@@ -1685,7 +1692,7 @@ pipe_del_fptr(fptr)
}
}
-#if defined (NT) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__)
+#if defined (NT) || defined(DJGPP) || defined(__CYGWIN__) || defined(__human68k__) || defined(__VMS)
static void
pipe_atexit _((void))
{
@@ -1748,7 +1755,7 @@ pipe_open(pname, mode)
int modef = rb_io_mode_flags(mode);
OpenFile *fptr;
-#if defined(NT) || defined(DJGPP) || defined(__human68k__)
+#if defined(NT) || defined(DJGPP) || defined(__human68k__) || defined(__VMS)
FILE *f = popen(pname, mode);
if (!f) rb_sys_fail(pname);
diff --git a/missing/vsnprintf.c b/missing/vsnprintf.c
index 489bf58..b21261d 100644
--- a/missing/vsnprintf.c
+++ b/missing/vsnprintf.c
@@ -198,7 +198,7 @@ typedef struct __sFILE {
#endif
-#if defined(__hpux) && !defined(__GNUC__)
+#if defined(__hpux) && !defined(__GNUC__) || defined(__DECC)
#include <string.h>
#endif
diff --git a/numeric.c b/numeric.c
index 80fa105..39703fa 100644
--- a/numeric.c
+++ b/numeric.c
@@ -944,6 +944,10 @@ static VALUE
int_succ(num)
VALUE num;
{
+ if (FIXNUM_P(num)) {
+ long i = FIX2LONG(num) + 1;
+ return rb_int2inum(i);
+ }
return rb_funcall(num, '+', 1, INT2FIX(1));
}
@@ -1438,15 +1442,6 @@ fix_id2name(fix)
}
static VALUE
-fix_succ(fix)
- VALUE fix;
-{
- long i = FIX2LONG(fix) + 1;
-
- return rb_int2inum(i);
-}
-
-static VALUE
fix_size(fix)
VALUE fix;
{
@@ -1709,8 +1704,6 @@ Init_Numeric()
rb_define_method(rb_cFixnum, "to_f", fix_to_f, 0);
- rb_define_method(rb_cFixnum, "succ", fix_succ, 0);
- rb_define_method(rb_cFixnum, "next", fix_succ, 0);
rb_define_method(rb_cFixnum, "size", fix_size, 0);
rb_define_method(rb_cFixnum, "upto", fix_upto, 1);
diff --git a/process.c b/process.c
index 4763a87..a2b3d7c 100644
--- a/process.c
+++ b/process.c
@@ -713,7 +713,7 @@ static VALUE
rb_f_fork(obj)
VALUE obj;
{
-#if !defined(__human68k__) && !defined(NT) && !defined(__MACOS__) && !defined(__EMX__)
+#if !defined(__human68k__) && !defined(NT) && !defined(__MACOS__) && !defined(__EMX__) && !defined(__VMS)
int pid;
rb_secure(2);
@@ -886,6 +886,30 @@ rb_f_system(argc, argv)
last_status_set(status == -1 ? 127 : status);
return status == 0 ? Qtrue : Qfalse;
#else
+#if defined(__VMS)
+ VALUE cmd;
+ int status;
+
+ if (argc == 0) {
+ rb_last_status = Qnil;
+ rb_raise(rb_eArgError, "wrong number of arguments");
+ }
+
+ if (TYPE(argv[0]) == T_ARRAY) {
+ if (RARRAY(argv[0])->len != 2) {
+ rb_raise(rb_eArgError, "wrong first argument");
+ }
+ argv[0] = RARRAY(argv[0])->ptr[0];
+ }
+ cmd = rb_ary_join(rb_ary_new4(argc, argv), rb_str_new2(" "));
+
+ SafeStringValue(cmd);
+ status = system(RSTRING(cmd)->ptr);
+ last_status_set((status & 0xff) << 8);
+
+ if (status == 0) return Qtrue;
+ return Qfalse;
+#else
volatile VALUE prog = 0;
int pid;
int i;
@@ -938,6 +962,7 @@ rb_f_system(argc, argv)
if (NUM2INT(rb_last_status) == 0)
return Qtrue;
return Qfalse;
+#endif /* __VMS */
#endif /* __human68k__ */
#endif /* DJGPP */
#endif /* NT */
diff --git a/ruby.h b/ruby.h
index 12b3739..24d3e04 100644
--- a/ruby.h
+++ b/ruby.h
@@ -60,6 +60,11 @@ extern "C" {
#pragma alloca
#endif
+#if defined(__VMS)
+# pragma builtins
+# define alloca __alloca
+#endif
+
#if SIZEOF_LONG != SIZEOF_VOIDP
---->> ruby requires sizeof(void*) == sizeof(long) to be compiled. <<----
#endif
diff --git a/st.c b/st.c
index ebf398f..7e5ff20 100644
--- a/st.c
+++ b/st.c
@@ -4,6 +4,7 @@ static char sccsid[] = "@(#) st.c 5.1 89/12/14 Crucible";
#include "config.h"
#include <stdio.h>
+#include <stdlib.h>
#include "st.h"
#ifdef NT
diff --git a/time.c b/time.c
index 1f0cf27..4ac38bc 100644
--- a/time.c
+++ b/time.c
@@ -1382,7 +1382,7 @@ time_load(klass, str)
int i;
StringValue(str);
- buf = RSTRING(str)->ptr;
+ buf = (unsigned char *)RSTRING(str)->ptr;
if (RSTRING(str)->len != 8) {
rb_raise(rb_eTypeError, "marshaled time format differ");
}
diff --git a/vms/config.h_in b/vms/config.h_in
new file mode 100644
index 0000000..2fd3e26
--- /dev/null
+++ b/vms/config.h_in
@@ -0,0 +1,61 @@
+/* config.h for OpenVMS Alpha */
+
+/* #define HAVE_PROTOTYPES 1 */
+#define HAVE_STDARG_PROTOTYPES 1
+/* #define HAVE_ATTR_NORETURN 1 */
+/* #define inline __inline */
+#define HAVE_DIRENT_H 1
+#define HAVE_UNISTD_H 1
+#define HAVE_STDLIB_H 1
+#define HAVE_LIMITS_H 1
+
+#define HAVE_SYS_FILE_H 1
+#define HAVE_FCNTL_H 1
+/* #define HAVE_PWD_H 1 */
+#define HAVE_SYS_TIME_H 1
+#define HAVE_SYS_TIMES_H 1
+/* #define HAVE_SYS_PARAM_H 1 */
+#define HAVE_SYS_WAIT_H 1
+#define HAVE_STRING_H 1
+#define HAVE_UTIME_H 1
+#define HAVE_MEMORY_H 1
+/* #define HAVE_ST_BLKSIZE 1 */
+#define HAVE_ST_RDEV 1
+/* #define GETGROUPS_T gid_t */
+#define GETGROUPS_T int
+#define RETSIGTYPE void
+/* #define HAVE_ALLOCA 1 */
+/* #define vfork fork */
+#define HAVE_FMOD 1
+#define HAVE_RANDOM 1
+#define HAVE_WAITPID 1
+#define HAVE_GETCWD 1
+#define HAVE_TRUNCATE 1
+/* #define HAVE_CHSIZE 1 */
+#define HAVE_TIMES 1
+/* #define HAVE_UTIMES 1 */
+#define HAVE_FCNTL 1
+/* #define HAVE_SETITIMER 1 */
+/* #define HAVE_GETGROUPS 1 */
+#define HAVE_SIGPROCMASK 1
+#define HAVE_GETLOGIN 1
+#define HAVE_TELLDIR 1
+#define HAVE_SEEKDIR 1
+
+#define RSHIFT(x,y) ((x)>>y)
+#define DEFAULT_KCODE KCODE_NONE
+#define DLEXT ".EXE"
+/* #define DLEXT2 "" */
+#define RUBY_LIB "/RUBY_LIB"
+#define RUBY_SITE_LIB "/RUBY_SYSLIB"
+#define RUBY_SITE_LIB2 "/SYS$SHARE"
+#define RUBY_PLATFORM "alpha-vms"
+#define RUBY_ARCHLIB ""
+#define RUBY_SITE_ARCHLIB ""
+
+#define SIZEOF_INT 4
+#define SIZEOF_SHORT 2
+#define SIZEOF_LONG 4
+#define SIZEOF_VOIDP 4
+#define SIZEOF_FLOAT 4
+#define SIZEOF_DOUBLE 8
diff --git a/vms/vms.h b/vms/vms.h
new file mode 100644
index 0000000..d52b00b
--- /dev/null
+++ b/vms/vms.h
@@ -0,0 +1,6 @@
+extern int isinf(double);
+extern int isnan(double);
+extern int flock(int fd, int oper);
+
+extern int vsnprintf();
+extern int snprintf();