mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* string.c (rb_str_lstrip_bang): new method.
* string.c (rb_str_rstrip_bang): new method. * string.c (rb_str_associate): should consider STR_ASSOC too. * eval.c (rb_undefined): do not recurse if method_missing is undefined. * process.c (proc_waitpid): now all arguments are optional. * process.c (Init_process): waitpid is now alias to wait. * process.c (Init_process): waitpid2 is now alias to wait2. * process.c (rb_waitpid): made public. * ext/pty/pty.c (pty_getpty): avoid disturbing SIGCHLD using thread and rb_waitpid. * process.c (proc_getpgrp): now takes no argument on all platforms. * process.c (proc_setpgrp): ditto. * ext/socket/socket.c (sock_s_pack_sockaddr_in): added Socket::pack_sockaddr_in(). [new] * ext/socket/socket.c (sock_s_pack_sockaddr_un): added Socket::pack_sockaddr_un(). [new] * ext/socket/socket.c (sock_s_pack_sockaddr_in): added Socket::unpack_sockaddr_in(). [new] * ext/socket/socket.c (sock_s_pack_sockaddr_un): added Socket::unpack_sockaddr_un(). [new] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@1666 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
439b453e3a
commit
f33a61c28d
18 changed files with 336 additions and 248 deletions
49
ChangeLog
49
ChangeLog
|
@ -1,9 +1,58 @@
|
||||||
|
Mon Aug 6 03:29:03 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* string.c (rb_str_lstrip_bang): new method.
|
||||||
|
|
||||||
|
* string.c (rb_str_rstrip_bang): new method.
|
||||||
|
|
||||||
|
Sun Aug 5 19:28:39 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
|
||||||
|
|
||||||
|
* string.c (rb_str_associate): should consider STR_ASSOC too.
|
||||||
|
|
||||||
|
Sun Aug 5 07:46:18 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
|
||||||
|
|
||||||
|
* eval.c (rb_undefined): do not recurse if method_missing is
|
||||||
|
undefined.
|
||||||
|
|
||||||
|
Thu Aug 2 21:37:32 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* process.c (proc_waitpid): now all arguments are optional.
|
||||||
|
|
||||||
|
* process.c (Init_process): waitpid is now alias to wait.
|
||||||
|
|
||||||
|
* process.c (Init_process): waitpid2 is now alias to wait2.
|
||||||
|
|
||||||
|
* process.c (rb_waitpid): made public.
|
||||||
|
|
||||||
|
* ext/pty/pty.c (pty_getpty): avoid disturbing SIGCHLD using
|
||||||
|
thread and rb_waitpid.
|
||||||
|
|
||||||
|
Thu Aug 2 11:23:07 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* process.c (proc_getpgrp): now takes no argument on all
|
||||||
|
platforms.
|
||||||
|
|
||||||
|
* process.c (proc_setpgrp): ditto.
|
||||||
|
|
||||||
Thu Aug 2 01:29:42 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
|
Thu Aug 2 01:29:42 2001 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
|
||||||
|
|
||||||
* file.c (strrdirsep): removed meaningless code.
|
* file.c (strrdirsep): removed meaningless code.
|
||||||
|
|
||||||
* file.c (rb_file_s_expand_path): reverted to 1.66.
|
* file.c (rb_file_s_expand_path): reverted to 1.66.
|
||||||
|
|
||||||
|
Wed Aug 1 16:17:47 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||||
|
|
||||||
|
* ext/socket/socket.c (sock_s_pack_sockaddr_in): added
|
||||||
|
Socket::pack_sockaddr_in(). [new]
|
||||||
|
|
||||||
|
* ext/socket/socket.c (sock_s_pack_sockaddr_un): added
|
||||||
|
Socket::pack_sockaddr_un(). [new]
|
||||||
|
|
||||||
|
* ext/socket/socket.c (sock_s_pack_sockaddr_in): added
|
||||||
|
Socket::unpack_sockaddr_in(). [new]
|
||||||
|
|
||||||
|
* ext/socket/socket.c (sock_s_pack_sockaddr_un): added
|
||||||
|
Socket::unpack_sockaddr_un(). [new]
|
||||||
|
|
||||||
Wed Aug 1 15:42:16 2001 Usaku Nakamura <usa@ruby-lang.org>
|
Wed Aug 1 15:42:16 2001 Usaku Nakamura <usa@ruby-lang.org>
|
||||||
|
|
||||||
* eval.c (ruby_run): avoid VC++ warning.
|
* eval.c (ruby_run): avoid VC++ warning.
|
||||||
|
|
3
array.c
3
array.c
|
@ -735,6 +735,7 @@ rb_ary_dup(ary)
|
||||||
OBJSETUP(dup, rb_obj_type(ary), T_ARRAY);
|
OBJSETUP(dup, rb_obj_type(ary), T_ARRAY);
|
||||||
MEMCPY(RARRAY(dup)->ptr, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len);
|
MEMCPY(RARRAY(dup)->ptr, RARRAY(ary)->ptr, VALUE, RARRAY(ary)->len);
|
||||||
RARRAY(dup)->len = RARRAY(ary)->len;
|
RARRAY(dup)->len = RARRAY(ary)->len;
|
||||||
|
OBJ_INFECT(dup, ary);
|
||||||
return dup;
|
return dup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1736,7 +1737,7 @@ Init_Array()
|
||||||
rb_define_method(rb_cArray, "indexes", rb_ary_indexes, -1);
|
rb_define_method(rb_cArray, "indexes", rb_ary_indexes, -1);
|
||||||
rb_define_method(rb_cArray, "indices", rb_ary_indexes, -1);
|
rb_define_method(rb_cArray, "indices", rb_ary_indexes, -1);
|
||||||
rb_define_method(rb_cArray, "clone", rb_ary_clone, 0);
|
rb_define_method(rb_cArray, "clone", rb_ary_clone, 0);
|
||||||
rb_define_method(rb_cArray, "clone", rb_ary_dup, 0);
|
rb_define_method(rb_cArray, "dup", rb_ary_dup, 0);
|
||||||
rb_define_method(rb_cArray, "join", rb_ary_join_m, -1);
|
rb_define_method(rb_cArray, "join", rb_ary_join_m, -1);
|
||||||
rb_define_method(rb_cArray, "reverse", rb_ary_reverse_m, 0);
|
rb_define_method(rb_cArray, "reverse", rb_ary_reverse_m, 0);
|
||||||
rb_define_method(rb_cArray, "reverse!", rb_ary_reverse_bang, 0);
|
rb_define_method(rb_cArray, "reverse!", rb_ary_reverse_bang, 0);
|
||||||
|
|
|
@ -660,6 +660,10 @@ if test "$with_dln_a_out" != yes; then
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
rb_cv_dlopen=yes ;;
|
rb_cv_dlopen=yes ;;
|
||||||
|
nto-qnx*) DLDFLAGS="-L/lib -L/usr/lib -L/usr/local/lib"
|
||||||
|
LDSHARED='ld -Bshareable -x'
|
||||||
|
LDFLAGS="-L/lib -L/usr/lib -L/usr/local/lib"
|
||||||
|
rb_cv_dlopen=yes;;
|
||||||
cygwin*|mingw*) : ${LDSHARED="${DLLWRAP} --target=${target_os} --as=${AS} --dlltool-name=${DLLTOOL} --driver-name=${CC} --export-all -s"}
|
cygwin*|mingw*) : ${LDSHARED="${DLLWRAP} --target=${target_os} --as=${AS} --dlltool-name=${DLLTOOL} --driver-name=${CC} --export-all -s"}
|
||||||
rb_cv_dlopen=yes ;;
|
rb_cv_dlopen=yes ;;
|
||||||
*) LDSHARED='ld' ;;
|
*) LDSHARED='ld' ;;
|
||||||
|
|
8
doc/NEWS
8
doc/NEWS
|
@ -1,3 +1,11 @@
|
||||||
|
: Socket::pack_sockaddr_in(), Socket::unpack_sockaddr_in()
|
||||||
|
|
||||||
|
Added. Utility for direct Socket access.
|
||||||
|
|
||||||
|
: Socket::pack_sockaddr_un(), Socket::unpack_sockaddr_un()
|
||||||
|
|
||||||
|
Added. Utility for direct Socket access.
|
||||||
|
|
||||||
: String#casecmp
|
: String#casecmp
|
||||||
|
|
||||||
Added. This is a case insensitive version of String#<=>.
|
Added. This is a case insensitive version of String#<=>.
|
||||||
|
|
10
eval.c
10
eval.c
|
@ -4213,12 +4213,18 @@ rb_undefined(obj, id, argc, argv, call_status)
|
||||||
{
|
{
|
||||||
VALUE *nargv;
|
VALUE *nargv;
|
||||||
|
|
||||||
|
last_call_status = call_status;
|
||||||
|
|
||||||
|
if (id == missing) {
|
||||||
|
PUSH_FRAME();
|
||||||
|
rb_f_missing(argc, argv, obj);
|
||||||
|
POP_FRAME();
|
||||||
|
}
|
||||||
|
|
||||||
nargv = ALLOCA_N(VALUE, argc+1);
|
nargv = ALLOCA_N(VALUE, argc+1);
|
||||||
nargv[0] = ID2SYM(id);
|
nargv[0] = ID2SYM(id);
|
||||||
MEMCPY(nargv+1, argv, VALUE, argc);
|
MEMCPY(nargv+1, argv, VALUE, argc);
|
||||||
|
|
||||||
last_call_status = call_status;
|
|
||||||
|
|
||||||
return rb_funcall2(obj, missing, argc+1, nargv);
|
return rb_funcall2(obj, missing, argc+1, nargv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
134
ext/pty/pty.c
134
ext/pty/pty.c
|
@ -94,10 +94,6 @@ char SlaveName[DEVICELEN];
|
||||||
|
|
||||||
extern int errno;
|
extern int errno;
|
||||||
|
|
||||||
#define MAX_PTY 16
|
|
||||||
static int n_pty,last_pty;
|
|
||||||
static int chld_pid[MAX_PTY];
|
|
||||||
|
|
||||||
#ifndef HAVE_SETEUID
|
#ifndef HAVE_SETEUID
|
||||||
# ifdef HAVE_SETREUID
|
# ifdef HAVE_SETREUID
|
||||||
# define seteuid(e) setreuid(-1, (e))
|
# define seteuid(e) setreuid(-1, (e))
|
||||||
|
@ -116,88 +112,44 @@ struct pty_info {
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_signal_action(action)
|
pty_raise(cpid)
|
||||||
RETSIGTYPE (*action)();
|
|
||||||
{
|
|
||||||
#ifdef __hpux
|
|
||||||
struct sigvec sv;
|
|
||||||
/*
|
|
||||||
* signal SIGCHLD should be delivered on stop of the child
|
|
||||||
*/
|
|
||||||
sv.sv_handler = action;
|
|
||||||
sv.sv_mask = sigmask(SIGCHLD);
|
|
||||||
sv.sv_flags = SV_BSDSIG;
|
|
||||||
sigvector(SIGCHLD, &sv, (struct sigvec *) 0);
|
|
||||||
#else /* not HPUX */
|
|
||||||
#if defined(SA_NOCLDSTOP)
|
|
||||||
struct sigaction sa;
|
|
||||||
/*
|
|
||||||
* signal SIGCHLD should be delivered on stop of the child
|
|
||||||
* (for SVR4)
|
|
||||||
*/
|
|
||||||
sa.sa_handler = action;
|
|
||||||
sigemptyset(&sa.sa_mask);
|
|
||||||
sigaddset(&sa.sa_mask, SIGCHLD);
|
|
||||||
sa.sa_flags = 0; /* SA_NOCLDSTOP flag is removed */
|
|
||||||
sigaction(SIGCHLD, &sa, (struct sigaction *) 0);
|
|
||||||
#else
|
|
||||||
signal(SIGCHLD,action);
|
|
||||||
#endif
|
|
||||||
#endif /* not HPUX */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
reset_signal_action()
|
|
||||||
{
|
|
||||||
set_signal_action(SIG_DFL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static RETSIGTYPE
|
|
||||||
chld_changed()
|
|
||||||
{
|
|
||||||
int cpid;
|
int cpid;
|
||||||
int i,n = -1;
|
{
|
||||||
int statusp;
|
char buf[1024];
|
||||||
|
|
||||||
for (;;) {
|
snprintf(buf, sizeof(buf),
|
||||||
#ifdef HAVE_WAITPID
|
"eval %%Q{Thread.main.raise 'pty - stopped: %d'}, nil, \"%s\", %d",
|
||||||
cpid = waitpid(-1, &statusp, WUNTRACED|WNOHANG);
|
cpid, ruby_sourcefile, ruby_sourceline);
|
||||||
#else
|
rb_eval_string(buf);
|
||||||
cpid = wait3(&statusp, WUNTRACED|WNOHANG, 0);
|
}
|
||||||
#endif
|
|
||||||
|
static VALUE
|
||||||
|
pty_syswait(pid)
|
||||||
|
int pid;
|
||||||
|
{
|
||||||
|
int cpid, status;
|
||||||
|
|
||||||
|
cpid = rb_waitpid(pid, &status, WUNTRACED);
|
||||||
|
|
||||||
|
printf("PTY command (%d) finished (%d:%d)\n", pid, cpid, status);
|
||||||
if (cpid == 0 || cpid == -1)
|
if (cpid == 0 || cpid == -1)
|
||||||
return;
|
return Qnil;
|
||||||
for (i = 0; i < last_pty; i++) {
|
|
||||||
if (chld_pid[i] == cpid) {
|
|
||||||
n = i;
|
|
||||||
goto catched;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rb_raise(rb_eRuntimeError, "fork: %d", cpid);
|
|
||||||
}
|
|
||||||
catched:
|
|
||||||
|
|
||||||
#ifdef IF_STOPPED
|
#ifdef IF_STOPPED
|
||||||
if (IF_STOPPED(statusp)) { /* suspend */
|
if (IF_STOPPED(status)) { /* suspend */
|
||||||
rb_raise(rb_eRuntimeError, "Stopped: %d",cpid);
|
pty_raise(cpid);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#ifdef WIFSTOPPED
|
#ifdef WIFSTOPPED
|
||||||
if (WIFSTOPPED(statusp)) { /* suspend */
|
if (WIFSTOPPED(status)) { /* suspend */
|
||||||
rb_raise(rb_eRuntimeError, "Stopped: %d",cpid);
|
pty_raise(cpid);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
---->> Either IF_STOPPED or WIFSTOPPED is needed <<----
|
---->> Either IF_STOPPED or WIFSTOPPED is needed <<----
|
||||||
#endif /* WIFSTOPPED */
|
#endif /* WIFSTOPPED */
|
||||||
#endif /* IF_STOPPED */
|
#endif /* IF_STOPPED */
|
||||||
if (n >= 0) {
|
|
||||||
chld_pid[n] = 0;
|
return Qnil;
|
||||||
n_pty--;
|
|
||||||
if (n_pty == 0)
|
|
||||||
reset_signal_action();
|
|
||||||
}
|
|
||||||
rb_raise(rb_eRuntimeError, "Child_changed: %d",cpid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getDevice _((int*, int*));
|
static void getDevice _((int*, int*));
|
||||||
|
@ -227,7 +179,6 @@ establishShell(shellname, info)
|
||||||
getDevice(&master,&slave);
|
getDevice(&master,&slave);
|
||||||
|
|
||||||
currentPid = getpid();
|
currentPid = getpid();
|
||||||
set_signal_action(chld_changed);
|
|
||||||
if((i = vfork()) < 0) {
|
if((i = vfork()) < 0) {
|
||||||
rb_sys_fail("fork failed");
|
rb_sys_fail("fork failed");
|
||||||
}
|
}
|
||||||
|
@ -304,19 +255,6 @@ establishShell(shellname, info)
|
||||||
|
|
||||||
close(slave);
|
close(slave);
|
||||||
|
|
||||||
if (n_pty == last_pty) {
|
|
||||||
chld_pid[n_pty] = i;
|
|
||||||
n_pty++;
|
|
||||||
last_pty++;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (j = 0; j < last_pty; j++) {
|
|
||||||
if (chld_pid[j] == 0) {
|
|
||||||
chld_pid[j] = i;
|
|
||||||
n_pty++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
info->child_pid = i;
|
info->child_pid = i;
|
||||||
info->fd = master;
|
info->fd = master;
|
||||||
}
|
}
|
||||||
|
@ -426,16 +364,12 @@ static VALUE
|
||||||
pty_getpty(self, shell)
|
pty_getpty(self, shell)
|
||||||
VALUE self, shell;
|
VALUE self, shell;
|
||||||
{
|
{
|
||||||
VALUE res;
|
VALUE res, th;
|
||||||
struct pty_info info;
|
struct pty_info info;
|
||||||
OpenFile *wfptr,*rfptr;
|
OpenFile *wfptr,*rfptr;
|
||||||
NEWOBJ(rport, struct RFile);
|
NEWOBJ(rport, struct RFile);
|
||||||
NEWOBJ(wport, struct RFile);
|
NEWOBJ(wport, struct RFile);
|
||||||
|
|
||||||
if (n_pty == MAX_PTY+1) {
|
|
||||||
rb_raise(rb_eRuntimeError, "Too many ptys are open");
|
|
||||||
}
|
|
||||||
|
|
||||||
OBJSETUP(rport, rb_cFile, T_FILE);
|
OBJSETUP(rport, rb_cFile, T_FILE);
|
||||||
MakeOpenFile(rport, rfptr);
|
MakeOpenFile(rport, rfptr);
|
||||||
|
|
||||||
|
@ -457,32 +391,34 @@ pty_getpty(self, shell)
|
||||||
rb_ary_store(res,1,(VALUE)wport);
|
rb_ary_store(res,1,(VALUE)wport);
|
||||||
rb_ary_store(res,2,INT2FIX(info.child_pid));
|
rb_ary_store(res,2,INT2FIX(info.child_pid));
|
||||||
|
|
||||||
|
printf("start watching PTY command (%d)\n", info.child_pid);
|
||||||
|
th = rb_thread_create(pty_syswait, (void*)info.child_pid);
|
||||||
if (rb_block_given_p()) {
|
if (rb_block_given_p()) {
|
||||||
rb_yield((VALUE)res);
|
res = rb_yield((VALUE)res);
|
||||||
reset_signal_action();
|
rb_funcall(th, rb_intern("kill"), 0, 0);
|
||||||
return Qnil;
|
return res;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return (VALUE)res;
|
return (VALUE)res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ruby function: protect_signal */
|
/* ruby function: protect_signal - obsolete */
|
||||||
static VALUE
|
static VALUE
|
||||||
pty_protect(self)
|
pty_protect(self)
|
||||||
VALUE self;
|
VALUE self;
|
||||||
{
|
{
|
||||||
reset_signal_action();
|
rb_warn("PTY::protect_signal is no longer needed");
|
||||||
rb_yield(Qnil);
|
rb_yield(Qnil);
|
||||||
set_signal_action(chld_changed);
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ruby function: reset_signal - obsolete */
|
||||||
static VALUE
|
static VALUE
|
||||||
pty_reset_signal(self)
|
pty_reset_signal(self)
|
||||||
VALUE self;
|
VALUE self;
|
||||||
{
|
{
|
||||||
reset_signal_action();
|
rb_warn("PTY::reset_signal is no longer needed");
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1562,7 +1562,7 @@ static VALUE
|
||||||
sock_s_socketpair(class, domain, type, protocol)
|
sock_s_socketpair(class, domain, type, protocol)
|
||||||
VALUE class, domain, type, protocol;
|
VALUE class, domain, type, protocol;
|
||||||
{
|
{
|
||||||
#if !defined(NT) && !defined(__BEOS__) && !defined(__EMX__)
|
#if !defined(NT) && !defined(__BEOS__) && !defined(__EMX__) && !defined(__QNXNTO__)
|
||||||
int d, t, sp[2];
|
int d, t, sp[2];
|
||||||
|
|
||||||
setup_domain_and_type(domain, &d, type, &t);
|
setup_domain_and_type(domain, &d, type, &t);
|
||||||
|
@ -1806,11 +1806,20 @@ sock_s_gethostbyaddr(argc, argv)
|
||||||
{
|
{
|
||||||
VALUE addr, type;
|
VALUE addr, type;
|
||||||
struct hostent *h;
|
struct hostent *h;
|
||||||
|
struct sockaddr *sa;
|
||||||
|
int t = AF_INET;
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "11", &addr, &type);
|
rb_scan_args(argc, argv, "11", &addr, &type);
|
||||||
StringValue(addr);
|
sa = (struct sockaddr*)StringValuePtr(addr);
|
||||||
h = gethostbyaddr(RSTRING(addr)->ptr, RSTRING(addr)->len,
|
if (!NIL_P(type)) {
|
||||||
NIL_P(type)?AF_INET:NUM2INT(type));
|
t = NUM2INT(type);
|
||||||
|
}
|
||||||
|
#ifdef INET6
|
||||||
|
else if (RSTRING(addr)->len == 16) {
|
||||||
|
t = AF_INET6;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
h = gethostbyaddr(RSTRING(addr)->ptr, RSTRING(addr)->len, t);
|
||||||
|
|
||||||
return mkhostent(h);
|
return mkhostent(h);
|
||||||
}
|
}
|
||||||
|
@ -2055,6 +2064,57 @@ sock_s_getnameinfo(argc, argv)
|
||||||
rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error));
|
rb_raise(rb_eSocket, "getnameinfo: %s", gai_strerror(error));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
sock_s_pack_sockaddr_in(self, port, host)
|
||||||
|
VALUE self, port, host;
|
||||||
|
{
|
||||||
|
struct addrinfo *res = ip_addrsetup(host, port);
|
||||||
|
VALUE addr = rb_str_new((char*)res->ai_addr, res->ai_addrlen);
|
||||||
|
|
||||||
|
freeaddrinfo(res);
|
||||||
|
OBJ_INFECT(addr, port);
|
||||||
|
OBJ_INFECT(addr, host);
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
sock_s_pack_sockaddr_un(self, path)
|
||||||
|
VALUE self, path;
|
||||||
|
{
|
||||||
|
struct sockaddr_un sockaddr;
|
||||||
|
VALUE addr;
|
||||||
|
|
||||||
|
MEMZERO(&sockaddr, struct sockaddr_un, 1);
|
||||||
|
sockaddr.sun_family = AF_UNIX;
|
||||||
|
strncpy(sockaddr.sun_path, StringValuePtr(path), sizeof(sockaddr.sun_path)-1);
|
||||||
|
addr = rb_str_new((char*)&sockaddr, sizeof(sockaddr));
|
||||||
|
OBJ_INFECT(addr, path);
|
||||||
|
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
sock_s_unpack_sockaddr_in(self, addr)
|
||||||
|
VALUE self, addr;
|
||||||
|
{
|
||||||
|
struct sockaddr_in * sockaddr;
|
||||||
|
|
||||||
|
sockaddr = (struct sockaddr_in*)StringValuePtr(addr);
|
||||||
|
return rb_assoc_new(INT2NUM(ntohs(sockaddr->sin_port)), mkipaddr(sockaddr));
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
sock_s_unpack_sockaddr_un(self, addr)
|
||||||
|
VALUE self, addr;
|
||||||
|
{
|
||||||
|
struct sockaddr_un * sockaddr;
|
||||||
|
|
||||||
|
sockaddr = (struct sockaddr_un*)StringValuePtr(addr);
|
||||||
|
/* xxx: should I check against sun_path size? */
|
||||||
|
return rb_tainted_str_new2(sockaddr->sun_path);
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE mConst;
|
static VALUE mConst;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2164,6 +2224,12 @@ Init_socket()
|
||||||
rb_define_singleton_method(rb_cSocket, "getservbyname", sock_s_getservbyaname, -1);
|
rb_define_singleton_method(rb_cSocket, "getservbyname", sock_s_getservbyaname, -1);
|
||||||
rb_define_singleton_method(rb_cSocket, "getaddrinfo", sock_s_getaddrinfo, -1);
|
rb_define_singleton_method(rb_cSocket, "getaddrinfo", sock_s_getaddrinfo, -1);
|
||||||
rb_define_singleton_method(rb_cSocket, "getnameinfo", sock_s_getnameinfo, -1);
|
rb_define_singleton_method(rb_cSocket, "getnameinfo", sock_s_getnameinfo, -1);
|
||||||
|
rb_define_singleton_method(rb_cSocket, "sockaddr_in", sock_s_pack_sockaddr_in, 2);
|
||||||
|
rb_define_singleton_method(rb_cSocket, "sockaddr_un", sock_s_pack_sockaddr_un, 1);
|
||||||
|
rb_define_singleton_method(rb_cSocket, "pack_sockaddr_in", sock_s_pack_sockaddr_in, 2);
|
||||||
|
rb_define_singleton_method(rb_cSocket, "pack_sockaddr_un", sock_s_pack_sockaddr_un, 1);
|
||||||
|
rb_define_singleton_method(rb_cSocket, "unpack_sockaddr_in", sock_s_unpack_sockaddr_in, 1);
|
||||||
|
rb_define_singleton_method(rb_cSocket, "unpack_sockaddr_un", sock_s_unpack_sockaddr_un, 1);
|
||||||
|
|
||||||
/* constants */
|
/* constants */
|
||||||
mConst = rb_define_module_under(rb_cSocket, "Constants");
|
mConst = rb_define_module_under(rb_cSocket, "Constants");
|
||||||
|
|
1
intern.h
1
intern.h
|
@ -275,6 +275,7 @@ void rb_lastline_set _((VALUE));
|
||||||
VALUE rb_sym_all_symbols _((void));
|
VALUE rb_sym_all_symbols _((void));
|
||||||
/* process.c */
|
/* process.c */
|
||||||
int rb_proc_exec _((const char*));
|
int rb_proc_exec _((const char*));
|
||||||
|
int rb_waitpid _((int,int*,int));
|
||||||
void rb_syswait _((int));
|
void rb_syswait _((int));
|
||||||
VALUE rb_proc_times _((VALUE));
|
VALUE rb_proc_times _((VALUE));
|
||||||
/* range.c */
|
/* range.c */
|
||||||
|
|
4
io.c
4
io.c
|
@ -31,6 +31,10 @@
|
||||||
# define USE_SETVBUF
|
# define USE_SETVBUF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef __QNXNTO__
|
||||||
|
#include "unix.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#if !defined(DJGPP) && !defined(NT) && !defined(__human68k__)
|
#if !defined(DJGPP) && !defined(NT) && !defined(__human68k__)
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
|
|
|
@ -12,7 +12,7 @@ class CGI
|
||||||
|
|
||||||
def Session::callback(dbman)
|
def Session::callback(dbman)
|
||||||
lambda{
|
lambda{
|
||||||
dbman.close
|
dbman[0].close unless dbman.empty?
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -63,7 +63,8 @@ class CGI
|
||||||
end)
|
end)
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
ObjectSpace::define_finalizer(self, Session::callback(@dbman))
|
@dbprot = [@dbman]
|
||||||
|
ObjectSpace::define_finalizer(self, Session::callback(@dbprot))
|
||||||
end
|
end
|
||||||
|
|
||||||
def [](key)
|
def [](key)
|
||||||
|
@ -89,10 +90,12 @@ class CGI
|
||||||
|
|
||||||
def close
|
def close
|
||||||
@dbman.close
|
@dbman.close
|
||||||
|
@dbprot.clear
|
||||||
end
|
end
|
||||||
|
|
||||||
def delete
|
def delete
|
||||||
@dbman.delete
|
@dbman.delete
|
||||||
|
@dbprot.clear
|
||||||
end
|
end
|
||||||
|
|
||||||
class FileStore
|
class FileStore
|
||||||
|
|
|
@ -707,6 +707,9 @@ An end of a defun is found by moving forward from the beginning of one."
|
||||||
|
|
||||||
(defvar ruby-font-lock-keywords
|
(defvar ruby-font-lock-keywords
|
||||||
(list
|
(list
|
||||||
|
;; trick
|
||||||
|
'("\\s-+" 0 nil t)
|
||||||
|
'("\\S-+" 0 nil t)
|
||||||
(cons (concat
|
(cons (concat
|
||||||
"\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\("
|
"\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\("
|
||||||
(mapconcat
|
(mapconcat
|
||||||
|
@ -750,16 +753,14 @@ An end of a defun is found by moving forward from the beginning of one."
|
||||||
"\\|")
|
"\\|")
|
||||||
"\\)\\>\\([^_]\\|$\\)")
|
"\\)\\>\\([^_]\\|$\\)")
|
||||||
2)
|
2)
|
||||||
;; regexps
|
|
||||||
'("/\\(\\(\\\\/\\|[^/\n]\\)*\\)/\\([iop]*\\)"
|
|
||||||
(1 font-lock-string-face)
|
|
||||||
(3 font-lock-constant-face))
|
|
||||||
;; variables
|
;; variables
|
||||||
'("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(nil\\|self\\|true\\|false\\)\\b\\([^_]\\|$\\)"
|
'("\\(^\\|[^_:.@$]\\|\\.\\.\\)\\b\\(nil\\|self\\|true\\|false\\)\\b\\([^_]\\|$\\)"
|
||||||
2 font-lock-variable-name-face)
|
2 font-lock-variable-name-face)
|
||||||
;; variables
|
;; variables
|
||||||
'("[$@].\\(\\w\\|_\\)*"
|
'("\\(\\$\\(\\W\\|[0-9]\\)\\)\\W"
|
||||||
0 font-lock-variable-name-face)
|
1 font-lock-variable-name-face t)
|
||||||
|
'("\\($\\|@\\|@@\\)\\(\\w\\(\\w\\|_\\)*\\|#{\\)"
|
||||||
|
0 font-lock-variable-name-face t)
|
||||||
;; embedded document
|
;; embedded document
|
||||||
'(ruby-font-lock-docs
|
'(ruby-font-lock-docs
|
||||||
0 font-lock-comment-face t)
|
0 font-lock-comment-face t)
|
||||||
|
@ -772,8 +773,36 @@ An end of a defun is found by moving forward from the beginning of one."
|
||||||
'("^\\s *def\\s +\\([^( ]+\\)"
|
'("^\\s *def\\s +\\([^( ]+\\)"
|
||||||
1 font-lock-function-name-face)
|
1 font-lock-function-name-face)
|
||||||
;; symbols
|
;; symbols
|
||||||
'("\\(^\\|[^:]\\)\\(:\\([-+/%&|^~`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|\\[\\]\\|\\(\\w\\|_\\)+\\([!?=]\\|\\b\\)\\)\\)"
|
'("\\(^\\|[^:]\\)\\(:\\([-+/%&|^~`]\\|\\*\\*?\\|<\\(<\\|=>?\\)?\\|>[>=]?\\|===?\\|=~\\|\\[\\]\\|\\(\\w\\|_\\)+\\([!?=]\\|\\b\\)\\|#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}\\)\\)"
|
||||||
2 font-lock-reference-face))
|
2 font-lock-reference-face)
|
||||||
|
;; strings
|
||||||
|
;; %Q! !
|
||||||
|
'("[[\\s <+(,]%[rqQ]?\\(\\([^a-zA-Z0-9 \n]\\)[^\\2\n\\\\]*\\(\\\\.[^\\2\n\\\\]*\\)*\\2\\)"
|
||||||
|
1 font-lock-string-face t)
|
||||||
|
;; '...'
|
||||||
|
'("[[\\s <+(,]\\('[^'\n\\\\]*\\(\\\\.[^'\n\\\\]*\\)*'\\)"
|
||||||
|
1 font-lock-string-face t)
|
||||||
|
;; "..."
|
||||||
|
'("[[\\s <+(,]\\(\"[^\"\n\\\\]*\\(\\\\.[^\"\n\\\\]*\\)*\"\\)"
|
||||||
|
1 font-lock-string-face t)
|
||||||
|
;; `...`
|
||||||
|
'("[\\s <+(,]\\(`[^`\n\\\\]*\\(\\\\.[^`\n\\\\]*\\)*`\\)"
|
||||||
|
1 font-lock-warning-face t)
|
||||||
|
;; %x!...!
|
||||||
|
'("[\\s <+(,]%x\\(\\([^a-zA-Z0-9 \n]\\)[^\\2\n\\]*\\(\\\\.[^\\2\n\\]*\\)*\\2\\)"
|
||||||
|
1 font-lock-warning-face t)
|
||||||
|
;; regexps
|
||||||
|
'("\\(^\\|[=(,~?:]\\|\\(^\\|\\s \\)\\(if\\|elsif\\|unless\\|while\\|until\\|when\\|and\\|or\\|&&\\|||\\)\\|\\.g?sub!?\\)\\s *\\(/[^/\n\\\\]*\\(\\\\.[^/\n\\\\]*\\)*/\\([iop]*\\)\\)"
|
||||||
|
(4 font-lock-string-face t)
|
||||||
|
(6 font-lock-constant-face t))
|
||||||
|
'("\\(/[^/\n\\\\]*\\(\\\\.[^/\n\\\\]*\\)*/\\)\\s *[=!][=~]"
|
||||||
|
1 font-lock-string-face t)
|
||||||
|
;; expression expansion
|
||||||
|
'("#{[^}\n\\\\]*\\(\\\\.[^}\n\\\\]*\\)*}"
|
||||||
|
0 font-lock-variable-name-face t)
|
||||||
|
;; comment
|
||||||
|
'("^\\s *\\([^#\n'\"%/]\\|'[^'\n\\]*\\(\\\\.[^'\n\\]*\\)*'\\|\"[^\"\n\\]*\\(\\\\.[^\"\n\\]*\\)*\"\\|%[rqQx]?\\([^a-zA-Z0-9 \n]\\)[^\\4\n\\]*\\(\\\\.[^\\4\n\\]*\\)*\\4\\|/[^/\n\\]*\\(\\\\.[^/\n\\]\\)*/\\|#{[^}\\\\]*\\(\\\\.[^}\\\\]*\\)*}\\)*\\(#\\([^{\n].*\\|$\\)\\)"
|
||||||
|
8 font-lock-comment-face t))
|
||||||
"*Additional expressions to highlight in ruby mode."))
|
"*Additional expressions to highlight in ruby mode."))
|
||||||
|
|
||||||
((featurep 'hilit19)
|
((featurep 'hilit19)
|
||||||
|
|
17
numeric.c
17
numeric.c
|
@ -17,8 +17,7 @@
|
||||||
#include <floatingpoint.h>
|
#include <floatingpoint.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static ID coerce;
|
static ID id_coerce, id_to_i, id_div;
|
||||||
static ID to_i;
|
|
||||||
|
|
||||||
VALUE rb_cNumeric;
|
VALUE rb_cNumeric;
|
||||||
VALUE rb_cFloat;
|
VALUE rb_cFloat;
|
||||||
|
@ -47,7 +46,7 @@ static VALUE
|
||||||
coerce_body(x)
|
coerce_body(x)
|
||||||
VALUE *x;
|
VALUE *x;
|
||||||
{
|
{
|
||||||
return rb_funcall(x[1], coerce, 1, x[0]);
|
return rb_funcall(x[1], id_coerce, 1, x[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
@ -119,7 +118,7 @@ static VALUE
|
||||||
num_div(x, y)
|
num_div(x, y)
|
||||||
VALUE x, y;
|
VALUE x, y;
|
||||||
{
|
{
|
||||||
return rb_funcall(x, '/', 1, y);
|
return rb_funcall(x, id_div, 1, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
@ -128,7 +127,7 @@ num_divmod(x, y)
|
||||||
{
|
{
|
||||||
VALUE div, mod;
|
VALUE div, mod;
|
||||||
|
|
||||||
div = rb_funcall(x, '/', 1, y);
|
div = rb_funcall(x, div, 1, y);
|
||||||
if (TYPE(div) == T_FLOAT) {
|
if (TYPE(div) == T_FLOAT) {
|
||||||
double d = floor(RFLOAT(div)->value);
|
double d = floor(RFLOAT(div)->value);
|
||||||
|
|
||||||
|
@ -1535,8 +1534,9 @@ Init_Numeric()
|
||||||
/* allow divide by zero -- Inf */
|
/* allow divide by zero -- Inf */
|
||||||
fpsetmask(fpgetmask() & ~(FP_X_DZ|FP_X_INV|FP_X_OFL));
|
fpsetmask(fpgetmask() & ~(FP_X_DZ|FP_X_INV|FP_X_OFL));
|
||||||
#endif
|
#endif
|
||||||
coerce = rb_intern("coerce");
|
id_coerce = rb_intern("coerce");
|
||||||
to_i = rb_intern("to_i");
|
id_to_i = rb_intern("to_i");
|
||||||
|
id_div = rb_intern("div");
|
||||||
|
|
||||||
rb_eZeroDivError = rb_define_class("ZeroDivisionError", rb_eStandardError);
|
rb_eZeroDivError = rb_define_class("ZeroDivisionError", rb_eStandardError);
|
||||||
rb_eFloatDomainError = rb_define_class("FloatDomainError", rb_eRangeError);
|
rb_eFloatDomainError = rb_define_class("FloatDomainError", rb_eRangeError);
|
||||||
|
@ -1550,7 +1550,7 @@ Init_Numeric()
|
||||||
rb_define_method(rb_cNumeric, "-@", num_uminus, 0);
|
rb_define_method(rb_cNumeric, "-@", num_uminus, 0);
|
||||||
rb_define_method(rb_cNumeric, "===", num_equal, 1);
|
rb_define_method(rb_cNumeric, "===", num_equal, 1);
|
||||||
rb_define_method(rb_cNumeric, "eql?", num_eql, 1);
|
rb_define_method(rb_cNumeric, "eql?", num_eql, 1);
|
||||||
rb_define_method(rb_cNumeric, "div", num_div, 1);
|
rb_define_method(rb_cNumeric, "/", num_div, 1);
|
||||||
rb_define_method(rb_cNumeric, "divmod", num_divmod, 1);
|
rb_define_method(rb_cNumeric, "divmod", num_divmod, 1);
|
||||||
rb_define_method(rb_cNumeric, "modulo", num_modulo, 1);
|
rb_define_method(rb_cNumeric, "modulo", num_modulo, 1);
|
||||||
rb_define_method(rb_cNumeric, "remainder", num_remainder, 1);
|
rb_define_method(rb_cNumeric, "remainder", num_remainder, 1);
|
||||||
|
@ -1675,3 +1675,4 @@ Init_Numeric()
|
||||||
rb_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0);
|
rb_define_method(rb_cFloat, "infinite?", flo_is_infinite_p, 0);
|
||||||
rb_define_method(rb_cFloat, "finite?", flo_is_finite_p, 0);
|
rb_define_method(rb_cFloat, "finite?", flo_is_finite_p, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
16
pack.c
16
pack.c
|
@ -331,7 +331,7 @@ pack_pack(ary, fmt)
|
||||||
static char *nul10 = "\0\0\0\0\0\0\0\0\0\0";
|
static char *nul10 = "\0\0\0\0\0\0\0\0\0\0";
|
||||||
static char *spc10 = " ";
|
static char *spc10 = " ";
|
||||||
char *p, *pend;
|
char *p, *pend;
|
||||||
VALUE res, from, associates = 0;
|
VALUE res, from;
|
||||||
char type;
|
char type;
|
||||||
int items, len, idx;
|
int items, len, idx;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
@ -872,10 +872,7 @@ pack_pack(ary, fmt)
|
||||||
StringValue(from);
|
StringValue(from);
|
||||||
t = RSTRING(from)->ptr;
|
t = RSTRING(from)->ptr;
|
||||||
}
|
}
|
||||||
if (!associates) {
|
rb_str_associate(res, from);
|
||||||
associates = rb_ary_new();
|
|
||||||
}
|
|
||||||
rb_ary_push(associates, from);
|
|
||||||
rb_str_buf_cat(res, (char*)&t, sizeof(char*));
|
rb_str_buf_cat(res, (char*)&t, sizeof(char*));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -930,10 +927,6 @@ pack_pack(ary, fmt)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (associates) {
|
|
||||||
rb_str_associate(res, associates);
|
|
||||||
}
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1677,13 +1670,12 @@ pack_unpack(str, fmt)
|
||||||
s += sizeof(char *);
|
s += sizeof(char *);
|
||||||
|
|
||||||
if (t) {
|
if (t) {
|
||||||
VALUE a, tmp;
|
VALUE a, *p, *pend;
|
||||||
VALUE *p, *pend;
|
|
||||||
|
|
||||||
p = RARRAY(a)->ptr;
|
|
||||||
if (!(a = rb_str_associated(str))) {
|
if (!(a = rb_str_associated(str))) {
|
||||||
rb_raise(rb_eArgError, "no associated pointer");
|
rb_raise(rb_eArgError, "no associated pointer");
|
||||||
}
|
}
|
||||||
|
p = RARRAY(a)->ptr;
|
||||||
pend = p + RARRAY(a)->len;
|
pend = p + RARRAY(a)->len;
|
||||||
while (p < pend) {
|
while (p < pend) {
|
||||||
if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) {
|
if (TYPE(*p) == T_STRING && RSTRING(*p)->ptr == t) {
|
||||||
|
|
3
parse.y
3
parse.y
|
@ -4597,10 +4597,11 @@ cond0(node, logop)
|
||||||
enum node_type type = nd_type(node);
|
enum node_type type = nd_type(node);
|
||||||
|
|
||||||
assign_in_cond(node);
|
assign_in_cond(node);
|
||||||
|
if (logop) return node;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case NODE_DSTR:
|
case NODE_DSTR:
|
||||||
case NODE_STR:
|
case NODE_STR:
|
||||||
if (logop) break;
|
|
||||||
rb_warn("string literal in condition");
|
rb_warn("string literal in condition");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
126
process.c
126
process.c
|
@ -227,11 +227,11 @@ pst_wcoredump(st)
|
||||||
static st_table *pid_tbl;
|
static st_table *pid_tbl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int
|
int
|
||||||
rb_waitpid(pid, flags, st)
|
rb_waitpid(pid, st, flags)
|
||||||
int pid;
|
int pid;
|
||||||
int flags;
|
|
||||||
int *st;
|
int *st;
|
||||||
|
int flags;
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
#ifndef NO_WAITPID
|
#ifndef NO_WAITPID
|
||||||
|
@ -326,50 +326,7 @@ waitall_each(key, value, data)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
proc_wait()
|
proc_wait(argc, argv)
|
||||||
{
|
|
||||||
int pid, status;
|
|
||||||
#ifdef NO_WAITPID
|
|
||||||
struct wait_data data;
|
|
||||||
|
|
||||||
if (pid_tbl) {
|
|
||||||
data.status = -1;
|
|
||||||
st_foreach(pid_tbl, wait_each, &data);
|
|
||||||
if (data.status != -1) {
|
|
||||||
last_status_set(data.status);
|
|
||||||
return INT2FIX(data.pid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
TRAP_BEG;
|
|
||||||
pid = wait(&status);
|
|
||||||
TRAP_END;
|
|
||||||
if (pid >= 0) break;
|
|
||||||
if (errno == EINTR) {
|
|
||||||
rb_thread_schedule();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
rb_sys_fail(0);
|
|
||||||
}
|
|
||||||
last_status_set(status);
|
|
||||||
#else
|
|
||||||
if ((pid = rb_waitpid(-1, 0, &status)) < 0)
|
|
||||||
rb_sys_fail(0);
|
|
||||||
#endif
|
|
||||||
return INT2FIX(pid);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
proc_wait2()
|
|
||||||
{
|
|
||||||
VALUE pid = proc_wait();
|
|
||||||
|
|
||||||
return rb_assoc_new(pid, rb_last_status);
|
|
||||||
}
|
|
||||||
|
|
||||||
static VALUE
|
|
||||||
proc_waitpid(argc, argv)
|
|
||||||
int argc;
|
int argc;
|
||||||
VALUE *argv;
|
VALUE *argv;
|
||||||
{
|
{
|
||||||
|
@ -377,12 +334,17 @@ proc_waitpid(argc, argv)
|
||||||
int pid, flags, status;
|
int pid, flags, status;
|
||||||
|
|
||||||
flags = 0;
|
flags = 0;
|
||||||
rb_scan_args(argc, argv, "11", &vpid, &vflags);
|
rb_scan_args(argc, argv, "02", &vpid, &vflags);
|
||||||
|
if (argc == 0) {
|
||||||
|
pid = -1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pid = NUM2INT(vpid);
|
||||||
if (argc == 2 && !NIL_P(vflags)) {
|
if (argc == 2 && !NIL_P(vflags)) {
|
||||||
flags = NUM2UINT(vflags);
|
flags = NUM2UINT(vflags);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if ((pid = rb_waitpid(NUM2INT(vpid), flags, &status)) < 0)
|
if ((pid = rb_waitpid(pid, &status, flags)) < 0)
|
||||||
rb_sys_fail(0);
|
rb_sys_fail(0);
|
||||||
if (pid == 0) {
|
if (pid == 0) {
|
||||||
rb_last_status = Qnil;
|
rb_last_status = Qnil;
|
||||||
|
@ -392,11 +354,11 @@ proc_waitpid(argc, argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
proc_waitpid2(argc, argv)
|
proc_wait2(argc, argv)
|
||||||
int argc;
|
int argc;
|
||||||
VALUE *argv;
|
VALUE *argv;
|
||||||
{
|
{
|
||||||
VALUE pid = proc_waitpid(argc, argv);
|
VALUE pid = proc_wait(argc, argv);
|
||||||
if (NIL_P(pid)) return Qnil;
|
if (NIL_P(pid)) return Qnil;
|
||||||
return rb_assoc_new(pid, rb_last_status);
|
return rb_assoc_new(pid, rb_last_status);
|
||||||
}
|
}
|
||||||
|
@ -430,7 +392,7 @@ proc_waitall()
|
||||||
#else
|
#else
|
||||||
rb_last_status = Qnil;
|
rb_last_status = Qnil;
|
||||||
for (pid = -1;;) {
|
for (pid = -1;;) {
|
||||||
pid = rb_waitpid(-1, 0, &status);
|
pid = rb_waitpid(-1, &status, 0);
|
||||||
if (pid == -1) {
|
if (pid == -1) {
|
||||||
if (errno == ECHILD)
|
if (errno == ECHILD)
|
||||||
break;
|
break;
|
||||||
|
@ -816,7 +778,7 @@ rb_syswait(pid)
|
||||||
ifunc = signal(SIGINT, SIG_IGN);
|
ifunc = signal(SIGINT, SIG_IGN);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
i = rb_waitpid(pid, 0, &status);
|
i = rb_waitpid(pid, &status, 0);
|
||||||
} while (i == -1 && errno == EINTR);
|
} while (i == -1 && errno == EINTR);
|
||||||
|
|
||||||
#ifdef SIGHUP
|
#ifdef SIGHUP
|
||||||
|
@ -994,53 +956,37 @@ rb_f_sleep(argc, argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
proc_getpgrp(argc, argv)
|
proc_getpgrp()
|
||||||
int argc;
|
|
||||||
VALUE *argv;
|
|
||||||
{
|
{
|
||||||
#ifdef HAVE_GETPGRP
|
|
||||||
int pgrp;
|
int pgrp;
|
||||||
#ifndef GETPGRP_VOID
|
|
||||||
VALUE vpid;
|
|
||||||
int pid;
|
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "01", &vpid);
|
#if defined(HAVE_GETPGRP) && defined(GETPGRP_VOID)
|
||||||
pid = NIL_P(vpid)?0:NUM2INT(vpid);
|
|
||||||
pgrp = getpgrp(pid);
|
|
||||||
#else
|
|
||||||
rb_scan_args(argc, argv, "0");
|
|
||||||
pgrp = getpgrp();
|
pgrp = getpgrp();
|
||||||
#endif
|
if (pgrp < 0) rb_sys_fail(0);
|
||||||
|
return INT2FIX(pgrp);
|
||||||
|
#else
|
||||||
|
# ifdef HAVE_GETPGID
|
||||||
|
pgrp = getpgid(0);
|
||||||
if (pgrp < 0) rb_sys_fail(0);
|
if (pgrp < 0) rb_sys_fail(0);
|
||||||
return INT2FIX(pgrp);
|
return INT2FIX(pgrp);
|
||||||
# else
|
# else
|
||||||
rb_notimplement();
|
rb_notimplement();
|
||||||
# endif
|
# endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
proc_setpgrp(argc, argv)
|
proc_setpgrp()
|
||||||
int argc;
|
|
||||||
VALUE *argv;
|
|
||||||
{
|
{
|
||||||
#ifdef HAVE_SETPGRP
|
#if defined(HAVE_SETPGRP) && defined(SETPGRP_VOID)
|
||||||
#ifndef SETPGRP_VOID
|
|
||||||
VALUE pid, pgrp;
|
|
||||||
int ipid, ipgrp;
|
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "02", &pid, &pgrp);
|
|
||||||
|
|
||||||
ipid = NIL_P(pid)?0:NUM2INT(pid);
|
|
||||||
ipgrp = NIL_P(pgrp)?0:NUM2INT(pgrp);
|
|
||||||
if (setpgrp(ipid, ipgrp) < 0) rb_sys_fail(0);
|
|
||||||
#else
|
|
||||||
rb_scan_args(argc, argv, "0");
|
|
||||||
if (setpgrp() < 0) rb_sys_fail(0);
|
if (setpgrp() < 0) rb_sys_fail(0);
|
||||||
#endif
|
#else
|
||||||
return INT2FIX(0);
|
# ifdef HAVE_SETPGID
|
||||||
|
if (setpgid(0, 0) < 0) rb_sys_fail(0);
|
||||||
# else
|
# else
|
||||||
rb_notimplement();
|
rb_notimplement();
|
||||||
# endif
|
# endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
@ -1328,11 +1274,11 @@ Init_process()
|
||||||
rb_define_singleton_method(rb_mProcess, "exit!", rb_f_exit_bang, -1);
|
rb_define_singleton_method(rb_mProcess, "exit!", rb_f_exit_bang, -1);
|
||||||
rb_define_module_function(rb_mProcess, "kill", rb_f_kill, -1);
|
rb_define_module_function(rb_mProcess, "kill", rb_f_kill, -1);
|
||||||
#ifndef NT
|
#ifndef NT
|
||||||
rb_define_module_function(rb_mProcess, "wait", proc_wait, 0);
|
rb_define_module_function(rb_mProcess, "wait", proc_wait, -1);
|
||||||
rb_define_module_function(rb_mProcess, "wait2", proc_wait2, 0);
|
rb_define_module_function(rb_mProcess, "wait2", proc_wait2, -1);
|
||||||
|
rb_define_module_function(rb_mProcess, "waitpid", proc_wait, -1);
|
||||||
|
rb_define_module_function(rb_mProcess, "waitpid2", proc_wait2, -1);
|
||||||
rb_define_module_function(rb_mProcess, "waitall", proc_waitall, 0);
|
rb_define_module_function(rb_mProcess, "waitall", proc_waitall, 0);
|
||||||
rb_define_module_function(rb_mProcess, "waitpid", proc_waitpid, -1);
|
|
||||||
rb_define_module_function(rb_mProcess, "waitpid2", proc_waitpid2, -1);
|
|
||||||
|
|
||||||
rb_cProcStatus = rb_define_class_under(rb_mProcess, "Status", rb_cObject);
|
rb_cProcStatus = rb_define_class_under(rb_mProcess, "Status", rb_cObject);
|
||||||
rb_undef_method(CLASS_OF(rb_cProcStatus), "new");
|
rb_undef_method(CLASS_OF(rb_cProcStatus), "new");
|
||||||
|
@ -1357,8 +1303,8 @@ Init_process()
|
||||||
rb_define_module_function(rb_mProcess, "ppid", get_ppid, 0);
|
rb_define_module_function(rb_mProcess, "ppid", get_ppid, 0);
|
||||||
#endif /* ifndef NT */
|
#endif /* ifndef NT */
|
||||||
|
|
||||||
rb_define_module_function(rb_mProcess, "getpgrp", proc_getpgrp, -1);
|
rb_define_module_function(rb_mProcess, "getpgrp", proc_getpgrp, 0);
|
||||||
rb_define_module_function(rb_mProcess, "setpgrp", proc_setpgrp, -1);
|
rb_define_module_function(rb_mProcess, "setpgrp", proc_setpgrp, 0);
|
||||||
rb_define_module_function(rb_mProcess, "getpgid", proc_getpgid, 1);
|
rb_define_module_function(rb_mProcess, "getpgid", proc_getpgid, 1);
|
||||||
rb_define_module_function(rb_mProcess, "setpgid", proc_setpgid, 2);
|
rb_define_module_function(rb_mProcess, "setpgid", proc_setpgid, 2);
|
||||||
|
|
||||||
|
|
2
signal.c
2
signal.c
|
@ -292,7 +292,7 @@ posix_signal(signum, handler)
|
||||||
sigact.sa_handler = handler;
|
sigact.sa_handler = handler;
|
||||||
sigemptyset(&sigact.sa_mask);
|
sigemptyset(&sigact.sa_mask);
|
||||||
sigact.sa_flags = 0;
|
sigact.sa_flags = 0;
|
||||||
#ifdef SA_RESTART
|
#if defined(SA_RESTART)
|
||||||
sigact.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
|
sigact.sa_flags |= SA_RESTART; /* SVR4, 4.3+BSD */
|
||||||
#endif
|
#endif
|
||||||
#ifdef SA_NOCLDWAIT
|
#ifdef SA_NOCLDWAIT
|
||||||
|
|
67
string.c
67
string.c
|
@ -202,7 +202,7 @@ void
|
||||||
rb_str_associate(str, add)
|
rb_str_associate(str, add)
|
||||||
VALUE str, add;
|
VALUE str, add;
|
||||||
{
|
{
|
||||||
if (!FL_TEST(str, STR_NO_ORIG)) {
|
if (FL_TEST(str, STR_NO_ORIG|STR_ASSOC) != (STR_NO_ORIG|STR_ASSOC)) {
|
||||||
if (RSTRING(str)->orig) {
|
if (RSTRING(str)->orig) {
|
||||||
rb_str_modify(str);
|
rb_str_modify(str);
|
||||||
}
|
}
|
||||||
|
@ -216,7 +216,7 @@ VALUE
|
||||||
rb_str_associated(str)
|
rb_str_associated(str)
|
||||||
VALUE str;
|
VALUE str;
|
||||||
{
|
{
|
||||||
if (!FL_TEST(str, STR_NO_ORIG|STR_ASSOC)) {
|
if (FL_TEST(str, STR_NO_ORIG|STR_ASSOC) != (STR_NO_ORIG|STR_ASSOC)) {
|
||||||
return Qfalse;
|
return Qfalse;
|
||||||
}
|
}
|
||||||
return RSTRING(str)->orig;
|
return RSTRING(str)->orig;
|
||||||
|
@ -2648,7 +2648,7 @@ rb_f_chomp(argc, argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
rb_str_strip_bang(str)
|
rb_str_lstrip_bang(str)
|
||||||
VALUE str;
|
VALUE str;
|
||||||
{
|
{
|
||||||
char *s, *t, *e;
|
char *s, *t, *e;
|
||||||
|
@ -2659,27 +2659,63 @@ rb_str_strip_bang(str)
|
||||||
/* remove spaces at head */
|
/* remove spaces at head */
|
||||||
while (s < t && ISSPACE(*s)) s++;
|
while (s < t && ISSPACE(*s)) s++;
|
||||||
|
|
||||||
|
RSTRING(str)->len = t-s;
|
||||||
|
if (s > RSTRING(str)->ptr) {
|
||||||
|
memmove(RSTRING(str)->ptr, s, RSTRING(str)->len);
|
||||||
|
RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
rb_str_lstrip(str)
|
||||||
|
VALUE str;
|
||||||
|
{
|
||||||
|
str = rb_str_dup(str);
|
||||||
|
rb_str_lstrip_bang(str);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
rb_str_rstrip_bang(str)
|
||||||
|
VALUE str;
|
||||||
|
{
|
||||||
|
char *s, *t, *e;
|
||||||
|
|
||||||
|
rb_str_modify(str);
|
||||||
|
s = RSTRING(str)->ptr;
|
||||||
|
e = t = s + RSTRING(str)->len;
|
||||||
|
|
||||||
/* remove trailing spaces */
|
/* remove trailing spaces */
|
||||||
t--;
|
t--;
|
||||||
while (s <= t && ISSPACE(*t)) t--;
|
while (s <= t && ISSPACE(*t)) t--;
|
||||||
t++;
|
t++;
|
||||||
|
|
||||||
RSTRING(str)->len = t-s;
|
RSTRING(str)->len = t-s;
|
||||||
if (s > RSTRING(str)->ptr) {
|
if (t < e) {
|
||||||
char *p = RSTRING(str)->ptr;
|
|
||||||
|
|
||||||
RSTRING(str)->ptr = ALLOC_N(char, RSTRING(str)->len+1);
|
|
||||||
memcpy(RSTRING(str)->ptr, s, RSTRING(str)->len);
|
|
||||||
RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
|
RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
|
||||||
free(p);
|
return str;
|
||||||
}
|
}
|
||||||
else if (t < e) {
|
|
||||||
RSTRING(str)->ptr[RSTRING(str)->len] = '\0';
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
rb_str_rstrip(str)
|
||||||
|
VALUE str;
|
||||||
|
{
|
||||||
|
str = rb_str_dup(str);
|
||||||
|
rb_str_rstrip_bang(str);
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
rb_str_strip_bang(str)
|
||||||
|
VALUE str;
|
||||||
|
{
|
||||||
|
VALUE l = rb_str_lstrip_bang(str);
|
||||||
|
VALUE r = rb_str_rstrip_bang(str);
|
||||||
|
|
||||||
|
if (NIL_P(l) && NIL_P(r)) return Qnil;
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3015,12 +3051,17 @@ Init_String()
|
||||||
rb_define_method(rb_cString, "chop", rb_str_chop, 0);
|
rb_define_method(rb_cString, "chop", rb_str_chop, 0);
|
||||||
rb_define_method(rb_cString, "chomp", rb_str_chomp, -1);
|
rb_define_method(rb_cString, "chomp", rb_str_chomp, -1);
|
||||||
rb_define_method(rb_cString, "strip", rb_str_strip, 0);
|
rb_define_method(rb_cString, "strip", rb_str_strip, 0);
|
||||||
|
rb_define_method(rb_cString, "lstrip", rb_str_lstrip, 0);
|
||||||
|
rb_define_method(rb_cString, "rstrip", rb_str_rstrip, 0);
|
||||||
|
|
||||||
rb_define_method(rb_cString, "sub!", rb_str_sub_bang, -1);
|
rb_define_method(rb_cString, "sub!", rb_str_sub_bang, -1);
|
||||||
rb_define_method(rb_cString, "gsub!", rb_str_gsub_bang, -1);
|
rb_define_method(rb_cString, "gsub!", rb_str_gsub_bang, -1);
|
||||||
rb_define_method(rb_cString, "strip!", rb_str_strip_bang, 0);
|
rb_define_method(rb_cString, "strip!", rb_str_strip_bang, 0);
|
||||||
rb_define_method(rb_cString, "chop!", rb_str_chop_bang, 0);
|
rb_define_method(rb_cString, "chop!", rb_str_chop_bang, 0);
|
||||||
rb_define_method(rb_cString, "chomp!", rb_str_chomp_bang, -1);
|
rb_define_method(rb_cString, "chomp!", rb_str_chomp_bang, -1);
|
||||||
|
rb_define_method(rb_cString, "strip!", rb_str_strip_bang, 0);
|
||||||
|
rb_define_method(rb_cString, "lstrip!", rb_str_lstrip_bang, 0);
|
||||||
|
rb_define_method(rb_cString, "rstrip!", rb_str_rstrip_bang, 0);
|
||||||
|
|
||||||
rb_define_method(rb_cString, "tr", rb_str_tr, 2);
|
rb_define_method(rb_cString, "tr", rb_str_tr, 2);
|
||||||
rb_define_method(rb_cString, "tr_s", rb_str_tr_s, 2);
|
rb_define_method(rb_cString, "tr_s", rb_str_tr_s, 2);
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#define RUBY_VERSION "1.7.1"
|
#define RUBY_VERSION "1.7.1"
|
||||||
#define RUBY_RELEASE_DATE "2001-07-31"
|
#define RUBY_RELEASE_DATE "2001-08-06"
|
||||||
#define RUBY_VERSION_CODE 171
|
#define RUBY_VERSION_CODE 171
|
||||||
#define RUBY_RELEASE_CODE 20010731
|
#define RUBY_RELEASE_CODE 20010806
|
||||||
|
|
Loading…
Add table
Reference in a new issue