[DOC] Enhanced RDoc for io.c (#5460)
Treats: Kernel#readline Kernel#readlines Kernel#`cmd` IO#advise IO.select IO#ioctl IO#fcntl Kernel#syscall IO.pipe
This commit is contained in:
parent
b0bd26ada9
commit
99a65e80d5
Notes:
git
2022-01-31 07:18:13 +09:00
Merged-By: BurdetteLamar <BurdetteLamar@Yahoo.com>
515
io.c
515
io.c
@ -4132,7 +4132,7 @@ static VALUE io_readlines(const struct getline_arg *arg, VALUE io);
|
||||
/*
|
||||
* call-seq:
|
||||
* readlines(sep = $/, **line_opts) -> array
|
||||
* readlines(limit, **line_ops) -> array
|
||||
* readlines(limit, **line_opts) -> array
|
||||
* readlines(sep, limit, **line_opts) -> array
|
||||
*
|
||||
* Reads and returns all remaining line from the stream
|
||||
@ -9646,12 +9646,17 @@ static VALUE argf_readline(int, VALUE *, VALUE);
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* readline(sep=$/) -> string
|
||||
* readline(limit) -> string
|
||||
* readline(sep, limit) -> string
|
||||
* readline(sep = $/, **line_opts) -> string
|
||||
* readline(limit, **line_opts) -> string
|
||||
* readline(sep, limit, **line_opts) -> string
|
||||
*
|
||||
* Equivalent to method Kernel#gets, except that it raises an exception
|
||||
* if called at end-of-stream:
|
||||
*
|
||||
* $ cat t.txt | ruby -e "p readlines; readline"
|
||||
* ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
||||
* in `readline': end of file reached (EOFError)
|
||||
*
|
||||
* Equivalent to Kernel::gets, except
|
||||
* +readline+ raises +EOFError+ at end of file.
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
@ -9700,12 +9705,56 @@ static VALUE argf_readlines(int, VALUE *, VALUE);
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* readlines(sep=$/) -> array
|
||||
* readlines(limit) -> array
|
||||
* readlines(sep, limit) -> array
|
||||
* readlines(sep = $/, **line_opts) -> array
|
||||
* readlines(limit, **line_opts) -> array
|
||||
* readlines(sep, limit, **line_opts) -> array
|
||||
*
|
||||
* Returns an array containing the lines returned by calling
|
||||
* <code>Kernel.gets(<i>sep</i>)</code> until the end of file.
|
||||
* Kernel#gets until the end-of-file is reached.
|
||||
*
|
||||
* With only string argument +sep+ given,
|
||||
* returns the remaining lines as determined by line separator +sep+,
|
||||
* or +nil+ if none;
|
||||
* see {Line Separator}[IO.html#class-IO-label-Line+Separator].\:
|
||||
*
|
||||
* # Default separator.
|
||||
* $ cat t.txt | ruby -e "p readlines"
|
||||
* ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
||||
*
|
||||
* # Specified separator.
|
||||
* $ cat t.txt | ruby -e "p readlines 'li'"
|
||||
* ["First li", "ne\nSecond li", "ne\n\nFourth li", "ne\nFifth li", "ne\n"]
|
||||
*
|
||||
* # Get-all separator.
|
||||
* $ cat t.txt | ruby -e "p readlines nil"
|
||||
* ["First line\nSecond line\n\nFourth line\nFifth line\n"]
|
||||
*
|
||||
* # Get-paragraph separator.
|
||||
* $ cat t.txt | ruby -e "p readlines ''"
|
||||
* ["First line\nSecond line\n\n", "Fourth line\nFifth line\n"]
|
||||
*
|
||||
* With only integer argument +limit+ given,
|
||||
* limits the number of bytes in the line;
|
||||
* see {Line Limit}}[IO.html#class-IO-label-Line+Limit]:
|
||||
*
|
||||
* $cat t.txt | ruby -e "p readlines 10"
|
||||
* ["First line", "\n", "Second lin", "e\n", "\n", "Fourth lin", "e\n", "Fifth line", "\n"]
|
||||
*
|
||||
* $cat t.txt | ruby -e "p readlines 11"
|
||||
* ["First line\n", "Second line", "\n", "\n", "Fourth line", "\n", "Fifth line\n"]
|
||||
*
|
||||
* $cat t.txt | ruby -e "p readlines 12"
|
||||
* ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
||||
*
|
||||
* With arguments +sep+ and +limit+ given, combines the two behaviors;
|
||||
* see {Line Separator and Line Limit}[IO.html#class-IO-label-Line+Separator+and+Line+Limit].
|
||||
*
|
||||
* For all forms above, trailing optional keyword arguments may be given;
|
||||
* see {Line Options}[IO.html#class-IO-label-Line+Options]:
|
||||
*
|
||||
* $ cat t.txt | ruby -e "p readlines(chomp: true)"
|
||||
* ["First line", "Second line", "", "Fourth line", "Fifth line"]
|
||||
*
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
@ -9759,16 +9808,18 @@ argf_readlines(int argc, VALUE *argv, VALUE argf)
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* `cmd` -> string
|
||||
* `cmd` -> string
|
||||
*
|
||||
* Returns the standard output of running _cmd_ in a subshell.
|
||||
* The built-in syntax <code>%x{...}</code> uses
|
||||
* this method. Sets <code>$?</code> to the process status.
|
||||
* Returns the <tt>$stdout</tt> output fromm running +cmd+ in a subshell;
|
||||
* sets global variable <tt>$?</tt> to the process status:
|
||||
*
|
||||
* $ `date` # => "Wed Apr 9 08:56:30 CDT 2003\n"
|
||||
* $ `echo oops && exit 99` # => "oops\n"
|
||||
* $ $? # => #<Process::Status: pid 17088 exit 99>
|
||||
* $ $?.status # => 99>
|
||||
*
|
||||
* The built-in syntax <tt>%x{...}</tt> uses this method.
|
||||
*
|
||||
* `date` #=> "Wed Apr 9 08:56:30 CDT 2003\n"
|
||||
* `ls testdir`.split[1] #=> "main.rb"
|
||||
* `echo oops && exit 99` #=> "oops\n"
|
||||
* $?.exitstatus #=> 99
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
@ -10057,45 +10108,36 @@ advice_arg_check(VALUE advice)
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* ios.advise(advice, offset=0, len=0) -> nil
|
||||
* advise(advice, offset = 0, len = 0) -> nil
|
||||
*
|
||||
* Announce an intention to access data from the current file in a
|
||||
* specific pattern. On platforms that do not support the
|
||||
* <em>posix_fadvise(2)</em> system call, this method is a no-op.
|
||||
* Invokes Posix system call
|
||||
* {posix_fadvise(2)}[https://linux.die.net/man/2/posix_fadvise],
|
||||
* which announces an intention to access data from the current file
|
||||
* in a particular manner.
|
||||
*
|
||||
* _advice_ is one of the following symbols:
|
||||
* The arguments and results are platform-dependent.
|
||||
*
|
||||
* :normal:: No advice to give; the default assumption for an open file.
|
||||
* :sequential:: The data will be accessed sequentially
|
||||
* with lower offsets read before higher ones.
|
||||
* :random:: The data will be accessed in random order.
|
||||
* :willneed:: The data will be accessed in the near future.
|
||||
* :dontneed:: The data will not be accessed in the near future.
|
||||
* :noreuse:: The data will only be accessed once.
|
||||
* The relevant data is specified by:
|
||||
*
|
||||
* The semantics of a piece of advice are platform-dependent. See
|
||||
* <em>man 2 posix_fadvise</em> for details.
|
||||
* - +offset+: The offset of the first byte of data.
|
||||
* - +len+: The number of bytes to be accessed;
|
||||
* if +len+ is zero, or is larger than the number of bytes remaining,
|
||||
* all remaining bytes will be accessed.
|
||||
*
|
||||
* "data" means the region of the current file that begins at
|
||||
* _offset_ and extends for _len_ bytes. If _len_ is 0, the region
|
||||
* ends at the last byte of the file. By default, both _offset_ and
|
||||
* _len_ are 0, meaning that the advice applies to the entire file.
|
||||
* Argument +advice+ is one of the following symbols:
|
||||
*
|
||||
* If an error occurs, one of the following exceptions will be raised:
|
||||
* - +:normal+: The application has no advice to give
|
||||
* about its access pattern for the specified data.
|
||||
* If no advice is given for an open file, this is the default assumption.
|
||||
* - +:sequential+: The application expects to access the specified data sequentially
|
||||
* (with lower offsets read before higher ones).
|
||||
* - +:random+: The specified data will be accessed in random order.
|
||||
* - +:noreuse+: The specified data will be accessed only once.
|
||||
* - +:willneed+: The specified data will be accessed in the near future.
|
||||
* - +:dontneed+: The specified data will not be accessed in the near future.
|
||||
*
|
||||
* IOError:: The IO stream is closed.
|
||||
* Errno::EBADF::
|
||||
* The file descriptor of the current file is invalid.
|
||||
* Errno::EINVAL:: An invalid value for _advice_ was given.
|
||||
* Errno::ESPIPE::
|
||||
* The file descriptor of the current file refers to a FIFO or
|
||||
* pipe. (Linux raises Errno::EINVAL in this case).
|
||||
* TypeError::
|
||||
* Either _advice_ was not a Symbol, or one of the
|
||||
* other arguments was not an Integer.
|
||||
* RangeError:: One of the arguments given was too big/small.
|
||||
* Not implemented on all platforms.
|
||||
*
|
||||
* This list is not exhaustive; other Errno:: exceptions are also possible.
|
||||
*/
|
||||
static VALUE
|
||||
rb_io_advise(int argc, VALUE *argv, VALUE io)
|
||||
@ -10123,31 +10165,45 @@ rb_io_advise(int argc, VALUE *argv, VALUE io)
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* IO.select(read_array [, write_array [, error_array [, timeout]]]) -> array or nil
|
||||
* IO.select(read_ios, write_ios = [], error_ios = [], timeout = nil) -> array or nil
|
||||
*
|
||||
* Calls select(2) system call.
|
||||
* It monitors given arrays of IO objects, waits until one or more of
|
||||
* IO objects are ready for reading, are ready for writing, and have
|
||||
* pending exceptions respectively, and returns an array that contains
|
||||
* arrays of those IO objects. It will return +nil+ if optional
|
||||
* <i>timeout</i> value is given and no IO object is ready in
|
||||
* <i>timeout</i> seconds.
|
||||
* Invokes system call {select(2)}[https://linux.die.net/man/2/select],
|
||||
* which monitors multiple file descriptors,
|
||||
* waiting until one or more of the file descriptors
|
||||
* becomes ready for some class of I/O operation.
|
||||
*
|
||||
* IO.select peeks the buffer of IO objects for testing readability.
|
||||
* If the IO buffer is not empty, IO.select immediately notifies
|
||||
* readability. This "peek" only happens for IO objects. It does not
|
||||
* Not implemented on all platforms.
|
||||
*
|
||||
* Each of the arguments +read_ios+, +write_ios+, and +error_ios+
|
||||
* is an array of IO objects.
|
||||
*
|
||||
* Argument +timeout+ is an integer timeout interval in seconds.
|
||||
*
|
||||
* The method monitors the \IO objects given in all three arrays,
|
||||
* waiting for some to be ready;
|
||||
* returns a 3-element array whose elements are:
|
||||
*
|
||||
* - An array of the objects in +read_ios+ that are ready for reading.
|
||||
* - An array of the objects in +write_ios+ that are ready for writing.
|
||||
* - An array of the objects in +error_ios+ have pending exceptions.
|
||||
*
|
||||
* If no object becomes ready within the given +timeout+, +nil+ is returned.
|
||||
*
|
||||
* \IO.select peeks the buffer of \IO objects for testing readability.
|
||||
* If the \IO buffer is not empty, \IO.select immediately notifies
|
||||
* readability. This "peek" only happens for \IO objects. It does not
|
||||
* happen for IO-like objects such as OpenSSL::SSL::SSLSocket.
|
||||
*
|
||||
* The best way to use IO.select is invoking it after nonblocking
|
||||
* The best way to use \IO.select is invoking it after non-blocking
|
||||
* methods such as #read_nonblock, #write_nonblock, etc. The methods
|
||||
* raise an exception which is extended by IO::WaitReadable or
|
||||
* IO::WaitWritable. The modules notify how the caller should wait
|
||||
* with IO.select. If IO::WaitReadable is raised, the caller should
|
||||
* with \IO.select. If IO::WaitReadable is raised, the caller should
|
||||
* wait for reading. If IO::WaitWritable is raised, the caller should
|
||||
* wait for writing.
|
||||
*
|
||||
* So, blocking read (#readpartial) can be emulated using
|
||||
* #read_nonblock and IO.select as follows:
|
||||
* #read_nonblock and \IO.select as follows:
|
||||
*
|
||||
* begin
|
||||
* result = io_like.read_nonblock(maxlen)
|
||||
@ -10159,16 +10215,16 @@ rb_io_advise(int argc, VALUE *argv, VALUE io)
|
||||
* retry
|
||||
* end
|
||||
*
|
||||
* Especially, the combination of nonblocking methods and IO.select is
|
||||
* Especially, the combination of non-blocking methods and \IO.select is
|
||||
* preferred for IO like objects such as OpenSSL::SSL::SSLSocket. It
|
||||
* has #to_io method to return underlying IO object. IO.select calls
|
||||
* #to_io to obtain the file descriptor to wait.
|
||||
*
|
||||
* This means that readability notified by IO.select doesn't mean
|
||||
* This means that readability notified by \IO.select doesn't mean
|
||||
* readability from OpenSSL::SSL::SSLSocket object.
|
||||
*
|
||||
* The most likely situation is that OpenSSL::SSL::SSLSocket buffers
|
||||
* some data. IO.select doesn't see the buffer. So IO.select can
|
||||
* some data. \IO.select doesn't see the buffer. So \IO.select can
|
||||
* block when OpenSSL::SSL::SSLSocket#readpartial doesn't block.
|
||||
*
|
||||
* However, several more complicated situations exist.
|
||||
@ -10188,23 +10244,23 @@ rb_io_advise(int argc, VALUE *argv, VALUE io)
|
||||
* So, the caller should wait for ready for writability as above
|
||||
* example.
|
||||
*
|
||||
* The combination of nonblocking methods and IO.select is also useful
|
||||
* The combination of non-blocking methods and \IO.select is also useful
|
||||
* for streams such as tty, pipe socket socket when multiple processes
|
||||
* read from a stream.
|
||||
*
|
||||
* Finally, Linux kernel developers don't guarantee that
|
||||
* readability of select(2) means readability of following read(2) even
|
||||
* for a single process.
|
||||
* See select(2) manual on GNU/Linux system.
|
||||
* for a single process;
|
||||
* see {select(2)}[https://linux.die.net/man/2/select]
|
||||
*
|
||||
* Invoking IO.select before IO#readpartial works well as usual.
|
||||
* However it is not the best way to use IO.select.
|
||||
* Invoking \IO.select before IO#readpartial works well as usual.
|
||||
* However it is not the best way to use \IO.select.
|
||||
*
|
||||
* The writability notified by select(2) doesn't show
|
||||
* how many bytes are writable.
|
||||
* IO#write method blocks until given whole string is written.
|
||||
* So, <code>IO#write(two or more bytes)</code> can block after
|
||||
* writability is notified by IO.select. IO#write_nonblock is required
|
||||
* So, <tt>IO#write(two or more bytes)</tt> can block after
|
||||
* writability is notified by \IO.select. IO#write_nonblock is required
|
||||
* to avoid the blocking.
|
||||
*
|
||||
* Blocking write (#write) can be emulated using #write_nonblock and
|
||||
@ -10224,13 +10280,7 @@ rb_io_advise(int argc, VALUE *argv, VALUE io)
|
||||
* string = string.byteslice(written..-1)
|
||||
* end
|
||||
*
|
||||
* === Parameters
|
||||
* read_array:: an array of IO objects that wait until ready for read
|
||||
* write_array:: an array of IO objects that wait until ready for write
|
||||
* error_array:: an array of IO objects that wait for exceptions
|
||||
* timeout:: a numeric value in second
|
||||
*
|
||||
* === Example
|
||||
* Example:
|
||||
*
|
||||
* rp, wp = IO.pipe
|
||||
* mesg = "ping "
|
||||
@ -10252,13 +10302,14 @@ rb_io_advise(int argc, VALUE *argv, VALUE io)
|
||||
* end
|
||||
* }
|
||||
*
|
||||
* <em>produces:</em>
|
||||
* Output:
|
||||
*
|
||||
* ping pong
|
||||
* ping pong
|
||||
* ping pong
|
||||
* (snipped)
|
||||
* ping
|
||||
*
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
@ -10585,14 +10636,20 @@ rb_ioctl(VALUE io, VALUE req, VALUE arg)
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* ios.ioctl(integer_cmd, arg) -> integer
|
||||
* ioctl(integer_cmd, argument) -> integer
|
||||
*
|
||||
* Invokes Posix system call {ioctl(2)}[https://linux.die.net/man/2/ioctl],
|
||||
* which issues a low-level command to an I/O device.
|
||||
*
|
||||
* Issues a low-level command to an I/O device.
|
||||
* The arguments and returned value are platform-dependent.
|
||||
* The effect of the call is platform-dependent.
|
||||
*
|
||||
* If argument +argument+ is an integer, it is passed directly;
|
||||
* if it is a string, it is interpreted as a binary sequence of bytes.
|
||||
*
|
||||
* Not implemented on all platforms.
|
||||
*
|
||||
* Provides a mechanism for issuing low-level commands to control or
|
||||
* query I/O devices. Arguments and results are platform dependent. If
|
||||
* <i>arg</i> is a number, its value is passed directly. If it is a
|
||||
* string, it is interpreted as a binary sequence of bytes. On Unix
|
||||
* platforms, see <code>ioctl(2)</code> for details. Not implemented on
|
||||
* all platforms.
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
@ -10668,15 +10725,19 @@ rb_fcntl(VALUE io, VALUE req, VALUE arg)
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* ios.fcntl(integer_cmd, arg) -> integer
|
||||
* fcntl(integer_cmd, argument) -> integer
|
||||
*
|
||||
* Invokes Posix system call {fcntl(2)}[https://linux.die.net/man/2/fcntl],
|
||||
* which provides a mechanism for issuing low-level commands to control or query
|
||||
* a file-oriented I/O stream. Arguments and results are platform
|
||||
* dependent.
|
||||
*
|
||||
* If +argument is a number, its value is passed directly;
|
||||
* if it is a string, it is interpreted as a binary sequence of bytes.
|
||||
* (Array#pack might be a useful way to build this string.)
|
||||
*
|
||||
* Not implemented on all platforms.
|
||||
*
|
||||
* Provides a mechanism for issuing low-level commands to control or
|
||||
* query file-oriented I/O streams. Arguments and results are platform
|
||||
* dependent. If <i>arg</i> is a number, its value is passed
|
||||
* directly. If it is a string, it is interpreted as a binary sequence
|
||||
* of bytes (Array#pack might be a useful way to build this string). On
|
||||
* Unix platforms, see <code>fcntl(2)</code> for details. Not
|
||||
* implemented on all platforms.
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
@ -10694,36 +10755,29 @@ rb_io_fcntl(int argc, VALUE *argv, VALUE io)
|
||||
#if defined(HAVE_SYSCALL) || defined(HAVE___SYSCALL)
|
||||
/*
|
||||
* call-seq:
|
||||
* syscall(num [, args...]) -> integer
|
||||
* syscall(integer_callno, *arguments) -> integer
|
||||
*
|
||||
* Calls the operating system function identified by _num_ and
|
||||
* returns the result of the function or raises SystemCallError if
|
||||
* it failed.
|
||||
* Invokes Posix system call {syscall(2)}[https://linux.die.net/man/2/syscall],
|
||||
* which calls a specified function.
|
||||
*
|
||||
* Arguments for the function can follow _num_. They must be either
|
||||
* +String+ objects or +Integer+ objects. A +String+ object is passed
|
||||
* as a pointer to the byte sequence. An +Integer+ object is passed
|
||||
* as an integer whose bit size is the same as a pointer.
|
||||
* Up to nine parameters may be passed.
|
||||
* Calls the operating system function identified by +integer_callno+;
|
||||
* returns the result of the function or raises SystemCallError if it failed.
|
||||
* The effect of the call is platform-dependent.
|
||||
* The arguments and returned value are platform-dependent.
|
||||
*
|
||||
* The function identified by _num_ is system
|
||||
* dependent. On some Unix systems, the numbers may be obtained from a
|
||||
* header file called <code>syscall.h</code>.
|
||||
* For each of +arguments+: if it is an integer, it is passed directly;
|
||||
* if it is a string, it is interpreted as a binary sequence of bytes.
|
||||
* There may be as many as nine such arguments.
|
||||
*
|
||||
* syscall 4, 1, "hello\n", 6 # '4' is write(2) on our box
|
||||
* Arguments +integer_callno+ and +argument+, as well as the returned value,
|
||||
* are platform-dependent.
|
||||
*
|
||||
* <em>produces:</em>
|
||||
*
|
||||
* hello
|
||||
*
|
||||
* Calling +syscall+ on a platform which does not have any way to
|
||||
* an arbitrary system function just fails with NotImplementedError.
|
||||
*
|
||||
* *Note:*
|
||||
* +syscall+ is essentially unsafe and unportable.
|
||||
* Feel free to shoot your foot.
|
||||
* Note: Method +syscall+ is essentially unsafe and unportable.
|
||||
* The DL (Fiddle) library is preferred for safer and a bit
|
||||
* more portable programming.
|
||||
*
|
||||
* Not implemented on all platforms.
|
||||
*
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
@ -10923,62 +10977,84 @@ pipe_pair_close(VALUE rw)
|
||||
|
||||
/*
|
||||
* call-seq:
|
||||
* IO.pipe -> [read_io, write_io]
|
||||
* IO.pipe(ext_enc) -> [read_io, write_io]
|
||||
* IO.pipe("ext_enc:int_enc" [, opt]) -> [read_io, write_io]
|
||||
* IO.pipe(ext_enc, int_enc [, opt]) -> [read_io, write_io]
|
||||
* IO.pipe(**opts) -> [read_io, write_io]
|
||||
* IO.pipe(enc, **opts) -> [read_io, write_io]
|
||||
* IO.pipe(ext_enc, int_enc, **opts) -> [read_io, write_io]
|
||||
* IO.pipe(**opts) {|read_io, write_io] ...} -> object
|
||||
* IO.pipe(enc, **opts) {|read_io, write_io] ...} -> object
|
||||
* IO.pipe(ext_enc, int_enc, **opts) {|read_io, write_io] ...} -> object
|
||||
*
|
||||
* IO.pipe(...) {|read_io, write_io| ... }
|
||||
* Creates a pair of pipe endpoints, +read_io+ and +write_io+,
|
||||
* connected to each other.
|
||||
*
|
||||
* Creates a pair of pipe endpoints (connected to each other) and
|
||||
* returns them as a two-element array of IO objects:
|
||||
* <code>[</code> <i>read_io</i>, <i>write_io</i> <code>]</code>.
|
||||
* If argument +enc_string+ is given, it must be a string containing one of:
|
||||
*
|
||||
* If a block is given, the block is called and
|
||||
* returns the value of the block.
|
||||
* <i>read_io</i> and <i>write_io</i> are sent to the block as arguments.
|
||||
* If read_io and write_io are not closed when the block exits, they are closed.
|
||||
* i.e. closing read_io and/or write_io doesn't cause an error.
|
||||
* - The name of the encoding to be used as the internal encoding.
|
||||
* - The colon-separated names of two encodings to be used as the internal
|
||||
* and external encodings.
|
||||
*
|
||||
* You can view an array of the encoding names by calling method Encoding.name_list.
|
||||
*
|
||||
* If argument +int_enc+ is given, it must be an Encoding object
|
||||
* or encoding name string that specifies the internal encoding to be used;
|
||||
* if argument +ext_enc+ is also given, it must be an Encoding object
|
||||
* or encoding name string that specifies the external encoding to be used.
|
||||
*
|
||||
* You can view an array of encoding classes by calling method Encoding.list.
|
||||
*
|
||||
* The string read from +read_io+ is tagged with the external encoding;
|
||||
* if an internal encoding is also specified, the string is converted
|
||||
* to, and tagged with, that encoding.
|
||||
*
|
||||
* If any encoding is specified,
|
||||
* optional hash arguments specify the conversion option.
|
||||
*
|
||||
* Optional argument +opts+ must specify valid open options
|
||||
* (see {IO Open Options}[#class-IO-label-Open+Options])
|
||||
* and/or valid encoding options (see String#encode).
|
||||
*
|
||||
* With no block given, returns the two endpoints in an array:
|
||||
*
|
||||
* IO.pipe # => [#<IO:fd 4>, #<IO:fd 5>]
|
||||
*
|
||||
* With a block given, calls the block with the two endpoints;
|
||||
* closes both endpoints and returns the value of the block:
|
||||
*
|
||||
* IO.pipe {|read_io, write_io| p read_io; p write_io }
|
||||
*
|
||||
* Output:
|
||||
*
|
||||
* #<IO:fd 6>
|
||||
* #<IO:fd 7>
|
||||
*
|
||||
* Not available on all platforms.
|
||||
*
|
||||
* If an encoding (encoding name or encoding object) is specified as an optional argument,
|
||||
* read string from pipe is tagged with the encoding specified.
|
||||
* If the argument is a colon separated two encoding names "A:B",
|
||||
* the read string is converted from encoding A (external encoding)
|
||||
* to encoding B (internal encoding), then tagged with B.
|
||||
* If two optional arguments are specified, those must be
|
||||
* encoding objects or encoding names,
|
||||
* and the first one is the external encoding,
|
||||
* and the second one is the internal encoding.
|
||||
* If the external encoding and the internal encoding is specified,
|
||||
* optional hash argument specify the conversion option.
|
||||
*
|
||||
* In the example below, the two processes close the ends of the pipe
|
||||
* that they are not using. This is not just a cosmetic nicety. The
|
||||
* read end of a pipe will not generate an end of file condition if
|
||||
* there are any writers with the pipe still open. In the case of the
|
||||
* parent process, the <code>rd.read</code> will never return if it
|
||||
* does not first issue a <code>wr.close</code>.
|
||||
* parent process, the <tt>rd.read</tt> will never return if it
|
||||
* does not first issue a <tt>wr.close</tt>:
|
||||
*
|
||||
* rd, wr = IO.pipe
|
||||
* rd, wr = IO.pipe
|
||||
*
|
||||
* if fork
|
||||
* wr.close
|
||||
* puts "Parent got: <#{rd.read}>"
|
||||
* rd.close
|
||||
* Process.wait
|
||||
* else
|
||||
* rd.close
|
||||
* puts "Sending message to parent"
|
||||
* wr.write "Hi Dad"
|
||||
* wr.close
|
||||
* end
|
||||
* if fork
|
||||
* wr.close
|
||||
* puts "Parent got: <#{rd.read}>"
|
||||
* rd.close
|
||||
* Process.wait
|
||||
* else
|
||||
* rd.close
|
||||
* puts 'Sending message to parent'
|
||||
* wr.write "Hi Dad"
|
||||
* wr.close
|
||||
* end
|
||||
*
|
||||
* <em>produces:</em>
|
||||
*
|
||||
* Sending message to parent
|
||||
* Parent got: <Hi Dad>
|
||||
*
|
||||
*/
|
||||
|
||||
static VALUE
|
||||
@ -13859,7 +13935,7 @@ set_LAST_READ_LINE(VALUE val, ID _x, VALUE *_y)
|
||||
* - Kernel#open: Returns a new \IO object connected to a given source:
|
||||
* stream, file, or subprocess.
|
||||
*
|
||||
* A \IO stream has:
|
||||
* An \IO stream has:
|
||||
*
|
||||
* - A read/write mode, which may be read-only, write-only, or read/write;
|
||||
* see {Read/Write Mode}[#class-IO-label-Read-2FWrite+Mode].
|
||||
@ -13919,7 +13995,7 @@ set_LAST_READ_LINE(VALUE val, ID _x, VALUE *_y)
|
||||
* - The external and internal encodings.
|
||||
*
|
||||
* === Read/Write Mode
|
||||
|
||||
*
|
||||
* ==== Read/Write Mode Specified as an \Integer
|
||||
*
|
||||
* When +mode+ is an integer it must be one or more (combined by bitwise OR (<tt>|</tt>)
|
||||
@ -14049,76 +14125,6 @@ set_LAST_READ_LINE(VALUE val, ID _x, VALUE *_y)
|
||||
* Also available are the options offered in String#encode,
|
||||
* which may control conversion between external internal encoding.
|
||||
*
|
||||
* == Line Options
|
||||
*
|
||||
* A number of \IO methods accept optional keyword arguments
|
||||
* that determine how lines in a stream are to be treated:
|
||||
*
|
||||
* - +:chomp+: If +true+, line separators are omitted; default is +false+.
|
||||
*
|
||||
* == Position
|
||||
*
|
||||
* An \IO stream has a _position_, which is the non-negative integer offset
|
||||
* (in bytes) in the stream where the next read or write will occur.
|
||||
*
|
||||
* Note that a text stream may have multi-byte characters,
|
||||
* so a text stream whose position is +n+ (_bytes_) may not have +n+ _characters_
|
||||
* preceding the current position -- there may be fewer.
|
||||
*
|
||||
* A new stream is initially positioned:
|
||||
*
|
||||
* - At the beginning (position +0+)
|
||||
* if its mode is <tt>'r'</tt>, <tt>'w'</tt>, or <tt>'r+'</tt>.
|
||||
* - At the end (position <tt>self.size</tt>)
|
||||
* if its mode is <tt>'a'</tt>, <tt>'w+'</tt>, or <tt>'a+'</tt>.
|
||||
*
|
||||
* Methods to query the position:
|
||||
*
|
||||
* - IO#tell and its alias IO#pos return the position for an open stream.
|
||||
* - IO#eof? and its alias IO#eof return whether the position is at the end
|
||||
* of a readable stream.
|
||||
*
|
||||
* Reading from a stream usually changes its position:
|
||||
*
|
||||
* f = File.open('t.txt')
|
||||
* f.tell # => 0
|
||||
* f.readline # => "This is line one.\n"
|
||||
* f.tell # => 19
|
||||
* f.readline # => "This is the second line.\n"
|
||||
* f.tell # => 45
|
||||
* f.eof? # => false
|
||||
* f.readline # => "Here's the third line.\n"
|
||||
* f.eof? # => true
|
||||
*
|
||||
*
|
||||
* Writing to a stream usually changes its position:
|
||||
*
|
||||
* f = File.open('t.tmp', 'w')
|
||||
* f.tell # => 0
|
||||
* f.write('foo') # => 3
|
||||
* f.tell # => 3
|
||||
* f.write('bar') # => 3
|
||||
* f.tell # => 6
|
||||
*
|
||||
*
|
||||
* Iterating over a stream usually changes its position:
|
||||
*
|
||||
* f = File.open('t.txt')
|
||||
* f.each do |line|
|
||||
* p "position=#{f.pos} eof?=#{f.eof?} line=#{line}"
|
||||
* end
|
||||
*
|
||||
* Output:
|
||||
*
|
||||
* "position=19 eof?=false line=This is line one.\n"
|
||||
* "position=45 eof?=false line=This is the second line.\n"
|
||||
* "position=70 eof?=true line=This is the third line.\n"
|
||||
*
|
||||
* The position may also be changed by certain other methods:
|
||||
*
|
||||
* - IO#pos= and IO#seek change the position to a specified offset.
|
||||
* - IO#rewind changes the position to the beginning.
|
||||
*
|
||||
* == Lines
|
||||
*
|
||||
* Some reader methods in \IO are line-oriented;
|
||||
@ -14127,12 +14133,22 @@ set_LAST_READ_LINE(VALUE val, ID _x, VALUE *_y)
|
||||
*
|
||||
* These methods include:
|
||||
*
|
||||
* - IO::foreach.
|
||||
* - IO::readlines.
|
||||
* - IO#each.
|
||||
* - IO#gets.
|
||||
* - IO#readline.
|
||||
* - IO#readlines.
|
||||
* - Kernel#gets
|
||||
* - Kernel#readline
|
||||
* - Kernel#readlines
|
||||
* - IO.foreach
|
||||
* - IO.readlines
|
||||
* - IO#eachline
|
||||
* - IO#gets
|
||||
* - IO#readline
|
||||
* - IO#readlines
|
||||
* - ARGF.each
|
||||
* - ARGF.gets
|
||||
* - ARGF.readline
|
||||
* - ARGF.readlines
|
||||
*
|
||||
* Each of these methods returns +nil+ if called when already at end-of-stream,
|
||||
* except for IO#readline, which raises an exception.
|
||||
*
|
||||
* Each of these methods may be called with:
|
||||
*
|
||||
@ -14196,18 +14212,24 @@ set_LAST_READ_LINE(VALUE val, ID _x, VALUE *_y)
|
||||
* File.open('t.txt') {|f| f.gets(12) } # => "First line\n"
|
||||
*
|
||||
* # Text with 2-byte characters, which will not be split.
|
||||
* File.open('t.rus') {|f| f.gets(1).size } # => 1
|
||||
* File.open('t.rus') {|f| f.gets(2).size } # => 1
|
||||
* File.open('t.rus') {|f| f.gets(3).size } # => 2
|
||||
* File.open('t.rus') {|f| f.gets(4).size } # => 2
|
||||
* File.open('r.rus') {|f| f.gets(1).size } # => 1
|
||||
* File.open('r.rus') {|f| f.gets(2).size } # => 1
|
||||
* File.open('r.rus') {|f| f.gets(3).size } # => 2
|
||||
* File.open('r.rus') {|f| f.gets(4).size } # => 2
|
||||
*
|
||||
* === Line Separator and Line Limit
|
||||
*
|
||||
* With arguments +sep+ and +limit+ given,
|
||||
* combines the two behaviors:
|
||||
*
|
||||
* - Returns the next line as determined by line separator +sep+,
|
||||
* or +nil+ if none.
|
||||
* - Returns the next line as determined by line separator +sep+.
|
||||
* - But returns no more bytes than are allowed by the limit.
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
* File.open('t.txt') {|f| f.gets('li', 20) } # => "First li"
|
||||
* File.open('t.txt') {|f| f.gets('li', 2) } # => "Fi"
|
||||
*
|
||||
* === Line Number
|
||||
*
|
||||
* A readable \IO stream has a _line_ _number_,
|
||||
@ -14243,6 +14265,13 @@ set_LAST_READ_LINE(VALUE val, ID _x, VALUE *_y)
|
||||
* "position=45 eof?=false line=This is the second line.\n"
|
||||
* "position=70 eof?=true line=This is the third line.\n"
|
||||
*
|
||||
* === Line Options
|
||||
*
|
||||
* A number of \IO methods accept optional keyword arguments
|
||||
* that determine how lines in a stream are to be treated:
|
||||
*
|
||||
* - +:chomp+: If +true+, line separators are omitted; default is +false+.
|
||||
*
|
||||
* == What's Here
|
||||
*
|
||||
* First, what's elsewhere. \Class \IO:
|
||||
@ -14301,7 +14330,7 @@ set_LAST_READ_LINE(VALUE val, ID _x, VALUE *_y)
|
||||
* === Writing
|
||||
*
|
||||
* - ::binwrite:: Writes the given string to the file at the given filepath,
|
||||
in binary mode.
|
||||
* in binary mode.
|
||||
* - ::write:: Writes the given string to +self+.
|
||||
* - {::<<}[#method-i-3C-3C]:: Appends the given string to +self+.
|
||||
* - #print:: Prints last read line or given objects to +self+.
|
||||
|
Loading…
x
Reference in New Issue
Block a user