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