Annotation of GNUtools/cc/byteorder.h, revision 1.1

1.1     ! root        1: #ifndef _SYS_BYTEORDER_H
        !             2: #define _SYS_BYTEORDER_H
        !             3: 
        !             4: /* Functions to convert `short' and `long' quantities from host byte order
        !             5:    to (internet) network byte order (i.e. big-endian).
        !             6: 
        !             7:    Written by Ron Guilmette ([email protected]).
        !             8: 
        !             9:    This isn't actually used by GCC.  It is installed by fixinc.svr4.
        !            10: 
        !            11:    For big-endian machines these functions are essentially no-ops.
        !            12: 
        !            13:    For little-endian machines, we define the functions using specialized
        !            14:    asm sequences in cases where doing so yields better code (e.g. i386).  */
        !            15: 
        !            16: #if !defined (__GNUC__) && !defined (__GNUG__)
        !            17: #error You lose!  This file is only useful with GNU compilers.
        !            18: #endif
        !            19: 
        !            20: #ifdef __GNUC__
        !            21: #define __STATIC static
        !            22: #else
        !            23: #define __STATIC
        !            24: #endif
        !            25: 
        !            26: #ifdef __STDC__
        !            27: __STATIC __inline__ unsigned long htonl (unsigned long);
        !            28: __STATIC __inline__ unsigned short htons (unsigned int);
        !            29: __STATIC __inline__ unsigned long ntohl (unsigned long);
        !            30: __STATIC __inline__ unsigned short ntohs (unsigned int);
        !            31: #endif /* defined (__STDC__) */
        !            32: 
        !            33: #if defined (__i386__)
        !            34: 
        !            35: /* Convert a host long to a network long.  */
        !            36: 
        !            37: /* We must use a new-style function definition, so that this will also
        !            38:    be valid for C++.  */
        !            39: __STATIC __inline__ unsigned long
        !            40: htonl (unsigned long __arg)
        !            41: {
        !            42:   register unsigned long __result;
        !            43: 
        !            44:   __asm__ ("xchg%B0 %b0,%h0\n\
        !            45:        ror%L0 $16,%0\n\
        !            46:        xchg%B0 %b0,%h0" : "=q" (__result) : "0" (__arg));
        !            47:   return __result;
        !            48: }
        !            49: 
        !            50: /* Convert a host short to a network short.  */
        !            51: 
        !            52: __STATIC __inline__ unsigned short
        !            53: htons (unsigned int __arg)
        !            54: {
        !            55:   register unsigned short __result;
        !            56: 
        !            57:   __asm__ ("xchg%B0 %b0,%h0" : "=q" (__result) : "0" (__arg));
        !            58:   return __result;
        !            59: }
        !            60: 
        !            61: #elif ((defined (__i860__) && !defined (__i860_big_endian__))  \
        !            62:        || defined (__ns32k__) || defined (__vax__)             \
        !            63:        || defined (__spur__) || defined (__arm__))
        !            64: 
        !            65: /* For other little-endian machines, using C code is just as efficient as
        !            66:    using assembly code.  */
        !            67: 
        !            68: /* Convert a host long to a network long.  */
        !            69: 
        !            70: __STATIC __inline__ unsigned long
        !            71: htonl (unsigned long __arg)
        !            72: {
        !            73:   register unsigned long __result;
        !            74: 
        !            75:   __result = (__arg >> 24) & 0x000000ff;
        !            76:   __result |= (__arg >> 8) & 0x0000ff00;
        !            77:   __result |= (__arg << 8) & 0x00ff0000;
        !            78:   __result |= (__arg << 24) & 0xff000000;
        !            79:   return __result;
        !            80: }
        !            81: 
        !            82: /* Convert a host short to a network short.  */
        !            83: 
        !            84: __STATIC __inline__ unsigned short
        !            85: htons (unsigned int __arg)
        !            86: {
        !            87:   register unsigned short __result;
        !            88: 
        !            89:   __result = (__arg << 8) & 0xff00;
        !            90:   __result |= (__arg >> 8) & 0x00ff;
        !            91:   return __result;
        !            92: }
        !            93: 
        !            94: #else /* must be a big-endian machine */
        !            95: 
        !            96: /* Convert a host long to a network long.  */
        !            97: 
        !            98: __STATIC __inline__ unsigned long
        !            99: htonl (unsigned long __arg)
        !           100: {
        !           101:   return __arg;
        !           102: }
        !           103: 
        !           104: /* Convert a host short to a network short.  */
        !           105: 
        !           106: __STATIC __inline__ unsigned short
        !           107: htons (unsigned int __arg)
        !           108: {
        !           109:   return __arg;
        !           110: }
        !           111: 
        !           112: #endif /* big-endian */
        !           113: 
        !           114: /* Convert a network long to a host long.  */
        !           115: 
        !           116: __STATIC __inline__ unsigned long
        !           117: ntohl (unsigned long __arg)
        !           118: {
        !           119:   return htonl (__arg);
        !           120: }
        !           121: 
        !           122: /* Convert a network short to a host short.  */
        !           123: 
        !           124: __STATIC __inline__ unsigned short
        !           125: ntohs (unsigned int __arg)
        !           126: {
        !           127:   return htons (__arg);
        !           128: }
        !           129: 
        !           130: 
        !           131: #undef __STATIC
        !           132: 
        !           133: #endif /* !defined (_SYS_BYTEORDER_H) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.