aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjörn Andersson2003-07-03 07:03:18 +0000
committerTorbjörn Andersson2003-07-03 07:03:18 +0000
commit7404d5662d3f624f519ab540b52932f7b7630d93 (patch)
tree021f8a023dd8e39ac450b427e0af64393e4e7d5d
parentcd04361fb7ddf9d86469d7151f2de619ec678705 (diff)
downloadscummvm-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.cpp8
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() {