From 6a9ba9ef724869d7196f4d09529dfb87799da838 Mon Sep 17 00:00:00 2001 From: Ingo Ruhnke Date: Wed, 18 Nov 2009 03:00:55 +0000 Subject: [PATCH] Split physfs/physfs_stream.?pp into multiple files SVN-Revision: 6024 --- src/lisp/parser.cpp | 3 +- src/lisp/writer.cpp | 2 +- src/physfs/ifile_stream.cpp | 31 ++++++++ src/physfs/ifile_stream.hpp | 32 +++++++++ .../{physfs_stream.cpp => ifile_streambuf.cpp} | 82 +--------------------- .../{physfs_stream.hpp => ifile_streambuf.hpp} | 39 +--------- src/physfs/ofile_stream.cpp | 36 ++++++++++ src/physfs/ofile_stream.hpp | 32 +++++++++ src/physfs/ofile_streambuf.cpp | 71 +++++++++++++++++++ src/physfs/ofile_streambuf.hpp | 44 ++++++++++++ src/scripting/functions.cpp | 2 +- src/scripting/squirrel_util.cpp | 2 +- src/supertux/console.cpp | 3 +- src/supertux/sector.cpp | 2 +- src/supertux/world.cpp | 2 +- src/worldmap/worldmap.cpp | 2 +- 16 files changed, 261 insertions(+), 124 deletions(-) create mode 100644 src/physfs/ifile_stream.cpp create mode 100644 src/physfs/ifile_stream.hpp rename src/physfs/{physfs_stream.cpp => ifile_streambuf.cpp} (63%) rename src/physfs/{physfs_stream.hpp => ifile_streambuf.hpp} (66%) create mode 100644 src/physfs/ofile_stream.cpp create mode 100644 src/physfs/ofile_stream.hpp create mode 100644 src/physfs/ofile_streambuf.cpp create mode 100644 src/physfs/ofile_streambuf.hpp 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/physfs_stream.cpp b/src/physfs/ifile_streambuf.cpp similarity index 63% rename from src/physfs/physfs_stream.cpp rename to src/physfs/ifile_streambuf.cpp index 48bc10c28..3d488ea41 100644 --- a/src/physfs/physfs_stream.cpp +++ b/src/physfs/ifile_streambuf.cpp @@ -14,13 +14,10 @@ // 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 "physfs/ifile_streambuf.hpp" -#include - -#include -#include #include +#include IFileStreambuf::IFileStreambuf(const std::string& filename) : file() @@ -101,79 +98,4 @@ IFileStreambuf::seekoff(off_type off, std::ios_base::seekdir dir, 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/ifile_streambuf.hpp similarity index 66% rename from src/physfs/physfs_stream.hpp rename to src/physfs/ifile_streambuf.hpp index e5f727603..aa28eb9b7 100644 --- a/src/physfs/physfs_stream.hpp +++ b/src/physfs/ifile_streambuf.hpp @@ -14,10 +14,10 @@ // 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 +#ifndef HEADER_SUPERTUX_PHYSFS_IFILE_STREAMBUF_HPP +#define HEADER_SUPERTUX_PHYSFS_IFILE_STREAMBUF_HPP -#include +#include #include /** This class implements a C++ streambuf object for physfs files. @@ -44,39 +44,6 @@ private: 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/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/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" -- 2.11.0