module LightIO::Library::IO::IOMethods
abstract for io-like operations
Constants
- BUF_CHUNK_SIZE
Public Instance Methods
close(*args)
click to toggle source
# File lib/lightio/library/io.rb, line 173 def close(*args) # close watcher before io closed io_watcher.close @obj.close end
eof()
click to toggle source
# File lib/lightio/library/io.rb, line 122 def eof # until eof have a value fill_read_buf while @readbuf.eof? && @eof.nil? wait_readable fill_read_buf end nonblock_eof? end
Also aliased as: eof?
flush()
click to toggle source
# File lib/lightio/library/io.rb, line 168 def flush @obj.flush self end
getbyte()
click to toggle source
# File lib/lightio/library/io.rb, line 83 def getbyte read(1) end
getc()
click to toggle source
# File lib/lightio/library/io.rb, line 87 def getc fill_read_buf until (c = @readbuf.getc) return nil if nonblock_eof? wait_readable fill_read_buf end c end
gets(*args)
click to toggle source
# File lib/lightio/library/io.rb, line 134 def gets(*args) raise ArgumentError, "wrong number of arguments (given #{args.size}, expected 0..2)" if args.size > 2 sep = $/ if args[0].is_a?(Numeric) limit = args[0] else sep = args[0] if args.size > 0 limit = args[1] if args[1].is_a?(Numeric) end until fill_read_buf break if limit && limit <= @readbuf.length break if sep && @readbuf.string.index(sep) wait_readable end @readbuf.gets(*args) end
lightio_initialize()
click to toggle source
# File lib/lightio/library/io.rb, line 17 def lightio_initialize @readbuf = StringIO.new @readbuf.set_encoding(@obj.external_encoding) if @obj.respond_to?(:external_encoding) @eof = nil @seek = 0 end
print(*obj)
click to toggle source
# File lib/lightio/library/io.rb, line 151 def print(*obj) obj.each do |s| write(s) end end
printf(*args)
click to toggle source
# File lib/lightio/library/io.rb, line 157 def printf(*args) write(sprintf(*args)) end
puts(*obj)
click to toggle source
# File lib/lightio/library/io.rb, line 161 def puts(*obj) obj.each do |s| write(s) write($/) end end
read(length = nil, outbuf = nil)
click to toggle source
# File lib/lightio/library/io.rb, line 66 def read(length = nil, outbuf = nil) while !fill_read_buf && (length.nil? || length > @readbuf.length - @readbuf.pos) wait_readable end @readbuf.read(length, outbuf) end
readbyte()
click to toggle source
# File lib/lightio/library/io.rb, line 116 def readbyte b = getbyte raise EOFError, 'end of file reached' if b.nil? b end
readchar()
click to toggle source
# File lib/lightio/library/io.rb, line 110 def readchar c = getc raise EOFError, 'end of file reached' if c.nil? c end
readline(*args)
click to toggle source
# File lib/lightio/library/io.rb, line 97 def readline(*args) line = gets(*args) raise EOFError, 'end of file reached' if line.nil? line end
readlines(*args)
click to toggle source
# File lib/lightio/library/io.rb, line 103 def readlines(*args) until fill_read_buf wait_readable end @readbuf.readlines(*args) end
readpartial(maxlen, outbuf = nil)
click to toggle source
# File lib/lightio/library/io.rb, line 73 def readpartial(maxlen, outbuf = nil) raise ArgumentError, "negative length #{maxlen} given" if maxlen < 0 fill_read_buf while @readbuf.eof? && !io_eof? wait_readable fill_read_buf end @readbuf.readpartial(maxlen, outbuf) end
wait(timeout = nil, mode = :read)
click to toggle source
# File lib/lightio/library/io.rb, line 24 def wait(timeout = nil, mode = :read) # avoid wait if can immediately return wait_result = if RUBY_VERSION < '2.4' if mode == :read @obj.wait_readable(0) elsif mode == :write @obj.wait_writable(0) end else @obj.wait(0, mode) end (wait_result || io_watcher.wait(timeout, mode)) && self end
wait_readable(timeout = nil)
click to toggle source
# File lib/lightio/library/io.rb, line 38 def wait_readable(timeout = nil) wait(timeout, :read) && self end
wait_writable(timeout = nil)
click to toggle source
# File lib/lightio/library/io.rb, line 42 def wait_writable(timeout = nil) wait(timeout, :write) && self end
write(string)
click to toggle source
# File lib/lightio/library/io.rb, line 46 def write(string) s = StringIO.new(string.to_s) remain_size = s.size loop do result = write_nonblock(s.read, exception: false) case result when :wait_writable io_watcher.wait_writable else remain_size -= result unless remain_size.zero? s.seek(result) end return result end end end
Also aliased as: <<
Private Instance Methods
fill_read_buf()
click to toggle source
# File lib/lightio/library/io.rb, line 191 def fill_read_buf return true if @eof while (data = @obj.read_nonblock(BUF_CHUNK_SIZE, exception: false)) case data when :wait_readable, :wait_writable # set eof to unknown(nil) @eof = nil return nil else # set eof to false @eof = false if @eof.nil? @readbuf.string << data end end # set eof to true @eof = true end
io_eof?()
click to toggle source
# File lib/lightio/library/io.rb, line 185 def io_eof? @eof end
nonblock_eof?()
click to toggle source
# File lib/lightio/library/io.rb, line 181 def nonblock_eof? @readbuf.eof? && io_eof? end