Imported Upstream version 1.15.1
[deb_xorg-server.git] / include / misc.h
CommitLineData
a09e091a
JB
1/***********************************************************
2
3Copyright 1987, 1998 The Open Group
4
5Permission to use, copy, modify, distribute, and sell this software and its
6documentation for any purpose is hereby granted without fee, provided that
7the above copyright notice appear in all copies and that both that
8copyright notice and this permission notice appear in supporting
9documentation.
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20
21Except as contained in this notice, the name of The Open Group shall not be
22used in advertising or otherwise to promote the sale, use or other dealings
23in this Software without prior written authorization from The Open Group.
24
25Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
26
27 All Rights Reserved
28
29Permission to use, copy, modify, and distribute this software and its
30documentation for any purpose and without fee is hereby granted,
31provided that the above copyright notice appear in all copies and that
32both that copyright notice and this permission notice appear in
33supporting documentation, and that the name of Digital not be
34used in advertising or publicity pertaining to distribution of the
35software without specific, written prior permission.
36
37DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43SOFTWARE.
44
45Copyright 1992, 1993 Data General Corporation;
46Copyright 1992, 1993 OMRON Corporation
47
48Permission to use, copy, modify, distribute, and sell this software and its
49documentation for any purpose is hereby granted without fee, provided that the
50above copyright notice appear in all copies and that both that copyright
51notice and this permission notice appear in supporting documentation, and that
52neither the name OMRON or DATA GENERAL be used in advertising or publicity
53pertaining to distribution of the software without specific, written prior
54permission of the party whose name is to be used. Neither OMRON or
55DATA GENERAL make any representation about the suitability of this software
56for any purpose. It is provided "as is" without express or implied warranty.
57
58OMRON AND DATA GENERAL EACH DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
59SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
60IN NO EVENT SHALL OMRON OR DATA GENERAL BE LIABLE FOR ANY SPECIAL, INDIRECT
61OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
62DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
63TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
64OF THIS SOFTWARE.
65
66******************************************************************/
67#ifndef MISC_H
68#define MISC_H 1
69/*
70 * X internal definitions
71 *
72 */
73
74#include <X11/Xosdefs.h>
75#include <X11/Xfuncproto.h>
76#include <X11/Xmd.h>
77#include <X11/X.h>
78#include <X11/Xdefs.h>
79
80#include <stddef.h>
81#include <stdint.h>
82
83#ifndef MAXSCREENS
84#define MAXSCREENS 16
85#endif
86#ifndef MAXGPUSCREENS
87#define MAXGPUSCREENS 16
88#endif
89#define MAXCLIENTS 256
90#define MAXEXTENSIONS 128
91#define MAXFORMATS 8
92#define MAXDEVICES 40 /* input devices */
93#define GPU_SCREEN_OFFSET 256
94
95/* 128 event opcodes for core + extension events, excluding GE */
96#define MAXEVENTS 128
97#define EXTENSION_EVENT_BASE 64
98#define EXTENSION_BASE 128
99
100typedef uint32_t ATOM;
101
102#ifndef TRUE
103#define TRUE 1
104#define FALSE 0
105#endif
106
107#ifndef _XTYPEDEF_CALLBACKLISTPTR
108typedef struct _CallbackList *CallbackListPtr; /* also in dix.h */
109
110#define _XTYPEDEF_CALLBACKLISTPTR
111#endif
112
113typedef struct _xReq *xReqPtr;
114
115#include "os.h" /* for ALLOCATE_LOCAL and DEALLOCATE_LOCAL */
116#include <X11/Xfuncs.h> /* for bcopy, bzero, and bcmp */
117
118#define NullBox ((BoxPtr)0)
119#define MILLI_PER_MIN (1000 * 60)
120#define MILLI_PER_SECOND (1000)
121
122 /* this next is used with None and ParentRelative to tell
123 PaintWin() what to use to paint the background. Also used
124 in the macro IS_VALID_PIXMAP */
125
126#define USE_BACKGROUND_PIXEL 3
127#define USE_BORDER_PIXEL 3
128
129/* byte swap a 32-bit literal */
130static inline uint32_t
131lswapl(uint32_t x)
132{
133 return ((x & 0xff) << 24) |
134 ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | ((x >> 24) & 0xff);
135}
136
137/* byte swap a 16-bit literal */
138static inline uint16_t
139lswaps(uint16_t x)
140{
141 return ((x & 0xff) << 8) | ((x >> 8) & 0xff);
142}
143
144#undef min
145#undef max
146
147#define min(a, b) (((a) < (b)) ? (a) : (b))
148#define max(a, b) (((a) > (b)) ? (a) : (b))
149/* abs() is a function, not a macro; include the file declaring
150 * it in case we haven't done that yet.
151 */
152#include <stdlib.h>
153#define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
154/* this assumes b > 0 */
155#define modulus(a, b, d) if (((d) = (a) % (b)) < 0) (d) += (b)
156/*
157 * return the least significant bit in x which is set
158 *
159 * This works on 1's complement and 2's complement machines.
160 * If you care about the extra instruction on 2's complement
161 * machines, change to ((x) & (-(x)))
162 */
163#define lowbit(x) ((x) & (~(x) + 1))
164
165/* XXX Not for modules */
166#include <limits.h>
167#if !defined(MAXSHORT) || !defined(MINSHORT) || \
168 !defined(MAXINT) || !defined(MININT)
169/*
170 * Some implementations #define these through <math.h>, so preclude
171 * #include'ing it later.
172 */
173
174#include <math.h>
175#undef MAXSHORT
176#define MAXSHORT SHRT_MAX
177#undef MINSHORT
178#define MINSHORT SHRT_MIN
179#undef MAXINT
180#define MAXINT INT_MAX
181#undef MININT
182#define MININT INT_MIN
183
184#include <assert.h>
185#include <ctype.h>
186#include <stdio.h> /* for fopen, etc... */
187
188#endif
189
190#ifndef PATH_MAX
191#include <sys/param.h>
192#ifndef PATH_MAX
193#ifdef MAXPATHLEN
194#define PATH_MAX MAXPATHLEN
195#else
196#define PATH_MAX 1024
197#endif
198#endif
199#endif
200
201/**
202 * Calculate the number of bytes needed to hold bits.
203 * @param bits The minimum number of bits needed.
204 * @return The number of bytes needed to hold bits.
205 */
206static inline int
207bits_to_bytes(const int bits)
208{
209 return ((bits + 7) >> 3);
210}
211
212/**
213 * Calculate the number of 4-byte units needed to hold the given number of
214 * bytes.
215 * @param bytes The minimum number of bytes needed.
216 * @return The number of 4-byte units needed to hold bytes.
217 */
218static inline int
219bytes_to_int32(const int bytes)
220{
221 return (((bytes) + 3) >> 2);
222}
223
224/**
225 * Calculate the number of bytes (in multiples of 4) needed to hold bytes.
226 * @param bytes The minimum number of bytes needed.
227 * @return The closest multiple of 4 that is equal or higher than bytes.
228 */
229static inline int
230pad_to_int32(const int bytes)
231{
232 return (((bytes) + 3) & ~3);
233}
234
235/**
236 * Calculate padding needed to bring the number of bytes to an even
237 * multiple of 4.
238 * @param bytes The minimum number of bytes needed.
239 * @return The bytes of padding needed to arrive at the closest multiple of 4
240 * that is equal or higher than bytes.
241 */
242static inline int
243padding_for_int32(const int bytes)
244{
245 return ((-bytes) & 3);
246}
247
248
249extern char **xstrtokenize(const char *str, const char *separators);
250extern void FormatInt64(int64_t num, char *string);
251extern void FormatUInt64(uint64_t num, char *string);
252extern void FormatUInt64Hex(uint64_t num, char *string);
253extern void FormatDouble(double dbl, char *string);
254
255/**
256 * Compare the two version numbers comprising of major.minor.
257 *
258 * @return A value less than 0 if a is less than b, 0 if a is equal to b,
259 * or a value greater than 0
260 */
261static inline int
262version_compare(uint16_t a_major, uint16_t a_minor,
263 uint16_t b_major, uint16_t b_minor)
264{
265 int a, b;
266
267 a = a_major << 16 | a_minor;
268 b = b_major << 16 | b_minor;
269
270 return (a - b);
271}
272
273/* some macros to help swap requests, replies, and events */
274
275#define LengthRestB(stuff) \
276 ((client->req_len << 2) - sizeof(*stuff))
277
278#define LengthRestS(stuff) \
279 ((client->req_len << 1) - (sizeof(*stuff) >> 1))
280
281#define LengthRestL(stuff) \
282 (client->req_len - (sizeof(*stuff) >> 2))
283
284#define SwapRestS(stuff) \
285 SwapShorts((short *)(stuff + 1), LengthRestS(stuff))
286
287#define SwapRestL(stuff) \
288 SwapLongs((CARD32 *)(stuff + 1), LengthRestL(stuff))
289
290#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
291void __attribute__ ((error("wrong sized variable passed to swap")))
292wrong_size(void);
293#else
294static inline void
295wrong_size(void)
296{
297}
298#endif
299
300#if !(defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)))
301static inline int
302__builtin_constant_p(int x)
303{
304 return 0;
305}
306#endif
307
308/* byte swap a 64-bit value */
309static inline void
310swap_uint64(uint64_t *x)
311{
312 char n;
313
314 n = ((char *) x)[0];
315 ((char *) x)[0] = ((char *) x)[7];
316 ((char *) x)[7] = n;
317
318 n = ((char *) x)[1];
319 ((char *) x)[1] = ((char *) x)[6];
320 ((char *) x)[6] = n;
321
322 n = ((char *) x)[2];
323 ((char *) x)[2] = ((char *) x)[5];
324 ((char *) x)[5] = n;
325
326 n = ((char *) x)[3];
327 ((char *) x)[3] = ((char *) x)[4];
328 ((char *) x)[4] = n;
329}
330
331#define swapll(x) do { \
332 if (sizeof(*(x)) != 8) \
333 wrong_size(); \
334 swap_uint64((uint64_t *)(x)); \
335 } while (0)
336
337/* byte swap a 32-bit value */
338static inline void
339swap_uint32(uint32_t * x)
340{
341 char n = ((char *) x)[0];
342
343 ((char *) x)[0] = ((char *) x)[3];
344 ((char *) x)[3] = n;
345 n = ((char *) x)[1];
346 ((char *) x)[1] = ((char *) x)[2];
347 ((char *) x)[2] = n;
348}
349
350#define swapl(x) do { \
351 if (sizeof(*(x)) != 4) \
352 wrong_size(); \
353 if (__builtin_constant_p((uintptr_t)(x) & 3) && ((uintptr_t)(x) & 3) == 0) \
354 *(x) = lswapl(*(x)); \
355 else \
356 swap_uint32((uint32_t *)(x)); \
357 } while (0)
358
359/* byte swap a 16-bit value */
360static inline void
361swap_uint16(uint16_t * x)
362{
363 char n = ((char *) x)[0];
364
365 ((char *) x)[0] = ((char *) x)[1];
366 ((char *) x)[1] = n;
367}
368
369#define swaps(x) do { \
370 if (sizeof(*(x)) != 2) \
371 wrong_size(); \
372 if (__builtin_constant_p((uintptr_t)(x) & 1) && ((uintptr_t)(x) & 1) == 0) \
373 *(x) = lswaps(*(x)); \
374 else \
375 swap_uint16((uint16_t *)(x)); \
376 } while (0)
377
378/* copy 32-bit value from src to dst byteswapping on the way */
379#define cpswapl(src, dst) do { \
380 if (sizeof((src)) != 4 || sizeof((dst)) != 4) \
381 wrong_size(); \
382 (dst) = lswapl((src)); \
383 } while (0)
384
385/* copy short from src to dst byteswapping on the way */
386#define cpswaps(src, dst) do { \
387 if (sizeof((src)) != 2 || sizeof((dst)) != 2) \
388 wrong_size(); \
389 (dst) = lswaps((src)); \
390 } while (0)
391
392extern _X_EXPORT void SwapLongs(CARD32 *list, unsigned long count);
393
394extern _X_EXPORT void SwapShorts(short *list, unsigned long count);
395
396extern _X_EXPORT void MakePredeclaredAtoms(void);
397
398extern _X_EXPORT int Ones(unsigned long /*mask */ );
399
400typedef struct _xPoint *DDXPointPtr;
401typedef struct pixman_box16 *BoxPtr;
402typedef struct _xEvent *xEventPtr;
403typedef struct _xRectangle *xRectanglePtr;
404typedef struct _GrabRec *GrabPtr;
405
406/* typedefs from other places - duplicated here to minimize the amount
407 * of unnecessary junk that one would normally have to include to get
408 * these symbols defined
409 */
410
411#ifndef _XTYPEDEF_CHARINFOPTR
412typedef struct _CharInfo *CharInfoPtr; /* also in fonts/include/font.h */
413
414#define _XTYPEDEF_CHARINFOPTR
415#endif
416
417extern _X_EXPORT unsigned long globalSerialNumber;
418extern _X_EXPORT unsigned long serverGeneration;
419
420/* Don't use this directly, use BUG_WARN or BUG_WARN_MSG instead */
421#define __BUG_WARN_MSG(cond, with_msg, ...) \
422 do { if (cond) { \
423 ErrorFSigSafe("BUG: triggered 'if (" #cond ")'\n"); \
424 ErrorFSigSafe("BUG: %s:%u in %s()\n", \
425 __FILE__, __LINE__, __func__); \
426 if (with_msg) ErrorFSigSafe(__VA_ARGS__); \
427 xorg_backtrace(); \
428 } } while(0)
429
430#define BUG_WARN_MSG(cond, ...) \
431 __BUG_WARN_MSG(cond, 1, __VA_ARGS__)
432
433#define BUG_WARN(cond) __BUG_WARN_MSG(cond, 0, NULL)
434
435#define BUG_RETURN(cond) \
436 do { if (cond) { __BUG_WARN_MSG(cond, 0, NULL); return; } } while(0)
437
438#define BUG_RETURN_MSG(cond, ...) \
439 do { if (cond) { __BUG_WARN_MSG(cond, 1, __VA_ARGS__); return; } } while(0)
440
441#define BUG_RETURN_VAL(cond, val) \
442 do { if (cond) { __BUG_WARN_MSG(cond, 0, NULL); return (val); } } while(0)
443
444#define BUG_RETURN_VAL_MSG(cond, val, ...) \
445 do { if (cond) { __BUG_WARN_MSG(cond, 1, __VA_ARGS__); return (val); } } while(0)
446
447#endif /* MISC_H */