Mercurial > hg > early-roguelike
diff xrogue/state.c @ 207:3def5e487faa
XRogue: fix md_htonl() and md_ntohl().
xcrypt requires them. The implementations in state.c used htonl() and
ntohl(), which aren't available on Windows. So the Advanced Rogue 7
versions were copied over.
This implementation could be problematic on other systems where
sizeof(long) == 8. Maybe someday I can convert everything to C99 and
use stdint.h.
author | John "Elwin" Edwards |
---|---|
date | Thu, 13 Aug 2015 17:17:40 -0400 |
parents | a3d90e31a001 |
children | f54901b9c39b |
line wrap: on
line diff
--- a/xrogue/state.c Thu Aug 13 15:15:21 2015 -0400 +++ b/xrogue/state.c Thu Aug 13 17:17:40 2015 -0400 @@ -3327,18 +3327,38 @@ return(killchar()); } -long -md_ntohl(netlong) -long netlong; +int md_endian = 0x01020304; + +unsigned long int +md_ntohl(unsigned long int x) { - return( ntohl(netlong) ); +#ifdef _WIN32 + if ( *((char *)&md_endian) == 0x01 ) + return(x); + else + return( ((x & 0x000000ffU) << 24) | + ((x & 0x0000ff00U) << 8) | + ((x & 0x00ff0000U) >> 8) | + ((x & 0xff000000U) >> 24) ); +#else + return( ntohl(x) ); +#endif } -long -md_htonl(netlong) -long netlong; +unsigned long int +md_htonl(unsigned long int x) { - return(htonl(netlong)); +#ifdef _WIN32 + if ( *((char *)&md_endian) == 0x01 ) + return(x); + else + return( ((x & 0x000000ffU) << 24) | + ((x & 0x0000ff00U) << 8) | + ((x & 0x00ff0000U) >> 8) | + ((x & 0xff000000U) >> 24) ); +#else + return( htonl(x) ); +#endif } void @@ -3493,4 +3513,3 @@ return(unlink(file)); #endif } -