Endian safety in all savegame chunks except statefiles.
This commit is contained in:
+30
-20
@@ -49,41 +49,51 @@ read_8 (void *fp, BYTE *v)
|
|||||||
static inline size_t
|
static inline size_t
|
||||||
read_16 (void *fp, UWORD *v)
|
read_16 (void *fp, UWORD *v)
|
||||||
{
|
{
|
||||||
UWORD t;
|
UWORD t = 0;
|
||||||
if (!v) /* read value ignored */
|
int shift, i;
|
||||||
v = &t;
|
for (i = 0, shift = 0; i < 2; ++i, shift += 8)
|
||||||
return ReadResFile (v, 2, 1, fp);
|
{
|
||||||
|
BYTE b;
|
||||||
|
if (read_8 (fp, &b) != 1)
|
||||||
|
return 0;
|
||||||
|
t |= ((UWORD)b) << shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v)
|
||||||
|
*v = t;
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline size_t
|
static inline size_t
|
||||||
read_16s (void *fp, SWORD *v)
|
read_16s (void *fp, SWORD *v)
|
||||||
{
|
{
|
||||||
SWORD t;
|
return read_16 (fp, v);
|
||||||
if (!v) /* read value ignored */
|
|
||||||
v = &t;
|
|
||||||
return ReadResFile (v, 2, 1, fp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline size_t
|
static inline size_t
|
||||||
read_32 (void *fp, DWORD *v)
|
read_32 (void *fp, DWORD *v)
|
||||||
{
|
{
|
||||||
DWORD t;
|
DWORD t = 0;
|
||||||
if (!v) /* read value ignored */
|
int shift, i;
|
||||||
v = &t;
|
for (i = 0, shift = 0; i < 4; ++i, shift += 8)
|
||||||
return ReadResFile (v, 4, 1, fp);
|
{
|
||||||
|
BYTE b;
|
||||||
|
if (read_8 (fp, &b) != 1)
|
||||||
|
return 0;
|
||||||
|
t |= ((DWORD)b) << shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (v)
|
||||||
|
*v = t;
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline size_t
|
static inline size_t
|
||||||
read_32s (void *fp, SDWORD *v)
|
read_32s (void *fp, SDWORD *v)
|
||||||
{
|
{
|
||||||
DWORD t;
|
return read_32 (fp, v);
|
||||||
COUNT ret;
|
|
||||||
// value was converted to unsigned when saved
|
|
||||||
ret = read_32 (fp, &t);
|
|
||||||
// unsigned to signed conversion
|
|
||||||
if (v)
|
|
||||||
*v = t;
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline size_t
|
static inline size_t
|
||||||
|
|||||||
+6
-6
@@ -64,17 +64,17 @@ write_8 (void *fp, BYTE v)
|
|||||||
static inline void
|
static inline void
|
||||||
write_16 (void *fp, UWORD v)
|
write_16 (void *fp, UWORD v)
|
||||||
{
|
{
|
||||||
if (io_ok)
|
write_8 (fp, (BYTE)( v & 0xff));
|
||||||
if (WriteResFile (&v, 2, 1, fp) != 1)
|
write_8 (fp, (BYTE)((v >> 8) & 0xff));
|
||||||
io_ok = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
write_32 (void *fp, DWORD v)
|
write_32 (void *fp, DWORD v)
|
||||||
{
|
{
|
||||||
if (io_ok)
|
write_8 (fp, (BYTE)( v & 0xff));
|
||||||
if (WriteResFile (&v, 4, 1, fp) != 1)
|
write_8 (fp, (BYTE)((v >> 8) & 0xff));
|
||||||
io_ok = FALSE;
|
write_8 (fp, (BYTE)((v >> 16) & 0xff));
|
||||||
|
write_8 (fp, (BYTE)((v >> 24) & 0xff));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
|||||||
Reference in New Issue
Block a user