IFileStreambuf::IFileStreambuf(const std::string& filename)
{
+ // check this as PHYSFS seems to be buggy and still returns a
+ // valid pointer in this case
+ if(filename == "") {
+ throw std::runtime_error("Couldn't open file: empty filename");
+ }
file = PHYSFS_openRead(filename.c_str());
if(file == 0) {
std::stringstream msg;
if(PHYSFS_eof(file)) {
return traits_type::eof();
}
-
- PHYSFS_sint64 bytesread = (size_t) PHYSFS_read(file, buf, 1, sizeof(buf));
+
+ PHYSFS_sint64 bytesread = PHYSFS_read(file, buf, 1, sizeof(buf));
if(bytesread <= 0) {
return traits_type::eof();
}
{
off_type pos = off;
PHYSFS_sint64 ptell = PHYSFS_tell(file);
-
+
switch(dir) {
case std::ios_base::beg:
break;
<< PHYSFS_getLastError();
throw std::runtime_error(msg.str());
}
-
+
setp(buf, buf+sizeof(buf));
}
int
OFileStreambuf::overflow(int c)
{
+ char c2 = (char)c;
+
if(pbase() == pptr())
return 0;
PHYSFS_sint64 res = PHYSFS_write(file, pbase(), 1, size);
if(res <= 0)
return traits_type::eof();
-
+
if(c != traits_type::eof()) {
- PHYSFS_sint64 res = PHYSFS_write(file, &c, 1, 1);
+ PHYSFS_sint64 res = PHYSFS_write(file, &c2, 1, 1);
if(res <= 0)
return traits_type::eof();
}
{
delete rdbuf();
}
-