From 98cb5a4ecdbf417346f94a8dc2250740b07e37d2 Mon Sep 17 00:00:00 2001 From: Stephen Anthony Date: Fri, 31 May 2019 11:38:19 -0230 Subject: [PATCH] Update recent commit to use C++ functionality (unique_ptr and streams). - fixes compile error in Linux and some libretro builds - fixes issue #485 --- src/common/RewindManager.cxx | 38 +++++++++++------------------------- src/common/StateManager.cxx | 2 +- src/emucore/CartCTY.cxx | 2 +- src/emucore/Serializer.cxx | 11 +++++++---- src/emucore/Serializer.hxx | 5 ++++- 5 files changed, 24 insertions(+), 34 deletions(-) diff --git a/src/common/RewindManager.cxx b/src/common/RewindManager.cxx index 7c812414c..cb52212a2 100644 --- a/src/common/RewindManager.cxx +++ b/src/common/RewindManager.cxx @@ -223,7 +223,6 @@ uInt32 RewindManager::windStates(uInt32 numStates, bool unwind) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - string RewindManager::saveAllStates() { - uInt8* buffer = NULL; try { ostringstream buf; @@ -231,15 +230,9 @@ string RewindManager::saveAllStates() << myOSystem.console().properties().get(PropType::Cart_Name) << ".sta"; - // Truncate existing file to 0 - FILE* fp; - errno_t err = fopen_s(&fp, buf.str().c_str(), "w"); - // Make sure the file can be opened for writing - if (err != NULL) + Serializer out(buf.str(), Serializer::Mode::ReadWriteTrunc); + if (!out) return "Can't save to all states file"; - fclose(fp); - - Serializer out(buf.str()); int numStates = rewindStates(1000) + 1; // Save header @@ -248,7 +241,7 @@ string RewindManager::saveAllStates() out.putShort(numStates); out.putInt(myStateSize); - buffer = new uInt8[myStateSize]; + unique_ptr buffer = make_unique(myStateSize); for (int i = 0; i < numStates; i++) { RewindState& state = myStateList.current(); @@ -256,15 +249,14 @@ string RewindManager::saveAllStates() // Rewind Serializer internal buffers s.rewind(); // Save state - s.getByteArray(buffer, myStateSize); - out.putByteArray(buffer, myStateSize); + s.getByteArray(buffer.get(), myStateSize); + out.putByteArray(buffer.get(), myStateSize); out.putString(state.message); out.putLong(state.cycles); if (i < numStates) unwindStates(1); } - delete[] buffer; buf.str(""); buf << "Saved " << numStates << " states"; @@ -272,17 +264,13 @@ string RewindManager::saveAllStates() } catch (...) { - if (buffer) - delete[] buffer; - - return "Error loading all states"; + return "Error saving all states"; } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - string RewindManager::loadAllStates() { - uInt8* buffer = NULL; try { ostringstream buf; @@ -291,7 +279,7 @@ string RewindManager::loadAllStates() << ".sta"; // Make sure the file can be opened for reading - Serializer in(buf.str(), true); + Serializer in(buf.str(), Serializer::Mode::ReadOnly); if (!in) return "Can't load from all states file"; @@ -306,7 +294,7 @@ string RewindManager::loadAllStates() numStates = in.getShort(); myStateSize = in.getInt(); - buffer = new uInt8[myStateSize]; + unique_ptr buffer = make_unique(myStateSize); for (int i = 0; i < numStates; i++) { if (myStateList.full()) @@ -321,12 +309,11 @@ string RewindManager::loadAllStates() s.rewind(); // Fill new state with saved values - in.getByteArray(buffer, myStateSize); - s.putByteArray(buffer, myStateSize); + in.getByteArray(buffer.get(), myStateSize); + s.putByteArray(buffer.get(), myStateSize); state.message = in.getString(); state.cycles = in.getLong(); } - delete[] buffer; // initialize current state (parameters ignored) loadState(0, 0); @@ -337,10 +324,7 @@ string RewindManager::loadAllStates() } catch (...) { - if (buffer) - delete[] buffer; - - return "Error saving all states"; + return "Error loading all states"; } } diff --git a/src/common/StateManager.cxx b/src/common/StateManager.cxx index e64cf891c..75d7cc2a3 100644 --- a/src/common/StateManager.cxx +++ b/src/common/StateManager.cxx @@ -212,7 +212,7 @@ void StateManager::loadState(int slot) << ".st" << slot; // Make sure the file can be opened in read-only mode - Serializer in(buf.str(), true); + Serializer in(buf.str(), Serializer::Mode::ReadOnly); if(!in) { buf.str(""); diff --git a/src/emucore/CartCTY.cxx b/src/emucore/CartCTY.cxx index d0d00b3e5..e60ed920f 100644 --- a/src/emucore/CartCTY.cxx +++ b/src/emucore/CartCTY.cxx @@ -494,7 +494,7 @@ void CartridgeCTY::updateTune() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CartridgeCTY::loadScore(uInt8 index) { - Serializer serializer(myEEPROMFile, true); + Serializer serializer(myEEPROMFile, Serializer::Mode::ReadOnly); if(serializer) { uInt8 scoreRAM[256]; diff --git a/src/emucore/Serializer.cxx b/src/emucore/Serializer.cxx index b57bb5696..138b5e7c5 100644 --- a/src/emucore/Serializer.cxx +++ b/src/emucore/Serializer.cxx @@ -22,10 +22,10 @@ using std::ios; using std::ios_base; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Serializer::Serializer(const string& filename, bool readonly) +Serializer::Serializer(const string& filename, Mode m) : myStream(nullptr) { - if(readonly) + if(m == Mode::ReadOnly) { FilesystemNode node(filename); if(node.isFile() && node.isReadable()) @@ -51,7 +51,10 @@ Serializer::Serializer(const string& filename, bool readonly) fstream temp(filename, ios::out | ios::app); temp.close(); - unique_ptr str = make_unique(filename, ios::in | ios::out | ios::binary); + ios_base::openmode stream_mode = ios::in | ios::out | ios::binary; + if(m == Mode::ReadWriteTrunc) + stream_mode |= ios::trunc; + unique_ptr str = make_unique(filename, stream_mode); if(str && str->is_open()) { myStream = std::move(str); @@ -222,7 +225,7 @@ void Serializer::putDouble(double value) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Serializer::putString(const string& str) { - int len = int(str.length()); + uInt32 len = uInt32(str.length()); putInt(len); myStream->write(str.data(), len); } diff --git a/src/emucore/Serializer.hxx b/src/emucore/Serializer.hxx index 4ab23b47f..6dce4555d 100644 --- a/src/emucore/Serializer.hxx +++ b/src/emucore/Serializer.hxx @@ -34,6 +34,9 @@ */ class Serializer { + public: + enum class Mode { ReadOnly, ReadWrite, ReadWriteTrunc }; + public: /** Creates a new Serializer device for streaming binary data. @@ -46,7 +49,7 @@ class Serializer The valid() method must immediately be called to verify the stream was correctly initialized. */ - Serializer(const string& filename, bool readonly = false); + Serializer(const string& filename, Mode m = Mode::ReadWrite); Serializer(); public: