1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* lib/csv.rb: Fixed a bug in read_to_char() that would slurp

whole files if the encoding was invalid.  It will now read
  up to 10 bytes ahead to find a valid character boundary or
  give up.  [ruby-core:19465]
* test/csv/test_features.rb, test/csv/test_table.rb, test/csv/test_row.rb:
  Loosened some tests to check for a compatible? Encoding instea
  of an exact Encoding.  [ruby-core:19470]



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19931 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
jeg2 2008-10-25 00:54:38 +00:00
parent 7222e82a8b
commit dfda5877ca
5 changed files with 33 additions and 14 deletions

View file

@ -199,7 +199,7 @@ require "stringio"
#
class CSV
# The version of the installed library.
VERSION = "2.4.3".freeze
VERSION = "2.4.4".freeze
#
# A CSV::Row is part Array and part Hash. It retains an order for the fields
@ -1551,7 +1551,7 @@ class CSV
end
@encoding ||= Encoding.default_internal || Encoding.default_external
#
# prepare for build safe regular expressions in the target encoding,
# prepare for building safe regular expressions in the target encoding,
# if we can transcode the needed characters
#
@re_esc = "\\".encode(@encoding) rescue ""
@ -2251,10 +2251,11 @@ class CSV
end
#
# Reads at least +bytes+ from <tt>@io</tt>, but will read on until the data
# read is valid in the ecoding of that data. This should ensure that it is
# safe to use regular expressions on the read data. The read data will be
# returned in <tt>@encoding</tt>.
# Reads at least +bytes+ from <tt>@io</tt>, but will read up 10 bytes ahead if
# needed to ensure the data read is valid in the ecoding of that data. This
# should ensure that it is safe to use regular expressions on the read data,
# unless it is actually a broken encoding. The read data will be returned in
# <tt>@encoding</tt>.
#
def read_to_char(bytes)
return "" if @io.eof?
@ -2264,10 +2265,12 @@ class CSV
raise unless encoded.valid_encoding?
return encoded
rescue # encoding error or my invalid data raise
if @io.eof?
if @io.eof? or data.size >= bytes + 10
return data
else
data += @io.read(1) until data.valid_encoding? or @io.eof?
data += @io.read(1) until data.valid_encoding? or
@io.eof? or
data.size >= bytes + 10
retry
end
end