2006-08-04 14:05:50 -04:00
|
|
|
# TruncatedDataError is raised when IO#readbytes fails to read enough data.
|
1999-08-13 01:45:20 -04:00
|
|
|
|
|
|
|
class TruncatedDataError<IOError
|
2006-08-04 14:05:50 -04:00
|
|
|
def initialize(mesg, data) # :nodoc:
|
1999-08-13 01:45:20 -04:00
|
|
|
@data = data
|
|
|
|
super(mesg)
|
|
|
|
end
|
2006-08-04 14:05:50 -04:00
|
|
|
|
|
|
|
# The read portion of an IO#readbytes attempt.
|
1999-08-13 01:45:20 -04:00
|
|
|
attr_reader :data
|
|
|
|
end
|
|
|
|
|
|
|
|
class IO
|
2006-08-04 14:05:50 -04:00
|
|
|
# Reads exactly +n+ bytes.
|
|
|
|
#
|
|
|
|
# If the data read is nil an EOFError is raised.
|
|
|
|
#
|
|
|
|
# If the data read is too short a TruncatedDataError is raised and the read
|
|
|
|
# data is obtainable via its #data method.
|
1999-08-13 01:45:20 -04:00
|
|
|
def readbytes(n)
|
|
|
|
str = read(n)
|
|
|
|
if str == nil
|
|
|
|
raise EOFError, "End of file reached"
|
|
|
|
end
|
|
|
|
if str.size < n
|
|
|
|
raise TruncatedDataError.new("data truncated", str)
|
|
|
|
end
|
|
|
|
str
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if __FILE__ == $0
|
|
|
|
begin
|
|
|
|
loop do
|
|
|
|
print STDIN.readbytes(6)
|
|
|
|
end
|
|
|
|
rescue TruncatedDataError
|
|
|
|
p $!.data
|
|
|
|
raise
|
|
|
|
end
|
|
|
|
end
|