#include <stdio.h>
#ifdef USG
#ifndef __TYPES__
#include <sys/types.h>
#define __TYPES__
#endif
#else
#if defined(_POSIX_SOURCE) && defined(MOTOROLA)
#undef _POSIX_SOURCE
#include <sys/types.h>
#define _POSIX_SOURCE
#else
#include <sys/types.h>
#endif
#endif
#include "FSlib.h"
#include "FSproto.h"
#include "FSlibos.h"
#include <errno.h>
#include <stddef.h>
typedef int (* FSIOErrorHandler)(FSServer *);
typedef int (* FSErrorHandler)(FSServer *, FSErrorEvent *);
extern FSIOErrorHandler _FSIOErrorFunction;
extern FSErrorHandler _FSErrorFunction;
extern void _FSEatData ( FSServer *svr, unsigned long n );
extern void _FSWaitForWritable ( FSServer *svr );
extern void _FSWaitForReadable ( FSServer *svr );
extern void _FSFlush ( FSServer *svr );
extern void _FSRead ( FSServer *svr, char *data, long size );
extern void _FSReadEvents ( FSServer *svr );
extern void _FSReadPad ( FSServer *svr, char *data, long size );
extern void _FSSend ( FSServer *svr, char *data, long size );
extern void _FSEnq ( FSServer *svr, fsEvent *event );
extern void _FSFreeServerStructure ( FSServer *svr );
extern int _FSError ( FSServer *svr, fsError *rep );
extern int _FSReply ( FSServer *svr, fsReply *rep, int extra, int discard );
extern XtransConnInfo _FSConnectServer ( char *server_name );
extern void _FSDisconnectServer ( XtransConnInfo trans_conn );
extern void _FSSendClientPrefix ( FSServer *svr, fsConnClientPrefix *client );
extern int _FSEventsQueued ( FSServer *svr, int mode );
extern unsigned long _FSSetLastRequestRead ( FSServer *svr,
fsGenericReply *rep );
extern int _FSUnknownWireEvent ( FSServer *svr, FSEvent *re, fsEvent *event );
extern int _FSUnknownNativeEvent ( FSServer *svr, FSEvent *re,
fsEvent *event );
extern int _FSWireToEvent ( FSServer *svr, FSEvent *re, fsEvent *event );
extern int _FSDefaultIOError ( FSServer *svr );
extern int _FSPrintDefaultError ( FSServer *svr, FSErrorEvent *event,
FILE *fp );
extern int _FSDefaultError ( FSServer *svr, FSErrorEvent *event );
extern char * _FSAllocScratch ( FSServer *svr, unsigned long nbytes );
extern void _FSFreeQ ( void );
extern int _FSGetHostname ( char *buf, int maxlen );
extern FSErrorHandler FSSetErrorHandler ( FSErrorHandler handler );
extern FSIOErrorHandler FSSetIOErrorHandler ( FSIOErrorHandler handler );
#ifndef BUFSIZE
#define BUFSIZE 2048
#endif
#define FSlibServerIOError (1L << 0)
#define FSlibServerClosing (1L << 1)
#ifdef WORD64
#define WORD64ALIGN if ((long)svr->bufptr >> 61) {\
svr->last_req = svr->bufptr;\
*(svr->bufptr) = FS_Noop;\
*(svr->bufptr+1) = 0;\
*(svr->bufptr+2) = 0;\
*(svr->bufptr+3) = 1;\
svr->request += 1;\
svr->bufptr += 4;\
}
#else
#define WORD64ALIGN
#endif
#if !defined(UNIXCPP) || defined(ANSICPP)
#define GetReq(name, req) \
WORD64ALIGN\
if ((svr->bufptr + SIZEOF(fs##name##Req)) > svr->bufmax)\
_FSFlush(svr);\
req = (fs##name##Req *)(svr->last_req = svr->bufptr);\
req->reqType = FS_##name;\
req->length = (SIZEOF(fs##name##Req))>>2;\
svr->bufptr += SIZEOF(fs##name##Req);\
svr->request++
#else
#define GetReq(name, req) \
WORD64ALIGN\
if ((svr->bufptr + SIZEOF(fsnameReq)) > svr->bufmax)\
_FSFlush(svr);\
req = (fsnameReq *)(svr->last_req = svr->bufptr);\
req->reqType = FS_name;\
req->length = (SIZEOF(fsnameReq))>>2;\
svr->bufptr += SIZEOF(fsnameReq);\
svr->request++
#endif
#if !defined(UNIXCPP) || defined(ANSICPP)
#define GetReqExtra(name, n, req) \
WORD64ALIGN\
if ((svr->bufptr + SIZEOF(fs##name##Req) + n) > svr->bufmax)\
_FSFlush(svr);\
req = (fs##name##Req *)(svr->last_req = svr->bufptr);\
req->reqType = FS_##name;\
req->length = (SIZEOF(fs##name##Req) + n)>>2;\
svr->bufptr += SIZEOF(fs##name##Req) + n;\
svr->request++
#else
#define GetReqExtra(name, n, req) \
WORD64ALIGN\
if ((svr->bufptr + SIZEOF(fsnameReq) + n) > svr->bufmax)\
_FSFlush(svr);\
req = (fsnameReq *)(svr->last_req = svr->bufptr);\
req->reqType = FS_name;\
req->length = (SIZEOF(fsnameReq) + n)>>2;\
svr->bufptr += SIZEOF(fsnameReq) + n;\
svr->request++
#endif
#if !defined(UNIXCPP) || defined(ANSICPP)
#define GetResReq(name, rid, req) \
WORD64ALIGN\
if ((svr->bufptr + SIZEOF(fsResourceReq)) > svr->bufmax)\
_FSFlush(svr);\
req = (fsResourceReq *) (svr->last_req = svr->bufptr);\
req->reqType = FS_##name;\
req->length = 2;\
req->id = (rid);\
svr->bufptr += SIZEOF(fsResourceReq);\
svr->request++
#else
#define GetResReq(name, rid, req) \
WORD64ALIGN\
if ((svr->bufptr + SIZEOF(fsResourceReq)) > svr->bufmax)\
_FSFlush(svr);\
req = (fsResourceReq *) (svr->last_req = svr->bufptr);\
req->reqType = FS_name;\
req->length = 2;\
req->id = (rid);\
svr->bufptr += SIZEOF(fsResourceReq);\
svr->request++
#endif
#if !defined(UNIXCPP) || defined(ANSICPP)
#define GetEmptyReq(name, req) \
WORD64ALIGN\
if ((svr->bufptr + SIZEOF(fsReq)) > svr->bufmax)\
_FSFlush(svr);\
req = (fsReq *) (svr->last_req = svr->bufptr);\
req->reqType = FS_##name;\
req->length = 1;\
svr->bufptr += SIZEOF(fsReq);\
svr->request++
#else
#define GetEmptyReq(name, req) \
WORD64ALIGN\
if ((svr->bufptr + SIZEOF(fsReq)) > svr->bufmax)\
_FSFlush(svr);\
req = (fsReq *) (svr->last_req = svr->bufptr);\
req->reqType = FS_name;\
req->length = 1;\
svr->bufptr += SIZEOF(fsReq);\
svr->request++
#endif
#define SyncHandle() \
if (svr->synchandler) (*svr->synchandler)(svr)
#ifdef DataRoutineIsProcedure
extern void Data();
#else
#define Data(svr, data, len) \
if (svr->bufptr + (len) <= svr->bufmax) {\
bcopy(data, svr->bufptr, (int)len);\
svr->bufptr += ((len) + 3) & ~3;\
} else\
_FSSend(svr, data, len)
#endif
#define BufAlloc(type, ptr, n) \
if (svr->bufptr + (n) > svr->bufmax) \
_FSFlush (svr); \
ptr = (type) svr->bufptr; \
svr->bufptr += (n);
#ifndef WORD64
#define Data16(dpy, data, len) Data((dpy), (char *)(data), (len))
#define Data32(dpy, data, len) Data((dpy), (char *)(data), (len))
#define _FSRead16Pad(dpy, data, len) _FSReadPad((dpy), (char *)(data), (len))
#define _FSRead16(dpy, data, len) _FSRead((dpy), (char *)(data), (len))
#define _FSRead32(dpy, data, len) _FSRead((dpy), (char *)(data), (len))
#endif
#define PackData16(dpy,data,len) Data16 (dpy, data, len)
#define PackData32(dpy,data,len) Data32 (dpy, data, len)
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
#ifdef MUSTCOPY
#define OneDataCard32(svr,dstaddr,srcvar) \
{ svr->bufptr -= 4; Data32 (svr, (char *) &(srcvar), 4); }
#define STARTITERATE(tpvar,type,start,endcond,decr) \
{ register char *cpvar; \
for (cpvar = (char *) start; endcond; cpvar = NEXTPTR(cpvar,type), decr) { \
type dummy; bcopy (cpvar, (char *) &dummy, SIZEOF(type)); \
tpvar = (type *) cpvar;
#define ENDITERATE }}
#else
#define OneDataCard32(svr,dstaddr,srcvar) \
{ *(unsigned long *)(dstaddr) = (srcvar); }
#define STARTITERATE(tpvar,type,start,endcond,decr) \
for (tpvar = (type *) start; endcond; tpvar++, decr) {
#define ENDITERATE }
#endif
#if !defined(UNIXCPP) || defined(ANSICPP)
#define FSCat(x,y) x##_##y
#else
#define FSCat(x,y) x_y
#endif
#define FSUnpack_XCharInfo(packet, structure) \
(structure)->left = FSCat(packet,left); \
(structure)->right = FSCat(packet,right); \
(structure)->width = FSCat(packet,width); \
(structure)->ascent = FSCat(packet,ascent); \
(structure)->descent = FSCat(packet,descent); \
(structure)->attributes = FSCat(packet,attributes)
#define FSUnpack_XFontInfoHeader(packet, structure, serverversion) \
(structure)->flags = (packet)->font_header_flags; \
(structure)->draw_direction = (packet)->font_header_draw_direction; \
\
if (serverversion > 1) { \
(structure)->char_range.min_char.high = (packet)->font_hdr_char_range_min_char_high; \
(structure)->char_range.min_char.low = (packet)->font_hdr_char_range_min_char_low; \
(structure)->char_range.max_char.high = (packet)->font_hdr_char_range_max_char_high; \
(structure)->char_range.max_char.low = (packet)->font_hdr_char_range_max_char_low; \
(structure)->default_char.high = (packet)->font_header_default_char_high; \
(structure)->default_char.low = (packet)->font_header_default_char_low; \
} else { \
(structure)->char_range.min_char.high = (packet)->font_hdr_char_range_min_char_low; \
(structure)->char_range.min_char.low = (packet)->font_hdr_char_range_min_char_high; \
(structure)->char_range.max_char.high = (packet)->font_hdr_char_range_max_char_low; \
(structure)->char_range.max_char.low = (packet)->font_hdr_char_range_max_char_high; \
(structure)->default_char.high = (packet)->font_header_default_char_low; \
(structure)->default_char.low = (packet)->font_header_default_char_high; \
} \
\
(structure)->font_ascent = (packet)->font_header_font_ascent; \
(structure)->font_descent = (packet)->font_header_font_descent; \
\
FSUnpack_XCharInfo((packet)->font_header_min_bounds, &(structure)->min_bounds); \
FSUnpack_XCharInfo((packet)->font_header_max_bounds, &(structure)->max_bounds)