WSUTIL/PINT: transform macros into static functions
[metze/wireshark/wip.git] / wsutil / pint.h
1 /* pint.h
2  * Definitions for extracting and translating integers safely and portably
3  * via pointers.
4  *
5  * Wireshark - Network traffic analyzer
6  * By Gerald Combs <gerald@wireshark.org>
7  * Copyright 1998 Gerald Combs
8  *
9  * SPDX-License-Identifier: GPL-2.0-or-later
10  */
11
12 #ifndef __PINT_H__
13 #define __PINT_H__
14
15 #include <glib.h>
16
17 /* Pointer versions of g_ntohs and g_ntohl.  Given a pointer to a member of a
18  * byte array, returns the value of the two or four bytes at the pointer.
19  * The pletohXX versions return the little-endian representation.
20  */
21
22 static inline guint16 pntoh16(const void *p)
23 {
24     return (guint16)*((const guint8 *)(p)+0)<<8|
25            (guint16)*((const guint8 *)(p)+1)<<0;
26 }
27
28 static inline guint32 pntoh24(const void *p)
29 {
30     return (guint32)*((const guint8 *)(p)+0)<<16|
31            (guint32)*((const guint8 *)(p)+1)<<8|
32            (guint32)*((const guint8 *)(p)+2)<<0;
33 }
34
35 static inline guint32 pntoh32(const void *p)
36 {
37     return (guint32)*((const guint8 *)(p)+0)<<24|
38            (guint32)*((const guint8 *)(p)+1)<<16|
39            (guint32)*((const guint8 *)(p)+2)<<8|
40            (guint32)*((const guint8 *)(p)+3)<<0;
41 }
42
43 static inline guint64 pntoh40(const void *p)
44 {
45     return (guint64)*((const guint8 *)(p)+0)<<32|
46            (guint64)*((const guint8 *)(p)+1)<<24|
47            (guint64)*((const guint8 *)(p)+2)<<16|
48            (guint64)*((const guint8 *)(p)+3)<<8|
49            (guint64)*((const guint8 *)(p)+4)<<0;
50 }
51
52 static inline guint64 pntoh48(const void *p)
53 {
54     return (guint64)*((const guint8 *)(p)+0)<<40|
55            (guint64)*((const guint8 *)(p)+1)<<32|
56            (guint64)*((const guint8 *)(p)+2)<<24|
57            (guint64)*((const guint8 *)(p)+3)<<16|
58            (guint64)*((const guint8 *)(p)+4)<<8|
59            (guint64)*((const guint8 *)(p)+5)<<0;
60 }
61
62 static inline guint64 pntoh56(const void *p)
63 {
64     return (guint64)*((const guint8 *)(p)+0)<<48|
65            (guint64)*((const guint8 *)(p)+1)<<40|
66            (guint64)*((const guint8 *)(p)+2)<<32|
67            (guint64)*((const guint8 *)(p)+3)<<24|
68            (guint64)*((const guint8 *)(p)+4)<<16|
69            (guint64)*((const guint8 *)(p)+5)<<8|
70            (guint64)*((const guint8 *)(p)+6)<<0;
71 }
72
73 static inline guint64 pntoh64(const void *p)
74 {
75     return (guint64)*((const guint8 *)(p)+0)<<56|
76            (guint64)*((const guint8 *)(p)+1)<<48|
77            (guint64)*((const guint8 *)(p)+2)<<40|
78            (guint64)*((const guint8 *)(p)+3)<<32|
79            (guint64)*((const guint8 *)(p)+4)<<24|
80            (guint64)*((const guint8 *)(p)+5)<<16|
81            (guint64)*((const guint8 *)(p)+6)<<8|
82            (guint64)*((const guint8 *)(p)+7)<<0;
83 }
84
85 static inline guint16 pletoh16(const void *p)
86 {
87     return (guint16)*((const guint8 *)(p)+1)<<8|
88            (guint16)*((const guint8 *)(p)+0)<<0;
89 }
90
91 static inline guint32 pletoh24(const void *p)
92 {
93     return (guint32)*((const guint8 *)(p)+2)<<16|
94            (guint32)*((const guint8 *)(p)+1)<<8|
95            (guint32)*((const guint8 *)(p)+0)<<0;
96 }
97
98 static inline guint32 pletoh32(const void *p)
99 {
100     return (guint32)*((const guint8 *)(p)+3)<<24|
101            (guint32)*((const guint8 *)(p)+2)<<16|
102            (guint32)*((const guint8 *)(p)+1)<<8|
103            (guint32)*((const guint8 *)(p)+0)<<0;
104 }
105
106 static inline guint64 pletoh40(const void *p)
107 {
108     return (guint64)*((const guint8 *)(p)+4)<<32|
109            (guint64)*((const guint8 *)(p)+3)<<24|
110            (guint64)*((const guint8 *)(p)+2)<<16|
111            (guint64)*((const guint8 *)(p)+1)<<8|
112            (guint64)*((const guint8 *)(p)+0)<<0;
113 }
114
115 static inline guint64 pletoh48(const void *p)
116 {
117     return (guint64)*((const guint8 *)(p)+5)<<40|
118            (guint64)*((const guint8 *)(p)+4)<<32|
119            (guint64)*((const guint8 *)(p)+3)<<24|
120            (guint64)*((const guint8 *)(p)+2)<<16|
121            (guint64)*((const guint8 *)(p)+1)<<8|
122            (guint64)*((const guint8 *)(p)+0)<<0;
123 }
124
125 static inline guint64 pletoh56(const void *p)
126 {
127     return (guint64)*((const guint8 *)(p)+6)<<48|
128            (guint64)*((const guint8 *)(p)+5)<<40|
129            (guint64)*((const guint8 *)(p)+4)<<32|
130            (guint64)*((const guint8 *)(p)+3)<<24|
131            (guint64)*((const guint8 *)(p)+2)<<16|
132            (guint64)*((const guint8 *)(p)+1)<<8|
133            (guint64)*((const guint8 *)(p)+0)<<0;
134 }
135
136 static inline guint64 pletoh64(const void *p)
137 {
138     return (guint64)*((const guint8 *)(p)+7)<<56|
139            (guint64)*((const guint8 *)(p)+6)<<48|
140            (guint64)*((const guint8 *)(p)+5)<<40|
141            (guint64)*((const guint8 *)(p)+4)<<32|
142            (guint64)*((const guint8 *)(p)+3)<<24|
143            (guint64)*((const guint8 *)(p)+2)<<16|
144            (guint64)*((const guint8 *)(p)+1)<<8|
145            (guint64)*((const guint8 *)(p)+0)<<0;
146 }
147 /* Pointer routines to put items out in a particular byte order.
148  * These will work regardless of the byte alignment of the pointer.
149  */
150
151 static inline void phton16(guint8 *p, guint16 v)
152 {
153     p[0] = (guint8)(v >> 8);
154     p[1] = (guint8)(v >> 0);
155 }
156
157 static inline void phton32(guint8 *p, guint32 v)
158 {
159     p[0] = (guint8)(v >> 24);
160     p[1] = (guint8)(v >> 16);
161     p[2] = (guint8)(v >> 8);
162     p[3] = (guint8)(v >> 0);
163 }
164
165 static inline void phton64(guint8 *p, guint64 v) {
166     p[0] = (guint8)(v >> 56);
167     p[1] = (guint8)(v >> 48);
168     p[2] = (guint8)(v >> 40);
169     p[3] = (guint8)(v >> 32);
170     p[4] = (guint8)(v >> 24);
171     p[5] = (guint8)(v >> 16);
172     p[6] = (guint8)(v >> 8);
173     p[7] = (guint8)(v >> 0);
174 }
175
176 static inline void phtole32(guint8 *p, guint32 v) {
177     p[0] = (guint8)(v >> 0);
178     p[1] = (guint8)(v >> 8);
179     p[2] = (guint8)(v >> 16);
180     p[3] = (guint8)(v >> 24);
181 }
182
183 static inline void phtole64(guint8 *p, guint64 v) {
184     p[0] = (guint8)(v >> 0);
185     p[1] = (guint8)(v >> 8);
186     p[2] = (guint8)(v >> 16);
187     p[3] = (guint8)(v >> 24);
188     p[4] = (guint8)(v >> 32);
189     p[5] = (guint8)(v >> 40);
190     p[6] = (guint8)(v >> 48);
191     p[7] = (guint8)(v >> 56);
192 }
193
194 /* Subtract two guint32s with respect to wraparound */
195 #define guint32_wraparound_diff(higher, lower) ((higher>lower)?(higher-lower):(higher+0xffffffff-lower+1))
196
197 #endif /* PINT_H */
198
199 /*
200  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
201  *
202  * Local Variables:
203  * c-basic-offset: 4
204  * tab-width: 8
205  * indent-tabs-mode: nil
206  * End:
207  *
208  * ex: set shiftwidth=4 tabstop=8 expandtab:
209  * :indentSize=4:tabSize=8:noTabs=true:
210  */