Savestate tm differently for crossplat.

Especially Linux 32/64, but really all are nice.
This commit is contained in:
Unknown W. Brackets committed 2013-10-06 22:09:51 -07:00
1 parent 0ec09f9700
commit 607f19b6a4
2 files changed
+40 -1

No files matched your search

+38 -1
View File
@@ -75,7 +75,10 @@ void PointerWrap::DoVoid(void *data, int size) {
case MODE_READ: memcpy(data, *ptr, size); break;
case MODE_WRITE: memcpy(*ptr, data, size); break;
case MODE_MEASURE: break; // MODE_MEASURE - don't need to do anything
case MODE_VERIFY: for(int i = 0; i < size; i++) _dbg_assert_msg_(COMMON, ((u8*)data)[i] == (*ptr)[i], "Savestate verification failure: %d (0x%X) (at %p) != %d (0x%X) (at %p).\n", ((u8*)data)[i], ((u8*)data)[i], &((u8*)data)[i], (*ptr)[i], (*ptr)[i], &(*ptr)[i]); break;
case MODE_VERIFY:
for (int i = 0; i < size; i++)
_dbg_assert_msg_(COMMON, ((u8*)data)[i] == (*ptr)[i], "Savestate verification failure: %d (0x%X) (at %p) != %d (0x%X) (at %p).\n", ((u8*)data)[i], ((u8*)data)[i], &((u8*)data)[i], (*ptr)[i], (*ptr)[i], &(*ptr)[i]);
break;
default: break; // throw an error?
}
(*ptr) += size;
@@ -107,6 +110,40 @@ void PointerWrap::Do(std::wstring &x) {
(*ptr) += stringLen;
}
struct standard_tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
void PointerWrap::Do(tm &t) {
// We savestate this separately because some platforms use extra data at the end.
// However, old files may have the native tm in them.
// Since the first value in the struct is 0-59, we save a funny value and check for it.
// If our funny value ('tm' 0x1337) exists, it's a new version savestate.
int funnyValue = 0x13376D74;
if (ExpectVoid(&funnyValue, sizeof(funnyValue))) {
standard_tm stm;
if (mode == MODE_READ) {
// Null out the extra members, e.g. tm_gmtoff or tm_zone.
memset(&t, 0, sizeof(t));
} else {
memcpy(&stm, &t, sizeof(stm));
}
DoVoid((void *)&stm, sizeof(stm));
memcpy(&t, &stm, sizeof(stm));
} else {
DoVoid((void *)&t, sizeof(t));
}
}
void PointerWrap::DoMarker(const char *prevName, u32 arbitraryNumber) {
u32 cookie = arbitraryNumber;
Do(cookie);