module OpenSSL::Buffering

def << (s)

def << (s)
  do_write(s)
  self
end

def << (s)

def << (s)
  do_write(s)
  self
end

def close

def close
  flush rescue nil
  sysclose
end

def close

def close
  flush rescue nil
  sysclose
end

def consume_rbuff(size=nil)

def consume_rbuff(size=nil)
  if @rbuffer.empty?
    nil
  else
    size = @rbuffer.size unless size
    ret = @rbuffer[0, size]
    @rbuffer[0, size] = ""
    ret
  end
end

def consume_rbuff(size=nil)

def consume_rbuff(size=nil)
  if @rbuffer.empty?
    nil
  else
    size = @rbuffer.size unless size
    ret = @rbuffer[0, size]
    @rbuffer[0, size] = ""
    ret
  end
end

def do_write(s)

def do_write(s)
  @wbuffer = "" unless defined? @wbuffer
  @wbuffer << s
  @sync ||= false
  if @sync or @wbuffer.size > BLOCK_SIZE or idx = @wbuffer.rindex($/)
    remain = idx ? idx + $/.size : @wbuffer.length
    nwritten = 0
    while remain > 0
      str = @wbuffer[nwritten,remain]
      begin
        nwrote = syswrite(str)
      rescue Errno::EAGAIN
        retry
      end
      remain -= nwrote
      nwritten += nwrote
    end
    @wbuffer[0,nwritten] = ""
  end
end

def do_write(s)

def do_write(s)
  @wbuffer = "" unless defined? @wbuffer
  @wbuffer << s
  @wbuffer.force_encoding(Encoding::BINARY)
  @sync ||= false
  if @sync or @wbuffer.size > BLOCK_SIZE or idx = @wbuffer.rindex($/)
    remain = idx ? idx + $/.size : @wbuffer.length
    nwritten = 0
    while remain > 0
      str = @wbuffer[nwritten,remain]
      begin
        nwrote = syswrite(str)
      rescue Errno::EAGAIN
        retry
      end
      remain -= nwrote
      nwritten += nwrote
    end
    @wbuffer[0,nwritten] = ""
  end
end

def each(eol=$/)

def each(eol=$/)
  while line = self.gets(eol)
    yield line
  end
end

def each(eol=$/)

def each(eol=$/)
  while line = self.gets(eol)
    yield line
  end
end

def each_byte

def each_byte
  while c = getc
    yield(c)
  end
end

def each_byte # :yields: byte

:yields: byte
def each_byte # :yields: byte
  while c = getc
    yield(c.ord)
  end
end

def eof?

def eof?
  fill_rbuff if !@eof && @rbuffer.empty?
  @eof && @rbuffer.empty?
end

def eof?

def eof?
  fill_rbuff if !@eof && @rbuffer.empty?
  @eof && @rbuffer.empty?
end

def fill_rbuff

def fill_rbuff
  begin
    @rbuffer << self.sysread(BLOCK_SIZE)
  rescue Errno::EAGAIN
    retry
  rescue EOFError
    @eof = true
  end
end

def fill_rbuff

def fill_rbuff
  begin
    @rbuffer << self.sysread(BLOCK_SIZE)
  rescue Errno::EAGAIN
    retry
  rescue EOFError
    @eof = true
  end
end

def flush

def flush
  osync = @sync
  @sync = true
  do_write ""
  @sync = osync
end

def flush

def flush
  osync = @sync
  @sync = true
  do_write ""
  return self
ensure
  @sync = osync
end

def getc

def getc
  c = read(1)
  c ? c[0] : nil
end

def getc

def getc
  read(1)
end

def gets(eol=$/)

def gets(eol=$/)
  idx = @rbuffer.index(eol)
  until @eof
    break if idx
    fill_rbuff
    idx = @rbuffer.index(eol)
  end
  if eol.is_a?(Regexp)
    size = idx ? idx+$&.size : nil
  else
    size = idx ? idx+eol.size : nil
  end
  consume_rbuff(size)
end

def gets(eol=$/, limit=nil)

def gets(eol=$/, limit=nil)
  idx = @rbuffer.index(eol)
  until @eof
    break if idx
    fill_rbuff
    idx = @rbuffer.index(eol)
  end
  if eol.is_a?(Regexp)
    size = idx ? idx+$&.size : nil
  else
    size = idx ? idx+eol.size : nil
  end
  if limit and limit >= 0
    size = [size, limit].min
  end
  consume_rbuff(size)
end

def initialize(*args)

def initialize(*args)
  @eof = false
  @rbuffer = ""
  @sync = @io.sync
