X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fphysfs%2Fphysfs_stream.cpp;h=28d92c567a632085a65a5bb7ee3beb8c9b879111;hb=43db9a6c44b6ee544e7694d1bb234ba559b0849c;hp=c054ccf94a942b6fef89f9ad038355bfa76b0122;hpb=795f0b283fcb1c8777723dc1cc850826d39c6806;p=supertux.git diff --git a/src/physfs/physfs_stream.cpp b/src/physfs/physfs_stream.cpp index c054ccf94..28d92c567 100644 --- a/src/physfs/physfs_stream.cpp +++ b/src/physfs/physfs_stream.cpp @@ -1,23 +1,25 @@ -/* -Copyright (C) 2005 Matthias Braun - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -*/ +// $Id$ +// +// SuperTux +// Copyright (C) 2006 Matthias Braun +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + #include -#include "physfs_stream.h" +#include "physfs_stream.hpp" #include #include @@ -26,6 +28,11 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 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; @@ -46,8 +53,8 @@ IFileStreambuf::underflow() 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(); } @@ -74,7 +81,7 @@ IFileStreambuf::seekoff(off_type off, std::ios_base::seekdir dir, { off_type pos = off; PHYSFS_sint64 ptell = PHYSFS_tell(file); - + switch(dir) { case std::ios_base::beg: break; @@ -108,7 +115,7 @@ OFileStreambuf::OFileStreambuf(const std::string& filename) << PHYSFS_getLastError(); throw std::runtime_error(msg.str()); } - + setp(buf, buf+sizeof(buf)); } @@ -121,6 +128,8 @@ OFileStreambuf::~OFileStreambuf() int OFileStreambuf::overflow(int c) { + char c2 = (char)c; + if(pbase() == pptr()) return 0; @@ -128,9 +137,9 @@ OFileStreambuf::overflow(int c) 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(); } @@ -168,4 +177,3 @@ OFileStream::~OFileStream() { delete rdbuf(); } -