03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/***********************************************************
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncCopyright 1987, 1998 The Open Group
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncPermission to use, copy, modify, distribute, and sell this software and its
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncdocumentation for any purpose is hereby granted without fee, provided that
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncthe above copyright notice appear in all copies and that both that
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynccopyright notice and this permission notice appear in supporting
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncdocumentation.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncThe above copyright notice and this permission notice shall be included in
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncall copies or substantial portions of the Software.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncExcept as contained in this notice, the name of The Open Group shall not be
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncused in advertising or otherwise to promote the sale, use or other dealings
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncin this Software without prior written authorization from The Open Group.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncCopyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync All Rights Reserved
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncPermission to use, copy, modify, and distribute this software and its
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncdocumentation for any purpose and without fee is hereby granted,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncprovided that the above copyright notice appear in all copies and that
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncboth that copyright notice and this permission notice appear in
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncsupporting documentation, and that the name of Digital not be
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncused in advertising or publicity pertaining to distribution of the
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncsoftware without specific, written prior permission.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncSOFTWARE.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncCopyright 1992, 1993 Data General Corporation;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncCopyright 1992, 1993 OMRON Corporation
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncPermission to use, copy, modify, distribute, and sell this software and its
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncdocumentation for any purpose is hereby granted without fee, provided that the
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncabove copyright notice appear in all copies and that both that copyright
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncnotice and this permission notice appear in supporting documentation, and that
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncneither the name OMRON or DATA GENERAL be used in advertising or publicity
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncpertaining to distribution of the software without specific, written prior
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncpermission of the party whose name is to be used. Neither OMRON or
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncDATA GENERAL make any representation about the suitability of this software
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncfor any purpose. It is provided "as is" without express or implied warranty.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncOMRON AND DATA GENERAL EACH DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncSOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncIN NO EVENT SHALL OMRON OR DATA GENERAL BE LIABLE FOR ANY SPECIAL, INDIRECT
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncOR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncDATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncOF THIS SOFTWARE.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync******************************************************************/
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifndef MISC_H
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MISC_H 1
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/*
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * X internal definitions
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync *
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <X11/Xosdefs.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <X11/Xfuncproto.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <X11/Xmd.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <X11/X.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <X11/Xdefs.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <stddef.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <stdint.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifndef MAXSCREENS
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXSCREENS 16
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifndef MAXGPUSCREENS
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXGPUSCREENS 16
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXCLIENTS 256
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXEXTENSIONS 128
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXFORMATS 8
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXDEVICES 40 /* input devices */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define GPU_SCREEN_OFFSET 256
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* 128 event opcodes for core + extension events, excluding GE */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXEVENTS 128
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define EXTENSION_EVENT_BASE 64
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define EXTENSION_BASE 128
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef uint32_t ATOM;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifndef TRUE
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define TRUE 1
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define FALSE 0
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifndef _XTYPEDEF_CALLBACKLISTPTR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _CallbackList *CallbackListPtr; /* also in dix.h */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define _XTYPEDEF_CALLBACKLISTPTR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _xReq *xReqPtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include "os.h" /* for ALLOCATE_LOCAL and DEALLOCATE_LOCAL */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <X11/Xfuncs.h> /* for bcopy, bzero, and bcmp */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define NullBox ((BoxPtr)0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MILLI_PER_MIN (1000 * 60)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MILLI_PER_SECOND (1000)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync /* this next is used with None and ParentRelative to tell
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync PaintWin() what to use to paint the background. Also used
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync in the macro IS_VALID_PIXMAP */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define USE_BACKGROUND_PIXEL 3
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define USE_BORDER_PIXEL 3
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* byte swap a 32-bit literal */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline uint32_t
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynclswapl(uint32_t x)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync return ((x & 0xff) << 24) |
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | ((x >> 24) & 0xff);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* byte swap a 16-bit literal */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline uint16_t
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynclswaps(uint16_t x)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync return ((x & 0xff) << 8) | ((x >> 8) & 0xff);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#undef min
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#undef max
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define min(a, b) (((a) < (b)) ? (a) : (b))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define max(a, b) (((a) > (b)) ? (a) : (b))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* abs() is a function, not a macro; include the file declaring
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * it in case we haven't done that yet.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <stdlib.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define sign(x) ((x) < 0 ? -1 : ((x) > 0 ? 1 : 0))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* this assumes b > 0 */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define modulus(a, b, d) if (((d) = (a) % (b)) < 0) (d) += (b)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/*
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * return the least significant bit in x which is set
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync *
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * This works on 1's complement and 2's complement machines.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * If you care about the extra instruction on 2's complement
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * machines, change to ((x) & (-(x)))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define lowbit(x) ((x) & (~(x) + 1))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* XXX Not for modules */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <limits.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#if !defined(MAXSHORT) || !defined(MINSHORT) || \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync !defined(MAXINT) || !defined(MININT)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/*
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * Some implementations #define these through <math.h>, so preclude
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * #include'ing it later.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <math.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#undef MAXSHORT
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXSHORT SHRT_MAX
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#undef MINSHORT
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MINSHORT SHRT_MIN
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#undef MAXINT
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MAXINT INT_MAX
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#undef MININT
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define MININT INT_MIN
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <assert.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <ctype.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <stdio.h> /* for fopen, etc... */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifndef PATH_MAX
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#include <sys/param.h>
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifndef PATH_MAX
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifdef MAXPATHLEN
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define PATH_MAX MAXPATHLEN
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#else
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define PATH_MAX 1024
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/**
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * Calculate the number of bytes needed to hold bits.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @param bits The minimum number of bits needed.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @return The number of bytes needed to hold bits.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline int
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncbits_to_bytes(const int bits)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync return ((bits + 7) >> 3);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/**
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * Calculate the number of 4-byte units needed to hold the given number of
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * bytes.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @param bytes The minimum number of bytes needed.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @return The number of 4-byte units needed to hold bytes.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline int
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncbytes_to_int32(const int bytes)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync return (((bytes) + 3) >> 2);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/**
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * Calculate the number of bytes (in multiples of 4) needed to hold bytes.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @param bytes The minimum number of bytes needed.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @return The closest multiple of 4 that is equal or higher than bytes.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline int
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncpad_to_int32(const int bytes)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync return (((bytes) + 3) & ~3);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/**
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * Calculate padding needed to bring the number of bytes to an even
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * multiple of 4.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @param bytes The minimum number of bytes needed.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @return The bytes of padding needed to arrive at the closest multiple of 4
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * that is equal or higher than bytes.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline int
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncpadding_for_int32(const int bytes)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync return ((-bytes) & 3);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern char **xstrtokenize(const char *str, const char *separators);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern void FormatInt64(int64_t num, char *string);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern void FormatUInt64(uint64_t num, char *string);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern void FormatUInt64Hex(uint64_t num, char *string);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern void FormatDouble(double dbl, char *string);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/**
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * Compare the two version numbers comprising of major.minor.
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync *
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * @return A value less than 0 if a is less than b, 0 if a is equal to b,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * or a value greater than 0
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline int
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncversion_compare(uint16_t a_major, uint16_t a_minor,
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync uint16_t b_major, uint16_t b_minor)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync int a, b;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync a = a_major << 16 | a_minor;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync b = b_major << 16 | b_minor;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync return (a - b);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* some macros to help swap requests, replies, and events */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define LengthRestB(stuff) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((client->req_len << 2) - sizeof(*stuff))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define LengthRestS(stuff) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((client->req_len << 1) - (sizeof(*stuff) >> 1))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define LengthRestL(stuff) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync (client->req_len - (sizeof(*stuff) >> 2))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define SwapRestS(stuff) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync SwapShorts((short *)(stuff + 1), LengthRestS(stuff))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define SwapRestL(stuff) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync SwapLongs((CARD32 *)(stuff + 1), LengthRestL(stuff))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncvoid __attribute__ ((error("wrong sized variable passed to swap")))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncwrong_size(void);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#else
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline void
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncwrong_size(void)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#if !(defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)))
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline int
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync__builtin_constant_p(int x)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync return 0;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* byte swap a 32-bit value */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline void
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncswap_uint32(uint32_t * x)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync char n = ((char *) x)[0];
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((char *) x)[0] = ((char *) x)[3];
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((char *) x)[3] = n;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync n = ((char *) x)[1];
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((char *) x)[1] = ((char *) x)[2];
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((char *) x)[2] = n;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define swapl(x) do { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (sizeof(*(x)) != 4) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync wrong_size(); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (__builtin_constant_p((uintptr_t)(x) & 3) && ((uintptr_t)(x) & 3) == 0) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync *(x) = lswapl(*(x)); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync else \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync swap_uint32((uint32_t *)(x)); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync } while (0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* byte swap a 16-bit value */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncstatic inline void
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncswap_uint16(uint16_t * x)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync{
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync char n = ((char *) x)[0];
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((char *) x)[0] = ((char *) x)[1];
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ((char *) x)[1] = n;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync}
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define swaps(x) do { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (sizeof(*(x)) != 2) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync wrong_size(); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (__builtin_constant_p((uintptr_t)(x) & 1) && ((uintptr_t)(x) & 1) == 0) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync *(x) = lswaps(*(x)); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync else \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync swap_uint16((uint16_t *)(x)); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync } while (0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* copy 32-bit value from src to dst byteswapping on the way */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define cpswapl(src, dst) do { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (sizeof((src)) != 4 || sizeof((dst)) != 4) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync wrong_size(); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync (dst) = lswapl((src)); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync } while (0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* copy short from src to dst byteswapping on the way */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define cpswaps(src, dst) do { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (sizeof((src)) != 2 || sizeof((dst)) != 2) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync wrong_size(); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync (dst) = lswaps((src)); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync } while (0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT void SwapLongs(CARD32 *list, unsigned long count);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT void SwapShorts(short *list, unsigned long count);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT void MakePredeclaredAtoms(void);
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT int Ones(unsigned long /*mask */ );
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _xPoint *DDXPointPtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct pixman_box16 *BoxPtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _xEvent *xEventPtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _xRectangle *xRectanglePtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _GrabRec *GrabPtr;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* typedefs from other places - duplicated here to minimize the amount
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * of unnecessary junk that one would normally have to include to get
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync * these symbols defined
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#ifndef _XTYPEDEF_CHARINFOPTR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsynctypedef struct _CharInfo *CharInfoPtr; /* also in fonts/include/font.h */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define _XTYPEDEF_CHARINFOPTR
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT unsigned long globalSerialNumber;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsyncextern _X_EXPORT unsigned long serverGeneration;
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync/* Don't use this directly, use BUG_WARN or BUG_WARN_MSG instead */
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define __BUG_WARN_MSG(cond, with_msg, ...) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync do { if (cond) { \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ErrorFSigSafe("BUG: triggered 'if (" #cond ")'\n"); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync ErrorFSigSafe("BUG: %s:%u in %s()\n", \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync __FILE__, __LINE__, __func__); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync if (with_msg) ErrorFSigSafe(__VA_ARGS__); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync xorg_backtrace(); \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync } } while(0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define BUG_WARN_MSG(cond, ...) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync __BUG_WARN_MSG(cond, 1, __VA_ARGS__)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define BUG_WARN(cond) __BUG_WARN_MSG(cond, 0, NULL)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define BUG_RETURN(cond) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync do { if (cond) { __BUG_WARN_MSG(cond, 0, NULL); return; } } while(0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define BUG_RETURN_MSG(cond, ...) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync do { if (cond) { __BUG_WARN_MSG(cond, 1, __VA_ARGS__); return; } } while(0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define BUG_RETURN_VAL(cond, val) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync do { if (cond) { __BUG_WARN_MSG(cond, 0, NULL); return (val); } } while(0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#define BUG_RETURN_VAL_MSG(cond, val, ...) \
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync do { if (cond) { __BUG_WARN_MSG(cond, 1, __VA_ARGS__); return (val); } } while(0)
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync
03532efdc331b598d3dedc8cc7477641c3b0dd12vboxsync#endif /* MISC_H */