diff --git a/lib/csv.rb b/lib/csv.rb index 3b7fee8..b1f1b80 100644 --- a/lib/csv.rb +++ b/lib/csv.rb @@ -2110,8 +2110,6 @@ def initialize(data, strip: strip, } @parser = nil - @parser_enumerator = nil - @eof_error = nil @writer_options = { encoding: @encoding, @@ -2430,24 +2428,13 @@ def to_io end def eof? - return false if @eof_error - begin - parser_enumerator.peek - false - rescue MalformedCSVError => error - @eof_error = error - false - rescue StopIteration - true - end + parser.eof? end alias_method :eof, :eof? # Rewinds the underlying IO object and resets CSV's lineno() counter. def rewind @parser = nil - @parser_enumerator = nil - @eof_error = nil @writer.rewind if @writer @io.rewind end @@ -2687,13 +2674,7 @@ def header_convert(name = nil, &converter) # p row # end def each(&block) - return to_enum(__method__) unless block_given? - begin - while true - yield(parser_enumerator.next) - end - rescue StopIteration - end + parser.parse(&block) end # :call-seq: @@ -2801,15 +2782,10 @@ def header_row? # # Raises IOError (not opened for reading) # csv.shift def shift - if @eof_error - eof_error, @eof_error = @eof_error, nil - raise eof_error - end - begin - parser_enumerator.next - rescue StopIteration - nil + parser.parse do |row| + return row end + nil end alias_method :gets, :shift alias_method :readline, :shift @@ -2971,10 +2947,6 @@ def parser_options fields_converter: parser_fields_converter) end - def parser_enumerator - @parser_enumerator ||= parser.parse - end - def writer @writer ||= Writer.new(@io, writer_options) end diff --git a/lib/csv/parser.rb b/lib/csv/parser.rb index c508c8b..25f10df 100644 --- a/lib/csv/parser.rb +++ b/lib/csv/parser.rb @@ -181,7 +181,7 @@ def scan_all(pattern) end def eos? - @scanner.eos? + @last_scanner and @scanner.eos? end def keep_start @@ -444,6 +444,11 @@ def parse(&block) end end + def eof? + return false if @scanner.nil? + @scanner.eos? + end + def use_headers? @use_headers end