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.
This commit is contained in:
John "Elwin" Edwards 2015-08-13 17:17:40 -04:00
parent b2ebcf72c9
commit 13f4a96d93
2 changed files with 31 additions and 9 deletions

View file

@ -3327,18 +3327,38 @@ md_killchar()
return(killchar()); return(killchar());
} }
long int md_endian = 0x01020304;
md_ntohl(netlong)
long netlong; 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 unsigned long int
md_htonl(netlong) md_htonl(unsigned long int x)
long netlong;
{ {
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 void
@ -3493,4 +3513,3 @@ md_unlink(char *file)
return(unlink(file)); return(unlink(file));
#endif #endif
} }

View file

@ -54,6 +54,9 @@
#define _PASSWORD_EFMT1 '_' #define _PASSWORD_EFMT1 '_'
unsigned long int md_htonl(unsigned long int x);
unsigned long int md_ntohl(unsigned long int x);
static unsigned char IP[64] = { static unsigned char IP[64] = {
58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,