|
|
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) */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.