diff options
author | Torbjörn Andersson | 2003-07-03 07:03:18 +0000 |
---|---|---|
committer | Torbjörn Andersson | 2003-07-03 07:03:18 +0000 |
commit | 7404d5662d3f624f519ab540b52932f7b7630d93 (patch) | |
tree | 021f8a023dd8e39ac450b427e0af64393e4e7d5d | |
parent | cd04361fb7ddf9d86469d7151f2de619ec678705 (diff) | |
download | scummvm-rg350-7404d5662d3f624f519ab540b52932f7b7630d93.tar.gz scummvm-rg350-7404d5662d3f624f519ab540b52932f7b7630d93.tar.bz2 scummvm-rg350-7404d5662d3f624f519ab540b52932f7b7630d93.zip |
Made read() return the number of bytes that were actually read, rather than
the number that was requested. A lot of our code obviously assumes this
behaviour, and the MP3 file player depends on it because otherwise, when
reaching the end of the file, it will think it read a full buffer, when in
fact it only got part of it and the rest is the remains from the previous
read.
This would cause a brief note from earlier in the track at the end of the
MI1 chapter one screen. Probably other cases as well.
Of course, this may cause regressions but only - I think - if the code was
buggy to begin with.
svn-id: r8721
-rw-r--r-- | common/file.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/common/file.cpp b/common/file.cpp index d352715273..635d9ddfc2 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -216,6 +216,7 @@ void File::seek(int32 offs, int whence) { uint32 File::read(void *ptr, uint32 len) { byte *ptr2 = (byte *)ptr; + uint32 real_len; if (_handle == NULL) { error("File is not open!"); @@ -225,19 +226,20 @@ uint32 File::read(void *ptr, uint32 len) { if (len == 0) return 0; - if ((uint32)fread(ptr2, 1, len, _handle) != len) { + real_len = fread(ptr2, 1, len, _handle); + if (real_len < len) { clearerr(_handle); _ioFailed = true; } if (_encbyte != 0) { - uint32 t_size = len; + uint32 t_size = real_len; do { *ptr2++ ^= _encbyte; } while (--t_size); } - return len; + return real_len; } byte File::readByte() { |