class BinData::Buffer::BufferIO
a buffer of specified length.
Transforms the IO stream to restrict access inside
def after_read_transform
def after_read_transform read(nil) end
def after_write_transform
def after_write_transform write("\x00" * @bytes_remaining) end
def before_transform
def before_transform @buf_start = offset @buf_end = @buf_start + @bytes_remaining end
def buffer_limited_n(n)
def buffer_limited_n(n) if n.nil? @bytes_remaining elsif n.positive? limit = @bytes_remaining n > limit ? limit : n mment if we decide to allow backwards skipping elsif n.negative? limit = @bytes_remaining + @buf_start - @buf_end n < limit ? limit : n else 0 end end
def initialize(length)
def initialize(length) super() @bytes_remaining = length end
def num_bytes_remaining
def num_bytes_remaining [@bytes_remaining, super].min rescue IOError @bytes_remaining end
def read(n)
def read(n) nbytes = buffer_limited_n(n) @bytes_remaining -= nbytes chain_read(nbytes) end
def seek_abs(n)
def seek_abs(n) if n < @buf_start || n >= @buf_end raise IOError, "can not seek to abs_offset outside of buffer" end @bytes_remaining -= (n - offset) chain_seek_abs(n) end
def skip(n)
def skip(n) nbytes = buffer_limited_n(n) @bytes_remaining -= nbytes chain_skip(nbytes) end
def write(data)
def write(data) nbytes = buffer_limited_n(data.size) @bytes_remaining -= nbytes if nbytes < data.size data = data[0, nbytes] end chain_write(data) end