end

def initialize(*args)

def initialize(*args)
  @eof = false
  @rbuffer = ""
  @sync = @io.sync
end

def print(*args)

def print(*args)
  s = ""
  args.each{ |arg| s << arg.to_s }
  do_write(s)
  nil
end

def print(*args)

def print(*args)
  s = ""
  args.each{ |arg| s << arg.to_s }
  do_write(s)
  nil
end

def printf(s, *args)

def printf(s, *args)
  do_write(s % args)
  nil
end

def printf(s, *args)

def printf(s, *args)
  do_write(s % args)
  nil
end

def puts(*args)

def puts(*args)
  s = ""
  if args.empty?
    s << "\n"
  end
  args.each{|arg|
    s << arg.to_s
    if $/ && /\n\z/ !~ s
      s << "\n"
    end
  }
  do_write(s)
  nil
end

def puts(*args)

def puts(*args)
  s = ""
  if args.empty?
    s << "\n"
  end
  args.each{|arg|
    s << arg.to_s
    if $/ && /\n\z/ !~ s
      s << "\n"
    end
  }
  do_write(s)
  nil
end

def read(size=nil, buf=nil)

def read(size=nil, buf=nil)
  if size == 0
    if buf
      buf.clear
    else
      buf = ""
    end
    return @eof ? nil : buf
  end
  until @eof
    break if size && size <= @rbuffer.size
    fill_rbuff
  end
  ret = consume_rbuff(size) || ""
  if buf
    buf.replace(ret)
    ret = buf
  end
  (size && ret.empty?) ? nil : ret
end

def read(size=nil, buf=nil)

def read(size=nil, buf=nil)
  if size == 0
    if buf
      buf.clear
      return buf
    else
      return ""
    end
  end
  until @eof
    break if size && size <= @rbuffer.size
    fill_rbuff
  end
  ret = consume_rbuff(size) || ""
  if buf
    buf.replace(ret)
    ret = buf
  end
  (size && ret.empty?) ? nil : ret
end

def read_nonblock(maxlen, buf=nil)

def read_nonblock(maxlen, buf=nil)
  if maxlen == 0
    if buf
      buf.clear
      return buf
    else
      return ""
    end
  end
  if @rbuffer.empty?
    return sysread_nonblock(maxlen, buf)
  end
  ret = consume_rbuff(maxlen)
  if buf
    buf.replace(ret)
    ret = buf
  end
  raise EOFError if ret.empty?
  ret
end

def readchar

def readchar
  raise EOFError if eof?
  getc
end

def readchar

def readchar
  raise EOFError if eof?
  getc
end

def readline(eol=$/)

def readline(eol=$/)
  raise EOFError if eof?
  gets(eol)
end

def readline(eol=$/)

def readline(eol=$/)
  raise EOFError if eof?
  gets(eol)
end

def readlines(eol=$/)

def readlines(eol=$/)
  ary = []
  while line = self.gets(eol)
    ary << line
  end
  ary
end

def readlines(eol=$/)

def readlines(eol=$/)
  ary = []
  while line = self.gets(eol)
    ary << line
  end
  ary
end

def readpartial(maxlen, buf=nil)

def readpartial(maxlen, buf=nil)
  if maxlen == 0
    if buf
      buf.clear
    else
      buf = ""
    end
    return @eof ? nil : buf
  end
  if @rbuffer.empty?
    begin
      return sysread(maxlen, buf)
    rescue Errno::EAGAIN
      retry
    end
  end
  ret = consume_rbuff(maxlen)
  if buf
    buf.replace(ret)
    ret = buf
  end
  raise EOFError if ret.empty?
  ret
end

def readpartial(maxlen, buf=nil)

def readpartial(maxlen, buf=nil)
  if maxlen == 0
    if buf
      buf.clear
      return buf
    else
      return ""
    end
  end
  if @rbuffer.empty?
    begin
      return sysread(maxlen, buf)
    rescue Errno::EAGAIN
      retry
    end
  end
  ret = consume_rbuff(maxlen)
  if buf
    buf.replace(ret)
    ret = buf
  end
  raise EOFError if ret.empty?
  ret
end

def ungetc(c)

def ungetc(c)
  @rbuffer[0,0] = c.chr
end

def ungetc(c)

def ungetc(c)
  @rbuffer[0,0] = c.chr
end

def write(s)

def write(s)
  do_write(s)
  s.length
end

def write(s)

def write(s)
  do_write(s)
  s.bytesize
end

def write_nonblock(s)

def write_nonblock(s)
  flush
  syswrite_nonblock(s)
end