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
 }
-