module LogAn
	module Inc
		module FileParser
			module Base
				class <<self
					def logdb=( var)  @@logdb = var  end
					def logdb()  @@logdb  end
					def store=( var)  @@store = var  end
					def store()  @@store  end
				end

				def emit line
					@@logdb.emit line, @sid
				end

				def seeks read
					inode, seek = @@store[ :seeks][@sid]
					@@store[ :seeks][@sid] = [inode, read + seek]
				end
			end

			class Line
				include Base
				attr_reader :sid, :delimiter, :buffer, :linebuffer

				def initialize sid, delimiter = nil
					@sid, @delimiter = sid, delimiter || "\n"
					@delimiter = Regexp.new "^.*?#{@delimiter}"
					@buffer, @linebuffer = Select::Buffer.new( ''), Select::Buffer.new( '')
				end

				def event_read str, sock = nil
					@buffer += str
					@buffer.each! @delimiter, &method( :event_line)
				end

				def event_line line
					emit line
					seeks line.length
				end
			end

			class Multiline < Line
				def initialize sid, delimiter = nil, multiline = nil
					super sid, delimiter
					@multiline = multiline || /^\d\d-\d\d-\d\d:/
				end

				def event_line line
					if line =~ @multiline
						emit @linebuffer.to_s
						seeks @linebuffer.length
						@linebuffer.replace line
					else @linebuffer += line
					end
				end
			end
		end
	end
end