aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/dps
diff options
context:
space:
mode:
authorReinhard Tartler <siretart@tauware.de>2011-10-10 17:43:39 +0200
committerReinhard Tartler <siretart@tauware.de>2011-10-10 17:43:39 +0200
commitf4092abdf94af6a99aff944d6264bc1284e8bdd4 (patch)
tree2ac1c9cc16ceb93edb2c4382c088dac5aeafdf0f /nx-X11/lib/dps
parenta840692edc9c6d19cd7c057f68e39c7d95eb767d (diff)
downloadnx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.gz
nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.tar.bz2
nx-libs-f4092abdf94af6a99aff944d6264bc1284e8bdd4.zip
Imported nx-X11-3.1.0-1.tar.gznx-X11/3.1.0-1
Summary: Imported nx-X11-3.1.0-1.tar.gz Keywords: Imported nx-X11-3.1.0-1.tar.gz into Git repository
Diffstat (limited to 'nx-X11/lib/dps')
-rw-r--r--nx-X11/lib/dps/DPSCAP.h77
-rw-r--r--nx-X11/lib/dps/DPSCAPClient.h139
-rw-r--r--nx-X11/lib/dps/DPSCAPproto.h180
-rw-r--r--nx-X11/lib/dps/Imakefile265
-rw-r--r--nx-X11/lib/dps/XDPS.c2235
-rw-r--r--nx-X11/lib/dps/Xlibnet.h284
-rw-r--r--nx-X11/lib/dps/Xstreams.h218
-rw-r--r--nx-X11/lib/dps/csconndi.c839
-rw-r--r--nx-X11/lib/dps/csfindNX.c657
-rw-r--r--nx-X11/lib/dps/csfindNX.h93
-rw-r--r--nx-X11/lib/dps/cslibext.c762
-rw-r--r--nx-X11/lib/dps/cslibint.c1910
-rw-r--r--nx-X11/lib/dps/cslibint.h302
-rw-r--r--nx-X11/lib/dps/csopendi.c567
-rw-r--r--nx-X11/lib/dps/csstartNX.c237
-rw-r--r--nx-X11/lib/dps/csstartNX.h67
-rw-r--r--nx-X11/lib/dps/dps-def.cpp991
-rw-r--r--nx-X11/lib/dps/dpsNXprops.h90
-rw-r--r--nx-X11/lib/dps/dpsXclient.c1134
-rw-r--r--nx-X11/lib/dps/dpsXcmu.c1602
-rw-r--r--nx-X11/lib/dps/dpsXint.h104
-rw-r--r--nx-X11/lib/dps/dpsXops.psw80
-rw-r--r--nx-X11/lib/dps/dpsXpriv.c534
-rw-r--r--nx-X11/lib/dps/dpsXpriv.h187
-rw-r--r--nx-X11/lib/dps/dpsXtdisp.c109
-rw-r--r--nx-X11/lib/dps/dpsabbrev.c360
-rw-r--r--nx-X11/lib/dps/dpsassert.h57
-rw-r--r--nx-X11/lib/dps/dpsclient.c2969
-rw-r--r--nx-X11/lib/dps/dpsclrops.psw81
-rw-r--r--nx-X11/lib/dps/dpsctrlops.psw114
-rw-r--r--nx-X11/lib/dps/dpsctxtops.psw110
-rw-r--r--nx-X11/lib/dps/dpsdataops.psw258
-rw-r--r--nx-X11/lib/dps/dpsdict.c189
-rw-r--r--nx-X11/lib/dps/dpsdict.h78
-rw-r--r--nx-X11/lib/dps/dpsendif.txt5
-rw-r--r--nx-X11/lib/dps/dpsexcept.c73
-rw-r--r--nx-X11/lib/dps/dpsfontops.psw109
-rw-r--r--nx-X11/lib/dps/dpsgsttops.psw213
-rw-r--r--nx-X11/lib/dps/dpsifdef.txt7
-rw-r--r--nx-X11/lib/dps/dpsint.h125
-rw-r--r--nx-X11/lib/dps/dpsioops.psw153
-rw-r--r--nx-X11/lib/dps/dpsl2ops.psw208
-rw-r--r--nx-X11/lib/dps/dpsmathops.psw125
-rw-r--r--nx-X11/lib/dps/dpsmiscops.psw53
-rw-r--r--nx-X11/lib/dps/dpsmtrxops.psw65
-rw-r--r--nx-X11/lib/dps/dpsname.txt4
-rw-r--r--nx-X11/lib/dps/dpsopstack.psw96
-rw-r--r--nx-X11/lib/dps/dpspathops.psw169
-rw-r--r--nx-X11/lib/dps/dpspntops.psw129
-rw-r--r--nx-X11/lib/dps/dpsprintf.c68
-rw-r--r--nx-X11/lib/dps/dpsprivate.h127
-rw-r--r--nx-X11/lib/dps/dpssimpint.h88
-rw-r--r--nx-X11/lib/dps/dpssysnames.c444
-rw-r--r--nx-X11/lib/dps/dpssysops.psw149
-rw-r--r--nx-X11/lib/dps/dpswinops.psw65
-rw-r--r--nx-X11/lib/dps/else.txt6
-rw-r--r--nx-X11/lib/dps/genheader.cmd14
-rw-r--r--nx-X11/lib/dps/header.txt35
-rw-r--r--nx-X11/lib/dps/psXops.psw81
-rw-r--r--nx-X11/lib/dps/psclrops.psw81
-rw-r--r--nx-X11/lib/dps/psctrlops.psw113
-rw-r--r--nx-X11/lib/dps/psctxtops.psw109
-rw-r--r--nx-X11/lib/dps/psdataops.psw257
-rw-r--r--nx-X11/lib/dps/psendif.txt6
-rw-r--r--nx-X11/lib/dps/psfontops.psw109
-rw-r--r--nx-X11/lib/dps/psgsttops.psw213
-rw-r--r--nx-X11/lib/dps/psifdef.txt7
-rw-r--r--nx-X11/lib/dps/psioops.psw153
-rw-r--r--nx-X11/lib/dps/psl2ops.psw208
-rw-r--r--nx-X11/lib/dps/psmathops.psw125
-rw-r--r--nx-X11/lib/dps/psmiscops.psw53
-rw-r--r--nx-X11/lib/dps/psmtrxops.psw65
-rw-r--r--nx-X11/lib/dps/psname.txt3
-rw-r--r--nx-X11/lib/dps/psopstack.psw96
-rw-r--r--nx-X11/lib/dps/pspathops.psw169
-rw-r--r--nx-X11/lib/dps/pspntops.psw129
-rw-r--r--nx-X11/lib/dps/pssysops.psw150
-rw-r--r--nx-X11/lib/dps/pswinops.psw66
-rw-r--r--nx-X11/lib/dps/publictypes.h71
79 files changed, 22673 insertions, 0 deletions
diff --git a/nx-X11/lib/dps/DPSCAP.h b/nx-X11/lib/dps/DPSCAP.h
new file mode 100644
index 000000000..cb36016c2
--- /dev/null
+++ b/nx-X11/lib/dps/DPSCAP.h
@@ -0,0 +1,77 @@
+/*
+ * DPSCAP.h -- CAP constants, analogous to X.h
+ *
+ * (c) Copyright 1990-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef _DPSCAP_h
+#define _DPSCAP_h
+
+/* DPSCAPConnSetup functional hint flags */
+
+#define DPSCAPNONEFLAG 0x0000
+
+/* Values for DPSCAPNotify */
+
+#define DPSCAPNOTE_GRAB 0
+#define DPSCAPNOTE_UNGRAB 1
+#define DPSCAPNOTE_FREEGC 2
+#define DPSCAPNOTE_SYNC 3
+#define DPSCAPNOTE_PAUSE 4
+
+/* Minor opcodes for CAP errors */
+
+#define DPSCAPDEADLOCK 0
+
+/* Pnames for ClientMessage type atoms */
+
+
+#define DPSCAP_TYPE_PSOUTPUT "_ADOBE_DPSCAP_TYPE_PSOUTPUT"
+#define DPSCAP_TYPE_PSOUTPUT_LEN "_ADOBE_DPSCAP_TYPE_PSOUTPUT_WITH_LEN"
+#define DPSCAP_TYPE_PSSTATUS "_ADOBE_DPSCAP_TYPE_PSSTATUS"
+#define DPSCAP_TYPE_NOOP "_ADOBE_DPSCAP_TYPE_NOOP"
+#define DPSCAP_TYPE_SYNC "_ADOBE_DPSCAP_TYPE_SYNC"
+#define DPSCAP_TYPE_XERROR "_ADOBE_DPSCAP_TYPE_XERROR"
+#define DPSCAP_TYPE_PSREADY "_ADOBE_DPSCAP_TYPE_PSREADY"
+#define DPSCAP_TYPE_RESUME "_ADOBE_DPSCAP_TYPE_RESUME"
+
+#define DPSCAP_ATOMS 8
+
+/* Translate argument names for X_CAPSetArg, see dpsNXargs.h */
+
+#define DPSCAP_ARG_SMALLFONTS 1
+#define DPSCAP_ARG_PIXMEM 2
+
+#endif /* _DPSCAP_h */
diff --git a/nx-X11/lib/dps/DPSCAPClient.h b/nx-X11/lib/dps/DPSCAPClient.h
new file mode 100644
index 000000000..803acf3ed
--- /dev/null
+++ b/nx-X11/lib/dps/DPSCAPClient.h
@@ -0,0 +1,139 @@
+/*
+ * DPSCAPClient.h -- DPSCAP client definitions
+ *
+ * (c) Copyright 1990-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef DPSCAPCLIENT_H
+#define DPSCAPCLIENT_H 1
+
+#include "DPSCAP.h"
+#include "DPSCAPproto.h"
+#include <X11/Xlib.h>
+#ifndef Xmalloc
+#endif
+#include <DPS/XDPSlib.h>
+
+/* === DEFINES === */
+
+#ifndef _NFILE
+#define _NFILE 128
+#endif
+
+#define DPSCAPFAILED -1
+#define DPSCAPSUCCESS 0
+
+#define DPSGCBITS \
+(GCPlaneMask|GCSubwindowMode|GCClipXOrigin|GCClipYOrigin|GCClipMask)
+
+/* === TYPEDEFS === */
+
+typedef enum {
+ dpscap_nopad,
+ dpscap_pad,
+ dpscap_insert,
+ dpscap_append
+} DPSCAPIOFlags;
+
+typedef struct _t_DPSCAPData {
+ struct _t_DPSCAPData *next;
+ Display *dpy;
+ /* shadow connection to agent */
+ Display *agent; /* Dummy display structure is agent */
+ char *otherConnID; /* VMS AST? */
+ XExtCodes *codes;
+ XExtData *extData; /* Back pointer for clearing private */
+ Atom typePSOutput;
+ Atom typePSOutputWithLen;
+ Atom typePSStatus;
+ Atom typeNoop;
+ Atom typeSync;
+ Atom typeXError;
+ Atom typePSReady; /* L2-DPS/PROTO 9 addition */
+ Atom typeResume;
+ unsigned long saveseq;
+ int dpscapVersion;
+ Window agentWindow;
+} DPSCAPDataRec, *DPSCAPData;
+
+typedef struct {
+ struct _t_DPSCAPData *head; /* list of active agent connections */
+ char *defaultAgentName; /* settable agent name */
+ char *map[_NFILE]; /* map DPY_NUMBER to agent name */
+} DPSCAPGlobalsRec, *DPSCAPGlobals;
+
+/* === GLOBALS === */
+
+extern DPSCAPGlobals gCSDPS;
+
+/* === PUBLIC PROCS === */
+
+extern int CSDPSInit(Display * /* dpy */, int * /* numberType */, char ** /* floatingName */);
+
+extern XExtData **CSDPSHeadOfDpyExt(Display * /* dpy */);
+
+/* === SUPPORT PROCS === */
+
+extern void DPSCAPChangeGC(Display * /* agent */, GC /* gc */, unsigned long /* valuemask */, XGCValues * /* values */);
+
+extern DPSCAPData DPSCAPCreate(Display * /* dpy */, Display * /* agent */);
+
+extern int DPSCAPDestroy(XExtData * /* extData */);
+
+extern XExtData * DPSCAPOpenAgent(Display * /* dpy */, char * /* trueDisplayName */);
+
+extern void DPSCAPRead(DPSCAPData /* my */, char * /* buf */, unsigned /* len */, DPSCAPIOFlags /* includePad */);
+
+extern void DPSCAPStartUp(void);
+
+extern void DPSCAPWrite(Display * /* my */, char * /* buf */, unsigned /* len */, DPSCAPIOFlags /* writePad */, DPSCAPIOFlags /* bufMode */);
+
+/* ext callback hooks */
+
+extern int DPSCAPCloseDisplayProc(Display * /* dpy */, XExtCodes * /* codes */);
+
+extern int DPSCAPGrabServerProc(Display * /* dpy */, XExtCodes * /* codes */);
+
+extern int DPSCAPUngrabServerProc(Display * /* dpy */, XExtCodes * /* codes */);
+
+extern void DPSCAPCloseAgent(Display * /* agent */);
+
+extern int DPSCAPCopyGCProc(Display * /* dpy */, GC /* gc */, XExtCodes * /* codes */);
+
+extern int DPSCAPFreeGCProc(Display * /* pdpy */, GC /* gc */, XExtCodes * /* codes */);
+
+extern int DPSCAPFlushGCProc(Display * /* dpy */, GC /* gc */, XExtCodes * /* codes */);
+
+#endif /* DPSCAPCLIENT_H */
diff --git a/nx-X11/lib/dps/DPSCAPproto.h b/nx-X11/lib/dps/DPSCAPproto.h
new file mode 100644
index 000000000..e35487b2b
--- /dev/null
+++ b/nx-X11/lib/dps/DPSCAPproto.h
@@ -0,0 +1,180 @@
+/*
+ * DPSCAPproto.h -- CAP requests constants and alignment values,
+ * analgous to Xproto.h
+ *
+ * (c) Copyright 1991-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+
+#ifndef _DPSCAPproto_h
+#define _DPSCAPproto_h
+
+/* === DEFINITIONS === */
+
+#define DPSCAPPROTOVERSION 3
+#define DPSCAPPROTOVERSION_2 2
+
+#define CSDPSPORT 6016 /* add agent instance number */
+#define DPS_NX_SERV_NAME "dpsnx" /* name to look up in /etc/services */
+
+/* Request Opcodes */
+
+#define DPSCAPOPCODEBASE 126
+#define DPSXOPCODEBASE 125
+
+#define X_CAPFlushAgent 1
+#define X_CAPNotify 2
+#define X_CAPSetArg 3
+
+/* === REQUESTS === */
+
+typedef struct _CAPConnSetup {
+ BYTE byteorder; /* #x42 MSB, #x6C LSB */
+ BYTE dpscapVersion; /* proto version of connecting client */
+ CARD16 flags B16; /* functional hint flags */
+ CARD32 libraryversion B32; /* as for XPSInit */
+ CARD16 authProtoNameLength B16; /* in bytes */
+ CARD16 authProtoDataLength B16; /* in bytes */
+ CARD16 displayStringLength B16; /* in bytes */
+ CARD16 nodeStringLength B16; /* in bytes */
+ CARD16 transportStringLength B16; /* in bytes */
+ CARD16 display B16; /* Display number */
+ CARD16 screen B16; /* Screen number */
+ CARD16 reserved B16;
+ CARD32 clientWindow B32; /* window for ClientMessage */
+} xCAPConnSetupReq;
+#define sz_xCAPConnSetupReq 28
+
+typedef struct {
+ BYTE success;
+ BYTE reasonLength;
+ CARD16 additionalLength B16;
+} xCAPConnReplyPrefix;
+#define sz_xCAPConnReplyPrefix 4
+
+typedef struct _CAPConnFailed {
+ BYTE success; /* failed = 0, success = 1 */
+ BYTE reasonLength; /* in bytes if failed, ignore if success */
+ CARD16 additionalLength B16;/* quadbytes ADDITIONAL length */
+ CARD32 serverVersion B32; /* as for XPSInit */
+ CARD8 dpscapVersion; /* proto version of agent */
+ CARD8 pad;
+ CARD16 reserved B16;
+} xCAPConnFailed;
+#define sz_xCAPConnFailed 12
+
+typedef struct _CAPConnSuccess {
+ BYTE success; /* failed = 0, success = 1 */
+ BYTE reasonLength; /* in bytes if failed, ignore if success */
+ CARD16 additionalLength B16;/* quadbytes ADDITIONAL length */
+ CARD32 serverVersion B32; /* as for XPSInit */
+ CARD8 dpscapVersion; /* proto version of agent */
+ CARD8 reserved;
+ CARD16 flagsUsed B16; /* mask of functional hint flags used */
+ CARD32 preferredNumberFormat B32; /* as for XPSInit */
+ CARD32 floatingNameLength B32; /* as for XPSInit */
+ CARD32 agentWindow B32; /* client sends messages to this window */
+} xCAPConnSuccess;
+#define sz_xCAPConnSuccess 24
+
+typedef struct _CAPFlushAgent {
+ CARD8 reqType; /* always DPSCAPOPCODEBASE */
+ CARD8 type; /* always X_CAPFlushAgent */
+ CARD16 length B16; /* quadbyte length of request */
+ CARD32 cxid B32; /* context XID */
+} xCAPFlushAgentReq;
+#define sz_xCAPFlushAgentReq 8
+
+typedef struct _CAPNotify {
+ CARD8 reqType; /* always DPSCAPOPCODEBASE */
+ CARD8 type; /* always X_CAPNotify */
+ CARD16 length B16; /* quadbyte length of request */
+ CARD32 cxid B32; /* context XID */
+ CARD32 notification B32; /* notify code */
+ CARD32 data B32; /* data word */
+ CARD32 extra B32; /* extra word */
+} xCAPNotifyReq;
+#define sz_xCAPNotifyReq 20
+
+typedef struct _CAPSetArg {
+ CARD8 reqType; /* always DPSCAPOPCODEBASE */
+ CARD8 type; /* always X_CAPNotify */
+ CARD16 length B16; /* quadbyte length of request */
+ CARD32 arg B32; /* argument type */
+ CARD32 val B32; /* value */
+} xCAPSetArgReq;
+#define sz_xCAPSetArgReq 12
+
+/* === ERRORS === */
+
+typedef struct _DPSCAPError {
+ BYTE type; /* always 0 */
+ BYTE errorCode; /* always 255 */
+ CARD16 sequenceNumber B16; /* the nth request from this client */
+ CARD8 subLength; /* how much of 21 bytes are used */
+ CARD8 unused;
+ CARD16 reserved B16;
+ CARD16 minorOpcode B16;
+ CARD8 majorOpcode; /* always 0 */
+ BYTE subData1;
+ CARD32 subData2 B32;
+ CARD32 subData3 B32;
+ CARD32 subData4 B32;
+ CARD32 subData5 B32;
+ CARD32 subData6 B32;
+ CARD32 subData7 B32;
+} xDPSCAPError;
+
+/* === EVENTS === */
+
+/* Events sent from agent to client via XSendEvent */
+
+#define DPSCAP_OUTPUT_OVERHEAD 4
+#define DPSCAP_BYTESPEROUTPUTEVENT (20 - DPSCAP_OUTPUT_OVERHEAD)
+#define DPSCAP_DATA_LEN (DPSCAP_BYTESPEROUTPUTEVENT-1)
+
+typedef struct {
+ CARD32 cxid;
+ CARD8 data[DPSCAP_BYTESPEROUTPUTEVENT];
+} DPSCAPOutputEvent;
+
+typedef struct {
+ BYTE status;
+ BYTE unused;
+ CARD16 sequenceNumber;
+ CARD32 cxid;
+} DPSCAPStatusEvent;
+
+#endif /* _DPSCAPproto_h */
diff --git a/nx-X11/lib/dps/Imakefile b/nx-X11/lib/dps/Imakefile
new file mode 100644
index 000000000..119b3429e
--- /dev/null
+++ b/nx-X11/lib/dps/Imakefile
@@ -0,0 +1,265 @@
+XCOMM $XFree86: xc/lib/dps/Imakefile,v 1.16tsi Exp $
+
+#define DoNormalLib NormalLibDps
+#define DoSharedLib SharedLibDps
+#define DoExtraLib SharedLibDps
+#define DoDebugLib DebugLibDps
+#define DoProfileLib ProfileLibDps
+#define LibName dps
+#define SoRev SODPSREV
+#define IncSubdir DPS
+
+#ifdef SharedDPSReqs
+REQUIREDLIBS = SharedDPSReqs
+#endif
+
+XCOMM The Client Library uses definitions just like Xlib for network
+XCOMM capabilities, such as TCPCONN, UNIXCONN, and DNETCONN. See
+XCOMM csconndi.c and csopendi.c
+
+XCOMM The connection code should be rewritten to use xtrans. The STREAMSCONN
+XCOMM code here needs work. For now force ConnectionFlags to be
+XCOMM -DTCPCONN -DUNIXCONN
+
+#undef ConnectionFlags
+#define ConnectionFlags -DTCPCONN -DUNIXCONN
+
+ DEFINES = -DXDPS -DCSDPS ConnectionFlags
+ CAT = cat
+ SED = sed
+ AWK = awk
+ SORT = sort
+ PSWRAP = PsWrap
+
+COMMONOBJECTFILES = \
+ dpsclient.o\
+ dpsprintf.o\
+ dpsexcept.o\
+ dpsdict.o\
+ dpsabbrev.o
+
+COMMONSOURCEFILES = \
+ dpsclient.c\
+ dpsprintf.c\
+ dpsexcept.c\
+ dpsdict.c\
+ dpsabbrev.c
+
+XOBJECTFILES = \
+ dpsXclient.o\
+ dpssysnames.o\
+ dpsXpriv.o\
+ XDPS.o\
+ dpsXtdisp.o\
+ dpsXcmu.o
+
+XSOURCEFILES = \
+ dpsXclient.c\
+ dpssysnames.c\
+ dpsXpriv.c\
+ XDPS.c\
+ dpsXtdisp.c\
+ dpsXcmu.c
+
+XCSDPSOBJECTFILES = \
+ cslibext.o\
+ csopendi.o\
+ csconndi.o\
+ csstartNX.o\
+ csfindNX.o\
+ cslibint.o
+
+XCSDPSSOURCEFILES = \
+ cslibext.c\
+ csopendi.c\
+ csconndi.c\
+ csstartNX.c\
+ csfindNX.c\
+ cslibint.c
+
+DPSOPSOBJECTS = \
+ dpsclrops.o\
+ dpsctrlops.o\
+ dpsctxtops.o\
+ dpsdataops.o\
+ dpsfontops.o\
+ dpsgsttops.o\
+ dpsioops.o\
+ dpsmathops.o\
+ dpsmtrxops.o\
+ dpsmiscops.o\
+ dpspntops.o\
+ dpspathops.o\
+ dpssysops.o\
+ dpswinops.o\
+ dpsopstack.o\
+ dpsXops.o\
+ dpsl2ops.o
+
+PSOPSOBJECTS = \
+ psclrops.o\
+ psctrlops.o\
+ psctxtops.o\
+ psdataops.o\
+ psfontops.o\
+ psgsttops.o\
+ psioops.o\
+ psmathops.o\
+ psmtrxops.o\
+ psmiscops.o\
+ pspntops.o\
+ pspathops.o\
+ pssysops.o\
+ pswinops.o\
+ psopstack.o\
+ psXops.o\
+ psl2ops.o
+
+DPSOPSHEADERFILES = \
+ dpsclrops.h\
+ dpsctrlops.h\
+ dpsctxtops.h\
+ dpsdataops.h\
+ dpsfontops.h\
+ dpsgsttops.h\
+ dpsioops.h\
+ dpsmathops.h\
+ dpsmtrxops.h\
+ dpsmiscops.h\
+ dpsopstack.h\
+ dpspntops.h\
+ dpspathops.h\
+ dpssysops.h\
+ dpswinops.h\
+ dpsXops.h\
+ dpsl2ops.h
+
+PSOPSHEADERFILES = \
+ psclrops.h\
+ psctrlops.h\
+ psctxtops.h\
+ psdataops.h\
+ psfontops.h\
+ psgsttops.h\
+ psioops.h\
+ psmathops.h\
+ psmtrxops.h\
+ psmiscops.h\
+ pspntops.h\
+ pspathops.h\
+ pssysops.h\
+ pswinops.h\
+ psopstack.h\
+ psXops.h\
+ psl2ops.h
+
+DPSOPSCFILES = \
+ dpsclrops.c\
+ dpsctrlops.c\
+ dpsctxtops.c\
+ dpsdataops.c\
+ dpsfontops.c\
+ dpsgsttops.c\
+ dpsioops.c\
+ dpsmathops.c\
+ dpsmtrxops.c\
+ dpsmiscops.c\
+ dpsopstack.c\
+ dpspntops.c\
+ dpspathops.c\
+ dpssysops.c\
+ dpswinops.c\
+ dpsXops.c\
+ dpsl2ops.c
+
+PSOPSCFILES = \
+ psclrops.c\
+ psctrlops.c\
+ psctxtops.c\
+ psdataops.c\
+ psfontops.c\
+ psgsttops.c\
+ psioops.c\
+ psmathops.c\
+ psmtrxops.c\
+ psmiscops.c\
+ pspntops.c\
+ pspathops.c\
+ pssysops.c\
+ pswinops.c\
+ psopstack.c\
+ psXops.c\
+ psl2ops.c
+
+/*
+ * hv: HEADERS must be here, otherwise IncSubdir-triggered BuildIncludes
+ * will fail on systems without ln cmd
+ */
+HEADERS = psops.h dpsops.h
+
+all:: $(HEADERS)
+
+includes:: $(DPSOPSCFILES) $(PSOPSCFILES) $(HEADERS)
+
+$(DPSOPSCFILES) $(PSOPSCFILES): HostProgramTargetName($(PSWRAP))
+
+SRCS = \
+ ${COMMONSOURCEFILES} \
+ ${XSOURCEFILES} \
+ ${XCSDPSSOURCEFILES} \
+ ${DPSOPSCFILES} \
+ ${PSOPSCFILES}
+
+OBJS = \
+ ${COMMONOBJECTFILES} \
+ ${XOBJECTFILES} \
+ ${XCSDPSOBJECTFILES} \
+ ${DPSOPSOBJECTS} \
+ ${PSOPSOBJECTS}
+
+DERIVED_FILES = $(DPSOPSHEADERFILES) $(PSOPSHEADERFILES) \
+ $(DPSOPSCFILES) $(PSOPSCFILES)
+
+#include <Library.tmpl>
+
+.SUFFIXES: .psw .h
+
+.psw.c : HostProgramTargetName($(PSWRAP))
+ RunProgram(PSWRAP,-a -o $*.c -h $*.h $<)
+
+.psw.h : HostProgramTargetName($(PSWRAP))
+ RunProgram(PSWRAP,-a -h $*.h $< > /dev/null)
+
+HostProgramTargetName($(PSWRAP)):
+ @echo "checking $@ over in $(PSWRAPSRC) first..."; \
+ test -d $(PSWRAPSRC) && cd $(PSWRAPSRC) && $(MAKE) pswraponly; \
+ echo "okay, continuing in $(CURRENT_DIR)"
+
+includes :: $(HEADERS)
+depend :: $(DPSOPSCFILES) $(PSOPSCFILES)
+
+psops.h : $(PSOPSHEADERFILES)
+ RemoveFile($@)
+ ${CAT} $(PSOPSHEADERFILES) |\
+ ${SED} -e '/^$$/D' -e '/#/D' -e '/^\//D'\
+ -e '/^ gener/D' -e '/^.\//D' |\
+ ${SORT} > .sort
+ ${AWK} '/;/ {print; printf("\n");}' .sort > .ttt
+ ${CAT} psname.txt header.txt psifdef.txt .ttt psendif.txt > psops.h
+ RemoveFiles(.sort .ttt .attt)
+
+dpsops.h : psops.h $(DPSOPSHEADERFILES)
+ RemoveFile($@)
+ ${CAT} $(DPSOPSHEADERFILES) |\
+ ${SED} -e '/^$$/D' -e '/#/D' -e '/^\//D'\
+ -e '/^ gener/D' -e '/^.\//D' |\
+ ${SORT} > .sort
+ ${AWK} '/;/ {print; printf("\n");}' .sort > .ttt
+ ${CAT} dpsname.txt header.txt dpsifdef.txt .ttt dpsendif.txt > dpsops.h
+ RemoveFiles(.sort .ttt .attt)
+
+clean ::
+ ${RM} $(DERIVED_FILES) .sort .ttt .att psops.h dpsops.h *%
+
+DependTarget()
+
diff --git a/nx-X11/lib/dps/XDPS.c b/nx-X11/lib/dps/XDPS.c
new file mode 100644
index 000000000..5b1614e4c
--- /dev/null
+++ b/nx-X11/lib/dps/XDPS.c
@@ -0,0 +1,2235 @@
+/*
+ * XDPS.c -- implementation of low-level Xlib routines for XDPS extension
+ *
+ * (c) Copyright 1989-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86: xc/lib/dps/XDPS.c,v 1.4tsi Exp $ */
+
+#define NEED_EVENTS
+#define NEED_REPLIES
+
+#include <stdio.h>
+/* Include this first so that Xasync.h, included from Xlibint.h, can find
+ the definition of NOFILE */
+#include <stdlib.h>
+#include <sys/param.h>
+#include <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+#include "DPS/XDPS.h"
+#include "DPS/XDPSproto.h"
+#include "DPS/XDPSlib.h"
+#include "DPS/dpsNXargs.h"
+
+#include "cslibint.h"
+#include "dpsassert.h"
+#include "DPSCAPClient.h"
+
+#include "publictypes.h"
+#include "dpsXpriv.h"
+
+/* === DEFINITIONS === */
+
+#ifndef _NFILE
+#define DPSMAXDISPLAYS 128
+#else
+#define DPSMAXDISPLAYS _NFILE
+#endif /* _NFILE */
+
+#define MajorOpCode(dpy) (Codes[DPY_NUMBER(dpy)] ? \
+ Codes[DPY_NUMBER(dpy)]->major_opcode : \
+ Punt())
+
+#define DPSCAP_INITCTXTS 4 /* per display */
+
+/* === TYPES === */
+
+typedef Status (*PSCMProc)(Display *, XEvent *, xEvent *);
+
+typedef struct {
+ char passEvents;
+ char wrapWaiting;
+ char syncMask; /* CSDPS only */
+ char debugMask; /* CSDPS only */
+} DPSDisplayFlags;
+
+/* For now DPSDisplayFlags is no larger than a pointer. Revisit this if the
+ structure grows. */
+
+typedef int (*GenericProcPtrReturnsInt)(Display *);
+
+typedef struct _t_DPSCAPPausedContextData {
+ struct _t_DPSCAPPausedContextData *next;
+ Bool paused;
+ ContextXID cxid;
+ unsigned int seqnum;
+} DPSCAPPausedContextData;
+
+typedef struct {
+ char showSmallSizes;
+ char pixMem;
+} DPSCAPAgentArgs;
+
+typedef struct {
+ void (*Flush)(Display *);
+ int (*Read)(Display*, char*, long);
+ void (*ReadPad)(Display*, char*, long);
+ Status (*Reply)(Display*, xReply*, int, Bool);
+ void (*Send)(Display*, _Xconst char*, long);
+} XDPSLIOProcs;
+
+/* === GLOBALS === */
+
+/* For debugging, allows client to force the library to use an agent */
+int gForceCSDPS = 0;
+
+/* Force all DPS NX protocol requests to flush if CSDPS */
+int gAutoFlush = 1;
+
+/* Force all NX XDPSLGiveInputs to flush independent of gAutoFlush */
+int gForceFlush = 1;
+
+/* Quick check for any paused contexts */
+int gTotalPaused = 0;
+
+/* === LOCALS === */
+
+/* Common stuff */
+static XExtCodes *Codes[DPSMAXDISPLAYS];
+static int version[DPSMAXDISPLAYS];
+static XDPSLEventHandler StatusProc[DPSMAXDISPLAYS];
+static DPSDisplayFlags displayFlags[DPSMAXDISPLAYS];
+static XDPSLEventHandler TextProc = NULL;
+static XDPSLEventHandler ReadyProc[DPSMAXDISPLAYS]; /* L2-DPS/PROTO 9 */
+static int NumberType[DPSMAXDISPLAYS]; /* Garbage okay after dpy closed */
+static char *FloatingName[DPSMAXDISPLAYS]; /* Garbage okay after dpy closed */
+
+/* CSDPS stuff */
+static Display *ShuntMap[DPSMAXDISPLAYS];
+static PSCMProc ClientMsgProc[DPSMAXDISPLAYS];
+static GenericProcPtrReturnsInt AfterProcs[DPSMAXDISPLAYS];
+static DPSCAPPausedContextData *PausedPerDisplay[DPSMAXDISPLAYS];
+static DPSCAPAgentArgs AgentArgs[DPSMAXDISPLAYS];
+static unsigned int LastXRequest[DPSMAXDISPLAYS];
+static int GCFlushMode[DPSMAXDISPLAYS];
+
+#ifdef VMS
+static Display *dpys[DPSMAXDISPLAYS];
+static nextDpy = 0;
+#endif /* VMS */
+
+static void DPSCAPInitGC(Display *dpy, Display *agent, GC gc);
+static Status DPSCAPClientMessageProc(Display *dpy, XEvent *re, xEvent *event);
+static int DPSCAPAfterProc(Display *xdpy);
+static unsigned int DPSCAPSetPause(Display *xdpy, ContextXID cxid);
+static Bool DPSCAPResumeContext(Display *xdpy, ContextXID cxid);
+static Bool WaitForSyncProc(Display *xdpy, XEvent *event, char *arg);
+
+static XDPSLIOProcs xlProcs = { /* Use these for DPS/X extension */
+ _XFlush,
+ _XRead,
+ _XReadPad,
+ _XReply,
+ _XSend
+ };
+
+static XDPSLIOProcs nxlProcs = { /* Use these for NX */
+ N_XFlush,
+ N_XRead,
+ N_XReadPad,
+ N_XReply,
+ N_XSend
+ };
+
+/* === MACROS === */
+
+#define IFNXSETCALL(a, x) call = ((a) != (x)) ? &nxlProcs : &xlProcs
+
+/* === PRIVATE PROCS === */
+
+static int Punt(void)
+{
+ DPSFatalProc(NULL, "Extension has not been initialized");
+ exit(1);
+}
+
+#ifdef VMS
+/* This is a terribly inefficient way to find a per-display index, but we
+ need it till we get dpy->fd fixed in VMS%%%%%*/
+static int FindDpyNum(Display *dpy)
+{
+int i;
+for (i=0; dpys[i] != dpy ; i++)
+ {
+ if (i == nextDpy)
+ {
+ dpys[nextDpy++]=dpy;
+ break;
+ }
+ }
+return i;
+}
+#define DPY_NUMBER(dpy) FindDpyNum(dpy)
+#else /* VMS */
+#define DPY_NUMBER(dpy) ((dpy)->fd)
+#endif /* VMS */
+
+/* === PROCEDURES === */
+
+/* ARGSUSED */
+void
+XDPSLSetTextEventHandler(Display *dpy, XDPSLEventHandler proc)
+{
+ TextProc = proc;
+}
+
+/* ARGSUSED */
+void
+XDPSLCallOutputEventHandler(Display *dpy, XEvent *event)
+{
+ (*TextProc)(event);
+}
+
+void
+XDPSLSetStatusEventHandler(Display *dpy, XDPSLEventHandler proc)
+{
+ StatusProc[DPY_NUMBER(dpy)] = proc;
+}
+
+void
+XDPSLCallStatusEventHandler(Display *dpy, XEvent *event)
+{
+ (*(StatusProc[DPY_NUMBER(dpy)]))(event);
+}
+
+/* Added for L2-DPS/PROTO 9 */
+void
+XDPSLSetReadyEventHandler(Display *dpy, XDPSLEventHandler proc)
+{
+ ReadyProc[DPY_NUMBER(dpy)] = proc;
+}
+
+/* Added for L2-DPS/PROTO 9 */
+void
+XDPSLCallReadyEventHandler(Display *dpy, XEvent *event)
+{
+ (*(ReadyProc[DPY_NUMBER(dpy)]))(event);
+}
+
+/* Added for L2-DPS/PROTO 9 */
+int
+XDPSLGetVersion(Display *dpy)
+{
+ return(version[DPY_NUMBER(dpy)]);
+}
+/* See CSDPS additions for XDPSLSetVersion */
+
+void
+XDPSLInitDisplayFlags(Display *dpy)
+{
+ int d = DPY_NUMBER(dpy);
+ displayFlags[d].wrapWaiting = False;
+
+ /* Instead of explicitly setting the pass-event flag, rely upon the fact
+ that it gets initialized to 0 by the compiler. This means that you
+ can set the event delivery mode on a display before creating any
+ contexts, which is a Good Thing */
+}
+
+XExtCodes *XDPSLGetCodes(Display *dpy)
+{
+ return Codes[DPY_NUMBER(dpy)];
+}
+
+/* ARGSUSED */
+static int
+CloseDisplayProc(Display *dpy, XExtCodes *codes)
+{
+ /* This proc is for native DPS/X only, not CSDPS */
+ Codes[DPY_NUMBER(dpy)] = NULL;
+ /* Clear list */
+ XDPSPrivZapDpy(dpy);
+#ifdef VMS
+ dpys[DPY_NUMBER(dpy)] = NULL;
+ /*%%%%Temp till we fix dpy->fd*/
+#endif /* VMS */
+ return 0; /* return-value is ignored */
+}
+
+Bool
+XDPSLGetPassEventsFlag(Display *dpy)
+{
+ return displayFlags[DPY_NUMBER(dpy)].passEvents;
+}
+
+void
+XDPSLSetPassEventsFlag(Display *dpy, Bool flag)
+{
+ displayFlags[DPY_NUMBER(dpy)].passEvents = flag;
+}
+
+Bool
+XDPSLGetWrapWaitingFlag(Display *dpy)
+{
+ return displayFlags[DPY_NUMBER(dpy)].wrapWaiting;
+}
+
+void
+XDPSLSetWrapWaitingFlag(Display *dpy, Bool flag)
+{
+ displayFlags[DPY_NUMBER(dpy)].wrapWaiting = flag;
+}
+
+static Status
+ConvertOutputEvent(Display *dpy, XEvent *ce, xEvent *we)
+{
+ register PSOutputEvent *wireevent = (PSOutputEvent *) we;
+ register XDPSLOutputEvent *clientevent = (XDPSLOutputEvent *) ce;
+
+ clientevent->type = wireevent->type & 0x7f;
+ clientevent->serial = _XSetLastRequestRead(dpy,
+ (xGenericReply *)wireevent);
+ clientevent->send_event = (wireevent->type & 0x80) != 0;
+ clientevent->display = dpy;
+ clientevent->cxid = wireevent->cxid;
+ clientevent->length = wireevent->length;
+ bcopy((char *) wireevent->data, clientevent->data, wireevent->length);
+ if (TextProc && !XDPSLGetPassEventsFlag(dpy)) {
+ (*TextProc)((XEvent *) clientevent);
+ return False;
+ }
+ return True;
+}
+
+static Status
+ConvertStatusEvent(Display *dpy, XEvent *ce, xEvent *we)
+{
+ register PSStatusEvent *wireevent = (PSStatusEvent *) we;
+ register XDPSLStatusEvent *clientevent = (XDPSLStatusEvent *) ce;
+
+ clientevent->type = wireevent->type & 0x7f;
+ clientevent->serial = _XSetLastRequestRead(dpy,
+ (xGenericReply *)wireevent);
+ clientevent->send_event = (wireevent->type & 0x80) != 0;
+ clientevent->display = dpy;
+ clientevent->cxid = wireevent->cxid;
+ clientevent->status = wireevent->status;
+ if (StatusProc[DPY_NUMBER(dpy)] && !XDPSLGetPassEventsFlag(dpy)) {
+ (*(StatusProc[DPY_NUMBER(dpy)]))((XEvent *) clientevent);
+ return False;
+ }
+ return True;
+}
+
+/* Added for L2-DPS/PROTO 9 */
+static Status
+ConvertReadyEvent(Display *dpy, XEvent *ce, xEvent *we)
+{
+ register PSReadyEvent *wireevent = (PSReadyEvent *) we;
+ register XDPSLReadyEvent *clientevent = (XDPSLReadyEvent *) ce;
+
+ clientevent->type = wireevent->type & 0x7f;
+ clientevent->serial = _XSetLastRequestRead(dpy,
+ (xGenericReply *)wireevent);
+ clientevent->send_event = (wireevent->type & 0x80) != 0;
+ clientevent->display = dpy;
+ clientevent->cxid = wireevent->cxid;
+ clientevent->val[0] = wireevent->val1;
+ clientevent->val[1] = wireevent->val2;
+ clientevent->val[2] = wireevent->val3;
+ clientevent->val[3] = wireevent->val4;
+ if (ReadyProc[DPY_NUMBER(dpy)] && !XDPSLGetPassEventsFlag(dpy)) {
+ (*(ReadyProc[DPY_NUMBER(dpy)]))((XEvent *) clientevent);
+ return False;
+ }
+ return True;
+}
+
+/* Added for L2-DPS/PROTO 9 */
+/* ARGSUSED */
+
+static int
+CatchBadMatch(Display *dpy, xError *err, XExtCodes *codes, int *ret_code)
+{
+ if (err->errorCode == BadMatch)
+ {
+ *ret_code = 0;
+ return 1; /* suppress error */
+ }
+ else
+ {
+ *ret_code = 1;
+ return 0; /* pass error along */
+ }
+}
+
+
+int
+XDPSLInit(
+ Display *dpy,
+ int *numberType, /* RETURN */
+ char **floatingName) /* RETURN: CALLER MUST NOT MODIFY OR FREE! */
+{
+ XExtCodes *codes = (XExtCodes *)NULL;
+ register xPSInitReq *req;
+ xPSInitReply rep;
+ char *ptr;
+ int first_event;
+
+ {
+ char *ddt;
+
+ if ((ddt = getenv("DPSNXOVER")) != NULL) {
+ gForceCSDPS = (*ddt == 't' || *ddt == 'T');
+ if (gForceCSDPS)
+ DPSWarnProc(NULL, "*** USING DPS NX ***");
+ }
+ }
+
+ if ((codes = Codes[DPY_NUMBER(dpy)]) != NULL) {
+ if (numberType)
+ *numberType = NumberType[DPY_NUMBER(dpy)];
+ if (floatingName)
+ *floatingName = FloatingName[DPY_NUMBER(dpy)];
+ return codes->first_event;
+ } else {
+ if (gForceCSDPS)
+ goto try_dps_nx;
+ codes = XInitExtension(dpy, DPSNAME);
+ if (codes == NULL) {
+ /* try DEC UWS 2.2 server */
+ codes = XInitExtension(dpy, DECDPSNAME);
+try_dps_nx:
+ if (codes == NULL) {
+ int myNumberType;
+ char *myFloatingName;
+
+ first_event = CSDPSInit(dpy, &myNumberType, &myFloatingName);
+ NumberType[DPY_NUMBER(dpy)] = myNumberType;
+ FloatingName[DPY_NUMBER(dpy)] = myFloatingName;
+ if (numberType)
+ *numberType = myNumberType;
+ if (floatingName)
+ *floatingName = myFloatingName;
+ return first_event;
+ }
+ }
+ Codes[DPY_NUMBER(dpy)] = codes;
+ ShuntMap[DPY_NUMBER(dpy)] = dpy;
+ /* set procs for native DPS/X */
+ XESetCloseDisplay(dpy, codes->extension, CloseDisplayProc);
+ XESetWireToEvent(dpy, codes->first_event + PSEVENTOUTPUT,
+ ConvertOutputEvent);
+ XESetWireToEvent(dpy, codes->first_event + PSEVENTSTATUS,
+ ConvertStatusEvent);
+ XESetWireToEvent(dpy, codes->first_event + PSEVENTREADY,
+ ConvertReadyEvent);
+ first_event = codes->first_event;
+ }
+
+ /* We have to handle a BadMatch error, in the case where
+ the client has a later (higher) version of
+ the protocol than the server */
+ {
+ int (*oldErrorProc)(Display*, xError*, XExtCodes*, int*);
+ int libVersion;
+ Bool doneIt;
+
+ XSync(dpy, False);
+ LockDisplay(dpy);
+ oldErrorProc = XESetError(dpy, codes->extension, CatchBadMatch);
+ libVersion = DPSPROTOCOLVERSION;
+ doneIt = False;
+ while (libVersion >= DPSPROTO_OLDEST)
+ {
+ GetReq(PSInit, req);
+ req->reqType = MajorOpCode(dpy);
+ req->dpsReqType = X_PSInit;
+ req->libraryversion = libVersion;
+ if (_XReply(dpy, (xReply *) &rep, 0, xFalse))
+ {
+ doneIt = True;
+ break;
+ }
+ /* otherwise, try previous version */
+ --libVersion;
+ }
+ oldErrorProc = XESetError(dpy, codes->extension, oldErrorProc);
+ if (!doneIt)
+ {
+ DPSFatalProc(NULL, "Incompatible protocol versions");
+ exit(1);
+ }
+
+ /* NOTE *************************************************
+ We made a boo-boo in the 1007.2 and earlier versions of
+ our X server glue code. Instead of sending a
+ BadMatch error if the client's version is newer (higher)
+ than the server's, it just replies with success. We
+ could test for that situation here by looking at
+ rep.serverversion, but it turns out that we don't need
+ to do anything special. Since rep.serverversion gets
+ assigned to our version[] array, it is as if we handled
+ the BadMatch correctly. Just for safety's sake, we'll
+ do some bulletproofing here instead.
+ Fixes 2ps_xdps BUG #6 */
+
+ else if (rep.serverversion < DPSPROTO_OLDEST
+ || rep.serverversion > DPSPROTOCOLVERSION)
+ {
+ DPSFatalProc(NULL, "Server replied with bogus version");
+ exit(1);
+ }
+ }
+
+ version[DPY_NUMBER(dpy)] = rep.serverversion;
+ NumberType[DPY_NUMBER(dpy)] = rep.preferredNumberFormat;
+ if (numberType)
+ *numberType = rep.preferredNumberFormat;
+
+ ptr = (char *) Xmalloc(rep.floatingNameLength + 1);
+ _XReadPad(dpy, ptr, rep.floatingNameLength);
+ ptr[rep.floatingNameLength] = 0;
+ FloatingName[DPY_NUMBER(dpy)] = ptr;
+ if (floatingName)
+ *floatingName = ptr;
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+ return first_event;
+}
+
+
+
+
+static void CopyColorMapsIntoCreateContextReq(
+ xPSCreateContextReq *req,
+ XStandardColormap *colorcube,
+ XStandardColormap *grayramp)
+{
+ req->cmap = 0;
+ if (colorcube != NULL) {
+ req->cmap = colorcube->colormap;
+ req->redmax = colorcube->red_max;
+ req->redmult = colorcube->red_mult;
+ req->greenmax = colorcube->green_max;
+ req->greenmult = colorcube->green_mult;
+ req->bluemax = colorcube->blue_max;
+ req->bluemult = colorcube->blue_mult;
+ req->colorbase = colorcube->base_pixel;
+ }
+ else {
+ req->redmult = 0;
+ /* The rest of this shouldn't be necessary, but there are some
+ servers out there that erroneously check the other fields
+ even when redmult is 0 */
+ req->redmax = 0;
+ req->greenmult = 0;
+ req->greenmax = 0;
+ req->bluemult = 0;
+ req->bluemax = 0;
+ req->colorbase = 0;
+ }
+
+ if (grayramp != NULL) {
+ req->cmap = grayramp->colormap;
+ req->graymax = grayramp->red_max;
+ req->graymult = grayramp->red_mult;
+ req->graybase = grayramp->base_pixel;
+ }
+ else req->graymult = 0;
+}
+
+
+
+
+
+
+/* ARGSUSED */
+ContextXID
+XDPSLCreateContextAndSpace(
+ register Display *xdpy,
+ Drawable draw,
+ GC gc,
+ int x, int y,
+ unsigned int eventMask,
+ XStandardColormap *grayRamp,
+ XStandardColormap *colorCube,
+ unsigned int actual,
+ ContextPSID *cpsid, /* RETURN */
+ SpaceXID *sxid, /* RETURN */
+ Bool secure) /* Added for L2-DPS/PROTO 9 */
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ ContextXID cxid;
+ register xPSCreateContextReq *req; /* Same struct for CreateSecureContext */
+ xPSCreateContextReply rep;
+ XStandardColormap defColorcube, defGrayramp;
+ XStandardColormap *requestCube, *requestRamp;
+ int index;
+ XDPSLIOProcs *call;
+
+ if (grayRamp == NULL && colorCube == NULL) return(None);
+
+ if (secure && version[dpyix] < DPSPROTO_V09)
+ return(None); /* No secure contexts before PROTO 9 */
+
+ /* Index gets encoded as follows:
+ *
+ * 0 grayRamp = Default, colorCube = Default
+ * 1 grayRamp = non-Default, colorcube = Default
+ * 2 grayRamp = Default, colorcube = non-Default
+ * 3 grayRamp = non-Default, colorcube = non-Default
+ *
+ */
+ index = ((grayRamp == DefaultStdCMap || grayRamp == NULL) ? 0 : 1) +
+ (colorCube == DefaultStdCMap ? 0 : 2);
+
+ switch (index)
+ {
+ default:
+ case 0: /* Both are default */
+ XDPSGetDefaultColorMaps(xdpy, (Screen *) NULL, draw,
+ &defColorcube, &defGrayramp);
+ requestCube = &defColorcube;
+ requestRamp = &defGrayramp;
+ break;
+
+ case 1: /* gray specified, Color default */
+ XDPSGetDefaultColorMaps(xdpy, (Screen *) NULL, draw,
+ &defColorcube, (XStandardColormap *) NULL);
+ requestCube = &defColorcube;
+ requestRamp = grayRamp;
+ break;
+
+ case 2: /* gray default, Color specified */
+ XDPSGetDefaultColorMaps(xdpy, (Screen *) NULL, draw,
+ (XStandardColormap *) NULL, &defGrayramp);
+ requestCube = colorCube;
+ requestRamp = &defGrayramp;
+ break;
+
+ case 3: /* Both specified */
+ requestCube = colorCube;
+ requestRamp = grayRamp;
+ break;
+ }
+
+ if (gc != NULL)
+ XDPSLFlushGC(xdpy, gc);
+ if (dpy != xdpy)
+ {
+ int syncMask = displayFlags[dpyix].syncMask;
+
+ /* Don't worry about pauses here, since we are just
+ now creating the context! */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSCreateContext, req);
+ CopyColorMapsIntoCreateContextReq(req, requestCube, requestRamp);
+
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = (secure) ? X_PSCreateSecureContext : X_PSCreateContext;
+ req->x = x;
+ req->y = y;
+ req->drawable = draw;
+ req->gc = (gc != NULL) ? XGContextFromGC(gc) : None;
+ cxid = req->cxid = XAllocID(xdpy);
+ req->sxid = XAllocID(xdpy);
+ if (sxid)
+ *sxid = req->sxid;
+ req->eventmask = 0; /* %%% */
+ req->actual = actual;
+ IFNXSETCALL(dpy, xdpy);
+ (void) (*call->Reply) (dpy, (xReply *)&rep, 0, xTrue);
+
+ if (cpsid)
+ *cpsid = (int)rep.cpsid;
+
+ UnlockDisplay(dpy);
+ /* If the context creation succeeded and we are CSDPS, send GC values */
+ if (rep.cpsid && xdpy != dpy && gc != NULL)
+ {
+ DPSCAPInitGC(xdpy, dpy, gc);
+ }
+ SyncHandle();
+
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ return (cxid);
+}
+
+
+/* ARGSUSED */
+ContextXID
+XDPSLCreateContext(
+ register Display *xdpy,
+ SpaceXID sxid,
+ Drawable draw,
+ GC gc,
+ int x, int y,
+ unsigned int eventMask,
+ XStandardColormap *grayRamp,
+ XStandardColormap *colorCube,
+ unsigned int actual,
+ ContextPSID *cpsid, /* RETURN */
+ Bool secure) /* L2-DPS/PROTO 9 addition */
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSCreateContextReq *req;
+ xPSCreateContextReply rep;
+ ContextXID cxid; /* RETURN */
+ XStandardColormap defColorcube, defGrayramp;
+ XStandardColormap *requestCube, *requestRamp;
+ int index;
+ XDPSLIOProcs *call;
+
+ if (secure && version[dpyix] < DPSPROTO_V09)
+ return(None); /* No secure contexts before PROTO 9 */
+
+ /* Index gets encoded as follows:
+ *
+ * 0 grayRamp = Default, colorCube = Default
+ * 1 grayRamp = non-Default, colorcube = Default
+ * 2 grayRamp = Default, colorcube = non-Default
+ * 3 grayRamp = non-Default, colorcube = non-Default
+ *
+ * Note that only the first or last case should ever happen.
+ */
+ index = ((grayRamp == DefaultStdCMap) ? 0 : 1) +
+ ((colorCube == DefaultStdCMap) ? 0 : 2);
+
+ switch (index)
+ {
+ default:
+ case 0: /* Both are default */
+ XDPSGetDefaultColorMaps(xdpy, (Screen *) NULL, draw,
+ &defColorcube, &defGrayramp);
+ requestCube = &defColorcube;
+ requestRamp = &defGrayramp;
+ break;
+
+ case 1: /* gray specified, Color default */
+ XDPSGetDefaultColorMaps(xdpy, (Screen *) NULL, draw,
+ &defColorcube, (XStandardColormap *) NULL);
+ requestCube = &defColorcube;
+ requestRamp = grayRamp;
+ break;
+
+ case 2: /* gray default, Color specified */
+ XDPSGetDefaultColorMaps(xdpy, (Screen *) NULL, draw,
+ (XStandardColormap *) NULL, &defGrayramp);
+ requestCube = colorCube;
+ requestRamp = &defGrayramp;
+ break;
+
+ case 3: /* Both specified */
+ requestCube = colorCube;
+ requestRamp = grayRamp;
+ break;
+ }
+
+
+ if (gc != NULL)
+ XDPSLFlushGC(xdpy, gc);
+ if (dpy != xdpy)
+ {
+ int syncMask = displayFlags[dpyix].syncMask;
+
+ /* Don't worry about pauses here, since we are
+ just now creating this context! */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSCreateContext, req);
+ CopyColorMapsIntoCreateContextReq(req, requestCube, requestRamp);
+
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = (secure) ? X_PSCreateSecureContext : X_PSCreateContext;
+ req->x = x;
+ req->y = y;
+ req->drawable = draw;
+ req->gc = (gc != NULL) ? XGContextFromGC(gc) : None;
+ cxid = req->cxid = XAllocID(xdpy);
+ req->sxid = sxid;
+ req->actual = actual;
+
+ IFNXSETCALL(dpy, xdpy);
+ (void) (*call->Reply) (dpy, (xReply *)&rep, 0, xTrue);
+ if (cpsid)
+ *cpsid = (int)rep.cpsid;
+
+ UnlockDisplay(dpy);
+ /* If the context creation succeeded and we are CSDPS, send GC values */
+ if (rep.cpsid && xdpy != dpy && gc != NULL)
+ {
+ DPSCAPInitGC(xdpy, dpy, gc);
+ }
+
+ SyncHandle();
+
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ return cxid;
+}
+
+SpaceXID
+XDPSLCreateSpace(Display *xdpy)
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSCreateSpaceReq *req;
+ SpaceXID sxid;
+
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSCreateSpace, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSCreateSpace;
+ sxid = req->sxid = XAllocID(xdpy);
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ return sxid;
+}
+
+
+
+/*
+ * I'm not sure how portable my coalescing code is, so I've provided the
+ * below define. If it turns out this code just breaks somewhere, you
+ * can simply undefine COALESCEGIVEINPUT, and then everything will work
+ * (but slower). 6/16/89 (tw)
+ */
+
+#define COALESCEGIVEINPUT
+
+void
+XDPSLGiveInput(Display *xdpy, ContextXID cxid, char *data, int length)
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSGiveInputReq *req;
+ Bool didFlush = False;
+
+ if (dpy != xdpy)
+ {
+ register int syncMask = displayFlags[dpyix].syncMask;
+
+ if (syncMask & DPSCAP_SYNCMASK_RECONCILE)
+ {
+ XDPSLReconcileRequests(xdpy, cxid);
+ didFlush = True;
+ }
+
+ /* If this context got paused, no matter how, ignore
+ mode and resume it */
+ if (gTotalPaused && DPSCAPResumeContext(xdpy, cxid))
+ {
+ /* xdpy was flushed by DPSCAPResumeContext */
+ if (!didFlush)
+ {
+ N_XFlush(dpy);
+ didFlush = True;
+ }
+ }
+ else if (syncMask & DPSCAP_SYNCMASK_SYNC)
+ {
+ didFlush = True;
+ XSync(xdpy, False);
+ }
+ }
+ LockDisplay(dpy);
+
+#ifdef COALESCEGIVEINPUT
+ req = (xPSGiveInputReq *) dpy->last_req;
+ if (req->reqType == MajorOpCode(xdpy)
+ && req->dpsReqType == X_PSGiveInput
+ && req->cxid == cxid
+ && dpy->bufptr + length + 3 < dpy->bufmax) {
+ bcopy(data, ((char *) req) + sizeof(xPSGiveInputReq) + req->nunits,
+ length);
+ req->nunits += length;
+ req->length = (sizeof(xPSGiveInputReq) + req->nunits + 3) >> 2;
+ dpy->bufptr = dpy->last_req + sizeof(xPSGiveInputReq) +
+ ((req->nunits + 3) & ~3);
+ } else
+#endif /* COALESCEGIVEINPUT */
+ {
+ int flushOnce = 1;
+ int maxedOutLen = xdpy->max_request_size - sizeof(xPSGiveInputReq) - 4;
+ int nunits;
+
+ /* We have the rare opportunity to chop up a buffer that is larger
+ than the max request size into separate requests, unlike
+ most other X requests (such as DrawText). The -4 is to
+ force these maxed out requests to be less than the maximum
+ padding that would ever be needed, and to minimize padding
+ in the case where the input buffer is several times
+ larger than max request length. */
+
+ nunits = maxedOutLen;
+ do {
+ if (length < maxedOutLen)
+ nunits = length; /* Normal size block */
+ NXMacroGetReq(PSGiveInput, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSGiveInput;
+ req->cxid = cxid;
+ req->nunits = nunits;
+ req->length += ((nunits + 3) >> 2);
+ if (dpy != xdpy) {
+ if (flushOnce && !didFlush) {
+ LockDisplay(xdpy);
+ _XFlush(xdpy);
+ UnlockDisplay(xdpy);
+ flushOnce = 0;
+ }
+ NXProcData(dpy, (char *) data, nunits);
+ } else
+ {Data(dpy, (char *) data, nunits);}
+ data += nunits;
+ length -= nunits;
+ } while (length);
+ }
+
+ /* In the NX case (didFlush is always False for the non-NX case),
+ the xdpy may have been flushed, but there is stuff left
+ buffered in dpy (NX connection). We can't leave the stuff
+ there, since we may never call a DPS routine again. Until
+ we can be notified about xdpy being flushed, we have to
+ clear out the dpy buffer after we cleared out the xdpy
+ buffer (didFlush == True). */
+
+ if (dpy != xdpy
+ && dpy->bufptr != dpy->buffer
+ && (gForceFlush || didFlush))
+ N_XFlush(dpy);
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+}
+
+
+int
+XDPSLGetStatus(Display *xdpy, ContextXID cxid)
+{
+ int dpyix;
+ Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSGetStatusReq *req;
+ xPSGetStatusReply rep;
+ XDPSLIOProcs *call;
+
+ if (dpy != xdpy)
+ {
+ register int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSGetStatus, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSGetStatus;
+ req->cxid = cxid;
+ req->notifyIfChange = 0;
+
+ IFNXSETCALL(dpy, xdpy);
+ if (! (*call->Reply)(dpy, (xReply *)&rep, 0, xTrue))
+ rep.status = PSSTATUSERROR;
+ UnlockDisplay(dpy);
+ SyncHandle();
+ /* For CSDPS, guarantee that status events arrive just like DPS/X */
+ if (dpy != xdpy)
+ {
+ XDPSLSync(xdpy);
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ }
+ return (int) rep.status;
+}
+
+void
+XDPSLDestroySpace(Display *xdpy, SpaceXID sxid)
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSDestroySpaceReq *req;
+
+ if (dpy != xdpy)
+ {
+ int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSDestroySpace, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSDestroySpace;
+ req->sxid = sxid;
+
+ if (gAutoFlush && dpy != xdpy)
+ {
+ N_XFlush(dpy);
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+}
+
+
+void
+XDPSLReset(Display *xdpy, ContextXID cxid)
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSResetReq *req;
+
+ if (dpy != xdpy)
+ {
+ register int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSReset, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSReset;
+ req->cxid = cxid;
+
+ if (gAutoFlush && dpy != xdpy)
+ {
+ N_XFlush(dpy);
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+}
+
+void
+XDPSLNotifyContext(
+ Display *xdpy,
+ ContextXID cxid,
+ int ntype) /* should this be an enum?? %%% */
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSNotifyContextReq *req;
+
+ if (dpy != xdpy)
+ {
+ register int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSNotifyContext, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSNotifyContext;
+ req->cxid = cxid;
+ req->notifyType = ntype;
+
+ if (dpy != xdpy)
+ {
+ N_XFlush(dpy); /* THIS IS CRITICAL TO AVOID HANGING! */
+ }
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ if (dpy != xdpy)
+ {
+ if (ntype == PSKILL)
+ XDPSLCleanContext(xdpy, cxid);
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ }
+}
+
+
+ContextXID
+XDPSLCreateContextFromID(
+ Display *xdpy,
+ ContextPSID cpsid,
+ SpaceXID *sxid) /* RETURN */
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSCreateContextFromIDReq *req;
+ xPSCreateContextFromIDReply rep;
+ ContextXID cxid;
+ XDPSLIOProcs *call;
+
+ if (dpy != xdpy)
+ {
+ int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSCreateContextFromID, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSCreateContextFromID;
+ req->cpsid = cpsid;
+ cxid = req->cxid = XAllocID(xdpy);
+
+ IFNXSETCALL(dpy, xdpy);
+ (void) (*call->Reply) (dpy, (xReply *)&rep, 0, xTrue);
+ if (sxid)
+ *sxid = (int)rep.sxid;
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ return(cxid);
+}
+
+
+/* Returns 1 on success, 0 on failure (cpsid not a valid context). */
+
+Status
+XDPSLIDFromContext(
+ Display *xdpy,
+ ContextPSID cpsid,
+ ContextXID *cxid, /* RETURN */
+ SpaceXID *sxid) /* RETURN */
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSXIDFromContextReq *req;
+ xPSXIDFromContextReply rep;
+ XDPSLIOProcs *call;
+
+ if (dpy != xdpy)
+ {
+ int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSXIDFromContext, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSXIDFromContext;
+ req->cpsid = cpsid;
+
+ IFNXSETCALL(dpy, xdpy);
+ (void) (*call->Reply) (dpy, (xReply *)&rep, 0, xTrue);
+ *sxid = (int)rep.sxid;
+ *cxid = (int)rep.cxid;
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ return((Status)(*sxid != None && *cxid != None));
+}
+
+
+ContextPSID
+XDPSLContextFromXID(Display *xdpy, ContextXID cxid)
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSContextFromXIDReq *req;
+ xPSContextFromXIDReply rep;
+ XDPSLIOProcs *call;
+
+ if (dpy != xdpy)
+ {
+ int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSContextFromXID, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSContextFromXID;
+ req->cxid = cxid;
+
+ IFNXSETCALL(dpy, xdpy);
+ (void) (*call->Reply) (dpy, (xReply *)&rep, 0, xTrue);
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ return (int)rep.cpsid;
+}
+
+
+void
+XDPSLSetStatusMask(
+ Display *xdpy,
+ ContextXID cxid,
+ unsigned int enableMask,
+ unsigned int disableMask,
+ unsigned int nextMask)
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSSetStatusMaskReq *req;
+
+ if (dpy != xdpy)
+ {
+ register int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSSetStatusMask, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSSetStatusMask;
+ req->cxid = cxid;
+ req->enableMask = enableMask;
+ req->disableMask = disableMask;
+ req->nextMask = nextMask;
+
+ if (gAutoFlush && dpy != xdpy)
+ {
+ N_XFlush(dpy);
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+}
+
+
+#ifdef VMS
+/*
+ * _XReadPad - Read bytes from the socket taking into account incomplete
+ * reads. If the number of bytes is not 0 mod 32, read additional pad
+ * bytes. This routine may have to be reworked if int < long.
+ */
+
+/* This is really in xlib, but is not in the sharable image transfer vector
+ * so I am copying it here for now. BF
+
+The following notice applies only to the functions
+_XReadPad and XFlush
+
+Copyright 1985, 1986, 1987, 1988, 1989 by the
+Massachusetts Institute of Technology
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of M.I.T. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission. M.I.T. makes no representations about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+
+*/
+void
+_XReadPad (Display *dpy, char *data, long size)
+{
+ static int padlength[4] = {0,3,2,1};
+ register long bytes_read;
+ char pad[3];
+
+ CheckLock(dpy);
+ if (size == 0) return;
+ _XRead( dpy, data, size );
+ if ( padlength[size & 3] ) {
+ _XRead( dpy, pad, padlength[size & 3] );
+ }
+
+}
+#endif /* VMS */
+
+/* _____________ LEVEL 2 DPS/PROTOCOL 9 ADDITIONS _____________ */
+
+void
+XDPSLNotifyWhenReady(
+ Display *xdpy,
+ ContextXID cxid,
+ int val[4])
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xPSNotifyWhenReadyReq *req;
+
+ if (version[dpyix] < DPSPROTO_V09)
+ {
+ DPSWarnProc(NULL, "Attempted use of XDPSLNotifyWhenReady with incompatible server ignored");
+ return; /* PROTO 9 or later only */
+ }
+
+ if (dpy != xdpy)
+ {
+ register int syncMask = displayFlags[dpyix].syncMask;
+
+ if (syncMask & DPSCAP_SYNCMASK_RECONCILE)
+ XDPSLReconcileRequests(xdpy, cxid);
+
+ /* If this context got paused, no matter how, ignore
+ mode and resume it */
+ if (gTotalPaused && DPSCAPResumeContext(xdpy, cxid))
+ {
+ /* xdpy was flushed by DPSCAPResumeContext */
+ if (gAutoFlush)
+ N_XFlush(dpy);
+ }
+ else if (syncMask & DPSCAP_SYNCMASK_SYNC)
+ XSync(xdpy, False);
+ }
+ LockDisplay(dpy);
+
+ NXMacroGetReq(PSNotifyWhenReady, req);
+ req->reqType = MajorOpCode(xdpy);
+ req->dpsReqType = X_PSNotifyWhenReady;
+ req->cxid = cxid;
+ req->val1 = val[0];
+ req->val2 = val[1];
+ req->val3 = val[2];
+ req->val4 = val[3];
+
+ if (gAutoFlush && dpy != xdpy)
+ {
+ N_XFlush(dpy);
+ }
+ UnlockDisplay(dpy);
+ SyncHandle();
+ if (dpy != xdpy)
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+}
+
+XDPSLPSErrors
+XDPSLTestErrorCode(Display *dpy, int ecode)
+{
+ XExtCodes *c = XDPSLGetCodes(dpy);
+
+ if (c == NULL)
+ return not_pserror;
+
+ switch (ecode - c->first_error)
+ {
+ case PSERRORBADCONTEXT: return(pserror_badcontext);
+ case PSERRORBADSPACE: return(pserror_badspace);
+ case PSERRORABORT:
+ if (version[DPY_NUMBER(dpy)] < DPSPROTO_V09)
+ return(not_pserror);
+ else
+ return(pserror_abort);
+ default: return(not_pserror);
+ }
+}
+
+/* _____________ CLIENT SIDE DPS ADDITIONS _____________ */
+
+/* === NEW HOOKS INTO XDPS === */
+
+void
+XDPSLSetVersion(Display *dpy, unsigned ver)
+{
+ version[DPY_NUMBER(dpy)] = ver;
+}
+
+void
+XDPSLSetCodes(Display *dpy, XExtCodes *codes)
+{
+ Codes[DPY_NUMBER(dpy)] = codes;
+}
+
+Display *
+XDPSLGetShunt(Display *dpy_in)
+{
+ return(ShuntMap[DPY_NUMBER(dpy_in)]);
+}
+
+void
+XDPSLSetShunt(Display *dpy_in, Display *dpy_out)
+{
+ ShuntMap[DPY_NUMBER(dpy_in)] = dpy_out;
+}
+
+int
+XDPSLGetSyncMask(Display *dpy)
+{
+ return (int)displayFlags[DPY_NUMBER(dpy)].syncMask;
+}
+
+void
+XDPSLSetSyncMask(Display *dpy, int mask)
+{
+ displayFlags[DPY_NUMBER(dpy)].syncMask = (char)mask;
+ gForceFlush = (mask & DPSCAP_SYNCMASK_RECONCILE);
+}
+
+void
+XDPSLFlush(Display *xdpy)
+{
+ register Display *dpy = ShuntMap[DPY_NUMBER(xdpy)];
+
+ _XFlush(xdpy);
+ if (dpy != xdpy)
+ N_XFlush(dpy);
+}
+
+void
+XDPSLSyncGCClip(Display *xdpy, GC gc)
+{
+ register unsigned long oldDirty;
+ register int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+
+ /* We DON'T want to notice all gc changes, just the clip */
+ oldDirty = gc->dirty;
+ gc->dirty = (GCClipXOrigin|GCClipYOrigin);
+ XDPSLFlushGC(xdpy, gc);
+ gc->dirty = oldDirty;
+ if (dpy == xdpy || gNXSyncGCMode != 1) /* 1 means sync always */
+ {
+ /* For DPS NX and SLOW mode, flushing the gc cache has
+ the side-effect of synching agent and server connections.
+ So, to have consistent behavior, we sync for the DPS/X
+ or FAST cases too. */
+
+ if (GCFlushMode[dpyix] == XDPSNX_GC_UPDATES_FAST
+ || dpy == xdpy)
+ XDPSLSync(xdpy);
+ }
+}
+
+
+#ifdef VMS
+void
+XDPSLSetDisplay(Display *dpy)
+{
+ dpys[DPY_NUMBER(dpy)] = dpy;
+}
+#endif /* VMS */
+
+char *
+XDPSLSetAgentName(Display *dpy, char *name, int deflt)
+{
+ char *old;
+
+ if (gCSDPS == NULL)
+ DPSCAPStartUp();
+ if (deflt)
+ {
+ old = gCSDPS->defaultAgentName;
+ gCSDPS->defaultAgentName = name;
+ }
+ else
+ {
+ old = gCSDPS->map[DPY_NUMBER(dpy)];
+ gCSDPS->map[DPY_NUMBER(dpy)] = name;
+ }
+ return(old);
+}
+
+
+void
+XDPSLSetClientMessageHandler(Display *dpy)
+{
+ if (dpy == NULL) return;
+ ClientMsgProc[DPY_NUMBER(dpy)] = XESetWireToEvent(
+ dpy,
+ ClientMessage,
+ DPSCAPClientMessageProc);
+}
+
+void
+XDPSLSetAfterProc(Display *xdpy)
+{
+ if (xdpy == NULL) return;
+ AfterProcs[DPY_NUMBER(xdpy)] = (GenericProcPtrReturnsInt)
+ XSetAfterFunction(xdpy, DPSCAPAfterProc);
+ /* +++ Consider using agent->synchandler to store old proc */
+}
+
+
+CSDPSFakeEventTypes
+XDPSLGetCSDPSFakeEventType(Display *dpy, XEvent *event)
+{
+ XExtCodes *codes = Codes[DPY_NUMBER(dpy)];
+ XExtData *extData;
+ DPSCAPData my;
+
+ if (event->type != ClientMessage || codes == NULL)
+ return(csdps_not);
+ extData = XFindOnExtensionList(
+ CSDPSHeadOfDpyExt(dpy),
+ codes->extension);
+ if (!extData)
+ return(csdps_not);
+ my = (DPSCAPData) extData->private_data;
+
+ if (event->xclient.message_type == my->typePSOutput)
+ return(csdps_output);
+ if (event->xclient.message_type == my->typePSOutputWithLen)
+ return(csdps_output_with_len);
+ if (event->xclient.message_type == my->typePSStatus)
+ return(csdps_status);
+ if (event->xclient.message_type == my->typeNoop)
+ return(csdps_noop);
+ if (event->xclient.message_type == my->typePSReady)
+ return(csdps_ready);
+ return(csdps_not);
+}
+
+Bool
+XDPSLDispatchCSDPSFakeEvent(
+ Display *dpy,
+ XEvent *event,
+ CSDPSFakeEventTypes t)
+{
+ register XDPSLOutputEvent *oce;
+ register DPSCAPOutputEvent *oev;
+ XDPSLOutputEvent fakeOutput;
+ XExtCodes *codes = Codes[DPY_NUMBER(dpy)];
+
+ if (codes == NULL)
+ return(False);
+
+ /* Fake up an event in the client's format. Bypasses
+ extension wire-to-event conversion */
+ switch (t)
+ {
+ case csdps_output:
+ oce = &fakeOutput;
+ oev = (DPSCAPOutputEvent *)event->xclient.data.b;
+ oce->length = DPSCAP_BYTESPEROUTPUTEVENT;
+ goto samo_samo;
+ case csdps_output_with_len:
+ oce = &fakeOutput;
+ oev = (DPSCAPOutputEvent *)event->xclient.data.b;
+ oce->length = oev->data[DPSCAP_DATA_LEN];
+samo_samo:
+ oce->type = codes->first_event + PSEVENTOUTPUT;
+ oce->serial = event->xclient.serial;
+ oce->send_event = True; /* ??? */
+ oce->display = dpy;
+ oce->cxid = oev->cxid;
+ bcopy((char *) oev->data, oce->data, oce->length);
+ XDPSLCallOutputEventHandler(dpy, (XEvent *) oce);
+ break;
+ case csdps_status:
+ {
+ register XDPSLStatusEvent *sce;
+ register DPSCAPStatusEvent *sev;
+ XDPSLStatusEvent fakeStatus;
+
+ sev = (DPSCAPStatusEvent *)event->xclient.data.b;
+ sce = &fakeStatus;
+ sce->type = codes->first_event + PSEVENTSTATUS;
+ sce->serial = event->xclient.serial;
+ sce->send_event = True; /* ??? */
+ sce->display = dpy;
+ sce->status = sev->status;
+ sce->cxid = sev->cxid;
+ XDPSLCallStatusEventHandler(dpy, (XEvent *) sce);
+ break;
+ }
+ case csdps_ready: /* L2-DPS/PROTO 9 addition */
+ {
+ register XDPSLReadyEvent *rce;
+ XDPSLReadyEvent fakeReady;
+
+ rce = &fakeReady;
+ rce->type = codes->first_event + PSEVENTREADY;
+ rce->serial = event->xclient.serial;
+ rce->send_event = True;
+ rce->display = dpy;
+ rce->cxid = event->xclient.data.l[0];
+ rce->val[0] = event->xclient.data.l[1];
+ rce->val[1] = event->xclient.data.l[2];
+ rce->val[2] = event->xclient.data.l[3];
+ rce->val[3] = event->xclient.data.l[4];
+ XDPSLCallReadyEventHandler(dpy, (XEvent *) rce);
+ break;
+ }
+ default:
+ return(False);
+ }
+ return(True);
+}
+
+void
+XDPSLGetCSDPSStatus(
+ Display *xdpy,
+ XEvent *event,
+ void **ret_ctxt,
+ int *ret_status)
+{
+ register DPSCAPStatusEvent *sev;
+
+ /* Assert: event is ClientMessage with typePSStatus */
+ sev = (DPSCAPStatusEvent *)event->xclient.data.b;
+
+ if (ret_ctxt != NULL)
+ *ret_ctxt = XDPSContextFromXID(xdpy, sev->cxid);
+ if (ret_status != NULL)
+ *ret_status = sev->status;
+}
+
+void
+XDPSLGetCSDPSReady(
+ Display *xdpy,
+ XEvent *event,
+ void **ret_ctxt,
+ int *ret_val)
+{
+ /* Assert: event is ClientMessage with typePSReady */
+
+ if (ret_ctxt != NULL)
+ *ret_ctxt =
+ XDPSContextFromXID(xdpy, (ContextXID)event->xclient.data.l[0]);
+ if (ret_val != NULL)
+ {
+ ret_val[0] = event->xclient.data.l[1];
+ ret_val[1] = event->xclient.data.l[2];
+ ret_val[2] = event->xclient.data.l[3];
+ ret_val[3] = event->xclient.data.l[4];
+ }
+}
+
+void
+XDPSLCAPNotify(
+ Display *xdpy,
+ ContextXID cxid,
+ unsigned int ntype, /* should this be an enum?? %%% */
+ unsigned int data,
+ unsigned int extra)
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ register xCAPNotifyReq *req;
+
+ if (dpy == xdpy) return;
+
+ /* We _have_ to sync client and server here in order to guarantee
+ correct execution sequencing. We call this procedure alot
+ to keep track of GC's going away, so this is a major
+ performance hit. */
+ if (ntype == DPSCAPNOTE_FREEGC)
+ XSync(xdpy, False);
+
+ LockDisplay(dpy);
+
+ NXMacroGetReq(CAPNotify, req);
+ req->reqType = DPSCAPOPCODEBASE;
+ req->type = X_CAPNotify;
+ req->cxid = cxid;
+ req->notification = ntype;
+ req->data = data;
+ req->extra = extra;
+
+ if (gAutoFlush)
+ N_XFlush(dpy);
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+}
+
+void
+XDPSLSync(Display *xdpy)
+{
+ register Display *dpy = ShuntMap[DPY_NUMBER(xdpy)];
+
+ if (dpy == xdpy)
+ {
+ /* DPS/X */
+ XSync(dpy, False);
+ }
+ else
+ {
+ /* CSDPS */
+ XEvent event;
+ DPSCAPData my;
+ XExtData *extData;
+ XExtCodes *codes = Codes[DPY_NUMBER(xdpy)];
+
+ if (codes == NULL)
+ return;
+ /* Get private data */
+ extData = XFindOnExtensionList(
+ CSDPSHeadOfDpyExt(xdpy),
+ codes->extension);
+ if (!extData)
+ return;
+ my = (DPSCAPData) extData->private_data;
+ my->saveseq = XNextRequest(dpy)-1;
+ /* first send notification to agent */
+ XDPSLCAPNotify(xdpy, 0, DPSCAPNOTE_SYNC, my->saveseq, 0);
+#ifdef XXX
+fprintf(stderr, "\nXDPSLSync(DPSCAPNOTE_SYNC) sending ... ");
+#endif
+ _XFlush(xdpy);
+ N_XFlush(dpy);
+#ifdef XXX
+fprintf(stderr, "sent.\nWaiting for reply ... ");
+#endif
+ /* agent should send a ClientMessage, so wait for it */
+ XIfEvent(xdpy, &event, WaitForSyncProc, (char *) my);
+
+#ifdef XXX
+fprintf(stderr, "received.\n");
+#endif
+ /* now client, agent, and server are synchronized */
+ }
+}
+
+void
+XDPSLReconcileRequests(Display *xdpy, ContextXID cxid)
+{
+ int dpyix;
+ unsigned int seqnum;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+
+ if (dpy == xdpy)
+ return; /* No-op for DPS/X */
+
+ /* Get the sequence number and set the pause flag
+ IFF we are sure that some X protocol has occurred
+ since the last time we did a DPS request. This
+ minimizes pause/resume requests */
+
+ if (LastXRequest[dpyix] == XNextRequest(xdpy)-1)
+ {
+ if (gAutoFlush)
+ N_XFlush(dpy); /* This is what XDPSLCAPNotify would do */
+ return;
+ }
+ else
+ seqnum = DPSCAPSetPause(xdpy, cxid);
+
+ /* Pause the context specified. */
+ XDPSLCAPNotify(xdpy, cxid, DPSCAPNOTE_PAUSE, seqnum, 0);
+
+ /* We don't even need to flush. All we have to do is make
+ sure that the notify request is queued before any
+ DPS requests that follow. */
+}
+
+Status
+XDPSLSetAgentArg(Display *xdpy, int arg, int val)
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+ CARD32 capArg;
+ register xCAPSetArgReq *req;
+
+ if (dpy == xdpy)
+ return(Success); /* No-op for DPS/X */
+
+ /* dpy will be NIL if we haven't opened a connection yet,
+ but that's okay since we need to save the value anyway. */
+
+ if (dpy)
+ {
+ int syncMask = displayFlags[dpyix].syncMask;
+
+ /* ASSERT: There is no reason to pause the context for this
+ request, so just sync. */
+ if (syncMask & (DPSCAP_SYNCMASK_SYNC|DPSCAP_SYNCMASK_RECONCILE))
+ XSync(xdpy, False);
+ }
+
+ switch (arg)
+ {
+ case AGENT_ARG_SMALLFONTS:
+ AgentArgs[dpyix].showSmallSizes = val;
+ capArg = DPSCAP_ARG_SMALLFONTS;
+ break;
+ case AGENT_ARG_PIXMEM:
+ AgentArgs[dpyix].pixMem = val;
+ capArg = DPSCAP_ARG_PIXMEM;
+ break;
+ default:
+ return(!Success);
+ }
+ if (!dpy)
+ return(Success);
+
+ LockDisplay(dpy);
+
+ NXMacroGetReq(CAPSetArg, req);
+ req->reqType = DPSCAPOPCODEBASE;
+ req->type = X_CAPSetArg;
+ req->arg = capArg;
+ req->val = val;
+
+ if (gAutoFlush)
+ N_XFlush(dpy);
+
+ UnlockDisplay(dpy);
+ SyncHandle();
+ LastXRequest[dpyix] = XNextRequest(xdpy)-1;
+ return(Success);
+}
+
+
+void
+XDPSLCleanAll(xdpy)
+ register Display *xdpy;
+{
+ /* Clean up all state associated with dpy */
+ register DPSCAPPausedContextData *slot;
+ int dpyix = DPY_NUMBER(xdpy);
+
+ /* Clean up paused context list */
+ for (slot = PausedPerDisplay[dpyix]; slot; slot = PausedPerDisplay[dpyix])
+ {
+ PausedPerDisplay[dpyix] = slot->next;
+ Xfree(slot);
+ }
+
+ /* Clear agent args */
+ AgentArgs[dpyix].showSmallSizes = 0;
+ AgentArgs[dpyix].pixMem = 0;
+}
+
+void
+XDPSLUpdateAgentArgs(xdpy)
+ register Display *xdpy;
+{
+ int dpyix = DPY_NUMBER(xdpy);
+
+ if (AgentArgs[dpyix].showSmallSizes)
+ XDPSLSetAgentArg(xdpy, AGENT_ARG_SMALLFONTS, AgentArgs[dpyix].showSmallSizes);
+ if (AgentArgs[dpyix].pixMem)
+ XDPSLSetAgentArg(xdpy, AGENT_ARG_PIXMEM, AgentArgs[dpyix].pixMem);
+}
+
+void
+XDPSLCleanContext(xdpy, cxid)
+ Display *xdpy;
+ ContextXID cxid;
+{
+ /* Clean up all state associated with cxid on this dpy */
+ register DPSCAPPausedContextData *slot, *prev;
+ int dpyix = DPY_NUMBER(xdpy);
+
+ /* If this is DPS/X, then slot will never have been initialized.
+ See XDPSLNotifyContext */
+
+ /* Clean up paused context list */
+ prev = (DPSCAPPausedContextData *)NULL;
+ for (slot = PausedPerDisplay[dpyix]; slot; prev = slot, slot = slot->next)
+ {
+ if (slot->cxid != cxid)
+ continue;
+ if (!prev)
+ PausedPerDisplay[dpyix] = slot->next;
+ else
+ prev->next = slot->next;
+ Xfree(slot);
+ break;
+ }
+}
+
+/* DPS NX 2.0 */
+void
+XDPSLSetGCFlushMode(dpy, value)
+ Display *dpy;
+ int value;
+{
+ int dpyix;
+ register Display *agent = ShuntMap[dpyix = DPY_NUMBER(dpy)];
+
+ if (value != XDPSNX_GC_UPDATES_SLOW && value != XDPSNX_GC_UPDATES_FAST)
+ {
+ DPSWarnProc(NULL, "DPS NX: Bogus GC flush mode.\n");
+ return;
+ }
+ /* 0 means no NX */
+ GCFlushMode[dpyix] = (agent == dpy) ? 0 : value;
+}
+
+int
+XDPSLGetGCFlushMode(dpy)
+ Display *dpy;
+{
+ return(GCFlushMode[DPY_NUMBER(dpy)]);
+}
+
+void
+XDPSLFlushGC(xdpy, gc)
+ Display *xdpy;
+ GC gc;
+{
+ int dpyix;
+ register Display *dpy = ShuntMap[dpyix = DPY_NUMBER(xdpy)];
+
+ if (!gc->dirty) return;
+
+ if (GCFlushMode[dpyix] == XDPSNX_GC_UPDATES_FAST)
+ {
+ XGCValues vals;
+ static unsigned long valuemask = DPSGCBITS & ~(GCClipMask);
+
+ /* Okay to call Xlib, since dpy isn't locked */
+ DPSAssertWarn(XGetGCValues(xdpy, gc, valuemask, &vals),
+ NULL, "DPS NX: XGetGCValues returned False\n");
+ vals.clip_mask = gc->values.clip_mask;
+ LockDisplay(dpy);
+ DPSCAPChangeGC(dpy, gc, DPSGCBITS, &vals);
+ UnlockDisplay(dpy);
+ SyncHandle();
+ }
+ /* Fall thru. Either the GCFlushMode is SLOW, which means
+ we will DPSCAPChangeGC as a side-effect of FlushGC when
+ the GC hook is called, or we just did it in the FAST case. */
+ FlushGC(xdpy, gc);
+ XDPSLFlush(xdpy);
+}
+
+/* === PRIVATE CSDPS PROCS === */
+
+static Status
+DPSCAPClientMessageProc(
+ Display *dpy,
+ XEvent *re,
+ xEvent *event)
+{
+ register XDPSLOutputEvent *oce;
+ register DPSCAPOutputEvent *oev;
+ XDPSLOutputEvent fakeOutput;
+ XExtCodes *codes = Codes[DPY_NUMBER(dpy)];
+ PSCMProc oldProc = ClientMsgProc[DPY_NUMBER(dpy)];
+
+ if (codes != NULL)
+ {
+ /* Get private data */
+ XExtData *extData = XFindOnExtensionList(
+ CSDPSHeadOfDpyExt(dpy),
+ codes->extension);
+ DPSCAPData my;
+
+ /* There's no extension, or there is an extension but we are
+ passing events uninterpreted, so just pass it along
+ unless it is a DPSCAP error. */
+
+ if (!extData)
+ goto pass_the_buck;
+ my = (DPSCAPData) extData->private_data;
+ if (XDPSLGetPassEventsFlag(dpy) &&
+ (event->u.clientMessage.u.l.type != my->typeXError))
+ goto pass_the_buck;
+
+ /* Fake up a DPS extension event and handle it transparently,
+ without going through the Xlib event queue */
+
+ if (event->u.clientMessage.u.b.type == my->typePSOutput)
+ {
+ oce = &fakeOutput;
+ oce->length = DPSCAP_BYTESPEROUTPUTEVENT;
+ oev = (DPSCAPOutputEvent *)event->u.clientMessage.u.b.bytes;
+ goto common_stuff;
+ }
+ else if (event->u.clientMessage.u.b.type == my->typePSOutputWithLen)
+ {
+ oce = &fakeOutput;
+ oev = (DPSCAPOutputEvent *)event->u.clientMessage.u.b.bytes;
+ oce->length = oev->data[DPSCAP_DATA_LEN];
+common_stuff:
+ oce->type = codes->first_event + PSEVENTOUTPUT;
+ oce->serial = _XSetLastRequestRead(dpy, (xGenericReply *)event);
+ oce->send_event = True; /* ??? */
+ oce->display = dpy;
+ oce->cxid = oev->cxid;
+ bcopy((char *) oev->data, oce->data, oce->length);
+ /* We've converted the event, give it to DPS */
+ if (TextProc)
+ (*TextProc)((XEvent *) oce);
+ return(False);
+ }
+ else if (event->u.clientMessage.u.b.type == my->typePSStatus)
+ {
+ register XDPSLStatusEvent *sce;
+ register DPSCAPStatusEvent *sev;
+ XDPSLStatusEvent fakeStatus;
+
+ sev = (DPSCAPStatusEvent *)event->u.clientMessage.u.b.bytes;
+ sce = &fakeStatus;
+ sce->type = codes->first_event + PSEVENTSTATUS;
+ sce->serial = _XSetLastRequestRead(dpy, (xGenericReply *)event);
+ sce->send_event = True; /* ??? */
+ sce->display = dpy;
+ sce->cxid = sev->cxid;
+ sce->status = sev->status;
+ /* We've converted the event, give it to DPS */
+ if (StatusProc[DPY_NUMBER(dpy)])
+ (*(StatusProc[DPY_NUMBER(dpy)]))((XEvent *) sce);
+ return(False);
+ }
+ else if (event->u.clientMessage.u.l.type == my->typeXError)
+ {
+ xError err;
+ register xError *e = &err;
+
+ e->type = X_Error;
+ e->errorCode = event->u.clientMessage.u.l.longs0;
+ e->sequenceNumber = event->u.u.sequenceNumber;
+ e->resourceID = event->u.clientMessage.u.l.longs3;
+ e->minorCode = event->u.clientMessage.u.l.longs2;
+ e->majorCode = event->u.clientMessage.u.l.longs1;
+ /* Smash the wire event here, before going off deep end */
+ event->u.clientMessage.u.l.type = my->typeNoop;
+ /* Jump! */
+ return(_XError(dpy, e));
+ }
+ else if (event->u.clientMessage.u.l.type == my->typePSReady)
+ /* L2-DPS/PROTO 9 addition */
+ {
+ register XDPSLReadyEvent *rce;
+ XDPSLReadyEvent fakeReady;
+
+ rce = &fakeReady;
+ rce->type = codes->first_event + PSEVENTREADY;
+ rce->serial = _XSetLastRequestRead(dpy, (xGenericReply *)event);
+ rce->send_event = True;
+ rce->display = dpy;
+ rce->cxid = event->u.clientMessage.u.l.longs0;
+ rce->val[0] = event->u.clientMessage.u.l.longs1;
+ rce->val[1] = event->u.clientMessage.u.l.longs2;
+ rce->val[2] = event->u.clientMessage.u.l.longs3;
+ rce->val[3] = event->u.clientMessage.u.l.longs4;
+ XDPSLCallReadyEventHandler(dpy, (XEvent *) rce);
+ return(False);
+ }
+ }
+
+ /* Put the event on the queue, so that Xlib is happy */
+pass_the_buck:
+ return(oldProc(dpy, re, event));
+}
+
+
+static void
+DPSCAPInitGC(Display *dpy, Display *agent, GC gc)
+{
+ XGCValues values;
+ unsigned long valuemask = DPSGCBITS & ~(GCClipMask);
+
+ /* Okay to call Xlib, since dpy isn't locked */
+ DPSAssertWarn(XGetGCValues(dpy, gc, valuemask, &values),
+ NULL, "DPS NX: XGetGCValues returned False\n");
+ values.clip_mask = gc->values.clip_mask;
+ DPSCAPChangeGC(agent, gc, DPSGCBITS, &values);
+ SyncHandle();
+ XDPSLSync(dpy);
+}
+
+
+/* ARGSUSED */
+
+static Bool
+WaitForSyncProc(Display *xdpy, XEvent *event, char *arg)
+{
+ DPSCAPData my = (DPSCAPData)arg;
+
+ if ((event->type & 0x7F) == ClientMessage
+ && event->xclient.message_type == my->typeSync
+ && event->xclient.data.l[0] == (long) my->saveseq) {
+ return(True);
+ } else {
+ return(False);
+ }
+}
+
+
+static int
+DPSCAPAfterProc(Display *xdpy)
+{
+ register Display *dpy = ShuntMap[DPY_NUMBER(xdpy)];
+ GenericProcPtrReturnsInt proc;
+
+ if (dpy != (Display *)NULL && dpy != xdpy)
+ {
+ LockDisplay(dpy);
+ N_XFlush(dpy);
+ UnlockDisplay(dpy);
+ LockDisplay(xdpy);
+ _XFlush(xdpy);
+ UnlockDisplay(xdpy);
+ }
+ if ((proc = AfterProcs[DPY_NUMBER(xdpy)]) != NULL)
+ return((*proc)(xdpy));
+ else
+ return(0);
+}
+
+
+static unsigned int
+DPSCAPSetPause(Display *xdpy, ContextXID cxid)
+{
+ register DPSCAPPausedContextData *slot;
+ int dpyix;
+ unsigned int ret;
+
+ /* Find or create slot */
+
+ slot = PausedPerDisplay[dpyix = DPY_NUMBER(xdpy)];
+ if (!slot)
+ {
+ slot = (DPSCAPPausedContextData *)
+ Xcalloc(1, sizeof(DPSCAPPausedContextData));
+ PausedPerDisplay[dpyix] = slot;
+ goto common_code;
+ /* IMPLICATION: it is okay to fall through common_code
+ and do test_ret. */
+ }
+ while (1)
+ if (slot->cxid == cxid)
+ {
+ if (!slot->paused)
+ {
+ slot->paused = True;
+ ++gTotalPaused;
+ }
+ /* Back-to-back pauses get different sequence numbers */
+ ret = ++slot->seqnum;
+ goto test_ret;
+ }
+ else if (slot->next) slot = slot->next;
+ else break;
+ /* cxid wasn't found, so add it */
+ /* ASSERT: slot points to last record of the list */
+ slot->next = (DPSCAPPausedContextData *)
+ Xcalloc(1, sizeof(DPSCAPPausedContextData));
+ slot = slot->next;
+common_code:
+ slot->paused = True;
+ ++gTotalPaused;
+ slot->cxid = cxid;
+ ret = ++slot->seqnum;
+test_ret:
+ if (!ret)
+ {
+ DPSWarnProc(NULL, "Pause sequence wrapped around!");
+ }
+ return(ret);
+}
+
+static Bool
+DPSCAPResumeContext(Display *xdpy, ContextXID cxid)
+{
+ register DPSCAPPausedContextData *slot;
+ int dpyix = DPY_NUMBER(xdpy);
+
+ /* Try to match cxid to list of paused contexts */
+ for (slot = PausedPerDisplay[dpyix]; slot; slot = slot->next)
+ if (slot->cxid == cxid && slot->paused)
+ {
+ /* Send resume event */
+ register XClientMessageEvent *ee;
+ XEvent e;
+ XExtData *extData;
+ DPSCAPData my;
+ XExtCodes *codes = Codes[dpyix];
+
+ extData = XFindOnExtensionList(
+ CSDPSHeadOfDpyExt(xdpy),
+ codes->extension);
+ if (!extData)
+ return(False);
+ my = (DPSCAPData) extData->private_data;
+
+ ee = &e.xclient;
+ ee->type = ClientMessage;
+ ee->display = xdpy;
+ ee->window = my->agentWindow;
+ ee->format = 32;
+ ee->message_type = my->typeResume;
+ ee->data.l[0] = cxid;
+ ee->data.l[1] = slot->seqnum;
+ (void) XSendEvent(
+ xdpy,
+ my->agentWindow,
+ False,
+ NoEventMask,
+ &e);
+ XFlush(xdpy);
+ /* Turn off flag */
+ slot->paused = False;
+ --gTotalPaused;
+ return(True);
+ }
+ /* Fall thru */
+ return(False);
+}
diff --git a/nx-X11/lib/dps/Xlibnet.h b/nx-X11/lib/dps/Xlibnet.h
new file mode 100644
index 000000000..f86c3542b
--- /dev/null
+++ b/nx-X11/lib/dps/Xlibnet.h
@@ -0,0 +1,284 @@
+/* $XConsortium: Xlibnet.h,v 1.18 91/07/23 19:01:27 rws Exp $ */
+
+/*
+Copyright 1991 Massachusetts Institute of Technology
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of M.I.T. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission. M.I.T. makes no representations about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+*/
+/* $XFree86: xc/lib/dps/Xlibnet.h,v 1.6 2001/06/30 22:41:44 tsi Exp $ */
+/*
+ * Xlibnet.h - Xlib networking include files for UNIX Systems.
+ */
+
+#ifndef X_UNIX_PATH
+#ifdef hpux
+#define X_UNIX_PATH "/usr/spool/sockets/X11/"
+#define OLD_UNIX_PATH "/tmp/.X11-unix/X"
+#else
+#define X_UNIX_PATH "/tmp/.X11-unix/X"
+#endif
+#endif /* X_UNIX_PATH */
+
+#ifdef STREAMSCONN
+#ifdef SYSV
+/*
+ * UNIX System V Release 3.2
+ */
+#define BytesReadable(fd,ptr) (_XBytesReadable ((fd), (ptr)))
+#define MALLOC_0_RETURNS_NULL
+#include <sys/ioctl.h>
+
+#endif /* SYSV */
+#ifdef SVR4
+/*
+ * TLI (Streams-based) networking
+ */
+#define BytesReadable(fd,ptr) (_XBytesReadable ((fd), (ptr)))
+#include <sys/uio.h> /* define struct iovec */
+
+#endif /* SVR4 */
+#else /* not STREAMSCONN */
+/*
+ * socket-based systems
+ */
+#include <netinet/in.h>
+#include <sys/ioctl.h>
+#include <netdb.h>
+#include <sys/uio.h> /* needed for XlibInt.c */
+#ifdef SVR4
+#include <sys/filio.h>
+#endif
+
+#if defined(i386) && defined(SYSV)
+#if !defined(__SCO__)
+#include <net/errno.h>
+#endif
+#include <sys/stropts.h>
+#define BytesReadable(fd,ptr) ioctl((fd), I_NREAD, (ptr))
+#else
+#define BytesReadable(fd, ptr) ioctl ((fd), FIONREAD, (ptr))
+#endif
+
+#endif /* STREAMSCONN else */
+
+/*
+ * If your BytesReadable correctly detects broken connections, then
+ * you should NOT define XCONN_CHECK_FREQ.
+ */
+#define XCONN_CHECK_FREQ 256
+
+#ifndef X_NOT_POSIX
+#ifdef _POSIX_SOURCE
+#include <limits.h>
+#else
+#define _POSIX_SOURCE
+#include <limits.h>
+#undef _POSIX_SOURCE
+#endif
+#endif
+#ifndef OPEN_MAX
+#ifdef SVR4
+#define OPEN_MAX 256
+#else
+#include <sys/param.h>
+#ifndef OPEN_MAX
+#ifdef NOFILE
+#define OPEN_MAX NOFILE
+#else
+#if !defined(__UNIXOS2__) && !defined(__QNX__)
+#define OPEN_MAX NOFILES_MAX
+#else
+#define OPEN_MAX 256
+#endif
+#endif
+#endif
+#endif
+#endif
+
+#if OPEN_MAX > 256
+#undef OPEN_MAX
+#define OPEN_MAX 256
+#endif
+
+/* Adobe additions */
+#ifdef MSKCNT
+#undef MSKCNT
+#endif
+#ifdef BITMASK
+#undef BITMASK
+#endif
+#ifdef MASKIDX
+#undef MASKIDX
+#endif
+
+#define MSKCNT ((OPEN_MAX + 31) / 32)
+
+#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))
+
+/* Adobe additions */
+#ifdef COPYBITS
+#undef COPYBITS
+#undef CLEARBITS
+#undef MASKANDSETBITS
+#undef ORBITS
+#undef UNSETBITS
+#endif
+
+#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 _XANYSET(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 _XANYSET(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 _XANYSET(src) (src[0] || src[1] || src[2])
+#endif
+#if (MSKCNT==4)
+#define COPYBITS(src, dst) dst[0] = src[0]; dst[1] = src[1]; \
+ dst[2] = src[2]; dst[3] = src[3]
+#define CLEARBITS(buf) buf[0] = 0; buf[1] = 0; buf[2] = 0; buf[3] = 0
+#define MASKANDSETBITS(dst, b1, b2) \
+ dst[0] = (b1[0] & b2[0]);\
+ dst[1] = (b1[1] & b2[1]);\
+ dst[2] = (b1[2] & b2[2]);\
+ dst[3] = (b1[3] & b2[3])
+#define ORBITS(dst, b1, b2) \
+ dst[0] = (b1[0] | b2[0]);\
+ dst[1] = (b1[1] | b2[1]);\
+ dst[2] = (b1[2] | b2[2]);\
+ dst[3] = (b1[3] | b2[3])
+#define UNSETBITS(dst, b1) \
+ dst[0] &= ~b1[0]; \
+ dst[1] &= ~b1[1]; \
+ dst[2] &= ~b1[2]; \
+ dst[3] &= ~b1[3]
+#define _XANYSET(src) (src[0] || src[1] || src[2] || src[3])
+#endif
+
+#if (MSKCNT>4)
+#define COPYBITS(src, dst) bcopy((char *) src, (char *) dst,\
+ MSKCNT*sizeof(long))
+#define CLEARBITS(buf) bzero((char *) buf, MSKCNT*sizeof(long))
+#define MASKANDSETBITS(dst, b1, b2) \
+ { int cri; \
+ for (cri=MSKCNT; --cri>=0; ) \
+ dst[cri] = (b1[cri] & b2[cri]); }
+#define ORBITS(dst, b1, b2) \
+ { int cri; \
+ for (cri=MSKCNT; --cri>=0; ) \
+ dst[cri] = (b1[cri] | b2[cri]); }
+#define UNSETBITS(dst, b1) \
+ { int cri; \
+ for (cri=MSKCNT; --cri>=0; ) \
+ dst[cri] &= ~b1[cri]; }
+/*
+ * If MSKCNT>4, then _XANYSET is a routine defined in XlibInt.c.
+ *
+ * #define _XANYSET(src) (src[0] || src[1] || src[2] || src[3] || src[4] ...)
+ */
+extern int N_XANYSET(unsigned long *);
+#endif
+
+/*
+ * 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;
+ * };
+ */
+#if defined(USG) && !defined(CRAY) && !defined(umips) && !defined(MOTOROLA)
+struct iovec {
+ caddr_t iov_base;
+ int iov_len;
+};
+#endif /* USG */
+
+
+#ifdef STREAMSCONN
+#include "Xstreams.h"
+
+extern char _XsTypeOfStream[];
+extern Xstream _XsStream[];
+
+#define ReadFromServer(dpy, data, size) \
+ (*_XsStream[_XsTypeOfStream[dpy]].ReadFromStream)((dpy), (data), (size), \
+ BUFFERING)
+#define WriteToServer(dpy, bufind, size) \
+ (*_XsStream[_XsTypeOfStream[dpy]].WriteToStream)((dpy), (bufind), (size))
+
+#else /* else not STREAMSCONN */
+
+/*
+ * bsd can read from sockets directly
+ */
+#define ReadFromServer(dpy, data, size) read((dpy), (data), (size))
+#define WriteToServer(dpy, bufind, size) write((dpy), (bufind), (size))
+
+#endif /* STREAMSCONN */
+
+
+#ifndef USL_COMPAT
+#if !defined(USG) || defined(MOTOROLA) || \
+ defined(__SCO__) || (!(defined(SYSV) && defined(i386))) || \
+ defined(__UNIXWARE__)
+#define _XReadV readv
+#define _XWriteV writev
+#endif
+#endif /* !USL_COMPAT */
+
+#define ReadvFromServer(dpy, iov, iovcnt) _XReadV((dpy), (iov), (iovcnt))
+#define WritevToServer(dpy, iov, iovcnt) _XWriteV((dpy), (iov), (iovcnt))
diff --git a/nx-X11/lib/dps/Xstreams.h b/nx-X11/lib/dps/Xstreams.h
new file mode 100644
index 000000000..a7419131b
--- /dev/null
+++ b/nx-X11/lib/dps/Xstreams.h
@@ -0,0 +1,218 @@
+/* $XConsortium: Xstreams.h,v 1.6 91/07/19 23:22:53 gildea Exp $ */
+/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
+/* Copyright (c) 1988 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of AT&T or USL not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. AT&T and USL make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * AT&T and USL DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL AT&T or USL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/* $XFree86$ */
+
+
+#ifndef _XSTREAMS_H_
+#define _XSTREAMS_H_
+/*
+ Xstreams.h (C header file)
+ Acc: 575304412 Tue Apr 26 09:46:52 1988
+ Mod: 574017273 Tue Apr 26 12:14:33 1988
+ Sta: 574017273 Tue Apr 26 12:14:33 1988
+ Owner: 2011
+ Group: 1985
+ Permissions: 644
+*/
+/*
+ START USER STAMP AREA
+*/
+/*
+ END USER STAMP AREA
+*/
+
+
+
+#define MEM_ALLIGN(ptr) ((((unsigned) (ptr + 3)) >> 2) << 2)
+
+#define CONNECT_TIMEOUT 60
+#define MAX_AUTO_BUF_LEN 256
+#define MAX_DISP_DIGITS 20
+#define MAX_NETS 8
+
+typedef struct _host {
+ char host_name[32];
+ int host_len;
+ struct _host *next;
+} HOST;
+
+/*
+ * Structure for handling multiple connection requests on the same stream.
+ */
+
+struct listenCall {
+ struct t_call *CurrentCall;
+ struct listenCall *NextCall;
+};
+
+struct listenQue {
+ struct listenCall *QueHead;
+ struct listenCall *QueTail;
+};
+
+#define EMPTY(p) (p->QueHead == (struct listenCall *) NULL)
+
+
+typedef struct {
+ int flags;
+ char type;
+ int display;
+ char *inputbuf;
+ int buflen;
+ int bufptr;
+ int msglen;
+ } IOBUFFER;
+
+typedef struct {
+ int _nnets;
+#ifdef SVR4
+ struct netconfig *_net[MAX_NETS];
+#else
+ char *_net[MAX_NETS];
+#endif
+ struct listenQue FreeList[MAX_NETS];
+ struct listenQue PendingQue[MAX_NETS];
+ int _npeers;
+ char **_peer;
+ int *_peerlen;
+ HOST *_validhosts;
+ } networkInfo;
+
+
+typedef struct _Xstream {
+ int (*SetupTheListener)();
+ int (*ConnectNewClient)();
+ int (*CallTheListener)();
+ int (*ReadFromStream)();
+ int (*BytesCanBeRead)();
+ int (*WriteToStream)();
+ int (*CloseStream)();
+ int (*CreateAddress)();
+ union ext {
+ int (*NameServer)();
+ networkInfo *NetInfo;
+ } u;
+ } Xstream;
+
+/* old shared libraries have the names already fixed */
+#ifdef USL_COMPAT
+#define _XsStream xstream
+#define _XReadV _readv
+#define _XWriteV _writev
+#define _XSelect XSelect
+#define _XsErrorCall ErrorCall
+#define _XsSetupLocalStream SetupLocalStream
+#define _XsConnectLocalClient ConnectLocalClient
+#define _XsOpenSpServer OpenSpServer
+#define _XsReadLocalStream ReadLocalStream
+#define _XsConnectTliClient ConnectTliClient
+#define _XsSetupTliStrean SetupTliStream
+#define _XsCallTliServer CallTliServer
+#define _XsCallLocalServer CallLocalServer
+#define _XsTypeOfStream TypeOfStream
+#ifdef SVR4
+#define _XsSetupNamedStream SetupNamedStream
+#define _XsSetupSpStream SetupSpStream
+#endif /* SVR4 */
+#endif /* USL_COMPAT */
+
+extern Xstream _XsStream[];
+
+#define NO_BUFFERING 0
+#define BUFFERING 1
+
+/* Network services */
+
+#define OpenDaemonConnection 0
+#define PEER_NAME 1
+#define PEER_ALLOC 2
+#define PEER_FREE 3
+#define ConvertNetAddrToName 4
+#define ConvertNameToNetAddr 5
+#define ConvertNameToTliCall 6
+#define ConvertTliCallToName 7
+#define ConvertNameToTliBind 8
+
+#define UNAME_LENGTH 14
+
+#define X_LOCAL_STREAM 0
+#define X_NAMED_STREAM 1
+/* Enhanced Application Compatibility Support */
+#define X_SP_STREAM 2
+/* End Enhanced Application Compatibility Support */
+
+#define X_TLI_STREAM 3
+#define CLOSED_STREAM -1
+
+/*
+ The following are defined in X.h. Any changes to FamilyUname
+ should take X.h into consideration.
+*/
+ /* protocol families */
+
+ /*
+
+ #define FamilyInternet 0
+ #define FamilyDECnet 1
+ #define FamilyChaos 2
+
+ */
+
+#define FamilyUname 3
+
+#define X_TCP_PORT 6000
+
+#define NAMED_LISTENER "/dev/X/Nserver"
+#define LOCAL_LISTENER "/dev/X/server"
+/* Enhanced Application Compatibility Support */
+/* End Enhanced Application Compatibility Support */
+
+#define NAME_SERVER_NODE "/dev/X/nameserver"
+#define XNETSPECDIR "lib/net"
+#define XROOTDIR "/usr/X"
+
+#define MAX_SIMUL_TLI_CALLS 20
+
+#define SetupNetworkInfo() _XsStream[X_LOCAL_STREAM].u.NetInfo = &Network; \
+ _XsStream[X_NAMED_STREAM].u.NetInfo = &Network; \
+/* Enhanced Application Compatibility Support */ \
+/* End Enhanced Application Compatibility Support */ \
+ _XsStream[X_TLI_STREAM].u.NameServer = nameserver
+
+#define NetworkInfo (_XsStream[X_LOCAL_STREAM].u.NetInfo)
+#define GetNetworkInfo (*_XsStream[X_TLI_STREAM].u.NameServer)
+#define validhosts _XsStream[X_LOCAL_STREAM].u.NetInfo->_validhosts
+
+/*
+ * header of messages sent by X to the nameserver
+ * 1st int: the size of the entire message.
+ * 2nd int: the size of the header itself.
+ * 3rd int: the service number.
+ * 4th int: the display number.
+ * 5th int: the length of the network name.
+ */
+
+#define HEADERSIZE (5*sizeof(int))
+#endif /* _XSTREAMS_H_ */
diff --git a/nx-X11/lib/dps/csconndi.c b/nx-X11/lib/dps/csconndi.c
new file mode 100644
index 000000000..64205f8dc
--- /dev/null
+++ b/nx-X11/lib/dps/csconndi.c
@@ -0,0 +1,839 @@
+/*
+ * csconndi.c -- low level connection maker for CSDPS
+ *
+ * (c) Copyright 1990-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Portions Copyright 1989 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * Author: Adobe Systems Incorporated and MIT X Consortium
+ */
+/* $XFree86: xc/lib/dps/csconndi.c,v 1.11tsi Exp $ */
+
+#if defined(sun) && !defined(SVR4)
+#define memmove(t,f,c) bcopy(f,t,c)
+#endif
+
+#define NEED_EVENTS
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <X11/Xos.h>
+/* Include this first so that Xasync.h, included from Xlibint.h, can find
+ the definition of NOFILE */
+#include <sys/param.h>
+#include <X11/Xlibint.h>
+#include "Xlibnet.h" /* New for R5, delete for R4 */
+#include <arpa/inet.h>
+
+#ifndef hpux /* HP doesn't include Xauth.h :-( */
+#include <X11/Xauth.h>
+#else
+#define FamilyLocal (256)
+#endif
+
+#include <ctype.h>
+#ifdef DNETCONN
+#include <netdnet/dn.h>
+#include <netdnet/dnetdb.h>
+#endif
+
+#include <netdb.h>
+
+#include "DPSCAPproto.h"
+#include "cslibint.h"
+#include "dpsassert.h"
+
+#if defined(hpux) || defined(AIXV3)
+#define SELECT_TYPE int *
+#else
+#define SELECT_TYPE fd_set *
+#endif
+
+#ifndef _XANYSET
+#define _XANYSET N_XANYSET
+#endif /* _XANYSET */
+
+#ifndef X_CONNECTION_RETRIES /* number retries on ECONNREFUSED */
+#define X_CONNECTION_RETRIES 5
+#endif
+
+#define CONN_PARAMS char *, int , int , int *, int *, char **
+
+#ifdef DNETCONN
+static int MakeDECnetConnection(CONN_PARAMS);
+#endif
+#ifdef UNIXCONN
+static int MakeUNIXSocketConnection(CONN_PARAMS);
+#endif
+#ifdef TCPCONN
+static int MakeTCPConnection(CONN_PARAMS);
+#endif
+#ifdef STREAMSCONN
+extern int _XMakeStreamsConnection(CONN_PARAMS);
+#endif
+
+/* This global controls the size of the output socket buffer. Zero
+ means to use the system default size. */
+int gNXSndBufSize = 0;
+
+static char *copystring (char *src, int len)
+{
+ char *dst = Xmalloc (len + 1);
+
+ if (dst) {
+ strncpy (dst, src, len);
+ dst[len] = '\0';
+ }
+
+ return dst;
+}
+
+
+/*
+ * Attempts to connect to agent, given name. Returns file descriptor
+ * (network socket) or -1 if connection fails. Names may be of the
+ * following format:
+ *
+ * [hostname] : [:] agentnumber
+ *
+ * The second colon indicates a DECnet style name. No hostname is interpretted
+ * as the most efficient local connection to a server on the same machine.
+ * This is usually:
+ *
+ * o shared memory
+ * o local stream
+ * o UNIX domain socket
+ * o TCP to local host
+ */
+
+int
+DPSCAPConnect(
+ char *display_name,
+ char **fullnamep, /* RETURN */
+ int *dpynump, /* RETURN */
+ int *familyp, /* RETURN */
+ int *saddrlenp, /* RETURN */
+ char **saddrp) /* RETURN, freed by caller */
+{
+ char *lastp, *p; /* char pointers */
+ char *phostname = NULL; /* start of host of display */
+ char *pdpynum = NULL; /* start of dpynum of display */
+ char *pscrnum = NULL; /* start of screen of display */
+ Bool dnet = False; /* if true, then DECnet format */
+ int iagent; /* required display number */
+ int (*connfunc)(CONN_PARAMS); /* method to create connection */
+ int fd = -1; /* file descriptor to return */
+ int len; /* length tmp variable */
+
+ p = display_name;
+
+ *saddrlenp = 0; /* set so that we can clear later */
+ *saddrp = NULL;
+
+ /*
+ * Step 1, find the hostname. This is delimited by the required
+ * first colon.
+ */
+ for (lastp = p; *p && *p != ':'; p++) ;
+ if (!*p) return -1; /* must have a colon */
+
+ if (p != lastp) { /* no hostname given */
+ phostname = copystring (lastp, p - lastp);
+ if (!phostname) goto bad; /* no memory */
+ }
+
+
+ /*
+ * Step 2, see if this is a DECnet address by looking for the optional
+ * second colon.
+ */
+ if (p[1] == ':') { /* then DECnet format */
+ dnet = True;
+ p++;
+ }
+
+ /*
+ * see if we're allowed to have a DECnet address
+ */
+#ifndef DNETCONN
+ if (dnet) goto bad;
+#endif
+
+
+ /*
+ * Step 3, find the port number. This field is required.
+ * Zero is acceptable as a port number, meaning use the default.
+ */
+
+ for (lastp = ++p; *p && isascii(*p) && isdigit(*p); p++) ;
+ if ((p == lastp) || /* required field */
+ (*p != '\0' && *p != '.') || /* invalid non-digit terminator */
+ !(pdpynum = copystring (lastp, p - lastp))) /* no memory */
+ goto bad;
+ iagent = atoi (pdpynum);
+
+
+ /*
+ * At this point, we know the following information:
+ *
+ * phostname hostname string or NULL
+ * iagent agent port number
+ * dnet DECnet boolean
+ *
+ * We can now decide which transport to use based on the ConnectionFlags
+ * build parameter the hostname string. If phostname is NULL or equals
+ * the string "local", then choose the best transport. If phostname
+ * is "unix", then choose BSD UNIX domain sockets (if configured).
+ *
+ * First, choose default transports: DECnet else (TCP or STREAMS)
+ */
+
+
+#ifdef DNETCONN
+ if (dnet)
+ connfunc = MakeDECnetConnection;
+ else
+#endif
+#ifdef TCPCONN
+ connfunc = MakeTCPConnection;
+#else
+#ifdef STREAMSCONN
+ connfunc = _XMakeStreamsConnection;
+#else
+ connfunc = NULL;
+#endif
+#endif
+
+#ifdef UNIXCONN
+ /*
+ * Now that the defaults have been established, see if we have any
+ * special names that we have to override:
+ *
+ * :N => if UNIXCONN then unix-domain-socket
+ * ::N => if UNIXCONN then unix-domain-socket
+ * unix:N => if UNIXCONN then unix-domain-socket
+ *
+ * Note that if UNIXCONN isn't defined, then we can use the default
+ * transport connection function set above.
+ */
+ if (!phostname) {
+ connfunc = MakeUNIXSocketConnection;
+ }
+ else if (strcmp (phostname, "unix") == 0) {
+ connfunc = MakeUNIXSocketConnection;
+ }
+#endif
+ if (!connfunc)
+ goto bad;
+
+
+#ifdef UNIXCONN
+#define LOCALCONNECTION (!phostname || connfunc == MakeUNIXSocketConnection)
+#else
+#define LOCALCONNECTION (!phostname)
+#endif
+
+ if (LOCALCONNECTION) {
+ /*
+ * Get the auth info for local hosts so that it doesn't have to be
+ * repeated everywhere; the particular values in these fields are
+ * not part of the protocol.
+ */
+ char hostnamebuf[256];
+ int len = N_XGetHostname (hostnamebuf, sizeof hostnamebuf);
+
+ *familyp = FamilyLocal;
+ if (len > 0) {
+ *saddrp = Xmalloc (len + 1);
+ if (*saddrp) {
+ strcpy (*saddrp, hostnamebuf);
+ *saddrlenp = len;
+ } else {
+ *saddrlenp = 0;
+ }
+ }
+ }
+#undef LOCALCONNECTION
+
+#ifndef ultrix
+ /* Ultrix has a nasty bug in getservbyname(); if the name passed to
+ it is not in the services list it seg faults! *sigh* So, we
+ don't ever look in the services info for ultrix... */
+ if (iagent == 0) { /* find service default, if one's defined */
+ struct servent *serventInfo;
+
+ if ((serventInfo = getservbyname(DPS_NX_SERV_NAME,
+ (char *) NULL)) != NULL) {
+ if (strcmp("tcp", serventInfo->s_proto) != 0) {
+ DPSWarnProc(NULL, "Services database specifies a protocol other than tcp. Using default port.\n");
+ } else /* extract the port number */
+ iagent = ntohs(serventInfo->s_port);
+ }
+ }
+#endif /* ultrix */
+ /*
+ * Make the connection, also need to get the auth address info for
+ * non-local connections. Do retries in case server host has hit its
+ * backlog (which, unfortunately, isn't distinguishable from there not
+ * being a server listening at all, which is why we have to not retry
+ * too many times).
+ */
+ if ((fd = (*connfunc) (phostname, iagent, X_CONNECTION_RETRIES,
+ familyp, saddrlenp, saddrp)) < 0)
+ goto bad;
+
+
+ /*
+ * Set the connection non-blocking since we use select() to block; also
+ * set close-on-exec so that programs that fork() doesn't get confused.
+ */
+#ifdef FIOSNBIO
+ {
+ int arg = 1;
+ ioctl (fd, FIOSNBIO, &arg);
+ }
+#else
+#if defined(O_NONBLOCK)
+ (void) fcntl (fd, F_SETFL, O_NONBLOCK);
+#elif defined(FNDELAY)
+ (void) fcntl (fd, F_SETFL, FNDELAY);
+#else
+ (void) fcntl (fd, F_SETFL, O_NDELAY);
+#endif /* O_NONBLOCK/FNDELAY */
+#endif /* FIOSNBIO */
+
+ (void) fcntl (fd, F_SETFD, 1);
+
+
+ /*
+ * Build the expanded display name:
+ *
+ * [host] : [:] agent \0
+ */
+ len = ((phostname ? strlen(phostname) : 0) + 1 + (dnet ? 1 : 0) +
+ strlen(pdpynum) + 1);
+ *fullnamep = (char *) Xmalloc (len);
+ if (!*fullnamep) goto bad;
+
+ sprintf (*fullnamep, "%s%s%d",
+ (phostname ? phostname : ""), (dnet ? "::" : ":"),
+ iagent);
+
+ *dpynump = iagent;
+ if (phostname) Xfree (phostname);
+ if (pdpynum) Xfree (pdpynum);
+ if (pscrnum) Xfree (pscrnum);
+ return fd;
+
+
+ /*
+ * error return; make sure everything is cleaned up.
+ */
+ bad:
+ if (fd >= 0) (void) close (fd);
+ if (*saddrp) {
+ Xfree (*saddrp);
+ *saddrp = NULL;
+ }
+ *saddrlenp = 0;
+ if (phostname) Xfree (phostname);
+ if (pdpynum) Xfree (pdpynum);
+ return -1;
+
+}
+
+
+/*****************************************************************************
+ * *
+ * Make Connection Routines *
+ * *
+ *****************************************************************************/
+
+#ifdef DNETCONN /* stupid makedepend */
+#define NEED_BSDISH
+#endif
+#ifdef UNIXCONN
+#define NEED_BSDISH
+#endif
+#ifdef TCPCONN
+#define NEED_BSDISH
+#endif
+
+#ifdef NEED_BSDISH /* makedepend can't handle #if */
+/*
+ * 4.2bsd-based systems
+ */
+#include <sys/socket.h>
+
+#ifndef hpux
+#ifdef apollo /* nest if(n)defs because makedepend is broken */
+#ifndef NO_TCP_H
+#include <netinet/tcp.h>
+#endif /* NO_TCP_H */
+#else /* apollo */
+#include <netinet/tcp.h>
+#endif /* apollo */
+#endif
+#endif /* NEED_BSDISH */
+
+
+#ifdef DNETCONN
+static int MakeDECnetConnection (phostname, iagent, retries,
+ familyp, saddrlenp, saddrp)
+ char *phostname;
+ int iagent;
+ int retries;
+ int *familyp; /* RETURN */
+ int *saddrlenp; /* RETURN */
+ char **saddrp; /* RETURN */
+{
+ int fd;
+ char objname[20];
+ extern int dnet_conn();
+ struct dn_naddr *dnaddrp, dnaddr;
+ struct nodeent *np;
+
+ if (!phostname) phostname = "0";
+
+ /*
+ * build the target object name.
+ */
+ sprintf (objname, "DPS$EXECUTIVE_%d", iagent);
+
+ /*
+ * Attempt to open the DECnet connection, return -1 if fails; ought to
+ * do some retries here....
+ */
+ if ((fd = dnet_conn (phostname, objname, SOCK_STREAM, 0, 0, 0, 0)) < 0) {
+ return -1;
+ }
+
+ *familyp = FamilyDECnet;
+ if (dnaddrp = dnet_addr (phostname)) { /* stolen from xhost */
+ dnaddr = *dnaddrp;
+ } else {
+ if ((np = getnodebyname (phostname)) == NULL) {
+ (void) close (fd);
+ return -1;
+ }
+ dnaddr.a_len = np->n_length;
+ memmove(dnaddr.a_addr, np->n_addr, np->n_length);
+ }
+
+ *saddrlenp = sizeof (struct dn_naddr);
+ *saddrp = Xmalloc (*saddrlenp);
+ if (!*saddrp) {
+ (void) close (fd);
+ return -1;
+ }
+ memmove (*saddrp, (char *)&dnaddr, *saddrlenp);
+ return fd;
+}
+#endif /* DNETCONN */
+
+
+#ifdef UNIXCONN
+
+#ifndef X_NO_SYS_UN
+#include <sys/un.h>
+#endif
+
+#ifndef CSDPS_UNIX_PATH
+#ifdef hpux
+#define CSDPS_UNIX_DIR "/usr/spool/sockets/DPSNX"
+#define CSDPS_UNIX_PATH "/usr/spool/sockets/DPSNX/"
+#else
+#define CSDPS_UNIX_DIR "/tmp/.DPSNX-unix"
+#define CSDPS_UNIX_PATH "/tmp/.DPSNX-unix/AGENT"
+#endif
+#endif
+
+static int MakeUNIXSocketConnection (
+ char *phostname,
+ int iagent,
+ int retries,
+ int *familyp, /* RETURN */
+ int *saddrlenp, /* RETURN */
+ char **saddrp) /* RETURN */
+{
+ struct sockaddr_un unaddr; /* UNIX socket data block */
+ struct sockaddr *addr; /* generic socket pointer */
+ int addrlen; /* length of addr */
+ int fd; /* socket file descriptor */
+ int port = (iagent == 0) ? CSDPSPORT : iagent;
+
+ unaddr.sun_family = AF_UNIX;
+ sprintf (unaddr.sun_path, "%s_%d", CSDPS_UNIX_PATH, port);
+
+ addr = (struct sockaddr *) &unaddr;
+ addrlen = strlen(unaddr.sun_path) + sizeof(unaddr.sun_family);
+
+ /*
+ * Open the network connection.
+ */
+ do {
+ if ((fd = socket ((int) addr->sa_family, SOCK_STREAM, 0)) < 0) {
+ return -1;
+ }
+
+ if (gNXSndBufSize > 0)
+ setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &gNXSndBufSize, sizeof(gNXSndBufSize));
+
+ if (connect (fd, addr, addrlen) < 0) {
+ int olderrno = errno;
+ (void) close (fd);
+ if (olderrno != ENOENT || retries <= 0) {
+ errno = olderrno;
+ return -1;
+ }
+ sleep (1);
+ } else {
+ break;
+ }
+ } while (retries-- > 0);
+
+ /*
+ * Don't need to get auth info since we're local
+ */
+ return fd;
+}
+#endif /* UNIXCONN */
+
+
+#ifdef TCPCONN
+static int MakeTCPConnection (
+ char *phostname,
+ int iagent,
+ int retries,
+ int *familyp, /* RETURN */
+ int *saddrlenp, /* RETURN */
+ char **saddrp) /* RETURN */
+{
+ char hostnamebuf[256]; /* tmp space */
+ unsigned long hostinetaddr; /* result of inet_addr of arpa addr */
+ struct sockaddr_in inaddr; /* IP socket */
+ struct sockaddr *addr; /* generic socket pointer */
+ int addrlen; /* length of addr */
+ struct hostent *hp; /* entry in hosts table */
+ char *cp; /* character pointer iterator */
+ int fd; /* file descriptor to return */
+ int len; /* length tmp variable */
+
+#define INVALID_INETADDR ((unsigned long) -1)
+
+ if (!phostname) {
+ hostnamebuf[0] = '\0';
+ (void) N_XGetHostname (hostnamebuf, sizeof hostnamebuf);
+ phostname = hostnamebuf;
+ }
+
+ /*
+ * if numeric host name then try to parse it as such; do the number
+ * first because some systems return garbage instead of INVALID_INETADDR
+ */
+ if (isascii(phostname[0]) && isdigit(phostname[0])) {
+ hostinetaddr = inet_addr (phostname);
+ } else {
+ hostinetaddr = INVALID_INETADDR;
+ }
+
+ /*
+ * try numeric
+ */
+ if (hostinetaddr == INVALID_INETADDR) {
+ if ((hp = gethostbyname(phostname)) == NULL) {
+ /* No such host! */
+ return -1;
+ }
+ if (hp->h_addrtype != AF_INET) { /* is IP host? */
+ /* Not an Internet host! */
+ return -1;
+ }
+
+ /* Set up the socket data. */
+ inaddr.sin_family = hp->h_addrtype;
+#if defined(CRAY) && defined(OLDTCP)
+ /* Only Cray UNICOS3 and UNICOS4 will define this */
+ {
+ long t;
+ memmove ((char *)&t, (char *)hp->h_addr, sizeof(t));
+ inaddr.sin_addr = t;
+ }
+#else
+ memmove ((char *)&inaddr.sin_addr, (char *)hp->h_addr,
+ sizeof(inaddr.sin_addr));
+#endif /* CRAY and OLDTCP */
+ } else {
+#if defined(CRAY) && defined(OLDTCP)
+ /* Only Cray UNICOS3 and UNICOS4 will define this */
+ inaddr.sin_addr = hostinetaddr;
+#else
+ inaddr.sin_addr.s_addr = hostinetaddr;
+#endif /* CRAY and OLDTCP */
+ inaddr.sin_family = AF_INET;
+ }
+
+ addr = (struct sockaddr *) &inaddr;
+ addrlen = sizeof (struct sockaddr_in);
+ inaddr.sin_port = (iagent == 0) ? CSDPSPORT : iagent;
+ inaddr.sin_port = htons (inaddr.sin_port); /* may be funky macro */
+
+
+ /*
+ * Open the network connection.
+ */
+ do {
+ if ((fd = socket ((int) addr->sa_family, SOCK_STREAM, 0)) < 0) {
+ return -1;
+ }
+
+ /*
+ * turn off TCP coalescence
+ */
+#ifdef TCP_NODELAY
+ {
+ int tmp = 1;
+ setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *)&tmp, sizeof (int));
+ }
+#endif
+ if (gNXSndBufSize > 0)
+ len = setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char *) &gNXSndBufSize, sizeof(gNXSndBufSize));
+
+ /*
+ * connect to the socket; if there is no X server or if the backlog has
+ * been reached, then ECONNREFUSED will be returned.
+ */
+ if (connect (fd, addr, addrlen) < 0) {
+ int olderrno = errno;
+ (void) close (fd);
+ if (olderrno != ECONNREFUSED || retries <= 0) {
+ errno = olderrno;
+ return -1;
+ }
+ sleep (1);
+ } else {
+ break;
+ }
+ } while (retries-- > 0);
+
+
+ /*
+ * Success! So, save the auth information
+ */
+#ifdef CRAY
+#ifdef OLDTCP
+ len = sizeof(inaddr.sin_addr);
+#else
+ len = SIZEOF_in_addr;
+#endif /* OLDTCP */
+ cp = (char *) &inaddr.sin_addr;
+#else /* else not CRAY */
+ len = sizeof(inaddr.sin_addr.s_addr);
+ cp = (char *) &inaddr.sin_addr.s_addr;
+#endif /* CRAY */
+
+ /*
+ * We are special casing the BSD hack localhost address
+ * 127.0.0.1, since this address shouldn't be copied to
+ * other machines. So, we simply omit generating the auth info
+ * since we set it to the local machine before calling this routine!
+ */
+ if (!((len == 4) && (cp[0] == 127) && (cp[1] == 0) &&
+ (cp[2] == 0) && (cp[3] == 1))) {
+ *saddrp = Xmalloc (len);
+ if (*saddrp) {
+ *saddrlenp = len;
+ memmove (*saddrp, cp, len);
+ *familyp = FamilyInternet;
+ } else {
+ *saddrlenp = 0;
+ }
+ }
+
+ return fd;
+}
+#undef INVALID_INETADDR
+#endif /* TCPCONN */
+
+
+/*****************************************************************************
+ * *
+ * Connection Utility Routines *
+ * *
+ *****************************************************************************/
+
+/*
+ * Disconnect from server.
+ */
+
+int N_XDisconnectDisplay (int server)
+{
+ (void) close(server);
+ return 0;
+}
+
+
+#include <stddef.h>
+/*
+ * This is an OS dependent routine which:
+ * 1) returns as soon as the connection can be written on....
+ * 2) if the connection can be read, must enqueue events and handle errors,
+ * until the connection is writable.
+ */
+void N_XWaitForWritable(Display *dpy)
+{
+ unsigned long r_mask[MSKCNT];
+ unsigned long w_mask[MSKCNT];
+ int nfound;
+
+ CLEARBITS(r_mask);
+ CLEARBITS(w_mask);
+
+ while (1) {
+ BITSET(r_mask, dpy->fd);
+ BITSET(w_mask, dpy->fd);
+
+ do {
+ nfound = select (dpy->fd + 1, (SELECT_TYPE) r_mask,
+ (SELECT_TYPE) w_mask, (SELECT_TYPE) NULL,
+ (struct timeval *) NULL);
+ if (nfound < 0 && errno != EINTR)
+ _XIOError(dpy);
+ } while (nfound <= 0);
+
+ if (_XANYSET(r_mask)) {
+ char buf[BUFSIZE];
+ long pend_not_register;
+ register long pend;
+ register xEvent *ev;
+
+ /* find out how much data can be read */
+ if (BytesReadable(dpy->fd, (char *) &pend_not_register) < 0)
+ _XIOError(dpy);
+ pend = pend_not_register;
+
+ /* must read at least one xEvent; if none is pending, then
+ we'll just block waiting for it */
+ if (pend < SIZEOF(xEvent)) pend = SIZEOF(xEvent);
+
+ /* but we won't read more than the max buffer size */
+ if (pend > BUFSIZE) pend = BUFSIZE;
+
+ /* round down to an integral number of XReps */
+ pend = (pend / SIZEOF(xEvent)) * SIZEOF(xEvent);
+
+ N_XRead (dpy, buf, pend);
+
+ /* no space between comma and type or else macro will die */
+ STARTITERATE (ev,xEvent, buf, (pend > 0),
+ (pend -= SIZEOF(xEvent))) {
+ if (ev->u.u.type == X_Error)
+ _XError (dpy, (xError *) ev);
+ else /* it's an event packet; die */
+ DPSFatalProc((DPSContext)0, "N_XWaitForWritable read bogus X event");
+ }
+ ENDITERATE
+ }
+ if (_XANYSET(w_mask))
+ return;
+ }
+}
+
+
+void N_XWaitForReadable(Display *dpy)
+{
+ unsigned long r_mask[MSKCNT];
+ int result;
+
+ CLEARBITS(r_mask);
+ do {
+ BITSET(r_mask, dpy->fd);
+ result = select(dpy->fd + 1, (SELECT_TYPE) r_mask, (SELECT_TYPE) NULL,
+ (SELECT_TYPE) NULL, (struct timeval *) NULL);
+ if (result == -1 && errno != EINTR) _XIOError(dpy);
+ } while (result <= 0);
+}
+
+#ifdef XXX
+
+static int padlength[4] = {0, 3, 2, 1}; /* make sure auth is multiple of 4 */
+
+_XSendClientPrefix (
+ Display *dpy,
+ xConnClientPrefix *client, /* contains count for auth_* */
+ char *auth_proto, /* NOT null-terminated */
+ char char *auth_string) /* NOT null-terminated */
+{
+ int auth_length = client->nbytesAuthProto;
+ int auth_strlen = client->nbytesAuthString;
+ char padbuf[3]; /* for padding to 4x bytes */
+ int pad;
+ struct iovec iovarray[5], *iov = iovarray;
+ int niov = 0;
+
+#define add_to_iov(b,l) \
+ { iov->iov_base = (b); iov->iov_len = (l); iov++, niov++; }
+
+ add_to_iov ((caddr_t) client, SIZEOF(xConnClientPrefix));
+
+ /*
+ * write authorization protocol name and data
+ */
+ if (auth_length > 0) {
+ add_to_iov (auth_proto, auth_length);
+ pad = padlength [auth_length & 3];
+ if (pad) add_to_iov (padbuf, pad);
+ }
+ if (auth_strlen > 0) {
+ add_to_iov (auth_string, auth_strlen);
+ pad = padlength [auth_strlen & 3];
+ if (pad) add_to_iov (padbuf, pad);
+ }
+
+#undef add_to_iov
+
+ (void) WritevToServer (dpy->fd, iovarray, niov);
+ return;
+}
+
+#endif /* XXX */
diff --git a/nx-X11/lib/dps/csfindNX.c b/nx-X11/lib/dps/csfindNX.c
new file mode 100644
index 000000000..63b40acbc
--- /dev/null
+++ b/nx-X11/lib/dps/csfindNX.c
@@ -0,0 +1,657 @@
+/*
+ * csfindNX.c -- DPSCAP client Xlib extension hookup
+ *
+ * (c) Copyright 1992-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86: xc/lib/dps/csfindNX.c,v 1.7tsi Exp $ */
+
+#include <sys/param.h> /* for MAXHOSTNAMELEN */
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h> /* getuid() */
+#include <string.h>
+#include <pwd.h>
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xlibint.h>
+#include <X11/Xatom.h>
+#include <X11/Xresource.h>
+
+#include "csfindNX.h"
+#include "dpsNXprops.h"
+#include "Xlibnet.h"
+#include "DPS/dpsXclient.h"
+#include "DPS/dpsNXargs.h"
+#include <DPS/XDPSlib.h>
+
+#include "dpsassert.h"
+#include "cslibint.h"
+
+/* ---Defines--- */
+
+#define CANTSTARTAGENT "Unable to start agent.\n"
+
+/* ---Types--- */
+
+typedef struct {
+ Window id;
+ int willingness;
+} Agent, *AgentIdList;
+
+/* ---Globals--- */
+
+static char *XDPSLNXHost = NULL;
+static int XDPSLNXPort = 0; /* default port to be used */
+static int XDPSLNXTrans = XDPSNX_TRANS_UNIX;
+static int gXDPSNXLaunchedAgentTrans = XDPSNX_USE_BEST;
+static int gXDPSNXLaunchedAgentPort = XDPSNX_USE_BEST;
+static char *gXDPSNXExecObj = XDPSNX_DEFAULT_EXEC_NAME; /* NX object file */
+static char **gXDPSNXExecArgs = NULL; /* the args for gXDPSNXExecObj */
+static Bool gWasAgentSet = False;
+static Bool gXDPSNXAutoLaunch = False;
+unsigned char gXDPSNXErrorCode;
+extern int gNXSndBufSize; /* Output buffer size, zero means default */
+
+static char *getHomeDir(char *);
+
+/* ---Private Functions--- */
+
+static int
+TmpErrorHandler(
+ Display *dpy,
+ XErrorEvent *err)
+{
+ gXDPSNXErrorCode = err->error_code;
+ return 0;
+}
+
+
+static int
+GetProperty(
+ Display *dpy,
+ Window w,
+ Atom prop,
+ Atom type,
+ unsigned long *nitems, /* IN: if non-null then RETURN val */
+ char **data) /* RETURN */
+{
+ long largest_len = ((((unsigned long) -1) >> 1) / 4);
+ Atom actual_type;
+ int actual_format;
+ unsigned long actual_number;
+ unsigned long remaining;
+
+ if (type == None) return(!Success); /* We need to have a type */
+ if ((XGetWindowProperty(dpy, w, prop, 0, largest_len, False, type,
+ &actual_type, &actual_format, &actual_number,
+ &remaining, (unsigned char **) data) == Success)
+ && (actual_type == type)) {
+ if (nitems != NULL) *nitems = actual_number;
+ return(Success);
+ } else {
+ if (*nitems != 0) { /* if data returned, clean up */
+ XFree(*data);
+ *data = NULL; /* is this necessary? */
+ *nitems = 0;
+ }
+ return(!Success);
+ }
+}
+
+
+/*
+ GetAgentIdList returns a list of agents advertising on the passed display (dpy),
+ and it returns the number of agents in the list in the parameter nAgents.
+ The returned list is sorted in most to least willing order.
+ GetAgentIdList assumes that it has exclusive access to the server associated with
+ dpy (ie. it assumes that the caller has done an XGrabServer).
+ */
+static AgentIdList
+GetAgentIdList(
+ Display *dpy,
+ unsigned long *nAgents) /* RETURN: number of agents in list */
+{
+ Atom serverListAtom = XInternAtom(dpy, XDPSNX_BILLBOARD_PROP, True);
+ Window *agents = NULL;
+ AgentIdList agentList = NULL;
+ int (*oldErrorHandler)(Display *, XErrorEvent *) = 0; /* the current error handler */
+ unsigned long i, current;
+
+ if (serverListAtom == None) { /* Servers registered on dpy */
+ goto failed;
+ }
+
+ XSync(dpy, False); /* force processing of pending requests */
+
+ if (GetProperty(dpy, RootWindow(dpy, DefaultScreen(dpy)),
+ serverListAtom, XA_WINDOW, nAgents,
+ (char **) &agents) != Success) {
+ goto failed;
+ }
+
+ if ((agentList = (AgentIdList)
+ Xcalloc(*nAgents, (unsigned) sizeof(Agent))) == NULL)
+ goto failed;
+
+ /* let's go through the list and figure out which servers are okay */
+ oldErrorHandler = XSetErrorHandler(TmpErrorHandler);
+ current = 0;
+ for (i=0; i < *nAgents; i++) {
+ unsigned long len;
+ int *agentWillingness;
+ unsigned long k;
+
+ for (k=0; k < i; k++) /* Search for duplicate ids */
+ if (agents[i] == agents[k]) { /* uh oh... */
+ agents[i] = None;
+ break;
+ }
+ if (k == i) { /* No duplicate ids */
+ if (GetProperty(dpy, agents[i],
+ XInternAtom(dpy, XDPSNX_WILLINGNESS_PROP, True),
+ XA_INTEGER, &len, (char **) &agentWillingness)
+ != Success) {
+ /* Assume that Agent i is dead... */
+ /* reap the agent */
+ agents[i] = None;
+ gXDPSNXErrorCode = None;
+ } else {
+ unsigned long j = 0;
+
+ /* insert the agents into agentList in "most to least willing" order */
+ while ((j < current) && (agentList[j].willingness > *agentWillingness))
+ j++;
+ if (j < current)
+ (void) bcopy((char *) &agentList[j], (char *) &agentList[j+1],
+ sizeof(Agent) * (*nAgents - j - 1));
+ agents[current] = agents[i];
+ agentList[j].id = agents[current++];
+ agentList[j].willingness = *agentWillingness;
+ XFree(agentWillingness);
+ }
+ }
+ }
+ (void) XSetErrorHandler(oldErrorHandler);
+ oldErrorHandler = NULL;
+ if (*nAgents != current) { /* agent list changed */
+ if (current > 0) { /* are there living ones? */
+ *nAgents = current;
+ /* write the list back out onto the root window */
+ (void) XChangeProperty(dpy, RootWindow(dpy, DefaultScreen(dpy)),
+ serverListAtom, XA_WINDOW, 32,
+ PropModeReplace, (unsigned char *) agents, *nAgents);
+ } else {
+ (void) XDeleteProperty(dpy, RootWindow(dpy, DefaultScreen(dpy)),
+ serverListAtom);
+ goto failed;
+ }
+ }
+ (void) XFree(agents);
+ return(agentList);
+
+ failed:
+ if (agents != NULL) XFree(agents);
+ if (agentList != NULL) XFree(agentList);
+ if (oldErrorHandler != NULL) (void) XSetErrorHandler(oldErrorHandler);
+ *nAgents = 0;
+ return(NULL);
+}
+
+
+static int
+XDPSNXOnDisplay(
+ Display *dpy,
+ char *licenseMethod,
+ char **host,
+ int *transport,
+ int *port)
+{
+ unsigned long nAgents = 0;
+ AgentIdList agentList = NULL;
+ Bool match = False;
+ unsigned long i = 0;
+ int status = !Success;
+
+#ifdef DPSLNKL
+ extern unsigned ANXKFunc();
+#endif /* DPSLNKL */
+
+ (void) XGrabServer(dpy); /* Can we do this later? */
+ if ((agentList = GetAgentIdList(dpy, &nAgents)) == NULL)
+ goto cleanup;
+ /* NOTE: agentList was sorted most to least willing by GetAgentIdList */
+ if (agentList[i].willingness <= 0) { /* Is there a willing agent? */
+ DPSWarnProc(NULL, "Found agent(s) for display, but none willing to accept connections.\n");
+ goto cleanup;
+ }
+
+#ifdef DPSLNKL
+ /* Masterkey bypass code */
+ if (ANXKFunc() != 0) {
+ /* We have a willing agent and the client has masterkeys so... */
+ match = True;
+ } else /* Search for appropriate agent */
+#endif /* DPSLNKL */
+ {
+ /* need to get licensing info from dpy */
+ Atom desiredLicenseMethod, openLicenseMethod;
+ char openLicenseString[256];
+
+ (void) sprintf(openLicenseString, "%s:%d",
+ LICENSE_METHOD_OPEN,
+ OPEN_LICENSE_VERSION);
+ openLicenseMethod = XInternAtom(dpy, openLicenseString, True);
+
+ if (licenseMethod != NULL)
+ desiredLicenseMethod = XInternAtom(dpy, licenseMethod, True);
+ else
+ desiredLicenseMethod = None;
+
+ if ((desiredLicenseMethod != None) || (openLicenseMethod != None)) {
+ for (i=0;
+ (i < nAgents) && (agentList[i].willingness > 0) && (match == False);
+ i++) {
+ Atom *licenseMethods = NULL;
+ unsigned long nMethods;
+ unsigned long j;
+
+ if (GetProperty(dpy, agentList[i].id,
+ XInternAtom(dpy, XDPSNX_LICENSE_METHOD_PROP, True),
+ XA_ATOM,
+ &nMethods, (char **) &licenseMethods) != Success)
+ goto cleanup;
+
+ /*
+ Check to see if the agent supports either our desired license method or
+ if it is an open service.
+ */
+ j = 0;
+ while((j < nMethods)
+ && (licenseMethods[j] != desiredLicenseMethod)
+ && (licenseMethods[j] != openLicenseMethod)) j++;
+ if (j < nMethods) { /* We found one */
+ match = True;
+ break;
+ }
+ (void) XFree(licenseMethods);
+ }
+ }
+ }
+
+ if (match) { /* We had a match on license method */
+ TransportInfo *transInfo;
+
+ if (GetProperty(dpy, agentList[i].id,
+ XInternAtom(dpy, XDPSNX_TRANSPORT_INFO_PROP, True),
+ XA_INTEGER, NULL, (char **) &transInfo) != Success) {
+ goto cleanup;
+ } else { /* We got one! */
+ *transport = transInfo->transport;
+ *port = transInfo->port;
+ match = True;
+ XFree(transInfo);
+ }
+ if (GetProperty(dpy, agentList[i].id,
+ XInternAtom(dpy, XDPSNX_HOST_NAME_PROP, True), XA_STRING,
+ NULL, (char **) host) == Success) {
+ status = Success;
+ /*
+ * If transport is TCP, but we are on the same host as the agent then
+ * trade-up to the more efficient UNIX transport...
+ */
+ if (*transport == XDPSNX_TRANS_TCP) {
+ char hostname[MAXHOSTNAMELEN];
+ (void) N_XGetHostname(hostname, MAXHOSTNAMELEN);
+ if (strcmp(hostname, *host) == 0)
+ *transport = XDPSNX_TRANS_UNIX;
+ }
+ }
+ }
+ /*
+ * Exit Clauses: status inited to FAILURE. Therefore cleanup "assumes"
+ * a failure unless noted otherwise.
+ */
+ cleanup:
+ (void) XUngrabServer(dpy);
+ (void) XDPSLFlush(dpy); /* Flush the ungrab */
+ if (agentList != NULL) XFree(agentList);
+ return(status);
+}
+
+
+static int
+ParseAgentString(
+ char *string,
+ char **hostname, /* RETURN */
+ int *transport, /* RETURN */
+ int *port) /* RETURN */
+{
+ int dnet = 0;
+ Bool transportSpecified = False;
+ char namebuf[255];
+ char *p;
+
+ (void) strncpy(namebuf, string, strlen(string)+1);
+ p = &namebuf[0];
+ /*
+ * Step 1, find the hostname. This is delimited by a required colon.
+ */
+ for (; *p && *p != ':'; p++);
+ if (!*p) return(!Success); /* There must be a colon */
+
+ if (*(p+1) == ':') {
+ dnet++;
+ *(p++) = '\0';
+ }
+ *(p++) = '\0';
+
+ /*
+ * Step 2, get the port number. It follows the colon(s)
+ */
+ if (*p == '\0') /* No port number specified... */
+ return(!Success);
+
+ *port = atoi(p);
+
+ /*
+ * Step 3, transport?
+ */
+ if (namebuf[0] == '\0') { /* no transport/hostname specified... */
+ if (dnet)
+ (void) strcpy(namebuf, "0");
+ else { /* no hostname, so must be UNIX */
+ *hostname = NULL;
+ *transport = XDPSNX_TRANS_UNIX;
+ return(Success);
+ }
+ } else {
+ /* find the delimiting '/' */
+ for (p = &namebuf[0]; *p && *p != '/'; p++);
+ if (*p == '/') {
+ transportSpecified = True;
+ *p = '\0';
+ p++;
+ } else /* no transport specified */
+ p = &namebuf[0];
+ if ((*hostname = (char *) Xmalloc(strlen(p))) == NULL)
+ return(!Success); /* can't alloc space for hostname */
+ (void) strcpy(*hostname, p);
+
+ /* identify protocol */
+ if (dnet)
+ *transport = XDPSNX_TRANS_DECNET;
+ else if (transportSpecified) {
+ if (strcmp(namebuf, "unix") == 0)
+ *transport = XDPSNX_TRANS_UNIX;
+ else /* assume tcp */
+ *transport = XDPSNX_TRANS_TCP;
+ } else
+ *transport = XDPSNX_TRANS_TCP;
+ }
+ return(Success);
+}
+
+static int
+FindXDPSNXInXrmDatabase(
+ Display *dpy,
+ char **host,
+ int *transport,
+ int *port)
+{
+ XrmDatabase rDB = NULL; /* for merged database */
+ XrmDatabase serverDB;
+ char filenamebuf[1024];
+ char *filename = &filenamebuf[0];
+ char *env, *str_type;
+ char name[255];
+ XrmValue value;
+ int retVal = !Success;
+
+ XrmInitialize();
+ (void) strcpy(name, "/usr/lib/X11/app-defaults/");
+ (void) strcat(name, XDPSNX_X_CLASS_NAME);
+
+ /* try to get application defaults file, if there is any */
+ XrmMergeDatabases(XrmGetFileDatabase(name), &rDB);
+
+ /* try to merge the server defaults. if not defined then use .Xdefaults */
+ if (XResourceManagerString(dpy) != NULL) {
+ serverDB = XrmGetStringDatabase(XResourceManagerString(dpy));
+ } else { /* use the .Xdefaults */
+ (void) getHomeDir(filename);
+ (void) strcat(filename, "/.Xdefaults");
+
+ serverDB = XrmGetFileDatabase(filename);
+ }
+ XrmMergeDatabases(serverDB, &rDB);
+
+ /* try the XENVIRONMENT file, or if not defined, then .Xdefaults */
+ if ((env = getenv("XENVIRONMENT")) == NULL) {
+ int len;
+ env = getHomeDir(filename);
+ (void) strcat(filename, "/.Xdefaults-");
+ len = strlen(env);
+ (void) gethostname(env+len, 1024-len);
+ }
+ XrmMergeDatabases(XrmGetFileDatabase(env), &rDB);
+
+ /* Now that the database is built, try to extract the values we want. */
+
+ if (XrmGetResource(rDB, XDPSNX_X_RESOURCE, XDPSNX_X_CLASS_NAME, &str_type,
+ &value) == True) {
+ retVal = ParseAgentString((char *) value.addr, host, transport, port);
+ }
+ (void) XrmDestroyDatabase(rDB);
+ return(retVal);
+}
+
+
+static char *
+getHomeDir(char *dest)
+{
+ register char *ptr;
+
+ if ((ptr = getenv("HOME")) != NULL) {
+ (void) strcpy(dest, ptr);
+ } else {
+ struct passwd *pw;
+
+ if ((ptr = getenv("USER")) != NULL) {
+ pw = getpwnam(ptr);
+ } else {
+ pw = getpwuid(getuid());
+ }
+ if (pw) {
+ (void) strcpy(dest, pw->pw_dir);
+ } else {
+ *dest = ' ';
+ }
+ }
+ return (dest);
+}
+
+
+
+/* ---Public Functions--- */
+
+int gForceLaunchHack = 0; /* Undocumented way to force autolaunch */
+
+XDPSNXFindNXResult
+XDPSNXFindNX(
+ Display *dpy,
+ char *licenseMethod,
+ char **host,
+ int *transport,
+ int *port)
+{
+ char *agentenv;
+
+ if (gForceLaunchHack)
+ return(findnx_not_found);
+
+ if (gWasAgentSet) { /* check if client set up host */
+ *host = XDPSLNXHost;
+ *transport = XDPSLNXTrans;
+ *port = XDPSLNXPort;
+ return(findnx_found);
+ /* check DPSNXHOST environment variable */
+ } else if ((agentenv = getenv(AGENT_ENV_VAR)) != NULL) {
+ int status = ParseAgentString(agentenv, host, transport, port);
+ if (status != Success) {
+ DPSWarnProc((DPSContext) NULL, "Illegal syntax for DPSNXHOST");
+ return(findnx_error);
+ } else return(findnx_found);
+ /* check advertisements... */
+ } else if (XDPSNXOnDisplay(dpy, licenseMethod, host, transport, port) ==
+ Success) {
+ return(findnx_found);
+ /* check XrmDatabase */
+ } else if (FindXDPSNXInXrmDatabase(dpy, host, transport, port) == Success) {
+ return(findnx_found);
+ }
+ /* Nada */
+ return(findnx_not_found);
+}
+
+
+Status
+XDPSNXSetClientArg(int arg, void *value)
+{
+ Display *dpy;
+
+ if (arg == XDPSNX_AGENT) {
+ gWasAgentSet = True;
+ return(ParseAgentString(value,
+ &XDPSLNXHost, &XDPSLNXTrans, &XDPSLNXPort));
+ }
+ else if (arg == XDPSNX_EXEC_FILE) {
+ if ((gXDPSNXExecObj = Xmalloc(strlen((char *) value) + 1)) == NULL) {
+ return(!Success);
+ }
+ gXDPSNXExecObj = strcpy(gXDPSNXExecObj, (char *) value);
+ } else if (arg == XDPSNX_EXEC_ARGS) {
+ int i;
+ char **cpp, **execInfo;
+
+ execInfo = (char **) value;
+ for(cpp = execInfo, i = 1; *cpp != NULL; i++, cpp++); /* count */
+ gXDPSNXExecArgs = (char **) Xcalloc(i, sizeof(char *));
+ if (gXDPSNXExecArgs == NULL) return(!Success);
+ for(cpp = gXDPSNXExecArgs; *execInfo != NULL;
+ execInfo++, cpp++) {
+ /* copy each entry */
+ if ((*cpp = Xmalloc(strlen(*execInfo) + 1)) == NULL)
+ return(!Success);
+ *cpp = strcpy(*cpp, *execInfo);
+ }
+ } else if (arg == XDPSNX_AUTO_LAUNCH) {
+ gXDPSNXAutoLaunch = (Bool)(long) value;
+ } else if (arg == XDPSNX_LAUNCHED_AGENT_TRANS) {
+ gXDPSNXLaunchedAgentTrans = (long) value;
+ } else if (arg == XDPSNX_LAUNCHED_AGENT_PORT) {
+ gXDPSNXLaunchedAgentPort = (long) value;
+ } else if (arg == XDPSNX_REQUEST_XSYNC) {
+ dpy = (Display *) value;
+ if (dpy == (Display *)NULL)
+ return(Success);
+ XDPSLSetSyncMask(dpy, DPSCAP_SYNCMASK_SYNC);
+ } else if (arg == XDPSNX_REQUEST_RECONCILE) {
+ dpy = (Display *) value;
+ if (dpy == (Display *)NULL)
+ return(Success);
+ XDPSLSetSyncMask(dpy, DPSCAP_SYNCMASK_RECONCILE);
+ } else if (arg == XDPSNX_REQUEST_BUFFER) {
+ dpy = (Display *) value;
+ if (dpy == (Display *)NULL)
+ return(Success);
+ XDPSLSetSyncMask(dpy, DPSCAP_SYNCMASK_BUFFER);
+ } else if (arg == XDPSNX_GC_UPDATES_SLOW) {
+ dpy = (Display *) value;
+ if (dpy == (Display *)NULL)
+ return(Success);
+ XDPSLSetGCFlushMode(dpy, XDPSNX_GC_UPDATES_SLOW);
+ } else if (arg == XDPSNX_GC_UPDATES_FAST) {
+ dpy = (Display *) value;
+ if (dpy == (Display *)NULL)
+ return(Success);
+ XDPSLSetGCFlushMode(dpy, XDPSNX_GC_UPDATES_FAST);
+ } else if (arg == XDPSNX_SEND_BUF_SIZE) {
+ int i = (long)value;
+ if (i >= 4096 && i <= 65536) gNXSndBufSize = i;
+ }
+ return(Success);
+}
+
+
+void
+XDPSGetNXArg(int arg, void **value)
+{
+ static char agentBuffer[255];
+
+ if (arg == XDPSNX_AGENT) {
+ switch(XDPSLNXTrans) {
+ case XDPSNX_TRANS_UNIX:
+ (void) sprintf(agentBuffer, "unix/");
+ break;
+ case XDPSNX_TRANS_TCP:
+ (void) sprintf(agentBuffer, "tcp/");
+ break;
+ case XDPSNX_TRANS_DECNET:
+ (void) sprintf(agentBuffer, "decnet/");
+ break;
+ default:
+ DPSWarnProc(NULL, "Unknown transport passed to XDPSGetNXArg ignored.\n");
+ agentBuffer[0] = '\0';
+ break;
+ }
+ (void) strcat(agentBuffer, XDPSLNXHost);
+ (void) strcat(agentBuffer,
+ (XDPSLNXTrans == XDPSNX_TRANS_DECNET ? "::" : ":"));
+ (void) sprintf(&agentBuffer[strlen(agentBuffer)], "%d", XDPSLNXPort);
+ *value = (void *) agentBuffer;
+ }
+ else if (arg == XDPSNX_EXEC_FILE) {
+ *value = (void *) gXDPSNXExecObj;
+ } else if (arg == XDPSNX_EXEC_ARGS) {
+ *value = (void *) gXDPSNXExecArgs;
+ } else if (arg == XDPSNX_AUTO_LAUNCH) {
+ *value = (void *) (long)gXDPSNXAutoLaunch;
+ } else if (arg == XDPSNX_LAUNCHED_AGENT_TRANS) {
+ *value = (void *) (long)gXDPSNXLaunchedAgentTrans;
+ } else if (arg == XDPSNX_LAUNCHED_AGENT_PORT) {
+ *value = (void *) (long)gXDPSNXLaunchedAgentPort;
+ }
+}
diff --git a/nx-X11/lib/dps/csfindNX.h b/nx-X11/lib/dps/csfindNX.h
new file mode 100644
index 000000000..f5bf3bdc9
--- /dev/null
+++ b/nx-X11/lib/dps/csfindNX.h
@@ -0,0 +1,93 @@
+/*
+ * csfindNX.h
+ *
+ * (c) Copyright 1992-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef CSFINDNX_H
+#define CSFINDNX_H
+
+
+/* ---DEFINES--- */
+
+#define XDPSNX_DEFAULT_EXEC_NAME "dpsnx.agent"
+
+/* ---TYPES--- */
+
+typedef enum {
+ findnx_found,
+ findnx_not_found,
+ findnx_error
+} XDPSNXFindNXResult;
+
+
+/* ---Functions--- */
+
+extern XDPSNXFindNXResult
+XDPSNXFindNX (
+ Display *dpy, /* Display client wants to attach to */
+ char *licenseMethod, /* license method client speaks */
+ char **host, /* RETURN: Agent host name */
+ int *transport, /* RETURN: Agent transport */
+ int *port); /* RETURN: Agent's port */
+ /*
+ * Find an agent for this client that will service display dpy.
+ * The licenseMethod arg. specifies the type of licensing that the client
+ * is capable of speaking. A (char *) NULL, means that it can handle
+ * any type (i.e. master key in lock & key).
+ * Return values indicates success in finding an agent.
+ * Success: host, transport, and port indicate where the agent is.
+ * !Success: the values of host, transport, and port are undefined.
+ * The client of the call is responsible for freeing the space (XFree())
+ * allocated for the host name string.
+ */
+
+
+extern void
+XDPSGetNXArg (
+ int arg, /* Argument to be retrieved */
+ void **value); /* value of the argument */
+ /*
+ Gets the value of the given argument. Returns the value in val. If the
+ value will fit in val (ie, a Bool) then the value is placed there,
+ otherwise a pointer to the value is placed there. It is assumed that
+ the caller will know the correct type. The types of arguments are
+ detailed with the argument definitions in dpsNXargs.h.
+ NOTE: the caller should NOT modify any values returned via pointer.
+ XDPSGetNXArg does not copy the data, rather it returns a pointer to the
+ internally held structure.
+ */
+
+#endif /* CSFINDNX_H */
diff --git a/nx-X11/lib/dps/cslibext.c b/nx-X11/lib/dps/cslibext.c
new file mode 100644
index 000000000..831f0ad65
--- /dev/null
+++ b/nx-X11/lib/dps/cslibext.c
@@ -0,0 +1,762 @@
+/*
+ * cslibext.c -- DPSCAP client Xlib extension hookup
+ *
+ * (c) Copyright 1991-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86: xc/lib/dps/cslibext.c,v 1.4tsi Exp $ */
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <sys/param.h> /* for MAXHOSTNAMELEN */
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xlibint.h>
+#include "cslibint.h"
+#include <DPS/XDPS.h>
+#include <DPS/XDPSproto.h>
+#include <DPS/dpsXclient.h>
+#include <DPS/dpsNXargs.h>
+#include "DPSCAPClient.h"
+#include "dpsassert.h"
+#include <DPS/XDPSlib.h>
+
+#include "publictypes.h"
+#include "dpsXpriv.h"
+
+/* === DEFINES === */
+
+#define DPSNXSYNCGCMODE_FLUSH 0
+#define DPSNXSYNCGCMODE_SYNC 1
+#define DPSNXSYNCGCMODE_DELAYED 2
+#define DPSNXSYNCGCMODE_DEFAULT DPSNXSYNCGCMODE_DELAYED
+
+/* === GLOBALS === */
+
+DPSCAPGlobals gCSDPS = NULL;
+
+#ifdef DPSLNKL
+#define ANXCYAN
+#define ANXMAGENTA
+#define ANXYELLOW
+#define ANXBLACK
+#define ANXSPOT
+#include "dpslnkl.inc"
+#endif /* DPSLNKL */
+
+int gNXSyncGCMode = DPSNXSYNCGCMODE_DEFAULT;
+
+/* === PUBLIC PROCS === */
+
+#ifdef MAHALO
+static int
+DPSCAPFlushAfterProc(Display *agent)
+{
+ LockDisplay(agent);
+ N_XFlush(agent);
+ UnlockDisplay(agent);
+}
+#endif
+
+int
+CSDPSInit(
+ Display *dpy,
+ int *numberType, /* RETURN */
+ char **floatingName) /* RETURN */
+{
+ register Display *agent;
+ register xCAPConnReplyPrefix *p;
+ register char *c;
+ DPSCAPData my;
+ xCAPConnSetupReq setup;
+ union {
+ xCAPConnSuccess good;
+ xCAPConnFailed bad;
+ } reply;
+ XExtData *extData;
+ XExtCodes *codes;
+ int indian;
+ int rest;
+ Window clientWindow;
+ char fullDisplayName[MAXHOSTNAMELEN+10];
+
+ if (gCSDPS == NULL)
+ DPSCAPStartUp();
+
+ /* To fix dps-nx #68, Motif too slow on HP */
+ if ((c = getenv("DPSNXGCMODE")) != 0)
+ {
+ gNXSyncGCMode = atoi(c);
+ if (gNXSyncGCMode < DPSNXSYNCGCMODE_FLUSH
+ || gNXSyncGCMode > DPSNXSYNCGCMODE_DELAYED)
+ gNXSyncGCMode = DPSNXSYNCGCMODE_DEFAULT;
+ }
+
+ /* We may have already called this routine via XDPSExtensionPresent,
+ so don't do it again! */
+
+ if ((codes = XDPSLGetCodes(dpy))
+ && (agent = XDPSLGetShunt(dpy))
+ && agent != dpy
+ && codes->major_opcode == DPSXOPCODEBASE)
+ return(DPSCAPSUCCESS);
+
+ /* Try to create a window for ClientMessage communication */
+
+ clientWindow = XCreateSimpleWindow(
+ dpy,
+ DefaultRootWindow(dpy),
+ 0, 0,
+ 1, 1,
+ 0,
+ BlackPixel(dpy, DefaultScreen(dpy)),
+ WhitePixel(dpy, DefaultScreen(dpy)));
+ if (clientWindow == None)
+ return(DPSCAPFAILED);
+
+ /* Try to open a connection to an agent */
+
+ if ((extData = DPSCAPOpenAgent(dpy, fullDisplayName)) == NULL)
+ {
+ XDestroyWindow(dpy, clientWindow);
+ return(DPSCAPFAILED);
+ }
+
+ /* DPSCAPOpenAgent only partially fills in extData, so finish it */
+
+ codes = XAddExtension(dpy);
+ codes->major_opcode = DPSXOPCODEBASE;
+ codes->first_event = 0; /* REQUIRED */
+ codes->first_error = FirstExtensionError;
+ extData->number = codes->extension;
+ extData->free_private = DPSCAPDestroy;
+ my = (DPSCAPData) extData->private_data;
+ my->codes = codes;
+ agent = my->agent;
+ /* +++ Is this all we have to do here? */
+
+ /* Send opening handshake */
+
+ indian = 1;
+ if (*(char *) &indian)
+ setup.byteorder = 'l';
+ else
+ setup.byteorder = 'B';
+ setup.dpscapVersion = DPSCAPPROTOVERSION;
+ setup.flags = DPSCAPNONEFLAG;
+ setup.libraryversion = DPSPROTOCOLVERSION;
+ setup.authProtoNameLength = 0;
+ setup.authProtoDataLength = 0;
+ setup.displayStringLength = strlen(fullDisplayName);
+ setup.nodeStringLength = 0;
+ setup.transportStringLength = 0;
+ setup.display = 0;
+ setup.screen = 0;
+ setup.reserved = 0;
+ setup.clientWindow = clientWindow;
+
+#ifndef DPSLNKL
+ DPSCAPWrite(agent, (char *)&setup, sizeof(xCAPConnSetupReq), dpscap_nopad,dpscap_insert);
+ DPSCAPWrite(agent, fullDisplayName, setup.displayStringLength, dpscap_pad, dpscap_append);
+ N_XFlush(agent);
+#else /* DPSLNKL */
+ if (CSDPSConfirmDisplay(agent, dpy, &setup, &reply, fullDisplayName) == 1)
+ {
+ p = (xCAPConnReplyPrefix *)&reply.good;
+ goto skip_read;
+ }
+ /* Read normal reply */
+#endif /* DPSLNKL */
+
+ /* Read common reply prefix */
+
+ p = (xCAPConnReplyPrefix *)&reply.good;
+ N_XRead(agent, (char *)p, (long)sizeof(xCAPConnReplyPrefix));
+#ifdef DPSLNKL
+skip_read:
+#endif
+ if (!p->success)
+ {
+ char mbuf[512];
+ /* read the rest */
+ c = (char *)&reply.bad.serverVersion;
+ N_XRead(agent, c, sz_xCAPConnFailed - sz_xCAPConnReplyPrefix);
+ sprintf(mbuf, "DPS NX: connection to \"%s\" refused by agent.", DisplayString(agent));
+ DPSWarnProc(NULL, mbuf);
+ c = (char *)Xmalloc(reply.bad.reasonLength);
+ if (!c) return(DPSCAPFAILED);
+ N_XReadPad(agent, c, (long)reply.bad.reasonLength);
+ if (!reply.bad.reasonLength)
+ sprintf(mbuf, "DPS NX: (no reason given)\n");
+ else
+ {
+ strcpy(mbuf, "DPS NX: ");
+ strncat(mbuf, c, reply.bad.reasonLength);
+ mbuf[reply.bad.reasonLength+7] = '\0';
+ }
+ DPSWarnProc(NULL, mbuf);
+ Xfree(c);
+ DPSCAPDestroy(extData);
+ Xfree(extData);
+ XDestroyWindow(dpy, clientWindow);
+ return(DPSCAPFAILED);
+ }
+
+ /* read the rest of the fixed length reply */
+ c = (char *)&reply.good.serverVersion;
+ rest = sizeof(xCAPConnSuccess) - sizeof(xCAPConnReplyPrefix);
+ N_XRead(agent, c, rest);
+
+ /* verify */
+
+ if (reply.good.serverVersion < DPSPROTOCOLVERSION)
+ {
+ /* Fine, we downgrade the client */
+ char qbuf[256];
+ sprintf(qbuf, "NX: server version %ld older than expected %d, client will downgrade", (long)reply.good.serverVersion, DPSPROTOCOLVERSION);
+ DPSWarnProc(NULL, qbuf);
+ }
+ my->dpscapVersion = reply.good.dpscapVersion;
+ if (my->dpscapVersion < DPSCAPPROTOVERSION)
+ {
+ /* Fine, we downgrade the client */
+ char kbuf[256];
+ sprintf(kbuf, "NX: agent version %d older than expected %d, client will downgrade", my->dpscapVersion, DPSCAPPROTOVERSION);
+ DPSWarnProc(NULL, kbuf);
+#ifdef XXX
+ /* Saving this code as a reminder about what needs to be
+ cleaned up if we exit here */
+ DPSCAPDestroy(extData);
+ Xfree(extData);
+ XDestroyWindow(clientWindow);
+ return(DPSCAPFAILED);
+#endif
+ }
+
+ if (numberType)
+ *numberType = reply.good.preferredNumberFormat;
+
+ /* read additional data */
+
+ c = (char *)Xmalloc(reply.good.floatingNameLength + 1);
+ N_XReadPad(agent, c, reply.good.floatingNameLength);
+ c[reply.good.floatingNameLength] = 0;
+ if (floatingName)
+ *floatingName = c;
+ else
+ Xfree(c);
+
+ /* set library extension data */
+
+ XDPSLSetVersion(agent, reply.good.serverVersion);
+ XDPSLSetVersion(dpy, reply.good.serverVersion);
+ XDPSLSetShunt(dpy, agent);
+ XDPSLSetCodes(dpy, codes);
+ if (XDPSLGetSyncMask(dpy) == DPSCAP_SYNCMASK_NONE)
+ XDPSLSetSyncMask(dpy, DPSCAP_SYNCMASK_DFLT);
+ my->agentWindow = reply.good.agentWindow;
+ XDPSLSetGCFlushMode(dpy, XDPSNX_GC_UPDATES_SLOW); /* default */
+
+ /* Hook my extension data on the dpy */
+
+ my->extData = extData;
+ XAddToExtensionList(CSDPSHeadOfDpyExt(dpy), extData);
+ (void) XESetCloseDisplay(dpy, codes->extension, DPSCAPCloseDisplayProc);
+ (void) XESetCopyGC(dpy, codes->extension, DPSCAPCopyGCProc);
+ (void) XESetFreeGC(dpy, codes->extension, DPSCAPFreeGCProc);
+ (void) XESetFlushGC(dpy, codes->extension, DPSCAPFlushGCProc);
+ XDPSLSetClientMessageHandler(dpy);
+
+ /* Chain my data on global list */
+
+ my->next = gCSDPS->head;
+ gCSDPS->head = my;
+
+#ifdef MAHALO
+ /* Set function that is called after every Xlib protocol proc */
+ XDPSLSetAfterProc(dpy);
+
+ /* All CSDPS protocol is auto-flushed */
+ (void) XSetAfterFunction(agent, DPSCAPFlushAfterProc);
+#endif /* MAHALO */
+
+ /* set agent arguments, if needed */
+ /* must follow setting of ShuntMap at least, so safest to
+ do here when everything has been setup */
+ XDPSLUpdateAgentArgs(dpy);
+
+ return(DPSCAPSUCCESS);
+}
+
+
+XExtData **
+CSDPSHeadOfDpyExt(
+ Display *dpy)
+{
+ XEDataObject object;
+
+ object.display = dpy;
+ return(XEHeadOfExtensionList(object));
+}
+
+void
+XDPSSyncGCClip(
+ register Display *dpy,
+ register GC gc)
+{
+ /* The primary utility of this function is for DPS NX correctness,
+ but it also helps DPS/X do less work in tracking GC changes. */
+ XDPSLSyncGCClip(dpy, gc);
+}
+
+void
+XDPSReconcileRequests(
+ register DPSContext ctxt)
+{
+ Display *dpy;
+ register ContextXID cxid;
+ register DPSContext curCtxt;
+
+ for (curCtxt = ctxt; curCtxt; curCtxt = curCtxt->chainChild)
+ {
+ cxid = XDPSXIDFromContext(&dpy, curCtxt);
+ if (dpy == (Display *)NULL || cxid == None)
+ break; /* Skip text contexts */
+ XDPSLReconcileRequests(dpy, cxid);
+ }
+}
+
+Status
+XDPSNXSetAgentArg(
+ Display *dpy,
+ int arg, int val)
+{
+ if (!dpy || arg >= 0 || arg < AGENTLASTARG)
+ return(!Success);
+ else
+ return(XDPSLSetAgentArg(dpy, arg, val));
+}
+
+/* New for DPS NX 2.0 */
+void
+XDPSFlushGC(
+ Display *dpy,
+ GC gc)
+{
+ if (dpy && gc)
+ XDPSLFlushGC(dpy, gc);
+}
+
+/* === SUPPORT PROCS === */
+
+void
+DPSCAPChangeGC(
+ register Display *agent,
+ GC gc,
+ unsigned long valuemask,
+ XGCValues *values)
+{
+ register xChangeGCReq *req;
+ unsigned long oldDirty = gc->dirty;
+
+ /* ASSERT: called from within LockDisplay section */
+
+ /* Always include the clip_mask */
+ valuemask |= GCClipMask;
+ /* +++ HACK! Hide the gc->rects flag in arc_mode */
+ valuemask |= GCArcMode;
+ valuemask &= (1L << (GCLastBit + 1)) - 1;
+
+ /* Stupid macro insists on Display being called 'dpy' */
+ {
+ Display *dpy = agent;
+ Display *xdpy = (Display *)NULL;
+ NXMacroGetReq(ChangeGC, req);
+ }
+ req->gc = XGContextFromGC(gc);
+ gc->dirty = req->mask = valuemask;
+ {
+/* Derived from MIT XCrGC.c, _XGenerateGCList:
+Copyright 1985, 1986, 1987, 1988, 1989 by the
+Massachusetts Institute of Technology
+
+Permission to use, copy, modify, distribute, and sell this software and its
+documentation for any purpose is hereby granted without fee, provided that
+the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation, and that the name of M.I.T. not be used in advertising or
+publicity pertaining to distribution of the software without specific,
+written prior permission. M.I.T. makes no representations about the
+suitability of this software for any purpose. It is provided "as is"
+without express or implied warranty.
+*/
+ /* Warning! This code assumes that "unsigned int" is 32-bits wide */
+
+ unsigned int vals[32];
+ register unsigned int *value = vals;
+ long nvalues;
+ register XGCValues *gv = values;
+ register unsigned long dirty = gc->dirty;
+
+ /*
+ * Note: The order of these tests are critical; the order must be the
+ * same as the GC mask bits in the word.
+ */
+ if (dirty & GCFunction) *value++ = gv->function;
+ if (dirty & GCPlaneMask) *value++ = gv->plane_mask;
+ if (dirty & GCForeground) *value++ = gv->foreground;
+ if (dirty & GCBackground) *value++ = gv->background;
+ if (dirty & GCLineWidth) *value++ = gv->line_width;
+ if (dirty & GCLineStyle) *value++ = gv->line_style;
+ if (dirty & GCCapStyle) *value++ = gv->cap_style;
+ if (dirty & GCJoinStyle) *value++ = gv->join_style;
+ if (dirty & GCFillStyle) *value++ = gv->fill_style;
+ if (dirty & GCFillRule) *value++ = gv->fill_rule;
+ if (dirty & GCTile) *value++ = gv->tile;
+ if (dirty & GCStipple) *value++ = gv->stipple;
+ if (dirty & GCTileStipXOrigin) *value++ = gv->ts_x_origin;
+ if (dirty & GCTileStipYOrigin) *value++ = gv->ts_y_origin;
+ if (dirty & GCFont) *value++ = gv->font;
+ if (dirty & GCSubwindowMode) *value++ = gv->subwindow_mode;
+ if (dirty & GCGraphicsExposures) *value++ = gv->graphics_exposures;
+ if (dirty & GCClipXOrigin) *value++ = gv->clip_x_origin;
+ if (dirty & GCClipYOrigin) *value++ = gv->clip_y_origin;
+ if (dirty & GCClipMask) *value++ = gv->clip_mask;
+ if (dirty & GCDashOffset) *value++ = gv->dash_offset;
+ if (dirty & GCDashList) *value++ = gv->dashes;
+ /* +++ HACK! Hide gc->rects flag in GCArcMode */
+ if (dirty & GCArcMode) *value++ = gc->rects;
+
+ req->length += (nvalues = value - vals);
+
+ /*
+ * note: Data is a macro that uses its arguments multiple
+ * times, so "nvalues" is changed in a separate assignment
+ * statement
+ */
+
+ nvalues <<= 2;
+ Data32 (agent, (long *) vals, nvalues);
+ }
+
+ gc->dirty = oldDirty;
+
+ /* ASSERT: SyncHandle called by caller */
+}
+
+
+DPSCAPData
+DPSCAPCreate(
+ Display *dpy, Display *agent)
+{
+ register DPSCAPData my = (DPSCAPData)Xcalloc(1, sizeof(DPSCAPDataRec));
+
+ if (my == (DPSCAPData)NULL) return(NULL);
+ my->dpy = dpy;
+ my->agent = agent;
+ my->typePSOutput = XInternAtom(
+ dpy,
+ DPSCAP_TYPE_PSOUTPUT,
+ False);
+ my->typePSOutputWithLen = XInternAtom(
+ dpy,
+ DPSCAP_TYPE_PSOUTPUT_LEN,
+ False);
+ my->typePSStatus = XInternAtom(
+ dpy,
+ DPSCAP_TYPE_PSSTATUS,
+ False);
+ my->typeNoop = XInternAtom(
+ dpy,
+ DPSCAP_TYPE_NOOP,
+ False);
+ my->typeSync = XInternAtom(
+ dpy,
+ DPSCAP_TYPE_SYNC,
+ False);
+ my->typeXError = XInternAtom(
+ dpy,
+ DPSCAP_TYPE_XERROR,
+ False);
+ my->typePSReady = XInternAtom(
+ dpy,
+ DPSCAP_TYPE_PSREADY,
+ False);
+ my->typeResume = XInternAtom(
+ dpy,
+ DPSCAP_TYPE_RESUME,
+ False);
+ return(my);
+}
+
+int
+DPSCAPDestroy(
+ XExtData *extData)
+{
+ register DPSCAPData my = (DPSCAPData) extData->private_data;
+ register DPSCAPData n;
+
+ if (my == (DPSCAPData)NULL) return(0);
+ DPSCAPCloseAgent(my->agent);
+ my->agent = NULL;
+ /* my->extData->private_data = NIL; ???? +++ */
+ if (my == gCSDPS->head)
+ gCSDPS->head = my->next;
+ else for (n = gCSDPS->head; n != NULL; n = n->next)
+ if (n->next == my)
+ {
+ n->next = my->next;
+ break;
+ }
+ Xfree(my);
+ /* extData freed by caller (e.g., _XFreeExtData) */
+ return(0);
+}
+
+void
+DPSCAPStartUp(void)
+{
+ gCSDPS = (DPSCAPGlobals)Xcalloc(1, sizeof(DPSCAPGlobalsRec));
+}
+
+
+static unsigned char padAdd[] = {0, 3, 2, 1};
+
+void
+DPSCAPWrite(
+ Display *agent,
+ char *buf,
+ unsigned len,
+ DPSCAPIOFlags writePad,
+ DPSCAPIOFlags bufMode)
+{
+ int pad = padAdd[len & 3];
+ unsigned fullLen = (writePad == dpscap_pad) ? len + pad : len;
+
+ if (agent->bufptr + fullLen > agent->bufmax)
+ N_XFlush(agent);
+ if (agent->max_request_size && fullLen > agent->max_request_size)
+ {
+ DPSWarnProc(NULL, "DPS Client Library: request length exceeds max request size. Truncated.\n");
+ len = agent->max_request_size;
+ pad = 0;
+ }
+ if (bufMode == dpscap_insert)
+ {
+ agent->last_req = agent->bufptr;
+ agent->request++;
+ }
+ bcopy(buf, agent->bufptr, len);
+ agent->bufptr += len;
+ if (writePad == dpscap_pad && pad)
+ {
+ bcopy((char *) padAdd, agent->bufptr, pad);
+ agent->bufptr += pad;
+ }
+}
+
+
+/* === EXT CALLBACK HOOKS === */
+
+int
+DPSCAPCloseDisplayProc(
+ Display *dpy,
+ XExtCodes *codes)
+{
+#ifdef CSDPS
+ fprintf(stderr, "NX: Closing agent \"%s\"\n", dpy->display_name);
+#endif
+
+ /* Although it seems that we should free codes here, we can't
+ because Xlib owns the storage */
+
+ XDPSLSetShunt(dpy, (Display *) NULL);
+ XDPSLSetCodes(dpy, (XExtCodes *) NULL);
+ XDPSLSetSyncMask(dpy, DPSCAP_SYNCMASK_NONE);
+ XDPSLCleanAll(dpy);
+ XDPSPrivZapDpy(dpy);
+ return(0);
+}
+
+
+int
+DPSCAPCopyGCProc(
+ Display *dpy,
+ GC gc,
+ XExtCodes *codes)
+{
+ XGCValues values;
+ DPSCAPData my;
+ XExtData *extData = XFindOnExtensionList(
+ CSDPSHeadOfDpyExt(dpy),
+ codes->extension);
+
+ if (extData)
+ my = (DPSCAPData) extData->private_data;
+ else
+ return(0);
+
+ /* We change the GC unconditionally, since friggin' XCopyGC
+ clears the dirty bits of the values that are copied! */
+
+ DPSAssertWarn(XGetGCValues(dpy, gc, DPSGCBITS & ~(GCClipMask), &values),
+ NULL, "DPS NX: XGetGCValues returned False\n");
+ values.clip_mask = gc->values.clip_mask;
+ DPSCAPChangeGC(my->agent, gc, DPSGCBITS, &values);
+ /* We have to make sure that the agent completely processes
+ the change to the GC. If we allow the agent to update the
+ GC in its own sweet time, the stupid client may delete the
+ GC after the agent has already queued a request to, e.g.,
+ copy the GC, but before the request is flushed. */
+ XDPSLSync(dpy);
+ return(1);
+}
+
+int
+DPSCAPFreeGCProc(
+ Display *pdpy,
+ GC gc,
+ XExtCodes *codes)
+{
+ register xCAPNotifyReq *req;
+ DPSCAPData my;
+ Display *dpy = pdpy; /* Stupid macros insists on Display being 'dpy' */
+ XExtData *extData = XFindOnExtensionList(
+ CSDPSHeadOfDpyExt(dpy),
+ codes->extension);
+
+ if (extData)
+ my = (DPSCAPData) extData->private_data;
+ else
+ return(0);
+
+ /* Notify the agent that the client deleted a GC. Let the
+ agent figure out if it cares. */
+
+ /* ASSERT: called from within LockDisplay section */
+
+ dpy = my->agent;
+ if (dpy == (Display *)NULL || dpy == pdpy)
+ return(0);
+
+ /* May need to sync changes to GC */
+ if (gNXSyncGCMode == DPSNXSYNCGCMODE_DELAYED)
+ XDPSLSync(pdpy);
+
+ {
+ Display *xdpy = pdpy; /* pdpy is X server */
+ NXMacroGetReq(CAPNotify, req);
+ }
+ req->reqType = DPSCAPOPCODEBASE;
+ req->type = X_CAPNotify;
+ req->cxid = 0;
+ req->notification = DPSCAPNOTE_FREEGC;
+ req->data = XGContextFromGC(gc);
+ req->extra = 0;
+ /* Guarantee that everyone sees GC go away */
+ XSync(pdpy, False); /* pdpy is X server */
+ if (gNXSyncGCMode == DPSNXSYNCGCMODE_FLUSH)
+ {
+ LockDisplay(dpy); /* dpy means agent here */
+ N_XFlush(dpy);
+ UnlockDisplay(dpy);
+ }
+ else
+ XDPSLSync(pdpy);
+
+ /* ASSERT: SynchHandle called by caller */
+ return(1);
+}
+
+#ifdef CSDPSDEBUG
+static unsigned int gcCountFlushedClean = 0;
+static unsigned int gcCountFlushedDirty = 0;
+#endif /* CSDPSDEBUG */
+
+int
+DPSCAPFlushGCProc(
+ Display *dpy,
+ GC gc,
+ XExtCodes *codes)
+{
+ XGCValues values;
+ DPSCAPData my;
+ XExtData *extData;
+#ifdef CSDPSDEBUG
+ unsigned long int dirty;
+#endif /* CSDPSDEBUG */
+
+ /* When GC is created, it is flushed with no dirty bits set,
+ so we have to notice that situation. */
+
+ if (gc->dirty)
+ {
+ if (XDPSLGetGCFlushMode(dpy) == XDPSNX_GC_UPDATES_FAST
+ || !(gc->dirty & DPSGCBITS))
+ return(0);
+ }
+ extData = XFindOnExtensionList(CSDPSHeadOfDpyExt(dpy), codes->extension);
+ if (extData)
+ my = (DPSCAPData) extData->private_data;
+ else
+ return(0);
+ /* HERE IF (gc->dirty & DPSGCBITS || !gc->dirty) */
+#ifdef CSDPSDEBUG
+ dirty = gc->dirty;
+#endif /* CSDPSDEBUG */
+ DPSAssertWarn(XGetGCValues(dpy, gc, DPSGCBITS & ~(GCClipMask), &values),
+ NULL, "NX: XGetGCValues returned False\n");
+ values.clip_mask = gc->values.clip_mask;
+ /* Must guarantee that gc change is registered by X server
+ before notification is sent to agent. */
+ XSync(dpy, False);
+ DPSCAPChangeGC(my->agent, gc, DPSGCBITS, &values);
+ /* We have to make sure that the agent completely processes
+ the change to the GC. If we allow the agent to update the
+ GC in its own sweet time, the stupid client may delete the
+ GC after the agent has already queued a request to, e.g.,
+ copy the GC, but before the request is flushed. */
+ if (gNXSyncGCMode == DPSNXSYNCGCMODE_SYNC)
+ XDPSLSync(dpy);
+ else
+ XDPSLFlush(dpy);
+#ifdef CSDPSDEBUG
+ if (dirty)
+ ++gcCountFlushedDirty;
+ else
+ ++gcCountFlushedClean;
+#endif /* CSDPSDEBUG */
+ return(1);
+}
diff --git a/nx-X11/lib/dps/cslibint.c b/nx-X11/lib/dps/cslibint.c
new file mode 100644
index 000000000..84d7b753e
--- /dev/null
+++ b/nx-X11/lib/dps/cslibint.c
@@ -0,0 +1,1910 @@
+/*
+ * cslibint.c -- low level I/O
+ *
+ * (c) Copyright 1993-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Portions Copyright 1985, 1986, 1987 Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * Author: Adobe Systems Incorporated and MIT X Consortium
+ */
+/* $XFree86: xc/lib/dps/cslibint.c,v 1.4tsi Exp $ */
+
+/*
+ * XlibInternal.c - Internal support routines for the C subroutine
+ * interface library (Xlib) to the X Window System Protocol V11.0.
+ */
+#define NEED_EVENTS
+#define NEED_REPLIES
+
+#include <X11/Xlibint.h>
+#include <X11/Xos.h>
+#include "Xlibnet.h"
+#include <stdio.h>
+
+#include "dpsassert.h"
+#include "cslibint.h"
+
+static void _EatData32 (Display *dpy, unsigned long n);
+
+/* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX
+ * systems are broken and return EWOULDBLOCK when they should return EAGAIN
+ */
+#if defined(EAGAIN) && defined(EWOULDBLOCK)
+#define ETEST(err) (err == EAGAIN || err == EWOULDBLOCK)
+#else
+#ifdef EAGAIN
+#define ETEST(err) (err == EAGAIN)
+#else
+#define ETEST(err) (err == EWOULDBLOCK)
+#endif
+#endif
+
+#ifdef LACHMAN
+#ifdef EMSGSIZE
+#undef EMSGSIZE
+#endif
+#define EMSGSIZE ERANGE
+#endif
+
+#if defined(SVR4) && defined(sun)
+#define SUNSYSV 1
+#endif
+
+/*
+ * The following routines are internal routines used by Xlib for protocol
+ * packet transmission and reception.
+ *
+ * XIOError(Display *) will be called if any sort of system call error occurs.
+ * This is assumed to be a fatal condition, i.e., XIOError should not return.
+ *
+ * XError(Display *, XErrorEvent *) will be called whenever an X_Error event is
+ * received. This is not assumed to be a fatal condition, i.e., it is
+ * acceptable for this procedure to return. However, XError should NOT
+ * perform any operations (directly or indirectly) on the DISPLAY.
+ *
+ * Routines declared with a return type of 'Status' return 0 on failure,
+ * and non 0 on success. Routines with no declared return type don't
+ * return anything. Whenever possible routines that create objects return
+ * the object they have created.
+ */
+
+extern _XQEvent *_qfree;
+
+static int padlength[4] = {0, 3, 2, 1};
+ /* lookup table for adding padding bytes to data that is read from
+ or written to the X socket. */
+
+static xReq _dummy_request = {
+ 0, 0, 0
+};
+/*
+ * N_XFlush - Flush the X request buffer. If the buffer is empty, no
+ * action is taken. This routine correctly handles incremental writes.
+ * This routine may have to be reworked if int < long.
+ */
+void N_XFlush (Display *dpy)
+{
+ register long size, todo;
+ register int write_stat;
+ register char *bufindex;
+
+ if (!dpy) return;
+
+ if (dpy->flags & XlibDisplayIOError) return;
+
+ size = todo = dpy->bufptr - dpy->buffer;
+ bufindex = dpy->bufptr = dpy->buffer;
+ /*
+ * While write has not written the entire buffer, keep looping
+ * until the entire buffer is written. bufindex will be incremented
+ * and size decremented as buffer is written out.
+ */
+ while (size) {
+ errno = 0;
+ write_stat = WriteToServer(dpy->fd, bufindex, (int) todo);
+ if (write_stat >= 0) {
+ size -= write_stat;
+ todo = size;
+ bufindex += write_stat;
+ } else if (ETEST(errno)) {
+ N_XWaitForWritable(dpy);
+#ifdef SUNSYSV
+ } else if (errno == 0) {
+ N_XWaitForWritable(dpy);
+#endif
+#ifdef EMSGSIZE
+ } else if (errno == EMSGSIZE) {
+ if (todo > 1)
+ todo >>= 1;
+ else
+ N_XWaitForWritable(dpy);
+#endif
+ } else if (errno != EINTR) {
+ /* Write failed! */
+ /* errno set by write system call. */
+ _XIOError(dpy);
+ }
+ }
+ dpy->last_req = (char *)&_dummy_request;
+}
+
+#ifdef NEEDFORNX
+
+int
+_XEventsQueued (Display *dpy, int mode)
+{
+ register int len;
+ int pend;
+ char buf[BUFSIZE];
+ register xReply *rep;
+
+ if (mode == QueuedAfterFlush)
+ {
+ _XFlush(dpy);
+ if (dpy->qlen)
+ return(dpy->qlen);
+ }
+ if (dpy->flags & XlibDisplayIOError) return(dpy->qlen);
+ if (BytesReadable(dpy->fd, (char *) &pend) < 0)
+ _XIOError(dpy);
+#ifdef XCONN_CHECK_FREQ
+ /* This is a crock, required because FIONREAD or equivalent is
+ * not guaranteed to detect a broken connection.
+ */
+ if (!pend && !dpy->qlen && ++dpy->conn_checker >= XCONN_CHECK_FREQ)
+ {
+ unsigned long r_mask[MSKCNT];
+ static struct timeval zero_time;
+
+ dpy->conn_checker = 0;
+ CLEARBITS(r_mask);
+ BITSET(r_mask, dpy->fd);
+ if (pend = select(dpy->fd + 1, (int *)r_mask, NULL, NULL,
+ &zero_time))
+ {
+ if (pend > 0)
+ {
+ if (BytesReadable(dpy->fd, (char *) &pend) < 0)
+ _XIOError(dpy);
+ /* we should not get zero, if we do, force a read */
+ if (!pend)
+ pend = SIZEOF(xReply);
+ }
+ else if (pend < 0 && errno != EINTR)
+ _XIOError(dpy);
+ }
+ }
+#endif /* XCONN_CHECK_FREQ */
+ if (!(len = pend))
+ return(dpy->qlen); /* _XFlush can enqueue events */
+ /* Force a read if there is not enough data. Otherwise,
+ * a select() loop at a higher-level will spin undesirably,
+ * and we've seen at least one OS that appears to not update
+ * the result from FIONREAD once it has returned nonzero.
+ */
+ if (len < SIZEOF(xReply))
+ len = SIZEOF(xReply);
+ else if (len > BUFSIZE)
+ len = BUFSIZE;
+ len /= SIZEOF(xReply);
+ pend = len * SIZEOF(xReply);
+#ifdef XCONN_CHECK_FREQ
+ dpy->conn_checker = 0;
+#endif
+ _XRead (dpy, buf, (long) pend);
+
+ /* no space between comma and type or else macro will die */
+ STARTITERATE (rep,xReply, buf, (len > 0), len--) {
+ if (rep->generic.type == X_Error)
+ _XError(dpy, (xError *)rep);
+ else /* must be an event packet */
+ _XEnq(dpy, (xEvent *) rep);
+ }
+ ENDITERATE
+ return(dpy->qlen);
+}
+
+/* _XReadEvents - Flush the output queue,
+ * then read as many events as possible (but at least 1) and enqueue them
+ */
+void _XReadEvents(Display *dpy)
+{
+ char buf[BUFSIZE];
+ long pend_not_register; /* because can't "&" a register variable */
+ register long pend;
+ register xEvent *ev;
+ Bool not_yet_flushed = True;
+
+ do {
+ /* find out how much data can be read */
+ if (BytesReadable(dpy->fd, (char *) &pend_not_register) < 0)
+ _XIOError(dpy);
+ pend = pend_not_register;
+
+ /* must read at least one xEvent; if none is pending, then
+ we'll just flush and block waiting for it */
+ if (pend < SIZEOF(xEvent)) {
+ pend = SIZEOF(xEvent);
+ /* don't flush until we block the first time */
+ if (not_yet_flushed) {
+ int qlen = dpy->qlen;
+ _XFlush (dpy);
+ if (qlen != dpy->qlen) return;
+ not_yet_flushed = False;
+ }
+ }
+
+ /* but we won't read more than the max buffer size */
+ if (pend > BUFSIZE)
+ pend = BUFSIZE;
+
+ /* round down to an integral number of XReps */
+ pend = (pend / SIZEOF(xEvent)) * SIZEOF(xEvent);
+
+ _XRead (dpy, buf, pend);
+
+ /* no space between comma and type or else macro will die */
+ STARTITERATE (ev,xEvent, buf, (pend > 0),
+ pend -= SIZEOF(xEvent)) {
+ if (ev->u.u.type == X_Error)
+ _XError (dpy, (xError *) ev);
+ else /* it's an event packet; enqueue it */
+ _XEnq (dpy, ev);
+ }
+ ENDITERATE
+ } while (dpy->head == NULL);
+}
+
+#endif /* NEEDFORNX */
+
+/*
+ * N_XRead - Read bytes from the socket taking into account incomplete
+ * reads. This routine may have to be reworked if int < long.
+ */
+int N_XRead (Display *dpy, char *data, long size)
+{
+ register long bytes_read;
+
+ if (!dpy) return 0;
+ if ((dpy->flags & XlibDisplayIOError) || size == 0) return 0;
+ errno = 0;
+ while ((bytes_read = ReadFromServer(dpy->fd, data, (int)size))
+ != size) {
+
+ if (bytes_read > 0) {
+ size -= bytes_read;
+ data += bytes_read;
+ }
+ else if (ETEST(errno)) {
+ N_XWaitForReadable(dpy);
+ errno = 0;
+ }
+#ifdef SUNSYSV
+ else if (errno == 0) {
+ N_XWaitForReadable(dpy);
+ }
+#endif
+ else if (bytes_read == 0) {
+ /* Read failed because of end of file! */
+ errno = EPIPE;
+ _XIOError(dpy);
+ }
+
+ else /* bytes_read is less than 0; presumably -1 */ {
+ /* If it's a system call interrupt, it's not an error. */
+ if (errno != EINTR)
+ _XIOError(dpy);
+ }
+ }
+ return 0;
+}
+
+#ifdef WORD64
+
+/*
+ * XXX This is a *really* stupid way of doing this....
+ * PACKBUFFERSIZE must be a multiple of 4.
+ */
+
+#define PACKBUFFERSIZE 4096
+
+
+/*
+ * _XRead32 - Read bytes from the socket unpacking each 32 bits
+ * into a long (64 bits on a CRAY computer).
+ *
+ */
+static void _doXRead32 (Display *dpy, long *data, long size, char *packbuffer)
+{
+ long *lpack,*lp;
+ long mask32 = 0x00000000ffffffff;
+ long maskw, nwords, i, bits;
+
+ _XReadPad (dpy, packbuffer, size);
+
+ lp = data;
+ lpack = (long *) packbuffer;
+ nwords = size >> 2;
+ bits = 32;
+
+ for(i=0;i<nwords;i++){
+ maskw = mask32 << bits;
+ *lp++ = ( *lpack & maskw ) >> bits;
+ bits = bits ^32;
+ if(bits){
+ lpack++;
+ }
+ }
+}
+
+void _XRead32 (Display *dpy, long *data, long len)
+{
+ char packbuffer[PACKBUFFERSIZE];
+ unsigned nunits = PACKBUFFERSIZE >> 2;
+
+ for (; len > PACKBUFFERSIZE; len -= PACKBUFFERSIZE, data += nunits) {
+ _doXRead32 (dpy, data, PACKBUFFERSIZE, packbuffer);
+ }
+ if (len) _doXRead32 (dpy, data, len, packbuffer);
+}
+
+
+
+/*
+ * _XRead16 - Read bytes from the socket unpacking each 16 bits
+ * into a long (64 bits on a CRAY computer).
+ *
+ */
+static void _doXRead16 (Display *dpy, short *data, long size, char *packbuffer)
+{
+ long *lpack,*lp;
+ long mask16 = 0x000000000000ffff;
+ long maskw, nwords, i, bits;
+
+ _XRead(dpy,packbuffer,size); /* don't do a padded read... */
+
+ lp = (long *) data;
+ lpack = (long *) packbuffer;
+ nwords = size >> 1; /* number of 16 bit words to be unpacked */
+ bits = 48;
+ for(i=0;i<nwords;i++){
+ maskw = mask16 << bits;
+ *lp++ = ( *lpack & maskw ) >> bits;
+ bits -= 16;
+ if(bits < 0){
+ lpack++;
+ bits = 48;
+ }
+ }
+}
+
+void _XRead16 (Display *dpy, short *data, long len)
+{
+ char packbuffer[PACKBUFFERSIZE];
+ unsigned nunits = PACKBUFFERSIZE >> 1;
+
+ for (; len > PACKBUFFERSIZE; len -= PACKBUFFERSIZE, data += nunits) {
+ _doXRead16 (dpy, data, PACKBUFFERSIZE, packbuffer);
+ }
+ if (len) _doXRead16 (dpy, data, len, packbuffer);
+}
+
+void _XRead16Pad (Display *dpy, short *data, long size)
+{
+ int slop = (size & 3);
+ short slopbuf[3];
+
+ _XRead16 (dpy, data, size);
+ if (slop > 0) {
+ _XRead16 (dpy, slopbuf, 4 - slop);
+ }
+}
+#endif /* WORD64 */
+
+
+/*
+ * N_XReadPad - Read bytes from the socket taking into account incomplete
+ * reads. If the number of bytes is not 0 mod 32, read additional pad
+ * bytes. This routine may have to be reworked if int < long.
+ */
+void N_XReadPad (Display *dpy, char *data, long size)
+{
+ register long bytes_read;
+ struct iovec iov[2];
+ char pad[3];
+
+ if (!dpy) return;
+ if ((dpy->flags & XlibDisplayIOError) || size == 0) return;
+ iov[0].iov_len = (int)size;
+ iov[0].iov_base = data;
+ /*
+ * The following hack is used to provide 32 bit long-word
+ * aligned padding. The [1] vector is of length 0, 1, 2, or 3,
+ * whatever is needed.
+ */
+
+ iov[1].iov_len = padlength[size & 3];
+ iov[1].iov_base = pad;
+ size += iov[1].iov_len;
+ errno = 0;
+ while ((bytes_read = ReadvFromServer (dpy->fd, iov, 2)) != size) {
+
+ if (bytes_read > 0) {
+ size -= bytes_read;
+ if (iov[0].iov_len < bytes_read) {
+ iov[1].iov_len += iov[0].iov_len - bytes_read;
+ iov[1].iov_base =
+ (char *)iov[1].iov_base + bytes_read - iov[0].iov_len;
+ iov[0].iov_len = 0;
+ }
+ else {
+ iov[0].iov_len -= bytes_read;
+ iov[0].iov_base = (char *)iov[0].iov_base + bytes_read;
+ }
+ }
+ else if (ETEST(errno)) {
+ N_XWaitForReadable(dpy);
+ errno = 0;
+ }
+#ifdef SUNSYSV
+ else if (errno == 0) {
+ N_XWaitForReadable(dpy);
+ }
+#endif
+ else if (bytes_read == 0) {
+ /* Read failed because of end of file! */
+ errno = EPIPE;
+ _XIOError(dpy);
+ }
+
+ else /* bytes_read is less than 0; presumably -1 */ {
+ /* If it's a system call interrupt, it's not an error. */
+ if (errno != EINTR)
+ _XIOError(dpy);
+ }
+ }
+}
+
+/*
+ * N_XSend - Flush the buffer and send the client data. 32 bit word aligned
+ * transmission is used, if size is not 0 mod 4, extra bytes are transmitted.
+ * This routine may have to be reworked if int < long;
+ */
+void N_XSend (Display *dpy, _Xconst char *data, long size)
+{
+ struct iovec iov[3];
+ static char pad[3] = {0, 0, 0};
+ /* XText8 and XText16 require that the padding bytes be zero! */
+
+ long skip = 0;
+ long dpybufsize = (dpy->bufptr - dpy->buffer);
+ long padsize = padlength[size & 3];
+ long total = dpybufsize + size + padsize;
+ long todo = total;
+
+ if (dpy->flags & XlibDisplayIOError) return;
+
+ /*
+ * There are 3 pieces that may need to be written out:
+ *
+ * o whatever is in the display buffer
+ * o the data passed in by the user
+ * o any padding needed to 32bit align the whole mess
+ *
+ * This loop looks at all 3 pieces each time through. It uses skip
+ * to figure out whether or not a given piece is needed.
+ */
+ while (total) {
+ long before = skip; /* amount of whole thing written */
+ long remain = todo; /* amount to try this time, <= total */
+ int i = 0;
+ long len;
+
+ /* You could be very general here and have "in" and "out" iovecs
+ * and write a loop without using a macro, but what the heck. This
+ * translates to:
+ *
+ * how much of this piece is new?
+ * if more new then we are trying this time, clamp
+ * if nothing new
+ * then bump down amount already written, for next piece
+ * else put new stuff in iovec, will need all of next piece
+ *
+ * Note that todo had better be at least 1 or else we'll end up
+ * writing 0 iovecs.
+ */
+#define InsertIOV(pointer, length) \
+ len = (length) - before; \
+ if (len > remain) \
+ len = remain; \
+ if (len <= 0) { \
+ before = (-len); \
+ } else { \
+ iov[i].iov_len = len; \
+ iov[i].iov_base = (pointer) + before; \
+ i++; \
+ remain -= len; \
+ before = 0; \
+ }
+
+ InsertIOV (dpy->buffer, dpybufsize)
+ InsertIOV ((char *)data, size)
+ InsertIOV (pad, padsize)
+
+ errno = 0;
+ if ((len = WritevToServer(dpy->fd, iov, i)) >= 0) {
+ skip += len;
+ total -= len;
+ todo = total;
+ } else if (ETEST(errno)) {
+ N_XWaitForWritable(dpy);
+#ifdef SUNSYSV
+ } else if (errno == 0) {
+ N_XWaitForWritable(dpy);
+#endif
+#ifdef EMSGSIZE
+ } else if (errno == EMSGSIZE) {
+ if (todo > 1)
+ todo >>= 1;
+ else
+ N_XWaitForWritable(dpy);
+#endif
+ } else if (errno != EINTR) {
+ _XIOError(dpy);
+ }
+ }
+
+ dpy->bufptr = dpy->buffer;
+ dpy->last_req = (char *) & _dummy_request;
+ return;
+}
+
+#ifdef NEEDFORNX
+/*
+ * _XAllocID - normal resource ID allocation routine. A client
+ * can roll his own and instatantiate it if he wants, but must
+ * follow the rules.
+ */
+XID _XAllocID(Display *dpy)
+{
+ XID id;
+
+ id = dpy->resource_id << dpy->resource_shift;
+ if (id <= dpy->resource_mask) {
+ dpy->resource_id++;
+ return (dpy->resource_base + id);
+ }
+ if (id != 0x10000000) {
+ (void) fprintf(stderr,
+ "Xlib: resource ID allocation space exhausted!\n");
+ id = 0x10000000;
+ dpy->resource_id = id >> dpy->resource_shift;
+ }
+ return id;
+}
+
+/*
+ * The hard part about this is that we only get 16 bits from a reply. Well,
+ * then, we have three values that will march along, with the following
+ * invariant:
+ * dpy->last_request_read <= rep->sequenceNumber <= dpy->request
+ * The right choice for rep->sequenceNumber is the largest that
+ * still meets these constraints.
+ */
+
+unsigned long
+_XSetLastRequestRead(Display *dpy, xGenericReply *rep)
+{
+ register unsigned long newseq, lastseq;
+
+ /*
+ * KeymapNotify has no sequence number, but is always guaranteed
+ * to immediately follow another event, except when generated via
+ * SendEvent (hmmm).
+ */
+ if ((rep->type & 0x7f) == KeymapNotify)
+ return(dpy->last_request_read);
+
+ newseq = (dpy->last_request_read & ~((unsigned long)0xffff)) |
+ rep->sequenceNumber;
+ lastseq = dpy->last_request_read;
+ while (newseq < lastseq) {
+ newseq += 0x10000;
+ if (newseq > dpy->request) {
+ (void) fprintf (stderr,
+ "Xlib: sequence lost (0x%lx > 0x%lx) in reply type 0x%x!\n",
+ newseq, dpy->request,
+ (unsigned int) rep->type);
+ newseq -= 0x10000;
+ break;
+ }
+ }
+
+ dpy->last_request_read = newseq;
+ return(newseq);
+}
+
+#endif /* NEEDFORNX */
+
+/*
+ * N_XReply - Wait for a reply packet and copy its contents into the
+ * specified rep. Mean while we must handle error and event packets that
+ * we may encounter.
+ */
+Status N_XReply (
+ Display *dpy,
+ xReply *rep,
+ int extra, /* number of 32-bit words expected after the reply */
+ Bool discard) /* should I discard data following "extra" words? */
+{
+ /* Pull out the serial number now, so that (currently illegal) requests
+ * generated by an error handler don't confuse us.
+ */
+ unsigned long cur_request = dpy->request;
+
+ if (dpy->flags & XlibDisplayIOError) return (0);
+
+ N_XFlush(dpy);
+ while (1) {
+ N_XRead(dpy, (char *)rep, (long)SIZEOF(xReply));
+ switch ((int)rep->generic.type) {
+
+ case X_Reply:
+ /* Reply received. Fast update for synchronous replies,
+ * but deal with multiple outstanding replies.
+ */
+ if (rep->generic.sequenceNumber == (cur_request & 0xffff))
+ dpy->last_request_read = cur_request;
+ else
+ (void) _XSetLastRequestRead(dpy, &rep->generic);
+ if (extra == 0) {
+ if (discard && (rep->generic.length > 0))
+ /* unexpectedly long reply! */
+ _EatData32 (dpy, rep->generic.length);
+ return (1);
+ }
+ if ((unsigned) extra == rep->generic.length) {
+ /*
+ * Read the extra data into storage immediately following
+ * the GenericReply structure.
+ */
+ N_XRead (dpy, (char *) (NEXTPTR(rep,xReply)),
+ ((long)extra) << 2);
+ return (1);
+ }
+ if ((unsigned) extra < rep->generic.length) {
+ /* Actual reply is longer than "extra" */
+ N_XRead (dpy, (char *) (NEXTPTR(rep,xReply)),
+ ((long)extra) << 2);
+ if (discard)
+ _EatData32 (dpy, rep->generic.length - extra);
+ return (1);
+ }
+ /*
+ *if we get here, then extra > rep->generic.length--meaning we
+ * read a reply that's shorter than we expected. This is an
+ * error, but we still need to figure out how to handle it...
+ */
+ N_XRead (dpy, (char *) (NEXTPTR(rep,xReply)),
+ ((long) rep->generic.length) << 2);
+ _XIOError (dpy);
+ return (0);
+
+ case X_Error:
+ {
+ register _XExtension *ext;
+ register Bool ret = False;
+ int ret_code;
+ xError *err = (xError *) rep;
+ unsigned long serial;
+
+ serial = _XSetLastRequestRead(dpy, (xGenericReply *)rep);
+ /*
+ * we better see if there is an extension who may
+ * want to suppress the error.
+ */
+ for (ext = dpy->ext_procs; !ret && ext; ext = ext->next) {
+ if (ext->error)
+ ret = (*ext->error)(dpy, err, &ext->codes, &ret_code);
+ }
+ if (!ret) {
+ _XError(dpy, err);
+ ret_code = 0;
+ }
+ if (serial == cur_request)
+ return(ret_code);
+ }
+ break;
+ default:
+ /* There should never be any events on this connection! */
+ DPSFatalProc(NULL, "N_XReply read bogus X event");
+ break;
+ }
+ }
+}
+
+
+/* Read and discard "n" 8-bit bytes of data */
+
+static void
+N_XEatData (Display *dpy, unsigned long n)
+{
+#define SCRATCHSIZE 2048
+ char buf[SCRATCHSIZE];
+
+ while (n > 0) {
+ register long bytes_read = (n > SCRATCHSIZE) ? SCRATCHSIZE : n;
+ N_XRead (dpy, buf, bytes_read);
+ n -= bytes_read;
+ }
+#undef SCRATCHSIZE
+}
+
+
+/* Read and discard "n" 32-bit words. */
+
+static void _EatData32 (Display *dpy, unsigned long n)
+{
+ N_XEatData (dpy, n << 2);
+}
+
+
+#ifdef NEEDFORNX
+/*
+ * _XEnq - Place event packets on the display's queue.
+ * note that no squishing of move events in V11, since there
+ * is pointer motion hints....
+ */
+void _XEnq (Display *dpy, xEvent *event)
+{
+ register _XQEvent *qelt;
+
+/*NOSTRICT*/
+ if (qelt = _qfree) {
+ /* If _qfree is non-NULL do this, else malloc a new one. */
+ _qfree = qelt->next;
+ }
+ else if ((qelt =
+ (_XQEvent *) Xmalloc((unsigned)sizeof(_XQEvent))) == NULL) {
+ /* Malloc call failed! */
+ errno = ENOMEM;
+ _XIOError(dpy);
+ }
+ qelt->next = NULL;
+ /* go call through display to find proper event reformatter */
+ if ((*dpy->event_vec[event->u.u.type & 0177])(dpy, &qelt->event, event)) {
+ if (dpy->tail) dpy->tail->next = qelt;
+ else dpy->head = qelt;
+
+ dpy->tail = qelt;
+ dpy->qlen++;
+ } else {
+ /* ignored, or stashed away for many-to-one compression */
+ qelt->next = _qfree;
+ _qfree = qelt;
+ }
+}
+/*
+ * EventToWire in separate file in that often not needed.
+ */
+#endif /* NEEDFORNX */
+
+/*ARGSUSED*/
+Bool
+N_XUnknownWireEvent(
+ Display *dpy, /* pointer to display structure */
+ XEvent *re, /* pointer to where event should be reformatted */
+ xEvent *event) /* wire protocol event */
+{
+ char mbuf[256];
+
+ sprintf(mbuf, "NX: unhandled wire event %d, agent = %lx", re->type, (long)dpy);
+ DPSWarnProc(NULL, mbuf);
+ return(False);
+}
+
+/*ARGSUSED*/
+Status
+N_XUnknownNativeEvent(
+ Display *dpy, /* pointer to display structure */
+ XEvent *re, /* pointer to where event should be reformatted */
+ xEvent *event) /* wire protocol event */
+{
+ char mbuf[256];
+
+ sprintf(mbuf, "NX: unhandled native event %d, agent = %lx", re->type, (long)dpy);
+ DPSWarnProc(NULL, mbuf);
+ return(0);
+}
+
+#ifdef NEEDFORNX
+/*
+ * reformat a wire event into an XEvent structure of the right type.
+ */
+Bool
+_XWireToEvent(
+ Display *dpy, /* pointer to display structure */
+ XEvent *re, /* pointer to where event should be reformatted */
+ xEvent *event) /* wire protocol event */
+{
+
+ re->type = event->u.u.type & 0x7f;
+ ((XAnyEvent *)re)->serial = _XSetLastRequestRead(dpy,
+ (xGenericReply *)event);
+ ((XAnyEvent *)re)->send_event = ((event->u.u.type & 0x80) != 0);
+ ((XAnyEvent *)re)->display = dpy;
+
+ /* Ignore the leading bit of the event type since it is set when a
+ client sends an event rather than the server. */
+
+ switch (event-> u.u.type & 0177) {
+ case KeyPress:
+ case KeyRelease:
+ {
+ register XKeyEvent *ev = (XKeyEvent*) re;
+ ev->root = event->u.keyButtonPointer.root;
+ ev->window = event->u.keyButtonPointer.event;
+ ev->subwindow = event->u.keyButtonPointer.child;
+ ev->time = event->u.keyButtonPointer.time;
+ ev->x = cvtINT16toInt(event->u.keyButtonPointer.eventX);
+ ev->y = cvtINT16toInt(event->u.keyButtonPointer.eventY);
+ ev->x_root = cvtINT16toInt(event->u.keyButtonPointer.rootX);
+ ev->y_root = cvtINT16toInt(event->u.keyButtonPointer.rootY);
+ ev->state = event->u.keyButtonPointer.state;
+ ev->same_screen = event->u.keyButtonPointer.sameScreen;
+ ev->keycode = event->u.u.detail;
+ }
+ break;
+ case ButtonPress:
+ case ButtonRelease:
+ {
+ register XButtonEvent *ev = (XButtonEvent *) re;
+ ev->root = event->u.keyButtonPointer.root;
+ ev->window = event->u.keyButtonPointer.event;
+ ev->subwindow = event->u.keyButtonPointer.child;
+ ev->time = event->u.keyButtonPointer.time;
+ ev->x = cvtINT16toInt(event->u.keyButtonPointer.eventX);
+ ev->y = cvtINT16toInt(event->u.keyButtonPointer.eventY);
+ ev->x_root = cvtINT16toInt(event->u.keyButtonPointer.rootX);
+ ev->y_root = cvtINT16toInt(event->u.keyButtonPointer.rootY);
+ ev->state = event->u.keyButtonPointer.state;
+ ev->same_screen = event->u.keyButtonPointer.sameScreen;
+ ev->button = event->u.u.detail;
+ }
+ break;
+ case MotionNotify:
+ {
+ register XMotionEvent *ev = (XMotionEvent *)re;
+ ev->root = event->u.keyButtonPointer.root;
+ ev->window = event->u.keyButtonPointer.event;
+ ev->subwindow = event->u.keyButtonPointer.child;
+ ev->time = event->u.keyButtonPointer.time;
+ ev->x = cvtINT16toInt(event->u.keyButtonPointer.eventX);
+ ev->y = cvtINT16toInt(event->u.keyButtonPointer.eventY);
+ ev->x_root = cvtINT16toInt(event->u.keyButtonPointer.rootX);
+ ev->y_root = cvtINT16toInt(event->u.keyButtonPointer.rootY);
+ ev->state = event->u.keyButtonPointer.state;
+ ev->same_screen = event->u.keyButtonPointer.sameScreen;
+ ev->is_hint = event->u.u.detail;
+ }
+ break;
+ case EnterNotify:
+ case LeaveNotify:
+ {
+ register XCrossingEvent *ev = (XCrossingEvent *) re;
+ ev->root = event->u.enterLeave.root;
+ ev->window = event->u.enterLeave.event;
+ ev->subwindow = event->u.enterLeave.child;
+ ev->time = event->u.enterLeave.time;
+ ev->x = cvtINT16toInt(event->u.enterLeave.eventX);
+ ev->y = cvtINT16toInt(event->u.enterLeave.eventY);
+ ev->x_root = cvtINT16toInt(event->u.enterLeave.rootX);
+ ev->y_root = cvtINT16toInt(event->u.enterLeave.rootY);
+ ev->state = event->u.enterLeave.state;
+ ev->mode = event->u.enterLeave.mode;
+ ev->same_screen = (event->u.enterLeave.flags &
+ ELFlagSameScreen) && True;
+ ev->focus = (event->u.enterLeave.flags &
+ ELFlagFocus) && True;
+ ev->detail = event->u.u.detail;
+ }
+ break;
+ case FocusIn:
+ case FocusOut:
+ {
+ register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
+ ev->window = event->u.focus.window;
+ ev->mode = event->u.focus.mode;
+ ev->detail = event->u.u.detail;
+ }
+ break;
+ case KeymapNotify:
+ {
+ register XKeymapEvent *ev = (XKeymapEvent *) re;
+ ev->window = dpy->current;
+ bcopy ((char *)((xKeymapEvent *) event)->map,
+ &ev->key_vector[1],
+ sizeof (((xKeymapEvent *) event)->map));
+ }
+ break;
+ case Expose:
+ {
+ register XExposeEvent *ev = (XExposeEvent *) re;
+ ev->window = event->u.expose.window;
+ ev->x = event->u.expose.x;
+ ev->y = event->u.expose.y;
+ ev->width = event->u.expose.width;
+ ev->height = event->u.expose.height;
+ ev->count = event->u.expose.count;
+ }
+ break;
+ case GraphicsExpose:
+ {
+ register XGraphicsExposeEvent *ev =
+ (XGraphicsExposeEvent *) re;
+ ev->drawable = event->u.graphicsExposure.drawable;
+ ev->x = event->u.graphicsExposure.x;
+ ev->y = event->u.graphicsExposure.y;
+ ev->width = event->u.graphicsExposure.width;
+ ev->height = event->u.graphicsExposure.height;
+ ev->count = event->u.graphicsExposure.count;
+ ev->major_code = event->u.graphicsExposure.majorEvent;
+ ev->minor_code = event->u.graphicsExposure.minorEvent;
+ }
+ break;
+ case NoExpose:
+ {
+ register XNoExposeEvent *ev = (XNoExposeEvent *) re;
+ ev->drawable = event->u.noExposure.drawable;
+ ev->major_code = event->u.noExposure.majorEvent;
+ ev->minor_code = event->u.noExposure.minorEvent;
+ }
+ break;
+ case VisibilityNotify:
+ {
+ register XVisibilityEvent *ev = (XVisibilityEvent *) re;
+ ev->window = event->u.visibility.window;
+ ev->state = event->u.visibility.state;
+ }
+ break;
+ case CreateNotify:
+ {
+ register XCreateWindowEvent *ev =
+ (XCreateWindowEvent *) re;
+ ev->window = event->u.createNotify.window;
+ ev->parent = event->u.createNotify.parent;
+ ev->x = cvtINT16toInt(event->u.createNotify.x);
+ ev->y = cvtINT16toInt(event->u.createNotify.y);
+ ev->width = event->u.createNotify.width;
+ ev->height = event->u.createNotify.height;
+ ev->border_width = event->u.createNotify.borderWidth;
+ ev->override_redirect = event->u.createNotify.override;
+ }
+ break;
+ case DestroyNotify:
+ {
+ register XDestroyWindowEvent *ev =
+ (XDestroyWindowEvent *) re;
+ ev->window = event->u.destroyNotify.window;
+ ev->event = event->u.destroyNotify.event;
+ }
+ break;
+ case UnmapNotify:
+ {
+ register XUnmapEvent *ev = (XUnmapEvent *) re;
+ ev->window = event->u.unmapNotify.window;
+ ev->event = event->u.unmapNotify.event;
+ ev->from_configure = event->u.unmapNotify.fromConfigure;
+ }
+ break;
+ case MapNotify:
+ {
+ register XMapEvent *ev = (XMapEvent *) re;
+ ev->window = event->u.mapNotify.window;
+ ev->event = event->u.mapNotify.event;
+ ev->override_redirect = event->u.mapNotify.override;
+ }
+ break;
+ case MapRequest:
+ {
+ register XMapRequestEvent *ev = (XMapRequestEvent *) re;
+ ev->window = event->u.mapRequest.window;
+ ev->parent = event->u.mapRequest.parent;
+ }
+ break;
+ case ReparentNotify:
+ {
+ register XReparentEvent *ev = (XReparentEvent *) re;
+ ev->event = event->u.reparent.event;
+ ev->window = event->u.reparent.window;
+ ev->parent = event->u.reparent.parent;
+ ev->x = cvtINT16toInt(event->u.reparent.x);
+ ev->y = cvtINT16toInt(event->u.reparent.y);
+ ev->override_redirect = event->u.reparent.override;
+ }
+ break;
+ case ConfigureNotify:
+ {
+ register XConfigureEvent *ev = (XConfigureEvent *) re;
+ ev->event = event->u.configureNotify.event;
+ ev->window = event->u.configureNotify.window;
+ ev->above = event->u.configureNotify.aboveSibling;
+ ev->x = cvtINT16toInt(event->u.configureNotify.x);
+ ev->y = cvtINT16toInt(event->u.configureNotify.y);
+ ev->width = event->u.configureNotify.width;
+ ev->height = event->u.configureNotify.height;
+ ev->border_width = event->u.configureNotify.borderWidth;
+ ev->override_redirect = event->u.configureNotify.override;
+ }
+ break;
+ case ConfigureRequest:
+ {
+ register XConfigureRequestEvent *ev =
+ (XConfigureRequestEvent *) re;
+ ev->window = event->u.configureRequest.window;
+ ev->parent = event->u.configureRequest.parent;
+ ev->above = event->u.configureRequest.sibling;
+ ev->x = cvtINT16toInt(event->u.configureRequest.x);
+ ev->y = cvtINT16toInt(event->u.configureRequest.y);
+ ev->width = event->u.configureRequest.width;
+ ev->height = event->u.configureRequest.height;
+ ev->border_width = event->u.configureRequest.borderWidth;
+ ev->value_mask = event->u.configureRequest.valueMask;
+ ev->detail = event->u.u.detail;
+ }
+ break;
+ case GravityNotify:
+ {
+ register XGravityEvent *ev = (XGravityEvent *) re;
+ ev->window = event->u.gravity.window;
+ ev->event = event->u.gravity.event;
+ ev->x = cvtINT16toInt(event->u.gravity.x);
+ ev->y = cvtINT16toInt(event->u.gravity.y);
+ }
+ break;
+ case ResizeRequest:
+ {
+ register XResizeRequestEvent *ev =
+ (XResizeRequestEvent *) re;
+ ev->window = event->u.resizeRequest.window;
+ ev->width = event->u.resizeRequest.width;
+ ev->height = event->u.resizeRequest.height;
+ }
+ break;
+ case CirculateNotify:
+ {
+ register XCirculateEvent *ev = (XCirculateEvent *) re;
+ ev->window = event->u.circulate.window;
+ ev->event = event->u.circulate.event;
+ ev->place = event->u.circulate.place;
+ }
+ break;
+ case CirculateRequest:
+ {
+ register XCirculateRequestEvent *ev =
+ (XCirculateRequestEvent *) re;
+ ev->window = event->u.circulate.window;
+ ev->parent = event->u.circulate.event;
+ ev->place = event->u.circulate.place;
+ }
+ break;
+ case PropertyNotify:
+ {
+ register XPropertyEvent *ev = (XPropertyEvent *) re;
+ ev->window = event->u.property.window;
+ ev->atom = event->u.property.atom;
+ ev->time = event->u.property.time;
+ ev->state = event->u.property.state;
+ }
+ break;
+ case SelectionClear:
+ {
+ register XSelectionClearEvent *ev =
+ (XSelectionClearEvent *) re;
+ ev->window = event->u.selectionClear.window;
+ ev->selection = event->u.selectionClear.atom;
+ ev->time = event->u.selectionClear.time;
+ }
+ break;
+ case SelectionRequest:
+ {
+ register XSelectionRequestEvent *ev =
+ (XSelectionRequestEvent *) re;
+ ev->owner = event->u.selectionRequest.owner;
+ ev->requestor = event->u.selectionRequest.requestor;
+ ev->selection = event->u.selectionRequest.selection;
+ ev->target = event->u.selectionRequest.target;
+ ev->property = event->u.selectionRequest.property;
+ ev->time = event->u.selectionRequest.time;
+ }
+ break;
+ case SelectionNotify:
+ {
+ register XSelectionEvent *ev = (XSelectionEvent *) re;
+ ev->requestor = event->u.selectionNotify.requestor;
+ ev->selection = event->u.selectionNotify.selection;
+ ev->target = event->u.selectionNotify.target;
+ ev->property = event->u.selectionNotify.property;
+ ev->time = event->u.selectionNotify.time;
+ }
+ break;
+ case ColormapNotify:
+ {
+ register XColormapEvent *ev = (XColormapEvent *) re;
+ ev->window = event->u.colormap.window;
+ ev->colormap = event->u.colormap.colormap;
+ ev->new = event->u.colormap.new;
+ ev->state = event->u.colormap.state;
+ }
+ break;
+ case ClientMessage:
+ {
+ register int i;
+ register XClientMessageEvent *ev
+ = (XClientMessageEvent *) re;
+ ev->window = event->u.clientMessage.window;
+ ev->format = event->u.u.detail;
+ switch (ev->format) {
+ case 8:
+ ev->message_type = event->u.clientMessage.u.b.type;
+ for (i = 0; i < 20; i++)
+ ev->data.b[i] = event->u.clientMessage.u.b.bytes[i];
+ break;
+ case 16:
+ ev->message_type = event->u.clientMessage.u.s.type;
+ ev->data.s[0] = cvtINT16toShort(event->u.clientMessage.u.s.shorts0);
+ ev->data.s[1] = cvtINT16toShort(event->u.clientMessage.u.s.shorts1);
+ ev->data.s[2] = cvtINT16toShort(event->u.clientMessage.u.s.shorts2);
+ ev->data.s[3] = cvtINT16toShort(event->u.clientMessage.u.s.shorts3);
+ ev->data.s[4] = cvtINT16toShort(event->u.clientMessage.u.s.shorts4);
+ ev->data.s[5] = cvtINT16toShort(event->u.clientMessage.u.s.shorts5);
+ ev->data.s[6] = cvtINT16toShort(event->u.clientMessage.u.s.shorts6);
+ ev->data.s[7] = cvtINT16toShort(event->u.clientMessage.u.s.shorts7);
+ ev->data.s[8] = cvtINT16toShort(event->u.clientMessage.u.s.shorts8);
+ ev->data.s[9] = cvtINT16toShort(event->u.clientMessage.u.s.shorts9);
+ break;
+ case 32:
+ ev->message_type = event->u.clientMessage.u.l.type;
+ ev->data.l[0] = cvtINT32toLong(event->u.clientMessage.u.l.longs0);
+ ev->data.l[1] = cvtINT32toLong(event->u.clientMessage.u.l.longs1);
+ ev->data.l[2] = cvtINT32toLong(event->u.clientMessage.u.l.longs2);
+ ev->data.l[3] = cvtINT32toLong(event->u.clientMessage.u.l.longs3);
+ ev->data.l[4] = cvtINT32toLong(event->u.clientMessage.u.l.longs4);
+ break;
+ default: /* XXX should never occur */
+ break;
+ }
+ }
+ break;
+ case MappingNotify:
+ {
+ register XMappingEvent *ev = (XMappingEvent *)re;
+ ev->window = 0;
+ ev->first_keycode = event->u.mappingNotify.firstKeyCode;
+ ev->request = event->u.mappingNotify.request;
+ ev->count = event->u.mappingNotify.count;
+ }
+ break;
+ default:
+ return(_XUnknownWireEvent(dpy, re, event));
+ }
+ return(True);
+}
+
+
+#ifndef USL_SHARELIB
+
+static char *_SysErrorMsg (int n)
+{
+ extern char *sys_errlist[];
+ extern int sys_nerr;
+ char *s = ((n >= 0 && n < sys_nerr) ? sys_errlist[n] : "unknown error");
+
+ return (s ? s : "no such error");
+}
+
+#endif /* USL sharedlibs in don't define for SVR3.2 */
+
+
+/*
+ * _XDefaultIOError - Default fatal system error reporting routine. Called
+ * when an X internal system error is encountered.
+ */
+_XDefaultIOError (Display *dpy)
+{
+ (void) fprintf (stderr,
+ "XIO: fatal IO error %d (%s) on X server \"%s\"\r\n",
+ errno, _SysErrorMsg (errno), DisplayString (dpy));
+ (void) fprintf (stderr,
+ " after %lu requests (%lu known processed) with %d events remaining.\r\n",
+ NextRequest(dpy) - 1, LastKnownRequestProcessed(dpy),
+ QLength(dpy));
+
+ if (errno == EPIPE) {
+ (void) fprintf (stderr,
+ " The connection was probably broken by a server shutdown or KillClient.\r\n");
+ }
+ exit(1);
+}
+
+
+static int _XPrintDefaultError (Display *dpy, XErrorEvent *event, FILE *fp)
+{
+ char buffer[BUFSIZ];
+ char mesg[BUFSIZ];
+ char number[32];
+ char *mtype = "XlibMessage";
+ register _XExtension *ext = (_XExtension *)NULL;
+ _XExtension *bext = (_XExtension *)NULL;
+ XGetErrorText(dpy, event->error_code, buffer, BUFSIZ);
+ XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
+ (void) fprintf(fp, "%s: %s\n ", mesg, buffer);
+ XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d",
+ mesg, BUFSIZ);
+ (void) fprintf(fp, mesg, event->request_code);
+ if (event->request_code < 128) {
+ sprintf(number, "%d", event->request_code);
+ XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ);
+ } else {
+ for (ext = dpy->ext_procs;
+ ext && (ext->codes.major_opcode != event->request_code);
+ ext = ext->next)
+ ;
+ if (ext)
+ strcpy(buffer, ext->name);
+ else
+ buffer[0] = '\0';
+ }
+ (void) fprintf(fp, " (%s)\n", buffer);
+ if (event->request_code >= 128) {
+ XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
+ mesg, BUFSIZ);
+ fputs(" ", fp);
+ (void) fprintf(fp, mesg, event->minor_code);
+ if (ext) {
+ sprintf(mesg, "%s.%d", ext->name, event->minor_code);
+ XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ);
+ (void) fprintf(fp, " (%s)", buffer);
+ }
+ fputs("\n", fp);
+ }
+ if (event->error_code >= 128) {
+ /* kludge, try to find the extension that caused it */
+ buffer[0] = '\0';
+ for (ext = dpy->ext_procs; ext; ext = ext->next) {
+ if (ext->error_string)
+ (*ext->error_string)(dpy, event->error_code, &ext->codes,
+ buffer, BUFSIZ);
+ if (buffer[0]) {
+ bext = ext;
+ break;
+ }
+ if (ext->codes.first_error &&
+ ext->codes.first_error < event->error_code &&
+ (!bext || ext->codes.first_error > bext->codes.first_error))
+ bext = ext;
+ }
+ if (bext)
+ sprintf(buffer, "%s.%d", bext->name,
+ event->error_code - bext->codes.first_error);
+ else
+ strcpy(buffer, "Value");
+ XGetErrorDatabaseText(dpy, mtype, buffer, "", mesg, BUFSIZ);
+ if (mesg[0]) {
+ fputs(" ", fp);
+ (void) fprintf(fp, mesg, event->resourceid);
+ fputs("\n", fp);
+ }
+ /* let extensions try to print the values */
+ for (ext = dpy->ext_procs; ext; ext = ext->next) {
+ if (ext->error_values)
+ (*ext->error_values)(dpy, event, fp);
+ }
+ } else if ((event->error_code == BadWindow) ||
+ (event->error_code == BadPixmap) ||
+ (event->error_code == BadCursor) ||
+ (event->error_code == BadFont) ||
+ (event->error_code == BadDrawable) ||
+ (event->error_code == BadColor) ||
+ (event->error_code == BadGC) ||
+ (event->error_code == BadIDChoice) ||
+ (event->error_code == BadValue) ||
+ (event->error_code == BadAtom)) {
+ if (event->error_code == BadValue)
+ XGetErrorDatabaseText(dpy, mtype, "Value", "Value 0x%x",
+ mesg, BUFSIZ);
+ else if (event->error_code == BadAtom)
+ XGetErrorDatabaseText(dpy, mtype, "AtomID", "AtomID 0x%x",
+ mesg, BUFSIZ);
+ else
+ XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
+ mesg, BUFSIZ);
+ fputs(" ", fp);
+ (void) fprintf(fp, mesg, event->resourceid);
+ fputs("\n", fp);
+ }
+ XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d",
+ mesg, BUFSIZ);
+ fputs(" ", fp);
+ (void) fprintf(fp, mesg, event->serial);
+ XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
+ mesg, BUFSIZ);
+ fputs("\n ", fp);
+ (void) fprintf(fp, mesg, dpy->request);
+ fputs("\n", fp);
+ if (event->error_code == BadImplementation) return 0;
+ return 1;
+}
+
+int _XDefaultError(Display *dpy, XErrorEvent *event)
+{
+ if (_XPrintDefaultError (dpy, event, stderr) == 0) return 0;
+ exit(1);
+ /*NOTREACHED*/
+}
+
+/*ARGSUSED*/
+Bool _XDefaultWireError(Display *display, XErrorEvent *he, xError *we)
+{
+ return True;
+}
+
+/*
+ * _XError - prepare to upcall user protocol error handler
+ */
+int _XError (Display *dpy, xError *rep)
+{
+ /*
+ * X_Error packet encountered! We need to unpack the error before
+ * giving it to the user.
+ */
+ XEvent event; /* make it a large event */
+
+ event.xerror.display = dpy;
+ event.xerror.type = X_Error;
+ event.xerror.serial = _XSetLastRequestRead(dpy, (xGenericReply *)rep);
+ event.xerror.resourceid = rep->resourceID;
+ event.xerror.error_code = rep->errorCode;
+ event.xerror.request_code = rep->majorCode;
+ event.xerror.minor_code = rep->minorCode;
+ if (dpy->error_vec &&
+ !(*dpy->error_vec[rep->errorCode])(dpy, &event.xerror, rep))
+ return 0;
+ if (_XErrorFunction != NULL) {
+ return ((*_XErrorFunction)(dpy, &event)); /* upcall */
+ } else {
+ return _XDefaultError(dpy, &event);
+ }
+}
+
+/*
+ * _XIOError - call user connection error handler and exit
+ */
+int _XIOError (Display *dpy)
+{
+ dpy->flags |= XlibDisplayIOError;
+ if (_XIOErrorFunction != NULL)
+ (*_XIOErrorFunction)(dpy);
+ else
+ _XDefaultIOError(dpy);
+ exit (1);
+}
+
+
+/*
+ * This routine can be used to (cheaply) get some memory within a single
+ * Xlib routine for scratch space. It is reallocated from the same place
+ * each time, unless the library needs a large scratch space.
+ */
+char *_XAllocScratch (Display *dpy, unsigned long nbytes)
+{
+ if (nbytes > dpy->scratch_length) {
+ if (dpy->scratch_buffer) Xfree (dpy->scratch_buffer);
+ if (dpy->scratch_buffer = Xmalloc((unsigned) nbytes))
+ dpy->scratch_length = nbytes;
+ else dpy->scratch_length = 0;
+ }
+ return (dpy->scratch_buffer);
+}
+
+/*
+ * Given a visual id, find the visual structure for this id on this display.
+ */
+Visual *_XVIDtoVisual (Display *dpy, VisualID id)
+{
+ register int i, j, k;
+ register Screen *sp;
+ register Depth *dp;
+ register Visual *vp;
+ for (i = 0; i < dpy->nscreens; i++) {
+ sp = &dpy->screens[i];
+ for (j = 0; j < sp->ndepths; j++) {
+ dp = &sp->depths[j];
+ /* if nvisuals == 0 then visuals will be NULL */
+ for (k = 0; k < dp->nvisuals; k++) {
+ vp = &dp->visuals[k];
+ if (vp->visualid == id) return (vp);
+ }
+ }
+ }
+ return (NULL);
+}
+
+void XFree (void *data)
+{
+ Xfree (data);
+}
+
+#ifdef _XNEEDBCOPYFUNC
+void _Xbcopy(char *b1, char *b2, length)
+{
+ if (b1 < b2) {
+ b2 += length;
+ b1 += length;
+ while (length--)
+ *--b2 = *--b1;
+ } else {
+ while (length--)
+ *b2++ = *b1++;
+ }
+}
+#endif
+
+#endif /* NEEDFORNX */
+
+void NXProcData (Display *dpy, char *data, long len)
+{
+ if (dpy->bufptr + (len) <= dpy->bufmax) {
+ bcopy(data, dpy->bufptr, (int)len);
+ dpy->bufptr += ((len) + 3) & ~3;
+ } else {
+ N_XSend(dpy, data, len);
+ }
+}
+
+
+#ifdef WORD64
+
+/*
+ * XXX This is a *really* stupid way of doing this. It should just use
+ * dpy->bufptr directly, taking into account where in the word it is.
+ */
+
+/*
+ * Data16 - Place 16 bit data in the buffer.
+ *
+ * "dpy" is a pointer to a Display.
+ * "data" is a pointer to the data.
+ * "len" is the length in bytes of the data.
+ */
+
+static void
+doData16(Display *dpy, short *data, unsigned len, char *packbuffer)
+{
+ long *lp,*lpack;
+ long i, nwords,bits;
+ long mask16 = 0x000000000000ffff;
+
+ lp = (long *)data;
+ lpack = (long *)packbuffer;
+
+/* nwords is the number of 16 bit values to be packed,
+ * the low order 16 bits of each word will be packed
+ * into 64 bit words
+ */
+ nwords = len >> 1;
+ bits = 48;
+
+ for(i=0;i<nwords;i++){
+ if (bits == 48) *lpack = 0;
+ *lpack ^= (*lp & mask16) << bits;
+ bits -= 16 ;
+ lp++;
+ if(bits < 0){
+ lpack++;
+ bits = 48;
+ }
+ }
+ Data(dpy, packbuffer, len);
+}
+
+void
+Data16 (Display *dpy, short *data, unsigned len)
+{
+ char packbuffer[PACKBUFFERSIZE];
+ unsigned nunits = PACKBUFFERSIZE >> 1;
+
+ for (; len > PACKBUFFERSIZE; len -= PACKBUFFERSIZE, data += nunits) {
+ doData16 (dpy, data, PACKBUFFERSIZE, packbuffer);
+ }
+ if (len) doData16 (dpy, data, len, packbuffer);
+}
+
+/*
+ * Data32 - Place 32 bit data in the buffer.
+ *
+ * "dpy" is a pointer to a Display.
+ * "data" is a pointer to the data.
+ * "len" is the length in bytes of the data.
+ */
+
+static doData32 (Display *dpy, long *data, unsigned len, char *packbuffer)
+{
+ long *lp,*lpack;
+ long i,bits,nwords;
+ long mask32 = 0x00000000ffffffff;
+
+ lpack = (long *) packbuffer;
+ lp = data;
+
+/* nwords is the number of 32 bit values to be packed
+ * the low order 32 bits of each word will be packed
+ * into 64 bit words
+ */
+ nwords = len >> 2;
+ bits = 32;
+
+ for(i=0;i<nwords;i++){
+ if (bits == 32) *lpack = 0;
+ *lpack ^= (*lp & mask32) << bits;
+ bits = bits ^32;
+ lp++;
+ if(bits)
+ lpack++;
+ }
+ Data(dpy, packbuffer, len);
+}
+
+Data32 (Display *dpy, long *data, unsigned len)
+{
+ char packbuffer[PACKBUFFERSIZE];
+ unsigned nunits = PACKBUFFERSIZE >> 2;
+
+ for (; len > PACKBUFFERSIZE; len -= PACKBUFFERSIZE, data += nunits) {
+ doData32 (dpy, data, PACKBUFFERSIZE, packbuffer);
+ }
+ if (len) doData32 (dpy, data, len, packbuffer);
+}
+
+#endif /* WORD64 */
+
+
+#ifdef NEEDFORNX
+
+/*
+ * _XFreeQ - free the queue of events, called by XCloseDisplay
+ */
+
+void _XFreeQ (void)
+{
+ register _XQEvent *qelt = _qfree;
+
+ while (qelt) {
+ register _XQEvent *qnxt = qelt->next;
+ Xfree ((char *) qelt);
+ qelt = qnxt;
+ }
+ _qfree = NULL;
+ return;
+}
+#endif /* NEEDFORNX */
+
+/* Make sure this produces the same string as DefineLocal/DefineSelf in xdm.
+ * Otherwise, Xau will not be able to find your cookies in the Xauthority file.
+ *
+ * Note: POSIX says that the ``nodename'' member of utsname does _not_ have
+ * to have sufficient information for interfacing to the network,
+ * and so, you may be better off using gethostname (if it exists).
+ */
+
+#if (defined(_POSIX_SOURCE) && !defined(AIXV3)) || defined(hpux) || defined(USG) || defined(SVR4)
+#define NEED_UTSNAME
+#include <sys/utsname.h>
+#endif
+
+/*
+ * N_XGetHostname - similar to gethostname but allows special processing.
+ */
+int N_XGetHostname (char *buf, int maxlen)
+{
+ int len;
+
+#ifdef NEED_UTSNAME
+ struct utsname name;
+
+ uname (&name);
+ len = strlen (name.nodename);
+ if (len >= maxlen) len = maxlen - 1;
+ strncpy (buf, name.nodename, len);
+ buf[len] = '\0';
+#else
+ buf[0] = '\0';
+ (void) gethostname (buf, maxlen);
+ buf [maxlen - 1] = '\0';
+ len = strlen(buf);
+#endif /* NEED_UTSNAME */
+ return len;
+}
+
+#ifdef NEEDFORNX
+/*
+ * _XScreenOfWindow - get the Screen of a given window
+ */
+
+Screen *_XScreenOfWindow (Display *dpy, Window w)
+{
+ register int i;
+ Window root;
+ int x, y; /* dummy variables */
+ unsigned int width, height, bw, depth; /* dummy variables */
+
+ if (XGetGeometry (dpy, w, &root, &x, &y, &width, &height,
+ &bw, &depth) == False) {
+ return None;
+ }
+ for (i = 0; i < ScreenCount (dpy); i++) { /* find root from list */
+ if (root == RootWindow (dpy, i)) {
+ return ScreenOfDisplay (dpy, i);
+ }
+ }
+ return NULL;
+}
+#endif /* NEEDFORNX */
+
+#if (MSKCNT > 4)
+/*
+ * This is a macro if MSKCNT <= 4
+ */
+int
+N_XANYSET(unsigned long *src)
+{
+ int i;
+
+ for (i=0; i<MSKCNT; i++)
+ if (src[ i ])
+ return (1);
+ return (0);
+}
+#endif
+
+#ifdef NEEDFORNX
+#ifdef CRAY
+/*
+ * Cray UniCOS does not have readv and writev so we emulate
+ */
+#include <sys/socket.h>
+
+int _XReadV (int fd, struct iovec *iov, int iovcnt)
+{
+ struct msghdr hdr;
+
+ hdr.msg_iov = iov;
+ hdr.msg_iovlen = iovcnt;
+ hdr.msg_accrights = 0;
+ hdr.msg_accrightslen = 0;
+ hdr.msg_name = 0;
+ hdr.msg_namelen = 0;
+
+ return (recvmsg (fd, &hdr, 0));
+}
+
+int _XWriteV (int fd, struct iovec *iov, int iovcnt)
+{
+ struct msghdr hdr;
+
+ hdr.msg_iov = iov;
+ hdr.msg_iovlen = iovcnt;
+ hdr.msg_accrights = 0;
+ hdr.msg_accrightslen = 0;
+ hdr.msg_name = 0;
+ hdr.msg_namelen = 0;
+
+ return (sendmsg (fd, &hdr, 0));
+}
+
+#endif /* CRAY */
+
+#if defined(SYSV) && defined(i386) && !defined(STREAMSCONN)
+/*
+ * SYSV/386 does not have readv so we emulate
+ */
+#include <sys/uio.h>
+
+int _XReadV (int fd, struct iovec *iov, int iovcnt)
+{
+ int i, len, total;
+ char *base;
+
+ errno = 0;
+ for (i=0, total=0; i<iovcnt; i++, iov++) {
+ len = iov->iov_len;
+ base = iov->iov_base;
+ while (len > 0) {
+ register int nbytes;
+ nbytes = read(fd, base, len);
+ if (nbytes < 0 && total == 0) return -1;
+ if (nbytes <= 0) return total;
+ errno = 0;
+ len -= nbytes;
+ total += nbytes;
+ base += nbytes;
+ }
+ }
+ return total;
+}
+
+#endif /* SYSV && i386 && !STREAMSCONN */
+
+#ifdef STREAMSCONN
+/*
+ * Copyright 1988, 1989 AT&T, Inc.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of AT&T not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. AT&T makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * AT&T DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL AT&T
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+/*
+ iovec.c (C source file)
+ Acc: 575557389 Mon Mar 28 08:03:09 1988
+ Mod: 575557397 Mon Mar 28 08:03:17 1988
+ Sta: 575557397 Mon Mar 28 08:03:17 1988
+ Owner: 2011
+ Group: 1985
+ Permissions: 664
+*/
+/*
+ START USER STAMP AREA
+*/
+/*
+ END USER STAMP AREA
+*/
+
+
+extern char _XsTypeofStream[];
+extern Xstream _XsStream[];
+
+#define MAX_WORKAREA 4096
+static char workarea[MAX_WORKAREA];
+
+
+
+int
+_XReadV (int fd, struct iovec v[], int n)
+{
+ int i, rc, len, size = 0;
+ char * buf = workarea;
+ char * p;
+
+ if (n <= 0 || n > 16)
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ for (i = 0; i < n; ++i)
+ {
+ if ((len = v[i].iov_len) < 0 || v[i].iov_base == NULL)
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ size += len;
+ }
+ if ((size > MAX_WORKAREA) && ((buf = malloc (size)) == NULL))
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ if((rc = (*_XsStream[_XsTypeOfStream[fd]].ReadFromStream)(fd, buf, size,
+ BUFFERING))> 0)
+ {
+ for (i = 0, p = buf; i < n; ++i)
+ {
+ memcpy (v[i].iov_base, p, len = v[i].iov_len);
+ p += len;
+ }
+ }
+ if (size > MAX_WORKAREA)
+ free (buf);
+
+ return (rc);
+}
+
+int
+_XWriteV (int fd, struct iovec v[], int n)
+{
+ int i, rc, len, size = 0;
+ char * buf = workarea;
+ char * p;
+
+ if (n <= 0 || n > 16)
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ for (i = 0; i < n; ++i)
+ {
+ if ((len = v[i].iov_len) < 0 || v[i].iov_base == NULL)
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ size += len;
+ }
+
+ if ((size > MAX_WORKAREA) && ((buf = malloc (size)) == NULL))
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ for (i = 0, p = buf; i < n; ++i)
+ {
+ memcpy (p, v[i].iov_base, len = v[i].iov_len);
+ p += len;
+ }
+ rc = (*_XsStream[_XsTypeOfStream[fd]].WriteToStream)(fd, buf, size);
+
+ if (size > MAX_WORKAREA)
+ free (buf);
+
+ return (rc);
+}
+
+
+
+#endif /* STREAMSCONN */
+#endif /* NEEDFORNX */
diff --git a/nx-X11/lib/dps/cslibint.h b/nx-X11/lib/dps/cslibint.h
new file mode 100644
index 000000000..b16770504
--- /dev/null
+++ b/nx-X11/lib/dps/cslibint.h
@@ -0,0 +1,302 @@
+/*
+ * cslibint.h -- low level I/O
+ *
+ * (c) Copyright 1993-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Portions Copyright 1984, 1985, 1987, 1989 Massachusetts Institute of
+ * Technology
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * Author: Adobe Systems Incorporated and MIT X Consortium
+ */
+/* $XFree86: xc/lib/dps/cslibint.h,v 1.3 2001/06/30 22:41:44 tsi Exp $ */
+
+/*
+ * XlibInternal.h - Header definition and support file for the internal
+ * support routines (XlibInternal) used by the C subroutine interface
+ * library (Xlib) to the X Window System.
+ *
+ * Warning, there be dragons here....
+ */
+
+#ifndef _CSLIBINT_H
+#define _CSLIBINT_H
+
+#include <X11/Xlibint.h>
+#include <X11/Xutil.h>
+
+/* For SYSV, no gethostname, so fake it */
+#include <sys/param.h>
+#if defined(__SCO__)
+/* SCO systems define MAXHOSTNAMELEN here */
+#include <sys/socket.h>
+#endif
+
+#ifndef MAXHOSTNAMELEN
+#define MAXHOSTNAMELEN 64
+#endif
+
+
+/* === MACROS === */
+
+/*
+ * GetReq - Get the next avilable X request packet in the buffer and
+ * return it.
+ *
+ * "name" is the name of the request, e.g. CreatePixmap, OpenFont, etc.
+ * "req" is the name of the request pointer.
+ *
+ */
+
+#if !defined(UNIXCPP)
+#define NXMacroGetReq(name, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(x##name##Req)) > dpy->bufmax)\
+ {if (dpy != xdpy) N_XFlush(dpy); else _XFlush(dpy);}\
+ req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
+ req->reqType = X_##name;\
+ req->length = (SIZEOF(x##name##Req))>>2;\
+ dpy->bufptr += SIZEOF(x##name##Req);\
+ dpy->request++
+
+#else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
+#define NXMacroGetReq(name, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(x/**/name/**/Req)) > dpy->bufmax)\
+ {if (dpy != xdpy) N_XFlush(dpy); else _XFlush(dpy);}\
+ req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
+ req->reqType = X_/**/name;\
+ req->length = (SIZEOF(x/**/name/**/Req))>>2;\
+ dpy->bufptr += SIZEOF(x/**/name/**/Req);\
+ dpy->request++
+#endif
+
+#ifdef NEEDFORNX
+
+/* GetReqExtra is the same as GetReq, but allocates "n" additional
+ bytes after the request. "n" must be a multiple of 4! */
+
+#if !defined(UNIXCPP)
+#define GetReqExtra(name, n, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(x##name##Req) + n) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
+ req->reqType = X_##name;\
+ req->length = (SIZEOF(x##name##Req) + n)>>2;\
+ dpy->bufptr += SIZEOF(x##name##Req) + n;\
+ dpy->request++
+#else
+#define GetReqExtra(name, n, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(x/**/name/**/Req) + n) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
+ req->reqType = X_/**/name;\
+ req->length = (SIZEOF(x/**/name/**/Req) + n)>>2;\
+ dpy->bufptr += SIZEOF(x/**/name/**/Req) + n;\
+ dpy->request++
+#endif
+
+
+/*
+ * GetResReq is for those requests that have a resource ID
+ * (Window, Pixmap, GContext, etc.) as their single argument.
+ * "rid" is the name of the resource.
+ */
+
+#if !defined(UNIXCPP)
+#define GetResReq(name, rid, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(xResourceReq)) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (xResourceReq *) (dpy->last_req = dpy->bufptr);\
+ req->reqType = X_##name;\
+ req->length = 2;\
+ req->id = (rid);\
+ dpy->bufptr += SIZEOF(xResourceReq);\
+ dpy->request++
+#else
+#define GetResReq(name, rid, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(xResourceReq)) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (xResourceReq *) (dpy->last_req = dpy->bufptr);\
+ req->reqType = X_/**/name;\
+ req->length = 2;\
+ req->id = (rid);\
+ dpy->bufptr += SIZEOF(xResourceReq);\
+ dpy->request++
+#endif
+
+/*
+ * GetEmptyReq is for those requests that have no arguments
+ * at all.
+ */
+#if !defined(UNIXCPP)
+#define GetEmptyReq(name, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(xReq)) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (xReq *) (dpy->last_req = dpy->bufptr);\
+ req->reqType = X_##name;\
+ req->length = 1;\
+ dpy->bufptr += SIZEOF(xReq);\
+ dpy->request++
+#else
+#define GetEmptyReq(name, req) \
+ WORD64ALIGN\
+ if ((dpy->bufptr + SIZEOF(xReq)) > dpy->bufmax)\
+ _XFlush(dpy);\
+ req = (xReq *) (dpy->last_req = dpy->bufptr);\
+ req->reqType = X_/**/name;\
+ req->length = 1;\
+ dpy->bufptr += SIZEOF(xReq);\
+ dpy->request++
+#endif
+
+
+#define SyncHandle() \
+ if (dpy->synchandler) (*dpy->synchandler)(dpy)
+
+#define FlushGC(dpy, gc) \
+ if ((gc)->dirty) _XFlushGCCache((dpy), (gc))
+/*
+ * Data - Place data in the buffer and pad the end to provide
+ * 32 bit word alignment. Transmit if the buffer fills.
+ *
+ * "dpy" is a pointer to a Display.
+ * "data" is a pinter to a data buffer.
+ * "len" is the length of the data buffer.
+ * we can presume buffer less than 2^16 bytes, so bcopy can be used safely.
+ */
+#ifndef DataRoutineIsProcedure
+#define Data(dpy, data, len) \
+ if (dpy->bufptr + (len) <= dpy->bufmax) {\
+ bcopy(data, dpy->bufptr, (int)len);\
+ dpy->bufptr += ((len) + 3) & ~3;\
+ } else\
+ _XSend(dpy, data, len)
+#endif /* DataRoutineIsProcedure */
+
+
+/* Allocate bytes from the buffer. No padding is done, so if
+ * the length is not a multiple of 4, the caller must be
+ * careful to leave the buffer aligned after sending the
+ * current request.
+ *
+ * "type" is the type of the pointer being assigned to.
+ * "ptr" is the pointer being assigned to.
+ * "n" is the number of bytes to allocate.
+ *
+ * Example:
+ * xTextElt *elt;
+ * BufAlloc (xTextElt *, elt, nbytes)
+ */
+
+#define BufAlloc(type, ptr, n) \
+ if (dpy->bufptr + (n) > dpy->bufmax) \
+ _XFlush (dpy); \
+ ptr = (type) dpy->bufptr; \
+ dpy->bufptr += (n);
+
+/*
+ * provide emulation routines for smaller architectures
+ */
+#ifndef WORD64
+#define Data16(dpy, data, len) Data((dpy), (char *)(data), (len))
+#define Data32(dpy, data, len) Data((dpy), (char *)(data), (len))
+#define _XRead16Pad(dpy, data, len) _XReadPad((dpy), (char *)(data), (len))
+#define _XRead16(dpy, data, len) _XRead((dpy), (char *)(data), (len))
+#define _XRead32(dpy, data, len) _XRead((dpy), (char *)(data), (len))
+#endif /* not WORD64 */
+
+#define PackData16(dpy,data,len) Data16 (dpy, data, len)
+#define PackData32(dpy,data,len) Data32 (dpy, data, len)
+
+/* Xlib manual is bogus */
+#define PackData(dpy,data,len) PackData16 (dpy, data, len)
+
+
+
+#endif /* NEEDFORNX */
+
+#if !defined(STARTITERATE) && !defined(WORD64)
+
+#define STARTITERATE(tpvar,type,start,endcond,decr) \
+ for (tpvar = (type *) start; endcond; tpvar++, decr) {
+#define ENDITERATE }
+
+#endif /* STARTITERATE */
+
+
+#ifndef WORD64
+#undef Data32
+#define Data32(dpy, data, len) NXProcData((dpy), (char *)(data), (len))
+#endif /* not WORD64 */
+
+extern int gNXSyncGCMode;
+
+/* extension hooks */
+
+extern Bool N_XUnknownWireEvent(Display *, XEvent *, xEvent *);
+extern Status N_XReply(Display *, xReply *, int, Bool);
+extern Status N_XUnknownNativeEvent(Display *, XEvent *, xEvent *);
+extern int DPSCAPConnect( char *, char **, int *, int *, int *, char **);
+extern int N_XDisconnectDisplay(int);
+extern int N_XGetHostname (char *, int);
+extern int N_XRead(Display*, char *, long);
+extern void NXProcData (Display *, char *, long);
+extern void N_XFlush(Display *);
+extern void N_XReadPad(Display*, char *, long);
+extern void N_XSend(Display *, _Xconst char *, long);
+extern void N_XWaitForReadable(Display *);
+extern void N_XWaitForWritable(Display *);
+
+extern void XDPSGetDefaultColorMaps(
+ Display *dpy,
+ Screen *screen,
+ Drawable drawable,
+ XStandardColormap *colorCube,
+ XStandardColormap *grayRamp);
+
+#endif /* _CSLIBINT_H */
+
diff --git a/nx-X11/lib/dps/csopendi.c b/nx-X11/lib/dps/csopendi.c
new file mode 100644
index 000000000..c0eb1d373
--- /dev/null
+++ b/nx-X11/lib/dps/csopendi.c
@@ -0,0 +1,567 @@
+/*
+ * csopendi.c -- open connection to CSDPS agent
+ *
+ * (c) Copyright 1990-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Portions Copyright Massachusetts Institute of Technology 1985, 1986
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * Author: Adobe Systems Incorporated and MIT X Consortium
+ */
+/* $XFree86$ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/param.h> /* for MAXHOSTNAMELEN */
+#define NEED_EVENTS
+#include <X11/Xlibint.h>
+#include <X11/Xos.h>
+#include "cslibint.h"
+#ifdef XXX
+#include <X11/Xauth.h>
+#include <X11/Xatom.h>
+
+extern int _Xdebug;
+extern Display *_XHeadOfDisplayList;
+
+#ifndef lint
+static int lock; /* get rid of ifdefs when locking implemented */
+#endif
+
+#endif /* XXX */
+
+#include <X11/X.h>
+#include <X11/Xproto.h>
+
+#include "DPSCAPClient.h"
+#include <DPS/dpsXclient.h>
+#include <DPS/dpsNXargs.h>
+#include "dpsassert.h"
+#include "dpsNXprops.h"
+#include "csfindNX.h"
+#include "csstartNX.h"
+
+#ifdef DPSLNKL
+#include "dpslnkl.inc"
+#endif /* DPSLNKL */
+
+
+/* +++ Someday make this common with XDPS.c version */
+#define DPY_NUMBER(dpy) ((dpy)->fd)
+
+static xReq _dummy_request = {
+ 0, 0, 0
+};
+
+static void OutOfMemory (Display *);
+
+#ifdef XXX
+/*
+ * First, a routine for setting authorization data
+ */
+static int xauth_namelen = 0;
+static char *xauth_name = NULL; /* NULL means use default mechanism */
+static int xauth_datalen = 0;
+static char *xauth_data = NULL; /* NULL means get default data */
+
+void XSetAuthorization (char *name, int namelen, char *data, int datalen)
+{
+ char *tmpname, *tmpdata;
+
+ if (xauth_name) Xfree (xauth_name); /* free any existing data */
+ if (xauth_data) Xfree (xauth_data);
+
+ xauth_name = xauth_data = NULL; /* mark it no longer valid */
+ xauth_namelen = xauth_datalen = 0;
+
+ if (namelen < 0) namelen = 0; /* check for bogus inputs */
+ if (datalen < 0) datalen = 0; /* maybe should return? */
+
+ if (namelen > 0) { /* try to allocate space */
+ tmpname = Xmalloc ((unsigned) namelen);
+ if (!tmpname) return;
+ bcopy (name, tmpname, namelen);
+ } else {
+ tmpname = NULL;
+ }
+
+ if (datalen > 0) {
+ tmpdata = Xmalloc ((unsigned) datalen);
+ if (!tmpdata) {
+ if (tmpname) (void) Xfree (tmpname);
+ return;
+ }
+ bcopy (data, tmpdata, datalen);
+ } else {
+ tmpdata = NULL;
+ }
+
+ xauth_name = tmpname; /* and store the suckers */
+ xauth_namelen = namelen;
+ xauth_data = tmpdata;
+ xauth_datalen = datalen;
+ return;
+}
+
+#endif /* XXX */
+
+/*
+ * Connects to a server, creates a Display object and returns a pointer to
+ * the newly created Display back to the caller.
+ */
+XExtData *
+DPSCAPOpenAgent(Display *dpy, char *trueDisplayName)
+{
+ register Display *agent;
+ char *agentHost = (char *)NULL;
+ register int i;
+ char display_name[256]; /* pointer to display name */
+ char licMethBuf[256];
+ char *licMeth = licMethBuf;
+ char *fullname = NULL;
+ int idisplay;
+ char *server_addr = NULL;
+ int server_addrlen = 0;
+ int conn_family;
+ int transport, port;
+ XExtData *ext;
+ DPSCAPData my;
+ char hostname[MAXHOSTNAMELEN];
+
+/*
+ * Find an agent to talk to.
+ */
+#ifdef DPSLNKL
+ extern unsigned ANXPFunc();
+#ifdef PSUSEPN
+ (void) sprintf(licMeth, "%s%s:%d",
+ LICENSE_METHOD_PREFIX,
+ ANXVENDOR, /* From dpslnkl.inc */
+ ANXPFunc());
+#else /* PSUSEPN */
+ (void) sprintf(licMeth, "%s%s",
+ LICENSE_METHOD_PREFIX,
+ ANXVENDOR); /* From dpslnkl.inc */
+#endif /* PSUSEPN */
+#else /* DPSLNKL */
+ licMeth = NULL; /* We want an open service */
+#endif /* DPSLNKL */
+ (void) N_XGetHostname(hostname, MAXHOSTNAMELEN);
+ switch(XDPSNXFindNX(dpy, licMeth, &agentHost, &transport, &port)) {
+ case findnx_not_found: {
+ /* try to start-up an NX? */
+ Bool autoLaunch;
+
+ XDPSGetNXArg(XDPSNX_AUTO_LAUNCH, (void **) &autoLaunch);
+ if (autoLaunch == True) {
+ int requestedTrans;
+ int requestedPort = 0;
+ char **args = NULL;
+ char *additionalArgs[2];
+ char transportArg[256];
+
+ (void) DPSWarnProc(NULL, "Auto-launching DPS NX agent.");
+ XDPSGetNXArg(XDPSNX_LAUNCHED_AGENT_TRANS, (void **) &requestedTrans);
+ if (requestedTrans == XDPSNX_USE_BEST) {
+ XDPSNXSetClientArg(XDPSNX_LAUNCHED_AGENT_TRANS,
+ (void *)XDPSNX_TRANS_UNIX);
+ requestedTrans = XDPSNX_TRANS_UNIX;
+ }
+ /* cons-up an arg. to pass to Agent we are forking */
+
+ additionalArgs[1] = (char *) NULL;
+ additionalArgs[0] = transportArg;
+ XDPSGetNXArg(XDPSNX_LAUNCHED_AGENT_PORT, (void **) &requestedPort);
+ if (requestedPort == XDPSNX_USE_BEST) {
+ requestedPort = XDPSNXRecommendPort(requestedTrans);
+ if (requestedPort < 0) {
+ DPSWarnProc(NULL, "Auto-launcher can't get a port.");
+ return(NULL);
+ }
+ }
+ (void) sprintf(transportArg, "%s/%d",
+ (requestedTrans == XDPSNX_TRANS_DECNET ?
+ "dec" : "tcp"),
+ requestedPort);
+ args = additionalArgs;
+ /* ASSERT: first argument in additionalArgs must be
+ transport/port, unless agent changes to take this
+ anywhere */
+ if (StartXDPSNX(args) != Success) {
+ char tb[256], *fs, **as;
+ (void) XDPSGetNXArg(XDPSNX_EXEC_FILE, (void **) &fs);
+ (void) XDPSGetNXArg(XDPSNX_EXEC_ARGS, (void **) &as);
+ (void) sprintf(tb, "FAILED to auto-launch:\n %s", fs);
+ if (as != NULL)
+ for (; *as != NULL; as++) {
+ if ((int) (strlen(*as) + 1 + (i = strlen(tb))) > 256-1) {
+ if (i > 256-1-4)
+ strcpy(&(tb[256-1-1-4]), " ...");
+ else
+ strcat(tb, " ...");
+ break;
+ }
+ (void) strcat(tb, " ");
+ (void) strcat(tb, *as);
+ }
+ DPSWarnProc(NULL, tb);
+ return(NULL);
+ } else {
+ (void) sprintf(display_name, "%s%s%d", hostname,
+ (requestedTrans == XDPSNX_TRANS_DECNET ?
+ "::" : ":"),
+ requestedPort);
+ }
+ } else { /* autoLaunch != True */
+ return(NULL);
+ }
+ }
+ break;
+ case findnx_found: { /* XDPSNXFindNX() == Success */
+ (void) sprintf(display_name, "%s%s%d",
+ (transport == XDPSNX_TRANS_UNIX ?
+ "unix" : agentHost),
+ (transport == XDPSNX_TRANS_DECNET ? "::" : ":"),
+ port);
+ /* Free agentHost later */
+ }
+ break;
+ case findnx_error:
+ return(NULL);
+ break;
+ default:
+ DPSFatalProc(NULL, "Illegal value returned by XDPSNXFindNX");
+ break;
+ }
+
+
+/*
+ * Attempt to allocate a display structure. Return NULL if allocation fails.
+ */
+ if ((agent = (Display *)Xcalloc(1, sizeof(Display))) == NULL) {
+ return(NULL);
+ }
+
+/*
+ * Call the Connect routine to get the network socket. If -1 is returned, the
+ * connection failed. The connect routine will set fullname to point to the
+ * expanded name.
+ */
+
+ if ((agent->fd = DPSCAPConnect(display_name, &fullname, &idisplay,
+ &conn_family,
+ &server_addrlen, &server_addr)) < 0) {
+ Xfree ((char *) agent);
+ return(NULL);
+ }
+#ifdef XXX
+/*
+ * Look up the authorization protocol name and data if necessary.
+ */
+ if (xauth_name && xauth_data) {
+ conn_auth_namelen = xauth_namelen;
+ conn_auth_name = xauth_name;
+ conn_auth_datalen = xauth_datalen;
+ conn_auth_data = xauth_data;
+ } else {
+ char dpynumbuf[40]; /* big enough to hold 2^64 and more */
+ (void) sprintf (dpynumbuf, "%d", idisplay);
+
+ authptr = XauGetAuthByAddr ((unsigned short) conn_family,
+ (unsigned short) server_addrlen,
+ server_addr,
+ (unsigned short) strlen (dpynumbuf),
+ dpynumbuf,
+ (unsigned short) xauth_namelen,
+ xauth_name);
+ if (authptr) {
+ conn_auth_namelen = authptr->name_length;
+ conn_auth_name = (char *)authptr->name;
+ conn_auth_datalen = authptr->data_length;
+ conn_auth_data = (char *)authptr->data;
+ } else {
+ conn_auth_namelen = 0;
+ conn_auth_name = NULL;
+ conn_auth_datalen = 0;
+ conn_auth_data = NULL;
+ }
+ }
+#ifdef HASDES
+ /*
+ * build XDM-AUTHORIZATION-1 data
+ */
+ if (conn_auth_namelen == 19 &&
+ !strncmp (conn_auth_name, "XDM-AUTHORIZATION-1", 19))
+ {
+ static char encrypted_data[192/8];
+ int i, j;
+ struct sockaddr_in in_addr;
+ int addrlen;
+ long now;
+
+ j = 0;
+ for (i = 0; i < 8; i++)
+ {
+ encrypted_data[j] = conn_auth_data[i];
+ j++;
+ }
+ addrlen = sizeof (in_addr);
+ getsockname (dpy->fd, (struct sockaddr *) &in_addr, &addrlen);
+ if (in_addr.sin_family == 2)
+ {
+ encrypted_data[j] = in_addr.sin_addr.s_net; j++;
+ encrypted_data[j] = in_addr.sin_addr.s_host; j++;
+ encrypted_data[j] = in_addr.sin_addr.s_lh; j++;
+ encrypted_data[j] = in_addr.sin_addr.s_impno; j++;
+ encrypted_data[j] = (in_addr.sin_port >> 8) & 0xff; j++;
+ encrypted_data[j] = (in_addr.sin_port) & 0xff; j++;
+ }
+ else
+ {
+ encrypted_data[j] = 0xff; j++;
+ encrypted_data[j] = 0xff; j++;
+ encrypted_data[j] = 0xff; j++;
+ encrypted_data[j] = 0xff; j++;
+ i = getpid ();
+ encrypted_data[j] = (i >> 8) & 0xff; j++;
+ encrypted_data[j] = (i) & 0xff; j++;
+ }
+ time (&now);
+ for (i = 3; i >= 0; i--)
+ {
+ encrypted_data[j] = (now >> (i * 8)) & 0xff;
+ j++;
+ }
+ XdmcpEncrypt (encrypted_data, conn_auth_data + 8,
+ encrypted_data, 192/8);
+ conn_auth_data = encrypted_data;
+ conn_auth_datalen = 192 / 8;
+ }
+#endif /* HASDES */
+ if (server_addr) (void) Xfree (server_addr);
+
+#endif /* XXX */
+
+/*
+ * We succeeded at authorization, so let us move the data into
+ * the display structure.
+ */
+ agent->lock_meaning = NoSymbol;
+#ifdef XXX
+ /* this field is not present in post X11R5 */
+ agent->current = None;
+#endif
+ agent->event_vec[X_Error] = N_XUnknownWireEvent;
+ agent->event_vec[X_Reply] = N_XUnknownWireEvent;
+ agent->wire_vec[X_Error] = N_XUnknownNativeEvent;
+ agent->wire_vec[X_Reply] = N_XUnknownNativeEvent;
+ for (i = KeyPress; i < 128; i++) {
+ agent->event_vec[i] = N_XUnknownWireEvent;
+ agent->wire_vec[i] = N_XUnknownNativeEvent;
+ }
+ agent->cursor_font = None;
+ agent->last_req = (char *)&_dummy_request;
+
+ /* Salt away the host:display string for later use.
+ Storage owned by agent, Xmalloc'd by connection
+ call above */
+ agent->display_name = fullname;
+
+ /* Set up the output buffers. */
+ if ((agent->bufptr = agent->buffer = Xmalloc(BUFSIZE)) == NULL) {
+ OutOfMemory (dpy);
+ return(NULL);
+ }
+ agent->bufmax = agent->buffer + BUFSIZE;
+
+
+ /* Create extension data */
+
+ my = DPSCAPCreate(dpy, agent);
+ if (my == (DPSCAPData)NULL)
+ {
+ OutOfMemory(agent);
+ return(NULL);
+ }
+ ext = (XExtData *)Xcalloc(1, sizeof(XExtData));
+ ext->private_data = (char *)my;
+
+ /* Parse names to get true display name */
+ if (agentHost && strcmp(hostname, agentHost))
+ {
+ register char *s, *p;
+ char *dxname;
+ char nametmp[MAXHOSTNAMELEN];
+ /* Agent is not on the same host as client, so fix
+ up the stupid abbreviations used for the display,
+ and whoever came up with the syntax should be shot. */
+ dxname = DisplayString(dpy);
+ for (s = dxname, p = nametmp; *s; ++s)
+ if (*s == ':')
+ break;
+ else
+ *p++ = *s;
+ *p = '\0';
+ if (nametmp[0] == '\0'
+ || !strcmp(nametmp, "unix")
+ || !strcmp(nametmp, "localhost"))
+ {
+ strcpy(trueDisplayName, hostname);
+ if (*s)
+ strcat(trueDisplayName, s);
+ else
+ strcat(trueDisplayName, ":0.0");
+ }
+ else
+ strcpy(trueDisplayName, dxname);
+ }
+ else
+ strcpy(trueDisplayName, DisplayString(dpy));
+ if (agentHost)
+ Xfree(agentHost);
+ return(ext);
+}
+
+
+/* OutOfMemory is called if malloc fails. XOpenDisplay returns NULL
+ after this returns. */
+
+static void OutOfMemory (Display *dpy)
+{
+ DPSCAPCloseAgent(dpy);
+}
+
+#ifdef NEEDFORNX
+/* XFreeDisplayStructure frees all the storage associated with a
+ * Display. It is used by XOpenDisplay if it runs out of memory,
+ * and also by XCloseDisplay. It needs to check whether all pointers
+ * are non-NULL before dereferencing them, since it may be called
+ * by XOpenDisplay before the Display structure is fully formed.
+ * XOpenDisplay must be sure to initialize all the pointers to NULL
+ * before the first possible call on this.
+ */
+
+static void
+_XFreeDisplayStructure(register Display *dpy)
+{
+ if (dpy->screens) {
+ register int i;
+
+ for (i = 0; i < dpy->nscreens; i++) {
+ Screen *sp = &dpy->screens[i];
+
+ if (sp->depths) {
+ register int j;
+
+ for (j = 0; j < sp->ndepths; j++) {
+ Depth *dp = &sp->depths[j];
+
+ if (dp->visuals) {
+ register int k;
+
+ for (k = 0; k < dp->nvisuals; k++)
+ _XFreeExtData (dp->visuals[k].ext_data);
+ Xfree ((char *) dp->visuals);
+ }
+ }
+
+ Xfree ((char *) sp->depths);
+ }
+
+ _XFreeExtData (sp->ext_data);
+ }
+
+ Xfree ((char *)dpy->screens);
+ }
+
+ if (dpy->pixmap_format) {
+ register int i;
+
+ for (i = 0; i < dpy->nformats; i++)
+ _XFreeExtData (dpy->pixmap_format[i].ext_data);
+ Xfree ((char *)dpy->pixmap_format);
+ }
+
+ if (dpy->display_name)
+ Xfree (dpy->display_name);
+ if (dpy->vendor)
+ Xfree (dpy->vendor);
+
+ if (dpy->buffer)
+ Xfree (dpy->buffer);
+ if (dpy->atoms)
+ Xfree ((char *) dpy->atoms);
+ if (dpy->keysyms)
+ Xfree ((char *) dpy->keysyms);
+ if (dpy->modifiermap)
+ XFreeModifiermap(dpy->modifiermap);
+ if (dpy->xdefaults)
+ Xfree (dpy->xdefaults);
+ if (dpy->key_bindings)
+ _XFreeKeyBindings(dpy);
+
+ while (dpy->ext_procs) {
+ _XExtension *ext = dpy->ext_procs;
+ dpy->ext_procs = ext->next;
+ if (ext->name)
+ Xfree (ext->name);
+ Xfree ((char *)ext);
+ }
+
+ _XFreeExtData (dpy->ext_data);
+
+ Xfree ((char *)dpy);
+}
+#endif /* NEEDFORNX */
+
+
+
+void
+DPSCAPCloseAgent(Display *agent)
+{
+ if (!agent) return;
+ N_XDisconnectDisplay(agent->fd);
+ if (agent->display_name)
+ Xfree(agent->display_name);
+ if (agent->buffer)
+ Xfree(agent->buffer);
+ Xfree((char *)agent);
+}
diff --git a/nx-X11/lib/dps/csstartNX.c b/nx-X11/lib/dps/csstartNX.c
new file mode 100644
index 000000000..0db2cbe5b
--- /dev/null
+++ b/nx-X11/lib/dps/csstartNX.c
@@ -0,0 +1,237 @@
+/*
+ csstartNX.c
+
+ * (c) Copyright 1992-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86: xc/lib/dps/csstartNX.c,v 1.6 2001/10/28 03:32:43 tsi Exp $ */
+
+#include <sys/param.h>
+#include <X11/X.h>
+#include <X11/Xlibint.h>
+#include <sys/wait.h>
+#include <DPS/dpsNXargs.h>
+#include <sys/socket.h>
+#include <errno.h>
+#include <X11/Xos.h>
+
+#include "DPSCAPproto.h"
+#include "Xlibnet.h" /* New for R5, delete for R4 */
+#include "dpsassert.h"
+#include "csfindNX.h"
+#include "csstartNX.h"
+
+/* ---Defines--- */
+
+#include <stddef.h>
+
+#define DOZETIME 1 /* time to wait for agent to start up (sec) */
+
+#define BASE_TCP_PORT CSDPSPORT
+
+#ifndef CSDPSMAXPORT
+#define CSDPSMAXPORT 16
+#endif
+
+#ifndef SO_REUSEADDR
+#define SO_REUSEADDR 1
+#endif
+
+/* ---Globals--- */
+
+pid_t gSecretAgentPID = 0; /* PID of launched agent *Shh!* Not public! */
+
+/* ---Private Functions--- */
+
+static int
+TryTCP(void)
+{
+ struct sockaddr_in insock;
+ int request;
+ unsigned short port, startPort = 0;
+ struct servent *serventInfo;
+ int okay;
+
+#ifndef ultrix
+ /* Ultrix has a nasty bug in getservbyname(). If the name passed
+ to it doesn't exist in the services list it will seg. fault...
+ * sigh * */
+ if ((serventInfo = getservbyname(DPS_NX_SERV_NAME,
+ (char *) 0)) != 0)
+ if (strcmp("tcp", serventInfo->s_proto) == 0) {
+ startPort = ntohs(serventInfo->s_port);
+ }
+ /* So, for Ultrix we just default to the default default port :-) */
+#endif /* ultrix */
+ if (startPort == 0) startPort = BASE_TCP_PORT;
+ if ((request = socket (AF_INET, SOCK_STREAM, 0)) < 0)
+ {
+ DPSWarnProc(NULL, "Creating TCP socket while recommending port\n");
+ return -1;
+ }
+#ifdef SO_REUSEADDR
+ /* Necesary to restart the server without a reboot */
+ {
+ int one = 1;
+ setsockopt(request, SOL_SOCKET, SO_REUSEADDR, (char *)&one, sizeof(int));
+ }
+ /* What the hell is all this? I'll tell you. We don't know
+ a prioi what port is free, so we try to bind to each
+ in sequence and return the one that works. */
+#if !defined(AIXV3)
+ {
+ struct linger lingere;
+
+ lingere.l_onoff = 0; /* off */
+ lingere.l_linger = 0; /* don't */
+ if(setsockopt(request, SOL_SOCKET, SO_LINGER, (char *)&lingere,
+ sizeof(struct linger)) != 0)
+ DPSWarnProc(NULL,
+ "Couldn't set TCP SO_DONTLINGER while recommending port.");
+ }
+#endif /* AIXV3 */
+#endif /* SO_REUSEADDR */
+ bzero((char *)&insock, sizeof (insock));
+ insock.sin_family = AF_INET;
+ insock.sin_addr.s_addr = htonl(INADDR_ANY);
+ okay = 0;
+
+ for (port = startPort; (int) port < (int) startPort + CSDPSMAXPORT; port++)
+ {
+ int result;
+ insock.sin_port = htons(port);
+
+ errno = 0;
+ result = bind(request, (struct sockaddr *) &insock, sizeof (insock));
+ if (result < 0)
+ {
+ if (errno != EADDRINUSE)
+ {
+ DPSWarnProc(NULL, "Binding TCP socket while recommending port.\n");
+ close(request);
+ return -1;
+ }
+ continue;
+ }
+ else
+ {
+ /* We have a good port number */
+ okay = 1;
+ break;
+ }
+ }
+ close(request);
+ return (okay) ? port : -1;
+}
+
+/* ---Functions--- */
+
+int
+XDPSNXRecommendPort(int transport)
+{
+ int ret;
+
+ switch (transport)
+ {
+ case XDPSNX_TRANS_UNIX:
+ /* If the TCP socket exists, we just assume the UNIX one
+ is there too. FALL THRU! */
+ case XDPSNX_TRANS_TCP: /* TCP */
+ ret = TryTCP();
+ break;
+ default: ret = -1;
+ }
+ return(ret);
+}
+
+int
+StartXDPSNX(char **additionalArgs)
+{
+ char **args, **cpp;
+ pid_t childPid;
+ int argc = 1; /* 1, args[0]:=path, args[1]:=null */
+ int i = 0;
+ int status = Success; /* assume we'll succeed */
+ char *execObj, **execArgs;
+
+ (void) XDPSGetNXArg(XDPSNX_EXEC_FILE, (void **) &execObj);
+ if (execObj == 0) return (!Success);
+
+ /* Create the argv list for the execl() call */
+ (void) XDPSGetNXArg(XDPSNX_EXEC_ARGS, (void **) &execArgs);
+ if (execArgs != 0)
+ for(cpp = execArgs; *cpp != 0; cpp++, argc++); /* count args. */
+ if (additionalArgs != 0) /* add on the add-on args. */
+ for(cpp = additionalArgs; *cpp != 0; cpp++, argc++);
+
+ args = (char **) Xmalloc(sizeof(char *) * (argc+1));
+ if (args == 0)
+ return(!Success);
+ args[argc] = 0; /* cap end of args */
+ args[i++] = execObj;
+ if (additionalArgs != 0)
+ for(cpp = additionalArgs; *cpp != 0; cpp++, i++) args[i] = *cpp;
+ if (execArgs != 0)
+ for(cpp = execArgs; *cpp != 0; cpp++, i++) args[i] = *cpp;
+
+ /* now try to start up the agent... */
+ if ((childPid = fork()) != -1) {
+ if (childPid == 0) { /* Child process */
+#ifndef __UNIXOS2__
+ if (setsid() < 0)
+ DPSWarnProc(NULL, "Agent unable to create session. Continuing...\n");
+#endif
+
+ /* Try to start the agent */
+ if (execvp(args[0], args) < 0) { /* Error!! */
+ exit(1); /* This is OKAY, we're the child here */
+ }
+ /* SHOULD NEVER REACH HERE */
+ } else { /* Parent (NX Client) */
+ (void) sleep(DOZETIME);
+ /* if decmips, pray that we hesitate long enough for the child... */
+ /* Check on child (NX Agent) */
+ if (waitpid(childPid, NULL, WNOHANG) != 0) {
+ /* Server terminated or stopped; don't care, result is same... */
+ status = !Success;
+ } else { /* we think the agent started okay */
+ gSecretAgentPID = childPid; /* set secret global */
+ }
+ }
+ } else { /* Error in fork */
+ status = !Success;
+ }
+ if (args != 0) (void) XFree(args);
+ return(status);
+}
diff --git a/nx-X11/lib/dps/csstartNX.h b/nx-X11/lib/dps/csstartNX.h
new file mode 100644
index 000000000..5e80e60aa
--- /dev/null
+++ b/nx-X11/lib/dps/csstartNX.h
@@ -0,0 +1,67 @@
+/*
+ * csstartNX.h -- handles fork()/execl() for starting DPSNX from dps lib
+ *
+ * (c) Copyright 1992-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef CSSTARTNX_H
+#define CSSTARTNX_H
+
+#include <X11/Xlib.h>
+
+/* ---Globals--- */
+
+extern Bool gStartXDPSNXIsPresent;
+ /*
+ * Indicates whether the function "StartXDPSNX" is live or just
+ * a stubbed out version.
+ */
+
+/* ---Functions--- */
+
+extern int StartXDPSNX (char **additionalArgs);
+ /*
+ * StartXDPSNX attempts to fork and exec the object file specified by
+ * the DPSSetNXArg argument "DPSNXEXEC". It passes as arguments to the
+ * object file the DPSSetNXArg argument "DPSNXEXECARGS" with the
+ * additionalArgs (if there are any) appended.
+ * RETURNS:
+ * StartXDPSNX will return Success if it believes that the child has
+ * started correctly. Otherwise it returns !Success
+ */
+
+extern int XDPSNXRecommendPort(int transport);
+
+#endif /* CSSTARTNX_H */
diff --git a/nx-X11/lib/dps/dps-def.cpp b/nx-X11/lib/dps/dps-def.cpp
new file mode 100644
index 000000000..d88841d66
--- /dev/null
+++ b/nx-X11/lib/dps/dps-def.cpp
@@ -0,0 +1,991 @@
+LIBRARY Dps
+VERSION LIBRARY_VERSION
+EXPORTS
+DPSAddContextExtensionRec
+DPSAwaitReturnValues
+DPSBinObjSeqWrite
+DPSChainContext
+DPSCheckInitClientGlobals
+DPSCheckRaiseError
+DPSCreateContext
+DPSCreateTextContext
+DPSDefaultErrorProc
+DPSDestroyContext
+DPSDestroySpace
+DPSFlushContext
+DPSGenerateExtensionRecID
+DPSGetContextExtensionRec
+DPSGetContextType
+DPSGetCurrentContext
+DPSGetCurrentErrorBackstop
+DPSGetCurrentTextBackstop
+DPSInitCommonContextProcs
+DPSInitCommonSpaceProcs
+DPSInitCommonTextContextProcs
+DPSInitialize
+DPSInterruptContext
+DPSKnownContext
+DPSKnownSpace
+DPSMapNames
+DPSNameFromIndex
+DPSPrivCurrentContext
+DPSRemoveContextExtensionRec
+DPSResetContext
+DPSSafeSetLastNameIndex
+DPSSetAbbrevMode
+DPSSetContext
+DPSSetErrorBackstop
+DPSSetNumStringConversion
+DPSSetResultTable
+DPSSetTextBackstop
+DPSSetWh
+DPSSetWrapSynchronization
+DPSSuppressBinaryConversion
+DPSUnchainContext
+DPSUpdateNameMap
+DPSWaitContext
+DPSWriteData
+DPSWriteNumString
+DPSWritePostScript
+DPSWriteStringChars
+DPSWriteTypedObjectArray
+DPScalloc
+DPSclientPrintProc
+DPSPrintf
+DPSRaise
+DPSCreatePSWDict
+DPSDestroyPSWDict
+DPSMakeAtom
+DPSWDictEnter
+DPSWDictLookup
+DPSWDictRemove
+DPSFetchAbbrevList
+DPSGetOperatorAbbrev
+DPSGetSysnameAbbrev
+DPSCantHappen
+DPSChangeEncoding
+DPSCheckShared
+DPSContextFromContextID
+DPSDefaultPrivateHandler
+DPSFatalProc
+DPSHandleBogusError
+DPSInitPrivateContextFields
+DPSInitPrivateContextProcs
+DPSInitPrivateSpaceFields
+DPSInitPrivateTextContextFields
+DPSNewUserObjectIndex
+DPSPrivateCheckWait
+DPSPrivateDestroyContext
+DPSPrivateDestroySpace
+DPSServicePostScript
+DPSWarnProc
+DPSinnerProcWriteData
+XDPSContextFromSharedID
+XDPSContextFromXID
+XDPSCreateContext
+XDPSCreateSecureContext
+XDPSCreateSimpleContext
+XDPSDispatchEvent
+XDPSFindContext
+XDPSGetContextStatus
+XDPSGetProtocolVersion
+XDPSIsDPSEvent
+XDPSIsOutputEvent
+XDPSIsReadyEvent
+XDPSIsStatusEvent
+XDPSNotifyWhenReady
+XDPSReadyEventHandler
+XDPSRegisterReadyProc
+XDPSRegisterStatusProc
+XDPSSetEventDelivery
+XDPSSetProcs
+XDPSSetStatusMask
+XDPSSpaceFromSharedID
+XDPSSpaceFromXID
+XDPSStatusEventHandler
+XDPSUnfreezeContext
+XDPSXIDFromContext
+XDPSXIDFromSpace
+DPSInitSysNames
+DPSCreatePrivContext
+DPSDefaultTextBackstop
+DPSIncludePrivContext
+DPSInitClient
+DPSOutOfMemory
+DPSSendDestroySpace
+DPSSendEOF
+DPSSendInterrupt
+DPSSendPostScript
+DPSSendTerminate
+XDPSCreatePrivContextRec
+XDPSForceEvents
+XDPSNumFormat
+XDPSPrivZapDpy
+XDPSSendUnfreeze
+XDPSSetContextEncoding
+XDPSLCAPNotify
+XDPSLCallOutputEventHandler
+XDPSLCallReadyEventHandler
+XDPSLCallStatusEventHandler
+XDPSLCleanAll
+XDPSLCleanContext
+XDPSLContextFromXID
+XDPSLCreateContext
+XDPSLCreateContextAndSpace
+XDPSLCreateContextFromID
+XDPSLCreateSpace
+XDPSLDestroySpace
+XDPSLDispatchCSDPSFakeEvent
+XDPSLFlush
+XDPSLFlushGC
+XDPSLGetCSDPSFakeEventType
+XDPSLGetCSDPSReady
+XDPSLGetCSDPSStatus
+XDPSLGetCodes
+XDPSLGetGCFlushMode
+XDPSLGetPassEventsFlag
+XDPSLGetShunt
+XDPSLGetStatus
+XDPSLGetSyncMask
+XDPSLGetVersion
+XDPSLGetWrapWaitingFlag
+XDPSLGiveInput
+XDPSLIDFromContext
+XDPSLInit
+XDPSLInitDisplayFlags
+XDPSLNotifyContext
+XDPSLNotifyWhenReady
+XDPSLReconcileRequests
+XDPSLReset
+XDPSLSetAfterProc
+XDPSLSetAgentArg
+XDPSLSetAgentName
+XDPSLSetClientMessageHandler
+XDPSLSetCodes
+XDPSLSetGCFlushMode
+XDPSLSetPassEventsFlag
+XDPSLSetReadyEventHandler
+XDPSLSetShunt
+XDPSLSetStatusEventHandler
+XDPSLSetStatusMask
+XDPSLSetSyncMask
+XDPSLSetTextEventHandler
+XDPSLSetVersion
+XDPSLSetWrapWaitingFlag
+XDPSLSync
+XDPSLSyncGCClip
+XDPSLTestErrorCode
+XDPSLUpdateAgentArgs
+XDPSSetXtEventDispatching
+;XDPSCreateStandardColormaps
+XDPSGetDefaultColorMaps
+CSDPSHeadOfDpyExt
+CSDPSInit
+DPSCAPChangeGC
+DPSCAPCloseDisplayProc
+DPSCAPCopyGCProc
+DPSCAPCreate
+DPSCAPDestroy
+DPSCAPFlushGCProc
+DPSCAPFreeGCProc
+DPSCAPStartUp
+DPSCAPWrite
+XDPSFlushGC
+XDPSNXSetAgentArg
+XDPSReconcileRequests
+XDPSSyncGCClip
+DPSCAPCloseAgent
+DPSCAPOpenAgent
+DPSCAPConnect
+N_XDisconnectDisplay
+N_XWaitForReadable
+N_XWaitForWritable
+StartXDPSNX
+XDPSNXRecommendPort
+XDPSGetNXArg
+XDPSNXFindNX
+XDPSNXSetClientArg
+NXProcData
+N_XANYSET
+N_XFlush
+N_XGetHostname
+N_XRead
+N_XReadPad
+N_XReply
+N_XSend
+N_XUnknownNativeEvent
+N_XUnknownWireEvent
+DPScolorimage
+DPScurrentblackgeneration
+DPScurrentcmykcolor
+DPScurrentcolorscreen
+DPScurrentcolortransfer
+DPScurrentundercolorremoval
+DPSsetblackgeneration
+DPSsetcmykcolor
+DPSsetcolorscreen
+DPSsetcolortransfer
+DPSsetundercolorremoval
+DPSeq
+DPSexit
+DPSfalse
+DPSfor
+DPSforall
+DPSge
+DPSgt
+DPSif
+DPSifelse
+DPSle
+DPSloop
+DPSlt
+DPSne
+DPSnot
+DPSor
+DPSrepeat
+DPSstop
+DPSstopped
+DPStrue
+DPSUserObjects
+DPScondition
+DPScurrentcontext
+DPScurrentobjectformat
+DPSdefineusername
+DPSdefineuserobject
+DPSdetach
+DPSexecuserobject
+DPSfork
+DPSjoin
+DPSlock
+DPSmonitor
+DPSnotify
+DPSsetobjectformat
+DPSsetvmthreshold
+DPSundefineuserobject
+DPSwait
+DPSyield
+DPSaload
+DPSanchorsearch
+DPSarray
+DPSastore
+DPSbegin
+DPSclear
+DPScleartomark
+DPScopy
+DPScount
+DPScounttomark
+DPScvi
+DPScvlit
+DPScvn
+DPScvr
+DPScvrs
+DPScvs
+DPScvx
+DPSdef
+DPSdict
+DPSdictstack
+DPSdup
+DPSend
+DPSexch
+DPSexecstack
+DPSexecuteonly
+DPSget
+DPSgetinterval
+DPSindex
+DPSknown
+DPSlength
+DPSload
+DPSmark
+DPSmatrix
+DPSmaxlength
+DPSnoaccess
+DPSnull
+DPSpackedarray
+DPSpop
+DPSput
+DPSputinterval
+DPSrcheck
+DPSreadonly
+DPSroll
+DPSscheck
+DPSsearch
+DPSshareddict
+DPSstatusdict
+DPSstore
+DPSstring
+DPSstringwidth
+DPSsystemdict
+DPSuserdict
+DPSwcheck
+DPSwhere
+DPSxcheck
+DPSFontDirectory
+DPSISOLatin1Encoding
+DPSSharedFontDirectory
+DPSStandardEncoding
+DPScachestatus
+DPScurrentcacheparams
+DPScurrentfont
+DPSdefinefont
+DPSfindfont
+DPSmakefont
+DPSscalefont
+DPSselectfont
+DPSsetcachedevice
+DPSsetcachelimit
+DPSsetcacheparams
+DPSsetcharwidth
+DPSsetfont
+DPSundefinefont
+DPSconcat
+DPScurrentdash
+DPScurrentflat
+DPScurrentgray
+DPScurrentgstate
+DPScurrenthalftone
+DPScurrenthalftonephase
+DPScurrenthsbcolor
+DPScurrentlinecap
+DPScurrentlinejoin
+DPScurrentlinewidth
+DPScurrentmatrix
+DPScurrentmiterlimit
+DPScurrentpoint
+DPScurrentrgbcolor
+DPScurrentscreen
+DPScurrentstrokeadjust
+DPScurrenttransfer
+DPSdefaultmatrix
+DPSgrestore
+DPSgrestoreall
+DPSgsave
+DPSgstate
+DPSinitgraphics
+DPSinitmatrix
+DPSrotate
+DPSscale
+DPSsetdash
+DPSsetflat
+DPSsetgray
+DPSsetgstate
+DPSsethalftone
+DPSsethalftonephase
+DPSsethsbcolor
+DPSsetlinecap
+DPSsetlinejoin
+DPSsetlinewidth
+DPSsetmatrix
+DPSsetmiterlimit
+DPSsetrgbcolor
+DPSsetscreen
+DPSsetstrokeadjust
+DPSsettransfer
+DPStranslate
+DPSbytesavailable
+DPSclosefile
+DPScurrentfile
+DPSdeletefile
+DPSecho
+DPSequals
+DPSequalsequals
+DPSfile
+DPSfilenameforall
+DPSfileposition
+DPSflush
+DPSflushfile
+DPSprint
+DPSprintobject
+DPSpstack
+DPSread
+DPSreadhexstring
+DPSreadline
+DPSreadstring
+DPSrenamefile
+DPSresetfile
+DPSsetfileposition
+DPSstack
+DPSstatus
+DPStoken
+DPSwrite
+DPSwritehexstring
+DPSwriteobject
+DPSwritestring
+DPSabs
+DPSadd
+DPSand
+DPSatan
+DPSbitshift
+DPSceiling
+DPScos
+DPSdiv
+DPSexp
+DPSfloor
+DPSidiv
+DPSln
+DPSlog
+DPSmod
+DPSmul
+DPSneg
+DPSround
+DPSsin
+DPSsqrt
+DPSsub
+DPStruncate
+DPSxor
+DPSconcatmatrix
+DPSdtransform
+DPSidentmatrix
+DPSidtransform
+DPSinvertmatrix
+DPSitransform
+DPStransform
+DPSbanddevice
+DPSframedevice
+DPSnulldevice
+DPSrenderbands
+DPSashow
+DPSawidthshow
+DPScopypage
+DPSeofill
+DPSerasepage
+DPSfill
+DPSimage
+DPSimagemask
+DPSkshow
+DPSrectfill
+DPSrectstroke
+DPSshow
+DPSshowpage
+DPSstroke
+DPSstrokepath
+DPSueofill
+DPSufill
+DPSustroke
+DPSustrokepath
+DPSwidthshow
+DPSxshow
+DPSxyshow
+DPSyshow
+DPSarc
+DPSarcn
+DPSarct
+DPSarcto
+DPScharpath
+DPSclip
+DPSclippath
+DPSclosepath
+DPScurveto
+DPSeoclip
+DPSeoviewclip
+DPSflattenpath
+DPSinitclip
+DPSinitviewclip
+DPSlineto
+DPSmoveto
+DPSnewpath
+DPSpathbbox
+DPSpathforall
+DPSrcurveto
+DPSrectclip
+DPSrectviewclip
+DPSreversepath
+DPSrlineto
+DPSrmoveto
+DPSsetbbox
+DPSsetucacheparams
+DPSuappend
+DPSucache
+DPSucachestatus
+DPSupath
+DPSviewclip
+DPSviewclippath
+DPSbind
+DPScleardictstack
+DPScountdictstack
+DPScountexecstack
+DPScurrentdict
+DPScurrentpacking
+DPScurrentshared
+DPSdeviceinfo
+DPSerrordict
+DPSexec
+DPSprompt
+DPSquit
+DPSrand
+DPSrealtime
+DPSrestore
+DPSrrand
+DPSrun
+DPSsave
+DPSsetpacking
+DPSsetshared
+DPSsrand
+DPSstart
+DPStype
+DPSundef
+DPSusertime
+DPSversion
+DPSvmreclaim
+DPSvmstatus
+DPSineofill
+DPSinfill
+DPSinstroke
+DPSinueofill
+DPSinufill
+DPSinustroke
+DPSwtranslation
+DPSgetboolean
+DPSgetchararray
+DPSgetfloat
+DPSgetfloatarray
+DPSgetint
+DPSgetintarray
+DPSgetstring
+DPSsendboolean
+DPSsendchararray
+DPSsendfloat
+DPSsendfloatarray
+DPSsendint
+DPSsendintarray
+DPSsendstring
+DPSclientXready
+DPSclientsync
+DPScurrentXdrawingfunction
+DPScurrentXgcdrawable
+DPScurrentXgcdrawablecolor
+DPScurrentXoffset
+DPSsetXdrawingfunction
+DPSsetXgcdrawable
+DPSsetXgcdrawablecolor
+DPSsetXoffset
+DPSsetXrgbactual
+DPSGlobalFontDirectory
+DPScshow
+DPScurrentcolor
+DPScurrentcolorrendering
+DPScurrentcolorspace
+DPScurrentdevparams
+DPScurrentglobal
+DPScurrentoverprint
+DPScurrentpagedevice
+DPScurrentsystemparams
+DPScurrentuserparams
+DPSdefineresource
+DPSexecform
+DPSfilter
+DPSfindencoding
+DPSfindresource
+DPSgcheck
+DPSglobaldict
+DPSglyphshow
+DPSlanguagelevel
+DPSleftbracket
+DPSleftleft
+DPSmakepattern
+DPSproduct
+DPSresourceforall
+DPSresourcestatus
+DPSrevision
+DPSrightbracket
+DPSrightright
+DPSrootfont
+DPSserialnumber
+DPSsetcolor
+DPSsetcolorrendering
+DPSsetcolorspace
+DPSsetdevparams
+DPSsetglobal
+DPSsetoverprint
+DPSsetpagedevice
+DPSsetpattern
+DPSsetsystemparams
+DPSsetuserparams
+DPSstartjob
+DPSundefineresource
+PScolorimage
+PScurrentblackgeneration
+PScurrentcmykcolor
+PScurrentcolorscreen
+PScurrentcolortransfer
+PScurrentundercolorremoval
+PSsetblackgeneration
+PSsetcmykcolor
+PSsetcolorscreen
+PSsetcolortransfer
+PSsetundercolorremoval
+PSeq
+PSexit
+PSfalse
+PSfor
+PSforall
+PSge
+PSgt
+PSif
+PSifelse
+PSle
+PSloop
+PSlt
+PSne
+PSnot
+PSor
+PSrepeat
+PSstop
+PSstopped
+PStrue
+PSUserObjects
+PScondition
+PScurrentcontext
+PScurrentobjectformat
+PSdefineusername
+PSdefineuserobject
+PSdetach
+PSexecuserobject
+PSfork
+PSjoin
+PSlock
+PSmonitor
+PSnotify
+PSsetobjectformat
+PSsetvmthreshold
+PSundefineuserobject
+PSwait
+PSyield
+PSaload
+PSanchorsearch
+PSarray
+PSastore
+PSbegin
+PSclear
+PScleartomark
+PScopy
+PScount
+PScounttomark
+PScvi
+PScvlit
+PScvn
+PScvr
+PScvrs
+PScvs
+PScvx
+PSdef
+PSdict
+PSdictstack
+PSdup
+PSend
+PSexch
+PSexecstack
+PSexecuteonly
+PSget
+PSgetinterval
+PSindex
+PSknown
+PSlength
+PSload
+PSmark
+PSmatrix
+PSmaxlength
+PSnoaccess
+PSnull
+PSpackedarray
+PSpop
+PSput
+PSputinterval
+PSrcheck
+PSreadonly
+PSroll
+PSscheck
+PSsearch
+PSshareddict
+PSstatusdict
+PSstore
+PSstring
+PSstringwidth
+PSsystemdict
+PSuserdict
+PSwcheck
+PSwhere
+PSxcheck
+PSFontDirectory
+PSISOLatin1Encoding
+PSSharedFontDirectory
+PSStandardEncoding
+PScachestatus
+PScurrentcacheparams
+PScurrentfont
+PSdefinefont
+PSfindfont
+PSmakefont
+PSscalefont
+PSselectfont
+PSsetcachedevice
+PSsetcachelimit
+PSsetcacheparams
+PSsetcharwidth
+PSsetfont
+PSundefinefont
+PSconcat
+PScurrentdash
+PScurrentflat
+PScurrentgray
+PScurrentgstate
+PScurrenthalftone
+PScurrenthalftonephase
+PScurrenthsbcolor
+PScurrentlinecap
+PScurrentlinejoin
+PScurrentlinewidth
+PScurrentmatrix
+PScurrentmiterlimit
+PScurrentpoint
+PScurrentrgbcolor
+PScurrentscreen
+PScurrentstrokeadjust
+PScurrenttransfer
+PSdefaultmatrix
+PSgrestore
+PSgrestoreall
+PSgsave
+PSgstate
+PSinitgraphics
+PSinitmatrix
+PSrotate
+PSscale
+PSsetdash
+PSsetflat
+PSsetgray
+PSsetgstate
+PSsethalftone
+PSsethalftonephase
+PSsethsbcolor
+PSsetlinecap
+PSsetlinejoin
+PSsetlinewidth
+PSsetmatrix
+PSsetmiterlimit
+PSsetrgbcolor
+PSsetscreen
+PSsetstrokeadjust
+PSsettransfer
+PStranslate
+PSbytesavailable
+PSclosefile
+PScurrentfile
+PSdeletefile
+PSecho
+PSequals
+PSequalsequals
+PSfile
+PSfilenameforall
+PSfileposition
+PSflush
+PSflushfile
+PSprint
+PSprintobject
+PSpstack
+PSread
+PSreadhexstring
+PSreadline
+PSreadstring
+PSrenamefile
+PSresetfile
+PSsetfileposition
+PSstack
+PSstatus
+PStoken
+PSwrite
+PSwritehexstring
+PSwriteobject
+PSwritestring
+PSabs
+PSadd
+PSand
+PSatan
+PSbitshift
+PSceiling
+PScos
+PSdiv
+PSexp
+PSfloor
+PSidiv
+PSln
+PSlog
+PSmod
+PSmul
+PSneg
+PSround
+PSsin
+PSsqrt
+PSsub
+PStruncate
+PSxor
+PSconcatmatrix
+PSdtransform
+PSidentmatrix
+PSidtransform
+PSinvertmatrix
+PSitransform
+PStransform
+PSbanddevice
+PSframedevice
+PSnulldevice
+PSrenderbands
+PSashow
+PSawidthshow
+PScopypage
+PSeofill
+PSerasepage
+PSfill
+PSimage
+PSimagemask
+PSkshow
+PSrectfill
+PSrectstroke
+PSshow
+PSshowpage
+PSstroke
+PSstrokepath
+PSueofill
+PSufill
+PSustroke
+PSustrokepath
+PSwidthshow
+PSxshow
+PSxyshow
+PSyshow
+PSarc
+PSarcn
+PSarct
+PSarcto
+PScharpath
+PSclip
+PSclippath
+PSclosepath
+PScurveto
+PSeoclip
+PSeoviewclip
+PSflattenpath
+PSinitclip
+PSinitviewclip
+PSlineto
+PSmoveto
+PSnewpath
+PSpathbbox
+PSpathforall
+PSrcurveto
+PSrectclip
+PSrectviewclip
+PSreversepath
+PSrlineto
+PSrmoveto
+PSsetbbox
+PSsetucacheparams
+PSuappend
+PSucache
+PSucachestatus
+PSupath
+PSviewclip
+PSviewclippath
+PSbind
+PScleardictstack
+PScountdictstack
+PScountexecstack
+PScurrentdict
+PScurrentpacking
+PScurrentshared
+PSdeviceinfo
+PSerrordict
+PSexec
+PSprompt
+PSquit
+PSrand
+PSrealtime
+PSrestore
+PSrrand
+PSrun
+PSsave
+PSsetpacking
+PSsetshared
+PSsrand
+PSstart
+PStype
+PSundef
+PSusertime
+PSversion
+PSvmreclaim
+PSvmstatus
+PSineofill
+PSinfill
+PSinstroke
+PSinueofill
+PSinufill
+PSinustroke
+PSwtranslation
+PSgetboolean
+PSgetchararray
+PSgetfloat
+PSgetfloatarray
+PSgetint
+PSgetintarray
+PSgetstring
+PSsendboolean
+PSsendchararray
+PSsendfloat
+PSsendfloatarray
+PSsendint
+PSsendintarray
+PSsendstring
+PSclientXready
+PSclientsync
+PScurrentXdrawingfunction
+PScurrentXgcdrawable
+PScurrentXgcdrawablecolor
+PScurrentXoffset
+PSsetXdrawingfunction
+PSsetXgcdrawable
+PSsetXgcdrawablecolor
+PSsetXoffset
+PSsetXrgbactual
+PSGlobalFontDirectory
+PScshow
+PScurrentcolor
+PScurrentcolorrendering
+PScurrentcolorspace
+PScurrentdevparams
+PScurrentglobal
+PScurrentoverprint
+PScurrentpagedevice
+PScurrentsystemparams
+PScurrentuserparams
+PSdefineresource
+PSexecform
+PSfilter
+PSfindencoding
+PSfindresource
+PSgcheck
+PSglobaldict
+PSglyphshow
+PSlanguagelevel
+PSleftbracket
+PSleftleft
+PSmakepattern
+PSproduct
+PSresourceforall
+PSresourcestatus
+PSrevision
+PSrightbracket
+PSrightright
+PSrootfont
+PSserialnumber
+PSsetcolor
+PSsetcolorrendering
+PSsetcolorspace
+PSsetdevparams
+PSsetglobal
+PSsetoverprint
+PSsetpagedevice
+PSsetpattern
+PSsetsystemparams
+PSsetuserparams
+PSstartjob
+PSundefineresource
+
+/* $XFree86$ */
diff --git a/nx-X11/lib/dps/dpsNXprops.h b/nx-X11/lib/dps/dpsNXprops.h
new file mode 100644
index 000000000..c3a8e8d39
--- /dev/null
+++ b/nx-X11/lib/dps/dpsNXprops.h
@@ -0,0 +1,90 @@
+/*
+ * dpsNXprops.h
+ *
+ * (c) Copyright 1992-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86$ */
+
+#ifndef DPSNXPROPS_H
+#define DPSNXPROPS_H
+
+
+/* ---DEFINES--- */
+
+/* --- X Window Properties --- */
+
+#define XDPSNX_BILLBOARD_PROP "_ADOBE_DPS_NX_BILLBOARD" /* On dpy root win */
+
+/* Following are per Agent window properties */
+
+#define XDPSNX_WILLINGNESS_PROP "_ADOBE_DPS_NX_WILLINGNESS_PROP"
+#define XDPSNX_LICENSE_METHOD_PROP "_ADOBE_DPS_NX_LICENSE_METHODS_PROP"
+#define XDPSNX_TRANSPORT_INFO_PROP "_ADOBE_DPS_NX_TRANSPORT_INFO_PROP"
+#define XDPSNX_HOST_NAME_PROP "_ADOBE_DPS_NX_HOST_NAME_PROP"
+
+#define XDPSNX_X_CLASS_NAME "XDPSNX"
+#define XDPSNX_X_RESOURCE "xdpsnx.agenthost"
+#define XDPSNX_X_CLASS "XDPSNX.AgentHost"
+
+#define AGENT_ENV_VAR "DPSNXHOST"
+
+
+/* - Predefined Willingness Prop. Values. Range: [0, 100] - */
+
+#define XDPSNX_MAX_WILLINGNESS 100
+#define XDPSNX_NOT_WILLING 0 /* 0:= agent wishes to "refuses" service to
+ new clients */
+#define XDPSNX_MIN_WILLINGNESS 1 /* 1:= agent may delegate a client's request
+ for a connection to another "more willing"
+ agent */
+
+/* ---Predefined License Method Values--- */
+
+#define LICENSE_METHOD_PREFIX "_ADOBE_DPS_NX_LICENSE_LOCK_&_KEY_"
+#define LICENSE_METHOD_OPEN "_ADOBE_DPS_NX_LICENSE_OPEN_SERVICE"
+#define OPEN_LICENSE_VERSION 1
+
+#include <stddef.h>
+
+
+/* ---Types--- */
+
+typedef struct {
+ int transport;
+ int port;
+} TransportInfo;
+
+
+#endif /* DPSNXPROPS_H */
diff --git a/nx-X11/lib/dps/dpsXclient.c b/nx-X11/lib/dps/dpsXclient.c
new file mode 100644
index 000000000..212030ecc
--- /dev/null
+++ b/nx-X11/lib/dps/dpsXclient.c
@@ -0,0 +1,1134 @@
+/*
+ * dpsXclient.c -- Implementation of the Display PostScript Client Library.
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86$ */
+
+#include <stdlib.h>
+#include <unistd.h> /* sleep() */
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef VMS
+/* Xlib does not like UNIX defined to any value under VMS. */
+#undef UNIX
+#include <decw$include/X.h>
+#include <decw$include/Xlib.h>
+
+#else /* VMS */
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#endif /* VMS */
+
+#include "DPS/XDPSlib.h"
+#include "DPS/XDPS.h"
+
+#include "publictypes.h"
+#include "DPS/dpsclient.h"
+#include "dpsprivate.h"
+
+#include "dpsXpriv.h"
+#include "DPS/dpsXclient.h"
+
+#include "dpsdict.h"
+#include "DPS/dpsexcept.h"
+
+#include "dpsXint.h"
+
+static DPSPrivContext FindPrivContext (
+ Display * dpy,
+ long int cid)
+{
+ DPSPrivSpace ss;
+ DPSPrivContext cc;
+
+ for (ss = spaces; ss != NIL; ss = ss->next)
+ for (cc = ss->firstContext; cc != NIL; cc = cc->next)
+ if (cc->cid == cid && ((XDPSPrivContext) cc->wh)->dpy == dpy)
+ return (cc);
+ return (NIL);
+}
+
+DPSContext XDPSFindContext (
+ Display * dpy,
+ int cid)
+{
+ return ((DPSContext) FindPrivContext (dpy, cid));
+}
+
+DPSContext DPSContextFromContextID(
+ DPSContext ctxt,
+ int contextID,
+ DPSTextProc textProc,
+ DPSErrorProc errorProc)
+{
+ DPSPrivSpace ss;
+ Display *dpy = ((XDPSPrivContext) ((DPSPrivContext) ctxt)->wh)->dpy;
+ DPSPrivContext c, cc = FindPrivContext (dpy, contextID);
+ DPSPrivContext oldc = (DPSPrivContext)ctxt;
+
+ if (cc != NIL) return (DPSContext)cc;
+
+ c = (DPSPrivContext)DPScalloc(sizeof(DPSPrivContextRec), 1);
+ if (!c) return NIL;
+ *c = *oldc;
+ ss = (DPSPrivSpace)c->space;
+
+ if (textProc) c->textProc = textProc;
+ if (errorProc) c->errorProc = errorProc;
+
+ c->eofReceived = false;
+ c->cid = contextID;
+ c->buf = c->outBuf = c->objBuf = NIL;
+ c->chainParent = c->chainChild = NIL;
+
+ c->nBufChars = c->nOutBufChars = c->nObjBufChars = 0;
+
+ c->next = ss->firstContext;
+ DPSAssert(c->next != c);
+ ss->firstContext = c;
+
+ /* Note: there's no way to determine whether the new context id was obtained
+ ** as a result of a fork operation or from another application. so, it must
+ ** be assumed that the application is the creator of the new context.
+ ** Otherwise, it would have called the XDPSContextFromSharedID.
+ */
+ c->creator = true;
+ c->zombie = false;
+ c->numstringOffsets = NULL;
+
+ DPSIncludePrivContext(
+ (XDPSPrivContext) c->wh, (DPSContext)c, c->cid, ss->sid, DPSclientPrintProc);
+
+ return (DPSContext)c;
+}
+
+boolean DPSPrivateCheckWait(
+ DPSContext ctxt)
+{
+ DPSPrivContext cc = (DPSPrivContext) ctxt;
+
+ if (!cc->creator || cc->zombie) {
+ DPSSafeSetLastNameIndex(ctxt);
+ if (cc->errorProc != NIL) {
+ (*cc->errorProc) (ctxt, cc->zombie ? dps_err_deadContext :
+ dps_err_invalidAccess,
+ (unsigned long) ctxt, 0);
+ }
+ return true;
+ }
+ return false;
+}
+
+static void procFlushContext(
+ DPSContext ctxt)
+{
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+ XDPSLFlush (((XDPSPrivContext) c->wh)->dpy);
+ if (ctxt->chainChild != NIL) DPSFlushContext(ctxt->chainChild);
+}
+
+/* ARGSUSED */
+static Bool FindDPSEvent(
+ Display *dpy,
+ XEvent *event,
+ char *arg)
+{
+ return XDPSIsDPSEvent(event);
+}
+
+static void procAwaitReturnValues(DPSContext ctxt)
+{
+ DPSPrivContext c = (DPSPrivContext)ctxt;
+
+ XDPSPrivContext xwh = (XDPSPrivContext) c->wh;
+ XEvent ev;
+
+ /* Output currently goes only to creator! */
+ if (!c->creator)
+ {
+ DPSSafeSetLastNameIndex(ctxt);
+ c->resultTable = NIL;
+ c->resultTableLength = 0;
+ if (c->errorProc != NIL)
+ (*c->errorProc) (ctxt, dps_err_invalidAccess, 0, 0);
+ return;
+ }
+ if (c->resultTable != NIL)
+ {
+ DPSCheckInitClientGlobals();
+
+ if (XDPSLGetWrapWaitingFlag(xwh->dpy)) {
+ DPSSafeSetLastNameIndex(ctxt);
+ c->resultTable = NIL;
+ c->resultTableLength = 0;
+ if (c->errorProc != NIL)
+ (*c->errorProc) (ctxt, dps_err_recursiveWait,
+ (unsigned long) xwh->dpy, 0);
+ return;
+ }
+ XDPSLSetWrapWaitingFlag(xwh->dpy, True);
+
+ DURING
+ DPSFlushContext(ctxt);
+ while (c->resultTable != NIL)
+ {
+ /* We may block indefinitely if the context is frozen or it
+ somehow needs more input. */
+ if (c->zombie)
+ {
+ DPSSafeSetLastNameIndex(ctxt);
+ c->resultTable = NIL;
+ c->resultTableLength = 0;
+ if (c->errorProc != NIL)
+ (*c->errorProc) (ctxt, dps_err_deadContext, (unsigned long) c, 0);
+ XDPSLSetWrapWaitingFlag(xwh->dpy, False);
+ E_RTRN_VOID;
+ }
+
+ /* Someone could conceivably change the event delivery mode in the
+ middle of this...best to check every time */
+
+ if (XDPSLGetPassEventsFlag(xwh->dpy)) {
+ XIfEvent(xwh->dpy, &ev, FindDPSEvent, (char *) NULL);
+ if (!XDPSDispatchEvent(&ev)) DPSCantHappen();
+ } else DPSSendPostScript((XDPSPrivContext) c->wh, DPSclientPrintProc,
+ c->cid, NIL, 0, NIL);
+ }
+ HANDLER
+ XDPSLSetWrapWaitingFlag(xwh->dpy, False);
+ RERAISE;
+ END_HANDLER
+
+ XDPSLSetWrapWaitingFlag(xwh->dpy, False);
+
+ }
+
+ /* update space's name map.
+ space->lastNameIndex is the highest index known to be known to the
+ server for this space.
+ c->lastNameIndex is the highest index sent so far to the context
+ */
+
+ if (((DPSPrivSpace)(c->space))->lastNameIndex < c->lastNameIndex)
+ ((DPSPrivSpace)(c->space))->lastNameIndex = c->lastNameIndex;
+}
+
+void DPSinnerProcWriteData(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+
+ /* ASSERT: safe to call with chain */
+
+ /* No local buffering */
+ DPSSendPostScript ((XDPSPrivContext) c->wh, DPSclientPrintProc,
+ c->cid, buf, count, NIL);
+} /* DPSinnerProcWriteData */
+
+static void procResetContext(DPSContext ctxt)
+{
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+ int currStatus;
+ register XDPSPrivContext xwh = (XDPSPrivContext) c->wh;
+ int retries = 0;
+ int backoff = 2;
+
+ /* First make sure context isn't frozen, try to unfreeze. */
+
+#define DPS_SLEEP_SECS 2
+
+ while((currStatus = XDPSLGetStatus(xwh->dpy, xwh->cxid)) == PSFROZEN)
+ {
+ XDPSLNotifyContext(xwh->dpy, xwh->cxid, PSUNFREEZE);
+ sleep(DPS_SLEEP_SECS);
+ /* Okay if context is PSRUNNING, since the EOF will
+ be handled at the next PSNEEDSINPUT */
+ }
+
+ /* Remove events from Xlib Qs before sending the reset request. */
+ XDPSForceEvents (xwh->dpy);
+
+ if (currStatus == PSSTATUSERROR)
+ /* +++ report error? */;
+ else /* Didn't become zombie. */
+ {
+ currStatus = 0;
+ XDPSLReset(xwh->dpy, xwh->cxid);
+ XDPSLFlush(xwh->dpy);
+ /* Be optmistic for the first try. Assume the app set up a status mask
+ correctly, we should get a status event without asking the
+ server for status. */
+
+ XDPSForceEvents(xwh->dpy);
+ currStatus = c->statusFromEvent;
+
+ while (currStatus != PSNEEDSINPUT && currStatus != PSZOMBIE)
+ {
+ if (currStatus == PSFROZEN)
+ XDPSLNotifyContext(xwh->dpy, xwh->cxid, PSUNFREEZE);
+ if (retries > backoff)
+ {
+ /* Optimism failed. App probably didn't set up a status mask.
+ Ask the server for status. */
+ currStatus = XDPSLGetStatus(xwh->dpy, xwh->cxid);
+ retries = 0;
+ backoff = (backoff > 30) ? 2 : backoff + 1;
+ continue;
+ }
+ else
+ ++retries;
+ sleep(DPS_SLEEP_SECS);
+ XDPSForceEvents(xwh->dpy);
+ currStatus = c->statusFromEvent;
+ }
+ }
+
+ c->eofReceived = false;
+}
+
+void DPSPrivateDestroyContext(DPSContext ctxt)
+{
+ DPSPrivContext c = (DPSPrivContext)ctxt;
+ DPSPrivSpace s = (DPSPrivSpace) c->space;
+
+ if (c->creator)
+ DPSSendTerminate((XDPSPrivContext) c->wh, c->cid, DPSclientPrintProc);
+ else
+ XDPSSetStatusMask(ctxt, 0, XDPSL_ALL_EVENTS, 0); /* Stop status events */
+ /* Don't free the space's wh out from under it */
+ if (c->wh != s->wh) free(c->wh);
+}
+
+void DPSPrivateDestroySpace(DPSSpace space)
+{
+ DPSPrivSpace ss = (DPSPrivSpace) space;
+
+ if (ss->creator) DPSSendDestroySpace((XDPSPrivContext) ss->wh, ss->sid,
+ DPSclientPrintProc);
+
+ free (ss->wh);
+}
+
+boolean DPSCheckShared(DPSPrivContext ctxt)
+{
+ return ctxt->creator == false && ctxt->resultTable != NIL;
+ /* let procAwaitReturnValues generate error */
+}
+
+/* ARGSUSED */
+void DPSServicePostScript(boolean (*returnControl)(void))
+{
+} /* DPSServicePostScript */
+
+void DPSHandleBogusError(DPSContext ctxt, char *prefix, char *suffix)
+{
+ char *buf = "bogus error output from context";
+ DPSDefaultPrivateHandler(ctxt, dps_err_warning,
+ (long unsigned int)buf, 0, prefix, suffix);
+}
+
+void DPSDefaultPrivateHandler(
+ DPSContext ctxt,
+ DPSErrorCode errorCode,
+ long unsigned int arg1,
+ long unsigned int arg2,
+ char *prefix,
+ char *suffix)
+{
+
+ DPSTextProc textProc = DPSGetCurrentTextBackstop();
+
+ switch (errorCode) {
+ case dps_err_invalidAccess:
+ if (textProc != NIL)
+ {
+ char m[100];
+ (void) sprintf (m, "%sInvalid context access.%s", prefix, suffix);
+ (*textProc) (ctxt, m, strlen (m));
+ }
+ break;
+ case dps_err_encodingCheck:
+ if (textProc != NIL)
+ {
+ char m[100];
+ (void) sprintf (m, "%sInvalid name/program encoding: %d/%d.%s",
+ prefix, (int) arg1, (int) arg2, suffix);
+ (*textProc) (ctxt, m, strlen (m));
+ }
+ break;
+ case dps_err_closedDisplay:
+ if (textProc != NIL)
+ {
+ char m[100];
+ (void) sprintf (m, "%sBroken display connection %d.%s",
+ prefix, (int) arg1, suffix);
+ (*textProc) (ctxt, m, strlen (m));
+ }
+ break;
+ case dps_err_deadContext:
+ if (textProc != NIL)
+ {
+ char m[100];
+ (void) sprintf (m, "%sDead context 0x0%x.%s", prefix,
+ (int) arg1, suffix);
+ (*textProc) (ctxt, m, strlen (m));
+ }
+ break;
+ case dps_err_warning:
+ if (textProc != NIL)
+ {
+ char *warn = (char *)arg1;
+ char *msg = "%% DPS Client Library Warning:\n ";
+ (*textProc)(ctxt, msg, strlen(msg));
+ (*textProc)(ctxt, warn, strlen(warn));
+ msg = "\n";
+ (*textProc)(ctxt, msg, strlen(msg));
+ /* flush convention */
+ (*textProc)(ctxt, msg, 0);
+ }
+ break;
+ case dps_err_fatal:
+ if (textProc != NIL)
+ {
+ char *fatal = (char *)arg1;
+ char *msg = "%% DPS Client Library Fatal Internal Error:\n ";
+ (*textProc)(ctxt, msg, strlen(msg));
+ (*textProc)(ctxt, fatal, strlen(fatal));
+ msg = ".\nAborting ...\n";
+ (*textProc)(ctxt, msg, strlen(msg));
+ /* flush convention */
+ (*textProc)(ctxt, msg, 0);
+ abort();
+ }
+ break;
+ case dps_err_recursiveWait:
+ if (textProc != NIL)
+ {
+ char m[100];
+ (void) sprintf (m,
+ "%sRecursive wait for return values, display 0x%x.%s",
+ prefix, (int) arg1, suffix);
+ (*textProc) (ctxt, m, strlen (m));
+ }
+ break;
+ }
+}
+
+void DPSInitPrivateSpaceFields(DPSPrivSpace s)
+{
+ s->creator = true;
+}
+
+void DPSInitPrivateContextFields(DPSPrivContext c, DPSPrivSpace s)
+{
+ c->creator = true;
+ c->zombie = false;
+ if (!s->creator) {
+ c->procs = XDPSconvProcs;
+ c->nameEncoding = dps_strings;
+ }
+}
+
+void DPSInitPrivateTextContextFields(DPSPrivContext c, DPSPrivSpace s)
+{
+ c->creator = true;
+ c->zombie = false;
+ c->space = (DPSSpace) s;
+ c->next = s->firstContext;
+ s->firstContext = c;
+}
+
+long int DPSLastUserObjectIndex = 0;
+
+long int DPSNewUserObjectIndex (void)
+{
+ return (DPSLastUserObjectIndex++);
+}
+
+void XDPSSetProcs (void)
+{
+ DPSCheckInitClientGlobals ();
+ if (!textCtxProcs)
+ {
+ textCtxProcs = (DPSProcs) DPScalloc (sizeof (DPSProcsRec), 1);
+ DPSInitCommonTextContextProcs(textCtxProcs);
+ DPSInitSysNames();
+ }
+ if (!ctxProcs)
+ {
+ ctxProcs = (DPSProcs) DPScalloc (sizeof (DPSProcsRec), 1);
+ DPSInitCommonContextProcs(ctxProcs);
+ DPSInitPrivateContextProcs(ctxProcs);
+ }
+ if (!XDPSconvProcs)
+ XDPSconvProcs = (DPSProcs) DPScalloc (sizeof (DPSProcsRec), 1);
+ if (!XDPSrawProcs)
+ XDPSrawProcs = ctxProcs;
+ *XDPSconvProcs = *ctxProcs;
+ XDPSconvProcs->BinObjSeqWrite = textCtxProcs->BinObjSeqWrite;
+ XDPSconvProcs->WriteStringChars = textCtxProcs->WriteStringChars;
+ XDPSconvProcs->WritePostScript = textCtxProcs->WritePostScript;
+ XDPSconvProcs->WriteNumString = textCtxProcs->WriteNumString;
+}
+
+void DPSInitPrivateContextProcs(DPSProcs p)
+{
+ p->FlushContext = procFlushContext;
+ p->ResetContext = procResetContext;
+ p->AwaitReturnValues = procAwaitReturnValues;
+}
+
+DPSContext XDPSCreateSimpleContext (
+ Display *dpy,
+ Drawable draw,
+ GC gc,
+ int x,
+ int y,
+ DPSTextProc textProc,
+ DPSErrorProc errorProc,
+ DPSSpace space)
+{
+ XDPSPrivContext xwh = XDPSCreatePrivContextRec (dpy, draw, gc, x, y,
+ 0, DefaultStdCMap,
+ DefaultStdCMap, 0, false);
+ DPSContext newCtxt;
+
+ if (xwh == NIL)
+ return (NIL);
+ else
+ {
+ newCtxt = DPSCreateContext ((char *) xwh, textProc, errorProc, space);
+ if (newCtxt == NIL)
+ free ((char *) xwh);
+ return (newCtxt);
+ }
+}
+
+
+DPSContext XDPSCreateContext (
+ Display *dpy,
+ Drawable draw,
+ GC gc,
+ int x,
+ int y,
+ unsigned int eventmask,
+ XStandardColormap *grayramp,
+ XStandardColormap *ccube,
+ int actual,
+ DPSTextProc textProc,
+ DPSErrorProc errorProc,
+ DPSSpace space)
+{
+ XDPSPrivContext xwh = XDPSCreatePrivContextRec (dpy, draw, gc, x, y,
+ eventmask, grayramp,
+ ccube, actual, false);
+ DPSContext newCtxt;
+
+ if (xwh == NIL)
+ return (NIL);
+ else
+ {
+ newCtxt = DPSCreateContext ((char *) xwh, textProc, errorProc, space);
+ if (newCtxt == NIL)
+ free ((char *) xwh);
+ return (newCtxt);
+ }
+}
+
+DPSContext XDPSCreateSecureContext (
+ Display *dpy,
+ Drawable draw,
+ GC gc,
+ int x,
+ int y,
+ unsigned int eventmask,
+ XStandardColormap *grayramp,
+ XStandardColormap *ccube,
+ int actual,
+ DPSTextProc textProc,
+ DPSErrorProc errorProc,
+ DPSSpace space)
+{
+ XDPSPrivContext xwh = XDPSCreatePrivContextRec (dpy, draw, gc, x, y,
+ eventmask, grayramp,
+ ccube, actual, true);
+ DPSContext newCtxt;
+
+ if (xwh == NIL)
+ return (NIL);
+ else
+ {
+ newCtxt = DPSCreateContext ((char *) xwh, textProc, errorProc, space);
+ if (newCtxt == NIL)
+ free ((char *) xwh);
+ return (newCtxt);
+ }
+}
+
+
+DPSContext XDPSContextFromSharedID (dpy, cid, textProc, errorProc)
+ Display *dpy;
+ ContextPSID cid;
+ DPSTextProc textProc;
+ DPSErrorProc errorProc;
+{
+ DPSPrivContext c;
+ DPSPrivSpace s;
+ ContextXID cxid;
+ SpaceXID sxid;
+ XDPSPrivContext xwh;
+
+ if (DPSInitialize () != 0)
+ return (NIL);
+
+ c = FindPrivContext (dpy, cid);
+ if (c != NIL)
+ return ((DPSContext) c);
+
+ xwh = XDPSCreatePrivContextRec (dpy, 0, 0, 0, 0, 0, NIL, NIL, 0, false);
+ if (xwh == NIL)
+ return (NIL);
+ else if (XDPSLIDFromContext (dpy, cid, &cxid, &sxid) != 1)
+ {
+ free ((char *) xwh);
+ return (NIL);
+ }
+ xwh->cxid = cxid;
+
+ if (spaceProcs == NIL)
+ {
+ spaceProcs = (DPSSpaceProcs) DPScalloc (sizeof (DPSSpaceProcsRec), 1);
+ DPSInitCommonSpaceProcs(spaceProcs);
+ }
+
+ s = spaces;
+ while (s != NIL)
+ if ((SpaceXID)s->sid == sxid && ((XDPSPrivContext) s->wh)->dpy == dpy)
+ break;
+ else
+ s = s->next;
+
+ if (s == NIL) /* Create new space record. */
+ {
+ s = (DPSPrivSpace) DPScalloc (sizeof (DPSPrivSpaceRec), 1);
+ s->procs = spaceProcs;
+ s->lastNameIndex = -1;
+ s->sid = sxid;
+ s->wh = (char *) xwh;
+ s->creator = false;
+ s->next = spaces;
+ spaces = s;
+ }
+
+ c = (DPSPrivContext) DPScalloc (sizeof (DPSPrivContextRec), 1);
+ c->space = (DPSSpace) s;
+ c->procs = XDPSconvProcs;
+ c->textProc = textProc;
+ c->errorProc = errorProc;
+ c->programEncoding = DPSDefaultProgramEncoding;
+ c->nameEncoding = dps_strings;
+ c->next = s->firstContext;
+ s->firstContext = c;
+ c->lastNameIndex = s->lastNameIndex;
+ c->cid = cid;
+ c->numstringOffsets = NULL;
+ c->creator = false;
+ c->zombie = false;
+ c->numFormat = XDPSNumFormat (dpy);
+ c->wh = (char *) xwh;
+
+ xwh->ctxt = (DPSContext) c;
+
+ return ((DPSContext) c);
+}
+
+
+void DPSChangeEncoding (ctxt, newProgEncoding, newNameEncoding)
+ DPSContext ctxt;
+ DPSProgramEncoding newProgEncoding;
+ DPSNameEncoding newNameEncoding;
+{
+ if (ctxt->programEncoding != newProgEncoding ||
+ ctxt->nameEncoding != newNameEncoding)
+ {
+ DPSPrivContext cc = (DPSPrivContext) ctxt;
+ DPSPrivSpace ss = (DPSPrivSpace) (cc->space);
+
+ if ((!cc->creator || !ss->creator) && newNameEncoding != dps_strings)
+ {
+ DPSSafeSetLastNameIndex(ctxt);
+ if (cc->errorProc != NIL)
+ (*cc->errorProc) (ctxt, dps_err_encodingCheck,
+ (unsigned long) newNameEncoding,
+ (unsigned long) newProgEncoding);
+ return;
+ }
+ if (ctxt->procs == textCtxProcs)
+ {
+ ctxt->programEncoding = newProgEncoding;
+ ctxt->nameEncoding = newNameEncoding;
+ }
+ else
+ XDPSSetContextEncoding (ctxt, newProgEncoding, newNameEncoding);
+ }
+}
+
+
+DPSSpace XDPSSpaceFromSharedID (dpy, sid)
+ Display *dpy;
+ SpaceXID sid;
+{
+ DPSPrivSpace s;
+ XDPSPrivContext xwh;
+
+ if (DPSInitialize () != 0)
+ return (NIL);
+
+ if (spaceProcs == NIL)
+ {
+ spaceProcs = (DPSSpaceProcs) DPScalloc (sizeof (DPSSpaceProcsRec), 1);
+ DPSInitCommonSpaceProcs(spaceProcs);
+ }
+
+ s = spaces;
+ while (s != NIL)
+ if ((SpaceXID)s->sid == sid && ((XDPSPrivContext) s->wh)->dpy == dpy)
+ break;
+ else
+ s = s->next;
+
+ if (s == NIL) /* Create new space record. */
+ {
+ xwh = XDPSCreatePrivContextRec (dpy, 0, 0, 0, 0, 0, NIL, NIL, 0, false);
+ if (xwh == NIL)
+ return (NIL);
+
+ s = (DPSPrivSpace) DPScalloc (sizeof (DPSPrivSpaceRec), 1);
+ s->procs = spaceProcs;
+ s->lastNameIndex = -1;
+ s->sid = sid;
+ s->wh = (char *) xwh;
+ s->creator = false;
+ s->next = spaces;
+ spaces = s;
+ }
+
+ return ((DPSSpace) s);
+}
+
+
+void XDPSUnfreezeContext (ctxt)
+ DPSContext ctxt;
+{
+ XDPSPrivContext wh = (XDPSPrivContext) (((DPSPrivContext) ctxt)->wh);
+
+ if (wh != NIL && wh->cxid != 0)
+ XDPSSendUnfreeze (wh->dpy, wh->cxid);
+}
+
+
+ContextXID XDPSXIDFromContext (Pdpy, ctxt)
+ Display **Pdpy;
+ DPSContext ctxt;
+{
+ XDPSPrivContext xwh = (XDPSPrivContext) (((DPSPrivContext) ctxt)->wh);
+
+ if (xwh == NIL || xwh->cxid == 0)
+ {
+ *Pdpy = NULL;
+ return (0);
+ }
+ else
+ {
+ *Pdpy = xwh->dpy;
+ return (xwh->cxid);
+ }
+}
+
+
+SpaceXID XDPSXIDFromSpace (Pdpy, space)
+ Display **Pdpy;
+ DPSSpace space;
+{
+ DPSPrivSpace ss = (DPSPrivSpace) space;
+ XDPSPrivContext xwh = (XDPSPrivContext) ss->wh;
+
+ if (xwh != NIL && xwh->dpy != NULL)
+ {
+ *Pdpy = xwh->dpy;
+ return (ss->sid);
+ }
+ else
+ {
+ *Pdpy = NULL;
+ return (0);
+ }
+}
+
+
+DPSContext XDPSContextFromXID (dpy, cxid)
+ Display *dpy;
+ ContextXID cxid;
+{
+ DPSPrivContext c;
+ DPSPrivSpace ss;
+
+ for (ss = spaces; ss != NIL; ss = ss->next)
+ if (((XDPSPrivContext) ss->wh)->dpy == dpy)
+ for (c = ss->firstContext; c != NIL; c = c->next)
+ if (((XDPSPrivContext) c->wh)->cxid == cxid)
+ return ((DPSContext) c);
+
+ return (NIL);
+}
+
+
+DPSSpace XDPSSpaceFromXID (dpy, sxid)
+ Display *dpy;
+ SpaceXID sxid;
+{
+ DPSPrivSpace ss;
+
+ for (ss = spaces; ss != NIL; ss = ss->next)
+ if ((SpaceXID)ss->sid == sxid && ((XDPSPrivContext) ss->wh)->dpy == dpy)
+ return ((DPSSpace) ss);
+
+ return (NIL);
+}
+
+
+XDPSStatusProc XDPSRegisterStatusProc (ctxt, statusProc)
+ DPSContext ctxt;
+ XDPSStatusProc statusProc;
+{
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+ XDPSStatusProc old = c->statusProc;
+
+ if (c->wh != NIL) c->statusProc = statusProc;
+ return old;
+}
+
+
+XDPSReadyProc XDPSRegisterReadyProc (ctxt, readyProc)
+ DPSContext ctxt;
+ XDPSReadyProc readyProc;
+{
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+ XDPSReadyProc old = c->readyProc;
+
+ if (c->wh != NIL) c->readyProc = readyProc;
+ return old;
+}
+
+
+void XDPSSetStatusMask(ctxt, enableMask, disableMask, nextMask)
+ DPSContext ctxt;
+ unsigned long enableMask, disableMask, nextMask;
+{
+ XDPSPrivContext xwh = (XDPSPrivContext) (((DPSPrivContext) ctxt)->wh);
+
+ if (xwh != NIL && xwh->cxid != 0)
+ XDPSLSetStatusMask(xwh->dpy, xwh->cxid, enableMask, disableMask, nextMask);
+}
+
+
+int XDPSGetContextStatus(ctxt)
+ DPSContext ctxt;
+{
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+ XDPSPrivContext xwh = (XDPSPrivContext) c->wh;
+
+ if (xwh != NIL && xwh->cxid != 0)
+ return (XDPSLGetStatus(xwh->dpy, xwh->cxid));
+ else
+ return (0);
+}
+
+void XDPSNotifyWhenReady(ctxt, i0, i1, i2, i3)
+ DPSContext ctxt;
+ int i0, i1, i2, i3;
+{
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+ XDPSPrivContext xwh = (XDPSPrivContext) c->wh;
+ int i[4];
+
+ i[0] = i0;
+ i[1] = i1;
+ i[2] = i2;
+ i[3] = i3;
+
+ XDPSLNotifyWhenReady(xwh->dpy, xwh->cxid, i);
+}
+
+void XDPSStatusEventHandler (e)
+ XDPSLStatusEvent *e;
+{
+ DPSPrivContext c = (DPSPrivContext) XDPSContextFromXID(e->display, e->cxid);
+
+ if (c == NIL)
+ return;
+
+ c->statusFromEvent = e->status;
+ if (e->status == PSZOMBIE)
+ {
+ c->zombie = true;
+ if (c->resultTable != NIL) /* Currently waiting for results */
+ XDPSQuitBlocking = true;
+ }
+
+ if (c->statusProc != NIL)
+ (*(c->statusProc)) ((DPSContext) c, e->status);
+}
+
+void XDPSReadyEventHandler (e)
+ XDPSLReadyEvent *e;
+{
+ DPSPrivContext c = (DPSPrivContext) XDPSContextFromXID(e->display, e->cxid);
+
+ if (c == NIL)
+ return;
+
+ if (c->readyProc != NIL)
+ (*(c->readyProc)) ((DPSContext) c, e->val);
+}
+
+
+
+void DPSWarnProc(
+ DPSContext ctxt,
+ char *msg)
+{
+ DPSErrorProc ep;
+
+ if (DPSInitialize() != 0) return;
+ ep = DPSGetCurrentErrorBackstop();
+ if (ep == NULL) ep = DPSDefaultErrorProc;
+ (*ep)(ctxt, dps_err_warning, (long unsigned int)msg, 0);
+}
+
+void DPSFatalProc(
+ DPSContext ctxt,
+ char *msg)
+{
+ DPSErrorProc ep;
+
+ if (DPSInitialize() != 0) return;
+ ep = DPSGetCurrentErrorBackstop();
+ if (ep == NULL) ep = DPSDefaultErrorProc;
+ (*ep)(ctxt, dps_err_fatal, (long unsigned int)msg, 0);
+}
+
+void DPSCantHappen(void)
+{
+ static int locked = 0;
+ char *msg = "assertion failure or DPSCantHappen";
+ if (locked > 0) abort();
+ ++locked;
+ DPSFatalProc((DPSContext)NULL, msg);
+ /* Fatal proc shouldn't return, but client can override and do anything. */
+ --locked;
+}
+
+
+/* Procedures for delayed event dispatching */
+
+DPSEventDelivery XDPSSetEventDelivery(
+ Display *dpy,
+ DPSEventDelivery newMode)
+{
+ Bool old = XDPSLGetPassEventsFlag(dpy);
+
+ switch (newMode) {
+ case dps_event_pass_through:
+ XDPSLSetPassEventsFlag(dpy, True);
+ break;
+ case dps_event_internal_dispatch:
+ XDPSLSetPassEventsFlag(dpy, False);
+ break;
+ default:
+ break;
+ }
+
+ if (old) return dps_event_pass_through;
+ else return dps_event_internal_dispatch;
+}
+
+Bool XDPSIsStatusEvent(
+ XEvent *event,
+ DPSContext *ctxt,
+ int *status)
+{
+ Display *d = event->xany.display;
+ XExtCodes *c = XDPSLGetCodes(d);
+ XDPSLStatusEvent *se = (XDPSLStatusEvent *) event;
+
+ if (c == NULL) return False; /* Not inited on that display;
+ must be False */
+
+ if (!c->first_event) /* Check CSDPS first */
+ {
+ if (XDPSLGetCSDPSFakeEventType(d, event) == csdps_status)
+ { /* Check CSDPS first */
+ XDPSLGetCSDPSStatus(d, event, (void **)ctxt, status);
+ return True;
+ }
+ else
+ return False;
+ }
+
+ if (event->type != c->first_event + PSEVENTSTATUS) return False;
+
+ if (ctxt != NULL) *ctxt = XDPSContextFromXID(d, se->cxid);
+ if (status != NULL) *status = se->status;
+ return True;
+}
+
+Bool XDPSIsOutputEvent(
+ XEvent *event)
+{
+ Display *d = event->xany.display;
+ XExtCodes *c = XDPSLGetCodes(d);
+ CSDPSFakeEventTypes t;
+
+ if (c == NULL) return False; /* Not inited on that display;
+ must be False */
+
+ if (!c->first_event) /* Check CSDPS first */
+ {
+ if ((t = XDPSLGetCSDPSFakeEventType(d, event)) == csdps_output
+ || t == csdps_output_with_len)
+ return True;
+ else
+ return False;
+ }
+
+ return event->type == c->first_event + PSEVENTOUTPUT;
+}
+
+Bool XDPSIsDPSEvent(
+ XEvent *event)
+{
+ Display *d = event->xany.display;
+ XExtCodes *c = XDPSLGetCodes(d);
+
+ if (c == NULL) return False; /* Not inited on that display;
+ must be False */
+
+ if (!c->first_event) /* Check CSDPS first */
+ {
+ if (XDPSLGetCSDPSFakeEventType(d, event) != csdps_not)
+ return True;
+ else
+ return False;
+ }
+
+ return event->type >= c->first_event &&
+ event->type < c->first_event + NPSEVENTS;
+}
+
+Bool XDPSDispatchEvent(
+ XEvent *event)
+{
+ Display *d = event->xany.display;
+ XExtCodes *c = XDPSLGetCodes(d);
+ CSDPSFakeEventTypes t;
+
+ if (c == NULL) return False; /* Not inited on that display;
+ must be False */
+
+ if (!c->first_event) /* Check CSDPS first */
+ {
+ if ((t = XDPSLGetCSDPSFakeEventType(d, event)) != csdps_not)
+ return(XDPSLDispatchCSDPSFakeEvent(d, event, t));
+ else
+ return False;
+ }
+
+ if (event->type == c->first_event + PSEVENTSTATUS) {
+ XDPSLCallStatusEventHandler(d, event);
+ } else if (event->type == c->first_event + PSEVENTOUTPUT) {
+ XDPSLCallOutputEventHandler(d, event);
+ } else if (event->type == c->first_event + PSEVENTREADY) {
+ XDPSLCallReadyEventHandler(d, event);
+ } else return False;
+ return True;
+}
+
+/* L2-DPS/PROTO 9 addition */
+Bool XDPSIsReadyEvent(
+ XEvent *event,
+ DPSContext *ctxt,
+ int *val)
+{
+ Display *d = event->xany.display;
+ XExtCodes *c = XDPSLGetCodes(d);
+ XDPSLReadyEvent *re = (XDPSLReadyEvent *) event;
+
+ if (c == NULL) return False; /* Not inited on that display;
+ must be False */
+
+ if (!c->first_event) /* Check CSDPS first */
+ {
+ if (XDPSLGetCSDPSFakeEventType(d, event) == csdps_ready)
+ {
+ XDPSLGetCSDPSReady(d, event, (void **)ctxt, val);
+ return True;
+ }
+ else
+ return False;
+ }
+
+ if (event->type != c->first_event + PSEVENTREADY) return False;
+
+ if (ctxt != NULL) *ctxt = XDPSContextFromXID(d, re->cxid);
+ if (val != NULL) {
+ val[0] = re->val[0];
+ val[1] = re->val[1];
+ val[2] = re->val[2];
+ val[4] = re->val[3];
+ }
+ return True;
+}
+
+int XDPSGetProtocolVersion(
+ Display *dpy)
+{
+ return XDPSLGetVersion(dpy);
+}
diff --git a/nx-X11/lib/dps/dpsXcmu.c b/nx-X11/lib/dps/dpsXcmu.c
new file mode 100644
index 000000000..502649d51
--- /dev/null
+++ b/nx-X11/lib/dps/dpsXcmu.c
@@ -0,0 +1,1602 @@
+/*
+ * dpsXcmu.c -- Simple color management/allocation utility
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Portions Copyright 1989 by the Massachusetts Institute of Technology
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of M.I.T. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. M.I.T. makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T.
+ * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Adobe Systems Incorporated and Donna Converse, MIT X Consortium
+ */
+/* $XFree86: xc/lib/dps/dpsXcmu.c,v 1.4 2000/09/26 15:56:59 tsi Exp $ */
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/Xresource.h>
+#include <X11/Xos.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <pwd.h>
+
+#include "dpsassert.h"
+#include "cslibint.h"
+
+/* Defines for standard colormap routines */
+
+#define PrivSort qsort
+#include <stddef.h>
+
+static char redsName[] = "reds";
+static char greensName[] = "greens";
+static char bluesName[] = "blues";
+static char graysName[] = "grays";
+
+/* Database containing DPS default color cube values */
+
+typedef struct _dpyRec {
+ Display *dpy;
+ XrmDatabase db;
+ Atom XA_GRAY_DEFAULT_MAP;
+ struct _dpyRec *next;
+} DpyRec;
+
+static DpyRec *dpyRec = NULL;
+static DpyRec *curDpyRec;
+static DpyRec *FindDpyRec(Display *);
+
+typedef struct {
+ unsigned long *pixels;
+ int npixels;
+} PixelRec;
+
+static Bool AllocateColor(Display *, Colormap, XColor *);
+static Bool AllocateColormap(Display *, XStandardColormap *, XVisualInfo *, int *, PixelRec *, int *, int *, unsigned long);
+static Bool CheckCube(XColor *, XColor *, XStandardColormap *);
+static Bool CubicCube(XStandardColormap *);
+static Bool GetColorCubeFromProperty(Display *, XVisualInfo *, XStandardColormap *, XStandardColormap **, int *);
+static Bool GetGrayRampFromProperty(Display *, XVisualInfo *, XStandardColormap *, XStandardColormap **, int *);
+Status XDPSCreateStandardColormaps(Display *, Drawable, Visual *, int, int, int, int, XStandardColormap *, XStandardColormap *, Bool);
+static Status contiguous(unsigned long *, int, int *, unsigned long, int *, int *);
+static XVisualInfo *PickCorrectVisual(Display *, XVisualInfo *, int, Colormap);
+static int FindRampSize(XColor *, XColor *);
+static long NumColors(char *, char *, char *);
+static void AllocateColorCube(Display *, XVisualInfo *, XStandardColormap *, PixelRec *);
+static void AllocateGrayRamp(Display *, XVisualInfo *, XStandardColormap *, XStandardColormap *, PixelRec *);
+static void ColorValuesFromMask(unsigned long, unsigned long *, unsigned long *);
+static void CreateDefaultsDb(Display *);
+static void DefineProperty(Display *, XStandardColormap *, XVisualInfo *, XStandardColormap *, int, Atom);
+static void FindStaticColorCube(Display *, XVisualInfo *, XStandardColormap *);
+static void FindStaticGrayRamp(Display *, XVisualInfo *, XStandardColormap *, XStandardColormap *);
+static void GetDatabaseValues(Display *, XVisualInfo *, XStandardColormap *, XStandardColormap *);
+static void GetHomeDir(char *);
+static void SetRamp(XColor *, XColor *, int, int *, unsigned long *);
+static void ShrinkMapToFit(XStandardColormap *, int *, XVisualInfo *);
+static void UseGrayCorners(XStandardColormap *, XStandardColormap *);
+static void UseGrayDiagonal(XStandardColormap *, XStandardColormap *);
+
+#define SCALE 65535
+#undef ABS
+#define ABS(x) ((x) < 0 ? -(x) : (x))
+
+void XDPSGetDefaultColorMaps(
+ Display *dpy,
+ Screen *screen,
+ Drawable drawable,
+ XStandardColormap *colorCube,
+ XStandardColormap *grayRamp)
+{
+ Window root;
+ Visual *visual;
+ XStandardColormap g;
+
+ /* If there is a screen specified, use it; otherwise use the drawable */
+
+ if (screen == NULL) {
+ if (drawable == None || ScreenCount(dpy) == 1) {
+ root = DefaultRootWindow(dpy);
+ screen = DefaultScreenOfDisplay(dpy);
+ } else {
+ /* Have to get the root for this drawable */
+ int x, y;
+ int i;
+ unsigned int width, height, bwidth, depth;
+ if (!XGetGeometry(dpy, drawable, &root, &x, &y, &width, &height,
+ &bwidth, &depth)) root = DefaultRootWindow(dpy);
+ for (i = 0;
+ i < ScreenCount(dpy) && root != RootWindow(dpy, i);
+ i++) {}
+ screen = ScreenOfDisplay(dpy, i);
+ }
+ } else root = RootWindowOfScreen(screen);
+
+ if (grayRamp == NULL) grayRamp = &g;
+
+ visual = DefaultVisualOfScreen(screen);
+ grayRamp->colormap = DefaultColormapOfScreen(screen);
+ if (colorCube != NULL) colorCube->colormap = grayRamp->colormap;
+
+ (void) XDPSCreateStandardColormaps(dpy, root, visual,
+ 0, 0, 0, 0, colorCube, grayRamp, True);
+}
+
+Status XDPSCreateStandardColormaps(
+ Display *dpy,
+ Drawable drawable,
+ Visual *visual,
+ int reds, int greens, int blues, int grays,
+ XStandardColormap *colorCube,
+ XStandardColormap *grayRamp,
+ Bool retain)
+{
+ XVisualInfo vtemp, *vinfo;
+ int nvis;
+ XStandardColormap *propCube = NULL, *propRamp = NULL;
+ int nPropCube = 0, nPropRamp = 0;
+ Bool gotCube = False, gotRamp;
+ PixelRec pixels;
+
+ if (grayRamp == NULL) return 0;
+ if (colorCube != NULL &&
+ colorCube->colormap != grayRamp->colormap) return 0;
+
+ if (dpy == NULL || (drawable == None && visual == NULL)) return 0;
+
+ if (visual == NULL) {
+ XWindowAttributes attr;
+ if (XGetWindowAttributes(dpy, drawable, &attr) == 0) return 0;
+ visual = attr.visual;
+ }
+
+ if (grayRamp->colormap == None && drawable == None) return 0;
+
+ curDpyRec = FindDpyRec(dpy);
+ if (curDpyRec == NULL) return 0;
+
+ vtemp.visualid = XVisualIDFromVisual(visual);
+ vinfo = XGetVisualInfo(dpy, VisualIDMask, &vtemp, &nvis);
+ if (nvis == 0) return 0;
+
+ if (nvis > 1) {
+ vinfo = PickCorrectVisual(dpy, vinfo, nvis, grayRamp->colormap);
+ }
+ if (vinfo == NULL) return 0;
+
+ if (grays <= 1) grayRamp->red_max = 0;
+ else grayRamp->red_max = grays - 1;
+
+ if (colorCube != NULL) {
+ if (reds <= 1) colorCube->red_max = 0;
+ else colorCube->red_max = reds - 1;
+ if (greens <= 1) colorCube->green_max = 0;
+ else colorCube->green_max = greens - 1;
+ if (blues <= 1) colorCube->blue_max = 0;
+ else colorCube->blue_max = blues - 1;
+ }
+
+ if ((vinfo->class == StaticGray || vinfo->class == GrayScale) &&
+ colorCube != NULL) {
+ /* Can't do a color cube in a gray visual! */
+ colorCube->red_max = colorCube->green_max = colorCube->blue_max =
+ colorCube->red_mult = colorCube->green_mult = colorCube->blue_mult =
+ colorCube->base_pixel = 0;
+ colorCube = NULL;
+ }
+
+ if (retain) {
+ Display *newDpy = XOpenDisplay(XDisplayString(dpy));
+ if (newDpy == NULL) retain = False;
+ else dpy = newDpy;
+ XGrabServer(dpy);
+ }
+
+ if (grayRamp->colormap == None) {
+ grayRamp->colormap = XCreateColormap(dpy, drawable, vinfo->visual,
+ AllocNone);
+ if (colorCube != NULL) colorCube->colormap = grayRamp->colormap;
+ }
+
+ if (colorCube != NULL) {
+ gotCube = GetColorCubeFromProperty(dpy, vinfo, colorCube,
+ &propCube, &nPropCube);
+ }
+ gotRamp = GetGrayRampFromProperty(dpy, vinfo, grayRamp,
+ &propRamp, &nPropRamp);
+
+ if (!gotRamp || (colorCube != NULL && !gotCube)) {
+ /* Couldn't find at least one thing we wanted, so let's look in the
+ database */
+
+ GetDatabaseValues(dpy, vinfo, colorCube, grayRamp);
+
+ pixels.pixels = NULL;
+ pixels.npixels = 0;
+
+ if (colorCube != NULL) {
+ if (colorCube->red_max != 0) {
+ AllocateColorCube(dpy, vinfo, colorCube, &pixels);
+ }
+ if (colorCube->red_max == 0) {
+ colorCube->green_max = colorCube->blue_max =
+ colorCube->red_mult = colorCube->green_mult =
+ colorCube->blue_mult = 0;
+ }
+ }
+
+ if (grayRamp->red_max != 0) {
+ AllocateGrayRamp(dpy, vinfo, grayRamp, colorCube, &pixels);
+ }
+
+ if (pixels.pixels != NULL) {
+ if (pixels.npixels != 0) {
+ XFreeColors(dpy, grayRamp->colormap,
+ pixels.pixels, pixels.npixels, 0);
+ }
+ free((char *) pixels.pixels);
+ }
+
+ if (retain) {
+ Pixmap p;
+
+ /* Create something to put in killid field so the entries can
+ be deleted sometime */
+ p = XCreatePixmap(dpy, RootWindow(dpy, vinfo->screen), 1, 1, 1);
+ if (colorCube != NULL && !gotCube && colorCube->red_max != 0) {
+ colorCube->visualid = vinfo->visualid;
+ colorCube->killid = p;
+ DefineProperty(dpy, colorCube, vinfo, propCube, nPropCube,
+ XA_RGB_DEFAULT_MAP);
+ }
+ if (!gotRamp && grayRamp->red_max != 0) {
+ grayRamp->visualid = vinfo->visualid;
+ grayRamp->killid = p;
+ DefineProperty(dpy, grayRamp, vinfo, propRamp, nPropRamp,
+ (vinfo->class == GrayScale ? XA_RGB_GRAY_MAP :
+ curDpyRec->XA_GRAY_DEFAULT_MAP));
+ }
+ XSetCloseDownMode(dpy, RetainTemporary);
+ }
+ }
+
+ if (grayRamp->red_max == 0) {
+ /* Use special magic values. If this is a default colormap,
+ the server recognizes a gray ramp with red_max=1, red_mult=1,
+ base_pixel=0 to mean a 2 gray ramp with BlackPixel being
+ the lowest intensity gray and WhitePixel being the highest
+ intensity gray. If it's not a default colormap, then the
+ server will either generate a BadValue error, or just happily
+ use pixel values 0 and 1; either is better than the alternative,
+ silently converting into a null device. */
+ grayRamp->red_max = 1;
+ grayRamp->red_mult = 1;
+ grayRamp->base_pixel = 0;
+ }
+
+ if (retain) {
+ XUngrabServer(dpy);
+ XCloseDisplay(dpy);
+ }
+ if (propCube != NULL) XFree((void *) propCube);
+ if (propRamp != NULL) XFree((void *) propRamp);
+ XFree((void *) vinfo);
+ return 1;
+}
+
+static DpyRec *FindDpyRec(Display *dpy)
+{
+ DpyRec *d;
+
+ for (d = dpyRec; d != NULL; d = d->next) {
+ if (d->dpy == dpy) return d;
+ }
+
+ d = (DpyRec *) malloc(sizeof(DpyRec));
+ if (d == NULL) return NULL;
+ d->XA_GRAY_DEFAULT_MAP = XInternAtom(dpy, "DEFAULT_GRAY", False);
+ d->db = NULL;
+ d->next = dpyRec;
+ dpyRec = d;
+ return d;
+}
+
+static XVisualInfo *PickCorrectVisual(
+ Display *dpy,
+ XVisualInfo *vlist,
+ int n,
+ Colormap cmap)
+{
+ register int i;
+ register int screen_number;
+ Bool def_cmap = False;
+
+ /* A visual id may be valid on multiple screens. Also, there may
+ * be multiple visuals with identical visual ids at different depths.
+ * If the colormap is the Default Colormap, use the Default Visual.
+ * Otherwise, arbitrarily, use the deepest visual.
+ */
+
+ for (screen_number = ScreenCount(dpy); --screen_number >= 0; /**/) {
+ if (cmap == DefaultColormap(dpy, screen_number)) {
+ def_cmap = True;
+ break;
+ }
+ }
+
+ if (def_cmap) {
+ for (i = 0; i < n; i++, vlist++) {
+ if (vlist->visual == DefaultVisual(dpy, screen_number)) {
+ return vlist;
+ }
+ }
+ return NULL; /* Visual does not match colormap */
+ } else {
+ int maxdepth = 0;
+ XVisualInfo *v = 0;
+
+ for (i = 0; i < n; i++, vlist++) {
+ if (vlist->depth > maxdepth) {
+ maxdepth = vlist->depth;
+ v = vlist;
+ }
+ }
+ return v;
+ }
+}
+
+/* Do some rudimentary checking of the properties to avoid obviously bad ones.
+ How did they get there, anyway? */
+
+static Bool ValidCube(
+ XStandardColormap *c,
+ XVisualInfo *vinfo)
+{
+ unsigned long max = 1 << vinfo->depth;
+ unsigned long pixel;
+
+ if (c->red_max < 1 || c->green_max < 1 || c->blue_max < 1) return False;
+ if (c->base_pixel > max) return False;
+ pixel = (c->red_max * c->red_mult + c->green_max * c->green_mult +
+ c->blue_max * c->blue_mult + c->base_pixel) & 0xFFFFFFFF;
+ if (pixel > max) return False;
+
+ return True;
+}
+
+static Bool ValidRamp(
+ XStandardColormap *c,
+ XVisualInfo *vinfo)
+{
+ unsigned long max = 1 << vinfo->depth;
+ unsigned long pixel;
+
+ if (c->red_max < 1) return False;
+ if (c->base_pixel > max) return False;
+ pixel = (c->red_max * c->red_mult + c->base_pixel) & 0xFFFFFFFF;
+ if (pixel > max) return False;
+
+ return True;
+}
+
+static Bool GetColorCubeFromProperty(
+ Display *dpy,
+ XVisualInfo *vinfo,
+ XStandardColormap *colorCube,
+ XStandardColormap **cube,
+ int *ncube)
+{
+ int gotCube;
+ int i;
+ register XStandardColormap *c;
+
+ gotCube = XGetRGBColormaps(dpy, RootWindow(dpy, vinfo->screen), cube,
+ ncube, XA_RGB_DEFAULT_MAP);
+
+ if (gotCube) {
+ /* Try to find a match with the visual */
+ c = *cube;
+ for (i = 0; i < *ncube; i++) {
+ if (c->colormap == colorCube->colormap &&
+ c->visualid == vinfo->visualid &&
+ ValidCube(c, vinfo)) {
+ colorCube->red_max = c->red_max;
+ colorCube->red_mult = c->red_mult;
+ colorCube->green_max = c->green_max;
+ colorCube->green_mult = c->green_mult;
+ colorCube->blue_max = c->blue_max;
+ colorCube->blue_mult = c->blue_mult;
+ colorCube->base_pixel = c->base_pixel;
+ colorCube->visualid = c->visualid;
+ colorCube->killid = c->killid;
+ break;
+ }
+ c++;
+ }
+ if (i == *ncube) gotCube = False;
+ }
+ return gotCube;
+}
+
+static Bool GetGrayRampFromProperty(
+ Display *dpy,
+ XVisualInfo *vinfo,
+ XStandardColormap *grayRamp,
+ XStandardColormap **ramp,
+ int *nramp)
+{
+ int gotRamp;
+ int i;
+ Atom grayAtom;
+ register XStandardColormap *c;
+
+ if (vinfo->class == GrayScale) grayAtom = XA_RGB_GRAY_MAP;
+ else grayAtom = curDpyRec->XA_GRAY_DEFAULT_MAP;
+
+ gotRamp = XGetRGBColormaps(dpy, RootWindow(dpy, vinfo->screen), ramp,
+ nramp, grayAtom);
+
+ if (gotRamp) {
+ /* Try to find a match with the visual */
+ c = *ramp;
+ for (i = 0; i < *nramp; i++) {
+ if (c->colormap == grayRamp->colormap &&
+ c->visualid == vinfo->visualid &&
+ ValidRamp(c, vinfo)) {
+ grayRamp->red_max = c->red_max;
+ grayRamp->red_mult = c->red_mult;
+ grayRamp->base_pixel = c->base_pixel;
+ grayRamp->visualid = c->visualid;
+ grayRamp->killid = c->killid;
+ break;
+ }
+ c++;
+ }
+ if (i == *nramp) gotRamp = False;
+ }
+ return gotRamp;
+}
+
+static void GetDatabaseValues(
+ Display *dpy,
+ XVisualInfo *vinfo,
+ XStandardColormap *colorCube,
+ XStandardColormap *grayRamp)
+{
+ char *class, *depth;
+ char namePrefix[40], classPrefix[40];
+ unsigned long max;
+ XStandardColormap fakeCube;
+
+ switch (vinfo->class) {
+ default:
+ case StaticGray: class = "StaticGray."; break;
+ case GrayScale: class = "GrayScale."; break;
+ case StaticColor: class = "StaticColor."; break;
+ case PseudoColor: class = "PseudoColor."; break;
+ case TrueColor: class = "TrueColor."; break;
+ case DirectColor: class = "DirectColor."; break;
+ }
+
+ if (vinfo->depth >= 24) depth = "24.";
+ else if (vinfo->depth >= 12) depth = "12.";
+ else if (vinfo->depth >= 8) depth = "8.";
+ else if (vinfo->depth >= 4) depth = "4.";
+ else if (vinfo->depth >= 2) depth = "2.";
+ else depth = "1.";
+
+ (void) strcpy(namePrefix, "dpsColorCube.");
+ (void) strcat(strcat(namePrefix, class), depth);
+ (void) strcpy(classPrefix, "DPSColorCube.");
+ (void) strcat(strcat(classPrefix, class), depth);
+
+ CreateDefaultsDb(dpy);
+
+ if (colorCube == NULL && vinfo->class == TrueColor) {
+ /* We'll need the color cube information to compute the gray ramp,
+ even if it wasn't asked for, so make colorCube point to a
+ temporary structure */
+ colorCube = &fakeCube;
+ }
+
+ if (colorCube != NULL) {
+ switch (vinfo->class) {
+ case StaticGray:
+ case GrayScale:
+ /* We can't do a color cube for these visuals */
+ break;
+
+ case TrueColor:
+ /* Rewrite whatever was there before with real values */
+ ColorValuesFromMask(vinfo->red_mask, &colorCube->red_max,
+ &colorCube->red_mult);
+ ColorValuesFromMask(vinfo->green_mask, &colorCube->green_max,
+ &colorCube->green_mult);
+ ColorValuesFromMask(vinfo->blue_mask, &colorCube->blue_max,
+ &colorCube->blue_mult);
+ colorCube->base_pixel = 0;
+ break;
+
+ case DirectColor:
+ /* Get the mults from the masks; ignore maxes */
+ ColorValuesFromMask(vinfo->red_mask, &max,
+ &colorCube->red_mult);
+ ColorValuesFromMask(vinfo->green_mask, &max,
+ &colorCube->green_mult);
+ ColorValuesFromMask(vinfo->blue_mask, &max,
+ &colorCube->blue_mult);
+ /* Get the maxes from the database */
+ if (colorCube->red_max == 0) {
+ colorCube->red_max =
+ NumColors(namePrefix, classPrefix, redsName) - 1;
+ }
+ if (colorCube->green_max == 0) {
+ colorCube->green_max =
+ NumColors(namePrefix, classPrefix, greensName) - 1;
+ }
+ if (colorCube->blue_max == 0) {
+ colorCube->blue_max =
+ NumColors(namePrefix, classPrefix, bluesName) - 1;
+ }
+ colorCube->base_pixel = 0;
+ break;
+
+ case PseudoColor:
+ if (colorCube->red_max == 0) {
+ colorCube->red_max =
+ NumColors(namePrefix, classPrefix, redsName) - 1;
+ }
+ if (colorCube->green_max == 0) {
+ colorCube->green_max =
+ NumColors(namePrefix, classPrefix, greensName) - 1;
+ }
+ if (colorCube->blue_max == 0) {
+ colorCube->blue_max =
+ NumColors(namePrefix, classPrefix, bluesName) - 1;
+ }
+ colorCube->red_mult = (colorCube->green_max + 1) *
+ (colorCube->blue_max + 1);
+ colorCube->green_mult = colorCube->blue_max + 1;
+ colorCube->blue_mult = 1;
+ break;
+
+ case StaticColor:
+ FindStaticColorCube(dpy, vinfo, colorCube);
+ break;
+ }
+ }
+
+ switch (vinfo->class) {
+ case GrayScale:
+ case PseudoColor:
+ case DirectColor:
+ if (grayRamp->red_max == 0) {
+ grayRamp->red_max =
+ NumColors(namePrefix, classPrefix, graysName) - 1;
+ }
+ grayRamp->red_mult = 1;
+ break;
+
+ case TrueColor:
+ /* If the color cube is truly a cube, use its diagonal. Otherwise
+ were SOL and have to use a two-element ramp. */
+ if (CubicCube(colorCube)) UseGrayDiagonal(colorCube, grayRamp);
+ else UseGrayCorners(colorCube, grayRamp);
+ break;
+
+ case StaticColor:
+ case StaticGray:
+ FindStaticGrayRamp(dpy, vinfo, grayRamp, colorCube);
+ break;
+ }
+}
+
+static Bool CubicCube(XStandardColormap *cube)
+{
+ return cube->red_max == cube->green_max && cube->red_max ==
+ cube->blue_max;
+}
+
+static void UseGrayDiagonal(XStandardColormap *cube, XStandardColormap *ramp)
+{
+ ramp->red_max = cube->red_max;
+ ramp->red_mult = cube->red_mult + cube->green_mult + cube->blue_mult;
+ ramp->base_pixel = cube->base_pixel;
+}
+
+static void UseGrayCorners(XStandardColormap *cube, XStandardColormap *ramp)
+{
+ ramp->red_max = 1;
+ ramp->red_mult = (cube->red_max + 1) * (cube->green_max + 1) *
+ (cube->blue_max + 1) - 1;
+ if (* (int *) &(cube->red_mult) < 0) ramp->red_mult *= -1;
+ ramp->base_pixel = cube->base_pixel;
+}
+
+static void ColorValuesFromMask(
+ unsigned long mask,
+ unsigned long *maxColor,
+ unsigned long *mult)
+{
+ *mult = 1;
+ while ((mask & 1) == 0) {
+ *mult <<= 1;
+ mask >>= 1;
+ }
+ *maxColor = mask;
+}
+
+/*
+Resource definitions for default color cube / gray ramp sizes
+are based on visual class and depth. Working from least choices
+to most, here's motivation for the defaults:
+
+If unspecified, default is 0 values for red, green, and blue,
+and 2 (black and white) for grays. This covers StaticGray, StaticColor,
+and depths less than 4 of the other visual classes.
+
+If we have a choice, we try to allocate a gray ramp with an odd number
+of colors; this is so 50% gray can be rendered without dithering.
+In general we don't want to allocate a large cube (even when many
+colormap entries are available) because allocation of each entry
+requires a round-trip to the server (entries allocated read-only
+via XAllocColor).
+
+For GrayScale, any depth less than 4 is treated as monochrome.
+
+PseudoColor depth 4 we try for a 2x2x2 cube with the gray ramp on
+the diagonal. Depth 8 uses a 4x4x4 cube with a separate 9 entry
+gray ramp. Depth 12 uses a 6x6x5 "cube" with a separate 17 entry gray
+ramp. The cube is non-symmetrical; we don't want to use the diagonal
+for a gray ramp and we can get by with fewer blues than reds or greens.
+
+For DirectColor, allocating a gray ramp separate from the color cube
+is wasteful of map entries, so we specify a symmetrical cube and
+share the diagonal entries for the gray ramp.
+
+For TrueColor, # color shades is set equal to the # shades / primary;
+we don't actually allocate map entries, but it's handy to be able to
+do the resource lookup blindly and get the right value.
+*/
+
+static char dpsDefaults[] = "\
+*reds: 0\n\
+*greens: 0\n\
+*blues: 0\n\
+*grays: 2\n\
+\
+*GrayScale.4.grays: 9\n\
+*GrayScale.8.grays: 17\n\
+\
+*PseudoColor.4.reds: 2\n\
+*PseudoColor.4.greens: 2\n\
+*PseudoColor.4.blues: 2\n\
+*PseudoColor.4.grays: 2\n\
+*PseudoColor.8.reds: 4\n\
+*PseudoColor.8.greens: 4\n\
+*PseudoColor.8.blues: 4\n\
+*PseudoColor.8.grays: 9\n\
+*PseudoColor.12.reds: 6\n\
+*PseudoColor.12.greens: 6\n\
+*PseudoColor.12.blues: 5\n\
+*PseudoColor.12.grays: 17\n\
+\
+*DirectColor.8.reds: 4\n\
+*DirectColor.8.greens: 4\n\
+*DirectColor.8.blues: 4\n\
+*DirectColor.8.grays: 4\n\
+*DirectColor.12.reds: 6\n\
+*DirectColor.12.greens: 6\n\
+*DirectColor.12.blues: 6\n\
+*DirectColor.12.grays: 6\n\
+*DirectColor.24.reds: 7\n\
+*DirectColor.24.greens: 7\n\
+*DirectColor.24.blues: 7\n\
+*DirectColor.24.grays: 7\n\
+\
+*TrueColor.12.reds: 16\n\
+*TrueColor.12.greens: 16\n\
+*TrueColor.12.blues: 16\n\
+*TrueColor.12.grays: 16\n\
+*TrueColor.24.reds: 256\n\
+*TrueColor.24.greens: 256\n\
+*TrueColor.24.blues: 256\n\
+*TrueColor.24.grays: 256\n\
+";
+
+static XrmDatabase defaultDB = NULL;
+
+static void CreateDefaultsDb(Display *dpy)
+{
+ char home[256], *dpyDefaults;
+
+ if (defaultDB == NULL) defaultDB = XrmGetStringDatabase(dpsDefaults);
+
+ if (curDpyRec->db != NULL) return;
+
+ dpyDefaults = XResourceManagerString(dpy);
+ if (dpyDefaults != NULL) {
+ curDpyRec->db = XrmGetStringDatabase(dpyDefaults);
+ }
+
+ if (curDpyRec->db == NULL) {
+ GetHomeDir(home);
+ strcpy(home, "/.Xdefaults");
+ curDpyRec->db = XrmGetFileDatabase(home);
+ }
+}
+
+static void GetHomeDir(char *buf)
+{
+#ifndef X_NOT_POSIX
+ uid_t uid;
+#else
+ int uid;
+ extern int getuid();
+#ifndef SYSV386
+ extern struct passwd *getpwuid(), *getpwnam();
+#endif
+#endif
+ struct passwd *pw;
+ static char *ptr = NULL;
+
+ if (ptr == NULL) {
+ if (!(ptr = getenv("HOME"))) {
+ if ((ptr = getenv("USER")) != 0) pw = getpwnam(ptr);
+ else {
+ uid = getuid();
+ pw = getpwuid(uid);
+ }
+ if (pw) ptr = pw->pw_dir;
+ else {
+ ptr = NULL;
+ *buf = '\0';
+ }
+ }
+ }
+
+ if (ptr)
+ (void) strcpy(buf, ptr);
+
+ buf += strlen(buf);
+ *buf = '/';
+ buf++;
+ *buf = '\0';
+ return;
+}
+
+static long NumColors(char *namePrefix, char *classPrefix, char *color)
+{
+ char name[40], class[40];
+ XrmValue rtnValue;
+ char *rtnType;
+ long value;
+
+ (void) strcpy(name, namePrefix);
+ (void) strcpy(class, classPrefix);
+ if (! XrmGetResource(curDpyRec->db, strcat(name, color),
+ strcat(class, color), &rtnType, &rtnValue)) {
+ if (! XrmGetResource(defaultDB, name, class, &rtnType, &rtnValue)) {
+ /* This should never happen, as our defaults cover all cases */
+ return 0;
+ }
+ }
+
+ /* Resource value is number of shades of specified color. If value
+ is not an integer, atoi returns 0, so we return 0. If value
+ is less than 2, it is invalid (need at least 2 shades of a color).
+ Explicitly setting 0 is ok for colors (means to not use a color
+ cube) but merits a warning for gray. */
+
+ if (strcmp(rtnValue.addr, "0") == 0 && strcmp(color, "grays") != 0) {
+ return 0;
+ }
+
+ value = atol(rtnValue.addr);
+ if (value < 2) {
+ char mbuf[512];
+ sprintf(mbuf, "%% Value '%s' is invalid for %s resource\n",
+ rtnValue.addr, name);
+ DPSWarnProc(NULL, mbuf);
+ }
+ return value;
+}
+
+/* Query the entire colormap in the static color case, then try to find
+ a color cube. Check pairs of black and white cells trying to find
+ a cube between them and take the first one you find. */
+
+static void FindStaticColorCube(
+ Display *dpy,
+ XVisualInfo *vinfo,
+ XStandardColormap *colorCube)
+{
+ XColor *ramp, *black, *white, *altBlack, *altWhite;
+ int i, entries;
+
+ entries = 1 << vinfo->depth;
+ ramp = (XColor *) calloc(entries, sizeof(XColor));
+
+ if (ramp == NULL) {
+ colorCube->red_max = 0;
+ return;
+ }
+
+ /* Query the colormap */
+ for (i = 0; i < entries; i++) ramp[i].pixel = i;
+ XQueryColors(dpy, colorCube->colormap, ramp, entries);
+
+ /* Find the white and black entries */
+
+ black = white = altBlack = altWhite = NULL;
+ for (i = 0; i < entries; i++) {
+ if (ramp[i].flags != (DoRed | DoBlue | DoGreen)) continue;
+ if (ramp[i].red == 0 && ramp[i].blue == 0 &&
+ ramp[i].green == 0) {
+ if (black == NULL) black = ramp+i;
+ else if (altBlack == NULL) altBlack = ramp+i;
+ } else if (ramp[i].red == SCALE && ramp[i].blue == SCALE &&
+ ramp[i].green == SCALE) {
+ if (white == NULL) white = ramp+i;
+ else if (altWhite == NULL) altWhite = ramp+i;
+ }
+ }
+
+ if (black == NULL || white == NULL) {
+ colorCube->red_max = 0;
+ free(ramp);
+ return;
+ }
+
+ /* Look for cubes between pairs of black & white */
+ if (!CheckCube(black, white, colorCube) &&
+ !CheckCube(altBlack, white, colorCube) &&
+ !CheckCube(black, altWhite, colorCube) &&
+ !CheckCube(altBlack, altWhite, colorCube)) {
+ colorCube->red_max = 0;
+ }
+
+ free(ramp);
+}
+
+#define R 1
+#define G 2
+#define B 4
+#define C 8
+#define M 16
+#define Y 32
+
+#define SMALLSCALE 255
+#define CheckColor(color,r,g,b) ((((color)->red >> 8) == (r) * SMALLSCALE) && \
+ (((color)->green >> 8) == (g) * SMALLSCALE) && \
+ (((color)->blue >> 8) == (b) * SMALLSCALE))
+
+static Bool CheckCube(
+ XColor *black,
+ XColor *white,
+ XStandardColormap *cube)
+{
+ int r = 0, g = 0, b = 0, c = 0, m = 0, y = 0, k, w;
+ XColor *color;
+ unsigned int found = 0;
+ int small, middle, large;
+ int smallMult, smallMax, middleMult, middleMax, largeMult, largeMax;
+ Bool backwards = False;
+ int mult = 1;
+ XStandardColormap test; /* Test cube */
+ int i;
+ int size;
+
+ if (black == NULL || white == NULL) return False;
+
+ k = black->pixel;
+ w = white->pixel - k;
+
+ size = ABS(w);
+ if (w < 0) {
+ backwards = True;
+ mult = -1;
+ }
+
+ for (i = 1; i < size; i++) {
+ color = black + i*mult;
+ if (color->flags != (DoRed | DoBlue | DoGreen)) return False;
+
+ /* If black or white is in the middle of the cube, can't work */
+ if (CheckColor(color, 0, 0, 0)) return False;
+ if (CheckColor(color, 1, 1, 1)) return False;
+
+ /* Check for red, green, blue, cyan, magenta, and yellow */
+ if (CheckColor(color, 1, 0, 0)) {r = color->pixel-k; found |= R;}
+ else if (CheckColor(color, 0, 1, 0)) {g = color->pixel-k; found |= G;}
+ else if (CheckColor(color, 0, 0, 1)) {b = color->pixel-k; found |= B;}
+ else if (CheckColor(color, 0, 1, 1)) {c = color->pixel-k; found |= C;}
+ else if (CheckColor(color, 1, 0, 1)) {m = color->pixel-k; found |= M;}
+ else if (CheckColor(color, 1, 1, 0)) {y = color->pixel-k; found |= Y;}
+ }
+
+ /* If any color is missing no cube is possible */
+ if (found != (R | G | B | C | M | Y)) return False;
+
+ /* Next test. Make sure B + G = C, R + B = M, R + G = Y,
+ and R + G + B = W */
+ if (b + g != c) return False;
+ if (r + b != m) return False;
+ if (r + g != y) return False;
+ if (r + g + b != w) return False;
+
+ /* Looking good! Compensate for backwards cubes */
+ if (backwards) {
+ w = ABS(w);
+ r = ABS(r);
+ g = ABS(g);
+ b = ABS(b);
+ }
+
+ /* Find the smallest, middle, and largest difference */
+ if (r < b && b < g) {
+ small = r; middle = b; large = g;
+ } else if (r < g && g < b) {
+ small = r; middle = g; large = b;
+ } else if (b < r && r < g) {
+ small = b; middle = r; large = g;
+ } else if (b < g && g < r) {
+ small = b; middle = g; large = r;
+ } else if (g < r && r < b) {
+ small = g; middle = r; large = b;
+ } else {
+ small = g; middle = b; large = r;
+ }
+
+ /* The smallest must divide the middle, and the middle the large */
+ if ((middle % (small + 1)) != 0) return False;
+ if ((large % (small + middle + 1)) != 0) return False;
+
+ /* OK, we believe we have a cube. Compute the description */
+ smallMult = 1;
+ smallMax = small;
+ middleMult = small + 1;
+ middleMax = middle / middleMult;
+ largeMult = small + middle + 1;
+ largeMax = large / largeMult;
+
+ if (small == r) {
+ test.red_max = smallMax; test.red_mult = smallMult;
+ if (middle == b) {
+ test.blue_max = middleMax; test.blue_mult = middleMult;
+ test.green_max = largeMax; test.green_mult = largeMult;
+ } else {
+ test.green_max = middleMax; test.green_mult = middleMult;
+ test.blue_max = largeMax; test.blue_mult = largeMult;
+ }
+ } else if (small == g) {
+ test.green_max = smallMax; test.green_mult = smallMult;
+ if (middle == b) {
+ test.blue_max = middleMax; test.blue_mult = middleMult;
+ test.red_max = largeMax; test.red_mult = largeMult;
+ } else {
+ test.red_max = middleMax; test.red_mult = middleMult;
+ test.blue_max = largeMax; test.blue_mult = largeMult;
+ }
+ } else { /* small == b */
+ test.blue_max = smallMax; test.blue_mult = smallMult;
+ if (middle == r) {
+ test.red_max = middleMax; test.red_mult = middleMult;
+ test.green_max = largeMax; test.green_mult = largeMult;
+ } else {
+ test.green_max = middleMax; test.green_mult = middleMult;
+ test.red_max = largeMax; test.red_mult = largeMult;
+ }
+ }
+
+ /* Re-compensate for backwards cube */
+ if (backwards) {
+ test.red_mult *= -1;
+ test.green_mult *= -1;
+ test.blue_mult *= -1;
+ }
+
+ /* Finally, test the hypothesis! The answer must be correct within 1
+ bit. Only look at the top 8 bits; the others are too noisy */
+
+ for (i = 1; i < size; i++) {
+#define calc(i, max, mult) ((((i / test.mult) % \
+ (test.max + 1)) * SCALE) / test.max)
+ r = ((unsigned short) calc(i, red_max, red_mult) >> 8) -
+ (black[i*mult].red >> 8);
+ g = ((unsigned short) calc(i, green_max, green_mult) >> 8) -
+ (black[i*mult].green >> 8);
+ b = ((unsigned short) calc(i, blue_max, blue_mult) >> 8) -
+ (black[i*mult].blue >> 8);
+#undef calc
+ if (ABS(r) > 2 || ABS(g) > 2 || ABS(b) > 2) return False;
+ }
+ cube->red_max = test.red_max;
+ cube->red_mult = test.red_mult;
+ cube->green_max = test.green_max;
+ cube->green_mult = test.green_mult;
+ cube->blue_max = test.blue_max;
+ cube->blue_mult = test.blue_mult;
+ cube->base_pixel = k;
+ return True;
+}
+
+#undef R
+#undef G
+#undef B
+#undef C
+#undef M
+#undef Y
+
+/* Query the entire colormap in the static gray case, then try to find
+ a gray ramp. This handles there being 2 white or black entries
+ in the colormap and finds the longest linear ramp between pairs of
+ white and black. If there is a color cube, also check its diagonal and
+ use its corners if we need to */
+
+static void FindStaticGrayRamp(
+ Display *dpy,
+ XVisualInfo *vinfo,
+ XStandardColormap *grayRamp,
+ XStandardColormap *colorCube)
+{
+ XColor *ramp, *black, *white, *altBlack, *altWhite;
+ int i, r0, r1, r2, r3, size, entries, redMult;
+ unsigned long base;
+
+ entries = 1 << vinfo->depth;
+ ramp = (XColor *) calloc(entries, sizeof(XColor));
+
+ if (ramp == NULL) {
+ grayRamp->red_max = 0;
+ return;
+ }
+
+ /* Query the colormap */
+ for (i = 0; i < entries; i++) ramp[i].pixel = i;
+ XQueryColors(dpy, grayRamp->colormap, ramp, entries);
+
+ /* Find the white and black entries */
+
+ black = white = altBlack = altWhite = NULL;
+ for (i = 0; i < entries; i++) {
+ if (ramp[i].flags != (DoRed | DoBlue | DoGreen)) continue;
+ if (CheckColor(ramp+i, 0, 0, 0)) {
+ if (black == NULL) black = ramp+i;
+ else if (altBlack == NULL) altBlack = ramp+i;
+ } else if (CheckColor(ramp+i, 1, 1, 1)) {
+ if (white == NULL) white = ramp+i;
+ else if (altWhite == NULL) altWhite = ramp+i;
+ }
+ }
+
+ if (black == NULL || white == NULL) {
+ grayRamp->red_max = 0;
+ free(ramp);
+ return;
+ }
+
+ /* Find out how large a ramp exists between pairs of black & white */
+ r0 = FindRampSize(black, white);
+ r1 = FindRampSize(altBlack, white);
+ r2 = FindRampSize(black, altWhite);
+ r3 = FindRampSize(altBlack, altWhite);
+
+ size = r0;
+ if (r1 > size) size = r1;
+ if (r2 > size) size = r2;
+ if (r3 > size) size = r3;
+ if (size == r0) SetRamp(black, white, size, &redMult, &base);
+ else if (size == r1) SetRamp(altBlack, white, size, &redMult, &base);
+ else if (size == r2) SetRamp(black, altWhite, size, &redMult, &base);
+ else if (size == r3) SetRamp(altBlack, altWhite, size, &redMult, &base);
+
+ if (colorCube != NULL && CubicCube(colorCube) &&
+ colorCube->red_max > size) {
+ UseGrayDiagonal(colorCube, grayRamp);
+ } else {
+ grayRamp->red_max = size;
+ grayRamp->red_mult = redMult;
+ grayRamp->base_pixel = base;
+ }
+
+ free(ramp);
+}
+
+static int FindRampSize(XColor *black, XColor *white)
+{
+ XColor *c;
+ int r;
+ int mult = 1;
+ int i, size;
+
+ if (black == NULL || white == NULL) return 0;
+ size = ABS(white - black);
+
+ /* See if we have a backwards ramp */
+ if (black > white) mult = -1;
+
+ /* See if all cells between black and white are linear, to within 1 bit.
+ Only look at the high order 8 bits */
+
+ for (i = 1; i < size; i++) {
+ c = &black[i*mult];
+ if (c->red != c->blue || c->red != c->green) return 1;
+ r = ((unsigned short) ((i * SCALE) / size) >> 8) - (c->red >> 8);
+ if (ABS(r) > 2) return 1;
+ }
+ return size;
+}
+
+static void SetRamp(
+ XColor *black,
+ XColor *white,
+ int size,
+ int *mult,
+ unsigned long *base)
+{
+ *base = black->pixel;
+ *mult = (white - black) / size;
+}
+
+#define lowbit(x) ((x) & (~(x) + 1))
+
+static unsigned long shiftdown(unsigned long x)
+{
+ while ((x & 1) == 00) {
+ x = x >> 1;
+ }
+ return x;
+}
+
+static void AllocateColorCube(
+ Display *dpy,
+ XVisualInfo *vinfo,
+ XStandardColormap *colorCube,
+ PixelRec *pixels)
+{
+ int count, first, remain, n, j;
+ unsigned long i;
+ Colormap cmap = colorCube->colormap;
+ unsigned long delta;
+ XColor color;
+
+ /* We do no allocation for TrueColor or StaticColor */
+ if (vinfo->class == TrueColor || vinfo->class == StaticColor) return;
+
+ if (vinfo->class == DirectColor) {
+ if ((i = shiftdown(vinfo->red_mask)) > colorCube->red_max)
+ colorCube->red_max = i;
+ if ((i = shiftdown(vinfo->green_mask)) > colorCube->green_max)
+ colorCube->green_max = i;
+ if ((i = shiftdown(vinfo->blue_mask)) > colorCube->blue_max)
+ colorCube->blue_max = i;
+
+ /* We only handle symmetric DirectColor */
+ count = colorCube->red_max + 1;
+ if (colorCube->blue_max + 1 < count) count = colorCube->blue_max + 1;
+ if (colorCube->green_max + 1 < count) count = colorCube->green_max + 1;
+ colorCube->red_max = colorCube->blue_max = colorCube->green_max =
+ count - 1;
+
+ delta = lowbit(vinfo->red_mask) + lowbit(vinfo->green_mask) +
+ lowbit(vinfo->blue_mask);
+ } else {
+ count = (colorCube->red_max + 1) * (colorCube->blue_max + 1) *
+ (colorCube->green_max + 1);
+ delta = 1;
+ }
+
+ colorCube->base_pixel = 0; /* temporary, may change */
+
+ pixels->pixels = (unsigned long *) calloc(vinfo->colormap_size,
+ sizeof(unsigned long));
+ if (pixels->pixels == NULL) {
+ colorCube->red_max = 0;
+ return;
+ }
+
+ if (!AllocateColormap(dpy, colorCube, vinfo, &count, pixels,
+ &first, &remain, delta)) {
+ free((char *) pixels->pixels);
+ pixels->pixels = NULL;
+ colorCube->red_max = 0;
+ return;
+ }
+
+ colorCube->base_pixel = pixels->pixels[first];
+ color.flags = DoRed | DoGreen | DoBlue;
+
+ /* Define colors */
+ for (n = 0, j = 0; j < count; ++j, n += delta) {
+ color.pixel = n + pixels->pixels[first];
+ if (vinfo->class == PseudoColor) {
+#define calc(i, max, mult) ((((i / colorCube->mult) % \
+ (colorCube->max + 1)) * SCALE) / colorCube->max)
+ color.red = (unsigned short) calc(n, red_max, red_mult);
+ color.green = (unsigned short) calc(n, green_max, green_mult);
+ color.blue = (unsigned short) calc(n, blue_max, blue_mult);
+#undef calc
+ } else {
+ color.red = color.green = color.blue =
+ (j * SCALE) / colorCube->red_max;
+ }
+ if (!AllocateColor(dpy, cmap, &color)) {
+ XFreeColors(dpy, cmap, pixels->pixels, count+first+remain, 0);
+ free((char *) pixels->pixels);
+ pixels->pixels = NULL;
+ colorCube->red_max = 0;
+ return;
+ }
+ }
+
+ /* Smush down unused pixels, if any */
+
+ for (j = 0; j < remain; j++) {
+ pixels->pixels[first+j] = pixels->pixels[first+count+j];
+ }
+ pixels->npixels -= count;
+}
+
+static void AllocateGrayRamp(
+ Display *dpy,
+ XVisualInfo *vinfo,
+ XStandardColormap *grayRamp,
+ XStandardColormap *colorCube,
+ PixelRec *pixels)
+{
+ int count, first, remain, n, i;
+ Colormap cmap = grayRamp->colormap;
+ XColor color;
+ unsigned long delta;
+
+ /* Allocate cells in read/write visuals only */
+ if (vinfo->class != PseudoColor && vinfo->class != GrayScale &&
+ vinfo->class != DirectColor) return;
+
+ if (vinfo->class == DirectColor) {
+ delta = lowbit(vinfo->red_mask) + lowbit(vinfo->green_mask) +
+ lowbit(vinfo->blue_mask);
+ } else delta = 1;
+
+ /* First of all see if there's a usable gray ramp in the color cube */
+
+ if (colorCube != NULL) {
+ if (CubicCube(colorCube)) {
+ if (colorCube->red_max >= grayRamp->red_max) {
+ /* diagonal is long enough! use it */
+ UseGrayDiagonal(colorCube, grayRamp);
+ return;
+ }
+ }
+ }
+
+ grayRamp->base_pixel = 0; /* temporary, may change */
+
+ count = grayRamp->red_max + 1;
+
+ if (pixels->pixels == NULL) {
+ pixels->pixels = (unsigned long *) calloc(vinfo->colormap_size,
+ sizeof(unsigned long));
+ if (pixels->pixels == NULL) {
+ grayRamp->red_max = 0;
+ return;
+ }
+ }
+
+ if (!AllocateColormap(dpy, grayRamp, vinfo, &count, pixels,
+ &first, &remain, delta)) {
+ /* Last gasp: try any diagonal or the corners of the color cube */
+ if (colorCube != NULL) {
+ if (CubicCube(colorCube)) UseGrayDiagonal(colorCube, grayRamp);
+ else UseGrayCorners(colorCube, grayRamp);
+ } else {
+ grayRamp->red_max = 0;
+ }
+ return;
+ }
+
+ grayRamp->base_pixel = pixels->pixels[first];
+ color.flags = DoRed | DoGreen | DoBlue;
+
+ /* Define colors */
+ for (n = 0, i = 0; i < count; ++i, n += delta) {
+ color.pixel = n + pixels->pixels[first];
+ color.red = (unsigned short)((n * SCALE) / (grayRamp->red_max));
+ color.green = color.red;
+ color.blue = color.red;
+
+ if (!AllocateColor(dpy, cmap, &color)) {
+ /* Don't need to free pixels here; we'll do it on return */
+ grayRamp->red_max = 0;
+ return;
+ }
+ }
+
+ /* Smush down unused pixels, if any */
+
+ for (i = 0; i < remain; i++) {
+ pixels->pixels[first+i] = pixels->pixels[first+count+i];
+ }
+ pixels->npixels -= count;
+}
+
+static int compare(const void *a1, const void *a2)
+{
+ register unsigned long *e1 = (unsigned long *) a1,
+ *e2 = (unsigned long *) a2;
+
+ if (*e1 < *e2) return -1;
+ if (*e1 > *e2) return 1;
+ return 0;
+}
+
+static Bool AllocateColormap(
+ Display *dpy,
+ XStandardColormap *map,
+ XVisualInfo *vinfo,
+ int *count,
+ PixelRec *pixels,
+ int *first, int *remain,
+ unsigned long delta)
+{
+ Colormap cmap = map->colormap;
+ int npixels, ok, i;
+ Bool success = False;
+
+ if (pixels->npixels == 0) {
+ /* First try to allocate the entire colormap */
+ npixels = vinfo->colormap_size;
+ ok = XAllocColorCells(dpy, cmap, 1, NULL, 0, pixels->pixels, npixels);
+ if (ok) success = True;
+ else {
+ int total;
+ int top, mid = 0;
+
+ /* If it's a gray ramp or direct color we need at least 2;
+ others 8 */
+ if (map->blue_max == 0 || vinfo->class == DirectColor) total = 2;
+ else total = 8;
+
+ /* Allocate all available cells, using binary backoff */
+ top = vinfo->colormap_size - 1;
+ while (total <= top) {
+ mid = total + ((top - total + 1) / 2);
+ ok = XAllocColorCells(dpy, cmap, 1, NULL, 0,
+ pixels->pixels, mid);
+ if (ok) {
+ if (mid == top) {
+ success = True;
+ break;
+ } else {
+ XFreeColors(dpy, cmap, pixels->pixels, mid, 0);
+ total = mid;
+ }
+ } else top = mid - 1;
+ }
+ if (success) npixels = mid;
+ else npixels = 0;
+ }
+ } else {
+ /* We must be in the gray ramp case, so we need at least 2 entries */
+ npixels = pixels->npixels;
+ if (map->blue_max != 0 || npixels >= 2) success = True;
+ }
+
+ if (success) {
+ /* Avoid pessimal case by testing to see if already sorted */
+ for (i = 0; i < npixels-1; ++i) {
+ if (pixels->pixels[i] != pixels->pixels[i+1]-1) break;
+ }
+
+ if (i < npixels-1) {
+ PrivSort((char *)pixels->pixels, npixels,
+ sizeof(unsigned long), compare);
+ }
+
+ if (!contiguous(pixels->pixels, npixels, count, delta,
+ first, remain)) {
+ /* If there are enough free cells, shrink the map to fit.
+ Otherwise fail; we'll free the pixels later */
+ if (((map->blue_max == 0 || vinfo->class == DirectColor) &&
+ *count >= 2) || *count >=8) {
+ ShrinkMapToFit(map, count, vinfo);
+ *remain = npixels - *first - *count;
+ } else success = False;
+ }
+ }
+
+ pixels->npixels = npixels;
+ return success;
+}
+
+static Bool contiguous(
+ unsigned long pixels[], /* specifies allocated pixels */
+ int npixels, /* specifies count of alloc'd pixels */
+ int *ncolors, /* specifies needed sequence length
+ If not available, returns max
+ available contiguous sequence */
+ unsigned long delta,
+ int *first, /* returns first index of sequence */
+ int *rem) /* returns first index after sequence,
+ * or 0, if none follow */
+{
+ register int i = 1; /* walking index into the pixel array */
+ register int count = 1; /* length of sequence discovered so far */
+ int max = 1; /* longest sequence we found */
+ int maxstart = 0;
+
+ *first = 0;
+ while (count < *ncolors && i < npixels) {
+ if (pixels[i-1] + delta == pixels[i]) count++;
+ else {
+ if (count > max) {
+ max = count;
+ maxstart = *first;
+ }
+ count = 1;
+ *first = i;
+ }
+ i++;
+ }
+ if (i == npixels && count > max) {
+ max = count;
+ maxstart = *first;
+ }
+ *rem = npixels - i;
+ if (count != *ncolors) {
+ *ncolors = max;
+ *first = maxstart;
+ return False;
+ } return True;
+}
+
+static Bool AllocateColor(
+ Display *dpy,
+ Colormap cmap,
+ XColor *color)
+{
+ unsigned long pix = color->pixel;
+ XColor request;
+ int ok;
+
+ request = *color;
+
+ /* Free RW, Alloc RO, if fails, try RW */
+ XFreeColors(dpy, cmap, &pix, 1, 0);
+ ok = XAllocColor(dpy, cmap, &request);
+
+ /* If the pixel we get back isn't the request one, probably RO
+ White or Black, so shove it in RW so our cube is correct.
+ If alloc fails, try RW. */
+
+ if (!ok || request.pixel != color->pixel) {
+ ok = XAllocColorCells(dpy, cmap, 0, NULL, 0, &pix, 1);
+
+ if (pix != color->pixel) XFreeColors(dpy, cmap, &pix, 1, 0);
+ if (!ok || pix != color->pixel) {
+ return False;
+ }
+ request = *color;
+ XStoreColor(dpy, cmap, &request);
+ }
+ return True;
+}
+
+static void ShrinkMapToFit(
+ XStandardColormap *map,
+ int *space,
+ XVisualInfo *vinfo)
+{
+ if (map->blue_max == 0) map->red_max = *space - 1;
+ else if (vinfo->class == DirectColor) {
+ if (map->red_max > *space - 1) map->red_max = *space - 1;
+ if (map->green_max > *space - 1) map->green_max = *space - 1;
+ if (map->blue_max > *space - 1) map->blue_max = *space - 1;
+ } else {
+ int which = 2;
+ while ((map->red_max + 1) * (map->green_max + 1) *
+ (map->blue_max + 1) > *space) {
+ if (which == 0) {
+ if (map->red_max > 1) map->red_max--;
+ which = 1;
+ } else if (which == 1) {
+ if (map->green_max > 1) map->green_max--;
+ which = 2;
+ } else {
+ if (map->blue_max > 1) map->blue_max--;
+ which = 0;
+ }
+ }
+ *space = (map->red_max + 1) * (map->green_max + 1) *
+ (map->blue_max + 1);
+
+ map->red_mult = (map->green_max + 1) * (map->blue_max + 1);
+ map->green_mult = map->blue_max + 1;
+ map->blue_mult = 1;
+ }
+}
+
+static void DefineProperty(
+ Display *dpy,
+ XStandardColormap *map,
+ XVisualInfo *vinfo,
+ XStandardColormap *prop,
+ int nProp,
+ Atom atom)
+{
+ XStandardColormap *copy;
+ int i;
+
+ if (nProp == 0) {
+ XSetRGBColormaps(dpy, RootWindow(dpy, vinfo->screen), map, 1, atom);
+ return;
+ }
+
+ copy = (XStandardColormap *) calloc(nProp+1, sizeof(XStandardColormap));
+
+ /* Hm. If I can't allocate the list, is it better to just put our
+ property on, or to leave the ones there? I'll guess the latter... */
+ if (copy == NULL) return;
+
+ if (vinfo->visual == DefaultVisual(dpy, vinfo->screen) &&
+ map->colormap == DefaultColormap(dpy, vinfo->screen)) {
+ /* Put new entry first; it's more likely to be useful */
+ for (i = 0; i < nProp; i++) copy[i+1] = prop[i];
+ i = 0;
+ } else {
+ /* Put it at the end */
+ for (i = 0; i < nProp; i++) copy[i] = prop[i];
+ /* i = nProp; (it does already) */
+ }
+
+ copy[i] = *map;
+ XSetRGBColormaps(dpy, RootWindow(dpy, vinfo->screen), copy, nProp+1, atom);
+
+ free((void *) copy);
+}
diff --git a/nx-X11/lib/dps/dpsXint.h b/nx-X11/lib/dps/dpsXint.h
new file mode 100644
index 000000000..08c4d233a
--- /dev/null
+++ b/nx-X11/lib/dps/dpsXint.h
@@ -0,0 +1,104 @@
+/*
+ * dpsXint.h -- internal definitions to dpsXclient.c
+ *
+ * (c) Copyright 1989-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef DPSXINT_H
+#define DPSXINT_H
+
+#include <X11/X.h>
+#include <DPS/dpsXclient.h>
+
+/* The first part of this structure is generic; the last part is
+ implementation-specific. */
+
+typedef struct _t_DPSPrivContextRec {
+ char *priv;
+ DPSSpace space;
+ DPSProgramEncoding programEncoding;
+ DPSNameEncoding nameEncoding;
+ DPSProcs procs;
+ DPSTextProc textProc;
+ DPSErrorProc errorProc;
+ DPSResults resultTable;
+ unsigned int resultTableLength;
+ struct _t_DPSContextRec *chainParent, *chainChild;
+ unsigned int contextFlags;
+ DPSContextExtensionRec *extension;
+
+ struct _t_DPSPrivContextRec *next;
+ integer lastNameIndex, cid;
+ boolean eofReceived;
+ char *wh;
+ char *buf, *outBuf, *objBuf;
+ integer nBufChars, nOutBufChars, nObjBufChars;
+ DPSNumFormat numFormat;
+ boolean resyncing; /* Error has occurred and waiting ResetContext */
+ int *numstringOffsets; /* see comment below */
+
+/* Everthing after this is XDPS-specific */
+
+ boolean creator; /* Did this app. create the context? */
+ int statusFromEvent; /* Latest status reported by an event during reset. */
+ XDPSStatusProc statusProc;
+ boolean zombie; /* To avoid DPSAwaitReturnValues */
+ XDPSReadyProc readyProc;
+} DPSPrivContextRec, *DPSPrivContext;
+
+/* The numstringOffsets field lists offsets of encoded number strings in
+ the current buffer. If non NULL, the first entry contains the size of
+ the allocated offset buffer and the second entry contains the next
+ available offset entry for use. */
+
+/* The first part of this structure is generic; the last part is
+ implementation-specific. */
+
+typedef struct _t_DPSPrivSpaceRec {
+ DPSSpaceProcs procs;
+
+ struct _t_DPSPrivSpaceRec *next;
+ long int lastNameIndex, sid;
+ char *wh; /* KLUDGE to support DPSSendDestroySpace */
+ DPSPrivContext firstContext;
+
+/* Everthing after this is XDPS-specific */
+
+ boolean creator; /* Did this app. create the space? */
+} DPSPrivSpaceRec, *DPSPrivSpace;
+
+#include "dpsint.h"
+
+#endif /* DPSXINT_H */
diff --git a/nx-X11/lib/dps/dpsXops.psw b/nx-X11/lib/dps/dpsXops.psw
new file mode 100644
index 000000000..a14335739
--- /dev/null
+++ b/nx-X11/lib/dps/dpsXops.psw
@@ -0,0 +1,80 @@
+/* dpsXops.psw
+ *
+ * (c) Copyright 1991-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSclientsync(DPSContext ctxt)
+ clientsync
+endps
+
+defineps DPScurrentXgcdrawable(DPSContext ctxt | int *gc, *draw, *x, *y)
+ currentXgcdrawable y x draw gc
+endps
+
+defineps DPScurrentXgcdrawablecolor(DPSContext ctxt | int *gc, *draw, *x, *y, colorInfo[12])
+ currentXgcdrawablecolor colorInfo y x draw gc
+endps
+
+defineps DPScurrentXoffset(DPSContext ctxt | int *x, *y)
+ currentXoffset y x
+endps
+
+defineps DPSsetXgcdrawable(DPSContext ctxt; int gc, draw, x, y)
+ gc draw x y setXgcdrawable
+endps
+
+defineps DPSsetXgcdrawablecolor(DPSContext ctxt; int gc, draw, x, y, colorInfo[12])
+ gc draw x y colorInfo setXgcdrawablecolor
+endps
+
+defineps DPSsetXoffset(DPSContext ctxt; int x, y)
+ x y setXoffset
+endps
+
+defineps DPSsetXrgbactual(DPSContext ctxt; float r, g, b | boolean *success)
+ r g b setXrgbactual success
+endps
+
+defineps DPSclientXready(DPSContext ctxt; int i0, i1, i2, i3)
+ [ i0 i1 i2 i3 ] clientXready
+endps
+
+defineps DPSsetXdrawingfunction(DPSContext ctxt; int function)
+ function setXdrawingfunction
+endps
+
+defineps DPScurrentXdrawingfunction(DPSContext ctxt | int *function)
+ currentXdrawingfunction function
+endps
diff --git a/nx-X11/lib/dps/dpsXpriv.c b/nx-X11/lib/dps/dpsXpriv.c
new file mode 100644
index 000000000..c0f12545c
--- /dev/null
+++ b/nx-X11/lib/dps/dpsXpriv.c
@@ -0,0 +1,534 @@
+/*
+ * dpsXpriv.c
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86: xc/lib/dps/dpsXpriv.c,v 1.7 2002/03/05 21:50:14 herrb Exp $ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#ifdef GC
+#undef GC
+#endif /* GC */
+
+#ifdef VMS
+/* Xlib does not like UNIX defined to any value under VMS. */
+#undef UNIX
+#include <decw$include/X.h>
+#include <decw$include/Xproto.h>
+#include <decw$include/Xlib.h>
+#include <decw$include/Xutil.h>
+#else /* VMS */
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#endif /* VMS */
+#include "DPS/XDPSlib.h"
+#include "DPS/XDPS.h"
+#include "dpsprivate.h"
+#include "DPS/dpsconfig.h"
+#include "publictypes.h"
+#include "dpsXpriv.h"
+#include "DPS/dpsXclient.h"
+#include "DPS/dpsexcept.h"
+#include "dpsassert.h"
+
+#ifdef ISC
+#include <sys/bsdtypes.h>
+#endif
+
+#ifdef __QNX__
+#include <sys/select.h>
+#endif
+
+#if defined(hpux) || defined(AIXV3)
+#define SELECT_TYPE int *
+#else
+#define SELECT_TYPE fd_set *
+#endif
+
+typedef struct _RegstDPY
+ {
+ Display *dpy;
+ int firstEvent;
+ struct _RegstDPY *next;
+ unsigned char ctxtTokenType; /* establish for each context. */
+ unsigned char prefTokenType; /* ...of the server. */
+ } RegstDPYRec, *PRegstDPY;
+
+
+/* XDPSContextTimedOut is set to true by the BlockForEvent routine
+ when expected return values are not received within a certain
+ amount of time. In this case, BlockForEvent will return and the
+ higher callers may take appropriate action to avoid deadlocks. */
+int XDPSContextTimedOut = false; /* Unimplemented */
+DPSProcs XDPSconvProcs = NIL;
+DPSProcs XDPSrawProcs = NIL;
+
+/* XDPSQuitBlocking is set to false by the BlockForEvent routine and
+ becomes true if either a zombie status event or an output event
+ is received for the context waiting for return values. */
+int XDPSQuitBlocking = false;
+
+
+static DPSClientPrintProc clientPrintProc = NIL;
+static PRegstDPY firstDPY = NIL;
+/* operands for "setobjectformat" if we must agree with server. */
+static char *format_operands[] = {"1", "2", "3", "4"};
+
+
+
+static PRegstDPY IsRegistered (
+ register Display *dpy)
+{
+ register PRegstDPY rdpy;
+
+ for (rdpy = firstDPY; rdpy != NIL; rdpy = rdpy->next)
+ if (rdpy->dpy == dpy)
+ return (rdpy);
+ return (NIL);
+}
+
+
+void XDPSPrivZapDpy(
+ register Display *dpy)
+{
+ register PRegstDPY rdpy, prev = NIL;
+
+ for (rdpy = firstDPY; rdpy != NIL; prev = rdpy,rdpy = rdpy->next)
+ if (rdpy->dpy == dpy)
+ {
+ if (prev == NIL)
+ firstDPY = rdpy->next;
+ else
+ prev->next = rdpy->next;
+ break;
+ }
+ free(rdpy);
+}
+
+
+/* ARGSUSED */
+static int UsuallyFalse (
+ Display *dpy,
+ XEvent *event,
+ char *arg)
+{
+ return((event->type & 0x7F) == X_Error);
+}
+
+void XDPSForceEvents (
+ Display *dpy)
+{
+ XEvent event;
+
+ while (XCheckIfEvent (dpy, &event, UsuallyFalse, (char *) NULL)) {
+ int (*proc)(Display *, XErrorEvent *) = XSetErrorHandler(NULL);
+ (void) XSetErrorHandler(proc);
+ if (proc != 0 && event.type < 256)
+ (void)(*proc)(dpy, &event.xerror);
+ }
+}
+
+
+static void OutputEventHandler (
+ register XDPSLOutputEvent *event)
+{
+ PRegstDPY rdpy;
+ register DPSContext ctxt;
+
+ if ((rdpy = IsRegistered (event->display)) == NIL ||
+ rdpy->firstEvent != event->type)
+ return;
+
+ ctxt = XDPSContextFromXID (event->display, event->cxid);
+ if (ctxt != NIL)
+ {
+ if (ctxt->resultTable != NIL)
+ XDPSQuitBlocking = true;
+ (*clientPrintProc) (ctxt, event->data, event->length);
+ }
+}
+
+
+static int BlockForEvent (
+ Display *dpy)
+{
+ fd_set readfds;
+
+ XDPSQuitBlocking = false;
+ /* XDPSQuitBlocking becomes true if a zombie status event or
+ any output event is received by the status event handler for
+ the currently-awaiting-results context. */
+ while (1) {
+ FD_SET(ConnectionNumber(dpy), &readfds);
+ if (select (ConnectionNumber(dpy)+1, (SELECT_TYPE) &readfds,
+ (SELECT_TYPE) NULL, (SELECT_TYPE) NULL,
+ (struct timeval *) NULL) < 0) {
+ if (errno == EINTR) {
+ /* Ignore interrupt signals */
+ errno = 0;
+ continue;
+ }
+ return (-1); /* Broken connection (errno == EBADF) */
+ } else {
+ XDPSForceEvents (dpy);
+ if (XDPSQuitBlocking) break;
+ XNoOp(dpy);
+ /* The noop is necessary to force proper behavior when the
+ connection goes away - listen carefully! When the dpy
+ connection is closed, the above select returns indicating
+ activity on the connection. We call XDPSForceEvents, which
+ calls XCheckIfEvent, which ultimately may call XFlush
+ (if there are no events queued). The XNoOp call puts
+ a message in the outgoing queue, so that XFlush is forced
+ to write on the connection. When it tries to write, the
+ error condition will be noted and XIOError will be called,
+ usually causing the application to terminate. Note that
+ the error won't happen until the second time thru this
+ loop, but that's ok. */
+ }
+ }
+ return (0);
+}
+
+
+void XDPSSetContextEncoding (
+ DPSContext ctxt,
+ DPSProgramEncoding progEncoding,
+ DPSNameEncoding nameEncoding)
+{
+ /* This routine should not be called if ctxt is a text context */
+
+ if ((nameEncoding != dps_indexed && nameEncoding != dps_strings) ||
+ (progEncoding != dps_ascii && progEncoding != dps_encodedTokens &&
+ progEncoding != dps_binObjSeq))
+ {
+ if (ctxt->errorProc != NIL)
+ (*ctxt->errorProc) (ctxt, dps_err_encodingCheck,
+ nameEncoding, progEncoding);
+ return;
+ }
+ else if (progEncoding == dps_ascii || progEncoding == dps_encodedTokens ||
+ nameEncoding == dps_strings)
+ ctxt->procs = XDPSconvProcs;
+ else
+ ctxt->procs = XDPSrawProcs;
+
+ ctxt->nameEncoding = nameEncoding;
+ ctxt->programEncoding = progEncoding;
+}
+
+
+/* ARGSUSED */
+void DPSDefaultTextBackstop (ctxt, buf, count)
+ DPSContext ctxt;
+ char *buf;
+ long unsigned int count;
+{
+ if (buf == NULL || count == 0)
+ {
+ (void) fflush(stdout);
+ return;
+ }
+ (void) fwrite (buf, sizeof (char), count, stdout);
+ (void) fflush (stdout);
+}
+
+/* ARGSUSED */
+void DPSInitClient(
+ DPSTextProc textProc,
+ void (*releaseProc) (char *, char *))
+{
+ DPSAssert (releaseProc != NIL);
+ XDPSSetProcs ();
+ DPSSetTextBackstop (DPSDefaultTextBackstop);
+ DPSSetErrorBackstop (DPSDefaultErrorProc);
+}
+
+
+DPSNumFormat XDPSNumFormat (
+ Display *dpy)
+{
+ PRegstDPY rdpy;
+
+ if ((rdpy = IsRegistered (dpy)) == NIL)
+ return ((DPSNumFormat) -1);
+ else
+ return ((rdpy->ctxtTokenType < DPS_HI_NATIVE) ? dps_ieee : dps_native);
+}
+
+XDPSPrivContext XDPSCreatePrivContextRec (
+ Display *dpy,
+ Drawable drawable,
+ GC gc,
+ int x,
+ int y,
+ unsigned int eventmask,
+ XStandardColormap *grayramp,
+ XStandardColormap *ccube,
+ int actual,
+ int secure)
+{
+ int event_base;
+ int token_type; /* From server. */
+ char *num_format_name; /* From server. */
+ PRegstDPY rdpy;
+ XDPSPrivContext wh;
+
+ if (DPSInitialize() != 0) return(NULL);
+ if ((rdpy = IsRegistered (dpy)) == NIL)
+ {
+ /* DPS extension on this dpy? */
+ event_base = XDPSLInit (dpy, &token_type, &num_format_name);
+ if (event_base >= 0 &&
+ (rdpy = (PRegstDPY) calloc (sizeof (RegstDPYRec), 1)))
+ {
+ XDPSLSetTextEventHandler (dpy, (XDPSLEventHandler) OutputEventHandler);
+ XDPSLSetStatusEventHandler (dpy, (XDPSLEventHandler) XDPSStatusEventHandler);
+ XDPSLSetReadyEventHandler (dpy, (XDPSLEventHandler) XDPSReadyEventHandler);
+ XDPSLInitDisplayFlags(dpy);
+ rdpy->dpy = dpy;
+ rdpy->firstEvent = event_base;
+ rdpy->next = firstDPY;
+
+ rdpy->prefTokenType = (unsigned char) token_type;
+
+ if (strcmp (num_format_name, DPS_FORMATNAME) == 0)
+ rdpy->ctxtTokenType = DPS_DEF_TOKENTYPE;
+ else
+ /* Everybody must talk ieee! */
+#if SWAPBITS
+ rdpy->ctxtTokenType = DPS_LO_IEEE;
+#else /* SWAPBITS */
+ rdpy->ctxtTokenType = DPS_HI_IEEE;
+#endif /* SWAPBITS */
+
+ firstDPY = rdpy;
+ }
+ else
+ return (NULL);
+ }
+
+ if ((wh = (XDPSPrivContext) calloc (sizeof (XDPSPrivContextRec), 1)) != 0)
+ {
+ wh->dpy = dpy;
+ wh->drawable = drawable;
+ wh->gc = gc;
+ wh->x = x;
+ wh->y = y;
+ wh->eventmask = eventmask;
+ wh->grayramp = grayramp;
+ wh->ccube = ccube;
+ wh->actual = actual;
+ wh->newObjFormat = format_operands[rdpy->ctxtTokenType - DPS_HI_IEEE];
+ wh->secure = secure;
+ return (wh);
+ }
+ else
+ return (NULL);
+}
+
+
+DPSNumFormat DPSCreatePrivContext (
+ XDPSPrivContext wh,
+ DPSContext ctxt,
+ ContextPSID *cidP,
+ SpaceXID *sxidP,
+ boolean newSpace,
+ DPSClientPrintProc printProc)
+{
+ PRegstDPY rdpy;
+
+ if (clientPrintProc == NIL)
+ clientPrintProc = printProc;
+
+ if ((rdpy = IsRegistered (wh->dpy)) == NIL)
+ return ((DPSNumFormat) -1);
+
+ if (newSpace || sxidP == NIL)
+ wh->cxid = XDPSLCreateContextAndSpace (wh->dpy, wh->drawable, wh->gc,
+ wh->x, wh->y, wh->eventmask,
+ wh->grayramp, wh->ccube,
+ wh->actual, cidP, sxidP,
+ wh->secure); /* L2-DPS/PROTO 9 */
+ else
+ wh->cxid = XDPSLCreateContext (wh->dpy, *sxidP, wh->drawable, wh->gc,
+ wh->x, wh->y, wh->eventmask,
+ wh->grayramp, wh->ccube, wh->actual, cidP,
+ wh->secure); /* L2-DPS/PROTO 9 */
+ if (wh->cxid == None) return((DPSNumFormat) -1);
+ wh->ctxt = ctxt;
+ if (wh->newObjFormat != NIL)
+ {
+ XDPSLGiveInput (wh->dpy, wh->cxid, wh->newObjFormat, 1);
+ XDPSLGiveInput (wh->dpy, wh->cxid, " setobjectformat\n", 17);
+ }
+
+ if (rdpy->ctxtTokenType != DPS_DEF_TOKENTYPE)
+ ctxt->procs = XDPSconvProcs;
+ return ((rdpy->ctxtTokenType < DPS_HI_NATIVE) ? dps_ieee : dps_native);
+}
+
+
+void DPSIncludePrivContext (
+ XDPSPrivContext wh,
+ DPSContext ctxt,
+ ContextPSID cid,
+ SpaceXID sxid,
+ DPSClientPrintProc printProc)
+{
+ XDPSPrivContext newWh;
+ SpaceXID space;
+
+ if (clientPrintProc == NIL)
+ clientPrintProc = printProc;
+
+ newWh = (XDPSPrivContext) calloc (sizeof (XDPSPrivContextRec), 1);
+ if (!newWh) DPSOutOfMemory();
+ *newWh = *wh;
+ if (IsRegistered (wh->dpy) != NIL)
+ {
+ newWh->cxid = XDPSLCreateContextFromID (wh->dpy, cid, &space);
+ DPSAssertWarn (space == sxid, ctxt, "attempting context from context ID from different space");
+ newWh->ctxt = ctxt;
+ /* Did we have to change object format for parent context? */
+ /* Note: the child context must inherit the object format of
+ its parent. When this happens in the server there
+ will be no need for the following code segment. */
+ if (wh->newObjFormat != NIL) /* Yes, do it for the child too. */
+ {
+ XDPSLGiveInput (wh->dpy, newWh->cxid, wh->newObjFormat, 1);
+ XDPSLGiveInput (wh->dpy, newWh->cxid, " setobjectformat\n", 17);
+ }
+ }
+ else
+ {
+ newWh->cxid = 0; /* Must not refer to a good context. */
+ newWh->ctxt = NIL;
+ }
+
+ (void) DPSSetWh (ctxt, (char *) newWh);
+}
+
+/* ARGSUSED */
+void DPSSendPostScript (
+ register XDPSPrivContext wh,
+ DPSClientPrintProc printProc,
+ ContextPSID cid,
+ char *buffer,
+ long int count,
+ boolean (*returnControl)(void))
+{
+ boolean blocking = buffer == NIL;
+
+ if (IsRegistered (wh->dpy) == NIL)
+ (*printProc) (wh->ctxt, NIL, 0);
+ else {
+ if (count > 0)
+ XDPSLGiveInput (wh->dpy, wh->cxid, buffer, count);
+
+ if (blocking) {
+ XDPSLFlush (wh->dpy);
+ if (BlockForEvent (wh->dpy) < 0 && wh->ctxt->errorProc != NIL) {
+ (*(wh->ctxt->errorProc)) (wh->ctxt, dps_err_closedDisplay,
+ ConnectionNumber(wh->dpy),
+ 0);
+ }
+ }
+ DPSCheckRaiseError(wh->ctxt);
+ }
+}
+
+
+/* ARGSUSED */
+void DPSSendInterrupt (
+ XDPSPrivContext wh,
+ ContextPSID cid,
+ DPSClientPrintProc printProc)
+{
+ XDPSLNotifyContext (wh->dpy, wh->cxid, PSINTERRUPT);
+}
+
+
+/* ARGSUSED */
+void DPSSendEOF (
+ XDPSPrivContext wh,
+ ContextPSID cid,
+ DPSClientPrintProc printProc)
+{
+ XDPSLReset (wh->dpy, wh->cxid);
+}
+
+
+/* ARGSUSED */
+void DPSSendTerminate (
+ XDPSPrivContext wh,
+ ContextPSID cid,
+ DPSClientPrintProc printProc)
+{
+ XDPSLNotifyContext (wh->dpy, wh->cxid, PSKILL);
+}
+
+
+void XDPSSendUnfreeze (
+ Display *dpy,
+ ContextXID cxid)
+{
+ XDPSLNotifyContext (dpy, cxid, PSUNFREEZE);
+}
+
+
+/* ARGSUSED */
+void DPSSendDestroySpace(
+ XDPSPrivContext wh,
+ SpaceXID sxid,
+ DPSClientPrintProc printProc)
+{
+ XDPSLDestroySpace (wh->dpy, sxid);
+}
+
+
+void DPSOutOfMemory (void)
+{
+ DPSFatalProc(NULL, "DPS Client Library Error: Out of memory.\n");
+ exit (1);
+}
diff --git a/nx-X11/lib/dps/dpsXpriv.h b/nx-X11/lib/dps/dpsXpriv.h
new file mode 100644
index 000000000..56b25b757
--- /dev/null
+++ b/nx-X11/lib/dps/dpsXpriv.h
@@ -0,0 +1,187 @@
+/*
+ * dpsXpriv.h -- client lib internal impl interface for the X version
+ *
+ * (c) Copyright 1989-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef DPSXPRIVATE_H
+#define DPSXPRIVATE_H
+
+#ifdef VMS
+#include <decw$include/X.h>
+#include <decw$include/Xlib.h>
+#include <decw$include/Xutil.h>
+#else /* VMS */
+#include <X11/X.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#endif /* VMS */
+
+#include <DPS/XDPSlib.h>
+#include "DPS/dpsclient.h"
+#include "dpsprivate.h"
+#include "DPS/dpsXclient.h"
+#include "publictypes.h"
+
+/* typedefs */
+
+typedef struct _t_XDPSPrivContextRec
+ {
+ Display *dpy;
+ Drawable drawable;
+ GC gc;
+ int x;
+ int y;
+ unsigned int eventmask;
+ XStandardColormap *grayramp;
+ XStandardColormap *ccube;
+ int actual;
+ DPSContext ctxt; /* Points back to its context */
+ ContextXID cxid;
+ char *newObjFormat; /* This is the object format that a */
+ /* new context must use for sending */
+ /* BOS's to the client. If the */
+ /* server and client have the same */
+ /* number formats then this will be */
+ /* null. */
+ int secure;
+ } XDPSPrivContextRec, *XDPSPrivContext;
+
+
+extern DPSProcs XDPSconvProcs;
+extern DPSProcs XDPSrawProcs;
+extern int XDPSQuitBlocking;
+
+
+extern XDPSPrivContext XDPSCreatePrivContextRec (
+ Display * /* dpy */,
+ Drawable /* drawable */,
+ GC /* gc */,
+ int /* x */,
+ int /* y */,
+ unsigned int /* eventmask */,
+ XStandardColormap * /* grayramp */,
+ XStandardColormap * /* ccube */,
+ int /* actual */,
+ int /* secure */);
+
+ /* See if dpy supports the DPS extension. If not, return NULL. If so,
+ it sets up a private context object that is used for creating
+ contexts and spaces. */
+
+extern DPSNumFormat DPSCreatePrivContext(
+ XDPSPrivContext /* wh */,
+ DPSContext /* ctxt */,
+ ContextPSID * /* cidP */,
+ SpaceXID * /* sxidP */,
+ boolean /* newSpace */,
+ DPSClientPrintProc /* printProc */);
+ /* returns -1 if server can't create the context */
+
+extern void DPSIncludePrivContext(
+ XDPSPrivContext /* wh */,
+ DPSContext /* ctxt */,
+ ContextPSID /* cid */,
+ SpaceXID /* sxid */,
+ DPSClientPrintProc /* printProc */);
+
+extern void DPSSendPostScript(
+ XDPSPrivContext /* wh */,
+ DPSClientPrintProc /* printProc */,
+ ContextPSID /* cid */,
+ char * /* buffer */,
+ long int /* count */,
+ boolean (* /* returnControl */)(void));
+
+extern void DPSSendInterrupt(
+ XDPSPrivContext /* wh */,
+ ContextPSID /* cid */,
+ DPSClientPrintProc /* printProc */);
+
+extern void DPSSendEOF(
+ XDPSPrivContext /* wh */,
+ ContextPSID /* cid */,
+ DPSClientPrintProc /* printProc */);
+
+extern void DPSSendTerminate(
+ XDPSPrivContext /* wh */,
+ ContextPSID /* cid */,
+ DPSClientPrintProc /* printProc */);
+
+extern void XDPSPrivZapDpy(
+ Display * /* dpy */);
+
+extern DPSNumFormat XDPSNumFormat (Display * /* dpy */);
+
+ /* Determine the number format for server over the "dpy" connection. */
+
+extern void XDPSSetProcs (void);
+
+ /* Set pointers to raw and conversion context procs. */
+
+extern void XDPSSetContextEncoding (
+ DPSContext /* ctxt */,
+ DPSProgramEncoding /* progEncoding */,
+ DPSNameEncoding /* nameEncoding */);
+
+ /* Sets context's program and name encodings to new values. */
+
+extern void XDPSStatusEventHandler (XDPSLStatusEvent * /* event */);
+
+ /* Is registered with Xlib and is called when a dps status event is
+ received. It determines what context the event belongs to and,
+ if that context has a status event handler, calls its handler
+ passing it the status type. */
+
+extern void XDPSReadyEventHandler (XDPSLReadyEvent * /* event */);
+
+ /* Is registered with Xlib and is called when a dps ready event is
+ received. It determines what context the event belongs to and,
+ if that context has a status event handler, calls its handler
+ passing it the ready data. */
+
+extern void XDPSForceEvents (Display * /* dpy */);
+
+ /* Forces processing of events that are pending over the 'dpy'
+ connection. This causes DPS events to be handled by their handlers. */
+
+extern void XDPSSendUnfreeze (Display * /* dpy */, ContextXID /* cxid */);
+
+extern void DPSSendDestroySpace(
+ XDPSPrivContext /* wh */,
+ SpaceXID /* sxid */,
+ DPSClientPrintProc /* printProc */);
+
+#endif /* DPSXPRIVATE_H */
diff --git a/nx-X11/lib/dps/dpsXtdisp.c b/nx-X11/lib/dps/dpsXtdisp.c
new file mode 100644
index 000000000..d778a3245
--- /dev/null
+++ b/nx-X11/lib/dps/dpsXtdisp.c
@@ -0,0 +1,109 @@
+/*
+ * dpsXtdisp.c
+ *
+ * (c) Copyright 1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#include <X11/Intrinsic.h>
+
+#if XtSpecificationRelease < 6
+
+#include "dpsassert.h"
+
+void XDPSSetXtEventDispatching(Display *dpy)
+{
+ DPSFatalProc(NULL, "Attempt to use XDPSSetXtEventDispatching with pre-R6 Intrinsics\n");
+ exit(1);
+}
+
+#else
+
+#include <DPS/XDPSlib.h>
+#include <DPS/dpsXclient.h>
+
+typedef struct _DpyProcRec {
+ Display *dpy;
+ XtEventDispatchProc oldproc;
+ struct _DpyProcRec *next;
+} DpyProcRec;
+
+static DpyProcRec *dpyProcList = NULL;
+
+static Boolean NXDispatcher(XEvent *event)
+{
+ DpyProcRec *d;
+
+ if (XDPSDispatchEvent(event)) return True;
+
+ for (d = dpyProcList; d != NULL && d->dpy != event->xany.display;
+ d = d->next) {}
+ if (d != NULL) return (*(d->oldproc))(event);
+ else return False;
+}
+
+void XDPSSetXtEventDispatching(Display *dpy)
+{
+ int codes;
+ XExtCodes *c;
+
+ codes = XDPSLInit(dpy, (int *) NULL, (char **) NULL);
+
+ if (codes == -1) return; /* No extension or NX, so nothing to do */
+ else {
+ (void) XDPSSetEventDelivery(dpy, dps_event_pass_through);
+ c = XDPSLGetCodes(dpy);
+
+ /* First check for NX */
+ if (!c->first_event) {
+ DpyProcRec *d = XtNew(DpyProcRec);
+ d->dpy = dpy;
+ d->next = dpyProcList;
+ d->oldproc =
+ XtSetEventDispatcher(dpy, ClientMessage, NXDispatcher);
+ dpyProcList = d;
+
+ } else {
+ /* Extension */
+ (void) XtSetEventDispatcher(dpy, c->first_event + PSEVENTSTATUS,
+ (XtEventDispatchProc) XDPSDispatchEvent);
+ (void) XtSetEventDispatcher(dpy, c->first_event + PSEVENTOUTPUT,
+ (XtEventDispatchProc) XDPSDispatchEvent);
+ (void) XtSetEventDispatcher(dpy, c->first_event + PSEVENTREADY,
+ (XtEventDispatchProc) XDPSDispatchEvent);
+ }
+ }
+}
+
+#endif
diff --git a/nx-X11/lib/dps/dpsabbrev.c b/nx-X11/lib/dps/dpsabbrev.c
new file mode 100644
index 000000000..20b3ef713
--- /dev/null
+++ b/nx-X11/lib/dps/dpsabbrev.c
@@ -0,0 +1,360 @@
+/*
+ * dpsabbrev.c -- Implementation of Client Library abbrev mode
+ *
+ * (c) Copyright 1993-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86$ */
+
+#include <string.h>
+#include "publictypes.h"
+#include "DPS/dpsclient.h"
+#include "dpsprivate.h"
+
+static DPSAbbrevRec abbrev[] = {
+ {1, "add", "!+"},
+ {10, "ashow", "!a"},
+ {12, "awidthshow", "!A"},
+ {13, "begin", "!B"},
+ {14, "bind", "!b"},
+ {20, "clip", "!CL"},
+ {22, "closepath", "!c"},
+ {23, "concat", "!CC"},
+ {25, "copy", "!CP"},
+ {39, "currentmatrix", "!CM"},
+ {40, "currentpoint", "!Cp"},
+ {43, "curveto", "!C"},
+ {51, "def", "!D"},
+ {53, "dict", "!d"},
+ {62, "exch", "!E"},
+ {63, "exec", "!e"},
+ {66, "fill", "!F"},
+ {67, "findfont", "!f"},
+ {77, "grestore", "!G"},
+ {78, "gsave", "!g"},
+ {85, "ifelse", "!I"},
+ {88, "index", "!i"},
+ {98, "length", "!LE"},
+ {99, "lineto", "!L"},
+ {100, "load", "!l"},
+ {103, "makefont", "!MF"},
+ {104, "matrix", "!m"},
+ {107, "moveto", "!M"},
+ {111, "newpath", "!N"},
+ {113, "null", "!n"},
+ {117, "pop", "!p"},
+ {122, "rcurveto", "!RC"},
+ {127, "rectclip", "!R"},
+ {128, "rectfill", "!RF"},
+ {129, "rectstroke", "!RS"},
+ {131, "repeat", "!RP"},
+ {132, "restore", "!Rs"},
+ {133, "rlineto", "!r"},
+ {134, "rmoveto", "!RM"},
+ {135, "roll", "!RL"},
+ {136, "rotate", "!RO"},
+ {137, "round", "!RN"},
+ {138, "save", "!SV"},
+ {139, "scale", "!SC"},
+ {140, "scalefont", "!SF"},
+ {142, "selectfont", "!s"},
+ {147, "setcmykcolor", "!Sc"},
+ {148, "setdash", "!SD"},
+ {149, "setfont", "!Sf"},
+ {150, "setgray", "!Sg"},
+ {152, "sethsbcolor", "!Sh"},
+ {153, "setlinecap", "!SL"},
+ {154, "setlinejoin", "!SJ"},
+ {155, "setlinewidth", "!SW"},
+ {156, "setmatrix", "!SM"},
+ {157, "setrgbcolor", "!Sr"},
+ {158, "setshared", "!SS"},
+ {160, "show", "!S"},
+ {161, "showpage", "!SP"},
+ {167, "stroke", "!ST"},
+ {170, "systemdict", "!Sd"},
+ {173, "translate", "!T"},
+ {182, "userdict", "!u"},
+ {186, "where", "!w"},
+ {187, "widthshow", "!W"},
+ {194, "xshow", "!X"},
+ {195, "xyshow", "!x"},
+ {196, "yshow", "!Y"},
+};
+
+static short abbrevPtr[] = {
+ -1, /* 0 */
+ 0, /* 1 */
+ -1, /* 2 */
+ -1, /* 3 */
+ -1, /* 4 */
+ -1, /* 5 */
+ -1, /* 6 */
+ -1, /* 7 */
+ -1, /* 8 */
+ -1, /* 9 */
+ 1, /* 10 */
+ -1, /* 11 */
+ 2, /* 12 */
+ 3, /* 13 */
+ 4, /* 14 */
+ -1, /* 15 */
+ -1, /* 16 */
+ -1, /* 17 */
+ -1, /* 18 */
+ -1, /* 19 */
+ 5, /* 20 */
+ -1, /* 21 */
+ 6, /* 22 */
+ 7, /* 23 */
+ -1, /* 24 */
+ 8, /* 25 */
+ -1, /* 26 */
+ -1, /* 27 */
+ -1, /* 28 */
+ -1, /* 29 */
+ -1, /* 30 */
+ -1, /* 31 */
+ -1, /* 32 */
+ -1, /* 33 */
+ -1, /* 34 */
+ -1, /* 35 */
+ -1, /* 36 */
+ -1, /* 37 */
+ -1, /* 38 */
+ 9, /* 39 */
+ 10, /* 40 */
+ -1, /* 41 */
+ -1, /* 42 */
+ 11, /* 43 */
+ -1, /* 44 */
+ -1, /* 45 */
+ -1, /* 46 */
+ -1, /* 47 */
+ -1, /* 48 */
+ -1, /* 49 */
+ -1, /* 50 */
+ 12, /* 51 */
+ -1, /* 52 */
+ 13, /* 53 */
+ -1, /* 54 */
+ -1, /* 55 */
+ -1, /* 56 */
+ -1, /* 57 */
+ -1, /* 58 */
+ -1, /* 59 */
+ -1, /* 60 */
+ -1, /* 61 */
+ 14, /* 62 */
+ 15, /* 63 */
+ -1, /* 64 */
+ -1, /* 65 */
+ 16, /* 66 */
+ 17, /* 67 */
+ -1, /* 68 */
+ -1, /* 69 */
+ -1, /* 70 */
+ -1, /* 71 */
+ -1, /* 72 */
+ -1, /* 73 */
+ -1, /* 74 */
+ -1, /* 75 */
+ -1, /* 76 */
+ 18, /* 77 */
+ 19, /* 78 */
+ -1, /* 79 */
+ -1, /* 80 */
+ -1, /* 81 */
+ -1, /* 82 */
+ -1, /* 83 */
+ -1, /* 84 */
+ 20, /* 85 */
+ -1, /* 86 */
+ -1, /* 87 */
+ 21, /* 88 */
+ -1, /* 89 */
+ -1, /* 90 */
+ -1, /* 91 */
+ -1, /* 92 */
+ -1, /* 93 */
+ -1, /* 94 */
+ -1, /* 95 */
+ -1, /* 96 */
+ -1, /* 97 */
+ 22, /* 98 */
+ 23, /* 99 */
+ 24, /* 100 */
+ -1, /* 101 */
+ -1, /* 102 */
+ 25, /* 103 */
+ 26, /* 104 */
+ -1, /* 105 */
+ -1, /* 106 */
+ 27, /* 107 */
+ -1, /* 108 */
+ -1, /* 109 */
+ -1, /* 110 */
+ 28, /* 111 */
+ -1, /* 112 */
+ 29, /* 113 */
+ -1, /* 114 */
+ -1, /* 115 */
+ -1, /* 116 */
+ 30, /* 117 */
+ -1, /* 118 */
+ -1, /* 119 */
+ -1, /* 120 */
+ -1, /* 121 */
+ 31, /* 122 */
+ -1, /* 123 */
+ -1, /* 124 */
+ -1, /* 125 */
+ -1, /* 126 */
+ 32, /* 127 */
+ 33, /* 128 */
+ 34, /* 129 */
+ -1, /* 130 */
+ 35, /* 131 */
+ 36, /* 132 */
+ 37, /* 133 */
+ 38, /* 134 */
+ 39, /* 135 */
+ 40, /* 136 */
+ 41, /* 137 */
+ 42, /* 138 */
+ 43, /* 139 */
+ 44, /* 140 */
+ -1, /* 141 */
+ 45, /* 142 */
+ -1, /* 143 */
+ -1, /* 144 */
+ -1, /* 145 */
+ -1, /* 146 */
+ 46, /* 147 */
+ 47, /* 148 */
+ 48, /* 149 */
+ 49, /* 150 */
+ -1, /* 151 */
+ 50, /* 152 */
+ 51, /* 153 */
+ 52, /* 154 */
+ 53, /* 155 */
+ 54, /* 156 */
+ 55, /* 157 */
+ 56, /* 158 */
+ -1, /* 159 */
+ 57, /* 160 */
+ 58, /* 161 */
+ -1, /* 162 */
+ -1, /* 163 */
+ -1, /* 164 */
+ -1, /* 165 */
+ -1, /* 166 */
+ 59, /* 167 */
+ -1, /* 168 */
+ -1, /* 169 */
+ 60, /* 170 */
+ -1, /* 171 */
+ -1, /* 172 */
+ 61, /* 173 */
+ -1, /* 174 */
+ -1, /* 175 */
+ -1, /* 176 */
+ -1, /* 177 */
+ -1, /* 178 */
+ -1, /* 179 */
+ -1, /* 180 */
+ -1, /* 181 */
+ 62, /* 182 */
+ -1, /* 183 */
+ -1, /* 184 */
+ -1, /* 185 */
+ 63, /* 186 */
+ 64, /* 187 */
+ -1, /* 188 */
+ -1, /* 189 */
+ -1, /* 190 */
+ -1, /* 191 */
+ -1, /* 192 */
+ -1, /* 193 */
+ 65, /* 194 */
+ 66, /* 195 */
+ 67, /* 196 */
+ -1, /* 197 */
+ -1, /* 198 */
+ -1, /* 199 */
+ -1, /* 200 */
+ -1, /* 201 */
+ -1, /* 202 */
+ -1, /* 203 */
+ -1, /* 204 */
+ -1, /* 205 */
+ -1, /* 206 */
+ -1, /* 207 */
+ -1, /* 208 */
+ -1, /* 209 */
+ -1, /* 210 */
+ -1, /* 211 */
+};
+
+void DPSFetchAbbrevList(DPSAbbrevRec **list, int *count)
+{
+ *list = abbrev;
+ *count = sizeof(abbrev) / sizeof(abbrev[0]);
+}
+
+char *DPSGetSysnameAbbrev(int n)
+{
+ if ((unsigned) n > sizeof(abbrevPtr) / sizeof(abbrevPtr[0])) return NULL;
+ if (abbrevPtr[n] == -1) return NULL;
+ return abbrev[abbrevPtr[n]].abbrev;
+}
+
+char *DPSGetOperatorAbbrev(char *op)
+{
+ int min, max, n;
+ int res;
+
+ min = 0;
+ max = sizeof(abbrev) / sizeof(abbrev[0]) - 1;
+
+ while (min <= max) {
+ n = (max + min) / 2;
+ res = strcmp(op, abbrev[n].operatorName);
+ if (res == 0) return abbrev[n].abbrev;
+ if (res < 0) max = n - 1;
+ if (res > 0) min = n + 1;
+ }
+ return NULL;
+}
diff --git a/nx-X11/lib/dps/dpsassert.h b/nx-X11/lib/dps/dpsassert.h
new file mode 100644
index 000000000..00632a111
--- /dev/null
+++ b/nx-X11/lib/dps/dpsassert.h
@@ -0,0 +1,57 @@
+/*
+ * dpsassert.h
+ *
+ * (c) Copyright 1991-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef DPSASSERT_H
+#define DPSASSERT_H
+
+#include "DPS/dpsclient.h"
+
+#define DPSAssertWarn(cndtn, cntxt, mssg)\
+ if (!(cndtn)) DPSWarnProc((DPSContext)(cntxt),(mssg))
+
+extern void DPSWarnProc(DPSContext ctxt, char *msg);
+extern void DPSFatalProc(DPSContext ctxt, char *msg);
+extern void DPSCantHappen(void);
+
+#define DPSAssert(condition) \
+ if (! (condition)) DPSCantHappen();
+/* Tests whether the specified condition is true and aborts the
+ entire application if not.
+ */
+
+#endif /* DPSASSERT_H */
diff --git a/nx-X11/lib/dps/dpsclient.c b/nx-X11/lib/dps/dpsclient.c
new file mode 100644
index 000000000..c75d76ce8
--- /dev/null
+++ b/nx-X11/lib/dps/dpsclient.c
@@ -0,0 +1,2969 @@
+/*
+ * dpsclient.c -- Implementation of the Display PostScript Client Library.
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86$ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "dpsXpriv.h"
+#include "DPS/dpsclient.h"
+#include "dpsprivate.h"
+#include "dpsdict.h"
+#include "DPS/dpsexcept.h"
+#include "dpsassert.h"
+
+#ifdef XDPS
+#include "dpsXint.h"
+#endif /* XDPS */
+
+#if defined(SVR4) || defined(SYSV) || defined(SystemV)
+#define os_bcopy(f,t,c) memcpy(t,f,c)
+#else
+#define os_bcopy(f,t,c) bcopy(f,t,c)
+#endif
+
+#if !IEEEFLOAT
+extern void IEEEHighToNative(/* FloatRep *from, real *to */);
+/* Converts from IEEE high-byte-first real to native real. */
+
+extern void NativeToIEEEHigh(/* real *from, FloatRep *to */);
+/* Converts from native real to IEEE high-byte-first real. */
+
+extern void IEEELowToNative(/* FloatRep *from, real *to */);
+/* Converts from IEEE low-byte-first real to native real. */
+
+extern void NativeToIEEELow(/* real *from, FloatRep *to */);
+/* Converts from native real to IEEE low-byte-first real. */
+#endif /* !IEEEFLOAT */
+
+typedef union { /* 32 bit number representations */
+ unsigned int u;
+ int i;
+ float f;
+ unsigned char bytes[4];
+ /* raw bytes, in whatever order they appear in memory */
+ } Swap32Rec;
+
+typedef union { /* 16 bit number representations */
+ unsigned short u;
+ short i;
+ unsigned char bytes[2];
+ } Swap16Rec;
+
+#if SWAPBITS
+#define Copy4SrcLo(src, dst)\
+ (((Swap32Rec *) dst)->bytes[0] = ((Swap32Rec *) src)->bytes[0], \
+ ((Swap32Rec *) dst)->bytes[1] = ((Swap32Rec *) src)->bytes[1], \
+ ((Swap32Rec *) dst)->bytes[2] = ((Swap32Rec *) src)->bytes[2], \
+ ((Swap32Rec *) dst)->bytes[3] = ((Swap32Rec *) src)->bytes[3] )
+#define Copy4SrcHi(src, dst)\
+ (((Swap32Rec *) dst)->bytes[0] = ((Swap32Rec *) src)->bytes[3], \
+ ((Swap32Rec *) dst)->bytes[1] = ((Swap32Rec *) src)->bytes[2], \
+ ((Swap32Rec *) dst)->bytes[2] = ((Swap32Rec *) src)->bytes[1], \
+ ((Swap32Rec *) dst)->bytes[3] = ((Swap32Rec *) src)->bytes[0] )
+#define Copy2SrcLo(src, dst)\
+ (((Swap16Rec *) dst)->bytes[0] = ((Swap16Rec *) src)->bytes[0], \
+ ((Swap16Rec *) dst)->bytes[1] = ((Swap16Rec *) src)->bytes[1] )
+#define Copy2SrcHi(src, dst)\
+ (((Swap16Rec *) dst)->bytes[0] = ((Swap16Rec *) src)->bytes[1], \
+ ((Swap16Rec *) dst)->bytes[1] = ((Swap16Rec *) src)->bytes[0] )
+#else /* SWAPBITS */
+#define Copy4SrcHi(src, dst)\
+ (((Swap32Rec *) dst)->bytes[0] = ((Swap32Rec *) src)->bytes[0], \
+ ((Swap32Rec *) dst)->bytes[1] = ((Swap32Rec *) src)->bytes[1], \
+ ((Swap32Rec *) dst)->bytes[2] = ((Swap32Rec *) src)->bytes[2], \
+ ((Swap32Rec *) dst)->bytes[3] = ((Swap32Rec *) src)->bytes[3] )
+#define Copy4SrcLo(src, dst)\
+ (((Swap32Rec *) dst)->bytes[0] = ((Swap32Rec *) src)->bytes[3], \
+ ((Swap32Rec *) dst)->bytes[1] = ((Swap32Rec *) src)->bytes[2], \
+ ((Swap32Rec *) dst)->bytes[2] = ((Swap32Rec *) src)->bytes[1], \
+ ((Swap32Rec *) dst)->bytes[3] = ((Swap32Rec *) src)->bytes[0] )
+#define Copy2SrcHi(src, dst)\
+ (((Swap16Rec *) dst)->bytes[0] = ((Swap16Rec *) src)->bytes[0], \
+ ((Swap16Rec *) dst)->bytes[1] = ((Swap16Rec *) src)->bytes[1] )
+#define Copy2SrcLo(src, dst)\
+ (((Swap16Rec *) dst)->bytes[0] = ((Swap16Rec *) src)->bytes[1], \
+ ((Swap16Rec *) dst)->bytes[1] = ((Swap16Rec *) src)->bytes[0] )
+#endif /* SWAPBITS */
+
+
+#define DPS_ERR_TAG 250
+
+#define CONTEXTBUFFERSIZE 256
+#define MAXQUEUEDBUFFERS 5
+
+DPSContext DPSGlobalContext;
+
+Globals DPSglobals = NULL;
+
+char *DPScalloc(integer e, integer n)
+{
+ char *p;
+ while (!(p = (char *)calloc(e, n))) {
+ DPSOutOfMemory();
+ }
+ return p;
+}
+
+
+
+void DPSSafeSetLastNameIndex(DPSContext ctxt)
+{
+ /* we're about to call the error handler, so roll back the
+ lastNameIndex to the last known valid index */
+ DPSCheckInitClientGlobals();
+ if (ctxt != dummyCtx && ctxt->space != NIL)
+ ((DPSPrivContext)ctxt)->lastNameIndex = ((DPSPrivSpace)(ctxt->space))->lastNameIndex;
+}
+
+void DPSCheckInitClientGlobals(void)
+{
+ if (!DPSglobals) {
+ DPSglobals = (Globals)DPScalloc(sizeof(GlobalsRec), 1);
+ globLastNameIndex = -1;
+ }
+}
+
+/**************************************************************/
+/* Procedures that support the DPSCreateContext context procs */
+/**************************************************************/
+
+/* ARGSUSED */
+static void ReleaseInput(
+ char *unused, char *buffer)
+{
+ ContextBuffer cb = (ContextBuffer)buffer;
+ if (cb == NIL) return;
+ cb->next = contextBuffers;
+ contextBuffers = cb;
+ queuedBuffers--;
+}
+
+/* ARGSUSED */
+static void StuffResultVal(
+ DPSContext ctxt,
+ DPSResults result,
+ integer tag,
+ DPSBinObj obj)
+{
+
+ integer type = obj->attributedType & ~DPS_EXEC;
+ integer nObjs = 1;
+
+ /* check if array */
+ if (type == DPS_ARRAY) {
+ nObjs = obj->length;
+ if (nObjs < 1) return;
+ if (result->count == -1 && nObjs != 1) {
+ DPSSafeSetLastNameIndex(ctxt);
+ if (ctxt->errorProc != NIL)
+ (*ctxt->errorProc)(ctxt, dps_err_resultTypeCheck, (long unsigned)obj, 0);
+ return;
+ }
+ obj = (DPSBinObj) ((char *)obj + obj->val.arrayVal);
+ type = obj->attributedType & ~DPS_EXEC;
+ }
+
+ do {
+ integer bump = 0;
+ if (result->count == 0) return;
+ switch (result->type) {
+ case dps_tBoolean:
+ if (type == DPS_BOOL) {
+ int *b = (int *) result->value;
+ *b = (int) obj->val.booleanVal;
+ bump = sizeof(int);
+ }
+ break;
+ case dps_tFloat: {
+ float *f = (float *) result->value;
+ if (type == DPS_REAL) {
+ *f = obj->val.realVal;
+ bump = sizeof(float);
+ }
+ else if (type == DPS_INT) {
+ *f = (float) obj->val.integerVal;
+ bump = sizeof(float);
+ }
+ break;
+ }
+ case dps_tDouble: {
+ double *d = (double *) result->value;
+ if (type == DPS_REAL) {
+ *d = (double) obj->val.realVal;
+ bump = sizeof(double);
+ }
+ else if (type == DPS_INT) {
+ *d = (double) obj->val.integerVal;
+ bump = sizeof(double);
+ }
+ break;
+ }
+ case dps_tShort:
+ if (type == DPS_INT) {
+ short *s = (short *) result->value;
+ *s = (short) obj->val.integerVal;
+ bump = sizeof(short);
+ }
+ break;
+ case dps_tUShort:
+ if (type == DPS_INT) {
+ unsigned short *us = (unsigned short *) result->value;
+ *us = (unsigned short) obj->val.integerVal;
+ bump = sizeof(unsigned short);
+ }
+ break;
+ case dps_tInt:
+ if (type == DPS_INT) {
+ int *i = (int *) result->value;
+ *i = (int) obj->val.integerVal;
+ bump = sizeof(int);
+ }
+ break;
+ case dps_tUInt:
+ if (type == DPS_INT) {
+ unsigned int *ui = (unsigned int *) result->value;
+ *ui = (unsigned int) obj->val.integerVal;
+ bump = sizeof(unsigned int);
+ }
+ break;
+ case dps_tLong:
+ if (type == DPS_INT) {
+ long int *li = (long int *) result->value;
+ *li = obj->val.integerVal;
+ bump = sizeof(long int);
+ }
+ break;
+ case dps_tULong:
+ if (type == DPS_INT) {
+ unsigned long *u = (unsigned long *) result->value;
+ *u = (unsigned long) obj->val.integerVal;
+ bump = sizeof(unsigned long);
+ }
+ break;
+ case dps_tChar:
+ case dps_tUChar:
+ if (nObjs != 1) {
+ DPSSafeSetLastNameIndex(ctxt);
+ if (ctxt->errorProc != NIL)
+ (*ctxt->errorProc)(ctxt, dps_err_resultTypeCheck, (long unsigned)obj, 0);
+ }
+ else if (type == DPS_STRING) {
+ if (result->count == -1) {
+ /* char * result, copy first, ignore subsequent, null terminate */
+ os_bcopy(((integer)(obj->val.stringVal)) + (char *)obj,
+ result->value, obj->length);
+ (result->value)[obj->length] = '\0';
+ result->count = 0;
+ }
+ else {
+ unsigned slen;
+ if (result->count >= (int) obj->length) {
+ /* copy entire string into char array */
+ slen = obj->length;
+ }
+ else if (result->count > 0) {
+ /* copy partial string into char array */
+ slen = result->count;
+ }
+ else return; /* ignore string result, no room left */
+ os_bcopy(((integer)(obj->val.stringVal)) + (char *)obj,
+ result->value, slen);
+ result->value += slen;
+ result->count -= slen;
+ }
+ return;
+ }
+ break;
+
+ default:
+ DPSSafeSetLastNameIndex(ctxt);
+ if (ctxt->errorProc != NIL)
+ (*ctxt->errorProc)(ctxt, dps_err_resultTypeCheck, (long unsigned)obj, 0);
+ } /* switch (result->type) */
+
+ if (bump == 0) {
+ DPSSafeSetLastNameIndex(ctxt);
+ if (ctxt->errorProc != NIL)
+ (*ctxt->errorProc)(ctxt, dps_err_resultTypeCheck, (long unsigned)obj, 0);
+ return;
+ }
+ if (result->count != -1) {
+ result->count--;
+ result->value += bump;
+ }
+ obj += 1;
+ nObjs--;
+ } while (nObjs > 0); /* do */
+
+} /* StuffResultVal */
+
+
+static void NumFormatFromTokenType(
+ unsigned char t,
+ DPSNumFormat *numFormat)
+{
+ switch (t) {
+ case DPS_HI_IEEE:
+ *numFormat = dps_ieee;
+ break;
+ case DPS_LO_IEEE:
+ *numFormat = dps_ieee;
+ break;
+ case DPS_HI_NATIVE:
+ *numFormat = dps_native;
+ break;
+ case DPS_LO_NATIVE:
+ *numFormat = dps_native;
+ break;
+ default: DPSCantHappen();
+ }
+}
+
+
+#if !IEEEFLOAT
+/* called to deal with results from the server */
+static void ConvSeqInPlace(nObjs, currObj, base, tokenType)
+ integer nObjs;
+ DPSBinObj currObj;
+ char *base;
+ unsigned char tokenType;
+{
+ DPSNumFormat numFormat;
+
+ NumFormatFromTokenType(tokenType, &numFormat);
+
+ while (nObjs--) {
+ unsigned char t = currObj->attributedType & 0x07f;
+ integer i;
+ switch (t) {
+ case DPS_REAL: {
+ float f;
+ if (numFormat == dps_ieee) {
+ if (DPSDefaultByteOrder == dps_hiFirst)
+ IEEEHighToNative(&currObj->val.realVal, &f);
+ else
+ IEEELowToNative(&currObj->val.realVal, &f);
+ }
+ else break; /* switch */
+ currObj->val.realVal = f;
+ break;
+ }
+ case DPS_ARRAY:
+ if (currObj->length > 0)
+ ConvSeqInPlace(currObj->length, (DPSBinObj)(base + currObj->val.arrayVal), base, tokenType);
+ break;
+ case DPS_NAME:
+ case DPS_STRING:
+ break;
+ default:;
+ } /* end switch */
+ ++currObj;
+ } /* end while */
+}
+#endif /* !IEEEFLOAT */
+
+boolean DPSKnownContext(DPSContext ctxt)
+{
+ DPSPrivContext cc, c = (DPSPrivContext) ctxt;
+ DPSPrivSpace ss;
+ for (ss = spaces; ss != NIL; ss = ss->next)
+ for (cc = ss->firstContext; cc != NIL; cc = cc->next)
+ if (cc == c) return true;
+ return false;
+}
+
+boolean DPSKnownSpace(DPSSpace space)
+{
+ DPSPrivSpace ss, s = (DPSPrivSpace) space;
+ for (ss = spaces; ss != NIL; ss = ss->next)
+ if (ss == s) return true;
+ return false;
+}
+
+void DPSclientPrintProc (
+ DPSContext ctxt,
+ char *buf,
+ unsigned nch)
+{
+ DPSPrivContext cc = (DPSPrivContext) ctxt;
+
+#define DPS_SEQ_MIN 2
+
+ DPSCheckInitClientGlobals();
+ if (cc == NIL) cc = (DPSPrivContext)dummyCtx;
+ if (cc == NIL) return;
+
+ if (nch == 0) { /* this is an EOF */
+ DPSAssertWarn(buf == NIL, cc, "non-nil output buffer with 0 length");
+ cc->eofReceived = true;
+ if (cc->objBuf) {
+ /* we were buffering; drop buffered chars on the floor */
+ free(cc->objBuf);
+ cc->objBuf = NIL;
+ cc->nObjBufChars = 0;
+ }
+ }
+ while (nch > 0) {
+ char *oldBuf = NIL;
+ unsigned oldNch = 0;
+ unsigned n;
+ if (cc->objBuf) { /* we're buffering */
+ unsigned long int m;
+ char *b = cc->objBuf + cc->nObjBufChars;
+ integer minSize;
+ while (cc->nObjBufChars < DPS_SEQ_MIN) {
+ if (nch == 0) return;
+ *b++ = *buf++;
+ ++cc->nObjBufChars;
+ --nch;
+ }
+ b = cc->objBuf;
+ minSize = (*(b+1) == 0) ? DPS_EXT_HEADER_SIZE : DPS_HEADER_SIZE;
+ if (cc->nObjBufChars < minSize) {
+ if (nch + cc->nObjBufChars < (unsigned) minSize) {
+ os_bcopy(buf, b + cc->nObjBufChars, nch);
+ cc->nObjBufChars += nch;
+ return;
+ }
+ else {
+ os_bcopy(buf, b + cc->nObjBufChars, minSize - cc->nObjBufChars);
+ buf += minSize - cc->nObjBufChars;
+ nch -= minSize - cc->nObjBufChars;
+ cc->nObjBufChars = minSize;
+ }
+ }
+
+ if (minSize == DPS_HEADER_SIZE) {
+ unsigned short *sizeP = (unsigned short *)(cc->objBuf+2);
+ m = *sizeP;
+ }
+ else {
+ unsigned long *extSizeP = (unsigned long *)(cc->objBuf+4);
+ m = *extSizeP;
+ }
+
+ /* here with m = BOS total length in bytes, b = cc->objBuf */
+ cc->objBuf = (char *)realloc(b, m);
+
+ if (nch + cc->nObjBufChars < m) {
+ os_bcopy(buf, cc->objBuf + cc->nObjBufChars, nch);
+ cc->nObjBufChars += nch;
+ return;
+ }
+ else {
+ os_bcopy(buf, cc->objBuf + cc->nObjBufChars, m - cc->nObjBufChars);
+ buf += m - cc->nObjBufChars;
+ nch -= m - cc->nObjBufChars;
+ cc->nObjBufChars = m;
+ }
+ /* we're here only if cc->objBuf contains a complete BOS */
+ oldBuf = buf;
+ oldNch = nch;
+ buf = cc->objBuf;
+ nch = cc->nObjBufChars;
+ cc->objBuf = NIL;
+ cc->nObjBufChars = 0;
+ } /* if we're buffering */
+
+ /* dispose of any plain text. If no binary conversion, all output
+ is plain text */
+ if (cc->contextFlags & DPS_FLAG_NO_BINARY_CONVERSION) n = nch;
+ else {
+ for (n = 0; n < nch &&
+ ((unsigned char) buf[n] < 128 || (unsigned char) buf[n] > 159); n++);
+ }
+ if ((n > 0) && (cc->textProc != NIL)) {
+ (*cc->textProc)((DPSContext)cc, buf, n);
+ }
+ buf += n;
+ nch -= n;
+
+ if (nch != 0) {
+ /* here with the next binary object sequence from a server */
+ DPSExtendedBinObjSeq bos;
+ DPSExtendedBinObjSeqRec bosRec;
+ DPSBinObj firstObj;
+ unsigned t;
+ unsigned long int m;
+ unsigned minSize;
+
+ if (nch < DPS_SEQ_MIN) {
+ /* gotta buffer it */
+ DPSAssertWarn(nch == 1 && !oldBuf, cc, "illegal binary output from context (oldBuf)");
+ cc->objBuf = (char *)DPScalloc(DPS_EXT_HEADER_SIZE, 1);
+ cc->nObjBufChars = nch;
+ *cc->objBuf = *buf;
+ return;
+ }
+ /* check for quadbyte alignment */
+ if ((long int)buf & (MIN_POINTER_ALIGN - 1)) {
+ /* not aligned, we gotta copy the buffer */
+ /* we assert that we can't have an oldBuf if we're not aligned,
+ since we only get an oldBuf if we copied to a new buffer,
+ and we have already tested nch to be at least DPS_SEQ_MIN */
+ DPSAssertWarn(!oldBuf && nch > 1, cc, "return values garbled (oldBuf||nch<DPS_SEQ_MIN");
+ /* copy DPS_SEQ_MIN bytes, so we can use existing buffering code */
+ cc->objBuf = (char *)DPScalloc(DPS_EXT_HEADER_SIZE, 1);
+ cc->nObjBufChars = DPS_SEQ_MIN;
+ os_bcopy(buf, cc->objBuf, cc->nObjBufChars);
+ buf += DPS_SEQ_MIN;
+ nch -= DPS_SEQ_MIN;
+ /* now go to top of loop and go through the buffer update code */
+ continue;
+ }
+ bos = (DPSExtendedBinObjSeq) buf;
+ t = bos->tokenType;
+ minSize = (bos->escape == 0) ? DPS_EXT_HEADER_SIZE : DPS_HEADER_SIZE;
+ if (nch < minSize) {
+ /* gotta buffer it */
+ char *tb;
+ DPSAssertWarn(!oldBuf, cc, "return values garbled (oldBuf)");
+ tb = cc->objBuf = (char *)DPScalloc(minSize, 1);
+ cc->nObjBufChars = nch;
+ while (nch--) *tb++ = *buf++;
+ return;
+ }
+ else if (minSize == DPS_HEADER_SIZE) {
+ /* this is not an extended BOS */
+ DPSBinObjSeq seqHead = (DPSBinObjSeq) buf;
+ bos = &bosRec;
+ bos->tokenType = t;
+ bos->nTopElements = seqHead->nTopElements;
+ bos->length = seqHead->length;
+ firstObj = &(seqHead->objects[0]);
+ }
+ else firstObj = &(bos->objects[0]);
+ m = bos->length;
+ if (nch < m) {
+ /* gotta buffer it */
+ DPSAssertWarn(!oldBuf, cc, "return values garbled (oldBuf&&nch<m");
+ cc->objBuf = (char *)DPScalloc(bos->length, 1);
+ cc->nObjBufChars = nch;
+ os_bcopy(buf, cc->objBuf, nch);
+ return;
+ }
+ DPSAssertWarn(bos->nTopElements == 1, cc, "illegal binary output detected (bos->nTopElements!=1)");
+#if !IEEEFLOAT
+ if (t != DPS_DEF_TOKENTYPE)
+ ConvSeqInPlace(1, firstObj, firstObj, bos->tokenType);
+#endif /* !IEEEFLOAT */
+ t = firstObj->tag;
+ if (t == DPS_ERR_TAG) {
+ cc->resultTable = NIL;
+ DPSSafeSetLastNameIndex((DPSContext)cc);
+ DURING
+ if (cc->errorProc != NIL)
+ (*cc->errorProc)((DPSContext)cc, dps_err_ps, (unsigned long)buf, m);
+ HANDLER
+ if (oldBuf) free(buf);
+ RERAISE;
+ END_HANDLER
+ }
+ else { /* dispatch this result */
+ if (!cc->resultTable || t > cc->resultTableLength) {
+ if (cc->chainParent == NIL && cc->errorProc != NIL) {
+ DPSSafeSetLastNameIndex((DPSContext)cc);
+ (*cc->errorProc)((DPSContext)cc, dps_err_resultTagCheck, (unsigned long)buf, m);
+ }
+ }
+ else if (t == cc->resultTableLength) {
+ cc->resultTable = NIL;
+ }
+ else {
+ StuffResultVal((DPSContext)cc, &cc->resultTable[t], t, firstObj);
+ }
+ }
+ if (!oldBuf)
+ buf += m;
+ nch -= m;
+ } /* if (nch != 0) ... the next binary object sequence from a server */
+ if (oldBuf) {
+ DPSAssertWarn(nch == 0, cc, "some return values/data lost (nch)");
+ free(buf);
+ buf = oldBuf;
+ nch = oldNch;
+ }
+ } /* while (nch > 0) */
+
+} /* DPSclientPrintProc */
+
+/**************************************/
+/* Context procs for DPSCreateContext */
+/**************************************/
+
+
+static void procWaitContext(DPSContext ctxt)
+{
+ typedef struct {
+ unsigned char tokenType;
+ unsigned char topLevelCount;
+ unsigned short int nBytes;
+
+ DPSBinObjGeneric obj0;
+ DPSBinObjGeneric obj1;
+ DPSBinObjGeneric obj2;
+ DPSBinObjGeneric obj3;
+ } DPSQ;
+ static DPSQ dpsF = {
+ DPS_DEF_TOKENTYPE, 4, sizeof(DPSQ),
+ {DPS_LITERAL|DPS_INT, 0, 0, -23}, /* arbitrary int */
+ {DPS_LITERAL|DPS_INT, 0, 0, 0}, /* termination tag = 0 */
+ {DPS_EXEC|DPS_NAME, 0, DPSSYSNAME, 119}, /* printobject */
+ {DPS_EXEC|DPS_NAME, 0, DPSSYSNAME, 70}, /* flush */
+ }; /* DPSQ */
+ DPSResultsRec DPSR;
+
+ if (DPSPrivateCheckWait(ctxt)) return;
+
+ ctxt->resultTable = &DPSR; /* must be non-null for handler to work */
+ ctxt->resultTableLength = 0; /* same value as termination tag */
+ DPSBinObjSeqWrite(ctxt, (char *) &dpsF,sizeof(DPSQ));
+ DPSAwaitReturnValues(ctxt);
+}
+
+static void procUpdateNameMap(DPSContext ctxt)
+{
+ integer i;
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+ DPSPrivSpace s = (DPSPrivSpace) ctxt->space;
+ DPSContext children = ctxt->chainChild;
+
+ /* unlink context from chain temporarily, so DPSPrintf can be called */
+ if (children != NIL) ctxt->chainChild = NIL;
+ DURING
+ for (i = s->lastNameIndex+1; i <= globLastNameIndex; i++)
+ DPSPrintf(ctxt, "%d /%s defineusername\n", i, userNames[i]);
+ HANDLER
+ if (children != NIL) ctxt->chainChild = children;
+ RERAISE;
+ END_HANDLER
+ c->lastNameIndex = globLastNameIndex;
+ if (children != NIL) {
+ /* update any children */
+ ctxt->chainChild = children;
+ DPSUpdateNameMap(ctxt->chainChild);
+ }
+}
+
+static void procWriteData(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ /* safe to call with chain */
+ DPSinnerProcWriteData(ctxt, buf, count);
+ if (ctxt->chainChild != NIL) DPSWriteData(ctxt->chainChild, buf, count);
+}
+
+static void procBinObjSeqWrite(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ if (((DPSPrivContext)ctxt)->lastNameIndex < globLastNameIndex) DPSUpdateNameMap(ctxt);
+ DPSinnerProcWriteData(ctxt, buf, count);
+ if (ctxt->chainChild != NIL) DPSBinObjSeqWrite(ctxt->chainChild, buf, count);
+}
+
+static void procWriteStringChars(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ DPSinnerProcWriteData(ctxt, buf, count);
+ if (ctxt->chainChild != NIL) DPSWriteStringChars(ctxt->chainChild, buf, count);
+}
+
+static void procWritePostScript(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ DPSinnerProcWriteData(ctxt, buf, count);
+ if (ctxt->chainChild != NIL) DPSWritePostScript(ctxt->chainChild, buf, count);
+}
+
+static void innerProcWriteNumstring(
+ DPSContext ctxt,
+ DPSDefinedType type,
+ char *data,
+ unsigned int size,
+ int scale,
+ void (*writeProc)(DPSContext, char *, unsigned))
+{
+ unsigned char HNumHeader[4];
+ register int i;
+#define NBUFSIZE 10
+ int ibuf[NBUFSIZE]; /* This needs to be a 32 bit datatype */
+
+ HNumHeader[0] = 149;
+ switch (type) {
+ case dps_tLong:
+ HNumHeader[1] = (DPS_DEF_TOKENTYPE % 2) * 128 + scale;
+ break;
+
+ case dps_tInt:
+ HNumHeader[1] = ((sizeof(int) >= 4) ? 0 : 32)
+ + ((DPS_DEF_TOKENTYPE % 2) * 128) + scale;
+ break;
+
+ case dps_tShort:
+ HNumHeader[1] = 32 + ((DPS_DEF_TOKENTYPE % 2) * 128) + scale;
+ break;
+
+ case dps_tFloat:
+ HNumHeader[1] = 48 + ((DPS_DEF_TOKENTYPE % 2) * 128)
+ + ((DPS_DEF_TOKENTYPE >= 130) ? 1 : 0);
+ break;
+
+ default:
+ break;
+ }
+
+ HNumHeader[(DPS_DEF_TOKENTYPE % 2) ? 2 : 3] = (unsigned char) size;
+ HNumHeader[(DPS_DEF_TOKENTYPE % 2) ? 3 : 2] = (unsigned char) (size >> 8);
+
+ (*writeProc)(ctxt, (char *)HNumHeader, 4);
+
+ switch (type) {
+ case dps_tLong:
+ if (sizeof(long) == 4) {
+ (*writeProc)(ctxt, (char *) data, size * 4);
+ } else {
+ while (size > 0) {
+ for (i = 0; i < NBUFSIZE && (unsigned) i < size; i++) {
+ ibuf[i] = ((long *) data)[i];
+ }
+ (*writeProc)(ctxt, (char *) ibuf,
+ 4 * (size < NBUFSIZE ? size : NBUFSIZE));
+ size -= NBUFSIZE;
+ }
+ }
+ break;
+
+ case dps_tInt:
+ (*writeProc)(ctxt, (char *) data, size * sizeof(int));
+ break;
+
+ case dps_tShort:
+ (*writeProc)(ctxt, (char *) data, size * sizeof(short));
+ break;
+
+ case dps_tFloat:
+ (*writeProc)(ctxt, (char *) data, size * sizeof(float));
+
+ default:
+ break;
+ }
+} /* innerProcWriteNumstring */
+
+static void procWriteNumstring(
+ DPSContext ctxt,
+ DPSDefinedType type,
+ char *data,
+ unsigned int size,
+ int scale)
+{
+ innerProcWriteNumstring(ctxt, type, data, size, scale, DPSinnerProcWriteData);
+ if (ctxt->chainChild != NIL) DPSWriteNumString(ctxt->chainChild, type, data, size, scale);
+}
+
+static void writeTypedObjectArray(
+ DPSContext ctxt,
+ DPSDefinedType type,
+ char *array,
+ unsigned int length)
+{
+
+#define DPSMAX_SEQ 10
+ unsigned int i;
+ DPSPrivContext c = (DPSPrivContext)(ctxt);
+ static DPSBinObjGeneric bboolObj[DPSMAX_SEQ] = {
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ {DPS_LITERAL | DPS_BOOL, 0,0,0},
+ };
+ static DPSBinObjReal rrealObj[DPSMAX_SEQ] = {
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ {DPS_LITERAL | DPS_REAL, 0,0,0},
+ };
+ static DPSBinObjGeneric iintObj[DPSMAX_SEQ] = {
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ {DPS_LITERAL | DPS_INT, 0,0,0},
+ };
+
+ if (DPSCheckShared(c)) return;
+
+ switch (type) {
+ case dps_tChar:
+ case dps_tUChar:
+ DPSCantHappen();
+ break;
+
+ case dps_tBoolean: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ bboolObj[i].val = *((int *)array);
+ array += sizeof(int);
+ }
+ DPSWritePostScript(ctxt, (char *) bboolObj, sizeof(DPSBinObjGeneric) * i);
+ length -= i;
+ }
+ break;
+ }
+
+ case dps_tFloat: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ rrealObj[i].realVal = *((float *)array);
+ array += sizeof(float);
+ }
+ DPSWritePostScript(ctxt, (char *) rrealObj, sizeof(DPSBinObjReal) * i);
+ length -= i;
+ }
+ break;
+ }
+
+ case dps_tDouble: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ rrealObj[i].realVal = *((double *)array);
+ array += sizeof(double);
+ }
+ DPSWritePostScript(ctxt, (char *) rrealObj, sizeof(DPSBinObjReal) * i);
+ length -= i;
+ }
+ break;
+ }
+
+ case dps_tShort: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ iintObj[i].val = *((short *)array);
+ array += sizeof(short);
+ }
+ DPSWritePostScript(ctxt, (char *) iintObj, sizeof(DPSBinObjGeneric) * i);
+ length -= i;
+ }
+ break;
+ }
+
+ case dps_tUShort: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ iintObj[i].val = *((unsigned short *)array);
+ array += sizeof(unsigned short);
+ }
+ DPSWritePostScript(ctxt, (char *) iintObj, sizeof(DPSBinObjGeneric) * i);
+ length -= i;
+ }
+ break;
+ }
+
+ case dps_tInt: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ iintObj[i].val = *((int *)array);
+ array += sizeof(int);
+ }
+ DPSWritePostScript(ctxt, (char *) iintObj, sizeof(DPSBinObjGeneric) * i);
+ length -= i;
+ }
+ break;
+ }
+
+ case dps_tUInt: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ iintObj[i].val = *((unsigned int *)array);
+ array += sizeof(unsigned int);
+ }
+ DPSWritePostScript(ctxt, (char *) iintObj, sizeof(DPSBinObjGeneric) * i);
+ length -= i;
+ }
+ break;
+ }
+
+ case dps_tLong: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ iintObj[i].val = *((long *)array);
+ array += sizeof(long);
+ }
+ DPSWritePostScript(ctxt, (char *) iintObj, sizeof(DPSBinObjGeneric) * i);
+ length -= i;
+ }
+ break;
+ }
+
+ case dps_tULong: {
+ while (length > 0) {
+ for (i = 0; i < MIN(DPSMAX_SEQ, length); i++) {
+ iintObj[i].val = *((unsigned long *)array);
+ array += sizeof(unsigned long);
+ }
+ DPSWritePostScript(ctxt, (char *) iintObj, sizeof(DPSBinObjGeneric) * i);
+ length -= i;
+ }
+ break;
+
+
+ }
+
+ default:;
+ }
+} /* writeTypedObjectArray */
+
+static void procDestroyContext(DPSContext ctxt)
+{
+ DPSPrivContext c = (DPSPrivContext)ctxt, cc, prev;
+ DPSPrivSpace ss = (DPSPrivSpace)(c->space);
+
+ if (c->buf != NIL) {
+ ContextBuffer b = (ContextBuffer)(c->buf);
+ b->next = contextBuffers;
+ contextBuffers = b;
+ c->buf = NIL;
+ }
+ if (c->objBuf != NIL) {
+ free(c->objBuf);
+ c->objBuf = NIL;
+ }
+
+ DPSUnchainContext(ctxt);
+
+ prev = NIL;
+ DPSAssert(ss != NIL);
+ for (cc = ss->firstContext; (cc != NIL) && (cc != c); cc = cc->next)
+ prev = cc;
+ DPSAssert(cc != NIL);
+ DPSAssert(cc != prev);
+ if (prev == NIL) ss->firstContext = cc->next;
+ else {
+ prev->next = cc->next;
+ DPSAssert(prev->next != prev);
+ }
+
+ DPSPrivateDestroyContext(ctxt);
+ free(c);
+}
+
+static void procDestroySpace(DPSSpace space)
+{
+ DPSPrivSpace ns, prevS, ss = (DPSPrivSpace)space;
+ integer sid = ss->sid;
+
+ while (ss->firstContext != NIL)
+ DPSDestroyContext((DPSContext)(ss->firstContext));
+
+ prevS = NIL;
+ for (ns = spaces; (ns != NIL) && (ns->sid != sid); ns = ns->next)
+ prevS = ns;
+ DPSAssert(ns != NIL);
+ DPSAssert(ns == ss);
+ if (prevS == NIL) spaces = ns->next;
+ else {
+ prevS->next = ns->next;
+ DPSAssert(prevS->next != prevS);
+ }
+
+ DPSPrivateDestroySpace(space);
+ free(ss);
+}
+
+static void procInterrupt(DPSContext ctxt)
+{
+ DPSPrivContext c = (DPSPrivContext)ctxt;
+ DPSSendInterrupt((XDPSPrivContext)c->wh, c->cid, DPSclientPrintProc);
+ if (ctxt->chainChild != NIL) DPSInterruptContext(ctxt->chainChild);
+}
+
+
+/****************************************************************/
+/* Procedures that support the DPSCreateTextContext context procs */
+/****************************************************************/
+
+/* precondition: (c >= 129 && c <= 159), which means that c is the
+ first byte of either a binary token or a binary object sequence */
+
+static boolean IsBinaryToken(unsigned char c)
+{
+ return (c != DPS_HI_IEEE && c != DPS_LO_IEEE
+ && c != DPS_HI_NATIVE && c != DPS_LO_NATIVE);
+}
+
+/* returns the number of initial bytes of a given goody that are
+ required to figure out how many bytes are needed for the entire goody */
+
+static unsigned GetHdrNBytes(unsigned char *t)
+{
+ if (!IsBinaryToken(*t)) {
+ if (*(++t) == 0) return DPS_EXT_HEADER_SIZE;
+ else return DPS_HEADER_SIZE;
+ }
+ switch (*t) {
+ case 137:
+ case 142:
+ return(2);
+ case 143:
+ case 144:
+ return(3);
+ case 149:
+ return(4);
+ default:
+ if (*t > 149 && *t < 160) return(1); /* unassigned */
+ else return(1);
+ }
+}
+
+
+static void WriteHomogeneousArrayAsASCII(
+ DPSContext ctxt,
+ register unsigned char *buf)
+{
+ Swap32Rec n32;
+ Swap16Rec n16;
+ register unsigned char *b;
+
+ unsigned char r = *buf++;
+ float f;
+ boolean hi = (r < 128);
+
+ if (!hi) r -= 128;
+ DPSPrintf(ctxt, "[ ");
+ b = n16.bytes;
+ if (hi) {Copy2SrcHi(buf, b);} else {Copy2SrcLo(buf, b);}
+ buf += 2;
+ if (r < 32) /* 32-bit fixed */
+ while (n16.u--) {
+ b = n32.bytes;
+ if (hi) {Copy4SrcHi(buf, b);} else {Copy4SrcLo(buf, b);}
+ if (r == 0)
+ DPSPrintf(ctxt, "%d ", n32.i);
+ else {
+ f = n32.i; /* convert to float */
+ n32.f = f / (1 << r); /* scale */
+ DPSPrintf(ctxt, "%g ", n32.f);
+ }
+ buf += 4;
+ }
+ else if (r < 48) { /* 16-bit fixed */
+ unsigned l = n16.u;
+ r -= 32;
+ while (l--) {
+ b = n16.bytes;
+ if (hi) {Copy2SrcHi(buf, b);} else {Copy2SrcLo(buf, b);}
+ if (r == 0)
+ DPSPrintf(ctxt, "%d ", n16.i);
+ else {
+ f = n16.i; /* convert to float */
+ n32.f = f / (1 << r); /* scale */
+ DPSPrintf(ctxt, "%g ", n32.f);
+ }
+ buf += 2;
+ }
+ }
+ else if (r == 48) /* 32-bit IEEE */
+ while (n16.u--) {
+#if IEEEFLOAT
+ b = n32.bytes;
+ if (hi) {Copy4SrcHi(buf, b);} else {Copy4SrcLo(buf, b);}
+#else /* IEEEFLOAT */
+ if (hi) IEEEHighToNative(buf, &n32.f);
+ else IEEELowToNative(buf, &n32.f);
+#endif /* IEEEFLOAT */
+ DPSPrintf(ctxt, "%g ", n32.f);
+ buf += 4;
+ }
+ else if (r == 49) /* 32-bit native */
+ while (n16.u--) {
+ b = n32.bytes;
+ *b++ = *buf++,*b++ = *buf++,*b++ = *buf++,*b = *buf++;
+ DPSPrintf(ctxt, "%g ", n32.f);
+ }
+ else DPSCantHappen();
+ DPSPrintf(ctxt, "\n] ");
+} /* WriteHomogeneousArrayAsASCII */
+
+/* returns the number of bytes needed for the entire goody. buf points
+ to enough initial bytes of the goody to figure this out (see above). */
+
+static integer GetNBytes(register unsigned char *buf)
+{
+ unsigned short int nBytes;
+ register unsigned char *r = (unsigned char *)&nBytes;
+
+ switch (*buf) {
+ case DPS_HI_IEEE:
+ case DPS_HI_NATIVE:
+ if (*(buf+1) == 0) {
+ unsigned int nb;
+ r = (unsigned char *)&nb;
+ buf += 4;
+ Copy4SrcHi(buf, r);
+ return(nb);
+ }
+ else {
+ buf += 2;
+ Copy2SrcHi(buf, r);
+ }
+ break;
+ case DPS_LO_IEEE:
+ case DPS_LO_NATIVE:
+ if (*(buf+1) == 0) {
+ unsigned int nb;
+ r = (unsigned char *)&nb;
+ buf += 4;
+ Copy4SrcLo(buf, r);
+ return(nb);
+ }
+ else {
+ buf += 2;
+ Copy2SrcLo(buf, r);
+ }
+ break;
+ case 132:
+ case 133:
+ case 138:
+ case 139:
+ case 140:
+ nBytes = 5; break;
+ case 134:
+ case 135:
+ nBytes = 3; break;
+ case 136:
+ case 141:
+ case 145:
+ case 146:
+ case 147:
+ case 148:
+ nBytes = 2; break;
+ case 137: {
+ unsigned int l = *(buf+1);
+ if (l < 32) {nBytes = 6; break;}
+ if (l < 48) {nBytes = 4; break;}
+ if (l-128 < 32) {nBytes = 6; break;}
+ if (l-128 < 48) {nBytes = 4; break;}
+ DPSCantHappen();
+ }
+ case 142:
+ nBytes = *(buf+1);
+ nBytes += 2;
+ break;
+ case 143:
+ buf++;
+ Copy2SrcHi(buf, r);
+ nBytes += 3;
+ break;
+ case 144:
+ buf++;
+ Copy2SrcLo(buf, r);
+ nBytes += 3;
+ break;
+ case 149: {
+ unsigned char scale = *(buf+1);
+ buf += 2;
+ if (scale < 128)
+ Copy2SrcHi(buf, r);
+ else {
+ scale -= 128;
+ Copy2SrcLo(buf, r);
+ }
+ if (scale < 32)
+ nBytes *= 4;
+ else if (scale < 48)
+ nBytes *= 2;
+ else
+ nBytes *= 4;
+ nBytes += 4;
+ break;
+ }
+ default: nBytes = 1; /* unassigned */
+ }
+ return(nBytes);
+}
+
+static void WriteSeqAsAscii(
+ DPSContext ctxt,
+ char *base,
+ DPSBinObj currObj,
+ unsigned int nObjs,
+ unsigned char tokenType,
+ int *numstringOffsets)
+{
+ integer nLineObjs = 0;
+ DPSNumFormat numFormat;
+ float f;
+ long int i;
+ unsigned short int length;
+
+ /* NOTE: It's ok to call DPSPrintf (which calls DPSWritePostScript)
+ from here since we are only sending text, so there's no problem
+ with re-entering DPSWritePostScript. Caller guarantees
+ that this context has no children. */
+
+ NumFormatFromTokenType(tokenType, &numFormat);
+
+ while (nObjs--) {
+ unsigned char type = currObj->attributedType & ~DPS_EXEC;
+ boolean lit = ((currObj->attributedType & DPS_EXEC) == 0);
+
+ switch (type) {
+ case DPS_NULL:
+ break;
+ case DPS_BOOL:
+ i = currObj->val.booleanVal;
+ if (i)
+ DPSPrintf(ctxt, "true ");
+ else
+ DPSPrintf(ctxt, "false ");
+ break;
+ case DPS_INT:
+ i = currObj->val.integerVal;
+ DPSPrintf(ctxt, "%d ", i);
+ break;
+ case DPS_REAL:
+#if IEEEFLOAT
+ f = currObj->val.realVal;
+#else /* IEEEFLOAT */
+ if (numFormat != DPSDefaultNumFormat)
+#if SWAPBITS
+ IEEELowToNative(&currObj->val.realVal, &f);
+#else /* SWAPBITS */
+ IEEEHighToNative(&currObj->val.realVal, &f);
+#endif /* SWAPBITS */
+ else
+ f = currObj->val.realVal;
+#endif /* IEEEFLOAT */
+
+ DPSPrintf(ctxt, "%g ", f);
+ break;
+ case DPS_NAME: {
+ char *p = 0;
+ integer index;
+
+ index = currObj->val.nameVal;
+ length = currObj->length;
+
+ if (lit) DPSPrintf(ctxt, "/");
+
+ if (length == DPSSYSNAME) { /* system name index */
+ if (index <= DPS_LAST_COMMON_SYSNAME) {
+ if (!lit && (ctxt->contextFlags & DPS_FLAG_USE_ABBREVS)) {
+ p = DPSGetSysnameAbbrev(index);
+ if (p == NULL) p = DPSSysNames[index];
+ } else p = DPSSysNames[index];
+ } else if (DPS_FIRST_AUX_SYSNAME <= index
+ && index <= DPS_LAST_AUX_SYSNAME)
+ p = DPSSysNamesAux[index - DPS_FIRST_AUX_SYSNAME];
+ else DPSCantHappen();
+ length = strlen(p);
+ }
+ else if (length == 0) { /* user name index */
+ p = DPSNameFromIndex(index);
+ length = strlen(p);
+ }
+ else
+ p = base + index;
+
+ DPSWriteData(ctxt, p, length);
+ DPSPrintf(ctxt, " ");
+ break;
+ }
+ case DPS_ARRAY:
+ DPSPrintf(ctxt, (lit ? "[ " : "{ "));
+ WriteSeqAsAscii(
+ ctxt,
+ base,
+ (DPSBinObj)(base+currObj->val.arrayVal),
+ currObj->length,
+ tokenType, numstringOffsets);
+ DPSPrintf(ctxt, (lit ? " ] " : " } "));
+ break;
+ case DPS_MARK:
+ if (lit)
+ DPSPrintf(ctxt, "/mark ");
+ else
+ DPSPrintf(ctxt, "mark ");
+ break;
+ case DPS_STRING: {
+ char *p;
+ int j;
+ i = currObj->val.stringVal;
+ length = currObj->length;
+ p = base + i;
+ if (numstringOffsets != NULL) {
+ for (j = 2; j < numstringOffsets[1] &&
+ numstringOffsets[j] != i; j++) ;
+ if (numstringOffsets[j] == i) {
+ DPSAssert(*(unsigned char *) p++ == 149);
+ WriteHomogeneousArrayAsASCII(ctxt, (unsigned char *) p);
+ break;
+ }
+ }
+ DPSPrintf(ctxt, "(");
+#ifdef VMS
+ WriteVMSStringBody(ctxt, p, length); /* write this */
+#else /* VMS */
+ /* render string bytes correctly */
+ while (length--) {
+ char c = *p++;
+ if (c == '(' || c == ')' || c == '\\')
+ DPSPrintf(ctxt, "\\%c", c);
+ else if (c == '\n')
+ DPSPrintf(ctxt, "\\n");
+ else if (!(isascii(c) && isprint(c)))
+ DPSPrintf(ctxt, "\\%03.3o", (unsigned char) c);
+ else DPSWriteData(ctxt, &c, 1);
+ }
+#endif /* VMS */
+ DPSPrintf(ctxt, ") ");
+ break;
+ }
+ default: DPSCantHappen();
+ }
+
+ currObj++;
+ if (++nLineObjs == 15) {
+ nLineObjs = 0;
+ DPSPrintf(ctxt, "\n ");
+ }
+ } /* end while */
+
+ DPSPrintf(ctxt, "\n");
+
+} /* WriteSeqAsAscii */
+
+static void ConvertAndWriteSeqAsData(
+ DPSContext ctxt,
+ char *bosBuf,
+ int pass)
+{
+ DPSPrivContext cc = (DPSPrivContext) ctxt;
+ DPSExtendedBinObjSeq bos;
+ DPSExtendedBinObjSeqRec bosRec;
+ DPSNumFormat numFormat;
+ unsigned int offset, firstCharOffset;
+ unsigned int nameOffset;
+ unsigned int len = 0;
+ DPSBinObj currObj;
+ integer headSize;
+ char *seqBase;
+
+ if (*(bosBuf+1) != 0) {
+ /* not an extended BOS */
+ DPSBinObjSeq seqHead = (DPSBinObjSeq) bosBuf;
+ bos = &bosRec;
+ bos->tokenType = seqHead->tokenType;
+ bos->escape = seqHead->nTopElements;
+ bos->nTopElements = seqHead->nTopElements;
+ bos->length = seqHead->length;
+ currObj = &(seqHead->objects[0]);
+ seqBase = (char *) &(seqHead->objects[0]);
+ headSize = DPS_HEADER_SIZE;
+ }
+ else {
+ bos = (DPSExtendedBinObjSeq) bosBuf;
+ currObj = &(bos->objects[0]);
+ seqBase = (char *) &(bos->objects[0]);
+ headSize = DPS_EXT_HEADER_SIZE;
+ }
+ firstCharOffset = bos->length - headSize;
+ nameOffset = firstCharOffset;
+
+ /* Caller guarantees that this context has no children,
+ so it is okay to call DPSWriteData */
+
+ NumFormatFromTokenType(bos->tokenType, &numFormat);
+
+ /* Pass 0: If we're expanding name indices, find all name objects,
+ lookup their strings, sum the lengths.
+ Write the modified sequence header regardless.
+ Pass 1: we're converting indices to strings and/or
+ converting numbers. Write each modified object, and
+ subsidiary strings.
+ Pass 2: Find all name objects, lookup and write the strings. */
+
+ if (pass == 0 && ctxt->nameEncoding != dps_strings)
+ /* we're just converting numbers, so skip while loop */
+ offset = firstCharOffset;
+ else
+ offset = 0;
+
+ while (offset < firstCharOffset) {
+ DPSBinObjRec newObj;
+ unsigned char type = (currObj->attributedType & ~DPS_EXEC);
+
+ newObj = *currObj;
+
+#if !IEEEFLOAT
+ if (type == DPS_REAL) {
+ if (numFormat != cc->numFormat) {
+ if (numFormat == dps_ieee) {
+ if (DPSDefaultByteOrder == dps_loFirst)
+ IEEELowToNative(&currObj->val.realVal, &newObj.val.realVal);
+ else
+ IEEEHighToNative(&currObj->val.realVal, &newObj.val.realVal);
+ }
+ else { /* numFormat is native */
+ if (DPSDefaultByteOrder == dps_loFirst)
+ NativeToIEEELow(&currObj->val.realVal, &newObj.val.realVal);
+ else
+ NativeToIEEEHigh(&currObj->val.realVal, &newObj.val.realVal);
+ }
+ }
+ }
+#endif /* !IEEEFLOAT */
+
+ if (type == DPS_STRING && newObj.length > 0) {
+ /* keep track of where strings start */
+ firstCharOffset = ((unsigned) newObj.val.stringVal < firstCharOffset)
+ ? newObj.val.stringVal : firstCharOffset;
+ }
+ if (type == DPS_NAME) {
+ if (newObj.length == DPSSYSNAME) { /* system name index, never expand to string body */
+ if (pass != 1) goto next_obj;
+ }
+ else if (newObj.length == 0) { /* user name index */
+ register char *p = DPSNameFromIndex(newObj.val.nameVal);
+ switch (pass) {
+ case 0: len += strlen(p); goto next_obj;
+ case 1:
+ if (ctxt->nameEncoding == dps_strings) {
+ newObj.length = strlen(p);
+ newObj.val.nameVal = nameOffset;
+ nameOffset += newObj.length;
+ }
+ break;
+ case 2: DPSWriteData(ctxt, p, strlen(p)); goto next_obj;
+ default:;
+ }
+ }
+ else { /* name is already a string */
+ /* keep track of where strings start */
+ firstCharOffset = ((unsigned) newObj.val.nameVal < firstCharOffset)
+ ? newObj.val.nameVal : firstCharOffset;
+ }
+ } /* end if type == DPS_NAME */
+ if (pass == 1) {
+ DPSWriteData(ctxt, (char *) &newObj, sizeof(newObj));
+ }
+
+next_obj:
+ offset += sizeof(newObj);
+ ++currObj;
+ } /* end while */
+
+ /* finish pass */
+ switch (pass) {
+ case 0: {
+ unsigned char t;
+ /* write modified seqHead */
+ if (DPSDefaultByteOrder == dps_hiFirst && cc->numFormat == dps_ieee)
+ t = DPS_HI_IEEE;
+ else if (DPSDefaultByteOrder == dps_loFirst && cc->numFormat == dps_ieee)
+ t = DPS_LO_IEEE;
+ else if (DPSDefaultByteOrder == dps_hiFirst && cc->numFormat == dps_native)
+ t = DPS_HI_NATIVE;
+ else
+ t = DPS_LO_NATIVE;
+ DPSWriteData(ctxt, (char *) &t, 1);
+ if (headSize == DPS_HEADER_SIZE) {
+ unsigned short int nBytes;
+ unsigned char c = bos->nTopElements;
+ /* write top level count */
+ DPSWriteData(ctxt, (char *) &c, 1);
+ /* write nBytes */
+ nBytes = (ctxt->nameEncoding == dps_strings) ? bos->length + len :
+ bos->length;
+ DPSWriteData(ctxt, (char *)&nBytes, 2);
+ }
+ else {
+ unsigned int nBytes;
+ /* write escape code & top level count */
+ DPSWriteData(ctxt, (char *)&bos->escape, 3);
+ /* write nBytes */
+ nBytes = (ctxt->nameEncoding == dps_strings) ? bos->length + len :
+ bos->length;
+ DPSWriteData(ctxt, (char *)&nBytes, 4);
+ }
+ break;
+ }
+ case 1: {
+ char *stringStart = seqBase + firstCharOffset;
+ DPSWriteData(ctxt, stringStart, (bos->length - headSize - firstCharOffset));
+ break;
+ }
+ default:;
+ }
+
+} /* ConvertAndWriteSeqAsData */
+
+#define MIN16 -32768
+#define MAX16 32767
+
+/* TestHomogeneous will return a non-negative representation code 'r'
+ if all of the array elements are "integers", or all are "reals".
+ Will return -1 for any other case. */
+
+static integer TestHomogeneous(
+ DPSBinObj aryObj,
+ unsigned short length,
+ DPSNumFormat numFormat)
+{
+ integer tmp, r = -1;
+
+ while (length--) {
+ switch (aryObj->attributedType & ~DPS_EXEC) {
+ case DPS_INT:
+#if SWAPBITS
+ tmp = (aryObj->val.integerVal < MIN16
+ || aryObj->val.integerVal > MAX16) ? 128 : 128+32;
+#else /* SWAPBITS */
+ tmp = (aryObj->val.integerVal < MIN16
+ || aryObj->val.integerVal > MAX16) ? 0 : 32;
+#endif /* SWAPBITS */
+ if ((r == -1) || ((r & 0x07F) == 32 && (tmp & 0x07F) == 0))
+ r = tmp; /* first element, or was 16-bit => bump to 32-bit */
+ else if ((r & 0x07F) == 0 && (tmp & 0x07F) == 32)
+ goto bump_obj; /* is 32-bit => stay 32-bit */
+ else if (r != tmp)
+ return(-1);
+ /* else fall thru, r == tmp */
+ break;
+ case DPS_REAL:
+#if SWAPBITS
+ tmp = (numFormat == dps_ieee) ? 128+48 : 128+49;
+#else /* SWAPBITS */
+ tmp = (numFormat == dps_ieee) ? 48 : 49;
+#endif /* SWAPBITS */
+ if (r == -1)
+ r = tmp;
+ else if (r != tmp) return(-1);
+ break;
+ default: return(-1);
+ }
+bump_obj:
+ ++aryObj;
+ }
+ return(r);
+} /* TestHomogeneous */
+
+static void WriteSeqAsTokens(
+ DPSContext ctxt,
+ char *base,
+ DPSBinObj currObj,
+ unsigned int nObjs,
+ unsigned char tokenType,
+ int *numstringOffsets)
+{
+ int nLineObjs = 0;
+ DPSNumFormat numFormat;
+ unsigned short length;
+ Swap32Rec n32;
+ Swap16Rec n16;
+ unsigned char c;
+
+#define PB(byte) c = (byte),DPSWriteData(ctxt, (char *) &c, 1)
+#if SWAPBITS
+#define WTT(byte) PB((byte)+1)
+#else /* SWAPBITS */
+#define WTT(byte) PB(byte)
+#endif /* SWAPBITS */
+
+ NumFormatFromTokenType(tokenType, &numFormat);
+
+ while (nObjs--) {
+ unsigned char type = currObj->attributedType & ~DPS_EXEC;
+ boolean lit = ((currObj->attributedType & DPS_EXEC) == 0);
+
+ switch (type) {
+ case DPS_NULL:
+ break;
+ case DPS_BOOL:
+ PB(141); /* boolean */
+ if (currObj->val.booleanVal)
+ PB(true);
+ else
+ PB(false);
+ break;
+ case DPS_INT:
+ n32.i = currObj->val.integerVal;
+ if (n32.i < MIN16 || n32.i > MAX16) {
+ WTT(132); /* 32-bit int */
+ DPSWriteData(ctxt, (char *) n32.bytes, 4);
+ }
+ else if (n32.i < -128 || n32.i > 127) {
+ WTT(134); /* 16-bit int */
+ n16.i = n32.i;
+ DPSWriteData(ctxt, (char *) n16.bytes, 2);
+ }
+ else {
+ WTT(136); /* 8-bit int */
+ PB(n32.i);
+ }
+ break;
+ case DPS_REAL:
+#if IEEEFLOAT
+ WTT(138); /* 32-bit IEEE float */
+#else /* IEEEFLOAT */
+ if (numFormat != DPSDefaultNumFormat)
+ /* then it must be IEEE */
+ WTT(138); /* 32-bit IEEE float */
+ else
+ PB(140); /* 32-bit native float */
+#endif /* IEEEFLOAT */
+
+ DPSWriteData(ctxt, (char *) &currObj->val.realVal, 4);
+ break;
+ case DPS_NAME: {
+ char *p = 0;
+ integer index = currObj->val.nameVal;
+
+ length = currObj->length;
+ if (length == DPSSYSNAME) {/* system name index */
+ if (index >= 0 && index < 256) {
+ if (lit)
+ PB(145); /* literal system name */
+ else
+ PB(146); /* exec. system name */
+ PB(index);
+ goto next_obj;
+ }
+ else if (DPS_FIRST_AUX_SYSNAME <= index
+ && index <= DPS_LAST_AUX_SYSNAME)
+ p = DPSSysNamesAux[index - DPS_FIRST_AUX_SYSNAME];
+ else DPSCantHappen();
+ length = strlen(p);
+ }
+ else if (length == 0) { /* user name index */
+ if (ctxt->nameEncoding == dps_indexed && index < 256) {
+ if (lit)
+ PB(147); /* literal user name index */
+ else
+ PB(148); /* executable user name index */
+ PB(index);
+ goto next_obj;
+ }
+ else {
+ p = DPSNameFromIndex(index);
+ length = strlen(p);
+ }
+ }
+ else
+ p = base + index;
+ if (lit) DPSPrintf(ctxt, "/");
+ DPSWriteData(ctxt, p, length);
+ DPSPrintf(ctxt, " ");
+ break;
+ }
+ case DPS_ARRAY: {
+ DPSBinObj aryObj = (DPSBinObj)(base+currObj->val.arrayVal);
+ integer r;
+ length = currObj->length;
+ if (lit && (r = TestHomogeneous(aryObj, length, numFormat)) != -1) {
+ PB(149); /* homogeneous number array */
+ PB(r);
+ DPSWriteData(ctxt, (char *) &length, 2);
+ if (r > 127) r -= 128;
+ while (length--) {
+ switch (r) {
+ case 0:
+ DPSWriteData(ctxt, (char *) &aryObj->val.integerVal, 4);
+ break;
+ case 32:
+ n16.i = aryObj->val.integerVal;
+ DPSWriteData(ctxt, (char *) n16.bytes, 2);
+ break;
+ case 48:
+ case 49:
+ DPSWriteData(ctxt, (char *) &aryObj->val.realVal, 4);
+ break;
+ default: DPSCantHappen();
+ }
+ ++aryObj;
+ }
+ }
+ else {
+ DPSPrintf(ctxt, (lit ? "[ " : "{ "));
+ WriteSeqAsTokens(ctxt, base, aryObj, length, tokenType,
+ numstringOffsets);
+ DPSPrintf(ctxt, (lit ? " ] " : " } "));
+ }
+ break; }
+ case DPS_MARK:
+ if (lit)
+ DPSPrintf(ctxt, "/mark ");
+ else
+ DPSPrintf(ctxt, "mark ");
+ break;
+ case DPS_STRING: {
+ char *p = base + currObj->val.stringVal;
+ int i;
+ if (numstringOffsets != NULL) {
+ for (i = 2; i < numstringOffsets[1] &&
+ numstringOffsets[i] != currObj->val.stringVal; i++) ;
+ if (numstringOffsets[i] == currObj->val.stringVal) {
+ DPSAssert(*(unsigned char *) p == 149);
+ DPSWriteData(ctxt, p, length);
+ break;
+ }
+ }
+ length = currObj->length;
+ if (length < 256) {
+ PB(142); /* short string */
+ PB(length);
+ }
+ else {
+ WTT(143); /* long string */
+ DPSWriteData(ctxt, (char *) &length, 2);
+ }
+ DPSWriteData(ctxt, p, length);
+ break;
+ }
+ default: DPSCantHappen();
+ }
+next_obj:
+ ++currObj;
+ if (++nLineObjs == 15) {
+ nLineObjs = 0;
+ DPSPrintf(ctxt, "\n ");
+ }
+ } /* end while */
+
+ DPSPrintf(ctxt, "\n");
+} /* WriteSeqAsTokens */
+
+static void WriteTokenAsAscii(
+ DPSContext ctxt,
+ register unsigned char *buf)
+{
+ Swap32Rec n32;
+ Swap16Rec n16;
+ register unsigned char *b;
+
+ switch (*buf++) {
+ case 132: /* 32-bit int, hi */
+ b = n32.bytes;
+ Copy4SrcHi(buf, b);
+ DPSPrintf(ctxt, "%d ", n32.i);
+ break;
+ case 133: /* 32-bit int, lo */
+ b = n32.bytes;
+ Copy4SrcLo(buf, b);
+ DPSPrintf(ctxt, "%d ", n32.i);
+ break;
+ case 134: /* 16-bit int, hi */
+ b = n16.bytes;
+ Copy2SrcHi(buf, b);
+ DPSPrintf(ctxt, "%d ", n16.i);
+ break;
+ case 135: /* 16-bit int, lo */
+ b = n16.bytes;
+ Copy2SrcLo(buf, b);
+ DPSPrintf(ctxt, "%d ", n16.i);
+ break;
+ case 136: /* 8-bit int, signed */
+ n32.i = (char) *buf;
+ DPSPrintf(ctxt, "%d ", n32.i);
+ break;
+ case 137: { /* 16 or 32-bit fixed */
+ unsigned char r = *buf++;
+ float f = 0.0;
+ boolean hi = (r < 128);
+
+ if (!hi) r -= 128;
+ if (r < 32) { /* 32-bit */
+ b = n32.bytes;
+ if (hi) {Copy4SrcHi(buf, b);} else {Copy4SrcLo(buf, b);}
+ if (r == 0) {
+ DPSPrintf(ctxt, "%d ", n32.i);
+ break;
+ }
+ else {
+ f = n32.i; /* convert to float */
+ goto do_scale;
+ }
+ }
+ else if (r < 48) { /* 16-bit */
+ b = n16.bytes;
+ if (hi) {Copy2SrcHi(buf, b);} else {Copy2SrcLo(buf, b);};
+ if (r == 0) {
+ DPSPrintf(ctxt, "%d ", n16.i);
+ break;
+ }
+ else {
+ r -= 32;
+ f = n16.i; /* convert to float */
+ goto do_scale;
+ }
+ }
+ else DPSCantHappen();
+do_scale:
+ n32.f = f / (1 << r); /* scale */
+ DPSPrintf(ctxt, "%g ", n32.f);
+ break;
+ }
+ case 138: /* 32-bit IEEE float, hi */
+#if IEEEFLOAT
+ b = n32.bytes;
+ Copy4SrcHi(buf, b);
+#else /* IEEEFLOAT */
+ IEEEHighToNative(buf, &n32.f);
+#endif /* IEEEFLOAT */
+ DPSPrintf(ctxt, "%g ", n32.f);
+ break;
+ case 139: /* 32-bit IEEE float, lo */
+#if IEEEFLOAT
+ b = n32.bytes;
+ Copy4SrcLo(buf, b);
+#else /* IEEEFLOAT */
+ IEEELowToNative(buf, &n32.f);
+#endif /* IEEEFLOAT */
+ DPSPrintf(ctxt, "%g ", n32.f);
+ break;
+ case 140: /* 32-bit native float */
+ b = n32.bytes;
+ *b++ = *buf++,*b++ = *buf++,*b++ = *buf++,*b = *buf;
+ DPSPrintf(ctxt, "%g ", n32.f);
+ break;
+ case 141: /* boolean */
+ if (*buf)
+ DPSPrintf(ctxt, "true ");
+ else
+ DPSPrintf(ctxt, "false ");
+ break;
+ case 142: /* short string */
+ DPSPrintf(ctxt, "(");
+ n16.u = *buf++;
+ goto share_str_code;
+ case 143: /* long string, hi */
+ b = n16.bytes;
+ Copy2SrcHi(buf, b);
+ DPSPrintf(ctxt, "(");
+ buf += 2;
+ goto share_str_code;
+ case 144: /* long string, lo */
+ b = n16.bytes;
+ Copy2SrcLo(buf, b);
+ DPSPrintf(ctxt, "(");
+ buf += 2;
+share_str_code:
+#ifdef VMS
+ WriteVMSStringBody(ctxt, buf, n16.u); /* write this */
+#else /* VMS */
+ /* render string bytes correctly */
+ while (n16.u--) {
+ unsigned char c = *buf++;
+ if (c == '(' || c == ')' || c == '\\')
+ DPSPrintf(ctxt, "\\%c", c);
+ else if (c == '\n')
+ DPSPrintf(ctxt, "\\n");
+ else if (!(isascii(c) && isprint(c)))
+ DPSPrintf(ctxt, "\\%03.3o", c);
+ else DPSWriteData(ctxt, (char *) &c, 1);
+ }
+#endif /* VMS */
+ DPSPrintf(ctxt, ") ");
+ break;
+ case 145: /* literal system name index */
+ DPSPrintf(ctxt, "/%s ", DPSSysNames[*buf]);
+ break;
+ case 146: /* executable system name index */
+ DPSPrintf(ctxt, "%s ", DPSSysNames[*buf]);
+ break;
+ case 147: /* literal user name index */
+ DPSPrintf(ctxt, "/%s ", DPSNameFromIndex(*buf));
+ break;
+ case 148: /* executable user name index */
+ DPSPrintf(ctxt, "%s ", DPSNameFromIndex(*buf));
+ break;
+ case 149: { /* homogeneous number array */
+ WriteHomogeneousArrayAsASCII(ctxt, buf);
+ break;
+ }
+ default:; /* unassigned */
+ }
+} /* WriteTokenAsAscii */
+
+
+/* WriteEntireGoody converts an entire binary token or binary object
+ sequence as specified by ctxt's encoding parameters. Write the
+ converted bytes via DPSWriteData. buf points to the complete goody. */
+
+static void WriteEntireGoody(
+ DPSContext ctxt,
+ unsigned char *buf,
+ int *numstringOffsets)
+{
+
+ DPSExtendedBinObjSeq bos = (DPSExtendedBinObjSeq) buf;
+ DPSExtendedBinObjSeqRec bosRec;
+ DPSBinObj currObj;
+ DPSPrivContext cc = (DPSPrivContext) ctxt;
+
+ if (IsBinaryToken(*buf)) {
+ /* only supported conversion is binary token to ASCII */
+ WriteTokenAsAscii(ctxt, buf);
+ if (numstringOffsets) numstringOffsets[1] = 2;
+ return;
+ }
+
+ if (bos->escape != 0) {
+ /* not extended BOS */
+ DPSBinObjSeq seqHead = (DPSBinObjSeq) buf;
+ bos = &bosRec;
+ bos->tokenType = seqHead->tokenType;
+ bos->escape = seqHead->nTopElements;
+ bos->nTopElements = seqHead->nTopElements;
+ bos->length = seqHead->length;
+ currObj = &(seqHead->objects[0]);
+ }
+ else currObj = &(bos->objects[0]);
+
+ switch (ctxt->programEncoding) {
+ case dps_binObjSeq:
+ if (ctxt->nameEncoding == dps_strings) {
+ /* takes three passes to do conversions */
+ ConvertAndWriteSeqAsData(ctxt, (char *) buf, 0);
+ ConvertAndWriteSeqAsData(ctxt, (char *) buf, 1);
+ ConvertAndWriteSeqAsData(ctxt, (char *) buf, 2);
+ }
+ else if (bos->tokenType != DPS_DEF_TOKENTYPE
+ || cc->numFormat != DPSDefaultNumFormat) {
+ /* first pass just writes modified seqHead */
+ ConvertAndWriteSeqAsData(ctxt, (char *) buf, 0);
+ /* second pass converts numbers and writes the sequence */
+ ConvertAndWriteSeqAsData(ctxt, (char *) buf, 1);
+ }
+ else DPSWriteData(ctxt, (char *) buf, bos->length);
+ break;
+ case dps_ascii:
+ case dps_encodedTokens: {
+
+ if (ctxt->programEncoding == dps_ascii)
+ {
+ WriteSeqAsAscii(
+ ctxt, (char *)currObj, currObj, bos->nTopElements,
+ bos->tokenType, numstringOffsets);
+ }
+ else
+ WriteSeqAsTokens(
+ ctxt, (char *)currObj, currObj, bos->nTopElements,
+ bos->tokenType, numstringOffsets);
+ DPSWriteData(ctxt, "\n", 1);
+ break;
+ }
+ default:;
+ }
+ if (numstringOffsets) numstringOffsets[1] = 2;
+} /* WriteEntireGoody */
+
+
+/**************************************/
+/* Context procs for DPSCreateTextContext */
+/**************************************/
+
+static void textWriteData(DPSContext ctxt, char *buf, unsigned int nch)
+{
+ (*ctxt->textProc)(ctxt, buf, nch);
+ if (ctxt->chainChild != NIL) DPSWriteData(ctxt->chainChild, buf, nch);
+}
+
+static void textFlushContext(DPSContext ctxt)
+{
+ if (ctxt->chainChild != NIL) DPSFlushContext(ctxt->chainChild);
+}
+
+static void textInterruptContext(DPSContext ctxt)
+{
+ if (ctxt->chainChild != NIL) DPSInterruptContext(ctxt->chainChild);
+}
+
+static void textDestroyContext(DPSContext ctxt)
+{
+ DPSPrivContext c = (DPSPrivContext)ctxt;
+
+ DPSUnchainContext(ctxt);
+
+ free(c);
+}
+
+static void textInnerWritePostScript(
+ DPSContext ctxt, char *buf, unsigned int nch)
+{
+ DPSPrivContext cc = (DPSPrivContext)ctxt;
+ while (nch > 0) {
+ char *oldBuf = NIL;
+ integer oldNch = 0;
+ unsigned n;
+ if (cc->outBuf) { /* we're buffering */
+ unsigned m;
+ integer bst;
+ if (!IsBinaryToken(cc->outBuf[0]) && cc->nOutBufChars < DPS_SEQ_MIN) {
+ char *tb = cc->outBuf + cc->nOutBufChars;
+ integer nn = DPS_SEQ_MIN - cc->nOutBufChars;
+ DPSAssert(nn == 1);
+ cc->nOutBufChars += nn;
+ nch -= nn;
+ *tb++ = *buf++;
+ }
+ bst = GetHdrNBytes((unsigned char *) cc->outBuf);
+ /* # bytes needed to determine size */
+ if (cc->nOutBufChars < bst) {
+ char *b = cc->outBuf;
+ if (nch + cc->nOutBufChars < (unsigned) bst) {
+ os_bcopy(buf, cc->outBuf + cc->nOutBufChars, nch);
+ cc->nOutBufChars += nch;
+ return;
+ }
+ os_bcopy(buf, b + cc->nOutBufChars, bst - cc->nOutBufChars);
+ buf += bst - cc->nOutBufChars;
+ nch -= bst - cc->nOutBufChars;
+ cc->nOutBufChars = bst;
+ m = GetNBytes((unsigned char *) cc->outBuf);
+ cc->outBuf = (char *)DPScalloc(m, 1);
+ os_bcopy(b, cc->outBuf, bst);
+ free(b);
+ }
+ else m = GetNBytes((unsigned char *) cc->outBuf);
+
+ /* here with size of entire goody in m and outBuf set up */
+ if (nch + cc->nOutBufChars < m) {
+ os_bcopy(buf, cc->outBuf + cc->nOutBufChars, nch);
+ cc->nOutBufChars += nch;
+ return;
+ }
+ os_bcopy(buf, cc->outBuf + cc->nOutBufChars, m - cc->nOutBufChars);
+ buf += m - cc->nOutBufChars;
+ nch -= m - cc->nOutBufChars;
+ cc->nOutBufChars = m;
+ oldBuf = buf;
+ oldNch = nch;
+ buf = cc->outBuf;
+ nch = cc->nOutBufChars;
+ cc->outBuf = NIL;
+ cc->nOutBufChars = 0;
+ } /* if (cc->outBuf) */
+
+ /* dispose of any plain text. If no binary conversion, all output
+ is plain text */
+ if (cc->contextFlags & DPS_FLAG_NO_BINARY_CONVERSION) n = nch;
+ else {
+ for (n = 0; n < nch &&
+ ((unsigned char) buf[n] < 128 || (unsigned char) buf[n] > 159); n++);
+ }
+ if (n > 0) {
+ /* Assumes below that any error proc called uses dpsexcept.h
+ if it rips control away */
+ DURING
+ DPSWriteData((DPSContext)cc, buf, n);
+ HANDLER
+ if (oldBuf) free(buf);
+ RERAISE;
+ END_HANDLER
+ }
+ buf += n;
+ nch -= n;
+
+ if (nch != 0) {
+ /* here with the next binary object sequence or encoded token */
+ unsigned m = 0;
+ integer bst;
+ if (!IsBinaryToken(buf[0]) && nch < DPS_SEQ_MIN) {
+ /* gotta buffer it */
+ DPSAssertWarn(nch == 1 && !oldBuf, cc, "problem converting binary token/sequence (nch!=1||oldBuf)");
+ cc->outBuf = (char *)DPScalloc(DPS_EXT_HEADER_SIZE, 1);
+ cc->nOutBufChars = nch;
+ cc->outBuf[0] = *buf;
+ return;
+ }
+ bst = GetHdrNBytes((unsigned char *) buf);
+ if (nch < (unsigned)bst || nch < (m = GetNBytes((unsigned char *) buf))) {
+ /* gotta buffer it */
+ DPSAssertWarn(!oldBuf, cc, "problem converting binary token/sequence (oldBuf)");
+ if (nch < (unsigned) bst) {
+ cc->outBuf = (char *)DPScalloc(bst, 1);
+ }
+ else {
+ cc->outBuf = (char *)DPScalloc(m, 1);
+ }
+ cc->nOutBufChars = nch;
+ os_bcopy(buf, cc->outBuf, nch);
+ return;
+ }
+
+ /* Assumes below that any error proc called uses dpsexcept.h
+ if it rips control away */
+ DURING
+ WriteEntireGoody(ctxt, (unsigned char *) buf, cc->numstringOffsets);
+ HANDLER
+ if (oldBuf) {
+ DPSAssertWarn(nch == m, cc, "some converted PostScript language may be lost during error recovery (nch!=m)");
+ free(buf);
+ }
+ RERAISE;
+ END_HANDLER
+
+ if (oldBuf) {
+ DPSAssertWarn(nch == m, cc, "some converted PostScript language may be lost (nch!=m)");
+ free(buf);
+ buf = oldBuf;
+ nch = oldNch;
+ oldBuf = NIL;
+ }
+ else {
+ buf += m;
+ nch -= m;
+ }
+ } /* if (nch != 0) */
+ } /* while (nch > 0) */
+} /* textInnerWritePostScript */
+
+static void textWritePostScript(
+ DPSContext ctxt, char *buf, unsigned int nch)
+{
+ DPSContext children = ctxt->chainChild;
+ /* disconnect temporarily so that high level procs can
+ be called safely */
+ if (children != NIL) ctxt->chainChild = NIL;
+ DURING
+ textInnerWritePostScript(ctxt, buf, nch);
+ HANDLER
+ if (children != NIL) ctxt->chainChild = children;
+ RERAISE;
+ END_HANDLER
+ if (children != NIL) {
+ ctxt->chainChild = children;
+ DPSWritePostScript(ctxt->chainChild, buf, nch);
+ }
+}
+
+static void textWriteStringChars(
+ DPSContext ctxt, char *buf, unsigned int nch)
+{
+ DPSContext children = ctxt->chainChild;
+
+ if (DPSCheckShared((DPSPrivContext)ctxt)) return;
+ /* disconnect temporarily so that high level procs can
+ be called safely */
+ if (children != NIL) ctxt->chainChild = NIL;
+ DURING
+ textInnerWritePostScript(ctxt, buf, nch);
+ HANDLER
+ if (children != NIL) ctxt->chainChild = children;
+ RERAISE;
+ END_HANDLER
+ if (children != NIL) {
+ ctxt->chainChild = children;
+ DPSWriteStringChars(ctxt->chainChild, buf, nch);
+ }
+}
+
+static void textBinObjSeqWrite(
+ DPSContext ctxt, char *buf, unsigned int nch)
+{
+ DPSContext children = ctxt->chainChild;
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+
+ if (DPSCheckShared(c)) return;
+ if (c->lastNameIndex < globLastNameIndex)
+ DPSUpdateNameMap(ctxt);
+ /* disconnect temporarily so that high level procs can
+ be called safely */
+ if (children != NIL) ctxt->chainChild = NIL;
+ DURING
+ textInnerWritePostScript(ctxt, buf, nch);
+ HANDLER
+ if (children != NIL) ctxt->chainChild = children;
+ RERAISE;
+ END_HANDLER
+ if (children != NIL) {
+ ctxt->chainChild = children;
+ DPSBinObjSeqWrite(ctxt->chainChild, buf, nch);
+ }
+}
+
+static void textWriteNumstring(
+ DPSContext ctxt,
+ DPSDefinedType type,
+ char *data,
+ unsigned int size,
+ int scale)
+{
+ DPSPrivContext cc = (DPSPrivContext) ctxt;
+#define BUFFER_GROW 10
+
+ if (cc->contextFlags & DPS_FLAG_CONVERT_NUMSTRINGS) {
+ if (cc->numstringOffsets == NULL) {
+ cc->numstringOffsets = (int *) DPScalloc(sizeof(int),
+ BUFFER_GROW + 2);
+ cc->numstringOffsets[0] = BUFFER_GROW + 2; /* Current size */
+ cc->numstringOffsets[1] = 2; /* Next slot */
+ } else if (cc->numstringOffsets[1] >= cc->numstringOffsets[0]) {
+ cc->numstringOffsets[0] += BUFFER_GROW;
+ cc->numstringOffsets =
+ (int *) realloc(cc->numstringOffsets,
+ sizeof(int)* cc->numstringOffsets[0]);
+ }
+
+ /* Subtract 4 because of binary object sequence header */
+ cc->numstringOffsets[cc->numstringOffsets[1]] = cc->nOutBufChars - 4;
+ cc->numstringOffsets[1] += 1;
+ }
+
+ innerProcWriteNumstring(ctxt, type, data, size, scale, textInnerWritePostScript);
+#undef BUFFER_GROW
+} /* textWriteNumstring */
+
+/*********************/
+/* Public procedures */
+/*********************/
+
+/********************************************/
+/* Public procs for dealing with user names */
+
+char *DPSNameFromIndex(long int index)
+{
+ if (DPSglobals == NIL || index < 0 || index > globLastNameIndex
+ || userNameDict == NIL)
+ return NIL;
+ return (char *) userNames[index];
+}
+
+void DPSMapNames(
+ DPSContext ctxt,
+ unsigned int nNames,
+ char **names,
+ int **indices)
+{
+ unsigned i;
+ char *last = names[0];
+
+ DPSCheckInitClientGlobals();
+
+#define USERNAMEDICTLENGTH 100
+
+ if (userNameDict == NIL) {
+ userNameDict = DPSCreatePSWDict(USERNAMEDICTLENGTH);
+ userNames = (char **)DPScalloc(sizeof(char *), USERNAMEDICTLENGTH);
+ userNamesLength = USERNAMEDICTLENGTH;
+ }
+
+ for (i = 0; i < nNames; i++) {
+ integer j;
+ char *n = names[i];
+ DPSContext c;
+
+ if (n == NIL)
+ n = last;
+ else
+ last = n;
+ DPSAssert(n != NIL);
+ if (strlen(n) > 128) {
+ DPSSafeSetLastNameIndex(ctxt);
+ (*ctxt->errorProc)(ctxt, dps_err_nameTooLong, (unsigned long) n, strlen(n));
+ return;
+ }
+ j = DPSWDictLookup(userNameDict, n);
+ if (j >= 0) {
+ *(indices[i]) = j;
+ /* handle the case where another context in another space has
+ defined this name */
+ if (((DPSPrivContext)ctxt)->lastNameIndex < j)
+ DPSUpdateNameMap(ctxt);
+ }
+ else {
+ /* handle other cases where another context in another
+ space has defined names */
+ if (((DPSPrivContext)ctxt)->lastNameIndex < globLastNameIndex)
+ DPSUpdateNameMap(ctxt);
+ globLastNameIndex++;
+ if (((globLastNameIndex + 1) > userNamesLength)) {
+ char **t = (char **)DPScalloc(sizeof(char *),
+ userNamesLength + USERNAMEDICTLENGTH);
+ for (j = 0; j < userNamesLength; j++) {
+ t[j] = userNames[j];
+ }
+ free(userNames);
+ userNames = t;
+ userNamesLength += USERNAMEDICTLENGTH;
+ }
+ userNames[globLastNameIndex] = n;
+ DPSWDictEnter(userNameDict, n, globLastNameIndex);
+ *(indices[i]) = globLastNameIndex;
+ DPSPrintf(ctxt, "%d /%s defineusername\n", globLastNameIndex, n);
+ for (c = ctxt; c != NIL; c = c->chainChild)
+ ((DPSPrivContext)c)->lastNameIndex = globLastNameIndex;
+ }
+ } /* for */
+}
+
+/**********************/
+/* Other public procs */
+
+void DPSDefaultErrorProc(
+ DPSContext ctxt,
+ DPSErrorCode errorCode,
+ long unsigned int arg1, long unsigned int arg2)
+{
+
+ DPSTextProc textProc = DPSGetCurrentTextBackstop();
+
+ char *prefix = "%%[ Error: ";
+ char *suffix = " ]%%\n";
+
+ char *infix = "; OffendingCommand: ";
+ char *nameinfix = "User name too long; Name: ";
+ char *contextinfix = "Invalid context: ";
+ char *taginfix = "Unexpected wrap result tag: ";
+ char *typeinfix = "Unexpected wrap result type; tag: ";
+
+ switch (errorCode) {
+ case dps_err_ps: {
+ char *buf = (char *)arg1;
+ DPSBinObj ary = (DPSBinObj) (buf+DPS_HEADER_SIZE);
+ DPSBinObj elements;
+ char *error, *errorName;
+ integer errorCount, errorNameCount;
+ boolean resyncFlg;
+
+ if ((ary->attributedType & 0x7f) != DPS_ARRAY
+ || ary->length != 4) {
+ DPSHandleBogusError(ctxt, prefix, suffix);
+ }
+
+ elements = (DPSBinObj)(((char *) ary) + ary->val.arrayVal);
+
+ errorName = (char *)(((char *) ary) + elements[1].val.nameVal);
+ errorNameCount = elements[1].length;
+
+ error = (char *)(((char *) ary) + elements[2].val.nameVal);
+ errorCount = elements[2].length;
+
+ resyncFlg = elements[3].val.booleanVal;
+
+ if (textProc != NIL) {
+ (*textProc)(ctxt, prefix, strlen(prefix));
+ (*textProc)(ctxt, errorName, errorNameCount);
+ (*textProc)(ctxt, infix, strlen(infix));
+ (*textProc)(ctxt, error, errorCount);
+ (*textProc)(ctxt, suffix, strlen(suffix));
+ }
+ if (resyncFlg && (ctxt != dummyCtx) && (ctxt != NULL)) {
+#if 0 /* Postpone the raise 'til later to avoid RAISEing through Xlib */
+ RAISE(dps_err_ps, (char *) ctxt);
+ DPSCantHappen();
+#else
+ DPSPrivContext cc = (DPSPrivContext) ctxt;
+ cc->resyncing = true;
+#endif
+ }
+ break;
+ }
+ case dps_err_nameTooLong:
+ if (textProc != NIL) {
+ char *buf = (char *)arg1;
+ (*textProc)(ctxt, prefix, strlen(prefix));
+ (*textProc)(ctxt, nameinfix, strlen(nameinfix));
+ (*textProc)(ctxt, buf, arg2);
+ (*textProc)(ctxt, suffix, strlen(suffix));
+ }
+ break;
+ case dps_err_invalidContext:
+ if (textProc != NIL) {
+ char m[100];
+ (void) sprintf(m, "%s%s%ld%s", prefix, contextinfix, arg1, suffix);
+ (*textProc)(ctxt, m, strlen(m));
+ }
+ break;
+ case dps_err_resultTagCheck:
+ if (textProc != NIL) {
+ char m[100];
+ unsigned char tag = *((unsigned char *) arg1+1);
+ (void) sprintf(m, "%s%s%d%s", prefix, taginfix, tag, suffix);
+ (*textProc)(ctxt, m, strlen(m));
+ }
+ break;
+ case dps_err_resultTypeCheck:
+ if (textProc != NIL) {
+ char m[100];
+ unsigned char tag = *((unsigned char *) arg1+1);
+ (void) sprintf(m, "%s%s%d%s", prefix, typeinfix, tag, suffix);
+ (*textProc)(ctxt, m, strlen(m));
+ }
+ break;
+ default:
+ DPSDefaultPrivateHandler(ctxt, errorCode, arg1, arg2, prefix, suffix);
+ break;
+ }
+} /* DPSDefaultErrorProc */
+
+void DPSCheckRaiseError(DPSContext c)
+{
+ DPSPrivContext cc = (DPSPrivContext) c;
+ if (cc != NULL && cc->resyncing) {
+ cc->resyncing = false;
+ RAISE(dps_err_ps, (char *) c);
+ DPSCantHappen();
+ }
+}
+
+/**************************************/
+/* Public procs for creating contexts */
+
+/* dps_err_invalidAccess is now defined for all clients. */
+
+static void textAwaitReturnValues(DPSContext ctxt)
+{
+ (*ctxt->errorProc)(ctxt, dps_err_invalidAccess, 0, 0);
+}
+
+static void Noop(void)
+{
+}
+
+DPSContext DPSCreateTextContext(
+ DPSTextProc textProc, DPSErrorProc errorProc)
+{
+ DPSPrivContext c;
+
+ if (DPSInitialize () != 0) return((DPSContext) NIL);
+ if (!textCtxProcs) {
+ textCtxProcs = (DPSProcs)DPScalloc(sizeof(DPSProcsRec), 1);
+ DPSInitCommonTextContextProcs(textCtxProcs);
+ DPSInitSysNames();
+ }
+
+ c = (DPSPrivContext)DPScalloc(sizeof(DPSPrivContextRec), 1);
+ c->textProc = textProc;
+ c->procs = textCtxProcs;
+ c->textProc = textProc;
+ c->errorProc = errorProc;
+ c->programEncoding = dps_ascii;
+ c->nameEncoding = dps_strings; /* don't write user name indices on a file */
+ c->contextFlags = DPS_FLAG_CONVERT_NUMSTRINGS; /* Convert by default */
+ c->numFormat = DPSDefaultNumFormat;
+ c->numstringOffsets = NULL;
+ c->lastNameIndex = -1;
+
+ /* Setup a dummy space */
+ if (textSpace == NIL)
+ {
+ textSpace = (DPSPrivSpace) DPScalloc(sizeof (DPSPrivSpaceRec), 1);
+ textSpace->procs = (DPSSpaceProcs) DPScalloc(sizeof (DPSSpaceProcsRec), 1);
+ textSpace->procs->DestroySpace = (DPSSpaceProc) Noop;
+ textSpace->lastNameIndex = -1;
+ DPSInitPrivateSpaceFields(textSpace);
+ }
+ c->space = (DPSSpace) textSpace;
+
+ DPSInitPrivateTextContextFields(c, textSpace);
+ return (DPSContext)c;
+} /* DPSCreateTextContext */
+
+
+static DPSContext CreateDummyContext(void)
+{
+ DPSPrivContext c;
+
+ DPSCheckInitClientGlobals();
+ if (!dummyCtxProcs) {
+ dummyCtxProcs = (DPSProcs)DPScalloc(sizeof(DPSProcsRec), 1);
+ dummyCtxProcs->BinObjSeqWrite = (DPSContextBufProc) Noop;
+ dummyCtxProcs->WriteTypedObjectArray = (DPSContextTypedArrayProc) Noop;
+ dummyCtxProcs->WriteStringChars = (DPSContextBufProc) Noop;
+ dummyCtxProcs->WritePostScript = (DPSContextBufProc) Noop;
+ dummyCtxProcs->WriteData = (DPSContextBufProc) Noop;
+ dummyCtxProcs->FlushContext = (DPSContextProc) Noop;
+ dummyCtxProcs->ResetContext = (DPSContextProc) Noop;
+ dummyCtxProcs->WaitContext = (DPSContextProc) Noop;
+ dummyCtxProcs->UpdateNameMap = (DPSContextProc) Noop;
+ dummyCtxProcs->AwaitReturnValues = (DPSContextProc) Noop;
+ dummyCtxProcs->Interrupt = (DPSContextProc) Noop;
+ dummyCtxProcs->DestroyContext = (DPSContextProc) Noop;
+ dummyCtxProcs->WriteNumString = (DPSWriteNumStringProc) Noop;
+ }
+
+ c = (DPSPrivContext)DPScalloc(sizeof(DPSPrivContextRec), 1);
+ c->procs = dummyCtxProcs;
+ c->programEncoding = DPSDefaultProgramEncoding;
+ c->nameEncoding = DPSDefaultNameEncoding; /* don't care */
+ c->numFormat = DPSDefaultNumFormat;
+ c->lastNameIndex = -1;
+ c->numstringOffsets = NULL;
+
+ return (DPSContext)c;
+} /* CreateDummyContext */
+
+void DPSSetTextBackstop(DPSTextProc textProc)
+{
+ DPSCheckInitClientGlobals();
+ if (!dummyCtx) dummyCtx = CreateDummyContext();
+ dummyCtx->textProc = textProc;
+}
+
+DPSTextProc DPSGetCurrentTextBackstop(void)
+{
+ DPSCheckInitClientGlobals();
+ if (dummyCtx == NIL) return NIL;
+ else return dummyCtx->textProc;
+}
+
+void DPSSetErrorBackstop(DPSErrorProc errorProc)
+{
+ DPSCheckInitClientGlobals();
+ if (!dummyCtx) dummyCtx = CreateDummyContext();
+ dummyCtx->errorProc = errorProc;
+}
+
+DPSErrorProc DPSGetCurrentErrorBackstop(void)
+{
+ DPSCheckInitClientGlobals();
+ if (dummyCtx == NIL) return NIL;
+ else return dummyCtx->errorProc;
+}
+
+static void NoteInitFailure(DPSContext ctxt, char *buf, long unsigned length)
+{
+ initFailed = -1;
+}
+
+int DPSInitialize(void)
+{
+ DPSCheckInitClientGlobals();
+ if (!clientStarted) {
+ clientStarted = true;
+ initFailed = 0;
+ DPSInitClient(NoteInitFailure, ReleaseInput); /* may call DPSCreateContext */
+ /* textProc will not be used unless DPS initialization fails */
+ }
+ return initFailed;
+}
+
+DPSContext DPSCreateContext(
+ char *wh,
+ DPSTextProc textProc,
+ DPSErrorProc errorProc,
+ DPSSpace space)
+{
+
+ DPSPrivSpace ss;
+ DPSPrivContext c;
+
+ if (DPSInitialize() != 0) return NIL;
+
+ if (!ctxProcs) {
+ ctxProcs = (DPSProcs)DPScalloc(sizeof(DPSProcsRec), 1);
+ ctxProcs->BinObjSeqWrite = procBinObjSeqWrite;
+ ctxProcs->WriteTypedObjectArray = writeTypedObjectArray;
+ ctxProcs->WriteStringChars = procWriteStringChars;
+ ctxProcs->WritePostScript = procWritePostScript;
+ ctxProcs->WriteData = procWriteData;
+ ctxProcs->UpdateNameMap = procUpdateNameMap;
+ ctxProcs->Interrupt = procInterrupt;
+ ctxProcs->WriteNumString = (DPSWriteNumStringProc) procWriteNumstring;
+ }
+ if (!spaceProcs) {
+ spaceProcs = (DPSSpaceProcs)DPScalloc(sizeof(DPSSpaceProcsRec), 1);
+ DPSInitCommonSpaceProcs(spaceProcs);
+ }
+
+ ss = (DPSPrivSpace)space;
+
+ if (ss == NIL) {
+ ss = (DPSPrivSpace)DPScalloc(sizeof(DPSPrivSpaceRec), 1);
+ ss->procs = spaceProcs;
+ ss->lastNameIndex = -1;
+ ss->next = spaces;
+ DPSAssert(ss->next != ss);
+ spaces = ss;
+ DPSInitPrivateSpaceFields(ss);
+ }
+
+ if (ss->wh == NIL) ss->wh = wh; /* KLUDGE to support DPSSendDestroySpace */
+
+ c = (DPSPrivContext)DPScalloc(sizeof(DPSPrivContextRec), 1);
+ c->procs = ctxProcs;
+ c->wh = wh;
+ c->textProc = textProc;
+ c->errorProc = errorProc;
+ c->programEncoding = DPSDefaultProgramEncoding;
+ c->nameEncoding = DPSDefaultNameEncoding;
+ c->lastNameIndex = -1;
+ c->space = (DPSSpace)ss;
+ c->numstringOffsets = NULL;
+
+ c->next = ss->firstContext;
+ DPSAssert(c->next != c);
+ ss->firstContext = c;
+
+ DPSInitPrivateContextFields(c, ss);
+
+ c->numFormat = DPSCreatePrivContext(
+ (XDPSPrivContext)wh,
+ (DPSContext)c,
+ (ContextPSID *)&c->cid,
+ (SpaceXID *)&ss->sid,
+ (space == NIL), DPSclientPrintProc);
+ if (c->numFormat == (DPSNumFormat) -1)
+ { /* can't create the context */
+ if (space == NIL) {
+ spaces = ss->next;
+ free(ss);
+ }
+ else ss->firstContext = c->next;
+ free(c);
+ return NIL;
+ }
+ else return (DPSContext)c;
+} /* DPSCreateContext */
+
+char *DPSSetWh(
+ DPSContext ctxt,
+ char *newWh)
+{
+ DPSPrivContext cc = (DPSPrivContext) ctxt;
+ char *tmp = cc->wh;
+ cc->wh = newWh;
+ return(tmp);
+}
+
+/*
+ The chainParent field is non-NIL if this context automatically receives
+ a copy of the PostScript code sent to the referenced (parent) context.
+
+ The chainChild field is non-NIL if this context automatically sends along
+ to the referenced (child) context a copy of any PostScript code received.
+*/
+int DPSChainContext(DPSContext parent, DPSContext child)
+{
+ DPSContext cc = child->chainChild;
+
+ if (child->chainParent != NIL)
+ return -1; /* report an error */
+
+ /* insert new child between parent and existing children */
+ child->chainChild = parent->chainChild;
+ if (parent->chainChild != NIL) {
+ DPSAssertWarn(parent->chainChild->chainParent == parent, (DPSPrivContext)parent, "attempting to chain context on invalid chain");
+ child->chainChild->chainParent = child;
+ }
+ child->chainParent = parent;
+ parent->chainChild = child;
+ /* if child has children, recursively chain them */
+ if (cc != NIL) {
+ cc->chainParent = NIL;
+ (void) DPSChainContext(child, cc);
+ }
+ return 0;
+}
+
+void DPSUnchainContext(DPSContext ctxt)
+{
+ DPSContext p = ctxt->chainParent;
+ DPSContext c = ctxt->chainChild;
+
+ if (p != NIL) { /* remove ctxt from parent's chain */
+ DPSAssertWarn(p->chainChild == ctxt, (DPSPrivContext)p, "attempting to unchain context from wrong chain (parent)");
+ p->chainChild = c;
+ ctxt->chainParent = NIL;
+ }
+ if (c != NIL) { /* remove ctxt's child (if any) from ctxt's chain */
+ DPSAssertWarn(c->chainParent == ctxt, (DPSPrivContext)c, "attempting to unchain context from wrong chain (child)");
+ c->chainParent = p;
+ ctxt->chainChild = NIL;
+ }
+}
+
+/****************/
+/* Veneer procs */
+
+void DPSAwaitReturnValues(DPSContext ctxt)
+{
+ (*(ctxt)->procs->AwaitReturnValues)((ctxt));
+}
+
+void DPSDestroyContext(DPSContext ctxt)
+{
+ (*(ctxt)->procs->DestroyContext)((ctxt));
+}
+
+void DPSDestroySpace(DPSSpace spc)
+{
+ (*(spc)->procs->DestroySpace)((spc));
+}
+
+void DPSFlushContext(DPSContext ctxt)
+{
+ (*(ctxt)->procs->FlushContext)((ctxt));
+}
+
+DPSContext DPSGetCurrentContext(void) { return DPSGlobalContext; }
+
+void DPSInterruptContext(DPSContext ctxt)
+{
+ (*(ctxt)->procs->Interrupt)((ctxt));
+}
+
+DPSContext DPSPrivCurrentContext(void) { return DPSGlobalContext; }
+
+void DPSResetContext(DPSContext ctxt)
+{
+ (*(ctxt)->procs->ResetContext)((ctxt));
+}
+
+void DPSSetResultTable(
+ register DPSContext ctxt,
+ DPSResults tbl,
+ unsigned int len)
+{
+ (ctxt)->resultTable = (tbl);
+ (ctxt)->resultTableLength = (len);
+}
+
+void DPSSetContext(
+ DPSContext ctxt)
+{
+ DPSGlobalContext = ctxt;
+}
+
+void DPSUpdateNameMap(
+ DPSContext ctxt)
+{
+ (*(ctxt)->procs->UpdateNameMap)((ctxt));
+}
+
+void DPSWaitContext(
+ DPSContext ctxt)
+{
+ (*(ctxt)->procs->WaitContext)(ctxt);
+}
+
+void DPSBinObjSeqWrite(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ (*(ctxt)->procs->BinObjSeqWrite)((ctxt), (buf), (count));
+}
+
+void DPSWriteData(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ (*(ctxt)->procs->WriteData)((ctxt), (buf), (count));
+}
+
+void DPSWritePostScript(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ (*(ctxt)->procs->WritePostScript)((ctxt), (buf), (count));
+}
+
+void DPSWriteStringChars(
+ DPSContext ctxt,
+ char *buf,
+ unsigned int count)
+{
+ (*(ctxt)->procs->WriteStringChars)((ctxt), (buf), (count));
+}
+
+void DPSWriteNumString(ctxt, type, data, size, scale)
+ DPSContext ctxt;
+ DPSDefinedType type;
+ char *data;
+ unsigned int size;
+ int scale;
+{
+ (*(ctxt)->procs->WriteNumString)((ctxt), (type), (data), (size), (scale));
+}
+
+void DPSWriteTypedObjectArray(ctxt, type, array, length)
+ DPSContext ctxt;
+ DPSDefinedType type;
+ char *array;
+ unsigned int length; {
+ (*(ctxt)->procs->WriteTypedObjectArray)((ctxt), (type), (array), (length));
+ }
+
+void DPSInitCommonTextContextProcs(DPSProcs p)
+{
+ p->BinObjSeqWrite = textBinObjSeqWrite;
+ p->WriteTypedObjectArray = writeTypedObjectArray;
+ p->WriteStringChars = textWriteStringChars;
+ p->WritePostScript = textWritePostScript;
+ p->WriteData = textWriteData;
+ p->FlushContext = textFlushContext;
+ p->ResetContext = (DPSContextProc) Noop;
+ p->WaitContext = (DPSContextProc) Noop;
+ p->UpdateNameMap = procUpdateNameMap;
+ p->AwaitReturnValues = textAwaitReturnValues;
+ p->Interrupt = textInterruptContext;
+ p->DestroyContext = textDestroyContext;
+ p->WriteNumString = (DPSWriteNumStringProc) textWriteNumstring;
+}
+
+void DPSInitCommonContextProcs(DPSProcs p)
+{
+ p->BinObjSeqWrite = procBinObjSeqWrite;
+ p->WriteTypedObjectArray = writeTypedObjectArray;
+ p->WriteStringChars = procWriteStringChars;
+ p->WritePostScript = procWritePostScript;
+ p->WaitContext = procWaitContext;
+ p->DestroyContext = procDestroyContext;
+ p->WriteData = procWriteData;
+ p->UpdateNameMap = procUpdateNameMap;
+ p->Interrupt = procInterrupt;
+ p->WriteNumString = (DPSWriteNumStringProc) procWriteNumstring;
+}
+
+void DPSInitCommonSpaceProcs(DPSSpaceProcs p)
+{
+ p->DestroySpace = procDestroySpace;
+}
+
+void DPSSetNumStringConversion(ctxt, flag)
+ DPSContext ctxt;
+ int flag;
+{
+ if (flag) ctxt->contextFlags |= DPS_FLAG_CONVERT_NUMSTRINGS;
+ else ctxt->contextFlags &= ~DPS_FLAG_CONVERT_NUMSTRINGS;
+}
+
+void DPSSetWrapSynchronization(ctxt, flag)
+ DPSContext ctxt;
+ int flag;
+{
+ if (flag) ctxt->contextFlags |= DPS_FLAG_SYNC;
+ else ctxt->contextFlags &= ~DPS_FLAG_SYNC;
+}
+
+void DPSSuppressBinaryConversion(ctxt, flag)
+ DPSContext ctxt;
+ int flag;
+{
+ if (flag) ctxt->contextFlags |= DPS_FLAG_NO_BINARY_CONVERSION;
+ else ctxt->contextFlags &= ~DPS_FLAG_NO_BINARY_CONVERSION;
+}
+
+void DPSSetAbbrevMode(ctxt, flag)
+ DPSContext ctxt;
+ int flag;
+{
+ if (flag) ctxt->contextFlags |= DPS_FLAG_USE_ABBREVS;
+ else ctxt->contextFlags &= ~DPS_FLAG_USE_ABBREVS;
+}
+
+DPSContextExtensionRec *DPSGetContextExtensionRec(ctxt, extensionId)
+ DPSContext ctxt;
+ int extensionId;
+{
+ DPSContextExtensionRec *r = ctxt->extension;
+
+ while (r != NULL && r->extensionId != extensionId) r = r->next;
+ return r;
+}
+
+void DPSAddContextExtensionRec(ctxt, rec)
+ DPSContext ctxt;
+ DPSContextExtensionRec *rec;
+{
+ rec->next = ctxt->extension;
+ ctxt->extension = rec;
+}
+
+DPSContextExtensionRec *DPSRemoveContextExtensionRec(ctxt, extensionId)
+ DPSContext ctxt;
+ int extensionId;
+{
+ DPSContextExtensionRec *rret, **r = &ctxt->extension;
+
+
+ while (*r != NULL && (*r)->extensionId != extensionId) {
+ r = &(*r)->next;
+ }
+ rret = *r;
+ if (*r != NULL) *r = (*r)->next;
+ return rret;
+}
+
+int DPSGenerateExtensionRecID(void)
+{
+ static int id = 1;
+
+ return id++;
+}
+
+DPSContextType DPSGetContextType(ctxt)
+ DPSContext ctxt;
+{
+ DPSPrivContext c = (DPSPrivContext) ctxt;
+
+ if (c->procs == textCtxProcs) return dps_context_text;
+ else return dps_context_execution;
+}
diff --git a/nx-X11/lib/dps/dpsclrops.psw b/nx-X11/lib/dps/dpsclrops.psw
new file mode 100644
index 000000000..f8ec18269
--- /dev/null
+++ b/nx-X11/lib/dps/dpsclrops.psw
@@ -0,0 +1,81 @@
+/* dpsclrops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPScolorimage(DPSContext ctxt)
+ colorimage
+endps
+
+defineps DPScurrentblackgeneration(DPSContext ctxt)
+ currentblackgeneration
+endps
+
+defineps DPScurrentcmykcolor(DPSContext ctxt | float *c, *m, *y, *k)
+ currentcmykcolor k y m c
+endps
+
+defineps DPScurrentcolorscreen(DPSContext ctxt)
+ currentcolorscreen
+endps
+
+defineps DPScurrentcolortransfer(DPSContext ctxt)
+ currentcolortransfer
+endps
+
+defineps DPScurrentundercolorremoval(DPSContext ctxt)
+ currentundercolorremoval
+endps
+
+defineps DPSsetblackgeneration(DPSContext ctxt)
+ setblackgeneration
+endps
+
+defineps DPSsetcmykcolor(DPSContext ctxt; float c, m, y, k)
+ c m y k setcmykcolor
+endps
+
+defineps DPSsetcolorscreen(DPSContext ctxt)
+ setcolorscreen
+endps
+
+defineps DPSsetcolortransfer(DPSContext ctxt)
+ setcolortransfer
+endps
+
+defineps DPSsetundercolorremoval(DPSContext ctxt)
+ setundercolorremoval
+endps
+
diff --git a/nx-X11/lib/dps/dpsctrlops.psw b/nx-X11/lib/dps/dpsctrlops.psw
new file mode 100644
index 000000000..d00707d4c
--- /dev/null
+++ b/nx-X11/lib/dps/dpsctrlops.psw
@@ -0,0 +1,114 @@
+/*
+ * dpsctrlops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSeq(DPSContext ctxt)
+ eq
+endps
+
+defineps DPSexit(DPSContext ctxt)
+ exit
+endps
+
+defineps DPSfalse(DPSContext ctxt)
+ false
+endps
+
+defineps DPSfor(DPSContext ctxt)
+ for
+endps
+
+defineps DPSforall(DPSContext ctxt)
+ forall
+endps
+
+defineps DPSge(DPSContext ctxt)
+ ge
+endps
+
+defineps DPSgt(DPSContext ctxt)
+ gt
+endps
+
+defineps DPSif(DPSContext ctxt)
+ if
+endps
+
+defineps DPSifelse(DPSContext ctxt)
+ ifelse
+endps
+
+defineps DPSle(DPSContext ctxt)
+ le
+endps
+
+defineps DPSloop(DPSContext ctxt)
+ loop
+endps
+
+defineps DPSlt(DPSContext ctxt)
+ lt
+endps
+
+defineps DPSne(DPSContext ctxt)
+ ne
+endps
+
+defineps DPSnot(DPSContext ctxt)
+ not
+endps
+
+defineps DPSor(DPSContext ctxt)
+ or
+endps
+
+defineps DPSrepeat(DPSContext ctxt)
+ repeat
+endps
+
+defineps DPSstop(DPSContext ctxt)
+ stop
+endps
+
+defineps DPSstopped(DPSContext ctxt)
+ stopped
+endps
+
+defineps DPStrue(DPSContext ctxt)
+ true
+endps
+
diff --git a/nx-X11/lib/dps/dpsctxtops.psw b/nx-X11/lib/dps/dpsctxtops.psw
new file mode 100644
index 000000000..00f6f8f18
--- /dev/null
+++ b/nx-X11/lib/dps/dpsctxtops.psw
@@ -0,0 +1,110 @@
+/*
+ * dpsctxtops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSUserObjects(DPSContext ctxt)
+ UserObjects
+endps
+
+defineps DPScondition(DPSContext ctxt)
+ condition
+endps
+
+defineps DPScurrentcontext(DPSContext ctxt | int *cid)
+ currentcontext cid
+endps
+
+defineps DPScurrentobjectformat(DPSContext ctxt | int *code)
+ currentobjectformat code
+endps
+
+defineps DPSdefineusername(DPSContext ctxt; int i; char *username)
+ i /username defineusername
+endps
+
+defineps DPSdefineuserobject(DPSContext ctxt)
+ defineuserobject
+endps
+
+defineps DPSdetach(DPSContext ctxt)
+ detach
+endps
+
+defineps DPSexecuserobject(DPSContext ctxt; int userObjIndex)
+ userObjIndex execuserobject
+endps
+
+defineps DPSfork(DPSContext ctxt)
+ fork
+endps
+
+defineps DPSjoin(DPSContext ctxt)
+ join
+endps
+
+defineps DPSlock(DPSContext ctxt)
+ lock
+endps
+
+defineps DPSmonitor(DPSContext ctxt)
+ monitor
+endps
+
+defineps DPSnotify(DPSContext ctxt)
+ notify
+endps
+
+defineps DPSsetobjectformat(DPSContext ctxt; int code)
+ code setobjectformat
+endps
+
+defineps DPSsetvmthreshold(DPSContext ctxt; int i)
+ i setvmthreshold
+endps
+
+defineps DPSundefineuserobject(DPSContext ctxt; int userObjIndex)
+ userObjIndex undefineuserobject
+endps
+
+defineps DPSwait(DPSContext ctxt)
+ wait
+endps
+
+defineps DPSyield(DPSContext ctxt)
+ yield
+endps
+
diff --git a/nx-X11/lib/dps/dpsdataops.psw b/nx-X11/lib/dps/dpsdataops.psw
new file mode 100644
index 000000000..c38893678
--- /dev/null
+++ b/nx-X11/lib/dps/dpsdataops.psw
@@ -0,0 +1,258 @@
+/*
+ * dpsdataops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSaload(DPSContext ctxt)
+ aload
+endps
+
+defineps DPSanchorsearch(DPSContext ctxt| boolean *truth)
+ anchorsearch truth
+endps
+
+defineps DPSarray(DPSContext ctxt; int len)
+ len array
+endps
+
+defineps DPSastore(DPSContext ctxt)
+ astore
+endps
+
+defineps DPSbegin(DPSContext ctxt)
+ begin
+endps
+
+defineps DPSclear(DPSContext ctxt)
+ clear
+endps
+
+defineps DPScleartomark(DPSContext ctxt)
+ cleartomark
+endps
+
+defineps DPScopy(DPSContext ctxt; int n)
+ n copy
+endps
+
+defineps DPScount(DPSContext ctxt | int *n)
+ count n
+endps
+
+defineps DPScounttomark(DPSContext ctxt | int *n)
+ counttomark n
+endps
+
+defineps DPScvi(DPSContext ctxt)
+ cvi
+endps
+
+defineps DPScvlit(DPSContext ctxt)
+ cvlit
+endps
+
+defineps DPScvn(DPSContext ctxt)
+ cvn
+endps
+
+defineps DPScvr(DPSContext ctxt)
+ cvr
+endps
+
+defineps DPScvrs(DPSContext ctxt)
+ cvrs
+endps
+
+defineps DPScvs(DPSContext ctxt)
+ cvs
+endps
+
+defineps DPScvx(DPSContext ctxt)
+ cvx
+endps
+
+defineps DPSdef(DPSContext ctxt)
+ def
+endps
+
+defineps DPSdict(DPSContext ctxt; int len)
+ len dict
+endps
+
+defineps DPSdictstack(DPSContext ctxt)
+ dictstack
+endps
+
+defineps DPSdup(DPSContext ctxt)
+ dup
+endps
+
+defineps DPSend(DPSContext ctxt)
+ end
+endps
+
+defineps DPSexch(DPSContext ctxt)
+ exch
+endps
+
+defineps DPSexecstack(DPSContext ctxt)
+ execstack
+endps
+
+defineps DPSexecuteonly(DPSContext ctxt)
+ executeonly
+endps
+
+defineps DPSget(DPSContext ctxt)
+ get
+endps
+
+defineps DPSgetinterval(DPSContext ctxt)
+ getinterval
+endps
+
+defineps DPSindex(DPSContext ctxt; int i)
+ i index
+endps
+
+defineps DPSknown(DPSContext ctxt | boolean *b)
+ known b
+endps
+
+defineps DPSlength(DPSContext ctxt | int *len)
+ length len
+endps
+
+defineps DPSload(DPSContext ctxt)
+ load
+endps
+
+defineps DPSmark(DPSContext ctxt)
+ mark
+endps
+
+defineps DPSmatrix(DPSContext ctxt)
+ matrix
+endps
+
+defineps DPSmaxlength(DPSContext ctxt | int *len)
+ maxlength len
+endps
+
+defineps DPSnoaccess(DPSContext ctxt)
+ noaccess
+endps
+
+defineps DPSnull(DPSContext ctxt)
+ null
+endps
+
+defineps DPSpackedarray(DPSContext ctxt)
+ packedarray
+endps
+
+defineps DPSpop(DPSContext ctxt)
+ pop
+endps
+
+defineps DPSput(DPSContext ctxt)
+ put
+endps
+
+defineps DPSputinterval(DPSContext ctxt)
+ putinterval
+endps
+
+defineps DPSrcheck(DPSContext ctxt | boolean *b)
+ rcheck b
+endps
+
+defineps DPSreadonly(DPSContext ctxt)
+ readonly
+endps
+
+defineps DPSroll(DPSContext ctxt; int n, j)
+ n j roll
+endps
+
+defineps DPSscheck(DPSContext ctxt | boolean *b)
+ scheck b
+endps
+
+defineps DPSsearch(DPSContext ctxt| boolean *b)
+ search b
+endps
+
+defineps DPSshareddict(DPSContext ctxt)
+ shareddict
+endps
+
+defineps DPSstatusdict(DPSContext ctxt)
+ statusdict
+endps
+
+defineps DPSstore(DPSContext ctxt)
+ store
+endps
+
+defineps DPSstring(DPSContext ctxt; int len)
+ len string
+endps
+
+defineps DPSstringwidth(DPSContext ctxt; char *s | float *xp, *yp)
+ (s) stringwidth yp xp
+endps
+
+defineps DPSsystemdict(DPSContext ctxt)
+ systemdict
+endps
+
+defineps DPSuserdict(DPSContext ctxt)
+ userdict
+endps
+
+defineps DPSwcheck(DPSContext ctxt | boolean *b)
+ wcheck b
+endps
+
+defineps DPSwhere(DPSContext ctxt| boolean *b)
+ where b
+endps
+
+defineps DPSxcheck(DPSContext ctxt | boolean *b)
+ xcheck b
+endps
+
diff --git a/nx-X11/lib/dps/dpsdict.c b/nx-X11/lib/dps/dpsdict.c
new file mode 100644
index 000000000..b2e8a04b2
--- /dev/null
+++ b/nx-X11/lib/dps/dpsdict.c
@@ -0,0 +1,189 @@
+/*
+ * dpsdict.c
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86$ */
+
+/***********/
+/* Imports */
+/***********/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "dpsint.h"
+
+/********************/
+/* Types */
+/********************/
+
+typedef struct _EntryRec {
+ struct _EntryRec *next;
+ char *name;
+ PSWDictValue value;
+ } EntryRec, *Entry;
+
+ /* The concrete definition for a dictionary */
+ typedef struct _PSWDictRec {
+ integer nEntries;
+ Entry *entries;
+ } PSWDictRec;
+
+static PSWDict atoms;
+
+/**************************/
+/* Procedure Declarations */
+/**************************/
+
+/* Creates and returns a new dictionary. nEntries is a hint. */
+PSWDict DPSCreatePSWDict(integer nEntries)
+{
+ PSWDict d = (PSWDict)DPScalloc(sizeof(PSWDictRec), 1);
+ d->nEntries = nEntries;
+ d->entries = (Entry *)DPScalloc(sizeof(EntryRec), d->nEntries);
+ return d;
+}
+
+/* Destroys a dictionary */
+void DPSDestroyPSWDict(PSWDict dict)
+{
+ integer links = dict->nEntries;
+ Entry next;
+ Entry prev;
+
+ while (links > 0)
+ {
+ next = (dict->entries)[links];
+ while (next != NIL)
+ {
+ prev = next;
+ next = next->next;
+ free (prev);
+ }
+ links--;
+ }
+ free(dict->entries);
+ free(dict);
+}
+
+static integer Hash(char *name, integer nEntries)
+{
+ register integer val = 0;
+ while (*name) val += *name++;
+ if (val < 0) val = -val;
+ return (val % nEntries);
+}
+
+static Entry Probe(PSWDict d, integer x, char *name)
+{
+ register Entry e;
+ for (e = (d->entries)[x]; e != NIL; e = e->next) {
+ if (strcmp(name, e->name) == 0) break;
+ }
+ return e;
+}
+
+static Entry PrevProbe(Entry *prev, PSWDict d, integer x, char *name)
+{
+ register Entry e;
+ *prev = NIL;
+ for (e = (d->entries)[x]; e != NIL; e = e->next) {
+ if (strcmp(name, e->name) == 0) break;
+ *prev = e;
+ }
+ return e;
+}
+
+/* -1 => not found */
+PSWDictValue DPSWDictLookup(PSWDict dict, char *name)
+{
+ Entry e;
+ e = Probe(dict, Hash(name, dict->nEntries), name);
+ if (e == NIL) return -1;
+ return e->value;
+}
+
+/* 0 => normal return (not found)
+ -1 => found. If found, value is replaced. */
+PSWDictValue DPSWDictEnter(PSWDict dict, char *name, PSWDictValue value)
+{
+ Entry e;
+ integer x = Hash(name, dict->nEntries);
+ e = Probe(dict, x, name);
+ if (e != NIL) {
+ e->value = value;
+ return -1;
+ }
+ e = (Entry)DPScalloc(sizeof(EntryRec), 1);
+ e->next = (dict->entries)[x]; (dict->entries)[x] = e;
+ e->value = value;
+ e->name = name; /* MakeAtom(name); */
+ return 0;
+}
+
+/* -1 => not found. If found, value is returned. */
+PSWDictValue DPSWDictRemove(PSWDict dict, char *name)
+{
+ Entry e, prev;
+ PSWDictValue value;
+ integer x = Hash(name, dict->nEntries);
+
+ e = PrevProbe(&prev, dict, x, name);
+ if (e == NIL) return -1;
+ value = e->value;
+ if (prev == NIL) (dict->entries)[x] = e->next; else prev->next = e->next;
+ free(e);
+ return value;
+}
+
+Atom DPSMakeAtom(char *name)
+{
+ Entry e;
+ integer x = Hash(name, 511);
+ char *newname;
+
+ if (atoms == NIL) atoms = DPSCreatePSWDict(511);
+ e = Probe(atoms, x, name);
+ if (e == NIL) {
+ e = (Entry)DPScalloc(sizeof(EntryRec), 1);
+ e->next = (atoms->entries)[x]; (atoms->entries)[x] = e;
+ e->value = 0;
+ newname = (char *)DPScalloc(strlen(name)+1, 1);
+ strcpy(newname, name);
+ e->name = newname;
+ }
+ return (Atom) e->name;
+}
diff --git a/nx-X11/lib/dps/dpsdict.h b/nx-X11/lib/dps/dpsdict.h
new file mode 100644
index 000000000..18b40d42b
--- /dev/null
+++ b/nx-X11/lib/dps/dpsdict.h
@@ -0,0 +1,78 @@
+/*
+ * dpsdict.h
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef PSWDICT_H
+#define PSWDICT_H
+
+#include <X11/X.h>
+
+#include "publictypes.h"
+
+typedef struct _PSWDictRec *PSWDict;
+/* Opaque designator for a dictionary */
+
+typedef int PSWDictValue; /* non-negative */
+
+/* PROCEDURES */
+
+/* The name parameters defined below are NULL-terminated C strings.
+ None of the name parameters are handed off, i.e. the caller is
+ responsible for managing their storage. */
+
+extern PSWDict DPSCreatePSWDict(integer /* nEntries */);
+/* nEntries is a hint. Creates and returns a new dictionary */
+
+extern void DPSDestroyPSWDict(PSWDict /* dict */);
+/* Destroys a dictionary */
+
+extern PSWDictValue DPSWDictLookup(PSWDict /* dict */, char * /* name */);
+/* -1 => not found. */
+
+extern PSWDictValue DPSWDictEnter
+ (PSWDict /* dict */, char * /* name */, PSWDictValue /* value */);
+/* 0 => normal return (not found)
+ -1 => found. If found, the old value gets replaced with the new one.
+ caller must ensure continuing validity of name. */
+
+extern PSWDictValue DPSWDictRemove(PSWDict /* dict */, char * /* name */);
+/* -1 => not found. If found, value is returned. */
+
+extern Atom DPSMakeAtom(char * /* name */);
+/* name characters are copied. */
+
+#endif /* PSWDICT_H */
diff --git a/nx-X11/lib/dps/dpsendif.txt b/nx-X11/lib/dps/dpsendif.txt
new file mode 100644
index 000000000..80dd08085
--- /dev/null
+++ b/nx-X11/lib/dps/dpsendif.txt
@@ -0,0 +1,5 @@
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* DPSOPS_H */
diff --git a/nx-X11/lib/dps/dpsexcept.c b/nx-X11/lib/dps/dpsexcept.c
new file mode 100644
index 000000000..cd404dd86
--- /dev/null
+++ b/nx-X11/lib/dps/dpsexcept.c
@@ -0,0 +1,73 @@
+/*
+ * dpsexcept.c
+ *
+ * (c) Copyright 1984-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86: $ */
+
+/*
+Original version: Jeffrey Mogul, Stanford, 18 February 1983
+*/
+
+#ifdef VMS
+/* Add publictype.h to get a lowercase definition of "false" */
+#include "publictypes.h"
+#endif /* VMS */
+
+#include "DPS/dpsexcept.h"
+
+_Exc_Buf *_Exc_Header;
+
+
+
+void DPSRaise(code, msg)
+ int code; char *msg; {
+ register _Exc_Buf *EBp = _Exc_Header;
+
+ if (EBp == 0) { /* uncaught exception */
+ DPSCantHappen();
+ }
+
+ EBp->Code = code;
+ EBp->Message = msg;
+ _Exc_Header = EBp->Prev;
+ longjmp(EBp->Environ, 1);
+ }
+
+#ifndef XDPS
+void DPSCantHappen() {
+ abort();
+ }
+#endif /* XDPS */
diff --git a/nx-X11/lib/dps/dpsfontops.psw b/nx-X11/lib/dps/dpsfontops.psw
new file mode 100644
index 000000000..9958e776a
--- /dev/null
+++ b/nx-X11/lib/dps/dpsfontops.psw
@@ -0,0 +1,109 @@
+/* dpsfontops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSFontDirectory(DPSContext ctxt)
+ FontDirectory
+endps
+
+defineps DPSISOLatin1Encoding(DPSContext ctxt)
+ ISOLatin1Encoding
+endps
+
+defineps DPSSharedFontDirectory(DPSContext ctxt)
+ SharedFontDirectory
+endps
+
+defineps DPSStandardEncoding(DPSContext ctxt)
+ StandardEncoding
+endps
+
+defineps DPScachestatus(DPSContext ctxt)
+ cachestatus
+endps
+
+defineps DPScurrentcacheparams(DPSContext ctxt)
+ currentcacheparams
+endps
+
+defineps DPScurrentfont(DPSContext ctxt)
+ currentfont
+endps
+
+defineps DPSdefinefont(DPSContext ctxt)
+ definefont
+endps
+
+defineps DPSfindfont(DPSContext ctxt; char *name)
+ /name findfont
+endps
+
+defineps DPSmakefont(DPSContext ctxt)
+ makefont
+endps
+
+defineps DPSscalefont(DPSContext ctxt; float size)
+ size scalefont
+endps
+
+defineps DPSselectfont(DPSContext ctxt; char *name; float scale)
+ /name scale selectfont
+endps
+
+defineps DPSsetcachedevice(DPSContext ctxt; float wx, wy, llx, lly, urx, ury)
+ wx wy llx lly urx ury setcachedevice
+endps
+
+defineps DPSsetcachelimit(DPSContext ctxt; int n)
+ n setcachelimit
+endps
+
+defineps DPSsetcacheparams(DPSContext ctxt)
+ setcacheparams
+endps
+
+defineps DPSsetcharwidth(DPSContext ctxt; float wx, wy)
+ wx wy setcharwidth
+endps
+
+defineps DPSsetfont(DPSContext ctxt; userobject f)
+ f setfont
+endps
+
+defineps DPSundefinefont(DPSContext ctxt; char *name)
+ /name undefinefont
+endps
+
diff --git a/nx-X11/lib/dps/dpsgsttops.psw b/nx-X11/lib/dps/dpsgsttops.psw
new file mode 100644
index 000000000..d9b2728e7
--- /dev/null
+++ b/nx-X11/lib/dps/dpsgsttops.psw
@@ -0,0 +1,213 @@
+/* dpsgsttops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSconcat(DPSContext ctxt; float m[6])
+ m concat
+endps
+
+defineps DPScurrentdash(DPSContext ctxt)
+ currentdash
+endps
+
+defineps DPScurrentflat(DPSContext ctxt | float *flatness)
+ currentflat flatness
+endps
+
+defineps DPScurrentgray(DPSContext ctxt | float *gray)
+ currentgray gray
+endps
+
+defineps DPScurrentgstate(DPSContext ctxt; userobject gst)
+ gst currentgstate
+endps
+
+defineps DPScurrenthalftone(DPSContext ctxt)
+ currenthalftone
+endps
+
+defineps DPScurrenthalftonephase(DPSContext ctxt | float *x, *y)
+ currenthalftonephase y x
+endps
+
+defineps DPScurrenthsbcolor(DPSContext ctxt | float *h, *s, *b)
+ currenthsbcolor b s h
+endps
+
+defineps DPScurrentlinecap(DPSContext ctxt | int *linecap)
+ currentlinecap linecap
+endps
+
+defineps DPScurrentlinejoin(DPSContext ctxt | int *linejoin)
+ currentlinejoin linejoin
+endps
+
+defineps DPScurrentlinewidth(DPSContext ctxt | float *width)
+ currentlinewidth width
+endps
+
+defineps DPScurrentmatrix(DPSContext ctxt)
+ currentmatrix
+endps
+
+defineps DPScurrentmiterlimit(DPSContext ctxt | float *limit)
+ currentmiterlimit limit
+endps
+
+defineps DPScurrentpoint(DPSContext ctxt | float *x, *y)
+ currentpoint y x
+endps
+
+defineps DPScurrentrgbcolor(DPSContext ctxt | float *r, *g, *b)
+ currentrgbcolor b g r
+endps
+
+defineps DPScurrentscreen(DPSContext ctxt)
+ currentscreen
+endps
+
+defineps DPScurrentstrokeadjust(DPSContext ctxt | boolean *b)
+ currentstrokeadjust b
+endps
+
+defineps DPScurrenttransfer(DPSContext ctxt)
+ currenttransfer
+endps
+
+defineps DPSdefaultmatrix(DPSContext ctxt)
+ defaultmatrix
+endps
+
+defineps DPSgrestore(DPSContext ctxt)
+ grestore
+endps
+
+defineps DPSgrestoreall(DPSContext ctxt)
+ grestoreall
+endps
+
+defineps DPSgsave(DPSContext ctxt)
+ gsave
+endps
+
+defineps DPSgstate(DPSContext ctxt)
+ gstate
+endps
+
+defineps DPSinitgraphics(DPSContext ctxt)
+ initgraphics
+endps
+
+defineps DPSinitmatrix(DPSContext ctxt)
+ initmatrix
+endps
+
+defineps DPSrotate(DPSContext ctxt; float angle)
+ angle rotate
+endps
+
+defineps DPSscale(DPSContext ctxt; float x, y)
+ x y scale
+endps
+
+defineps DPSsetdash(DPSContext ctxt; float pat[size]; int size; float offset)
+ pat offset setdash
+endps
+
+defineps DPSsetflat(DPSContext ctxt; float flatness)
+ flatness setflat
+endps
+
+defineps DPSsetgray(DPSContext ctxt; float gray)
+ gray setgray
+endps
+
+defineps DPSsetgstate(DPSContext ctxt; userobject gst)
+ gst setgstate
+endps
+
+defineps DPSsethalftone(DPSContext ctxt)
+ sethalftone
+endps
+
+defineps DPSsethalftonephase(DPSContext ctxt; float x, y)
+ x y sethalftonephase
+endps
+
+defineps DPSsethsbcolor(DPSContext ctxt; float h, s, b)
+ h s b sethsbcolor
+endps
+
+defineps DPSsetlinecap(DPSContext ctxt; int linecap)
+ linecap setlinecap
+endps
+
+defineps DPSsetlinejoin(DPSContext ctxt; int linejoin)
+ linejoin setlinejoin
+endps
+
+defineps DPSsetlinewidth(DPSContext ctxt; float width)
+ width setlinewidth
+endps
+
+defineps DPSsetmatrix(DPSContext ctxt)
+ setmatrix
+endps
+
+defineps DPSsetmiterlimit(DPSContext ctxt; float limit)
+ limit setmiterlimit
+endps
+
+defineps DPSsetrgbcolor(DPSContext ctxt; float r, g, b)
+ r g b setrgbcolor
+endps
+
+defineps DPSsetscreen(DPSContext ctxt)
+ setscreen
+endps
+
+defineps DPSsetstrokeadjust(DPSContext ctxt; boolean b)
+ b setstrokeadjust
+endps
+
+defineps DPSsettransfer(DPSContext ctxt)
+ settransfer
+endps
+
+defineps DPStranslate(DPSContext ctxt; float x, y)
+ x y translate
+endps
+
diff --git a/nx-X11/lib/dps/dpsifdef.txt b/nx-X11/lib/dps/dpsifdef.txt
new file mode 100644
index 000000000..d44b7c85f
--- /dev/null
+++ b/nx-X11/lib/dps/dpsifdef.txt
@@ -0,0 +1,7 @@
+#ifndef DPSOPS_H
+#define DPSOPS_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
diff --git a/nx-X11/lib/dps/dpsint.h b/nx-X11/lib/dps/dpsint.h
new file mode 100644
index 000000000..8d5ede870
--- /dev/null
+++ b/nx-X11/lib/dps/dpsint.h
@@ -0,0 +1,125 @@
+/*
+ * dpsint.h -- internal definitions to dpsclient.c
+ *
+ * (c) Copyright 1989-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef DPSINT_H
+#define DPSINT_H
+
+#include <DPS/dpsXclient.h>
+
+#include "publictypes.h"
+#include "dpsassert.h"
+
+#include "dpsprivate.h"
+#include "dpsXint.h"
+#include "dpsdict.h"
+
+typedef struct _t_ContextBufferRec {
+ struct _t_ContextBufferRec *next;
+ } ContextBufferRec, *ContextBuffer;
+
+typedef struct {
+ ContextBuffer gcontextBuffers;
+ integer gqueuedBuffers;
+ DPSProcs gctxProcs, gtextCtxProcs, gdummyCtxProcs;
+ DPSSpaceProcs gspaceProcs;
+ DPSPrivSpace gspaces;
+ char **guserNames;
+ integer guserNamesLength;
+ PSWDict guserNameDict;
+ boolean gclientStarted;
+ DPSContext gdummyCtx;
+ integer ginitFailed, gglobLastNameIndex;
+ DPSPrivSpace gTextSpace;
+} GlobalsRec, *Globals;
+
+extern Globals DPSglobals;
+
+#define contextBuffers DPSglobals->gcontextBuffers
+#define queuedBuffers DPSglobals->gqueuedBuffers
+#define ctxProcs DPSglobals->gctxProcs
+#define textCtxProcs DPSglobals->gtextCtxProcs
+#define dummyCtxProcs DPSglobals->gdummyCtxProcs
+#define spaceProcs DPSglobals->gspaceProcs
+#define spaces DPSglobals->gspaces
+#define userNames DPSglobals->guserNames
+#define userNamesLength DPSglobals->guserNamesLength
+#define userNameDict DPSglobals->guserNameDict
+#define clientStarted DPSglobals->gclientStarted
+#define dummyCtx DPSglobals->gdummyCtx
+#define initFailed DPSglobals->ginitFailed
+#define globLastNameIndex DPSglobals->gglobLastNameIndex
+#define textSpace DPSglobals->gTextSpace
+
+extern boolean DPSCheckShared(DPSPrivContext ctxt);
+extern boolean DPSKnownContext(DPSContext ctxt);
+extern boolean DPSKnownSpace(DPSSpace space);
+extern boolean DPSPrivateCheckWait(DPSContext ctxt);
+extern void DPSCheckInitClientGlobals(void);
+extern void DPSPrivateDestroyContext(DPSContext ctxt);
+extern void DPSPrivateDestroySpace(DPSSpace space);
+extern void DPSSafeSetLastNameIndex(DPSContext ctxt);
+extern void DPSclientPrintProc(DPSContext ctxt, char *buf, unsigned nch);
+extern void DPSinnerProcWriteData(DPSContext ctxt, char *buf, unsigned int count);
+
+extern void DPSDefaultPrivateHandler(
+ DPSContext ctxt,
+ DPSErrorCode errorCode,
+ long unsigned int arg1,
+ long unsigned int arg2,
+ char *prefix,
+ char *suffix);
+
+extern char *DPScalloc(integer e, integer n);
+
+extern DPSContext DPSCreateContext(
+ char *wh,
+ DPSTextProc textProc,
+ DPSErrorProc errorProc,
+ DPSSpace space);
+
+extern void DPSHandleBogusError(DPSContext ctxt, char *prefix, char *suffix);
+extern void DPSInitCommonContextProcs(DPSProcs p);
+extern void DPSInitCommonSpaceProcs(DPSSpaceProcs p);
+extern void DPSInitCommonTextContextProcs(DPSProcs p);
+extern void DPSInitPrivateContextFields(DPSPrivContext c, DPSPrivSpace s);
+extern void DPSInitPrivateContextProcs(DPSProcs p);
+extern void DPSInitPrivateSpaceFields(DPSPrivSpace s);
+extern void DPSInitPrivateTextContextFields(DPSPrivContext c, DPSPrivSpace s);
+extern void DPSServicePostScript(boolean (*returnControl)(void));
+
+#endif /* DPSINT_H */
diff --git a/nx-X11/lib/dps/dpsioops.psw b/nx-X11/lib/dps/dpsioops.psw
new file mode 100644
index 000000000..dec3bb7c3
--- /dev/null
+++ b/nx-X11/lib/dps/dpsioops.psw
@@ -0,0 +1,153 @@
+/* dpsioops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSequals(DPSContext ctxt)
+ =
+endps
+
+defineps DPSequalsequals(DPSContext ctxt)
+ ==
+endps
+
+defineps DPSbytesavailable(DPSContext ctxt | int *n)
+ bytesavailable n
+endps
+
+defineps DPSclosefile(DPSContext ctxt)
+ closefile
+endps
+
+defineps DPScurrentfile(DPSContext ctxt)
+ currentfile
+endps
+
+defineps DPSdeletefile(DPSContext ctxt; char *filename)
+ (filename) deletefile
+endps
+
+defineps DPSecho(DPSContext ctxt; boolean b)
+ b echo
+endps
+
+defineps DPSfile(DPSContext ctxt; char *name, *access)
+ (name) (access) file
+endps
+
+defineps DPSfilenameforall(DPSContext ctxt)
+ filenameforall
+endps
+
+defineps DPSfileposition(DPSContext ctxt | int *pos)
+ fileposition pos
+endps
+
+defineps DPSflush(DPSContext ctxt)
+ flush
+endps
+
+defineps DPSflushfile(DPSContext ctxt)
+ flushfile
+endps
+
+defineps DPSprint(DPSContext ctxt)
+ print
+endps
+
+defineps DPSprintobject(DPSContext ctxt; int tag)
+ tag printobject
+endps
+
+defineps DPSpstack(DPSContext ctxt)
+ pstack
+endps
+
+defineps DPSread(DPSContext ctxt| boolean *b)
+ read b
+endps
+
+defineps DPSreadhexstring(DPSContext ctxt| boolean *b)
+ readhexstring b
+endps
+
+defineps DPSreadline(DPSContext ctxt| boolean *b)
+ readline b
+endps
+
+defineps DPSreadstring(DPSContext ctxt| boolean *b)
+ readstring b
+endps
+
+defineps DPSrenamefile(DPSContext ctxt; char *oldname, *newname)
+ (oldname) (newname) renamefile
+endps
+
+defineps DPSresetfile(DPSContext ctxt)
+ resetfile
+endps
+
+defineps DPSsetfileposition(DPSContext ctxt; int pos)
+ pos setfileposition
+endps
+
+defineps DPSstack(DPSContext ctxt)
+ stack
+endps
+
+defineps DPSstatus(DPSContext ctxt | boolean *b)
+ status b
+endps
+
+defineps DPStoken(DPSContext ctxt| boolean *b)
+ token b
+endps
+
+defineps DPSwrite(DPSContext ctxt)
+ write
+endps
+
+defineps DPSwritehexstring(DPSContext ctxt)
+ writehexstring
+endps
+
+defineps DPSwriteobject(DPSContext ctxt; int tag)
+ tag writeobject
+endps
+
+defineps DPSwritestring(DPSContext ctxt)
+ writestring
+endps
+
diff --git a/nx-X11/lib/dps/dpsl2ops.psw b/nx-X11/lib/dps/dpsl2ops.psw
new file mode 100644
index 000000000..67c1aee22
--- /dev/null
+++ b/nx-X11/lib/dps/dpsl2ops.psw
@@ -0,0 +1,208 @@
+/* dpsl2ops.psw
+ * (c) Copyright 1991-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSleftbracket(DPSContext ctxt)
+ mark % [ annoys pswrap
+endps
+
+defineps DPSrightbracket(DPSContext ctxt)
+ counttomark array astore exch pop % ] annoys pswrap
+endps
+
+defineps DPSleftleft(DPSContext ctxt)
+ <<
+endps
+
+defineps DPSrightright(DPSContext ctxt)
+ >>
+endps
+
+defineps DPScshow(DPSContext ctxt; char *s)
+ (s) cshow
+endps
+
+defineps DPScurrentcolor(DPSContext ctxt)
+ currentcolor
+endps
+
+defineps DPScurrentcolorrendering(DPSContext ctxt)
+ currentcolorrendering
+endps
+
+defineps DPScurrentcolorspace(DPSContext ctxt)
+ currentcolorspace
+endps
+
+defineps DPScurrentdevparams(DPSContext ctxt; char *dev)
+ (dev) currentdevparams
+endps
+
+defineps DPScurrentglobal(DPSContext ctxt | boolean *b)
+ currentglobal b
+endps
+
+defineps DPScurrentoverprint(DPSContext ctxt | boolean *b)
+ currentoverprint b
+endps
+
+defineps DPScurrentpagedevice(DPSContext ctxt)
+ currentpagedevice
+endps
+
+defineps DPScurrentsystemparams(DPSContext ctxt)
+ currentsystemparams
+endps
+
+defineps DPScurrentuserparams(DPSContext ctxt)
+ currentuserparams
+endps
+
+defineps DPSdefineresource(DPSContext ctxt; char *category)
+ /category defineresource
+endps
+
+defineps DPSexecform(DPSContext ctxt)
+ execform
+endps
+
+defineps DPSfilter(DPSContext ctxt)
+ filter
+endps
+
+defineps DPSfindencoding(DPSContext ctxt; char *key)
+ /key findencoding
+endps
+
+defineps DPSfindresource(DPSContext ctxt; char *key, *category)
+ /key /category findresource
+endps
+
+defineps DPSgcheck(DPSContext ctxt | boolean *b)
+ gcheck b
+endps
+
+defineps DPSglobaldict(DPSContext ctxt)
+ globaldict
+endps
+
+defineps DPSGlobalFontDirectory(DPSContext ctxt)
+ GlobalFontDirectory
+endps
+
+defineps DPSglyphshow(DPSContext ctxt; char *name)
+ /name glyphshow
+endps
+
+defineps DPSlanguagelevel(DPSContext ctxt | int *n)
+ languagelevel n
+endps
+
+defineps DPSmakepattern(DPSContext ctxt)
+ makepattern
+endps
+
+defineps DPSproduct(DPSContext ctxt)
+ product
+endps
+
+defineps DPSresourceforall(DPSContext ctxt; char *category)
+ /category resourceforall
+endps
+
+defineps DPSresourcestatus(DPSContext ctxt; char *key, *category; | boolean *b)
+ /key /category resourcestatus b
+endps
+
+defineps DPSrevision(DPSContext ctxt | int *n)
+ revision n
+endps
+
+defineps DPSrootfont(DPSContext ctxt)
+ rootfont
+endps
+
+defineps DPSserialnumber(DPSContext ctxt | int *n)
+ serialnumber n
+endps
+
+defineps DPSsetcolor(DPSContext ctxt)
+ setcolor
+endps
+
+defineps DPSsetcolorrendering(DPSContext ctxt)
+ setcolorrendering
+endps
+
+defineps DPSsetcolorspace(DPSContext ctxt)
+ setcolorspace
+endps
+
+defineps DPSsetdevparams(DPSContext ctxt)
+ setdevparams
+endps
+
+defineps DPSsetglobal(DPSContext ctxt; boolean b)
+ b setglobal
+endps
+
+defineps DPSsetoverprint(DPSContext ctxt; boolean b)
+ b setoverprint
+endps
+
+defineps DPSsetpagedevice(DPSContext ctxt)
+ setpagedevice
+endps
+
+defineps DPSsetpattern(DPSContext ctxt)
+ setpattern
+endps
+
+defineps DPSsetsystemparams(DPSContext ctxt)
+ setsystemparams
+endps
+
+defineps DPSsetuserparams(DPSContext ctxt)
+ setuserparams
+endps
+
+defineps DPSstartjob(DPSContext ctxt; boolean b; char *password)
+ b password startjob
+endps
+
+defineps DPSundefineresource(DPSContext ctxt; char *key, *category)
+ /key /category undefineresource
+endps
+
diff --git a/nx-X11/lib/dps/dpsmathops.psw b/nx-X11/lib/dps/dpsmathops.psw
new file mode 100644
index 000000000..e7ada11af
--- /dev/null
+++ b/nx-X11/lib/dps/dpsmathops.psw
@@ -0,0 +1,125 @@
+/* dpsmathops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSabs(DPSContext ctxt)
+ abs
+endps
+
+defineps DPSadd(DPSContext ctxt)
+ add
+endps
+
+defineps DPSand(DPSContext ctxt)
+ and
+endps
+
+defineps DPSatan(DPSContext ctxt)
+ atan
+endps
+
+defineps DPSbitshift(DPSContext ctxt; int shift)
+ shift bitshift
+endps
+
+defineps DPSceiling(DPSContext ctxt)
+ ceiling
+endps
+
+defineps DPScos(DPSContext ctxt)
+ cos
+endps
+
+defineps DPSdiv(DPSContext ctxt)
+ div
+endps
+
+defineps DPSexp(DPSContext ctxt)
+ exp
+endps
+
+defineps DPSfloor(DPSContext ctxt)
+ floor
+endps
+
+defineps DPSidiv(DPSContext ctxt)
+ idiv
+endps
+
+defineps DPSln(DPSContext ctxt)
+ ln
+endps
+
+defineps DPSlog(DPSContext ctxt)
+ log
+endps
+
+defineps DPSmod(DPSContext ctxt)
+ mod
+endps
+
+defineps DPSmul(DPSContext ctxt)
+ mul
+endps
+
+defineps DPSneg(DPSContext ctxt)
+ neg
+endps
+
+defineps DPSround(DPSContext ctxt)
+ round
+endps
+
+defineps DPSsin(DPSContext ctxt)
+ sin
+endps
+
+defineps DPSsqrt(DPSContext ctxt)
+ sqrt
+endps
+
+defineps DPSsub(DPSContext ctxt)
+ sub
+endps
+
+defineps DPStruncate(DPSContext ctxt)
+ truncate
+endps
+
+defineps DPSxor(DPSContext ctxt)
+ xor
+endps
+
diff --git a/nx-X11/lib/dps/dpsmiscops.psw b/nx-X11/lib/dps/dpsmiscops.psw
new file mode 100644
index 000000000..6b5bb8078
--- /dev/null
+++ b/nx-X11/lib/dps/dpsmiscops.psw
@@ -0,0 +1,53 @@
+/* dpsmiscops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSbanddevice(DPSContext ctxt)
+ banddevice
+endps
+
+defineps DPSframedevice(DPSContext ctxt)
+ framedevice
+endps
+
+defineps DPSnulldevice(DPSContext ctxt)
+ nulldevice
+endps
+
+defineps DPSrenderbands(DPSContext ctxt)
+ renderbands
+endps
+
diff --git a/nx-X11/lib/dps/dpsmtrxops.psw b/nx-X11/lib/dps/dpsmtrxops.psw
new file mode 100644
index 000000000..6b5303ba0
--- /dev/null
+++ b/nx-X11/lib/dps/dpsmtrxops.psw
@@ -0,0 +1,65 @@
+/* dpsmtrxops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSconcatmatrix(DPSContext ctxt)
+ concatmatrix
+endps
+
+defineps DPSdtransform(DPSContext ctxt; float x1, y1 | float *x2, *y2)
+ x1 y1 dtransform y2 x2
+endps
+
+defineps DPSidentmatrix(DPSContext ctxt)
+ identmatrix
+endps
+
+defineps DPSidtransform(DPSContext ctxt; float x1, y1 | float *x2, *y2)
+ x1 y1 idtransform y2 x2
+endps
+
+defineps DPSinvertmatrix(DPSContext ctxt)
+ invertmatrix
+endps
+
+defineps DPSitransform(DPSContext ctxt; float x1, y1 | float *x2, *y2)
+ x1 y1 itransform y2 x2
+endps
+
+defineps DPStransform(DPSContext ctxt; float x1, y1 | float *x2, *y2)
+ x1 y1 transform y2 x2
+endps
+
diff --git a/nx-X11/lib/dps/dpsname.txt b/nx-X11/lib/dps/dpsname.txt
new file mode 100644
index 000000000..ab32b7f7d
--- /dev/null
+++ b/nx-X11/lib/dps/dpsname.txt
@@ -0,0 +1,4 @@
+/*
+ * dpsops.h
+ */
+
diff --git a/nx-X11/lib/dps/dpsopstack.psw b/nx-X11/lib/dps/dpsopstack.psw
new file mode 100644
index 000000000..ac10d77c5
--- /dev/null
+++ b/nx-X11/lib/dps/dpsopstack.psw
@@ -0,0 +1,96 @@
+/*
+ * dpsopstack.psw -- wrapped procedures for sending and getting operands
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSgetboolean(DPSContext ctxt | boolean *it)
+ it
+endps
+
+defineps DPSgetchararray(DPSContext ctxt; int size | char s[size])
+ s
+endps
+
+defineps DPSgetfloat(DPSContext ctxt | float *it)
+ it
+endps
+
+defineps DPSgetfloatarray(DPSContext ctxt; int size | float a[size])
+ dup type /arraytype eq { a } { size { a } repeat } ifelse
+endps
+
+defineps DPSgetint(DPSContext ctxt | int *it)
+ it
+endps
+
+defineps DPSgetintarray(DPSContext ctxt; int size | int a[size])
+ dup type /arraytype eq { a } { size { a } repeat } ifelse
+endps
+
+defineps DPSgetstring(DPSContext ctxt | char *s)
+ s
+endps
+
+defineps DPSsendboolean(DPSContext ctxt; boolean it)
+ it
+endps
+
+defineps DPSsendchararray(DPSContext ctxt; char s[size]; int size)
+ (s)
+endps
+
+defineps DPSsendfloat(DPSContext ctxt; float it)
+ it
+endps
+
+defineps DPSsendfloatarray(DPSContext ctxt; float a[size]; int size)
+ a
+endps
+
+defineps DPSsendint(DPSContext ctxt; int it)
+ it
+endps
+
+defineps DPSsendintarray(DPSContext ctxt; int a[size]; int size)
+ a
+endps
+
+defineps DPSsendstring(DPSContext ctxt; char *s)
+ (s)
+endps
+
+
+
diff --git a/nx-X11/lib/dps/dpspathops.psw b/nx-X11/lib/dps/dpspathops.psw
new file mode 100644
index 000000000..7c0ed7600
--- /dev/null
+++ b/nx-X11/lib/dps/dpspathops.psw
@@ -0,0 +1,169 @@
+/* dpspathops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSarc(DPSContext ctxt; float x, y, r, angle1, angle2)
+ x y r angle1 angle2 arc
+endps
+
+defineps DPSarcn(DPSContext ctxt; float x, y, r, angle1, angle2)
+ x y r angle1 angle2 arcn
+endps
+
+defineps DPSarct(DPSContext ctxt; float x1, y1, x2, y2, r)
+ x1 y1 x2 y2 r arct
+endps
+
+defineps DPSarcto(DPSContext ctxt; float x1, y1, x2, y2, r | float *xt1, *yt1, *xt2, *yt2)
+ x1 y1 x2 y2 r arcto yt2 xt2 yt1 xt1
+endps
+
+defineps DPScharpath(DPSContext ctxt; char *s; boolean b)
+ (s) b charpath
+endps
+
+defineps DPSclip(DPSContext ctxt)
+ clip
+endps
+
+defineps DPSclippath(DPSContext ctxt)
+ clippath
+endps
+
+defineps DPSclosepath(DPSContext ctxt)
+ closepath
+endps
+
+defineps DPScurveto(DPSContext ctxt; float x1, y1, x2, y2, x3, y3)
+ x1 y1 x2 y2 x3 y3 curveto
+endps
+
+defineps DPSeoclip(DPSContext ctxt)
+ eoclip
+endps
+
+defineps DPSeoviewclip(DPSContext ctxt)
+ eoviewclip
+endps
+
+defineps DPSflattenpath(DPSContext ctxt)
+ flattenpath
+endps
+
+defineps DPSinitclip(DPSContext ctxt)
+ initclip
+endps
+
+defineps DPSinitviewclip(DPSContext ctxt)
+ initviewclip
+endps
+
+defineps DPSlineto(DPSContext ctxt; float x, y)
+ x y lineto
+endps
+
+defineps DPSmoveto(DPSContext ctxt; float x, y)
+ x y moveto
+endps
+
+defineps DPSnewpath(DPSContext ctxt)
+ newpath
+endps
+
+defineps DPSpathbbox(DPSContext ctxt | float *llx, *lly, *urx, *ury)
+ pathbbox ury urx lly llx
+endps
+
+defineps DPSpathforall(DPSContext ctxt)
+ pathforall
+endps
+
+defineps DPSrcurveto(DPSContext ctxt; float x1, y1, x2, y2, x3, y3)
+ x1 y1 x2 y2 x3 y3 rcurveto
+endps
+
+defineps DPSrectclip(DPSContext ctxt; float x, y, w, h)
+ x y w h rectclip
+endps
+
+defineps DPSrectviewclip(DPSContext ctxt; float x, y, w, h)
+ x y w h rectviewclip
+endps
+
+defineps DPSreversepath(DPSContext ctxt)
+ reversepath
+endps
+
+defineps DPSrlineto(DPSContext ctxt; float x, y)
+ x y rlineto
+endps
+
+defineps DPSrmoveto(DPSContext ctxt; float x, y)
+ x y rmoveto
+endps
+
+defineps DPSsetbbox(DPSContext ctxt; float llx, lly, urx, ury)
+ llx lly urx ury setbbox
+endps
+
+defineps DPSsetucacheparams(DPSContext ctxt)
+ setucacheparams
+endps
+
+defineps DPSuappend(DPSContext ctxt; char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] uappend
+endps
+
+defineps DPSucache(DPSContext ctxt)
+ ucache
+endps
+
+defineps DPSucachestatus(DPSContext ctxt)
+ ucachestatus
+endps
+
+defineps DPSupath(DPSContext ctxt; boolean b)
+ b upath
+endps
+
+defineps DPSviewclip(DPSContext ctxt)
+ viewclip
+endps
+
+defineps DPSviewclippath(DPSContext ctxt)
+ viewclippath
+endps
+
diff --git a/nx-X11/lib/dps/dpspntops.psw b/nx-X11/lib/dps/dpspntops.psw
new file mode 100644
index 000000000..e57de4997
--- /dev/null
+++ b/nx-X11/lib/dps/dpspntops.psw
@@ -0,0 +1,129 @@
+/* dpspntops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSashow(DPSContext ctxt; float x, y; char *s)
+ x y (s) ashow
+endps
+
+defineps DPSawidthshow(DPSContext ctxt; float cx, cy; int c; float ax, ay; char *s)
+ cx cy c ax ay (s) awidthshow
+endps
+
+defineps DPScopypage(DPSContext ctxt)
+ copypage
+endps
+
+defineps DPSeofill(DPSContext ctxt)
+ eofill
+endps
+
+defineps DPSerasepage(DPSContext ctxt)
+ erasepage
+endps
+
+defineps DPSfill(DPSContext ctxt)
+ fill
+endps
+
+defineps DPSimage(DPSContext ctxt)
+ image
+endps
+
+defineps DPSimagemask(DPSContext ctxt)
+ imagemask
+endps
+
+defineps DPSkshow(DPSContext ctxt; char *s)
+ (s) kshow
+endps
+
+defineps DPSrectfill(DPSContext ctxt; float x, y, w, h)
+ x y w h rectfill
+endps
+
+defineps DPSrectstroke(DPSContext ctxt; float x, y, w, h)
+ x y w h rectstroke
+endps
+
+defineps DPSshow(DPSContext ctxt; char *s)
+ (s) show
+endps
+
+defineps DPSshowpage(DPSContext ctxt)
+ showpage
+endps
+
+defineps DPSstroke(DPSContext ctxt)
+ stroke
+endps
+
+defineps DPSstrokepath(DPSContext ctxt)
+ strokepath
+endps
+
+defineps DPSueofill(DPSContext ctxt; char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] ueofill
+endps
+
+defineps DPSufill(DPSContext ctxt; char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] ufill
+endps
+
+defineps DPSustroke(DPSContext ctxt; char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] ustroke
+endps
+
+defineps DPSustrokepath(DPSContext ctxt; char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] ustrokepath
+endps
+
+defineps DPSwidthshow(DPSContext ctxt; float x, y; int c; char *s)
+ x y c (s) widthshow
+endps
+
+defineps DPSxshow(DPSContext ctxt; char *s; float numarray[size]; int size)
+ (s) numarray xshow
+endps
+
+defineps DPSxyshow(DPSContext ctxt; char *s; float numarray[size]; int size)
+ (s) numarray xyshow
+endps
+
+defineps DPSyshow(DPSContext ctxt; char *s; float numarray[size]; int size)
+ (s) numarray yshow
+endps
+
diff --git a/nx-X11/lib/dps/dpsprintf.c b/nx-X11/lib/dps/dpsprintf.c
new file mode 100644
index 000000000..79d8172b6
--- /dev/null
+++ b/nx-X11/lib/dps/dpsprintf.c
@@ -0,0 +1,68 @@
+/*
+ * dpsprintf.c
+ *
+ * (c) Copyright 1985-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86: xc/lib/dps/dpsprintf.c,v 1.3 2000/09/26 15:57:00 tsi Exp $ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include "publictypes.h"
+#include "DPS/dpsclient.h"
+
+#ifdef USE_DOPRINT
+extern void DPSdoprint();
+#endif /* USE_DOPRINT */
+
+#include <stdarg.h>
+
+void DPSPrintf(DPSContext ctxt, char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+
+#ifdef USE_DOPRINT
+ DPSdoprint(ctxt, fmt, &args);
+#else /* USE_DOPRINT */
+ {
+ char buffer[10000];
+ vsprintf(buffer, fmt, args);
+ DPSWritePostScript(ctxt, buffer, strlen(buffer));
+ }
+#endif /* USE_DOPRINT */
+ va_end(args);
+}
diff --git a/nx-X11/lib/dps/dpsprivate.h b/nx-X11/lib/dps/dpsprivate.h
new file mode 100644
index 000000000..0392eedd6
--- /dev/null
+++ b/nx-X11/lib/dps/dpsprivate.h
@@ -0,0 +1,127 @@
+/*
+ * dpsprivate.h -- Private interface for the DPS client library implementation.
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef DPSPRIVATE_H
+#define DPSPRIVATE_H
+
+#include "DPS/dpsconfig.h"
+#include "DPS/dpsclient.h"
+
+typedef enum {
+ dps_hiFirst, dps_loFirst
+ } DPSByteOrder;
+
+typedef enum {
+ dps_ieee, dps_native
+ } DPSNumFormat;
+
+typedef void (*DPSClientPrintProc)(
+ DPSContext /* cid */,
+ char * /* buf */,
+ unsigned int /* count */);
+ /* Call-back procedure to handle output from the PostScript server for
+ context with id 'cid'. Passed to DPSServicePostScript.
+ 'buf' contains 'count' bytes. */
+
+extern void DPSInitClient(
+ DPSTextProc textProc,
+ void (* /* releaseProc */) (char *, char *));
+/* Initialize the environment-specific parts of the client library */
+
+#ifndef DPSDefaultProgramEncoding
+#define DPSDefaultProgramEncoding dps_binObjSeq
+#endif /* not DPSDefaultProgramEncoding */
+
+#ifndef DPSDefaultByteOrder
+#if SWAPBITS
+#define DPSDefaultByteOrder dps_loFirst
+#else /* SWAPBITS */
+#define DPSDefaultByteOrder dps_hiFirst
+#endif /* SWAPBITS */
+#endif /* DPSDefaultByteOrder */
+
+#ifndef DPSDefaultNumFormat
+#if IEEEFLOAT
+#define DPSDefaultNumFormat dps_ieee
+#else /* IEEEFLOAT */
+#define DPSDefaultNumFormat dps_native
+#endif /* IEEEFLOAT */
+#endif /* not DPSDefaultNumFormat */
+
+#ifndef DPSDefaultNameEncoding
+#define DPSDefaultNameEncoding dps_indexed
+#endif /* not DPSDefaultNameEncoding */
+
+extern void DPSCheckRaiseError(DPSContext c);
+ /* Checks the resynching flag in a DPSPrivContext and raises an exception
+ if true */
+
+/* system name table boundaries */
+#define DPS_LAST_COMMON_SYSNAME 212
+#define DPS_FIRST_AUX_SYSNAME 256
+#define DPS_LAST_AUX_SYSNAME 427
+
+extern char **DPSSysNames;
+extern char **DPSSysNamesAux;
+
+ /* System name tables. DPSSysNames[index] is the string for the name.
+ DPSSysNamesAux[index - DPS_FIRST_AUX_SYSNAME] is the string
+ for an uncommon system name. */
+
+extern int DPSInitialize(void);
+extern void DPSInitSysNames(void);
+
+extern char *DPSSetWh(DPSContext /* ctxt */, char * /* newWh */);
+ /* set new window handle, returns old window handle */
+
+extern void DPSOutOfMemory(void);
+ /*
+ This is called by the DPS software when it cannot allocate any more
+ storage from the heap (e.g., when malloc returns NIL).
+
+ MAC ONLY
+ DPSOutOfMemory calls CantHappen (see dpsexcept.h) unless you
+ have used DPSSetOutOfMemoryProc to establish a different procedure
+ to be called, in which case DPSOutOfMemory calls your procedure instead.
+ If your procedure returns, DPSOutOfMemory returns to its caller, which
+ re-attempts the allocation. Note that another allocation failure will
+ cause DPSOutOfMemory to be called again (and again ...).
+
+ */
+
+#endif /* DPSPRIVATE_H */
diff --git a/nx-X11/lib/dps/dpssimpint.h b/nx-X11/lib/dps/dpssimpint.h
new file mode 100644
index 000000000..8485bc389
--- /dev/null
+++ b/nx-X11/lib/dps/dpssimpint.h
@@ -0,0 +1,88 @@
+/*
+ * dpsXint.h -- internal definitions to dpsXclient.c
+ *
+ * (c) Copyright 1989-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#ifndef DPSXINT_H
+#define DPSXINT_H
+
+/* The first part of this structure is generic; the last part is
+ implementation-specific. */
+
+typedef struct _t_DPSPrivContextRec {
+ char *priv;
+ DPSSpace space;
+ DPSProgramEncoding programEncoding;
+ DPSNameEncoding nameEncoding;
+ DPSProcs procs;
+ void (*textProc)();
+ void (*errorProc)();
+ DPSResults resultTable;
+ unsigned int resultTableLength;
+ struct _t_DPSContextRec *chainParent, *chainChild;
+ unsigned int contextFlags;
+ DPSContextExtensionRec *extension;
+
+ struct _t_DPSPrivContextRec *next;
+ integer lastNameIndex, cid;
+ boolean eofReceived;
+ char *wh;
+ char *buf, *outBuf, *objBuf;
+ integer nBufChars, nOutBufChars, nObjBufChars;
+ DPSNumFormat numFormat;
+
+/* Nothing is simple-specific */
+
+} DPSPrivContextRec, *DPSPrivContext;
+
+/* The first part of this structure is generic; the last part is
+ implementation-specific. */
+
+typedef struct _t_DPSPrivSpaceRec {
+ DPSSpaceProcs procs;
+
+ struct _t_DPSPrivSpaceRec *next;
+ long int lastNameIndex, sid;
+ char *wh; /* KLUDGE to support DPSSendDestroySpace */
+ DPSPrivContext firstContext;
+
+/* Nothing is simple-specific */
+
+} DPSPrivSpaceRec, *DPSPrivSpace;
+
+#include "dpsint.h"
+
+#endif /* DPSXINT_H */
diff --git a/nx-X11/lib/dps/dpssysnames.c b/nx-X11/lib/dps/dpssysnames.c
new file mode 100644
index 000000000..54bf07431
--- /dev/null
+++ b/nx-X11/lib/dps/dpssysnames.c
@@ -0,0 +1,444 @@
+/* dpssysnames.c -- system name table
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+#include "publictypes.h"
+#include "DPS/dpsclient.h"
+#include "dpsprivate.h"
+
+char **DPSSysNames;
+char **DPSSysNamesAux;
+
+static char *sysNames[] = {
+ "abs",
+ "add",
+ "aload",
+ "anchorsearch",
+ "and",
+ "arc",
+ "arcn",
+ "arct",
+ "arcto",
+ "array",
+ "ashow",
+ "astore",
+ "awidthshow",
+ "begin",
+ "bind",
+ "bitshift",
+ "ceiling",
+ "charpath",
+ "clear",
+ "cleartomark",
+ "clip",
+ "clippath",
+ "closepath",
+ "concat",
+ "concatmatrix",
+ "copy",
+ "count",
+ "counttomark",
+ "currentcmykcolor",
+ "currentdash",
+ "currentdict",
+ "currentfile",
+ "currentfont",
+ "currentgray",
+ "currentgstate",
+ "currenthsbcolor",
+ "currentlinecap",
+ "currentlinejoin",
+ "currentlinewidth",
+ "currentmatrix",
+ "currentpoint",
+ "currentrgbcolor",
+ "currentshared",
+ "curveto",
+ "cvi",
+ "cvlit",
+ "cvn",
+ "cvr",
+ "cvrs",
+ "cvs",
+ "cvx",
+ "def",
+ "defineusername",
+ "dict",
+ "div",
+ "dtransform",
+ "dup",
+ "end",
+ "eoclip",
+ "eofill",
+ "eoviewclip",
+ "eq",
+ "exch",
+ "exec",
+ "exit",
+ "file",
+ "fill",
+ "findfont",
+ "flattenpath",
+ "floor",
+ "flush",
+ "flushfile",
+ "for",
+ "forall",
+ "ge",
+ "get",
+ "getinterval",
+ "grestore",
+ "gsave",
+ "gstate",
+ "gt",
+ "identmatrix",
+ "idiv",
+ "idtransform",
+ "if",
+ "ifelse",
+ "image",
+ "imagemask",
+ "index",
+ "ineofill",
+ "infill",
+ "initviewclip",
+ "inueofill",
+ "inufill",
+ "invertmatrix",
+ "itransform",
+ "known",
+ "le",
+ "length",
+ "lineto",
+ "load",
+ "loop",
+ "lt",
+ "makefont",
+ "matrix",
+ "maxlength",
+ "mod",
+ "moveto",
+ "mul",
+ "ne",
+ "neg",
+ "newpath",
+ "not",
+ "null",
+ "or",
+ "pathbbox",
+ "pathforall",
+ "pop",
+ "print",
+ "printobject",
+ "put",
+ "putinterval",
+ "rcurveto",
+ "read",
+ "readhexstring",
+ "readline",
+ "readstring",
+ "rectclip",
+ "rectfill",
+ "rectstroke",
+ "rectviewclip",
+ "repeat",
+ "restore",
+ "rlineto",
+ "rmoveto",
+ "roll",
+ "rotate",
+ "round",
+ "save",
+ "scale",
+ "scalefont",
+ "search",
+ "selectfont",
+ "setbbox",
+ "setcachedevice",
+ "setcachedevice2",
+ "setcharwidth",
+ "setcmykcolor",
+ "setdash",
+ "setfont",
+ "setgray",
+ "setgstate",
+ "sethsbcolor",
+ "setlinecap",
+ "setlinejoin",
+ "setlinewidth",
+ "setmatrix",
+ "setrgbcolor",
+ "setshared",
+ "shareddict",
+ "show",
+ "showpage",
+ "stop",
+ "stopped",
+ "store",
+ "string",
+ "stringwidth",
+ "stroke",
+ "strokepath",
+ "sub",
+ "systemdict",
+ "token",
+ "transform",
+ "translate",
+ "truncate",
+ "type",
+ "uappend",
+ "ucache",
+ "ueofill",
+ "ufill",
+ "undef",
+ "upath",
+ "userdict",
+ "ustroke",
+ "viewclip",
+ "viewclippath",
+ "where",
+ "widthshow",
+ "write",
+ "writehexstring",
+ "writeobject",
+ "writestring",
+ "wtranslation",
+ "xor",
+ "xshow",
+ "xyshow",
+ "yshow",
+ "FontDirectory",
+ "SharedFontDirectory",
+ "Courier",
+ "Courier-Bold",
+ "Courier-BoldOblique",
+ "Courier-Oblique",
+ "Helvetica",
+ "Helvetica-Bold",
+ "Helvetica-BoldOblique",
+ "Helvetica-Oblique",
+ "Symbol",
+ "Times-Bold",
+ "Times-BoldItalic",
+ "Times-Italic",
+ "Times-Roman",
+ "execuserobject", /* 212 */
+ ""
+};
+
+static char *sysNamesAux[] = {
+ "=", /* 256 */
+ "==",
+ "ISOLatin1Encoding",
+ "StandardEncoding",
+ "[",
+ "]",
+ "atan",
+ "banddevice",
+ "bytesavailable",
+ "cachestatus",
+ "closefile",
+ "colorimage",
+ "condition",
+ "copypage",
+ "cos",
+ "countdictstack",
+ "countexecstack",
+ "cshow",
+ "currentblackgeneration",
+ "currentcacheparams",
+ "currentcolorscreen",
+ "currentcolortransfer",
+ "currentcontext",
+ "currentflat",
+ "currenthalftone",
+ "currenthalftonephase",
+ "currentmiterlimit",
+ "currentobjectformat",
+ "currentpacking",
+ "currentscreen",
+ "currentstrokeadjust",
+ "currenttransfer",
+ "currentundercolorremoval",
+ "defaultmatrix",
+ "definefont",
+ "deletefile",
+ "detach",
+ "deviceinfo",
+ "dictstack",
+ "echo",
+ "erasepage",
+ "errordict",
+ "execstack",
+ "executeonly",
+ "exp",
+ "false",
+ "filenameforall",
+ "fileposition",
+ "fork",
+ "framedevice",
+ "grestoreall",
+ "handleerror",
+ "initclip",
+ "initgraphics",
+ "initmatrix",
+ "instroke",
+ "inustroke",
+ "join",
+ "kshow",
+ "ln",
+ "lock",
+ "log",
+ "mark",
+ "monitor",
+ "noaccess",
+ "notify",
+ "nulldevice",
+ "packedarray",
+ "quit",
+ "rand",
+ "rcheck",
+ "readonly",
+ "realtime",
+ "renamefile",
+ "renderbands",
+ "resetfile",
+ "reversepath",
+ "rootfont",
+ "rrand",
+ "run",
+ "scheck",
+ "setblackgeneration",
+ "setcachelimit",
+ "setcacheparams",
+ "setcolorscreen",
+ "setcolortransfer",
+ "setfileposition",
+ "setflat",
+ "sethalftone",
+ "sethalftonephase",
+ "setmiterlimit",
+ "setobjectformat",
+ "setpacking",
+ "setscreen",
+ "setstrokeadjust",
+ "settransfer",
+ "setucacheparams",
+ "setundercolorremoval",
+ "sin",
+ "sqrt",
+ "srand",
+ "stack",
+ "status",
+ "statusdict",
+ "true",
+ "ucachestatus",
+ "undefinefont",
+ "usertime",
+ "ustrokepath",
+ "version",
+ "vmreclaim",
+ "vmstatus",
+ "wait",
+ "wcheck",
+ "xcheck",
+ "yield",
+ "defineuserobject",
+ "undefineuserobject",
+ "UserObjects",
+ "cleardictstack",
+ "A", /* 376 */
+ "B",
+ "C",
+ "D",
+ "E",
+ "F",
+ "G",
+ "H",
+ "I",
+ "J",
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P",
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W",
+ "X",
+ "Y",
+ "Z",
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "j",
+ "k",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ "q",
+ "r",
+ "s",
+ "t",
+ "u",
+ "v",
+ "w",
+ "x",
+ "y",
+ "z", /* 427 */
+ "setvmthreshold", /* 428 */
+ "<<", /* 429 */
+ ">>", /* 430 */
+ ""
+};
+
+void DPSInitSysNames() {
+ DPSSysNames = (char **)sysNames;
+ DPSSysNamesAux = (char **)sysNamesAux;
+ }
diff --git a/nx-X11/lib/dps/dpssysops.psw b/nx-X11/lib/dps/dpssysops.psw
new file mode 100644
index 000000000..731287930
--- /dev/null
+++ b/nx-X11/lib/dps/dpssysops.psw
@@ -0,0 +1,149 @@
+/* dpssysops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSbind(DPSContext ctxt)
+ bind
+endps
+
+defineps DPScleardictstack(DPSContext ctxt)
+ cleardictstack
+endps
+
+defineps DPScountdictstack(DPSContext ctxt | int *n)
+ countdictstack n
+endps
+
+defineps DPScountexecstack(DPSContext ctxt | int *n)
+ countexecstack n
+endps
+
+defineps DPScurrentdict(DPSContext ctxt)
+ currentdict
+endps
+
+defineps DPScurrentpacking(DPSContext ctxt | boolean *b)
+ currentpacking b
+endps
+
+defineps DPScurrentshared(DPSContext ctxt | boolean *b)
+ currentshared b
+endps
+
+defineps DPSdeviceinfo(DPSContext ctxt)
+ deviceinfo
+endps
+
+defineps DPSerrordict(DPSContext ctxt)
+ errordict
+endps
+
+defineps DPSexec(DPSContext ctxt)
+ exec
+endps
+
+defineps DPSprompt(DPSContext ctxt)
+ prompt
+endps
+
+defineps DPSquit(DPSContext ctxt)
+ quit
+endps
+
+defineps DPSrand(DPSContext ctxt)
+ rand
+endps
+
+defineps DPSrealtime(DPSContext ctxt | int *i)
+ realtime i
+endps
+
+defineps DPSrestore(DPSContext ctxt)
+ restore
+endps
+
+defineps DPSrrand(DPSContext ctxt)
+ rrand
+endps
+
+defineps DPSrun(DPSContext ctxt; char *filename)
+ (filename) run
+endps
+
+defineps DPSsave(DPSContext ctxt)
+ save
+endps
+
+defineps DPSsetpacking(DPSContext ctxt; boolean b)
+ b setpacking
+endps
+
+defineps DPSsetshared(DPSContext ctxt; boolean b)
+ b setshared
+endps
+
+defineps DPSsrand(DPSContext ctxt)
+ srand
+endps
+
+defineps DPSstart(DPSContext ctxt)
+ start
+endps
+
+defineps DPStype(DPSContext ctxt)
+ type
+endps
+
+defineps DPSundef(DPSContext ctxt; char *name)
+ /name undef
+endps
+
+defineps DPSusertime(DPSContext ctxt | int *milliseconds)
+ usertime milliseconds
+endps
+
+defineps DPSversion(DPSContext ctxt; int bufsize | char buf[bufsize])
+ version buf
+endps
+
+defineps DPSvmreclaim(DPSContext ctxt; int code)
+ code vmreclaim
+endps
+
+defineps DPSvmstatus(DPSContext ctxt | int *level, *used, *maximum)
+ vmstatus maximum used level
+endps
+
diff --git a/nx-X11/lib/dps/dpswinops.psw b/nx-X11/lib/dps/dpswinops.psw
new file mode 100644
index 000000000..6ccf77b4c
--- /dev/null
+++ b/nx-X11/lib/dps/dpswinops.psw
@@ -0,0 +1,65 @@
+/* dpswinops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps DPSineofill(DPSContext ctxt; float x, y | boolean *b)
+ x y ineofill b
+endps
+
+defineps DPSinfill(DPSContext ctxt; float x, y | boolean *b)
+ x y infill b
+endps
+
+defineps DPSinstroke(DPSContext ctxt; float x, y | boolean *b)
+ x y instroke b
+endps
+
+defineps DPSinueofill(DPSContext ctxt; float x, y; char nums[n]; int n; char ops[l]; int l | boolean *b)
+ x y [(nums) (ops)] inueofill b
+endps
+
+defineps DPSinufill(DPSContext ctxt; float x, y; char nums[n]; int n; char ops[l]; int l | boolean *b)
+ x y [(nums) (ops)] inufill b
+endps
+
+defineps DPSinustroke(DPSContext ctxt; float x, y; char nums[n]; int n; char ops[l]; int l | boolean *b)
+ x y [(nums) (ops)] inustroke b
+endps
+
+defineps DPSwtranslation(DPSContext ctxt | float *x, *y)
+ wtranslation y x
+endps
+
diff --git a/nx-X11/lib/dps/else.txt b/nx-X11/lib/dps/else.txt
new file mode 100644
index 000000000..b74df412a
--- /dev/null
+++ b/nx-X11/lib/dps/else.txt
@@ -0,0 +1,6 @@
+#else /* _NO_PROTO */
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
diff --git a/nx-X11/lib/dps/genheader.cmd b/nx-X11/lib/dps/genheader.cmd
new file mode 100644
index 000000000..b1784e232
--- /dev/null
+++ b/nx-X11/lib/dps/genheader.cmd
@@ -0,0 +1,14 @@
+REM
+/* OS/2 generate header files */
+/* $XFree86: xc/lib/dps/genheader.cmd,v 1.1 2000/04/05 18:13:22 dawes Exp $ */
+cat psclrops.h psctrlops.h psctxtops.h psdataops.h psfontops.h psgsttops.h psioops.h psmathops.h psmtrxops.h psmiscops.h pspntops.h pspathops.h pssysops.h pswinops.h psopstack.h psXops.h psl2ops.h >.ph
+sed -e "/^$$/D" -e "/#/D" -e "/^\//D" -e "/^ gener/D" -e "/^.\//D" .ph | sort >.sort
+awk "/;/ {print;printf(\"\n\");}" .sort >.ttt
+cat psname.txt header.txt psifdef.txt .ttt psendif.txt > psops.h.os2
+rm .ph .sort .ttt
+
+cat dpsclrops.h dpsctrlops.h dpsctxtops.h dpsdataops.h dpsfontops.h dpsgsttops.h dpsioops.h dpsmathops.h dpsmtrxops.h dpsmiscops.h dpspntops.h dpspathops.h dpssysops.h dpswinops.h dpsopstack.h dpsXops.h dpsl2ops.h >.ph
+sed -e "/^$$/D" -e "/#/D" -e "/^\//D" -e "/^ gener/D" -e "/^.\//D" .ph | sort >.sort
+awk "/;/ {print;printf(\"\n\");}" .sort >.ttt
+cat dpsname.txt header.txt dpsifdef.txt .ttt dpsendif.txt > dpsops.h.os2
+rm .ph .sort .ttt
diff --git a/nx-X11/lib/dps/header.txt b/nx-X11/lib/dps/header.txt
new file mode 100644
index 000000000..8b37ebe67
--- /dev/null
+++ b/nx-X11/lib/dps/header.txt
@@ -0,0 +1,35 @@
+/*
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
diff --git a/nx-X11/lib/dps/psXops.psw b/nx-X11/lib/dps/psXops.psw
new file mode 100644
index 000000000..5d350418f
--- /dev/null
+++ b/nx-X11/lib/dps/psXops.psw
@@ -0,0 +1,81 @@
+/* psXops.psw
+ *
+ * (c) Copyright 1991-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86$ */
+
+defineps PSclientsync()
+ clientsync
+endps
+
+defineps PScurrentXgcdrawable(| int *gc, *draw, *x, *y)
+ currentXgcdrawable y x draw gc
+endps
+
+defineps PScurrentXgcdrawablecolor(| int *gc, *draw, *x, *y, colorInfo[12])
+ currentXgcdrawablecolor colorInfo y x draw gc
+endps
+
+defineps PScurrentXoffset(| int *x, *y)
+ currentXoffset y x
+endps
+
+defineps PSsetXgcdrawable(int gc, draw, x, y)
+ gc draw x y setXgcdrawable
+endps
+
+defineps PSsetXgcdrawablecolor(int gc, draw, x, y, colorInfo[12])
+ gc draw x y colorInfo setXgcdrawablecolor
+endps
+
+defineps PSsetXoffset(int x, y)
+ x y setXoffset
+endps
+
+defineps PSsetXrgbactual(float r, g, b | boolean *success)
+ r g b setXrgbactual success
+endps
+
+defineps PSclientXready(int i0, i1, i2, i3)
+ [ i0 i1 i2 i3 ] clientXready
+endps
+
+defineps PSsetXdrawingfunction(int function)
+ function setXdrawingfunction
+endps
+
+defineps PScurrentXdrawingfunction(| int *function)
+ currentXdrawingfunction function
+endps
diff --git a/nx-X11/lib/dps/psclrops.psw b/nx-X11/lib/dps/psclrops.psw
new file mode 100644
index 000000000..986f85176
--- /dev/null
+++ b/nx-X11/lib/dps/psclrops.psw
@@ -0,0 +1,81 @@
+/* psclrops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PScolorimage()
+ colorimage
+endps
+
+defineps PScurrentblackgeneration()
+ currentblackgeneration
+endps
+
+defineps PScurrentcmykcolor( | float *c, *m, *y, *k)
+ currentcmykcolor k y m c
+endps
+
+defineps PScurrentcolorscreen()
+ currentcolorscreen
+endps
+
+defineps PScurrentcolortransfer()
+ currentcolortransfer
+endps
+
+defineps PScurrentundercolorremoval()
+ currentundercolorremoval
+endps
+
+defineps PSsetblackgeneration()
+ setblackgeneration
+endps
+
+defineps PSsetcmykcolor(float c, m, y, k)
+ c m y k setcmykcolor
+endps
+
+defineps PSsetcolorscreen()
+ setcolorscreen
+endps
+
+defineps PSsetcolortransfer()
+ setcolortransfer
+endps
+
+defineps PSsetundercolorremoval()
+ setundercolorremoval
+endps
+
diff --git a/nx-X11/lib/dps/psctrlops.psw b/nx-X11/lib/dps/psctrlops.psw
new file mode 100644
index 000000000..882020d63
--- /dev/null
+++ b/nx-X11/lib/dps/psctrlops.psw
@@ -0,0 +1,113 @@
+/* psctrlops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSeq()
+ eq
+endps
+
+defineps PSexit()
+ exit
+endps
+
+defineps PSfalse()
+ false
+endps
+
+defineps PSfor()
+ for
+endps
+
+defineps PSforall()
+ forall
+endps
+
+defineps PSge()
+ ge
+endps
+
+defineps PSgt()
+ gt
+endps
+
+defineps PSif()
+ if
+endps
+
+defineps PSifelse()
+ ifelse
+endps
+
+defineps PSle()
+ le
+endps
+
+defineps PSloop()
+ loop
+endps
+
+defineps PSlt()
+ lt
+endps
+
+defineps PSne()
+ ne
+endps
+
+defineps PSnot()
+ not
+endps
+
+defineps PSor()
+ or
+endps
+
+defineps PSrepeat()
+ repeat
+endps
+
+defineps PSstop()
+ stop
+endps
+
+defineps PSstopped()
+ stopped
+endps
+
+defineps PStrue()
+ true
+endps
+
diff --git a/nx-X11/lib/dps/psctxtops.psw b/nx-X11/lib/dps/psctxtops.psw
new file mode 100644
index 000000000..43ca803fc
--- /dev/null
+++ b/nx-X11/lib/dps/psctxtops.psw
@@ -0,0 +1,109 @@
+/* psctxtops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSUserObjects()
+ UserObjects
+endps
+
+defineps PScondition()
+ condition
+endps
+
+defineps PScurrentcontext( | int *cid)
+ currentcontext cid
+endps
+
+defineps PScurrentobjectformat( | int *code)
+ currentobjectformat code
+endps
+
+defineps PSdefineusername(int i; char *username)
+ i /username defineusername
+endps
+
+defineps PSdefineuserobject()
+ defineuserobject
+endps
+
+defineps PSdetach()
+ detach
+endps
+
+defineps PSexecuserobject(int userObjIndex)
+ userObjIndex execuserobject
+endps
+
+defineps PSfork()
+ fork
+endps
+
+defineps PSjoin()
+ join
+endps
+
+defineps PSlock()
+ lock
+endps
+
+defineps PSmonitor()
+ monitor
+endps
+
+defineps PSnotify()
+ notify
+endps
+
+defineps PSsetobjectformat(int code)
+ code setobjectformat
+endps
+
+defineps PSsetvmthreshold(int i)
+ i setvmthreshold
+endps
+
+defineps PSundefineuserobject(int userObjIndex)
+ userObjIndex undefineuserobject
+endps
+
+defineps PSwait()
+ wait
+endps
+
+defineps PSyield()
+ yield
+endps
+
diff --git a/nx-X11/lib/dps/psdataops.psw b/nx-X11/lib/dps/psdataops.psw
new file mode 100644
index 000000000..ee89313f6
--- /dev/null
+++ b/nx-X11/lib/dps/psdataops.psw
@@ -0,0 +1,257 @@
+/* psdataops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSaload()
+ aload
+endps
+
+defineps PSanchorsearch(| boolean *truth)
+ anchorsearch truth
+endps
+
+defineps PSarray(int len)
+ len array
+endps
+
+defineps PSastore()
+ astore
+endps
+
+defineps PSbegin()
+ begin
+endps
+
+defineps PSclear()
+ clear
+endps
+
+defineps PScleartomark()
+ cleartomark
+endps
+
+defineps PScopy(int n)
+ n copy
+endps
+
+defineps PScount( | int *n)
+ count n
+endps
+
+defineps PScounttomark( | int *n)
+ counttomark n
+endps
+
+defineps PScvi()
+ cvi
+endps
+
+defineps PScvlit()
+ cvlit
+endps
+
+defineps PScvn()
+ cvn
+endps
+
+defineps PScvr()
+ cvr
+endps
+
+defineps PScvrs()
+ cvrs
+endps
+
+defineps PScvs()
+ cvs
+endps
+
+defineps PScvx()
+ cvx
+endps
+
+defineps PSdef()
+ def
+endps
+
+defineps PSdict(int len)
+ len dict
+endps
+
+defineps PSdictstack()
+ dictstack
+endps
+
+defineps PSdup()
+ dup
+endps
+
+defineps PSend()
+ end
+endps
+
+defineps PSexch()
+ exch
+endps
+
+defineps PSexecstack()
+ execstack
+endps
+
+defineps PSexecuteonly()
+ executeonly
+endps
+
+defineps PSget()
+ get
+endps
+
+defineps PSgetinterval()
+ getinterval
+endps
+
+defineps PSindex(int i)
+ i index
+endps
+
+defineps PSknown( | boolean *b)
+ known b
+endps
+
+defineps PSlength( | int *len)
+ length len
+endps
+
+defineps PSload()
+ load
+endps
+
+defineps PSmark()
+ mark
+endps
+
+defineps PSmatrix()
+ matrix
+endps
+
+defineps PSmaxlength( | int *len)
+ maxlength len
+endps
+
+defineps PSnoaccess()
+ noaccess
+endps
+
+defineps PSnull()
+ null
+endps
+
+defineps PSpackedarray()
+ packedarray
+endps
+
+defineps PSpop()
+ pop
+endps
+
+defineps PSput()
+ put
+endps
+
+defineps PSputinterval()
+ putinterval
+endps
+
+defineps PSrcheck( | boolean *b)
+ rcheck b
+endps
+
+defineps PSreadonly()
+ readonly
+endps
+
+defineps PSroll(int n, j)
+ n j roll
+endps
+
+defineps PSscheck( | boolean *b)
+ scheck b
+endps
+
+defineps PSsearch(| boolean *b)
+ search b
+endps
+
+defineps PSshareddict()
+ shareddict
+endps
+
+defineps PSstatusdict()
+ statusdict
+endps
+
+defineps PSstore()
+ store
+endps
+
+defineps PSstring(int len)
+ len string
+endps
+
+defineps PSstringwidth(char *s | float *xp, *yp)
+ (s) stringwidth yp xp
+endps
+
+defineps PSsystemdict()
+ systemdict
+endps
+
+defineps PSuserdict()
+ userdict
+endps
+
+defineps PSwcheck( | boolean *b)
+ wcheck b
+endps
+
+defineps PSwhere(| boolean *b)
+ where b
+endps
+
+defineps PSxcheck( | boolean *b)
+ xcheck b
+endps
+
diff --git a/nx-X11/lib/dps/psendif.txt b/nx-X11/lib/dps/psendif.txt
new file mode 100644
index 000000000..cd3eae5f3
--- /dev/null
+++ b/nx-X11/lib/dps/psendif.txt
@@ -0,0 +1,6 @@
+
+#if defined(__cplusplus) || defined(c_plusplus)
+}
+#endif
+
+#endif /* PSOPS_H */
diff --git a/nx-X11/lib/dps/psfontops.psw b/nx-X11/lib/dps/psfontops.psw
new file mode 100644
index 000000000..9d9b99914
--- /dev/null
+++ b/nx-X11/lib/dps/psfontops.psw
@@ -0,0 +1,109 @@
+/* psfontops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSFontDirectory()
+ FontDirectory
+endps
+
+defineps PSISOLatin1Encoding()
+ ISOLatin1Encoding
+endps
+
+defineps PSSharedFontDirectory()
+ SharedFontDirectory
+endps
+
+defineps PSStandardEncoding()
+ StandardEncoding
+endps
+
+defineps PScachestatus()
+ cachestatus
+endps
+
+defineps PScurrentcacheparams()
+ currentcacheparams
+endps
+
+defineps PScurrentfont()
+ currentfont
+endps
+
+defineps PSdefinefont()
+ definefont
+endps
+
+defineps PSfindfont(char *name)
+ /name findfont
+endps
+
+defineps PSmakefont()
+ makefont
+endps
+
+defineps PSscalefont(float size)
+ size scalefont
+endps
+
+defineps PSselectfont(char *name; float scale)
+ /name scale selectfont
+endps
+
+defineps PSsetcachedevice(float wx, wy, llx, lly, urx, ury)
+ wx wy llx lly urx ury setcachedevice
+endps
+
+defineps PSsetcachelimit(int n)
+ n setcachelimit
+endps
+
+defineps PSsetcacheparams()
+ setcacheparams
+endps
+
+defineps PSsetcharwidth(float wx, wy)
+ wx wy setcharwidth
+endps
+
+defineps PSsetfont(userobject f)
+ f setfont
+endps
+
+defineps PSundefinefont(char *name)
+ /name undefinefont
+endps
+
diff --git a/nx-X11/lib/dps/psgsttops.psw b/nx-X11/lib/dps/psgsttops.psw
new file mode 100644
index 000000000..a6eb87b62
--- /dev/null
+++ b/nx-X11/lib/dps/psgsttops.psw
@@ -0,0 +1,213 @@
+/* psgsttops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSconcat(float m[6])
+ m concat
+endps
+
+defineps PScurrentdash()
+ currentdash
+endps
+
+defineps PScurrentflat( | float *flatness)
+ currentflat flatness
+endps
+
+defineps PScurrentgray( | float *gray)
+ currentgray gray
+endps
+
+defineps PScurrentgstate(userobject gst)
+ gst currentgstate
+endps
+
+defineps PScurrenthalftone()
+ currenthalftone
+endps
+
+defineps PScurrenthalftonephase( | float *x, *y)
+ currenthalftonephase y x
+endps
+
+defineps PScurrenthsbcolor( | float *h, *s, *b)
+ currenthsbcolor b s h
+endps
+
+defineps PScurrentlinecap( | int *linecap)
+ currentlinecap linecap
+endps
+
+defineps PScurrentlinejoin( | int *linejoin)
+ currentlinejoin linejoin
+endps
+
+defineps PScurrentlinewidth( | float *width)
+ currentlinewidth width
+endps
+
+defineps PScurrentmatrix()
+ currentmatrix
+endps
+
+defineps PScurrentmiterlimit( | float *limit)
+ currentmiterlimit limit
+endps
+
+defineps PScurrentpoint( | float *x, *y)
+ currentpoint y x
+endps
+
+defineps PScurrentrgbcolor( | float *r, *g, *b)
+ currentrgbcolor b g r
+endps
+
+defineps PScurrentscreen()
+ currentscreen
+endps
+
+defineps PScurrentstrokeadjust( | boolean *b)
+ currentstrokeadjust b
+endps
+
+defineps PScurrenttransfer()
+ currenttransfer
+endps
+
+defineps PSdefaultmatrix()
+ defaultmatrix
+endps
+
+defineps PSgrestore()
+ grestore
+endps
+
+defineps PSgrestoreall()
+ grestoreall
+endps
+
+defineps PSgsave()
+ gsave
+endps
+
+defineps PSgstate()
+ gstate
+endps
+
+defineps PSinitgraphics()
+ initgraphics
+endps
+
+defineps PSinitmatrix()
+ initmatrix
+endps
+
+defineps PSrotate(float angle)
+ angle rotate
+endps
+
+defineps PSscale(float x, y)
+ x y scale
+endps
+
+defineps PSsetdash(float pat[size]; int size; float offset)
+ pat offset setdash
+endps
+
+defineps PSsetflat(float flatness)
+ flatness setflat
+endps
+
+defineps PSsetgray(float gray)
+ gray setgray
+endps
+
+defineps PSsetgstate(userobject gst)
+ gst setgstate
+endps
+
+defineps PSsethalftone()
+ sethalftone
+endps
+
+defineps PSsethalftonephase(float x, y)
+ x y sethalftonephase
+endps
+
+defineps PSsethsbcolor(float h, s, b)
+ h s b sethsbcolor
+endps
+
+defineps PSsetlinecap(int linecap)
+ linecap setlinecap
+endps
+
+defineps PSsetlinejoin(int linejoin)
+ linejoin setlinejoin
+endps
+
+defineps PSsetlinewidth(float width)
+ width setlinewidth
+endps
+
+defineps PSsetmatrix()
+ setmatrix
+endps
+
+defineps PSsetmiterlimit(float limit)
+ limit setmiterlimit
+endps
+
+defineps PSsetrgbcolor(float r, g, b)
+ r g b setrgbcolor
+endps
+
+defineps PSsetscreen()
+ setscreen
+endps
+
+defineps PSsetstrokeadjust(boolean b)
+ b setstrokeadjust
+endps
+
+defineps PSsettransfer()
+ settransfer
+endps
+
+defineps PStranslate(float x, y)
+ x y translate
+endps
+
diff --git a/nx-X11/lib/dps/psifdef.txt b/nx-X11/lib/dps/psifdef.txt
new file mode 100644
index 000000000..0de071a23
--- /dev/null
+++ b/nx-X11/lib/dps/psifdef.txt
@@ -0,0 +1,7 @@
+#ifndef PSOPS_H
+#define PSOPS_H
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+
diff --git a/nx-X11/lib/dps/psioops.psw b/nx-X11/lib/dps/psioops.psw
new file mode 100644
index 000000000..c4d4b4bb9
--- /dev/null
+++ b/nx-X11/lib/dps/psioops.psw
@@ -0,0 +1,153 @@
+/* psioops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSequals()
+ =
+endps
+
+defineps PSequalsequals()
+ ==
+endps
+
+defineps PSbytesavailable( | int *n)
+ bytesavailable n
+endps
+
+defineps PSclosefile()
+ closefile
+endps
+
+defineps PScurrentfile()
+ currentfile
+endps
+
+defineps PSdeletefile(char *filename)
+ (filename) deletefile
+endps
+
+defineps PSecho(boolean b)
+ b echo
+endps
+
+defineps PSfile(char *name, *access)
+ (name) (access) file
+endps
+
+defineps PSfilenameforall()
+ filenameforall
+endps
+
+defineps PSfileposition( | int *pos)
+ fileposition pos
+endps
+
+defineps PSflush()
+ flush
+endps
+
+defineps PSflushfile()
+ flushfile
+endps
+
+defineps PSprint()
+ print
+endps
+
+defineps PSprintobject(int tag)
+ tag printobject
+endps
+
+defineps PSpstack()
+ pstack
+endps
+
+defineps PSread(| boolean *b)
+ read b
+endps
+
+defineps PSreadhexstring(| boolean *b)
+ readhexstring b
+endps
+
+defineps PSreadline(| boolean *b)
+ readline b
+endps
+
+defineps PSreadstring(| boolean *b)
+ readstring b
+endps
+
+defineps PSrenamefile(char *oldname, *newname)
+ (oldname) (newname) renamefile
+endps
+
+defineps PSresetfile()
+ resetfile
+endps
+
+defineps PSsetfileposition(int pos)
+ pos setfileposition
+endps
+
+defineps PSstack()
+ stack
+endps
+
+defineps PSstatus( | boolean *b)
+ status b
+endps
+
+defineps PStoken(| boolean *b)
+ token b
+endps
+
+defineps PSwrite()
+ write
+endps
+
+defineps PSwritehexstring()
+ writehexstring
+endps
+
+defineps PSwriteobject(int tag)
+ tag writeobject
+endps
+
+defineps PSwritestring()
+ writestring
+endps
+
diff --git a/nx-X11/lib/dps/psl2ops.psw b/nx-X11/lib/dps/psl2ops.psw
new file mode 100644
index 000000000..684b5b2e0
--- /dev/null
+++ b/nx-X11/lib/dps/psl2ops.psw
@@ -0,0 +1,208 @@
+/* psl2ops.psw
+ * (c) Copyright 1991-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSleftbracket()
+ mark % [ annoys pswrap
+endps
+
+defineps PSrightbracket()
+ counttomark array astore exch pop % ] annoys pswrap
+endps
+
+defineps PSleftleft()
+ <<
+endps
+
+defineps PSrightright()
+ >>
+endps
+
+defineps PScshow(char *s)
+ (s) cshow
+endps
+
+defineps PScurrentcolor()
+ currentcolor
+endps
+
+defineps PScurrentcolorrendering()
+ currentcolorrendering
+endps
+
+defineps PScurrentcolorspace()
+ currentcolorspace
+endps
+
+defineps PScurrentdevparams(char *dev)
+ (dev) currentdevparams
+endps
+
+defineps PScurrentglobal(| boolean *b)
+ currentglobal b
+endps
+
+defineps PScurrentoverprint(| boolean *b)
+ currentoverprint b
+endps
+
+defineps PScurrentpagedevice()
+ currentpagedevice
+endps
+
+defineps PScurrentsystemparams()
+ currentsystemparams
+endps
+
+defineps PScurrentuserparams()
+ currentuserparams
+endps
+
+defineps PSdefineresource(char *category)
+ /category defineresource
+endps
+
+defineps PSexecform()
+ execform
+endps
+
+defineps PSfilter()
+ filter
+endps
+
+defineps PSfindencoding(char *key)
+ /key findencoding
+endps
+
+defineps PSfindresource(char *key, *category)
+ /key /category findresource
+endps
+
+defineps PSgcheck(| boolean *b)
+ gcheck b
+endps
+
+defineps PSglobaldict()
+ globaldict
+endps
+
+defineps PSGlobalFontDirectory()
+ GlobalFontDirectory
+endps
+
+defineps PSglyphshow(char *name)
+ /name glyphshow
+endps
+
+defineps PSlanguagelevel(| int *n)
+ languagelevel n
+endps
+
+defineps PSmakepattern()
+ makepattern
+endps
+
+defineps PSproduct()
+ product
+endps
+
+defineps PSresourceforall(char *category)
+ /category resourceforall
+endps
+
+defineps PSresourcestatus(char *key, *category; | boolean *b)
+ /key /category resourcestatus b
+endps
+
+defineps PSrevision(| int *n)
+ revision n
+endps
+
+defineps PSrootfont()
+ rootfont
+endps
+
+defineps PSserialnumber(| int *n)
+ serialnumber n
+endps
+
+defineps PSsetcolor()
+ setcolor
+endps
+
+defineps PSsetcolorrendering()
+ setcolorrendering
+endps
+
+defineps PSsetcolorspace()
+ setcolorspace
+endps
+
+defineps PSsetdevparams()
+ setdevparams
+endps
+
+defineps PSsetglobal(boolean b)
+ b setglobal
+endps
+
+defineps PSsetoverprint(boolean b)
+ b setoverprint
+endps
+
+defineps PSsetpagedevice()
+ setpagedevice
+endps
+
+defineps PSsetpattern()
+ setpattern
+endps
+
+defineps PSsetsystemparams()
+ setsystemparams
+endps
+
+defineps PSsetuserparams()
+ setuserparams
+endps
+
+defineps PSstartjob(boolean b; char *password)
+ b password startjob
+endps
+
+defineps PSundefineresource(char *key, *category)
+ /key /category undefineresource
+endps
+
diff --git a/nx-X11/lib/dps/psmathops.psw b/nx-X11/lib/dps/psmathops.psw
new file mode 100644
index 000000000..268535348
--- /dev/null
+++ b/nx-X11/lib/dps/psmathops.psw
@@ -0,0 +1,125 @@
+/* psmathops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSabs()
+ abs
+endps
+
+defineps PSadd()
+ add
+endps
+
+defineps PSand()
+ and
+endps
+
+defineps PSatan()
+ atan
+endps
+
+defineps PSbitshift(int shift)
+ shift bitshift
+endps
+
+defineps PSceiling()
+ ceiling
+endps
+
+defineps PScos()
+ cos
+endps
+
+defineps PSdiv()
+ div
+endps
+
+defineps PSexp()
+ exp
+endps
+
+defineps PSfloor()
+ floor
+endps
+
+defineps PSidiv()
+ idiv
+endps
+
+defineps PSln()
+ ln
+endps
+
+defineps PSlog()
+ log
+endps
+
+defineps PSmod()
+ mod
+endps
+
+defineps PSmul()
+ mul
+endps
+
+defineps PSneg()
+ neg
+endps
+
+defineps PSround()
+ round
+endps
+
+defineps PSsin()
+ sin
+endps
+
+defineps PSsqrt()
+ sqrt
+endps
+
+defineps PSsub()
+ sub
+endps
+
+defineps PStruncate()
+ truncate
+endps
+
+defineps PSxor()
+ xor
+endps
+
diff --git a/nx-X11/lib/dps/psmiscops.psw b/nx-X11/lib/dps/psmiscops.psw
new file mode 100644
index 000000000..35bc092d0
--- /dev/null
+++ b/nx-X11/lib/dps/psmiscops.psw
@@ -0,0 +1,53 @@
+/* psmiscops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSbanddevice()
+ banddevice
+endps
+
+defineps PSframedevice()
+ framedevice
+endps
+
+defineps PSnulldevice()
+ nulldevice
+endps
+
+defineps PSrenderbands()
+ renderbands
+endps
+
diff --git a/nx-X11/lib/dps/psmtrxops.psw b/nx-X11/lib/dps/psmtrxops.psw
new file mode 100644
index 000000000..cd9ae1b79
--- /dev/null
+++ b/nx-X11/lib/dps/psmtrxops.psw
@@ -0,0 +1,65 @@
+/* psmtrxops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSconcatmatrix()
+ concatmatrix
+endps
+
+defineps PSdtransform(float x1, y1 | float *x2, *y2)
+ x1 y1 dtransform y2 x2
+endps
+
+defineps PSidentmatrix()
+ identmatrix
+endps
+
+defineps PSidtransform(float x1, y1 | float *x2, *y2)
+ x1 y1 idtransform y2 x2
+endps
+
+defineps PSinvertmatrix()
+ invertmatrix
+endps
+
+defineps PSitransform(float x1, y1 | float *x2, *y2)
+ x1 y1 itransform y2 x2
+endps
+
+defineps PStransform(float x1, y1 | float *x2, *y2)
+ x1 y1 transform y2 x2
+endps
+
diff --git a/nx-X11/lib/dps/psname.txt b/nx-X11/lib/dps/psname.txt
new file mode 100644
index 000000000..508b7a86d
--- /dev/null
+++ b/nx-X11/lib/dps/psname.txt
@@ -0,0 +1,3 @@
+/*
+ * psops.h
+ */
diff --git a/nx-X11/lib/dps/psopstack.psw b/nx-X11/lib/dps/psopstack.psw
new file mode 100644
index 000000000..d78ad6b7c
--- /dev/null
+++ b/nx-X11/lib/dps/psopstack.psw
@@ -0,0 +1,96 @@
+/*
+ * psopstack.psw -- wrapped procedures for sending and getting operands
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSgetboolean(| boolean *it)
+ it
+endps
+
+defineps PSgetchararray(int size | char s[size])
+ s
+endps
+
+defineps PSgetfloat(| float *it)
+ it
+endps
+
+defineps PSgetfloatarray(int size | float a[size])
+ dup type /arraytype eq { a } { size { a } repeat } ifelse
+endps
+
+defineps PSgetint(| int *it)
+ it
+endps
+
+defineps PSgetintarray(int size | int a[size])
+ dup type /arraytype eq { a } { size { a } repeat } ifelse
+endps
+
+defineps PSgetstring(| char *s)
+ s
+endps
+
+defineps PSsendboolean(boolean it)
+ it
+endps
+
+defineps PSsendchararray(char s[size]; int size)
+ (s)
+endps
+
+defineps PSsendfloat(float it)
+ it
+endps
+
+defineps PSsendfloatarray(float a[size]; int size)
+ a
+endps
+
+defineps PSsendint(int it)
+ it
+endps
+
+defineps PSsendintarray(int a[size]; int size)
+ a
+endps
+
+defineps PSsendstring(char *s)
+ (s)
+endps
+
+
+
diff --git a/nx-X11/lib/dps/pspathops.psw b/nx-X11/lib/dps/pspathops.psw
new file mode 100644
index 000000000..e4c378282
--- /dev/null
+++ b/nx-X11/lib/dps/pspathops.psw
@@ -0,0 +1,169 @@
+/* pspathops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSarc(float x, y, r, angle1, angle2)
+ x y r angle1 angle2 arc
+endps
+
+defineps PSarcn(float x, y, r, angle1, angle2)
+ x y r angle1 angle2 arcn
+endps
+
+defineps PSarct(float x1, y1, x2, y2, r)
+ x1 y1 x2 y2 r arct
+endps
+
+defineps PSarcto(float x1, y1, x2, y2, r | float *xt1, *yt1, *xt2, *yt2)
+ x1 y1 x2 y2 r arcto yt2 xt2 yt1 xt1
+endps
+
+defineps PScharpath(char *s; boolean b)
+ (s) b charpath
+endps
+
+defineps PSclip()
+ clip
+endps
+
+defineps PSclippath()
+ clippath
+endps
+
+defineps PSclosepath()
+ closepath
+endps
+
+defineps PScurveto(float x1, y1, x2, y2, x3, y3)
+ x1 y1 x2 y2 x3 y3 curveto
+endps
+
+defineps PSeoclip()
+ eoclip
+endps
+
+defineps PSeoviewclip()
+ eoviewclip
+endps
+
+defineps PSflattenpath()
+ flattenpath
+endps
+
+defineps PSinitclip()
+ initclip
+endps
+
+defineps PSinitviewclip()
+ initviewclip
+endps
+
+defineps PSlineto(float x, y)
+ x y lineto
+endps
+
+defineps PSmoveto(float x, y)
+ x y moveto
+endps
+
+defineps PSnewpath()
+ newpath
+endps
+
+defineps PSpathbbox( | float *llx, *lly, *urx, *ury)
+ pathbbox ury urx lly llx
+endps
+
+defineps PSpathforall()
+ pathforall
+endps
+
+defineps PSrcurveto(float x1, y1, x2, y2, x3, y3)
+ x1 y1 x2 y2 x3 y3 rcurveto
+endps
+
+defineps PSrectclip(float x, y, w, h)
+ x y w h rectclip
+endps
+
+defineps PSrectviewclip(float x, y, w, h)
+ x y w h rectviewclip
+endps
+
+defineps PSreversepath()
+ reversepath
+endps
+
+defineps PSrlineto(float x, y)
+ x y rlineto
+endps
+
+defineps PSrmoveto(float x, y)
+ x y rmoveto
+endps
+
+defineps PSsetbbox(float llx, lly, urx, ury)
+ llx lly urx ury setbbox
+endps
+
+defineps PSsetucacheparams()
+ setucacheparams
+endps
+
+defineps PSuappend(char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] uappend
+endps
+
+defineps PSucache()
+ ucache
+endps
+
+defineps PSucachestatus()
+ ucachestatus
+endps
+
+defineps PSupath(boolean b)
+ b upath
+endps
+
+defineps PSviewclip()
+ viewclip
+endps
+
+defineps PSviewclippath()
+ viewclippath
+endps
+
diff --git a/nx-X11/lib/dps/pspntops.psw b/nx-X11/lib/dps/pspntops.psw
new file mode 100644
index 000000000..2f7beef00
--- /dev/null
+++ b/nx-X11/lib/dps/pspntops.psw
@@ -0,0 +1,129 @@
+/* pspntops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSashow(float x, y; char *s)
+ x y (s) ashow
+endps
+
+defineps PSawidthshow(float cx, cy; int c; float ax, ay; char *s)
+ cx cy c ax ay (s) awidthshow
+endps
+
+defineps PScopypage()
+ copypage
+endps
+
+defineps PSeofill()
+ eofill
+endps
+
+defineps PSerasepage()
+ erasepage
+endps
+
+defineps PSfill()
+ fill
+endps
+
+defineps PSimage()
+ image
+endps
+
+defineps PSimagemask()
+ imagemask
+endps
+
+defineps PSkshow(char *s)
+ (s) kshow
+endps
+
+defineps PSrectfill(float x, y, w, h)
+ x y w h rectfill
+endps
+
+defineps PSrectstroke(float x, y, w, h)
+ x y w h rectstroke
+endps
+
+defineps PSshow(char *s)
+ (s) show
+endps
+
+defineps PSshowpage()
+ showpage
+endps
+
+defineps PSstroke()
+ stroke
+endps
+
+defineps PSstrokepath()
+ strokepath
+endps
+
+defineps PSueofill(char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] ueofill
+endps
+
+defineps PSufill(char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] ufill
+endps
+
+defineps PSustroke(char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] ustroke
+endps
+
+defineps PSustrokepath(char nums[n]; int n; char ops[l]; int l)
+ [(nums) (ops)] ustrokepath
+endps
+
+defineps PSwidthshow(float x, y; int c; char *s)
+ x y c (s) widthshow
+endps
+
+defineps PSxshow(char *s; float numarray[size]; int size)
+ (s) numarray xshow
+endps
+
+defineps PSxyshow(char *s; float numarray[size]; int size)
+ (s) numarray xyshow
+endps
+
+defineps PSyshow(char *s; float numarray[size]; int size)
+ (s) numarray yshow
+endps
+
diff --git a/nx-X11/lib/dps/pssysops.psw b/nx-X11/lib/dps/pssysops.psw
new file mode 100644
index 000000000..024d4fd52
--- /dev/null
+++ b/nx-X11/lib/dps/pssysops.psw
@@ -0,0 +1,150 @@
+/*
+ * pssysops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSbind()
+ bind
+endps
+
+defineps PScleardictstack()
+ cleardictstack
+endps
+
+defineps PScountdictstack( | int *n)
+ countdictstack n
+endps
+
+defineps PScountexecstack( | int *n)
+ countexecstack n
+endps
+
+defineps PScurrentdict()
+ currentdict
+endps
+
+defineps PScurrentpacking( | boolean *b)
+ currentpacking b
+endps
+
+defineps PScurrentshared( | boolean *b)
+ currentshared b
+endps
+
+defineps PSdeviceinfo()
+ deviceinfo
+endps
+
+defineps PSerrordict()
+ errordict
+endps
+
+defineps PSexec()
+ exec
+endps
+
+defineps PSprompt()
+ prompt
+endps
+
+defineps PSquit()
+ quit
+endps
+
+defineps PSrand()
+ rand
+endps
+
+defineps PSrealtime( | int *i)
+ realtime i
+endps
+
+defineps PSrestore()
+ restore
+endps
+
+defineps PSrrand()
+ rrand
+endps
+
+defineps PSrun(char *filename)
+ (filename) run
+endps
+
+defineps PSsave()
+ save
+endps
+
+defineps PSsetpacking(boolean b)
+ b setpacking
+endps
+
+defineps PSsetshared(boolean b)
+ b setshared
+endps
+
+defineps PSsrand()
+ srand
+endps
+
+defineps PSstart()
+ start
+endps
+
+defineps PStype()
+ type
+endps
+
+defineps PSundef(char *name)
+ /name undef
+endps
+
+defineps PSusertime( | int *milliseconds)
+ usertime milliseconds
+endps
+
+defineps PSversion(int bufsize | char buf[bufsize])
+ version buf
+endps
+
+defineps PSvmreclaim(int code)
+ code vmreclaim
+endps
+
+defineps PSvmstatus( | int *level, *used, *maximum)
+ vmstatus maximum used level
+endps
+
diff --git a/nx-X11/lib/dps/pswinops.psw b/nx-X11/lib/dps/pswinops.psw
new file mode 100644
index 000000000..4a6a2db5a
--- /dev/null
+++ b/nx-X11/lib/dps/pswinops.psw
@@ -0,0 +1,66 @@
+/*
+ * pswinops.psw
+ *
+ * (c) Copyright 1988-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+
+defineps PSineofill(float x, y | boolean *b)
+ x y ineofill b
+endps
+
+defineps PSinfill(float x, y | boolean *b)
+ x y infill b
+endps
+
+defineps PSinstroke(float x, y | boolean *b)
+ x y instroke b
+endps
+
+defineps PSinueofill(float x, y; char nums[n]; int n; char ops[l]; int l | boolean *b)
+ x y [(nums) (ops)] inueofill b
+endps
+
+defineps PSinufill(float x, y; char nums[n]; int n; char ops[l]; int l | boolean *b)
+ x y [(nums) (ops)] inufill b
+endps
+
+defineps PSinustroke(float x, y; char nums[n]; int n; char ops[l]; int l | boolean *b)
+ x y [(nums) (ops)] inustroke b
+endps
+
+defineps PSwtranslation( | float *x, *y)
+ wtranslation y x
+endps
+
diff --git a/nx-X11/lib/dps/publictypes.h b/nx-X11/lib/dps/publictypes.h
new file mode 100644
index 000000000..871766e69
--- /dev/null
+++ b/nx-X11/lib/dps/publictypes.h
@@ -0,0 +1,71 @@
+/*
+ * publictypes.h
+ *
+ * (c) Copyright 1984-1994 Adobe Systems Incorporated.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, distribute, and sublicense this software
+ * and its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notices appear in all copies and that
+ * both those copyright notices and this permission notice appear in
+ * supporting documentation and that the name of Adobe Systems Incorporated
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission. No trademark license
+ * to use the Adobe trademarks is hereby granted. If the Adobe trademark
+ * "Display PostScript"(tm) is used to describe this software, its
+ * functionality or for any other purpose, such use shall be limited to a
+ * statement that this software works in conjunction with the Display
+ * PostScript system. Proper trademark attribution to reflect Adobe's
+ * ownership of the trademark shall be given whenever any such reference to
+ * the Display PostScript system is made.
+ *
+ * ADOBE MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THE SOFTWARE FOR
+ * ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
+ * ADOBE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON- INFRINGEMENT OF THIRD PARTY RIGHTS. IN NO EVENT SHALL ADOBE BE LIABLE
+ * TO YOU OR ANY OTHER PARTY FOR ANY SPECIAL, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE, STRICT LIABILITY OR ANY OTHER ACTION ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ADOBE WILL NOT
+ * PROVIDE ANY TRAINING OR OTHER SUPPORT FOR THE SOFTWARE.
+ *
+ * Adobe, PostScript, and Display PostScript are trademarks of Adobe Systems
+ * Incorporated which may be registered in certain jurisdictions
+ *
+ * Author: Adobe Systems Incorporated
+ */
+/* $XFree86: xc/lib/dps/publictypes.h,v 1.2 2000/06/07 22:02:58 tsi Exp $ */
+
+#ifndef PUBLICTYPES_H
+#define PUBLICTYPES_H
+
+/*
+ * Note: for the moment we depend absolutely on an int being the same
+ * as a long int and being at least 32 bits.
+ */
+
+/* Inline Functions */
+
+#undef MIN
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#undef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+/* Declarative Sugar */
+
+/* Type boolean based derived from unsigned int */
+
+typedef unsigned int boolean;
+typedef long int integer;
+
+#define true 1
+#define false 0
+
+/* Generic Pointers */
+
+#include <stddef.h>
+
+#define NIL NULL
+
+#endif /* PUBLICTYPES_H */