home *** CD-ROM | disk | FTP | other *** search
- #ifndef _SYS_BYTEORDER_H
- #define _SYS_BYTEORDER_H
-
- /* Functions to convert `short' and `long' quantities from host byte order
- to (internet) network byte order (i.e. big-endian).
-
- Written by Ron Guilmette (rfg@ncd.com).
-
- This isn't actually used by GCC. It is installed by fixinc.svr4.
-
- For big-endian machines these functions are essentially no-ops.
-
- For little-endian machines, we define the functions using specialized
- asm sequences in cases where doing so yields better code (e.g. i386). */
-
- #if !defined (__GNUC__) && !defined (__GNUG__)
- #error You lose! This file is only useful with GNU compilers.
- #endif
-
- #ifdef __GNUC__
- #define __STATIC static
- #else
- #define __STATIC
- #endif
-
- #ifdef __STDC__
- __STATIC __inline__ unsigned long htonl (unsigned long);
- __STATIC __inline__ unsigned short htons (unsigned int);
- __STATIC __inline__ unsigned long ntohl (unsigned long);
- __STATIC __inline__ unsigned short ntohs (unsigned int);
- #endif /* defined (__STDC__) */
-
- #if defined (__i386__)
-
- /* Convert a host long to a network long. */
-
- __STATIC __inline__ unsigned long
- htonl (__arg)
- unsigned long __arg;
- {
- register unsigned long __result __asm__ ("%eax");
-
- __result = __arg;
- __asm__ ("xchgb %%ah, %%al\n\
- rorl $16, %%eax\n\
- xchgb %%ah, %%al\n\
- clc" : "=r" (__result) : "0" (__result));
- return __result;
- }
-
- /* Convert a host short to a network short. */
-
- __STATIC __inline__ unsigned short
- htons (__arg)
- unsigned int __arg;
- {
- register unsigned short __result __asm__ ("%eax");
-
- __result = __arg;
- __asm__ ("xchgb %%ah, %%al\n\
- clc" : "=r" (__result) : "0" (__result));
- return __result;
- }
-
- #elif ((defined (__i860__) && !defined (__i860_big_endian__)) \
- || defined (__ns32k__) || defined (__vax__) \
- || defined (__spur__) || defined (__arm__))
-
- /* For other little-endian machines, using C code is just as efficient as
- using assembly code. */
-
- /* Convert a host long to a network long. */
-
- __STATIC __inline__ unsigned long
- htonl (__arg)
- unsigned long __arg;
- {
- register unsigned long __result;
-
- __result = (__arg >> 24) & 0x000000ff;
- __result |= (__arg >> 8) & 0x0000ff00;
- __result |= (__arg << 8) & 0x00ff0000;
- __result |= (__arg << 24) & 0xff000000;
- return __result;
- }
-
- /* Convert a host short to a network short. */
-
- __STATIC __inline__ unsigned short
- htons (__arg)
- unsigned int __arg;
- {
- register unsigned short __result;
-
- __result = (__arg << 8) & 0xff00;
- __result |= (__arg >> 8) & 0x00ff;
- return __result;
- }
-
- #else /* must be a big-endian machine */
-
- /* Convert a host long to a network long. */
-
- __STATIC __inline__ unsigned long
- htonl (__arg)
- unsigned long __arg;
- {
- return __arg;
- }
-
- /* Convert a host short to a network short. */
-
- __STATIC __inline__ unsigned short
- htons (__arg)
- unsigned int __arg;
- {
- return __arg;
- }
-
- #endif /* big-endian */
-
- /* Convert a network long to a host long. */
-
- __STATIC __inline__ unsigned long
- ntohl (__arg)
- unsigned long __arg;
- {
- return htonl (__arg);
- }
-
- /* Convert a network short to a host short. */
-
- __STATIC __inline__ unsigned short
- ntohs (__arg)
- unsigned int __arg;
- {
- return htons (__arg);
- }
-
-
- #undef __STATIC
-
- #endif /* !defined (_SYS_BYTEORDER_H) */
-