--- /dev/null
+class Buffer
+ def initialize(size)
+ @size = size
+ @buff = []
+ @buff_type = []
+ @current = 0
+ @wrap = false
+ @before = false
+ @after = false
+ end
+ def size()
+ return @buff.length
+ end
+ def maxlen()
+ maxlen = 0
+ @buff.each do |string|
+ if string.length > maxlen
+ maxlen = string.length
+ end
+ end
+ return maxlen
+ end
+
+ def push(string,type=0)
+ if(string.chomp.empty?) then string = " " end
+ string.split( /\r?\n/ ).each do |line|
+ @buff[@current] = line
+ @buff_type[@current] = type
+ if(@size > 0)
+ @current = (1+@current) % @size
+ else
+ @current = 1+@current
+ end
+ if(@current == 0) then @wrap = true end
+ end
+ end
+ def yield(size,offset=0,&block)
+ if(size < 0) then size = 0 end
+ range = Range.new(0,@current-1).to_a
+ if(@wrap)
+ range = Range.new(@current,@size-1).to_a + range
+ end
+ range = range.last(size+offset)[0,size]
+ @before = (size+offset < @buff.length)
+ @after = (offset != 0 and size < @buff.length)
+ if(block)
+ range.each do |i|
+ yield [@buff[i],@buff_type[i]]
+ end
+ else
+ return range.collect{|r| [@buff[r],@buff_type[r]]}
+ end
+ end
+ def has_after?()
+ return @after
+ end
+ def has_before?()
+ return @before
+ end
+ def clear()
+ @current = 0
+ @buff = []
+ @buff_type = []
+ end
+end
+
+