mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-19 08:25:35 +00:00
Added new StdioStream class, a thin wrapper around FILE
svn-id: r34300
This commit is contained in:
parent
2d36c08d9f
commit
8246582f5e
@ -558,4 +558,66 @@ void DumpFile::flush() {
|
||||
}
|
||||
|
||||
|
||||
StdioStream::StdioStream(void *handle) : _handle(handle) {
|
||||
assert(handle);
|
||||
}
|
||||
|
||||
StdioStream::~StdioStream() {
|
||||
fclose((FILE *)_handle);
|
||||
}
|
||||
|
||||
bool StdioStream::ioFailed() const {
|
||||
return ferror((FILE *)_handle) != 0;
|
||||
}
|
||||
|
||||
void StdioStream::clearIOFailed() {
|
||||
clearerr((FILE *)_handle);
|
||||
}
|
||||
|
||||
bool StdioStream::eos() const {
|
||||
return feof((FILE *)_handle) != 0;
|
||||
}
|
||||
|
||||
uint32 StdioStream::pos() const {
|
||||
// FIXME: ftell can return -1 to indicate an error (in which case errno gets set)
|
||||
// Maybe we should support that, too?
|
||||
return ftell((FILE *)_handle);
|
||||
}
|
||||
|
||||
uint32 StdioStream::size() const {
|
||||
uint32 oldPos = ftell((FILE *)_handle);
|
||||
fseek((FILE *)_handle, 0, SEEK_END);
|
||||
uint32 length = ftell((FILE *)_handle);
|
||||
fseek((FILE *)_handle, oldPos, SEEK_SET);
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
void StdioStream::seek(int32 offs, int whence) {
|
||||
assert(_handle);
|
||||
|
||||
if (fseek((FILE *)_handle, offs, whence) != 0)
|
||||
clearerr((FILE *)_handle); // FIXME: why do we call clearerr here?
|
||||
|
||||
// FIXME: fseek has a return value to indicate errors;
|
||||
// Maybe we should support that, too?
|
||||
}
|
||||
|
||||
uint32 StdioStream::read(void *ptr, uint32 len) {
|
||||
return (uint32)fread((byte *)ptr, 1, len, (FILE *)_handle);
|
||||
}
|
||||
|
||||
uint32 StdioStream::write(const void *ptr, uint32 len) {
|
||||
return (uint32)fwrite(ptr, 1, len, (FILE *)_handle);
|
||||
}
|
||||
|
||||
void StdioStream::flush() {
|
||||
// TODO: Should check the return value of fflush, and if it is non-zero,
|
||||
// check errno and set an error flag.
|
||||
fflush((FILE *)_handle);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
} // End of namespace Common
|
||||
|
@ -154,6 +154,28 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class StdioStream : public SeekableReadStream, public WriteStream, public NonCopyable {
|
||||
protected:
|
||||
/** File handle to the actual file. */
|
||||
void *_handle;
|
||||
|
||||
public:
|
||||
StdioStream(void *handle);
|
||||
virtual ~StdioStream();
|
||||
|
||||
bool ioFailed() const;
|
||||
void clearIOFailed();
|
||||
bool eos() const;
|
||||
|
||||
virtual uint32 write(const void *dataPtr, uint32 dataSize);
|
||||
virtual void flush();
|
||||
|
||||
virtual uint32 pos() const;
|
||||
virtual uint32 size() const;
|
||||
void seek(int32 offs, int whence = SEEK_SET);
|
||||
uint32 read(void *dataPtr, uint32 dataSize);
|
||||
};
|
||||
|
||||
} // End of namespace Common
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user