Endian safety in all savegame chunks except statefiles.

This commit is contained in:
Michael Martin
2013-10-13 16:36:41 -07:00
parent 634ec1ae7d
commit e7d30008a2
2 changed files with 36 additions and 26 deletions
+30 -20
View File
@@ -49,41 +49,51 @@ read_8 (void *fp, BYTE *v)
static inline size_t
read_16 (void *fp, UWORD *v)
{
UWORD t;
if (!v) /* read value ignored */
v = &t;
return ReadResFile (v, 2, 1, fp);
UWORD t = 0;
int shift, i;
for (i = 0, shift = 0; i < 2; ++i, shift += 8)
{
BYTE b;
if (read_8 (fp, &b) != 1)
return 0;
t |= ((UWORD)b) << shift;
}
if (v)
*v = t;
return 1;
}
static inline size_t
read_16s (void *fp, SWORD *v)
{
SWORD t;
if (!v) /* read value ignored */
v = &t;
return ReadResFile (v, 2, 1, fp);
return read_16 (fp, v);
}
static inline size_t
read_32 (void *fp, DWORD *v)
{
DWORD t;
if (!v) /* read value ignored */
v = &t;
return ReadResFile (v, 4, 1, fp);
DWORD t = 0;
int shift, i;
for (i = 0, shift = 0; i < 4; ++i, shift += 8)
{
BYTE b;
if (read_8 (fp, &b) != 1)
return 0;
t |= ((DWORD)b) << shift;
}
if (v)
*v = t;
return 1;
}
static inline size_t
read_32s (void *fp, SDWORD *v)
{
DWORD t;
COUNT ret;
// value was converted to unsigned when saved
ret = read_32 (fp, &t);
// unsigned to signed conversion
if (v)
*v = t;
return ret;
return read_32 (fp, v);
}
static inline size_t
+6 -6
View File
@@ -64,17 +64,17 @@ write_8 (void *fp, BYTE v)
static inline void
write_16 (void *fp, UWORD v)
{
if (io_ok)
if (WriteResFile (&v, 2, 1, fp) != 1)
io_ok = FALSE;
write_8 (fp, (BYTE)( v & 0xff));
write_8 (fp, (BYTE)((v >> 8) & 0xff));
}
static inline void
write_32 (void *fp, DWORD v)
{
if (io_ok)
if (WriteResFile (&v, 4, 1, fp) != 1)
io_ok = FALSE;
write_8 (fp, (BYTE)( v & 0xff));
write_8 (fp, (BYTE)((v >> 8) & 0xff));
write_8 (fp, (BYTE)((v >> 16) & 0xff));
write_8 (fp, (BYTE)((v >> 24) & 0xff));
}
static inline void