summaryrefslogtreecommitdiff
path: root/io.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-05-24 04:34:26 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2000-05-24 04:34:26 +0000
commit8b1de0b1ad49733abeddd8be359ae816b29de59a (patch)
treea7ed03dd3f6442635f694c4367bcd94be57f6dbd /io.c
parent24b9bdca25dc431aff935df7739b9c5ea0ee4077 (diff)
2000-05-24
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@710 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'io.c')
-rw-r--r--io.c162
1 files changed, 79 insertions, 83 deletions
diff --git a/io.c b/io.c
index 405aa7d2d2..4ce2339bbe 100644
--- a/io.c
+++ b/io.c
@@ -105,7 +105,7 @@ static VALUE lineno;
#elif defined(FILE_COUNT)
# define READ_DATA_PENDING(fp) ((fp)->FILE_COUNT > 0)
#elif defined(__BEOS__)
-# define ReadDataPending(fp) (fp->_state._eof == 0)
+# define READ_DATA_PENDING(fp) (fp->_state._eof == 0)
#else
/* requires systems own version of the ReadDataPending() */
extern int ReadDataPending();
@@ -393,6 +393,18 @@ rb_io_fileno(io)
}
static VALUE
+rb_io_pid(io)
+ VALUE io;
+{
+ OpenFile *fptr;
+
+ GetOpenFile(io, fptr);
+ if (!fptr->pid)
+ return Qnil;
+ return INT2FIX(fptr->pid);
+}
+
+static VALUE
rb_io_to_io(io)
VALUE io;
{
@@ -1572,10 +1584,11 @@ pipe_open(pname, mode)
}
static VALUE
-rb_io_s_popen(argc, argv, self)
+rb_io_popen(str, argc, argv, klass)
+ char *str;
int argc;
VALUE *argv;
- VALUE self;
+ VALUE klass;
{
char *mode;
VALUE pname, pmode, port, proc;
@@ -1584,66 +1597,42 @@ rb_io_s_popen(argc, argv, self)
mode = "r";
}
else {
- int len;
-
mode = STR2CSTR(pmode);
- len = strlen(mode);
- if (len == 0 || len > 3)
- rb_raise(rb_eArgError, "illegal access mode");
}
Check_SafeStr(pname);
- port = pipe_open(RSTRING(pname)->ptr, mode);
+ port = pipe_open(str, mode);
if (NIL_P(port)) {
/* child */
if (!NIL_P(proc)) {
rb_eval_cmd(proc, rb_ary_new2(0));
- _exit(0);
}
- else if (rb_iterator_p()) {
+ else if (rb_block_given_p()) {
rb_yield(Qnil);
}
- return Qnil;
+ fflush(stdout);
+ fflush(stderr);
+ _exit(0);
}
- else if (rb_iterator_p()) {
- return rb_ensure(rb_yield, port, rb_io_close, port);
+ RBASIC(port)->klass = klass;
+ if (rb_block_given_p()) {
+ rb_ensure(rb_yield, port, rb_io_close, port);
+ return Qnil;
}
return port;
}
static VALUE
-rb_file_initialize(argc, argv, io)
+rb_io_s_popen(argc, argv, klass)
int argc;
VALUE *argv;
- VALUE io;
+ VALUE klass;
{
- VALUE fname, vmode, file, perm;
- char *path, *mode;
-
- rb_scan_args(argc, argv, "12", &fname, &vmode, &perm);
- Check_SafeStr(fname);
- path = RSTRING(fname)->ptr;
+ char *str = 0;
- if (FIXNUM_P(vmode)) {
- int flags = NUM2INT(vmode);
- int fmode = NIL_P(perm) ? 0666 : NUM2INT(perm);
-
- file = rb_file_sysopen_internal(io, path, flags, fmode);
- }
- else {
- if (!NIL_P(vmode)) {
- mode = STR2CSTR(vmode);
- }
- else {
- mode = "r";
- }
- file = rb_file_open_internal(io, RSTRING(fname)->ptr, mode);
- }
-
- if (rb_iterator_p()) {
- return rb_ensure(rb_yield, file, rb_io_close, file);
+ if (argc >= 1) {
+ str = STR2CSTR(argv[0]);
}
-
- return file;
+ return rb_io_popen(str, argc, argv, klass);
}
static VALUE
@@ -1668,17 +1657,18 @@ rb_file_s_open(argc, argv, klass)
file = rb_file_sysopen_internal((VALUE)io, path, flags, fmode);
}
else {
- if (!NIL_P(vmode)) {
- mode = STR2CSTR(vmode);
+ if (NIL_P(vmode)) {
+ mode = "r";
}
else {
- mode = "r";
+ mode = STR2CSTR(vmode);
}
file = rb_file_open_internal((VALUE)io, RSTRING(fname)->ptr, mode);
}
- if (rb_iterator_p()) {
- return rb_ensure(rb_yield, file, rb_io_close, file);
+ if (rb_block_given_p()) {
+ rb_ensure(rb_yield, file, rb_io_close, file);
+ return Qnil;
}
return file;
@@ -1689,41 +1679,14 @@ rb_f_open(argc, argv)
int argc;
VALUE *argv;
{
- char *mode;
- VALUE pname, pmode, perm;
- VALUE port;
+ if (argc >= 1) {
+ char *str = STR2CSTR(argv[0]);
- rb_scan_args(argc, argv, "12", &pname, &pmode, &perm);
- Check_SafeStr(pname);
- if (RSTRING(pname)->ptr[0] != '|') /* open file */
- return rb_file_s_open(argc, argv, rb_cFile);
-
- /* open pipe */
- if (NIL_P(pmode)) {
- mode = "r";
- }
- else if (FIXNUM_P(pmode)) {
- mode = rb_io_flags_mode(NUM2INT(pmode));
- }
- else {
- int len;
-
- mode = STR2CSTR(pmode);
- len = strlen(mode);
- if (len == 0 || len > 3)
- rb_raise(rb_eArgError, "illegal access mode %s", mode);
- }
-
- port = pipe_open(RSTRING(pname)->ptr+1, mode);
- if (!rb_iterator_p()) return port;
- if (NIL_P(port)) {
- rb_yield(port);
- }
- else if (rb_iterator_p()) {
- return rb_ensure(rb_yield, port, rb_io_close, port);
+ if (str[0] == '|') {
+ return rb_io_popen(str+1, argc, argv, rb_cIO);
+ }
}
-
- return port;
+ return rb_file_s_open(argc, argv, rb_cFile);
}
static VALUE
@@ -2280,12 +2243,44 @@ rb_io_initialize(argc, argv, io)
fp->f = rb_fdopen(NUM2INT(fnum), m);
fp->mode = rb_io_mode_flags(m);
- if (rb_iterator_p()) {
- return rb_ensure(rb_yield, io, rb_io_close, io);
- }
return io;
}
+static VALUE
+rb_file_initialize(argc, argv, io)
+ int argc;
+ VALUE *argv;
+ VALUE io;
+{
+ VALUE fname, vmode, file, perm;
+ char *path, *mode;
+
+ rb_scan_args(argc, argv, "12", &fname, &vmode, &perm);
+ Check_SafeStr(fname);
+ path = RSTRING(fname)->ptr;
+
+ if (FIXNUM_P(vmode)) {
+ int flags = NUM2INT(vmode);
+ int fmode = NIL_P(perm) ? 0666 : NUM2INT(perm);
+
+ file = rb_file_sysopen_internal(io, path, flags, fmode);
+ }
+ else {
+ if (NIL_P(vmode)) {
+ mode = "r";
+ }
+ else {
+ mode = STR2CSTR(vmode);
+ }
+ file = rb_file_open_internal(io, RSTRING(fname)->ptr, mode);
+ }
+ if (rb_block_given_p()) {
+ rb_warn("File::new() does not take block; use File::open() instead");
+ }
+
+ return file;
+}
+
static int binmode = 0;
static VALUE
@@ -3339,6 +3334,7 @@ Init_IO()
rb_define_method(rb_cIO, "ioctl", rb_io_ioctl, -1);
rb_define_method(rb_cIO, "fcntl", rb_io_fcntl, -1);
+ rb_define_method(rb_cIO, "pid", rb_io_pid, 0);
rb_stdin = orig_stdin = prep_stdio(stdin, FMODE_READABLE, rb_cIO);
rb_define_hooked_variable("$stdin", &rb_stdin, 0, set_stdin);