def extract_stream(compressed)
@data << compressed
while !eof? && !finished?
buffer = ""
case @state
when :begin
break if !read(10, buffer)
if buffer.getbyte(0) != 0x1f || buffer.getbyte(1) != 0x8b
raise DecoderError.new("magic header not found")
end
if buffer.getbyte(2) != 0x08
raise DecoderError.new("unknown compression method")
end
@flags = buffer.getbyte(3)
if (@flags & 0xe0).nonzero?
raise DecoderError.new("unknown header flags set")
end
@state = :extra_length
when :extra_length
if (@flags & 0x04).nonzero?
break if !read(2, buffer)
@extra_length = buffer.unpack("v")[0]
@state = :extra
else
@state = :extra
end
when :extra
if (@flags & 0x04).nonzero?
break if read(@extra_length, buffer)
@state = :name
else
@state = :name
end
when :name
if (@flags & 0x08).nonzero?
while !(buffer = readbyte).nil?
if buffer == 0
@state = :comment
break
end
end
else
@state = :comment
end
when :comment
if (@flags & 0x10).nonzero?
while !(buffer = readbyte).nil?
if buffer == 0
@state = :hcrc
break
end
end
else
@state = :hcrc
end
when :hcrc
if (@flags & 0x02).nonzero?
break if !read(2, buffer)
@state = :finish
else
@state = :finish
end
end
end
if finished?
compressed[(@pos - (@data.length - compressed.length))..-1]
else
""
end
end