/* @(#)Xlibos.h	1.5  com/XTOP/X11,3.1,9021 3/31/90 16:25:59 */
/*
 * COMPONENT_NAME: X11
 *
 * ORIGINS: 27
 * (C) COPYRIGHT International Business Machines Corp. 1987, 1990
 * All Rights Reserved
 *
 * Licensed Materials - Property of IBM
 * US Government Users Restricted Rights - Use, duplication or
 * disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
 *
*/

#include <netinet/in.h>
#include <sys/ioctl.h>
#include <netdb.h>
#include <sys/uio.h>	/* needed for XlibInt.c */

#include <sys/param.h> /* needed for XConnDis.c */

#ifndef AIXV3
#define AIXV3
#endif

#ifdef AIXV3
#include <values.h>
#ifndef NOFILE
#define NOFILE  (200)
#endif NOFILE

#define MAXSOCKS ( NOFILE - 1 )
#define MSKCNT ((MAXSOCKS + 31) / 32)   /* size of bit array */

#else AIXV3

#define MSKCNT ((LESNOFILE + 31) / 32)     /* size of bit array */

#endif AIXV3

#if (MSKCNT==1)
#define BITMASK(i) (1 << (i))
#define MASKIDX(i) 0
#endif
#if (MSKCNT>1)
#define BITMASK(i) (1 << ((i) & 31))
#define MASKIDX(i) ((i) >> 5)
#endif

#define MASKWORD(buf, i) buf[MASKIDX(i)]
#define BITSET(buf, i) MASKWORD(buf, i) |= BITMASK(i)
#define BITCLEAR(buf, i) MASKWORD(buf, i) &= ~BITMASK(i)
#define GETBIT(buf, i) (MASKWORD(buf, i) & BITMASK(i))

#if (MSKCNT==1)
#define COPYBITS(src, dst) dst[0] = src[0]
#define CLEARBITS(buf) buf[0] = 0
#define MASKANDSETBITS(dst, b1, b2) dst[0] = (b1[0] & b2[0])
#define ORBITS(dst, b1, b2) dst[0] = (b1[0] | b2[0])
#define UNSETBITS(dst, b1) (dst[0] &= ~b1[0])
#define ANYSET(src) (src[0])
#endif
#if (MSKCNT==2)
#define COPYBITS(src, dst) { dst[0] = src[0]; dst[1] = src[1]; }
#define CLEARBITS(buf) { buf[0] = 0; buf[1] = 0; }
#define MASKANDSETBITS(dst, b1, b2)  {\
		      dst[0] = (b1[0] & b2[0]);\
		      dst[1] = (b1[1] & b2[1]); }
#define ORBITS(dst, b1, b2)  {\
		      dst[0] = (b1[0] | b2[0]);\
		      dst[1] = (b1[1] | b2[1]); }
#define UNSETBITS(dst, b1) {\
                      dst[0] &= ~b1[0]; \
                      dst[1] &= ~b1[1]; }
#define ANYSET(src) (src[0] || src[1])
#endif
#if (MSKCNT==3)
#define COPYBITS(src, dst) { dst[0] = src[0]; dst[1] = src[1]; dst[2] = src[2]; }
#define CLEARBITS(buf) { buf[0] = 0; buf[1] = 0; buf[2] = 0; }
#define MASKANDSETBITS(dst, b1, b2)  {\
		      dst[0] = (b1[0] & b2[0]);\
		      dst[1] = (b1[1] & b2[1]);\
		      dst[2] = (b1[2] & b2[2]); }
#define ORBITS(dst, b1, b2)  {\
		      dst[0] = (b1[0] | b2[0]);\
		      dst[1] = (b1[1] | b2[1]);\
		      dst[2] = (b1[2] | b2[2]); }
#define UNSETBITS(dst, b1) {\
                      dst[0] &= ~b1[0]; \
                      dst[1] &= ~b1[1]; \
                      dst[2] &= ~b1[2]; }
#define ANYSET(src) (src[0] || src[1] || src[2])
#endif
#if (MSKCNT>3)
#define COPYBITS(src, dst) bcopy((caddr_t) src, (caddr_t) dst,\
				 MSKCNT*sizeof(long))
#define CLEARBITS(buf) bzero((caddr_t) buf, MSKCNT*sizeof(long))
#define MASKANDSETBITS(dst, b1, b2)  { int cri;\
		      for (cri=0; i<MSKCNT; cri++) \
		          dst[cri] = (b1[cri] & b2[cri]); }
