module LightIO::Library::IO::IOMethods

abstract for io-like operations

Constants

BUF_CHUNK_SIZE

Public Instance Methods

<<(string)
Alias for: write
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?
eof?()
Alias for: 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
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