From: Ingo Ruhnke Date: Wed, 18 Nov 2009 03:00:55 +0000 (+0000) Subject: Split physfs/physfs_stream.?pp into multiple files X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=6a9ba9ef724869d7196f4d09529dfb87799da838;p=supertux.git Split physfs/physfs_stream.?pp into multiple files SVN-Revision: 6024 --- diff --git a/src/lisp/parser.cpp b/src/lisp/parser.cpp index 294d9aa38..b921003bf 100644 --- a/src/lisp/parser.cpp +++ b/src/lisp/parser.cpp @@ -20,7 +20,8 @@ #include "lisp/lisp.hpp" #include "lisp/parser.hpp" #include "obstack/obstackpp.hpp" -#include "physfs/physfs_stream.hpp" +#include "physfs/ifile_stream.hpp" +#include "physfs/ifile_streambuf.hpp" #include "tinygettext/tinygettext.hpp" #include "supertux/gameconfig.hpp" diff --git a/src/lisp/writer.cpp b/src/lisp/writer.cpp index 5b4d8fba5..63c5aa781 100644 --- a/src/lisp/writer.cpp +++ b/src/lisp/writer.cpp @@ -16,7 +16,7 @@ #include "lisp/writer.hpp" -#include "physfs/physfs_stream.hpp" +#include "physfs/ofile_stream.hpp" #include "util/log.hpp" namespace lisp { diff --git a/src/physfs/ifile_stream.cpp b/src/physfs/ifile_stream.cpp new file mode 100644 index 000000000..4a09394dc --- /dev/null +++ b/src/physfs/ifile_stream.cpp @@ -0,0 +1,31 @@ +// 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 3 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, see . + +#include "physfs/ifile_stream.hpp" + +#include "physfs/ifile_streambuf.hpp" + +IFileStream::IFileStream(const std::string& filename) : + std::istream(new IFileStreambuf(filename)) +{ +} + +IFileStream::~IFileStream() +{ + delete rdbuf(); +} + +/* EOF */ diff --git a/src/physfs/ifile_stream.hpp b/src/physfs/ifile_stream.hpp new file mode 100644 index 000000000..263e44dbe --- /dev/null +++ b/src/physfs/ifile_stream.hpp @@ -0,0 +1,32 @@ +// 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 3 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, see . + +#ifndef HEADER_SUPERTUX_PHYSFS_IFILE_STREAM_HPP +#define HEADER_SUPERTUX_PHYSFS_IFILE_STREAM_HPP + +#include +#include + +class IFileStream : public std::istream +{ +public: + IFileStream(const std::string& filename); + ~IFileStream(); +}; + +#endif + +/* EOF */ diff --git a/src/physfs/ifile_streambuf.cpp b/src/physfs/ifile_streambuf.cpp new file mode 100644 index 000000000..3d488ea41 --- /dev/null +++ b/src/physfs/ifile_streambuf.cpp @@ -0,0 +1,101 @@ +// 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 3 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, see . + +#include "physfs/ifile_streambuf.hpp" + +#include +#include + +IFileStreambuf::IFileStreambuf(const std::string& filename) : + file() +{ + // 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; + msg << "Couldn't open file '" << filename << "': " + << PHYSFS_getLastError(); + throw std::runtime_error(msg.str()); + } +} + +IFileStreambuf::~IFileStreambuf() +{ + PHYSFS_close(file); +} + +int +IFileStreambuf::underflow() +{ + if(PHYSFS_eof(file)) { + return traits_type::eof(); + } + + PHYSFS_sint64 bytesread = PHYSFS_read(file, buf, 1, sizeof(buf)); + if(bytesread <= 0) { + return traits_type::eof(); + } + setg(buf, buf, buf + bytesread); + + return buf[0]; +} + +IFileStreambuf::pos_type +IFileStreambuf::seekpos(pos_type pos, std::ios_base::openmode) +{ + if(PHYSFS_seek(file, static_cast (pos)) == 0) { + return pos_type(off_type(-1)); + } + + // the seek invalidated the buffer + setg(buf, buf, buf); + return pos; +} + +IFileStreambuf::pos_type +IFileStreambuf::seekoff(off_type off, std::ios_base::seekdir dir, + std::ios_base::openmode mode) +{ + off_type pos = off; + PHYSFS_sint64 ptell = PHYSFS_tell(file); + + switch(dir) { + case std::ios_base::beg: + break; + case std::ios_base::cur: + if(off == 0) + return static_cast (ptell) - static_cast (egptr() - gptr()); + pos += static_cast (ptell) - static_cast (egptr() - gptr()); + break; + case std::ios_base::end: + pos += static_cast (PHYSFS_fileLength(file)); + break; + default: +#ifdef DEBUG + assert(false); +#else + return pos_type(off_type(-1)); +#endif + } + + return seekpos(static_cast (pos), mode); +} + +/* EOF */ diff --git a/src/physfs/ifile_streambuf.hpp b/src/physfs/ifile_streambuf.hpp new file mode 100644 index 000000000..aa28eb9b7 --- /dev/null +++ b/src/physfs/ifile_streambuf.hpp @@ -0,0 +1,49 @@ +// 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 3 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, see . + +#ifndef HEADER_SUPERTUX_PHYSFS_IFILE_STREAMBUF_HPP +#define HEADER_SUPERTUX_PHYSFS_IFILE_STREAMBUF_HPP + +#include +#include + +/** This class implements a C++ streambuf object for physfs files. + * So that you can use normal istream operations on them + */ +class IFileStreambuf : public std::streambuf +{ +public: + IFileStreambuf(const std::string& filename); + ~IFileStreambuf(); + +protected: + virtual int underflow(); + virtual pos_type seekoff(off_type pos, std::ios_base::seekdir, + std::ios_base::openmode); + virtual pos_type seekpos(pos_type pos, std::ios_base::openmode); + +private: + PHYSFS_file* file; + char buf[1024]; + +private: + IFileStreambuf(const IFileStreambuf&); + IFileStreambuf& operator=(const IFileStreambuf&); +}; + +#endif + +/* EOF */ diff --git a/src/physfs/ofile_stream.cpp b/src/physfs/ofile_stream.cpp new file mode 100644 index 000000000..432bc94fa --- /dev/null +++ b/src/physfs/ofile_stream.cpp @@ -0,0 +1,36 @@ +// 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 3 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, see . + +#ifndef HEADER_SUPERTUX_PHYSFS_OFILE_STREAM_CPP +#define HEADER_SUPERTUX_PHYSFS_OFILE_STREAM_CPP + +#include "physfs/ofile_stream.hpp" + +#include "physfs/ofile_streambuf.hpp" + +OFileStream::OFileStream(const std::string& filename) : + std::ostream(new OFileStreambuf(filename)) +{ +} + +OFileStream::~OFileStream() +{ + delete rdbuf(); +} + +#endif + +/* EOF */ diff --git a/src/physfs/ofile_stream.hpp b/src/physfs/ofile_stream.hpp new file mode 100644 index 000000000..a5e8c88e1 --- /dev/null +++ b/src/physfs/ofile_stream.hpp @@ -0,0 +1,32 @@ +// 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 3 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, see . + +#ifndef HEADER_SUPERTUX_PHYSFS_OFILE_STREAM_HPP +#define HEADER_SUPERTUX_PHYSFS_OFILE_STREAM_HPP + +#include +#include + +class OFileStream : public std::ostream +{ +public: + OFileStream(const std::string& filename); + ~OFileStream(); +}; + +#endif + +/* EOF */ diff --git a/src/physfs/ofile_streambuf.cpp b/src/physfs/ofile_streambuf.cpp new file mode 100644 index 000000000..c496b621e --- /dev/null +++ b/src/physfs/ofile_streambuf.cpp @@ -0,0 +1,71 @@ +// 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 3 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, see . + +#include "physfs/ofile_streambuf.hpp" + +#include +#include + +OFileStreambuf::OFileStreambuf(const std::string& filename) : + file() +{ + file = PHYSFS_openWrite(filename.c_str()); + if(file == 0) { + std::stringstream msg; + msg << "Couldn't open file '" << filename << "': " + << PHYSFS_getLastError(); + throw std::runtime_error(msg.str()); + } + + setp(buf, buf+sizeof(buf)); +} + +OFileStreambuf::~OFileStreambuf() +{ + sync(); + PHYSFS_close(file); +} + +int +OFileStreambuf::overflow(int c) +{ + char c2 = (char)c; + + if(pbase() == pptr()) + return 0; + + size_t size = pptr() - pbase(); + 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, &c2, 1, 1); + if(res <= 0) + return traits_type::eof(); + } + + setp(buf, buf + res); + return 0; +} + +int +OFileStreambuf::sync() +{ + return overflow(traits_type::eof()); +} + +/* EOF */ diff --git a/src/physfs/ofile_streambuf.hpp b/src/physfs/ofile_streambuf.hpp new file mode 100644 index 000000000..0252553e5 --- /dev/null +++ b/src/physfs/ofile_streambuf.hpp @@ -0,0 +1,44 @@ +// 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 3 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, see . + +#ifndef HEADER_SUPERTUX_PHYSFS_OFILE_STREAMBUF_HPP +#define HEADER_SUPERTUX_PHYSFS_OFILE_STREAMBUF_HPP + +#include +#include + +class OFileStreambuf : public std::streambuf +{ +public: + OFileStreambuf(const std::string& filename); + ~OFileStreambuf(); + +protected: + virtual int overflow(int c); + virtual int sync(); + +private: + PHYSFS_file* file; + char buf[1024]; + +private: + OFileStreambuf(const OFileStreambuf&); + OFileStreambuf& operator=(const OFileStreambuf&); +}; + +#endif + +/* EOF */ diff --git a/src/physfs/physfs_stream.cpp b/src/physfs/physfs_stream.cpp deleted file mode 100644 index 48bc10c28..000000000 --- a/src/physfs/physfs_stream.cpp +++ /dev/null @@ -1,179 +0,0 @@ -// 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 3 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, see . - -#include "physfs/physfs_stream.hpp" - -#include - -#include -#include -#include - -IFileStreambuf::IFileStreambuf(const std::string& filename) : - file() -{ - // 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; - msg << "Couldn't open file '" << filename << "': " - << PHYSFS_getLastError(); - throw std::runtime_error(msg.str()); - } -} - -IFileStreambuf::~IFileStreambuf() -{ - PHYSFS_close(file); -} - -int -IFileStreambuf::underflow() -{ - if(PHYSFS_eof(file)) { - return traits_type::eof(); - } - - PHYSFS_sint64 bytesread = PHYSFS_read(file, buf, 1, sizeof(buf)); - if(bytesread <= 0) { - return traits_type::eof(); - } - setg(buf, buf, buf + bytesread); - - return buf[0]; -} - -IFileStreambuf::pos_type -IFileStreambuf::seekpos(pos_type pos, std::ios_base::openmode) -{ - if(PHYSFS_seek(file, static_cast (pos)) == 0) { - return pos_type(off_type(-1)); - } - - // the seek invalidated the buffer - setg(buf, buf, buf); - return pos; -} - -IFileStreambuf::pos_type -IFileStreambuf::seekoff(off_type off, std::ios_base::seekdir dir, - std::ios_base::openmode mode) -{ - off_type pos = off; - PHYSFS_sint64 ptell = PHYSFS_tell(file); - - switch(dir) { - case std::ios_base::beg: - break; - case std::ios_base::cur: - if(off == 0) - return static_cast (ptell) - static_cast (egptr() - gptr()); - pos += static_cast (ptell) - static_cast (egptr() - gptr()); - break; - case std::ios_base::end: - pos += static_cast (PHYSFS_fileLength(file)); - break; - default: -#ifdef DEBUG - assert(false); -#else - return pos_type(off_type(-1)); -#endif - } - - return seekpos(static_cast (pos), mode); -} - -//--------------------------------------------------------------------------- - -OFileStreambuf::OFileStreambuf(const std::string& filename) : - file() -{ - file = PHYSFS_openWrite(filename.c_str()); - if(file == 0) { - std::stringstream msg; - msg << "Couldn't open file '" << filename << "': " - << PHYSFS_getLastError(); - throw std::runtime_error(msg.str()); - } - - setp(buf, buf+sizeof(buf)); -} - -OFileStreambuf::~OFileStreambuf() -{ - sync(); - PHYSFS_close(file); -} - -int -OFileStreambuf::overflow(int c) -{ - char c2 = (char)c; - - if(pbase() == pptr()) - return 0; - - size_t size = pptr() - pbase(); - 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, &c2, 1, 1); - if(res <= 0) - return traits_type::eof(); - } - - setp(buf, buf + res); - return 0; -} - -int -OFileStreambuf::sync() -{ - return overflow(traits_type::eof()); -} - -//--------------------------------------------------------------------------- - -IFileStream::IFileStream(const std::string& filename) - : std::istream(new IFileStreambuf(filename)) -{ -} - -IFileStream::~IFileStream() -{ - delete rdbuf(); -} - -//--------------------------------------------------------------------------- - -OFileStream::OFileStream(const std::string& filename) - : std::ostream(new OFileStreambuf(filename)) -{ -} - -OFileStream::~OFileStream() -{ - delete rdbuf(); -} - -/* EOF */ diff --git a/src/physfs/physfs_stream.hpp b/src/physfs/physfs_stream.hpp deleted file mode 100644 index e5f727603..000000000 --- a/src/physfs/physfs_stream.hpp +++ /dev/null @@ -1,82 +0,0 @@ -// 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 3 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, see . - -#ifndef HEADER_SUPERTUX_PHYSFS_PHYSFS_STREAM_HPP -#define HEADER_SUPERTUX_PHYSFS_PHYSFS_STREAM_HPP - -#include -#include - -/** This class implements a C++ streambuf object for physfs files. - * So that you can use normal istream operations on them - */ -class IFileStreambuf : public std::streambuf -{ -public: - IFileStreambuf(const std::string& filename); - ~IFileStreambuf(); - -protected: - virtual int underflow(); - virtual pos_type seekoff(off_type pos, std::ios_base::seekdir, - std::ios_base::openmode); - virtual pos_type seekpos(pos_type pos, std::ios_base::openmode); - -private: - PHYSFS_file* file; - char buf[1024]; - -private: - IFileStreambuf(const IFileStreambuf&); - IFileStreambuf& operator=(const IFileStreambuf&); -}; - -class OFileStreambuf : public std::streambuf -{ -public: - OFileStreambuf(const std::string& filename); - ~OFileStreambuf(); - -protected: - virtual int overflow(int c); - virtual int sync(); - -private: - PHYSFS_file* file; - char buf[1024]; - -private: - OFileStreambuf(const OFileStreambuf&); - OFileStreambuf& operator=(const OFileStreambuf&); -}; - -class IFileStream : public std::istream -{ -public: - IFileStream(const std::string& filename); - ~IFileStream(); -}; - -class OFileStream : public std::ostream -{ -public: - OFileStream(const std::string& filename); - ~OFileStream(); -}; - -#endif - -/* EOF */ diff --git a/src/scripting/functions.cpp b/src/scripting/functions.cpp index 40c869c20..1f8ed9416 100644 --- a/src/scripting/functions.cpp +++ b/src/scripting/functions.cpp @@ -20,7 +20,7 @@ #include "math/random_generator.hpp" #include "object/camera.hpp" #include "object/player.hpp" -#include "physfs/physfs_stream.hpp" +#include "physfs/ifile_stream.hpp" #include "supertux/fadeout.hpp" #include "supertux/game_session.hpp" #include "supertux/gameconfig.hpp" diff --git a/src/scripting/squirrel_util.cpp b/src/scripting/squirrel_util.cpp index 0352d3901..b123f7600 100644 --- a/src/scripting/squirrel_util.cpp +++ b/src/scripting/squirrel_util.cpp @@ -25,7 +25,7 @@ #include #include -#include "physfs/physfs_stream.hpp" +#include "physfs/ifile_stream.hpp" #include "supertux/console.hpp" #include "util/log.hpp" diff --git a/src/supertux/console.cpp b/src/supertux/console.cpp index 83a78e64c..ce03f409a 100644 --- a/src/supertux/console.cpp +++ b/src/supertux/console.cpp @@ -17,8 +17,9 @@ #include "supertux/console.hpp" #include +#include -#include "physfs/physfs_stream.hpp" +#include "physfs/ifile_stream.hpp" #include "scripting/squirrel_util.hpp" #include "supertux/gameconfig.hpp" #include "supertux/main.hpp" diff --git a/src/supertux/sector.cpp b/src/supertux/sector.cpp index 73dc1e7ce..d2ea9b18c 100644 --- a/src/supertux/sector.cpp +++ b/src/supertux/sector.cpp @@ -43,7 +43,7 @@ #include "object/smoke_cloud.hpp" #include "object/text_object.hpp" #include "object/tilemap.hpp" -#include "physfs/physfs_stream.hpp" +#include "physfs/ifile_stream.hpp" #include "scripting/squirrel_util.hpp" #include "supertux/collision.hpp" #include "supertux/constants.hpp" diff --git a/src/supertux/world.cpp b/src/supertux/world.cpp index 2909226c3..acbd69023 100644 --- a/src/supertux/world.cpp +++ b/src/supertux/world.cpp @@ -16,7 +16,7 @@ #include "lisp/parser.hpp" #include "lisp/writer.hpp" -#include "physfs/physfs_stream.hpp" +#include "physfs/ifile_stream.hpp" #include "scripting/serialize.hpp" #include "scripting/squirrel_util.hpp" #include "supertux/mainloop.hpp" diff --git a/src/worldmap/worldmap.cpp b/src/worldmap/worldmap.cpp index 0b35c03af..1321dff76 100644 --- a/src/worldmap/worldmap.cpp +++ b/src/worldmap/worldmap.cpp @@ -37,7 +37,7 @@ #include "lisp/parser.hpp" #include "object/background.hpp" #include "object/tilemap.hpp" -#include "physfs/physfs_stream.hpp" +#include "physfs/ifile_stream.hpp" #include "scripting/squirrel_error.hpp" #include "scripting/squirrel_util.hpp" #include "sprite/sprite.hpp"