#define ORBITS(dst, b1, b2)  { int cri;\
		      for (cri=0; i<MSKCNT; cri++) \
		          dst[cri] = (b1[cri] | b2[cri]); }
#define UNSETBITS(dst, b1)  { int cri;\
		      for (cri=0; i<MSKCNT; cri++) \
		          dst[cri] &= ~b1[cri]; }
#define ANYSET(src) (src[0] || src[1] || src[2])
#endif

#ifndef AIXV3
char *malloc(), *realloc(), *calloc(), *alloca();
#endif

char *strncpy(), *strncat();

void exit();
void bcopy();
void perror();
void free();

#ifdef AIXV3
#define SIGIO_MASK         (1 << (SIGIO - 1))
#define _XReadEvents(dis)  _XAsyncReadEvents(dis,1)
#define LockDisplay(dis)  if ( AIX_ASYNC != NULL ) { \
			   (AIX_ASYNC->per_display[dis->fd].Busy)++; \
			  }

#define UnlockDisplay(dis)  \
			   if (AIX_ASYNC != NULL) {  \
			   if (AIX_ASYNC->per_display[dis->fd].IOpending  && \
			       AIX_ASYNC->per_display[dis->fd].Busy == 1 ){  \
			     AIX_ASYNC->per_display[dis->fd].Busy = 0;       \
			     /* order is important here */                  \
			   } else if ( AIX_ASYNC->per_display[dis->fd].Busy>1){\
			     AIX_ASYNC->per_display[dis->fd].Busy--;         \
			   } else {                                         \
			     AIX_ASYNC->per_display[dis->fd].Busy = 0;       \
			   }   \
			   }
#else  NOT_AIX
#define LockDisplay(dis)
#define UnlockDisplay(dis)
#endif AIXV3

#define LockMutex(mutex)
#define UnlockMutex(mutex)

/* #ifdef AIXV3 */
/* #define Xfree(ptr) {if ((ptr)) free((ptr));} */
/* #else AIXV3 */

#define Xfree(ptr) free((ptr))

/* #endif AIXV3 */

#define Xalloca(size) alloca((size))

/*
 * Note that some machines do not return a valid pointer for malloc(0), in
 * which case we provide an alternate under the control of the
 * define MALLOC_0_RETURNS_NULL.  This is necessary because some
 * Xlib code expects malloc(0) to return a valid pointer to storage.
 */

#ifdef AIXV3
#define MALLOC_0_RETURNS_NULL
#endif /* AIXV3 */

#ifdef MALLOC_0_RETURNS_NULL

# define Xmalloc(size) malloc(((size) > 0 ? (size) : 1))
# define Xrealloc(ptr, size) realloc((ptr), ((size) > 0 ? (size) : 1))
# define Xcalloc(nelem, elsize) calloc(((nelem) > 0 ? (nelem) : 1), (elsize))

#else

# define Xmalloc(size) malloc((size))
# define Xrealloc(ptr, size) realloc((ptr), (size))
# define Xcalloc(nelem, elsize) calloc((nelem), (elsize))

#endif

#define BytesReadable(fd, ptr) ioctl ((fd), FIONREAD, (ptr))
#if !defined (mips) || !defined (SYSTYPE_SYSV)
#define ReadFromServer(dpy, data, size) read((dpy), (data), (size))
#define WriteToServer(dpy, bufind, size) write((dpy), (bufind), (size))
#endif /* !mips || !SYSTYPE_SYSV */
#define ReadvFromServer(dpy, iov, iovcnt) readv((dpy), (iov), (iovcnt))
#define WritevToServer(dpy, iov, iovcnt) writev((dpy), (iov), (iovcnt))
/*
 *	ReadvFromServer and WritevToSever use struct iovec, normally found
 *	in Berkeley systems in <sys/uio.h>.  See the readv(2) and writev(2)
 *	manual pages for details.
 *
 *	struct iovec {
 *		caddr_t iov_base;
 *		int iov_len;
 *	};
 */

extern char *index();
#define SearchString(string, char) index((string), (char))

#ifdef AIXV3
typedef struct _aix_async_display {
    Display   *display;
    int       Busy;
    int       IOpending;
    int       (*InputHandler)();
    int       async_disabled;
} aix_async_display;

typedef struct _aix_async {
  int               sigio_installed;
  void              (*PreviousSignalHandler)();
  int               num_fds;
  aix_async_display per_display[MAXSOCKS];
} aix_async;

extern aix_async *AIX_ASYNC;

#endif AIXV3
