mirror of https://github.com/stella-emu/stella.git
Update recent commit to use C++ functionality (unique_ptr and streams).
- fixes compile error in Linux and some libretro builds - fixes issue #485
This commit is contained in:
parent
67db29e826
commit
98cb5a4ecd
|
@ -223,7 +223,6 @@ uInt32 RewindManager::windStates(uInt32 numStates, bool unwind)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
string RewindManager::saveAllStates()
|
string RewindManager::saveAllStates()
|
||||||
{
|
{
|
||||||
uInt8* buffer = NULL;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ostringstream buf;
|
ostringstream buf;
|
||||||
|
@ -231,15 +230,9 @@ string RewindManager::saveAllStates()
|
||||||
<< myOSystem.console().properties().get(PropType::Cart_Name)
|
<< myOSystem.console().properties().get(PropType::Cart_Name)
|
||||||
<< ".sta";
|
<< ".sta";
|
||||||
|
|
||||||
// Truncate existing file to 0
|
Serializer out(buf.str(), Serializer::Mode::ReadWriteTrunc);
|
||||||
FILE* fp;
|
if (!out)
|
||||||
errno_t err = fopen_s(&fp, buf.str().c_str(), "w");
|
|
||||||
// Make sure the file can be opened for writing
|
|
||||||
if (err != NULL)
|
|
||||||
return "Can't save to all states file";
|
return "Can't save to all states file";
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
Serializer out(buf.str());
|
|
||||||
|
|
||||||
int numStates = rewindStates(1000) + 1;
|
int numStates = rewindStates(1000) + 1;
|
||||||
// Save header
|
// Save header
|
||||||
|
@ -248,7 +241,7 @@ string RewindManager::saveAllStates()
|
||||||
out.putShort(numStates);
|
out.putShort(numStates);
|
||||||
out.putInt(myStateSize);
|
out.putInt(myStateSize);
|
||||||
|
|
||||||
buffer = new uInt8[myStateSize];
|
unique_ptr<uInt8[]> buffer = make_unique<uInt8[]>(myStateSize);
|
||||||
for (int i = 0; i < numStates; i++)
|
for (int i = 0; i < numStates; i++)
|
||||||
{
|
{
|
||||||
RewindState& state = myStateList.current();
|
RewindState& state = myStateList.current();
|
||||||
|
@ -256,15 +249,14 @@ string RewindManager::saveAllStates()
|
||||||
// Rewind Serializer internal buffers
|
// Rewind Serializer internal buffers
|
||||||
s.rewind();
|
s.rewind();
|
||||||
// Save state
|
// Save state
|
||||||
s.getByteArray(buffer, myStateSize);
|
s.getByteArray(buffer.get(), myStateSize);
|
||||||
out.putByteArray(buffer, myStateSize);
|
out.putByteArray(buffer.get(), myStateSize);
|
||||||
out.putString(state.message);
|
out.putString(state.message);
|
||||||
out.putLong(state.cycles);
|
out.putLong(state.cycles);
|
||||||
|
|
||||||
if (i < numStates)
|
if (i < numStates)
|
||||||
unwindStates(1);
|
unwindStates(1);
|
||||||
}
|
}
|
||||||
delete[] buffer;
|
|
||||||
|
|
||||||
buf.str("");
|
buf.str("");
|
||||||
buf << "Saved " << numStates << " states";
|
buf << "Saved " << numStates << " states";
|
||||||
|
@ -272,17 +264,13 @@ string RewindManager::saveAllStates()
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
if (buffer)
|
return "Error saving all states";
|
||||||
delete[] buffer;
|
|
||||||
|
|
||||||
return "Error loading all states";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
string RewindManager::loadAllStates()
|
string RewindManager::loadAllStates()
|
||||||
{
|
{
|
||||||
uInt8* buffer = NULL;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ostringstream buf;
|
ostringstream buf;
|
||||||
|
@ -291,7 +279,7 @@ string RewindManager::loadAllStates()
|
||||||
<< ".sta";
|
<< ".sta";
|
||||||
|
|
||||||
// Make sure the file can be opened for reading
|
// Make sure the file can be opened for reading
|
||||||
Serializer in(buf.str(), true);
|
Serializer in(buf.str(), Serializer::Mode::ReadOnly);
|
||||||
if (!in)
|
if (!in)
|
||||||
return "Can't load from all states file";
|
return "Can't load from all states file";
|
||||||
|
|
||||||
|
@ -306,7 +294,7 @@ string RewindManager::loadAllStates()
|
||||||
numStates = in.getShort();
|
numStates = in.getShort();
|
||||||
myStateSize = in.getInt();
|
myStateSize = in.getInt();
|
||||||
|
|
||||||
buffer = new uInt8[myStateSize];
|
unique_ptr<uInt8[]> buffer = make_unique<uInt8[]>(myStateSize);
|
||||||
for (int i = 0; i < numStates; i++)
|
for (int i = 0; i < numStates; i++)
|
||||||
{
|
{
|
||||||
if (myStateList.full())
|
if (myStateList.full())
|
||||||
|
@ -321,12 +309,11 @@ string RewindManager::loadAllStates()
|
||||||
s.rewind();
|
s.rewind();
|
||||||
|
|
||||||
// Fill new state with saved values
|
// Fill new state with saved values
|
||||||
in.getByteArray(buffer, myStateSize);
|
in.getByteArray(buffer.get(), myStateSize);
|
||||||
s.putByteArray(buffer, myStateSize);
|
s.putByteArray(buffer.get(), myStateSize);
|
||||||
state.message = in.getString();
|
state.message = in.getString();
|
||||||
state.cycles = in.getLong();
|
state.cycles = in.getLong();
|
||||||
}
|
}
|
||||||
delete[] buffer;
|
|
||||||
|
|
||||||
// initialize current state (parameters ignored)
|
// initialize current state (parameters ignored)
|
||||||
loadState(0, 0);
|
loadState(0, 0);
|
||||||
|
@ -337,10 +324,7 @@ string RewindManager::loadAllStates()
|
||||||
}
|
}
|
||||||
catch (...)
|
catch (...)
|
||||||
{
|
{
|
||||||
if (buffer)
|
return "Error loading all states";
|
||||||
delete[] buffer;
|
|
||||||
|
|
||||||
return "Error saving all states";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -212,7 +212,7 @@ void StateManager::loadState(int slot)
|
||||||
<< ".st" << slot;
|
<< ".st" << slot;
|
||||||
|
|
||||||
// Make sure the file can be opened in read-only mode
|
// 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)
|
if(!in)
|
||||||
{
|
{
|
||||||
buf.str("");
|
buf.str("");
|
||||||
|
|
|
@ -494,7 +494,7 @@ void CartridgeCTY::updateTune()
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void CartridgeCTY::loadScore(uInt8 index)
|
void CartridgeCTY::loadScore(uInt8 index)
|
||||||
{
|
{
|
||||||
Serializer serializer(myEEPROMFile, true);
|
Serializer serializer(myEEPROMFile, Serializer::Mode::ReadOnly);
|
||||||
if(serializer)
|
if(serializer)
|
||||||
{
|
{
|
||||||
uInt8 scoreRAM[256];
|
uInt8 scoreRAM[256];
|
||||||
|
|
|
@ -22,10 +22,10 @@ using std::ios;
|
||||||
using std::ios_base;
|
using std::ios_base;
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
Serializer::Serializer(const string& filename, bool readonly)
|
Serializer::Serializer(const string& filename, Mode m)
|
||||||
: myStream(nullptr)
|
: myStream(nullptr)
|
||||||
{
|
{
|
||||||
if(readonly)
|
if(m == Mode::ReadOnly)
|
||||||
{
|
{
|
||||||
FilesystemNode node(filename);
|
FilesystemNode node(filename);
|
||||||
if(node.isFile() && node.isReadable())
|
if(node.isFile() && node.isReadable())
|
||||||
|
@ -51,7 +51,10 @@ Serializer::Serializer(const string& filename, bool readonly)
|
||||||
fstream temp(filename, ios::out | ios::app);
|
fstream temp(filename, ios::out | ios::app);
|
||||||
temp.close();
|
temp.close();
|
||||||
|
|
||||||
unique_ptr<fstream> str = make_unique<fstream>(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<fstream> str = make_unique<fstream>(filename, stream_mode);
|
||||||
if(str && str->is_open())
|
if(str && str->is_open())
|
||||||
{
|
{
|
||||||
myStream = std::move(str);
|
myStream = std::move(str);
|
||||||
|
@ -222,7 +225,7 @@ void Serializer::putDouble(double value)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void Serializer::putString(const string& str)
|
void Serializer::putString(const string& str)
|
||||||
{
|
{
|
||||||
int len = int(str.length());
|
uInt32 len = uInt32(str.length());
|
||||||
putInt(len);
|
putInt(len);
|
||||||
myStream->write(str.data(), len);
|
myStream->write(str.data(), len);
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,9 @@
|
||||||
*/
|
*/
|
||||||
class Serializer
|
class Serializer
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
enum class Mode { ReadOnly, ReadWrite, ReadWriteTrunc };
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
Creates a new Serializer device for streaming binary data.
|
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
|
The valid() method must immediately be called to verify the stream
|
||||||
was correctly initialized.
|
was correctly initialized.
|
||||||
*/
|
*/
|
||||||
Serializer(const string& filename, bool readonly = false);
|
Serializer(const string& filename, Mode m = Mode::ReadWrite);
|
||||||
Serializer();
|
Serializer();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
Loading…
Reference in New Issue