aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Gabriel <mike.gabriel@das-netzwerkteam.de>2011-11-19 15:59:26 +0100
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2011-11-19 15:59:26 +0100
commit5e502cbb195be17d5d742295f4a2e6f0c603a8d7 (patch)
treef9e188b59c7e608bc862dd740ecd459c5a83dfc9
parenta48361b11a5abb5a345dac5ec83a8f56c4d50b74 (diff)
parent88dace9a99687840f3fb341f0316cd94399cae9e (diff)
downloadnx-libs-5e502cbb195be17d5d742295f4a2e6f0c603a8d7.tar.gz
nx-libs-5e502cbb195be17d5d742295f4a2e6f0c603a8d7.tar.bz2
nx-libs-5e502cbb195be17d5d742295f4a2e6f0c603a8d7.zip
Merge branch 'nxcompext'
-rw-r--r--nxcompext/Alpha.c42
-rw-r--r--nxcompext/Alpha.h37
-rw-r--r--nxcompext/Bitmap.c112
-rw-r--r--nxcompext/Bitmap.h36
-rw-r--r--nxcompext/CHANGELOG806
-rw-r--r--nxcompext/COPYING339
-rw-r--r--nxcompext/Clean.c341
-rw-r--r--nxcompext/Clean.h36
-rw-r--r--nxcompext/Colormap.c42
-rw-r--r--nxcompext/Colormap.h37
-rw-r--r--nxcompext/Jpeg.c472
-rw-r--r--nxcompext/Jpeg.h38
-rw-r--r--nxcompext/LICENSE21
-rw-r--r--nxcompext/Makefile.in162
-rw-r--r--nxcompext/Mask.c794
-rw-r--r--nxcompext/Mask.h40
-rw-r--r--nxcompext/NXlib.c4770
-rw-r--r--nxcompext/NXlib.h904
-rw-r--r--nxcompext/NXlibint.h31
-rw-r--r--nxcompext/Pgn.c722
-rw-r--r--nxcompext/Pgn.h68
-rw-r--r--nxcompext/README15
-rw-r--r--nxcompext/Rgb.c43
-rw-r--r--nxcompext/Rgb.h36
-rw-r--r--nxcompext/Rle.c43
-rw-r--r--nxcompext/Rle.h36
-rw-r--r--nxcompext/VERSION1
-rw-r--r--nxcompext/Z.c301
-rw-r--r--nxcompext/Z.h52
-rwxr-xr-xnxcompext/configure5618
-rw-r--r--nxcompext/configure.in249
-rwxr-xr-xnxcompext/install-sh238
-rwxr-xr-xnxcompext/mkinstalldirs34
33 files changed, 16516 insertions, 0 deletions
diff --git a/nxcompext/Alpha.c b/nxcompext/Alpha.c
new file mode 100644
index 000000000..bba191fa9
--- /dev/null
+++ b/nxcompext/Alpha.c
@@ -0,0 +1,42 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <zlib.h>
+
+#include "NXlib.h"
+
+#include "Alpha.h"
+#include "Z.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+#define ALPHA_COMPRESSION_LEVEL 1
+#define ALPHA_COMPRESSION_THRESHOLD 32
+#define ALPHA_COMPRESSION_STRATEGY Z_RLE
+
+static int alphaCompressionLevel = ALPHA_COMPRESSION_LEVEL;
+static int alphaCompressionThreshold = ALPHA_COMPRESSION_THRESHOLD;
+static int alphaCompressionStrategy = ALPHA_COMPRESSION_STRATEGY;
+
+char *AlphaCompressData(const char *data, unsigned int size, unsigned int *compressed_size)
+{
+ return ZCompressData(data, size, alphaCompressionThreshold, alphaCompressionLevel,
+ alphaCompressionStrategy, compressed_size);
+}
diff --git a/nxcompext/Alpha.h b/nxcompext/Alpha.h
new file mode 100644
index 000000000..6ae9aee8e
--- /dev/null
+++ b/nxcompext/Alpha.h
@@ -0,0 +1,37 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Alpha_H
+#define Alpha_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char *AlphaCompressData(
+#if NeedFunctionPrototypes
+ const char* /* data */,
+ unsigned int /* size */,
+ unsigned int* /* compressed_size */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Alpha_H */
diff --git a/nxcompext/Bitmap.c b/nxcompext/Bitmap.c
new file mode 100644
index 000000000..725eaacff
--- /dev/null
+++ b/nxcompext/Bitmap.c
@@ -0,0 +1,112 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "NXlib.h"
+
+#include "Bitmap.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+char *BitmapCompressData(XImage *image, unsigned int *size)
+{
+ if (image -> bits_per_pixel != 32)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******BitmapCompressData: Nothing to do with image of [%d] bpp and size [%d].\n",
+ image -> bits_per_pixel, image -> bytes_per_line * image -> height);
+ #endif
+
+ *size = image -> bytes_per_line * image -> height;
+
+ return image -> data;
+ }
+ else
+ {
+ /*
+ * Remove the 4th byte from the bitmap.
+ */
+
+ char *data;
+
+ char *next_src;
+ char *next_dst;
+
+ #ifdef TEST
+
+ if (image -> bytes_per_line != 4 * image -> width)
+ {
+ fprintf(stderr, "******BitmapCompressData: PANIC! Image as [%d] bytes per line with expected [%d].\n",
+ image -> bytes_per_line, 4 * image -> width);
+
+ return NULL;
+ }
+
+ #endif
+
+ *size = image -> width * image -> height * 3;
+
+ data = Xmalloc(*size);
+
+ if (data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******BitmapCompressData: PANIC! Failed to allocate [%d] bytes for the destination.\n",
+ *size);
+ #endif
+
+ *size = image -> bytes_per_line * image -> height;
+
+ return image -> data;
+ }
+
+ next_src = image -> data;
+ next_dst = data;
+
+ if (image -> byte_order == LSBFirst)
+ {
+ while (next_src < image -> data +
+ image -> bytes_per_line * image -> height)
+ {
+ *next_dst++ = *next_src++;
+ *next_dst++ = *next_src++;
+ *next_dst++ = *next_src++;
+
+ next_src++;
+ }
+ }
+ else
+ {
+ while (next_src < image -> data +
+ image -> bytes_per_line * image -> height)
+ {
+ next_src++;
+
+ *next_dst++ = *next_src++;
+ *next_dst++ = *next_src++;
+ *next_dst++ = *next_src++;
+ }
+ }
+
+ return data;
+ }
+}
diff --git a/nxcompext/Bitmap.h b/nxcompext/Bitmap.h
new file mode 100644
index 000000000..974aa426c
--- /dev/null
+++ b/nxcompext/Bitmap.h
@@ -0,0 +1,36 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Bitmap_H
+#define Bitmap_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char *BitmapCompressData(
+#if NeedFunctionPrototypes
+ XImage* /* image */,
+ unsigned int* /* compressed_size */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Bitmap_H */
diff --git a/nxcompext/CHANGELOG b/nxcompext/CHANGELOG
new file mode 100644
index 000000000..941e9b411
--- /dev/null
+++ b/nxcompext/CHANGELOG
@@ -0,0 +1,806 @@
+ChangeLog:
+
+nxcompext-3.5.0-1
+
+- Opened the 3.5.0 branch based on nxcompext-3.4.0-1.
+
+- Updated copyright to year 2011.
+
+nxcompext-3.4.0-1
+
+- Opened the 3.4.0 branch based on nxcompext-3.3.0-4.
+
+- Updated version number.
+
+- Updated copyright to year 2009.
+
+nxcompext-3.3.0-4
+
+- Fixed TR03G02199. The color palette allocated for encoding an image
+ having 256 colors or less was not freed.
+
+nxcompext-3.3.0-3
+
+- Now setting the correct event serial number when sending collect
+ notifies back.
+
+nxcompext-3.3.0-2
+
+- Updated VERSION.
+
+nxcompext-3.3.0-1
+
+- Opened the 3.3.0 branch based on nxcompext-3.2.0-1.
+
+nxcompext-3.2.0-1
+
+- Opened the 3.2.0 branch based on nxcompext-3.1.0-2.
+
+nxcompext-3.1.0-2
+
+- Updated file VERSION to match the current release version.
+
+nxcompext-3.1.0-1
+
+- Opened the 3.1.0 branch based on nxcompext-3.0.0-18.
+
+nxcompext-3.0.0-18
+
+- Removed the remaining debug output.
+
+nxcompext-3.0.0-17
+
+- Changed the copyright notices at the beginning of the files that
+ were referring to NXPROXY to refer to NXCOMPEXT.
+
+nxcompext-3.0.0-16
+
+- Handle the reply failure in NXGetShmemParameters().
+
+nxcompext-3.0.0-15
+
+- Separated the functionalities made available by NXQueryDisplay()
+ in three distinct functions:
+
+ NXDisplayReadable() Query the number of bytes readable from
+ the display connection.
+
+ NXDisplayFlushable() Query the number of the outstanding bytes
+ to flush to the display connection.
+
+ NXDisplayCongestion() Return a value between 0 and 9 indicating
+ the congestion level of the NX transport.
+
+- Renamed NXQueryDisplayError() to NXDisplayError().
+
+nxcompext-3.0.0-14
+
+- Removed support for Rdp, Tight and Hextile packed images encod-
+ ing since they have been made obsolete by the new NX server.
+
+- Changed the copyright attribution from Medialogic to NoMachine.
+
+nxcompext-3.0.0-13
+
+- Allocate 1024 additional bytes for the Jpeg compression, instead
+ of 512, to avoid failures on very tiny images.
+
+- Removed support for the special *PNG_JPEG* pack method.
+
+nxcompext-3.0.0-12
+
+- Implemented the NXEncodeBitmap() method. This is a very simple
+ encoder removing the 4th byte in 32 bits-per-plane images. For
+ the other pixmap depths it simply returns a pointer to the orig-
+ inal image data, saving the copy. This encoding is intended to
+ better leverage the stream compression on low bandwidth links.
+
+- Removed the quality parameter from the RGB/RLE encoding function.
+
+nxcompext-3.0.0-11
+
+- Removed the additional parameter in the call to NXTransFlush().
+
+nxcompext-3.0.0-10
+
+- Moved the _NXRDPGlyph and _NXRDPText declarations from NXlib.h
+ to NXproto.h to force fields to be CARD32.
+
+- Fixed a typo in NXSetDisplayBuffer() that could cause a double
+ free.
+
+- Fixed a compilation error with old GCC versions.
+
+- Removed the warning issued on AMD64 when compiling with the logs
+ enabled.
+
+nxcompext-3.0.0-9
+
+- Added the NXDisplayCongestion query type to NXQueryDisplay(). It
+ returns a value between 0 and 9, with 9 meaning that the link is
+ congested and no further data can be sent.
+
+- Added the NXSetDisplayBuffer() function. It allows the caller to
+ set the display output buffer size at runtime.
+
+- Removed the congestion and synchronization callbacks.
+
+nxcompext-3.0.0-8
+
+- Removed the warnings issued when purging the collected data at
+ display reset.
+
+nxcompext-3.0.0-7
+
+- Added the NXSetDisplayWriteHandler() interface. The function
+ registers a callback that will be invoked every time more data
+ is written to the display socket.
+
+nxcompext-3.0.0-6
+
+- Made NXQueryDisplay() take into account the bytes in the display
+ buffer when queried for the bytes flushable.
+
+nxcompext-3.0.0-5
+
+- Added file COPYING.
+
+nxcompext-3.0.0-4
+
+- Updated copyright notices to the current year.
+
+nxcompext-3.0.0-3
+
+- Imported changes up to nxcompext-2.1.0-4.
+
+- Fixed TR12D01564. Changed configure script to build library with
+ -fPIC option.
+
+- Added 256 byte to the size of Jpeg destination buffer.
+
+nxcompext-3.0.0-2
+
+- Updated the file VERSION.
+
+nxcompext-3.0.0-1
+
+- Opened the 3.0.0 branch based on nxcompext-2.0.0-33.
+
+nxcompext-2.0.0-33
+
+- Placed the inclusion of jpeglib.h after the X includes to fix a
+ possible compilation error.
+
+nxcompext-2.0.0-32
+
+- Avoid to copy the data to the scratch buffer and yield the task
+ of padding the output to _XSend() in the NXPutPackedImage(), NX-
+ SetUnpackAlpha() and NXSetUnpackColormap() requests.
+
+- Added support for the RLE pack method.
+
+nxcompext-2.0.0-31
+
+- The X_NXSetUnpackColormap and X_NXSetUnpackAlpha now carry their
+ data in compressed form. The alpha data is compressed using the
+ ZLIB RLE encoding, while the colormap data is compressed using
+ the default ZLIB deflate.
+
+- Created new message structures to handle the compatibility with
+ the old proxy versions. When connected to an old proxy version
+ the agent should use the NXSetUnpackColormapCompat() and NXSet-
+ UnpackAlpha() interfaces.
+
+nxcompext-2.0.0-30
+
+- Removed the unfriendly warning printed if a client tried to reset
+ the library multiple times.
+
+nxcompext-2.0.0-29
+
+- Made possible to compile even if makedepend is not found.
+
+nxcompext-2.0.0-28
+
+- Added the NXSetDisplaySynchronizationHandler() interface. The NX
+ transport will use the callback to report when the agent can use
+ the available bandwidth to synchronize the X objects that are
+ corrupted or incomplete.
+
+- Bytes from 14 to 24 in the NXGetControlParameters() reply report,
+ respectively, the frame timeout, the ping timeout, the preferred
+ image split mode and the split size threshold.
+
+nxcompext-2.0.0-27
+
+- Changed the image cleanup functions and the Png and Jpeg encoders
+ to be independent from the host endianess.
+
+- Enabled again the image cleanup on big endian machines.
+
+nxcompext-2.0.0-26
+
+- Added the NXAbortSplit() request.
+
+- Added information about the size of the shared memory segment used
+ by the remote proxy in the NXGetShmemParameters() reply.
+
+nxcompext-2.0.0-25
+
+- Renamed the NXGetSplitResource() and NXGetUnpackResource() utili-
+ ties to NXAllocSplit() and NXAllocUnpack(). They can be called
+ with a NXAnyResource parameter to get the first available id or
+ requre a specific resource. From this version the resource must
+ be explicitly reserved. NXFreeUnpack() and NXFreeSplit() check
+ if the resource was allocated and don't do anything if it is not
+ the case. NXAllocSplit() and NXAllocUnpack() return NXNoResource
+ if the resource can't be reserved.
+
+nxcompext-2.0.0-24
+
+- NXFlushDisplay() now verifies whether the XlibDisplayWriting flag
+ is set before flushing the display buffer. in this case, it only
+ flushes the NX link.
+
+nxcompext-2.0.0-23
+
+- Implemented a move-to-front strategy for the image cache, to mi-
+ nimize the number of lookups.
+
+- Fixed the problems imtroduced by the new cache implementation by
+ modifying the memory allocation routines in Jpeg.c and Pgn.c.
+
+- Temporarily fixed the cleanup problems on big-endian machines by
+ skipping the operation.
+
+- Added a NXSetDisplayStatisticsHandler() to let the agent include
+ arbitrary data in the transport statistics. The parameter is a
+ pointer to a pointer to a null terminated string. The pointer is
+ set at the time the handler is registered. The pointed string can
+ be filled by the agent with its statistics data.
+
+nxcompext-2.0.0-22
+
+- The NXCacheFindImage() returns a pointer to the checksum, if the
+ image is found.
+
+- The image cache uses the data passed to NXCacheAddImage() instead
+ of making a copy.
+
+- The Z stream used by the RGB encoder is allocated at initializat-
+ ion and freed at reset.
+
+nxcompext-2.0.0-21
+
+- Removed the reliance on the local byte order in the image cleanup
+ functions.
+
+nxcompext-2.0.0-20
+
+- Added the NXFinishSplit() request. It forces the proxy to comple-
+ tely transfer all the split messages for the given resource, and
+ then notify the agent.
+
+nxcompext-2.0.0-19
+
+- Enabled again the cleanup of images.
+
+- Updated to comply with the new NXTransFlush() interface.
+
+nxcompext-2.0.0-18
+
+- Moved all the declarations in Rgb.c at the beginning of the block
+ to avoid the possible compilation errors with old compilers.
+
+nxcompext-2.0.0-17
+
+- Added a new RGB image encoder. For now the encoder uses a static
+ Z stream to compress the image data in the destination buffer and
+ allows the agent to use the simplest encoding by still separating
+ the alpha channel from the image data. The new encoder can be the
+ the base for implementing color reduction by dithering or a color-
+ mapped translation of the image similar to PNG, but without the
+ PNG overhead and with the colormap being sent to the client using
+ the NXSetUnpackColormap() opcode.
+
+- Created a new NXCleanImage() function that takes a XImage pointer
+ and uses either the CleanXYImage() or the CleanZImage() routines
+ to cleanup the padding bits.
+
+nxcompext-2.0.0-16
+
+- Added a parameter to NXFlushDisplay() to specify what needs to be
+ flushed. The parameter can be one the following values, defined
+ in NXvars.h:
+
+ NXFlushBuffer Only the Xlib buffer is to be flushed.
+
+ NXFlushLink Flush both the Xlib buffer and any pending
+ data encoded by the NX transport.
+
+ NXFlushIdle Inform the NX transport that the agent is
+ idle. This will let the NX transport encode
+ more low-priority data, and then flush the
+ link.
+
+- Ensured that the padding bytes are cleaned when creating a new
+ PNG image. It seems that some images are still missed. This is
+ to be investigated.
+
+nxcompext-2.0.0-15
+
+- Ensured that the packed image cache is recreated only on a size
+ change.
+
+nxcompext-2.0.0-14
+
+- Updated to get the karma delay field from the X_NXGetControlPara-
+ meters reply.
+
+nxcompext-2.0.0-13
+
+- Added the NXSetDisplayPolicy() and NXSetDisplayFlushHandler() in-
+ terfaces. The second function registers a callback that will be
+ invoked by the NX transport when the number of bytes encoded by
+ the proxy exceeds the threshold set for the scheduled write.
+
+- Added the NXFlushDisplay() and NXQueryDisplay() interfaces. They
+ are used to hide the corresponding NX transport functions to the
+ application. NXQueryDisplay() can be called with the NXDisplay-
+ Flushable or NXDisplayReadable parameters, to get, repectively,
+ the number of bytes that are queued to the NX transport and the
+ number of bytes that is possible to read.
+
+- Included the remote proxy version in the NXGetControlParameter()
+ reply.
+
+nxcompext-2.0.0-12
+
+- Added the NXGetSplitResource() and NXGetUnpackResource utilities.
+ These can be used by the client to find out the first unused id
+ available for a split or unpack operation.
+
+- Added the NXFreeSplit() request function. It makes the resource
+ available for the next operation and tells the proxy to destroy
+ all the storage associated to the split.
+
+- Renamed the NXNumberOfConnections constant to NXNumberOfResources.
+
+nxcompext-2.0.0-11
+
+- Changed NXForceDisplayError() to also shut down the NX transport
+ by calling NXTransClose().
+
+- Updated to comply with the new NX function prototypes introduced
+ in nxcomp-2.0.0-31.
+
+nxcompext-2.0.0-10
+
+- NXQueryDisplayError() now checks the predicate function only if
+ the I/O error was not encountered already.
+
+nxcompext-2.0.0-9
+
+- Added the NXSetDisplayErrorPredicate(), NXSetDisplayBlockHand-
+ ler(), NXSetDisplayCongestionHandler(), NXSetLostSequenceHand-
+ ler() interfaces to let the user set the values used internal-
+ ly. All functions return the previous handler. See ChangeLog
+ in nx-X11-2.0.0-16 and nx-X11-2.0.0-17.
+
+- Moved all the internal variables shared between Xlib, nxcompext
+ and the X server in nxcomp. Declarations and function prototypes
+ moved to NXvars.h.
+
+- Some name changes. In particular the NXContinueOnDisplayError()
+ function iss renamed NXHandleDisplayError() and NXDisplayError()
+ is now renamed NXQueryDisplayError(). To verify if the display
+ is valid, NXQueryDisplayError() will now call the _NXDisplayEr-
+ rorPredicate function, or, if the predicate function is not set,
+ will simply check the value of the XlibDisplayIOError flag.
+
+- Removed the NXGetCleanupParameters() and NXGetImageParameters()
+ interfaces and the remaining references to the unused display
+ buffer and image cleanup functions.
+
+- Updated the NoMachine copyright notice to year 2006.
+
+nxcompext-2.0.0-8
+
+- Removed the unused screen parameter from XSetUnpackGeometry().
+
+- NXSetUnpackGeometry() now fails if no visual is provided.
+
+nxcompext-2.0.0-7
+
+- Changed the LICENSE file to state that the software is only made
+ available under the version 2 of the GPL.
+
+- Removed the misplaced DXPC copyright notices from the license.
+ They were copied from NXCOMP but they don't apply in any way to
+ NXCOMPEXT.
+
+nxcompext-2.0.0-6
+
+- Added the NXSetCacheParameters() request. It tells to the local
+ proxy how to handle the X requests, namely if the next requests
+ have to be stored in the memory cache, split in smal data chunks,
+ and in the case of images, saved on disk in the persistent image
+ cache. The request will affect all X messages, including plain
+ and packed images. It can be used to tell the proxy to discard
+ images coming from some selected operations, like GLX or XVideo.
+
+nxcompext-2.0.0-5
+
+- Added the NXGetFontParameters() request and reply. If the proxy
+ has been configured accordingly, the request returns the X font
+ path that can be set by the agent to tunnel the font server con-
+ nections through the NX link.
+
+nxcompext-2.0.0-4
+
+- Initial work on font server tunneling.
+
+nxcompext-2.0.0-3
+
+- Renamed the NXSetExposeEvents request to NXSetExposeParameters.
+
+nxcompext-2.0.0-2
+
+- Modified the configure and the makefiles to support the Cygwin
+ environment.
+
+- Renamed Png.h to Pgn.h to avoid name clashes on Windows.
+
+- The distclean target now removes the autom4te.cache directory.
+
+nxcompext-2.0.0-1
+
+- Opened the 2.0.0 branch based on nxcompext-1.5.0-20.
+
+nxcompext-1.5.0-20
+
+- Removed the code installing a SIGSEGV handler before trying to
+ clean an image in NXCleanImageInPlace().
+
+nxcompext-1.5.0-19
+
+- Added the NXUnsetLibraryPath() function to specify the behaviour
+ of the Popen() in the X server. If the _NXUnsetLibraryPath flag
+ is set, the Popen() will remove the LD_LIBRARY_PATH variable from
+ the environment before running the child process. This will cause
+ the X server to run the process (for example the keyboard initia-
+ lization utilities) by using the native system libraries, instead
+ of the libraries shipped with the NX environment.
+
+nxcompext-1.5.0-18
+
+- Moved the declarations of _NXEnable* and related structures from
+ Xlibint.h to NXlibint.h.
+
+- Use the include files from nx-X11 if the nx-X11/include directory
+ is found. The previous configure checked the presence of nx-X11/
+ exports/include, that might not be built at the time this library
+ is compiled.
+
+nxcompext-1.5.0-17
+
+- Added the -fPIC GCC flag when compiling on AMD64 architectures.
+
+- Removed all warnings when compiling with GCC4.
+
+- Small changes to configure.in to have specific CFLAGS.
+
+- Created a new configure using autoconf 2.59.
+
+nxcompext-1.5.0-16
+
+- Added the 'mode' field in the NXStartSplit() request. It determi-
+ nes the strategy that the proxy will adopt to handle the image.
+ If set to 'eager', the proxy will only split the messages whose
+ size exceeds the split threshold (the threshold can be found in
+ the NXGetControlParameters() reply). If mode is set to lazy, the
+ proxy will split any image that it is not able to find in its
+ cache.
+
+ The opcode and the two available modes are defined in NXproto.h,
+ currently:
+
+ #define NXSplitModeDefault 0
+ #define NXSplitModeEager 1
+ #define NXSplitModeLazy 2
+
+- All requests related to image streaming now carry a 'resource' id.
+ The id is currently ignored by the proxy in the case of NXCommit-
+ Split() requests.
+
+nxcompext-1.5.0-15
+
+- Removed the NXSync() and NXKarma() operations, not used anymore
+ by the NX agents.
+
+- Updated to comply with changes occurred in the numbering of the
+ notification events and in the interface to the image streaming
+ functions.
+
+nxcompext-1.5.0-14
+
+- Accounted for the missing xoffset field in clean-up of XYPixmaps.
+
+nxcompext-1.5.0-13
+
+- Added a 'commit' field in NXCommitSplit(). When zero, the remote
+ proxy will remove the message from the split store, without send-
+ ing the recomposed image to the X server.
+
+nxcompext-1.5.0-12
+
+- Added the NXContinueOnDisplayError() function to specify the be-
+ haviour of the Xlib I/O error handler. If the flag is set to true,
+ Xlib will simply return, instead of quitting the program. This
+ leaves to the application the responsibility of checking the sta-
+ te of the XlibDisplayIOError flag.
+
+- Changed NXDisplayIsValid() to NXDisplayError() and inverted the
+ logic. Now the function returns true if the display pointer is
+ NULL or the XlibDisplayIOError flag is set.
+
+- Added the NXForceDisplayError() function, to shutdown the display
+ descriptor and force Xlib to set the I/O error flag.
+
+nxcompext-1.5.0-11
+
+- Added -I../nx-X11/exports/include to CCINCLUDES in Makefile.in.
+
+nxcompext-1.5.0-10
+
+- Added FindLSB() to replace ffs() that may be not present on some
+ systems.
+
+- Some cosmetic changes.
+
+nxcompext-1.5.0-9
+
+- Fixed a printf() that prevented the code to compile if TEST was
+ enabled.
+
+nxcompext-1.5.0-8
+
+- Implemented the NXLib interface for asynchronous handling of the
+ XGetInputFocus requests and replies.
+
+nxcompext-1.5.0-7
+
+- Removed the _NXFlushSize parameter. New agents run the NX trans-
+ port in-process, so we don't get any benefit from increasing the
+ display buffer size.
+
+nxcompext-1.5.0-6
+
+- Added a NXDisplayIsValid() to check that the display is not NULL
+ and that the descriptor was not shut down after an IOError. The
+ reason a function is needed for this is that the flags field is
+ only in Xlibint and it is not visible to Xlib applications.
+
+nxcompext-1.5.0-5
+
+- Added the NXGetCollect*Resource utility functions, returning the
+ first available small integer resource id that can be used in a
+ subsequent collect request.
+
+nxcompext-1.5.0-4
+
+- Added the NXNumberOfConnections constant.
+
+nxcompext-1.5.0-3
+
+- Implemented the NXLib interface for the asynchronous handling of
+ the XGrabPointer requests and replies.
+
+- Solved an error in image cleaning that prevented the 8 bits-per-
+ pixel images to be completely cleaned. Due to the bug, only half
+ of the total lines were cleaned.
+
+- Removed a bug that prevented the cleaning of XYPixmaps images of
+ bitmap unit 32 and byte order LSB.
+
+- Renamed the NXImageCache variables to show they are global. They
+ are currently used in the nxagent code.
+
+nxcompext-1.5.0-2
+
+- Changed VERSION file.
+
+nxcompext-1.5.0-1
+
+- Opened the 1.5.0 branch.
+
+nxcompext-1.4.1-1
+
+- Removed the configure option --with-static. There are two options
+ now, --with-static-png and --with-static-jpeg, to offer a greater
+ degree of control on the resulting library.
+
+- This version differs from the 1.4.0-3-KRY1 in the way that the con-
+ figure script is generated by GNU Autoconf 2.57, the same version
+ used for nxcomp.
+
+- Opened the 1.4.1 branch.
+
+nxcompext-1.4.0-3
+
+- Updated the VERSION file to reflect the 1.4.0 status.
+
+nxcompext-1.4.0-2
+
+- Imported changes from the latest 1.3.2 development branch.
+
+- The 1.4.0 branch already had a 1.4.0-1 version. The changes from
+ the 1.4.0-1 were up to date with the 1.3.2-2 version.
+
+nxcompext-1.3.2-6
+
+- Fixed problem with icons in KDE and Mozilla on SPARC Solaris. The
+ problem was related to cleaning of one-bit XYPixmaps on big-endian
+ hosts, where shift of the cleaning mask executed in the wrong di-
+ rection.
+
+nxcompext-1.3.2-5
+
+- Changes in Clean.c to compile on Solaris.
+
+nxcompext-1.3.2-4
+
+- Fixed a bug in clean image procedures for 1bit XYPixmaps. The bug
+ caused Mozilla to trash some transparent icons in web pages and
+ the toolbar.
+
+- Added cleaning of the padding bytes at the end of the data chunk
+ inside XImage structure
+
+- Implemented handling of SIGSEGV during cleanup in case of static
+ data.
+
+- Moved image cleanup and masking code in new Clean.c and Mask.c
+ sources.
+
+- Corrected few typos in NXCollectImage code.
+
+nxcompext-1.3.2-2
+
+- Imported 1.4.0-1 changes from the 1.4.0 development branch.
+
+- Modified NXAllocColors to handle errors generated allocating
+ each requested color. A per-color result code is now returned
+ to the caller.
+
+- Code cleanup in Png.h and Png.c.
+
+nxcompext-1.3.2-1
+
+- Opened the 1.3.2 branch.
+
+nxcompext-1.3.1-2
+
+- Removed the underline characters and added a colon in the
+ title of this ChangeLog to fully comply with format used in
+ the release notices.
+
+nxcompext-1.3.1-1
+
+- Opened the 1.3.1 branch.
+
+nxcompext-1.3.0-18
+
+- Added the _NXLostSequenceHandler function to let NX agents
+ suppress the error message and modify the default Xlib
+ behaviour when out-of-order sequence numbers are received.
+ Pointer to function is assigned to _NXLostSequenceFunction
+ in XlibInt.c.
+
+- Original output buffer size in stock XFree86 is 2048. We try
+ to reduce context switches and help stream compression by
+ increasing the maximum size of the buffer 8192. _NXFlushSize
+ determines when the display buffer is actually flushed. It is
+ set by default to 4096 in XlibInt.c and set to 0 to use the
+ maximum available size at the time NXGetControlParameters()
+ is called.
+
+nxcompext-1.3.0-17
+
+- In handling of asynchronous GetProperty replies a warning
+ message was printed in session log when a null property was
+ stored in the state structure. This message is now printed
+ only if TEST is defined.
+
+nxcompext-1.3.0-16
+
+- Added asynchronous handling of GetProperty request and reply
+ by means of the NXCollectProperty and NXGetCollectedProperty
+ requests and the NXCollectPropertyNotify event.
+
+nxcompext-1.3.0-15
+
+- Added 4 new fields to the X_NXGetControlParameters reply.
+
+nxcompext-1.3.0-14
+
+- Added request X_NXFreeUnpack to free the resources allocated
+ by the remote proxy to unpack images for the given agent's
+ client
+
+nxcompext-1.3.0-13
+
+- Modified the following requests to carry the id of the
+ agent's client in the field resource:
+
+ - X_NXSetUnpackGeometry
+ - X_NXSetUnpackColormap
+ - X_NXSetUnpackAlpha
+ - X_NXPutPackedImage
+
+nxcompext-1.3.0-11
+
+- Modified the MIT-SHM initialization procedure to always send
+ all the 3 protocol requests also in the case of early failures.
+
+nxcompext-1.3.0-10
+
+- Added handling of X_NXSetUnpackAlpha request.
+
+- It has been made possible to send both X_NXSetUnpackColormap
+ and X_NXSetUnpackAlpha messages with 0 entries to temporarily
+ disable use of the colormap or the alpha channel and free the
+ resources allocated by the remote proxy.
+
+nxcompext-1.3.0-9
+
+- Solved a compatibility problem when mixing proxy versions
+ 1.2.2 and 1.3.0 due to the missing X_NXGetShmemParameters
+ request.
+
+nxcompext-1.3.0-7
+
+- Reduced the number of requests needed to setup the shared
+ segment at X server proxy from 4 to 3.
+
+- Small changes to the shared memory interface to support
+ path X agent to X client proxy.
+
+nxcompext-1.3.0-6
+
+- Implemented initial support for MIT-SHM extension in the
+ network path between the X server proxy and the real X
+ server.
+
+- Configure script now checks for the FreeBSD environment.
+
+- New configure script generated using autoconf-2.57-3.
+
+- Removed the XFree86 CCDEFINES from Makefile.in.
+
+nxcompext-1.3.0-5
+
+- Cosmetic changes.
+
+- Started to convert configure.in to the new layout adopted
+ for nxcomp.
+
+- Created file CHANGELOG.
+
+nxcompext-1.3.0-4
+
+- More fixes in image clean-up.
+
+nxcompext-1.3.0-3
+
+- Many fixes in image clean-up functions to handle differences
+ in endianess between client and X server.
+
+nxcompext-1.3.0-2
+
+- Modified configure.in to compile under Solaris.
+
+nxcompext-1.3.0-1
+
+- First 1.3.0 version based on nxcompext-1.2.2-12.
+
diff --git a/nxcompext/COPYING b/nxcompext/COPYING
new file mode 100644
index 000000000..d511905c1
--- /dev/null
+++ b/nxcompext/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/nxcompext/Clean.c b/nxcompext/Clean.c
new file mode 100644
index 000000000..cc022004f
--- /dev/null
+++ b/nxcompext/Clean.c
@@ -0,0 +1,341 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <stdio.h>
+#include <signal.h>
+
+#include "os.h"
+
+#include "NXlib.h"
+
+#include "Clean.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+int CleanXYImage(XImage *image)
+{
+ int i, j, k, plane;
+
+ int bitsToClean = (image -> bytes_per_line << 3) - image -> width - image -> xoffset;
+
+ unsigned int bytesToClean = bitsToClean >> 3;
+
+ bitsToClean &= 7;
+
+ for (k = 0; k < image -> depth; k++)
+ {
+ plane = k * (image -> bytes_per_line * image -> height);
+
+ for (i = 1; i <= image -> height; i++)
+ {
+ if (image -> byte_order == image -> bitmap_bit_order)
+ {
+ for (j = 1; j <= bytesToClean; j++)
+ {
+ image -> data[plane + i * (image -> bytes_per_line) - j] = 0x00;
+ }
+ }
+ else
+ {
+ for (j = bytesToClean; j >= 1; j--)
+ {
+ image -> data[plane + i * (image -> bytes_per_line) - j] = 0x00;
+ }
+ }
+
+ if (image -> bitmap_bit_order == MSBFirst)
+ {
+ image -> data[plane + i * (image -> bytes_per_line) - j] &= 0xff << bitsToClean;
+ }
+ else
+ {
+ image -> data[plane + i * (image -> bytes_per_line) - j] &= 0xff >> bitsToClean;
+ }
+ }
+ }
+
+ return 1;
+}
+
+int CleanZImage(XImage *image)
+{
+ unsigned int bytesToClean;
+ unsigned int j;
+ unsigned int imageLength;
+
+ #ifdef TEST
+ fprintf(stderr, "*****CleanZImage: Going to clean image of [%d] bits per pixel.\n",
+ image -> bits_per_pixel);
+ #endif
+
+ switch (image -> bits_per_pixel)
+ {
+ case 32:
+ {
+ /*
+ * The caller should pay attention at extracting
+ * the alpha channel prior to cleaning the image.
+ * Cleaning an image which is carrying the alpha
+ * channel will result in the image being treated
+ * as fully transparent.
+ */
+
+ register int i;
+
+ bytesToClean = image -> bytes_per_line * image -> height;
+
+ #ifdef DEBUG
+ fprintf(stderr, "*****CleanZImage: Cleaning [%d] bytes with bits per pixel [%d] "
+ "width [%d] bytes per line [%d] height [%d].\n", bytesToClean,
+ image -> bits_per_pixel, image -> width, image ->
+ bytes_per_line, image -> height);
+ #endif
+
+ if (image -> byte_order == LSBFirst)
+ {
+ for (i = 3; i < bytesToClean; i += 4)
+ {
+ ((unsigned char *) image -> data)[i] = 0x00;
+ }
+ }
+ else
+ {
+ for (i = 0; i < bytesToClean; i += 4)
+ {
+ ((unsigned char *) image -> data)[i] = 0x00;
+ }
+ }
+
+ break;
+ }
+ case 24:
+ case 15:
+ case 16:
+ case 8:
+ {
+ register int i, j;
+
+ bytesToClean = image -> bytes_per_line -
+ ((image -> width * image -> bits_per_pixel) >> 3);
+
+ for (i = 1; i <= image -> height; i++)
+ {
+ for (j = bytesToClean; j > 0; j--)
+ {
+ ((unsigned char *) image -> data)[(i * image -> bytes_per_line) - j] = 0x00;
+ }
+ }
+
+ break;
+ }
+ default:
+ {
+ #ifdef PANIC
+ fprintf(stderr, "*****CleanZImage: PANIC! Cannot clean image with [%d] bits per pixel.\n",
+ image -> bits_per_pixel);
+ #endif
+ }
+ }
+
+ /*
+ * Clean the padding bytes at the real
+ * end of the buffer.
+ */
+
+ imageLength = image -> bytes_per_line * image -> height;
+
+ bytesToClean = imageLength % 4;
+
+ for (j = 0; j < bytesToClean; j++)
+ {
+ ((unsigned char *)image -> data)[(imageLength + j)] = 0x00;
+ }
+
+ return 1;
+}
+
+/*
+ * Copy a clean version of src_image into dst_image.
+ * This code is not taking care of the image format.
+ * The agent doesn't use it and you have to consider
+ * it unsupported.
+ */
+
+int CopyAndCleanImage(XImage *src_image, XImage *dst_image)
+{
+ register long data_size;
+ register int i;
+
+ data_size = (src_image -> bytes_per_line * src_image -> height) >> 2;
+
+ #ifdef WARNING
+ fprintf(stderr, "******CleanImage: WARNING! Function called with image of [%d] bits per pixel.\n",
+ src_image -> bits_per_pixel);
+ #endif
+
+ switch (src_image -> bits_per_pixel)
+ {
+ case 32:
+ {
+ unsigned int mask;
+
+ if (src_image -> byte_order == MSBFirst)
+ {
+ mask = 0xffffff00;
+ }
+ else
+ {
+ mask = 0x00ffffff;
+ }
+ for (i = 0; i < data_size; i++)
+ {
+ ((unsigned int *)dst_image -> data)[i] = ((unsigned int *)src_image -> data)[i] & mask;
+ }
+
+ break;
+ }
+
+ case 24:
+ {
+ unsigned int bytes_to_clean;
+
+ for (i = 0; i < data_size; i++)
+ {
+ ((unsigned int *)dst_image -> data)[i] = ((unsigned int *)src_image -> data)[i];
+ }
+
+ bytes_to_clean = dst_image -> bytes_per_line - ((dst_image -> width *
+ dst_image -> bits_per_pixel) >> 3);
+
+ if (bytes_to_clean)
+ {
+ register unsigned int mask = 0xffffffff;
+ register int line_size;
+ register int i;
+
+ line_size = dst_image -> bytes_per_line >> 2;
+
+ if (dst_image -> byte_order == MSBFirst)
+ {
+ mask = mask << (bytes_to_clean << 3);
+ }
+ else
+ {
+ mask = mask >> (bytes_to_clean << 3);
+ }
+
+ for (i = 0; i < dst_image -> height;)
+ {
+ ((unsigned char *)dst_image -> data)[(++i * line_size) -1] &= mask;
+ }
+ }
+
+ break;
+ }
+
+ case 15:
+ case 16:
+ {
+ for (i = 0; i < data_size; i++)
+ {
+ ((unsigned int *) dst_image -> data)[i] = ((unsigned int *) src_image -> data)[i];
+ }
+
+ if (src_image -> width & 0x00000001)
+ {
+ int card32_per_line = dst_image -> bytes_per_line >> 2;
+
+ for (i = 0; i < dst_image -> height;)
+ {
+ ((unsigned int *) dst_image -> data)[(++i * card32_per_line) -1] &= 0x0000ffff;
+ }
+ }
+
+ break;
+ }
+
+ case 8:
+ {
+ unsigned int mask = 0x00000000;
+
+ switch (dst_image -> width % 4)
+ {
+ case 3:
+ {
+ mask = 0x00ffffff;
+
+ break;
+ }
+ case 2:
+ {
+ mask = 0x0000ffff;
+
+ break;
+ }
+ case 1:
+ {
+ mask = 0x000000ff;
+
+ break;
+ }
+ default:
+ {
+ /*
+ * Nothing to clean.
+ */
+
+ break;
+ }
+ }
+
+ for (i = 0; i < data_size; i++)
+ {
+ ((unsigned int *) dst_image -> data)[i] = ((unsigned int *) src_image -> data)[i];
+ }
+
+ if (mask)
+ {
+ int card32_per_line;
+ int i;
+
+ card32_per_line = dst_image -> bytes_per_line >> 2;
+
+ for (i = 0; i < dst_image -> height; i++)
+ {
+ ((unsigned int *) dst_image -> data)[(++i * card32_per_line) -1] &= mask;
+ }
+ }
+
+ break;
+ }
+
+ default:
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******CleanImage: PANIC! Cannot clean image of [%d] bits per pixel.\n",
+ src_image -> bits_per_pixel);
+ #endif
+
+ return 0;
+ }
+ }
+
+ return 1;
+}
diff --git a/nxcompext/Clean.h b/nxcompext/Clean.h
new file mode 100644
index 000000000..ba2a62dc4
--- /dev/null
+++ b/nxcompext/Clean.h
@@ -0,0 +1,36 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Clean_H
+#define Clean_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "Xlib.h"
+
+int CleanXYImage(XImage *image);
+int CleanZImage(XImage *image);
+
+int CopyAndCleanImage(XImage *src_image, XImage *dst_image);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Clean_H */
diff --git a/nxcompext/Colormap.c b/nxcompext/Colormap.c
new file mode 100644
index 000000000..2e169edab
--- /dev/null
+++ b/nxcompext/Colormap.c
@@ -0,0 +1,42 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <zlib.h>
+
+#include "NXlib.h"
+
+#include "Colormap.h"
+#include "Z.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+#define COLORMAP_COMPRESSION_LEVEL 4
+#define COLORMAP_COMPRESSION_THRESHOLD 32
+#define COLORMAP_COMPRESSION_STRATEGY Z_DEFAULT_STRATEGY
+
+static int colormapCompressionLevel = COLORMAP_COMPRESSION_LEVEL;
+static int colormapCompressionThreshold = COLORMAP_COMPRESSION_THRESHOLD;
+static int colormapCompressionStrategy = COLORMAP_COMPRESSION_STRATEGY;
+
+char *ColormapCompressData(const char *data, unsigned int size, unsigned int *compressed_size)
+{
+ return ZCompressData(data, size, colormapCompressionThreshold, colormapCompressionLevel,
+ colormapCompressionStrategy, compressed_size);
+}
diff --git a/nxcompext/Colormap.h b/nxcompext/Colormap.h
new file mode 100644
index 000000000..42eff34a4
--- /dev/null
+++ b/nxcompext/Colormap.h
@@ -0,0 +1,37 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Colormap_H
+#define Colormap_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char *ColormapCompressData(
+#if NeedFunctionPrototypes
+ const char* /* data */,
+ unsigned int /* size */,
+ unsigned int* /* compressed_size */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Colormap_H */
diff --git a/nxcompext/Jpeg.c b/nxcompext/Jpeg.c
new file mode 100644
index 000000000..cb854bc6c
--- /dev/null
+++ b/nxcompext/Jpeg.c
@@ -0,0 +1,472 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "X11/X.h"
+#include "X11/Xlib.h"
+#include "X11/Xmd.h"
+
+#include <jpeglib.h>
+
+#include "NXlib.h"
+
+#include "Mask.h"
+#include "Jpeg.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+#define JPEG_DEST_SIZE(width, height) ((width) * 3 * (height) + 1024)
+
+/*
+ * Local function prototypes.
+ */
+
+static void PrepareRowForJpeg(CARD8 *dst, int y, int count);
+static void PrepareRowForJpeg24(CARD8 *dst, int y, int count);
+static void PrepareRowForJpeg16(CARD8 *dst, int y, int count);
+static void PrepareRowForJpeg32(CARD8 *dst, int y, int count);
+
+static int JpegEmptyOutputBuffer(j_compress_ptr cinfo);
+
+static void JpegInitDestination(j_compress_ptr cinfo);
+static void JpegTermDestination(j_compress_ptr cinfo);
+static void JpegSetDstManager(j_compress_ptr cinfo);
+
+/*
+ * Quality levels.
+ */
+
+static int jpegQuality[10] = {20, 30, 40, 50, 55, 60, 65, 70, 75, 80};
+
+/*
+ * Image characteristics.
+ */
+
+static int bytesPerLine;
+
+static CARD8 bitsPerPixel;
+static CARD16 redMax, greenMax, blueMax;
+static CARD8 redShift, greenShift, blueShift;
+static int byteOrder;
+
+/*
+ * Other variables used for the Jpeg
+ * encoding.
+ */
+
+static char *jpegBeforeBuf = NULL;
+static char *jpegCompBuf;
+static int jpegCompBufSize;
+static int jpegError;
+static int jpegDstDataLen;
+
+static struct jpeg_destination_mgr jpegDstManager;
+
+/*
+ * Just for debugging purpose.
+ */
+
+#ifdef DEBUG
+
+static int jpegId;
+static char jpegName[10];
+static FILE *jpegFile;
+
+#endif
+
+/*
+ * Function declarations
+ */
+
+char *JpegCompressData(XImage *image, int level, int *compressed_size)
+{
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+
+ CARD8 *srcBuf;
+ JSAMPROW rowPointer[1];
+
+ int dy, w, h;
+
+ *compressed_size = 0;
+
+ /*
+ * Initialize the image stuff
+ */
+
+ bitsPerPixel = image -> bits_per_pixel;
+ bytesPerLine = image -> bytes_per_line;
+ byteOrder = image -> byte_order;
+
+ #ifdef TEST
+ fprintf(stderr, "******JpegCompressData: Image byte order [%d] bitmap bit order [%d].\n",
+ image -> byte_order, image -> bitmap_bit_order);
+
+ fprintf(stderr, "******JpegCompressData: Bits per pixel [%d] bytes per line [%d].\n",
+ bitsPerPixel, bytesPerLine);
+ #endif
+
+ redShift = FindLSB(image -> red_mask) - 1;
+ greenShift = FindLSB(image -> green_mask) - 1;
+ blueShift = FindLSB(image -> blue_mask) - 1;
+
+ #ifdef TEST
+ fprintf(stderr, "******JpegCompressData: Red mask [0x%lx] green mask [0x%lx] blue mask [0x%lx].\n",
+ image -> red_mask, image -> green_mask, image -> blue_mask);
+
+ fprintf(stderr, "******JpegCompressData: Red shift [%d] green shift [%d] blue shift [%d].\n",
+ redShift, greenShift, blueShift);
+ #endif
+
+ redMax = image -> red_mask >> redShift;
+ greenMax = image -> green_mask >> greenShift;
+ blueMax = image -> blue_mask >> blueShift;
+
+ #ifdef TEST
+ fprintf(stderr, "******JpegCompressData: Red max [0x%x] green max [0x%x] blue max [0x%x].\n",
+ redMax, greenMax, blueMax);
+ #endif
+
+ w = image -> width;
+ h = image -> height;
+
+ jpegBeforeBuf = image -> data;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******JpegCompressData: Width [%d] height [%d] level [%d].\n",
+ w, h, level);
+ #endif
+
+ if (bitsPerPixel == 1 ||
+ bitsPerPixel == 8)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******JpegCompressData: PANIC! Invalid bits per pixel [%d].\n",
+ bitsPerPixel);
+ #endif
+
+ return NULL;
+ }
+
+ /*
+ * Allocate space for one line of the
+ * resulting image, 3 bytes per pixel.
+ */
+
+ #ifdef DEBUG
+ fprintf(stderr, "******JpegCompressData: Allocating [%d] bytes for the scanline.\n",
+ w * 3);
+ #endif
+
+ srcBuf = (CARD8 *) malloc(w * 3);
+
+ if (srcBuf == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******JpegCompressData: PANIC! Cannot allocate [%d] bytes.\n",
+ w * 3);
+ #endif
+
+ return NULL;
+ }
+
+ rowPointer[0] = srcBuf;
+
+ cinfo.err = jpeg_std_error(&jerr);
+
+ jpeg_create_compress(&cinfo);
+
+ cinfo.image_width = w;
+ cinfo.image_height = h;
+ cinfo.input_components = 3;
+ cinfo.in_color_space = JCS_RGB;
+
+ jpeg_set_defaults(&cinfo);
+ jpeg_set_quality(&cinfo, jpegQuality[level], 1);
+
+ /*
+ * Allocate memory for the destination
+ * buffer.
+ */
+
+ jpegCompBufSize = JPEG_DEST_SIZE(w, h);
+
+ #ifdef TEST
+ fprintf(stderr, "******JpegCompressData: Allocating [%d] bytes for the destination data.\n",
+ jpegCompBufSize);
+ #endif
+
+ jpegCompBuf = malloc(jpegCompBufSize);
+
+ if (jpegCompBuf == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******JpegCompressData: PANIC! Error allocating [%d] bytes for the Jpeg data.\n",
+ jpegCompBufSize);
+ #endif
+
+ return NULL;
+ }
+
+ JpegSetDstManager(&cinfo);
+
+ jpeg_start_compress(&cinfo, 1);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******JpegCompressedData: Initialization finished.\n");
+ #endif
+
+ for (dy = 0; dy < h; dy++)
+ {
+ PrepareRowForJpeg(srcBuf, dy, w);
+
+ jpeg_write_scanlines(&cinfo, rowPointer, 1);
+
+ if (jpegError != 0)
+ {
+ break;
+ }
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******JpegCompressedData: Compression finished. Lines handled [%d,%d]. Error is [%d].\n",
+ dy, h, jpegError);
+ #endif
+
+ if (jpegError == 0)
+ {
+ jpeg_finish_compress(&cinfo);
+ }
+
+ jpeg_destroy_compress(&cinfo);
+
+ free((char *) srcBuf);
+
+ if (jpegError != 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******JpegCompressedData: PANIC! Compression failed. Error is [%d].\n",
+ jpegError);
+ #endif
+
+ free(jpegCompBuf);
+
+ return NULL;
+ }
+
+ /*
+ * Check the size of the resulting data.
+ */
+
+ if (jpegDstDataLen > 0)
+ {
+ /*
+ * Save the image on disk to help with
+ * the debug.
+ */
+
+ #ifdef DEBUG
+
+ int i = 0;
+
+ fprintf(stderr, "******JpegCompressedData: Compressed size [%d].\n",
+ jpegDstDataLen);
+
+ jpegId++;
+
+ sprintf(jpegName, "jpeg%d", jpegId);
+
+ jpegFile = fopen(jpegName, "w");
+
+ for (i = 0; i < jpegDstDataLen; i++)
+ {
+ fprintf(jpegFile, "%c", *(jpegCompBuf + i));
+ }
+
+ fclose(jpegFile);
+
+ #endif
+
+ *compressed_size = jpegDstDataLen;
+
+ return jpegCompBuf;
+ }
+ else
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******JpegCompressedData: PANIC! Invalid size of the compressed data [%d].\n",
+ jpegDstDataLen);
+ #endif
+
+ free(jpegCompBuf);
+
+ return NULL;
+ }
+}
+
+void PrepareRowForJpeg(CARD8 *dst, int y, int count)
+{
+ if (bitsPerPixel == 32)
+ {
+ if (redMax == 0xff &&
+ greenMax == 0xff &&
+ blueMax == 0xff)
+ {
+ PrepareRowForJpeg24(dst, y, count);
+ }
+ else
+ {
+ PrepareRowForJpeg32(dst, y, count);
+ }
+ }
+ else if (bitsPerPixel == 24)
+ {
+ memcpy(dst, jpegBeforeBuf + y * bytesPerLine, count * 3);
+ }
+ else
+ {
+ /*
+ * 16 bpp assumed.
+ */
+
+ PrepareRowForJpeg16(dst, y, count);
+ }
+}
+
+void PrepareRowForJpeg24(CARD8 *dst, int y, int count)
+{
+ CARD8 *fbptr;
+ CARD32 pix;
+
+ fbptr = (CARD8 *) (jpegBeforeBuf + y * bytesPerLine);
+
+ while (count--)
+ {
+ if (byteOrder == LSBFirst)
+ {
+ pix = (CARD32) *(fbptr + 2);
+ pix = (pix << 8) | (CARD32) *(fbptr+1);
+ pix = (pix << 8) | (CARD32) *fbptr;
+ }
+ else
+ {
+ pix = (CARD32) *(fbptr + 1);
+ pix = (pix << 8) | (CARD32) *(fbptr + 2);
+ pix = (pix << 8) | (CARD32) *(fbptr + 3);
+ }
+
+ *dst++ = (CARD8)(pix >> redShift);
+ *dst++ = (CARD8)(pix >> greenShift);
+ *dst++ = (CARD8)(pix >> blueShift);
+
+ fbptr+=4;
+ }
+}
+
+#define DEFINE_JPEG_GET_ROW_FUNCTION(bpp) \
+ \
+void PrepareRowForJpeg##bpp(CARD8 *dst, int y, int count) \
+{ \
+ CARD8 *fbptr; \
+ CARD##bpp pix; \
+ int inRed, inGreen, inBlue; \
+ int i; \
+ \
+ fbptr = (CARD8 *) (jpegBeforeBuf + y * bytesPerLine); \
+ \
+ while (count--) \
+ { \
+ pix = 0; \
+ \
+ if (byteOrder == LSBFirst) \
+ { \
+ for (i = (bpp >> 3) - 1; i >= 0; i--) \
+ { \
+ pix = (pix << 8) | (CARD32) *(fbptr + i); \
+ } \
+ } \
+ else \
+ { \
+ for (i = 0; i < (bpp >> 3); i++) \
+ { \
+ pix = (pix << 8) | (CARD32) *(fbptr + i); \
+ } \
+ } \
+ \
+ fbptr += bpp >> 3; \
+ \
+ inRed = (int) \
+ (pix >> redShift & redMax); \
+ inGreen = (int) \
+ (pix >> greenShift & greenMax); \
+ inBlue = (int) \
+ (pix >> blueShift & blueMax); \
+ \
+ *dst++ = (CARD8)((inRed * 255 + redMax / 2) / \
+ redMax); \
+ *dst++ = (CARD8)((inGreen * 255 + greenMax / 2) / \
+ greenMax); \
+ *dst++ = (CARD8)((inBlue * 255 + blueMax / 2) / \
+ blueMax); \
+ } \
+}
+
+DEFINE_JPEG_GET_ROW_FUNCTION(16)
+DEFINE_JPEG_GET_ROW_FUNCTION(32)
+
+/*
+ * Destination manager implementation for JPEG library.
+ */
+
+void JpegInitDestination(j_compress_ptr cinfo)
+{
+ jpegError = 0;
+
+ jpegDstManager.next_output_byte = (JOCTET *) jpegCompBuf;
+ jpegDstManager.free_in_buffer = (size_t) jpegCompBufSize;
+}
+
+int JpegEmptyOutputBuffer(j_compress_ptr cinfo)
+{
+ jpegError = 1;
+
+ jpegDstManager.next_output_byte = (JOCTET *) jpegCompBuf;
+ jpegDstManager.free_in_buffer = (size_t) jpegCompBufSize;
+
+ return 1;
+}
+
+void JpegTermDestination(j_compress_ptr cinfo)
+{
+ jpegDstDataLen = jpegCompBufSize - jpegDstManager.free_in_buffer;
+}
+
+void JpegSetDstManager(j_compress_ptr cinfo)
+{
+ jpegDstManager.init_destination = JpegInitDestination;
+ jpegDstManager.empty_output_buffer = JpegEmptyOutputBuffer;
+ jpegDstManager.term_destination = JpegTermDestination;
+
+ cinfo -> dest = &jpegDstManager;
+}
+
diff --git a/nxcompext/Jpeg.h b/nxcompext/Jpeg.h
new file mode 100644
index 000000000..87740df6d
--- /dev/null
+++ b/nxcompext/Jpeg.h
@@ -0,0 +1,38 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Jpeg_H
+#define Jpeg_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char *JpegCompressData(
+#if NeedFunctionPrototypes
+ XImage* /* image */,
+ int /* level */,
+ int* /* compressed_size */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Jpeg_H */
+
diff --git a/nxcompext/LICENSE b/nxcompext/LICENSE
new file mode 100644
index 000000000..12eb6576c
--- /dev/null
+++ b/nxcompext/LICENSE
@@ -0,0 +1,21 @@
+Copyright (c) 2001, 2009 NoMachine - http://www.nomachine.com/.
+
+NXCOMPEXT library and NX extensions to X are copyright of NoMachine.
+Redistribution and use of this software is allowed according to the
+following terms:
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License Version 2, and
+not any other version, as published by the Free Software Foundation.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTA-
+BILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, you can request a copy to NoMachine
+or write to the Free Software Foundation, Inc., 59 Temple Place,
+Suite 330, Boston, MA 02111-1307 USA
+
+All rights reserved.
diff --git a/nxcompext/Makefile.in b/nxcompext/Makefile.in
new file mode 100644
index 000000000..cdf0b1cd9
--- /dev/null
+++ b/nxcompext/Makefile.in
@@ -0,0 +1,162 @@
+############################################################################
+# #
+# Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com. #
+# #
+# NXCOMPEXT, NX protocol compression and NX extensions to this software #
+# are copyright of NoMachine. Redistribution and use of the present #
+# software is allowed according to terms specified in the file LICENSE #
+# which comes in the source distribution. #
+# #
+# Check http://www.nomachine.com/licensing.html for applicability. #
+# #
+# NX and NoMachine are trademarks of NoMachine S.r.l. #
+# #
+# All rights reserved. #
+# #
+############################################################################
+
+#
+# Get values from configure script.
+#
+
+VERSION=@VERSION@
+LIBVERSION=@LIBVERSION@
+
+#
+# We want to enable really all warnings. -Wredundant-decls,
+# though, gives a warning caused by pthread.h and unistd.h.
+#
+
+CXX = @CXX@
+CXXFLAGS = @CXXFLAGS@ @X_CFLAGS@ @DEFS@ \
+ -Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \
+ -Wmissing-declarations -Wnested-externs
+CXXINCLUDES = -I. -I../nxcomp
+CXXDEFINES =
+
+CC = @CC@
+CCFLAGS = @CFLAGS@ @X_CFLAGS@ @DEFS@ \
+ -Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \
+ -Wmissing-declarations -Wnested-externs
+CCINCLUDES = -I. -I../nxcomp
+CCDEFINES =
+
+LDFLAGS = @LDFLAGS@ -L../nxcomp
+LIBS = @LIBS@ -lz -lX11 -lXcomp
+
+#
+# Only if THREADS is defined
+#
+# LIBS = @LIBS@ -lz -ljpeg -lpthread -lX11 -lXcomp
+#
+
+srcdir = @srcdir@
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+man1dir = @mandir@/man1
+VPATH = @srcdir@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+
+#
+# This should be autodetected.
+#
+
+MAKEDEPEND = @MAKEDEPEND@
+DEPENDINCLUDES = -I/usr/include/c++ -I/usr/include/g++ -I/usr/include/g++-3
+
+.SUFFIXES: .cpp.c
+
+.cpp.o:
+ $(CXX) -c $(CXXFLAGS) $(CXXINCLUDES) $<
+.c.o:
+ $(CC) -c $(CCFLAGS) $(CCINCLUDES) $<
+
+LIBRARY = Xcompext
+
+LIBNAME = lib$(LIBRARY)
+LIBFULL = lib$(LIBRARY).so.$(VERSION)
+LIBLOAD = lib$(LIBRARY).so.$(LIBVERSION)
+LIBSHARED = lib$(LIBRARY).so
+LIBARCHIVE = lib$(LIBRARY).a
+
+LIBCYGSHARED = cyg$(LIBRARY).dll
+LIBCYGARCHIVE = lib$(LIBRARY).dll.a
+
+all: depend @ALL@
+
+MSRC=
+
+CSRC= NXlib.c \
+ Clean.c \
+ Mask.c \
+ Colormap.c \
+ Alpha.c \
+ Jpeg.c \
+ Pgn.c \
+ Bitmap.c \
+ Rgb.c \
+ Rle.c \
+ Z.c
+
+CXXSRC=
+
+MOBJ = $(MSRC:.c=.o)
+COBJ = $(CSRC:.c=.o)
+CXXOBJ = $(CXXSRC:.cpp=.o)
+
+$(LIBFULL): $(CXXOBJ) $(COBJ)
+ $(CXX) -o $@ $(LDFLAGS) $(CXXOBJ) $(COBJ) $(LIBS)
+
+$(LIBLOAD): $(LIBFULL)
+ rm -f $(LIBLOAD)
+ ln -s $(LIBFULL) $(LIBLOAD)
+
+$(LIBSHARED): $(LIBFULL)
+ rm -f $(LIBSHARED)
+ ln -s $(LIBFULL) $(LIBSHARED)
+
+$(LIBARCHIVE): $(CXXOBJ) $(COBJ)
+ rm -f $(LIBARCHIVE)
+ ar clq $(LIBARCHIVE) $(CXXOBJ) $(COBJ)
+ ranlib $(LIBARCHIVE)
+
+$(LIBCYGSHARED): $(LIBARCHIVE)
+ $(CC) -shared -o $(LIBCYGSHARED) \
+ -Wl,--out-implib=$(LIBCYGARCHIVE) \
+ -Wl,--export-all-symbols \
+ -Wl,--enable-auto-import \
+ -Wl,--whole-archive $(LIBARCHIVE) \
+ -Wl,--no-whole-archive $(LIBS) \
+ $(LDFLAGS)
+
+$(LIBCYGARCHIVE): $(LIBCYGSHARED)
+
+depends: depend.status
+
+depend: depend.status
+
+depend.status:
+ if [ -x $(MAKEDEPEND) ] ; then \
+ $(MAKEDEPEND) $(CXXINCLUDES) $(CCINCLUDES) \
+ $(DEPENDINCLUDES) -f Makefile $(MSRC) $(CSRC) \
+ $(CXXSRC) 2>/dev/null; \
+ fi
+ touch depend.status
+
+install: install.bin install.man
+
+install.bin:
+
+install.man:
+
+clean:
+ -rm -f *~ *.o *.bak *.orig *.rej st?????? core core.* *.out.* \
+ @ALL@
+
+distclean: clean
+ -rm -rf autom4te.cache config.status config.log \
+ config.cache depend.status Makefile tags
diff --git a/nxcompext/Mask.c b/nxcompext/Mask.c
new file mode 100644
index 000000000..b04989d44
--- /dev/null
+++ b/nxcompext/Mask.c
@@ -0,0 +1,794 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <stdio.h>
+
+#include "Xlib.h"
+
+#include "NXpack.h"
+
+#include "Mask.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+/*
+ * Try first to reduce to a white or black
+ * pixel. If not possible, apply the mask.
+ * Note that correction is applied at the
+ * time pixel is unpacked.
+ */
+
+#define MaskPixel(red, green, blue, mask) \
+\
+if (red > mask -> white_threshold && \
+ green > mask -> white_threshold && \
+ blue > mask -> white_threshold) \
+{ \
+ red = green = blue = 0xff; \
+} \
+else if (red < mask -> black_threshold && \
+ green < mask -> black_threshold && \
+ blue < mask -> black_threshold) \
+{ \
+ red = green = blue = 0x00; \
+} \
+else \
+{ \
+ red = red & mask -> color_mask; \
+ green = green & mask -> color_mask; \
+ blue = blue & mask -> color_mask; \
+}
+
+int MaskImage(const ColorMask *mask, XImage *src_image, XImage *dst_image)
+{
+ unsigned long pixel;
+
+ register unsigned int red;
+ register unsigned int green;
+ register unsigned int blue;
+
+ register unsigned long data_size;
+
+ register unsigned int i;
+
+ data_size = (src_image -> bytes_per_line * src_image -> height) >> 2;
+
+ #ifdef TEST
+ fprintf(stderr, "******MaskImage: Going to mask image with [%d] bits per pixel.\n",
+ src_image -> bits_per_pixel);
+ #endif
+
+ if (src_image -> bits_per_pixel == 24 || src_image -> bits_per_pixel == 32)
+ {
+ register unsigned char *pixel_addr;
+
+ for (i = 0; i < data_size; i++)
+ {
+ pixel = ((unsigned long *) src_image -> data)[i];
+
+ pixel_addr = (unsigned char *) &pixel;
+
+ red = pixel_addr[2];
+ green = pixel_addr[1];
+ blue = pixel_addr[0];
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 24/32 bits original R [%d] G [%d] B [%d] A [%d].\n",
+ red, green, blue, pixel_addr[3]);
+ #endif
+
+ MaskPixel(red, green, blue, mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 24/32 bits masked R [%d] G [%d] B [%d] A [%d].\n",
+ red, green, blue, pixel_addr[3]);
+ #endif
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 24/32 bits pixel 0x%lx", pixel);
+ #endif
+
+ pixel_addr[2] = red;
+ pixel_addr[1] = green;
+ pixel_addr[0] = blue;
+
+ ((unsigned long*)dst_image -> data)[i] = pixel;
+
+ #ifdef DEBUG
+ fprintf(stderr, " -> 0x%lx\n", pixel);
+ #endif
+ }
+
+ return 1;
+ }
+ else if (src_image -> bits_per_pixel == 16)
+ {
+ /*
+ * FIXME: Masking doesn't work in 16 bpp.
+ *
+
+ unsigned long src_addr, *dst_addr;
+ unsigned short *src_pixels_addr, *dst_pixels_addr;
+
+ for (i = 0; i < data_size; i++)
+ {
+ src_addr = ((unsigned long *)src_image -> data)[i];
+ dst_addr = (unsigned long *)((unsigned long *)dst_image -> data + i);
+
+ src_pixels_addr = ((unsigned short *) &src_addr);
+ dst_pixels_addr = ((unsigned short *) dst_addr);
+
+ red = (src_pixels_addr[0] & src_image -> red_mask) >> 8;
+ green = (src_pixels_addr[0] & src_image -> green_mask) >> 3;
+ blue = (src_pixels_addr[0] & src_image -> blue_mask) << 3;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 16 bits original R [%d] G [%d] B [%d].\n",
+ red, green, blue);
+ #endif
+
+ MaskPixel(red, green, blue, mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 16 bits masked R [%d] G [%d] B [%d].\n",
+ red, green, blue);
+ #endif
+
+ dst_pixels_addr[0] = ((red << 8) & src_image -> red_mask) |
+ ((green << 3) & src_image -> green_mask) |
+ ((blue >> 3) & src_image -> blue_mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 16 bits pixel 0x%x", dst_pixels_addr[0]);
+ #endif
+
+ red = (src_pixels_addr[1] & src_image -> red_mask) >> 8;
+ green = (src_pixels_addr[1] & src_image -> green_mask) >> 3;
+ blue = (src_pixels_addr[1] & src_image -> blue_mask) << 3;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 16 bits original R [%d] G [%d] B [%d].\n",
+ red, green, blue);
+ #endif
+
+ MaskPixel(red, green, blue, mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 16 bits masked R [%d] G [%d] B [%d].\n",
+ red, green, blue);
+ #endif
+
+ dst_pixels_addr[1] = ((red << 8) & src_image -> red_mask) |
+ ((green << 3) & src_image -> green_mask) |
+ ((blue >> 3) & src_image -> blue_mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskImage: 16 bits pixel 0x%x", dst_pixels_addr[0]);
+ #endif
+ }
+
+ if (dst_image -> width & 0x00000001)
+ {
+ int card32_per_line;
+ int i;
+
+ card32_per_line = dst_image -> bytes_per_line >> 2;
+
+ for (i = 0; i < dst_image -> height;)
+ {
+ ((CARD32 *) dst_image -> data)[(++i * card32_per_line) - 1] &= 0x0000ffff;
+ }
+ }
+
+ *
+ * End of FIXME.
+ */
+ }
+ else
+ {
+ #ifdef TEST
+ fprintf(stderr, "******MaskImage: PANIC! Cannot apply mask with [%d] bits per pixel.\n",
+ src_image -> bits_per_pixel);
+ #endif
+
+ return 0;
+ }
+
+ return 1;
+}
+
+int MaskInPlaceImage(const ColorMask *mask, XImage *image)
+{
+ unsigned long pixel;
+
+ register unsigned int red;
+ register unsigned int green;
+ register unsigned int blue;
+
+ register unsigned int i;
+
+ register unsigned long data_size;
+
+ data_size = (image -> bytes_per_line * image -> height)>>2;
+
+ #ifdef TEST
+ fprintf(stderr, "******MaskInPlaceImage: Going to mask image with [%d] bits per pixel.\n",
+ image -> bits_per_pixel);
+ #endif
+
+ if (image -> bits_per_pixel == 24 || image -> bits_per_pixel == 32)
+ {
+ register unsigned char *pixel_addr;
+
+ for (i = 0; i < data_size; i++)
+ {
+ pixel = ((unsigned long *) image -> data)[i];
+
+ pixel_addr = (unsigned char *) &pixel;
+
+ red = pixel_addr[2];
+ green = pixel_addr[1];
+ blue = pixel_addr[0];
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 24/32 bits original R [%d] G [%d] B [%d] A [%d].\n",
+ red, green, blue, pixel_addr[3]);
+ #endif
+
+ MaskPixel(red, green, blue, mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 24/32 bits masked R [%d] G [%d] B [%d] A [%d].\n",
+ red, green, blue, pixel_addr[3]);
+ #endif
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 24/32 bits pixel 0x%lx", pixel);
+ #endif
+
+ pixel_addr[2] = red;
+ pixel_addr[1] = green;
+ pixel_addr[0] = blue;
+
+ ((unsigned long *) image -> data)[i] = pixel;
+
+ #ifdef DEBUG
+ fprintf(stderr, " -> 0x%lx\n", pixel);
+ #endif
+ }
+
+ return 1;
+ }
+ else if (image -> bits_per_pixel == 16)
+ {
+ /*
+ * FIXME: Mask doesn't still work for 16 bits.
+ *
+
+ unsigned long addr;
+ register unsigned short *pixels_addr;
+
+ for (i = 0; i < data_size; i++)
+ {
+ addr = ((unsigned long *) image -> data)[i];
+
+ pixels_addr = ((unsigned short *) &addr);
+
+ red = (pixels_addr[0] & image -> red_mask) >> 8;
+ green = (pixels_addr[0] & image -> green_mask) >> 3;
+ blue = (pixels_addr[0] & image -> blue_mask) << 3;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 16 bits original R [%d] G [%d] B [%d].\n",
+ red, green, blue);
+ #endif
+
+ MaskPixel(red, green, blue, mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 16 bits masked R [%d] G [%d] B [%d].\n",
+ red, green, blue);
+ #endif
+
+ pixels_addr[0] = ((red << 8) & image -> red_mask) |
+ ((green << 3) & image -> green_mask) |
+ ((blue >> 3) & image -> blue_mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 16 bits pixel 0x%x", pixels_addr[0]);
+ #endif
+
+ red = (pixels_addr[1] & image -> red_mask) >> 8;
+ green = (pixels_addr[1] & image -> green_mask) >> 3;
+ blue = (pixels_addr[1] & image -> blue_mask) << 3;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 16 bits original R [%d] G [%d] B [%d].\n",
+ red, green, blue);
+ #endif
+
+ MaskPixel(red, green, blue, mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 16 bits masked R [%d] G [%d] B [%d].\n",
+ red, green, blue);
+ #endif
+
+ pixels_addr[1] = ((red << 8) & image -> red_mask) |
+ ((green << 3) & image -> green_mask) |
+ ((blue >> 3) & image -> blue_mask);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******MaskInPlaceImage: 16 bits pixel 0x%x", pixels_addr[1]);
+ #endif
+ }
+
+ if (image -> width & 0x00000001)
+ {
+ int card32_per_line;
+ int i;
+
+ card32_per_line = image -> bytes_per_line >> 2;
+
+ for (i = 0; i < image -> height;)
+ {
+ ((CARD32 *) image -> data)[(++i * card32_per_line) - 1] &= 0x0000ffff;
+ }
+ }
+
+ *
+ * End of FIXME.
+ */
+ }
+ else
+ {
+ #ifdef TEST
+ fprintf(stderr, "******MaskImage: PANIC! Cannot apply mask with [%d] bits per pixel.\n",
+ image -> bits_per_pixel);
+ #endif
+
+ return 0;
+ }
+
+ return 1;
+}
+
+static int Pack16To8(unsigned int src_data_size, XImage *src_image, XImage *dst_image)
+{
+ unsigned short *src_pixel = (unsigned short *) src_image -> data;
+ unsigned char *dst_pixel = (unsigned char *) dst_image -> data;
+
+ #ifdef DEBUG
+ unsigned int counter = 0;
+ #endif
+
+ while (src_pixel < ((unsigned short *) (src_image -> data + src_data_size)))
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] value [0x%x] red [0x%x] green [0x%x] blue [0x%x].\n",
+ counter, *src_pixel, (*src_pixel & 0xc000) >> 8,
+ ((*src_pixel & 0x600) >> 3), (*src_pixel & 0x18) << 3);
+ #endif
+
+ if (*src_pixel == 0x0)
+ {
+ *dst_pixel = 0x0;
+ }
+ else if (*src_pixel == 0xffff)
+ {
+ *dst_pixel = 0xff;
+ }
+ else
+ {
+ *dst_pixel = ((*src_pixel & 0xc000) >> 10) |
+ ((*src_pixel & 0x600) >> 7) |
+ ((*src_pixel & 0x18) >> 3);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] destination [0x%x].\n",
+ counter++, *dst_pixel);
+ #endif
+
+ src_pixel++;
+ dst_pixel++;
+ }
+
+ return 1;
+}
+
+static int Pack24To8(unsigned int src_data_size, XImage *src_image, XImage *dst_image)
+{
+ unsigned char *src_pixel = (unsigned char *) src_image -> data;
+ unsigned char *dst_pixel = (unsigned char *) dst_image -> data;
+
+ int i;
+
+ unsigned int bytes_per_line = src_image -> bytes_per_line;
+
+ unsigned char *end_of_line = (unsigned char *) (src_pixel + bytes_per_line);
+
+
+ #ifdef DEBUG
+ unsigned int counter = 0;
+ #endif
+
+ for (i = 0; i < src_image -> height; i++ )
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] value [0x%x%x%x] red [0x%x] green [0x%x] blue [0x%x].\n",
+ counter, src_pixel[0], src_pixel[1], src_pixel[2], src_pixel[0] & 0xc0,
+ src_pixel[1] & 0xc0, src_pixel[2] & 0xc0);
+ #endif
+
+ while(src_pixel < end_of_line - 2)
+ {
+ if (src_pixel[0] == 0x00 &&
+ src_pixel[1] == 0x00 &&
+ src_pixel[2] == 0x00)
+ {
+ *dst_pixel = 0x0;
+ }
+ else if (src_pixel[0] == 0xff &&
+ src_pixel[1] == 0xff &&
+ src_pixel[2] == 0xff)
+ {
+ *dst_pixel = 0xff;
+ }
+ else
+ {
+ /*
+ * Pixel layout:
+ *
+ * 24 bit RRRRR000 GGGGG000 BBBBB000 -> 8 bit 00RRGGBB
+ */
+
+ *dst_pixel = (src_pixel[0] & 0xc0) >> 2 |
+ ((src_pixel[1] & 0xc0) >> 4) |
+ ((src_pixel[2] & 0xc0) >> 6);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] destination [0x%x].\n",
+ counter++, *dst_pixel);
+ #endif
+
+ src_pixel += 3;
+ dst_pixel += 1;
+ }
+
+ src_pixel = end_of_line;
+ end_of_line += bytes_per_line;
+ }
+
+ return 1;
+}
+
+static int Pack24To16(unsigned int src_data_size, XImage *src_image, XImage *dst_image)
+{
+ unsigned char *src_pixel = (unsigned char *) src_image -> data;
+ unsigned short *dst_pixel = (unsigned short *) dst_image -> data;
+
+ int i;
+
+ unsigned int bytes_per_line = src_image -> bytes_per_line;
+
+ unsigned char *end_of_line = (unsigned char *) (src_pixel + bytes_per_line);
+
+ #ifdef DEBUG
+ unsigned int counter = 0;
+ #endif
+
+ for (i = 0; i < src_image -> height; i++ )
+ {
+ while(src_pixel < end_of_line - 2)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] value [0x%x%x%x] red [0x%x] green [0x%x] blue [0x%x].\n",
+ counter, src_pixel[0], src_pixel[1], src_pixel[2], src_pixel[0] & 0xf8,
+ src_pixel[1] & 0xf8, src_pixel[2] & 0xf8);
+ #endif
+
+ if (src_pixel[0] == 0x00 &&
+ src_pixel[1] == 0x00 &&
+ src_pixel[2] == 0x00)
+ {
+ *dst_pixel = 0x0;
+ }
+ else if (src_pixel[0] == 0xff &&
+ src_pixel[1] == 0xff &&
+ src_pixel[2] == 0xff)
+ {
+ *dst_pixel = 0xffff;
+ }
+ else
+ {
+ /*
+ * Pixel layout:
+ *
+ * 24 bit RRRRR000 GGGGG000 BBBBB000 -> 16 bit 0RRRRRGG GGGBBBBB
+ */
+
+ *dst_pixel = ((src_pixel[0] & 0xf8) << 7) |
+ ((src_pixel[1] & 0xf8) << 2) |
+ ((src_pixel[2] & 0xf8) >> 3);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] destination [0x%x].\n",
+ counter++, *dst_pixel);
+ #endif
+
+ src_pixel += 3;
+ dst_pixel += 1;
+ }
+
+ src_pixel = end_of_line;
+ end_of_line += bytes_per_line;
+ }
+
+ return 1;
+}
+
+static int Pack32To8(unsigned int src_data_size, XImage *src_image, XImage *dst_image)
+{
+ unsigned int *src_pixel = (unsigned int *) src_image -> data;
+ unsigned char *dst_pixel = (unsigned char *) dst_image -> data;
+
+ #ifdef DEBUG
+ unsigned int counter = 0;
+ #endif
+
+ while (src_pixel < ((unsigned int *) (src_image -> data + src_data_size)))
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] value [0x%x] red [0x%x] green [0x%x] blue [0x%x].\n",
+ counter, *src_pixel, (*src_pixel & 0xc00000),
+ (*src_pixel & 0xc000), (*src_pixel & 0xc0));
+ #endif
+
+ if (*src_pixel == 0x0)
+ {
+ *dst_pixel = 0x0;
+ }
+ else if (*src_pixel == 0xffffff)
+ {
+ *dst_pixel = 0xff;
+ }
+ else
+ {
+ *dst_pixel = ((*src_pixel & 0xc00000) >> 18) |
+ ((*src_pixel & 0xc000) >> 12) |
+ ((*src_pixel & 0xc0) >> 6);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] destination [0x%x].\n",
+ counter++, *dst_pixel);
+ #endif
+
+ src_pixel++;
+ dst_pixel++;
+ }
+
+ return 1;
+}
+
+static int Pack32To16(unsigned int src_data_size, XImage *src_image, XImage *dst_image)
+{
+ unsigned int *src_pixel = (unsigned int *) src_image -> data;
+ unsigned short *dst_pixel = (unsigned short *) dst_image -> data;
+
+ #ifdef DEBUG
+ unsigned int counter = 0;
+ #endif
+
+ while (src_pixel < ((unsigned int *) (src_image -> data + src_data_size)))
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] value [0x%x] red [0x%x] green [0x%x] blue [0x%x].\n",
+ counter, *src_pixel, (*src_pixel & 0xf80000),
+ (*src_pixel & 0xf800), (*src_pixel & 0xf8));
+ #endif
+
+ if (*src_pixel == 0x0)
+ {
+ *dst_pixel = 0x0;
+ }
+ else if (*src_pixel == 0xffffff)
+ {
+ *dst_pixel = 0xffff;
+ }
+ else
+ {
+ *dst_pixel = ((*src_pixel & 0xf80000) >> 9) |
+ ((*src_pixel & 0xf800) >> 6) |
+ ((*src_pixel & 0xf8) >> 3);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] destination [0x%x].\n",
+ counter++, *dst_pixel);
+ #endif
+
+ src_pixel++;
+ dst_pixel++;
+ }
+
+ return 1;
+}
+
+static int Pack32To24(unsigned int src_data_size, XImage *src_image, XImage *dst_image)
+{
+ unsigned int *src_pixel = (unsigned int *) src_image -> data;
+ unsigned char *dst_pixel = (unsigned char *) dst_image -> data;
+
+ #ifdef DEBUG
+ unsigned int counter = 0;
+ #endif
+
+ while (src_pixel < ((unsigned int *) (src_image -> data + src_data_size)))
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] value [0x%x] red [0x%x] green [0x%x] blue [0x%x].\n",
+ counter, *src_pixel, ((*src_pixel & 0xff0000) >> 16),
+ ((*src_pixel & 0x00ff00) >> 8), (*src_pixel & 0xff));
+ #endif
+
+ if (*src_pixel == 0x0)
+ {
+ dst_pixel[0] = dst_pixel[1] = dst_pixel[2] = 0x0;
+ }
+ else if (*src_pixel == 0xffffff)
+ {
+ dst_pixel[0] = dst_pixel[1] = dst_pixel[2] = 0xff;
+ }
+ else
+ {
+ dst_pixel[0] = (*src_pixel & 0xff0000) >> 16;
+ dst_pixel[1] = (*src_pixel & 0x00ff00) >> 8;
+ dst_pixel[2] = (*src_pixel & 0x0000ff);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PackImage: Pixel [%d] destination [0x%x], [0x%x], [0x%x].\n",
+ counter++, dst_pixel[0], dst_pixel[1], dst_pixel[2]);
+ #endif
+
+ src_pixel += 1;
+ dst_pixel += 3;
+ }
+
+ return 1;
+}
+
+int PackImage(unsigned int method, unsigned int src_data_size, XImage *src_image,
+ unsigned int dst_data_size, XImage *dst_image)
+{
+ unsigned int src_bits_per_pixel;
+ unsigned int dst_bits_per_pixel;
+
+ src_bits_per_pixel = src_image -> bits_per_pixel;
+ dst_bits_per_pixel = MethodBitsPerPixel(method);
+
+ #ifdef TEST
+ fprintf(stderr, "******PackImage: Source bits per pixel [%d], destination bits per pixel [%d].\n",
+ src_bits_per_pixel, dst_bits_per_pixel);
+
+ fprintf(stderr, "******PackImage: Source data size [%d], destination data size [%d].\n",
+ src_data_size, dst_data_size);
+ #endif
+
+ if (dst_bits_per_pixel >= src_bits_per_pixel)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PackImage: PANIC! Cannot pack image from [%d] to [%d] bytes per pixel.\n",
+ src_bits_per_pixel, dst_bits_per_pixel);
+ #endif
+
+ return 0;
+ }
+
+ switch (src_bits_per_pixel)
+ {
+ case 16:
+ {
+ switch (dst_bits_per_pixel)
+ {
+ case 8:
+ {
+ return Pack16To8(src_data_size, src_image, dst_image);
+ }
+ default:
+ {
+ return 0;
+ }
+ }
+ }
+ case 24:
+ {
+ switch (dst_bits_per_pixel)
+ {
+ case 8:
+ {
+ return Pack24To8(src_data_size, src_image, dst_image);
+ }
+ case 16:
+ {
+ return Pack24To16(src_data_size, src_image, dst_image);
+ }
+ default:
+ {
+ return 0;
+ }
+ }
+ }
+ case 32:
+ {
+ switch (dst_bits_per_pixel)
+ {
+ case 8:
+ {
+ return Pack32To8(src_data_size, src_image, dst_image);
+ }
+ case 16:
+ {
+ return Pack32To16(src_data_size, src_image, dst_image);
+ }
+ case 24:
+ {
+ return Pack32To24(src_data_size, src_image, dst_image);
+ }
+ default:
+ {
+ return 0;
+ }
+ }
+ }
+ default:
+ {
+ return 0;
+ }
+ }
+}
+
+/*
+ * Replace the ffs() call that may be not
+ * present on some systems.
+ */
+
+int FindLSB(int word)
+{
+ int t = word;
+
+ int m = 1;
+ int i = 0;
+
+ for (; i < sizeof(word) << 3; i++, m <<= 1)
+ {
+ if (t & m)
+ {
+ return i + 1;
+ }
+ }
+
+ return 0;
+}
+
diff --git a/nxcompext/Mask.h b/nxcompext/Mask.h
new file mode 100644
index 000000000..5d6024f59
--- /dev/null
+++ b/nxcompext/Mask.h
@@ -0,0 +1,40 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Mask_H
+#define Mask_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "Xlib.h"
+
+extern int MaskImage(const ColorMask *mask, XImage *src_image, XImage *dst_image);
+
+extern int MaskInPlaceImage(const ColorMask *mask, XImage *image);
+
+extern int PackImage(unsigned int method, unsigned int src_data_size, XImage *src_image,
+ unsigned int dst_data_size, XImage *dst_image);
+
+int FindLSB(int word);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Mask_H */
diff --git a/nxcompext/NXlib.c b/nxcompext/NXlib.c
new file mode 100644
index 000000000..452213bf1
--- /dev/null
+++ b/nxcompext/NXlib.c
@@ -0,0 +1,4770 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <sys/socket.h>
+
+#ifndef __sun
+#include <strings.h>
+#endif
+
+#include "NX.h"
+
+#include "dix.h"
+#include "os.h"
+
+#define NEED_REPLIES
+
+/*
+ * Needed to enable definition of the callback
+ * functions.
+ */
+
+#define NX_TRANS_SOCKET
+
+#include "Xlib.h"
+#include "Xutil.h"
+#include "Xlibint.h"
+
+#include "NXlib.h"
+#include "NXproto.h"
+#include "NXpack.h"
+
+#include "Clean.h"
+#include "Mask.h"
+#include "Colormap.h"
+#include "Alpha.h"
+#include "Bitmap.h"
+#include "Jpeg.h"
+#include "Pgn.h"
+#include "Rgb.h"
+#include "Rle.h"
+#include "Z.h"
+
+#include "MD5.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+#undef DUMP
+
+/*
+ * Maximum number of colors allowed in
+ * Png encoding.
+ */
+
+#define NB_COLOR_MAX 256
+
+/*
+ * Dummy error handlers used internally to catch
+ * Xlib failures in replies.
+ */
+
+static int _NXInternalReplyErrorFunction(Display *dpy, XErrorEvent *error);
+
+static void _NXInternalLostSequenceFunction(Display *dpy, unsigned long newseq,
+ unsigned long lastseq, unsigned int type);
+
+/*
+ * Resource ids that can be requested by
+ * the client for use in split or unpack
+ * operations.
+ */
+
+static unsigned char _NXSplitResources[NXNumberOfResources];
+static unsigned char _NXUnpackResources[NXNumberOfResources];
+
+static Display *_NXDisplayInitialized = NULL;
+
+/*
+ * Used in asynchronous handling of
+ * GetImage replies.
+ */
+
+typedef struct
+{
+ unsigned long sequence;
+ unsigned int resource;
+ unsigned long mask;
+ int format;
+ int width;
+ int height;
+ _XAsyncHandler *handler;
+ XImage *image;
+} _NXCollectImageState;
+
+static _NXCollectImageState *_NXCollectedImages[NXNumberOfResources];
+
+/*
+ * Used in asynchronous handling of
+ * GetProperty replies.
+ */
+
+typedef struct
+{
+ unsigned long sequence;
+ unsigned int resource;
+ Window window;
+ Atom property;
+ Atom type;
+ int format;
+ unsigned long items;
+ unsigned long after;
+ _XAsyncHandler *handler;
+ char *data;
+} _NXCollectPropertyState;
+
+static _NXCollectPropertyState *_NXCollectedProperties[NXNumberOfResources];
+
+/*
+ * Used in asynchronous handling of
+ * GrabPointer replies.
+ */
+
+typedef struct
+{
+ unsigned long sequence;
+ unsigned int resource;
+ int status;
+ _XAsyncHandler *handler;
+} _NXCollectGrabPointerState;
+
+static _NXCollectGrabPointerState *_NXCollectedGrabPointers[NXNumberOfResources];
+
+/*
+ * Used in asynchronous handling of
+ * GetInputFocus replies.
+ */
+
+typedef struct
+{
+ unsigned long sequence;
+ unsigned int resource;
+ Window focus;
+ int revert_to;
+ _XAsyncHandler *handler;
+} _NXCollectInputFocusState;
+
+static _NXCollectInputFocusState *_NXCollectedInputFocuses[NXNumberOfResources];
+
+/*
+ * Used by functions handling cache of
+ * packed images.
+ */
+
+#define MD5_LENGTH 16
+
+typedef struct
+{
+ md5_byte_t *md5;
+ XImage *image;
+ unsigned int method;
+} _NXImageCacheEntry;
+
+int NXImageCacheSize = 0;
+int NXImageCacheHits = 0;
+int NXImageCacheOps = 0;
+
+_NXImageCacheEntry *NXImageCache = NULL;
+
+#ifdef DUMP
+
+void _NXCacheDump(const char *label);
+
+void _NXDumpData(const unsigned char *buffer, unsigned int size);
+
+#endif
+
+/*
+ * From X11/PutImage.c.
+ *
+ * Cancel a GetReq operation, before doing
+ * _XSend or Data.
+ */
+
+#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
+#define UnGetReq(name)\
+ dpy->bufptr -= SIZEOF(x##name##Req);\
+ dpy->request--
+#else
+#define UnGetReq(name)\
+ dpy->bufptr -= SIZEOF(x/**/name/**/Req);\
+ dpy->request--
+#endif
+
+#if (defined(__STDC__) && !defined(UNIXCPP)) || defined(ANSICPP)
+#define UnGetEmptyReq()\
+ dpy->bufptr -= 4;\
+ dpy->request--
+#else
+#define UnGetEmptyReq(name)\
+ dpy->bufptr -= 4;\
+ dpy->request--
+#endif
+
+/*
+ * From X11/ImUtil.c.
+ */
+
+extern int _XGetBitsPerPixel(Display *dpy, int depth);
+extern int _XGetScanlinePad(Display *dpy, int depth);
+
+#define ROUNDUP(nbytes, pad) (((nbytes) + ((pad) - 1)) & \
+ ~(long)((pad) - 1))
+
+static unsigned int DepthOnes(unsigned long mask)
+{
+ register unsigned long y;
+
+ y = (mask >> 1) &033333333333;
+ y = mask - y - ((y >>1) & 033333333333);
+ return ((unsigned int) (((y + (y >> 3)) &
+ 030707070707) % 077));
+}
+
+#define CanMaskImage(image, mask) \
+\
+(image -> format == ZPixmap && mask != NULL && \
+ (image -> depth == 32 || image -> depth == 24 || \
+ (image -> depth == 16 && (image -> red_mask == 0xf800 && \
+ image -> green_mask == 0x7e0 && image -> blue_mask == 0x1f))))
+
+#define ShouldMaskImage(image, mask) (mask -> color_mask != 0xff)
+
+/*
+ * Initialize and reset the internal structures.
+ */
+
+extern int _NXInternalInitResources(Display *dpy);
+extern int _NXInternalResetResources(Display *dpy);
+extern int _NXInternalInitEncoders(Display *dpy);
+extern int _NXInternalResetEncoders(Display *dpy);
+
+int NXInitDisplay(Display *dpy)
+{
+ #ifdef TEST
+ fprintf(stderr, "******NXInitDisplay: Called for display at [%p].\n", (void *) dpy);
+ #endif
+
+ if (_NXDisplayInitialized == NULL)
+ {
+ _NXInternalInitResources(dpy);
+
+ _NXInternalInitEncoders(dpy);
+
+ _NXDisplayInitialized = dpy;
+
+ return 1;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******NXInitDisplay: WARNING! Internal structures already initialized.\n");
+ #endif
+
+ return 0;
+}
+
+int NXResetDisplay(Display *dpy)
+{
+ #ifdef TEST
+ fprintf(stderr, "******NXResetDisplay: Called for display at [%p].\n", (void *) dpy);
+ #endif
+
+ if (_NXDisplayInitialized != NULL)
+ {
+ _NXInternalResetResources(dpy);
+
+ _NXInternalResetEncoders(dpy);
+
+ _NXDisplayInitialized = NULL;
+
+ return 1;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******NXResetDisplay: WARNING! Internal structures already reset.\n");
+ #endif
+
+ return 0;
+}
+
+int _NXInternalInitResources(Display *dpy)
+{
+ return _NXInternalResetResources(dpy);
+}
+
+int _NXInternalResetResources(Display *dpy)
+{
+ int i;
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXInternalResetResources: Clearing all the internal structures.\n");
+ #endif
+
+ for (i = 0; i < NXNumberOfResources; i++)
+ {
+ _NXSplitResources[i] = 0;
+ _NXUnpackResources[i] = 0;
+
+ if (_NXCollectedImages[i] != NULL)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXInternalResetResources: WARNING! Clearing collect image data "
+ "for resource [%d].\n", i);
+ #endif
+
+ if (_NXCollectedImages[i] -> handler != NULL)
+ {
+ DeqAsyncHandler(dpy, _NXCollectedImages[i] -> handler);
+
+ Xfree(_NXCollectedImages[i] -> handler);
+ }
+
+ if (_NXCollectedImages[i] -> image != NULL)
+ {
+ XDestroyImage(_NXCollectedImages[i] -> image);
+ }
+
+ Xfree(_NXCollectedImages[i]);
+
+ _NXCollectedImages[i] = NULL;
+ }
+
+ if (_NXCollectedProperties[i] != NULL)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXInternalResetResources: WARNING! Clearing collect property data "
+ "for resource [%d].\n", i);
+ #endif
+
+ if (_NXCollectedProperties[i] -> handler != NULL)
+ {
+ DeqAsyncHandler(dpy, _NXCollectedProperties[i] -> handler);
+
+ Xfree(_NXCollectedProperties[i] -> handler);
+ }
+
+ if (_NXCollectedProperties[i] -> data != NULL)
+ {
+ Xfree(_NXCollectedProperties[i] -> data);
+ }
+
+ Xfree(_NXCollectedProperties[i]);
+
+ _NXCollectedProperties[i] = NULL;
+ }
+
+ if (_NXCollectedGrabPointers[i] != NULL)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXInternalResetResources: WARNING! Clearing grab pointer data "
+ "for resource [%d].\n", i);
+ #endif
+
+ if (_NXCollectedGrabPointers[i] -> handler != NULL)
+ {
+ DeqAsyncHandler(dpy, _NXCollectedGrabPointers[i] -> handler);
+
+ Xfree(_NXCollectedGrabPointers[i] -> handler);
+ }
+
+ Xfree(_NXCollectedGrabPointers[i]);
+
+ _NXCollectedGrabPointers[i] = NULL;
+ }
+
+ if (_NXCollectedInputFocuses[i] != NULL)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXInternalResetResources: WARNING! Clearing collect input focus data "
+ "for resource [%d].\n", i);
+ #endif
+
+ if (_NXCollectedInputFocuses[i] -> handler != NULL)
+ {
+ DeqAsyncHandler(dpy, _NXCollectedInputFocuses[i] -> handler);
+
+ Xfree(_NXCollectedInputFocuses[i] -> handler);
+ }
+
+ Xfree(_NXCollectedInputFocuses[i]);
+
+ _NXCollectedInputFocuses[i] = NULL;
+ }
+ }
+
+ return 1;
+}
+
+int _NXInternalInitEncoders(Display *dpy)
+{
+ ZInitEncoder();
+
+ return 1;
+}
+
+int _NXInternalResetEncoders(Display *dpy)
+{
+ ZResetEncoder();
+
+ return 1;
+}
+
+int NXSetDisplayPolicy(Display *dpy, int policy)
+{
+ if (policy == NXPolicyImmediate)
+ {
+ return NXTransPolicy(NX_FD_ANY, NX_POLICY_IMMEDIATE);
+ }
+ else
+ {
+ return NXTransPolicy(NX_FD_ANY, NX_POLICY_DEFERRED);
+ }
+}
+
+int NXSetDisplayBuffer(Display *dpy, int size)
+{
+ /*
+ * This is not multi-thread safe, so,
+ * if you have threads, be sure that
+ * they are stopped.
+ */
+
+ char *buffer;
+
+ XFlush(dpy);
+
+ if (dpy -> bufmax - size == dpy -> buffer)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXSetDisplayBuffer: Nothing to do with buffer size matching.\n");
+ #endif
+
+ return 1;
+ }
+ else if (dpy -> bufptr != dpy -> buffer)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXSetDisplayBuffer: PANIC! The display buffer is not empty.\n");
+ #endif
+
+ return -1;
+ }
+ else if ((buffer = Xcalloc(1, size)) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXSetDisplayBuffer: PANIC! Can't allocate [%d] bytes for the buffer.\n",
+ size);
+ #endif
+
+ return -1;
+ }
+
+ if (dpy -> buffer != NULL)
+ {
+ Xfree(dpy -> buffer);
+ }
+
+ dpy -> buffer = buffer;
+ dpy -> bufptr = dpy -> buffer;
+ dpy -> bufmax = dpy -> bufptr + size;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetDisplayBuffer: Set the display output buffer size to [%d].\n",
+ size);
+ #endif
+
+ return 1;
+}
+
+/*
+ * If set, the Popen() function in the X server
+ * wil remove the LD_LIBRARY_PATH variable from
+ * the environment before calling the execl()
+ * function on the child process.
+ */
+
+int NXUnsetLibraryPath(int value)
+{
+ int previous = _NXUnsetLibraryPath;
+
+ _NXUnsetLibraryPath = value;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXUnsetLibraryPath: Set the flag to [%d] with previous value [%d].\n",
+ value, previous);
+ #endif
+
+ return previous;
+}
+
+/*
+ * If set, the Xlib I/O error handler will simply
+ * return, instead of quitting the program. This
+ * leaves to the application the responsibility
+ * of checking the state of the XlibDisplayIOEr-
+ * ror flag.
+ */
+
+int NXHandleDisplayError(int value)
+{
+ int previous = _NXHandleDisplayError;
+
+ _NXHandleDisplayError = value;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXHandleDisplayError: Set the flag to [%d] with previous value [%d].\n",
+ value, previous);
+ #endif
+
+ return previous;
+}
+
+/*
+ * Shutdown the display descriptor and force Xlib
+ * to set the I/O error flag.
+ */
+
+Bool NXForceDisplayError(Display *dpy)
+{
+ if (dpy != NULL)
+ {
+ NXTransClose(dpy -> fd);
+
+ if (!(dpy -> flags & XlibDisplayIOError))
+ {
+ shutdown(dpy -> fd, SHUT_RDWR);
+
+ _XIOError(dpy);
+ }
+
+ return 1;
+ }
+
+ return 0;
+}
+
+/*
+ * Check if the display has become invalid. Similarly
+ * to the modified Xlib, we call the predicate funct-
+ * ion with the value of the XlibDisplayIOError flag
+ * only if the I/O error was not encountered already.
+ * The application can use this function to query the
+ * XlibDisplayIOError flag because Xlib doesn't expose
+ * the internals of the display structure to the appli-
+ * cation.
+ */
+
+int NXDisplayError(Display *dpy)
+{
+ if (dpy != NULL)
+ {
+ return (_XGetIOError(dpy) ||
+ (_NXDisplayErrorFunction != NULL &&
+ (*_NXDisplayErrorFunction)(dpy, _XGetIOError(dpy))));
+ }
+
+ return 1;
+}
+
+/*
+ * Various queries related to the state of the
+ * display connection.
+ */
+
+int NXDisplayReadable(Display *dpy)
+{
+ int result;
+ int readable;
+
+ result = NXTransReadable(dpy -> fd, &readable);
+
+ if (result == 0)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******NXDisplayReadable: Returning [%d] bytes readable from fd [%d].\n",
+ readable, dpy -> fd);
+ #endif
+
+ return readable;
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXDisplayReadable: WARNING! Error detected on display fd [%d].\n",
+ dpy -> fd);
+ #endif
+
+ return -1;
+}
+
+int NXDisplayFlushable(Display *dpy)
+{
+ #ifdef DEBUG
+
+ int flushable;
+
+ flushable = NXTransFlushable(dpy -> fd) +
+ (dpy -> bufptr - dpy -> buffer);
+
+ fprintf(stderr, "******NXDisplayFlushable: Returning [%d+%d=%d] bytes flushable "
+ "to fd [%d].\n", (int) (dpy -> bufptr - dpy -> buffer),
+ (int) (flushable - (dpy -> bufptr - dpy -> buffer)),
+ flushable, dpy -> fd);
+
+ return flushable;
+
+ #else
+
+ return NXTransFlushable(dpy -> fd) + (dpy -> bufptr - dpy -> buffer);
+
+ #endif
+}
+
+int NXDisplayCongestion(Display *dpy)
+{
+ #ifdef DEBUG
+
+ int congestion = NXTransCongestion(dpy -> fd);
+
+ fprintf(stderr, "******NXDisplayCongestion: Returning [%d] as congestion level for fd [%d].\n",
+ congestion, dpy -> fd);
+
+ return congestion;
+
+ #else
+
+ return NXTransCongestion(dpy -> fd);
+
+ #endif
+}
+
+int NXFlushDisplay(Display *dpy, int what)
+{
+ if (!(dpy -> flags & XlibDisplayWriting) &&
+ dpy -> bufptr - dpy -> buffer > 0)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******NXFlushDisplay: Writing with [%d] bytes in the buffer.\n",
+ (int) (dpy -> bufptr - dpy -> buffer));
+ #endif
+
+ XFlush(dpy);
+ }
+
+ if (what == NXFlushBuffer)
+ {
+ return 0;
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXFlushDisplay: Flushing with [%d] bytes in the NX transport.\n",
+ NXDisplayFlushable(dpy));
+ #endif
+
+ return NXTransFlush(dpy -> fd);
+}
+
+NXDisplayErrorPredicate NXSetDisplayErrorPredicate(NXDisplayErrorPredicate predicate)
+{
+ NXDisplayErrorPredicate previous = _NXDisplayErrorFunction;
+
+ _NXDisplayErrorFunction = predicate;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetDisplayErrorPredicate: Set the predicate to [%p] with previous value [%p].\n",
+ predicate, previous);
+ #endif
+
+ return previous;
+}
+
+NXDisplayBlockHandler NXSetDisplayBlockHandler(NXDisplayBlockHandler handler)
+{
+ NXDisplayBlockHandler previous = _NXDisplayBlockFunction;
+
+ _NXDisplayBlockFunction = handler;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetDisplayBlockHandler: Set the handler to [%p] with previous value [%p].\n",
+ handler, previous);
+ #endif
+
+ return previous;
+}
+
+NXDisplayWriteHandler NXSetDisplayWriteHandler(NXDisplayWriteHandler handler)
+{
+ NXDisplayWriteHandler previous = _NXDisplayWriteFunction;
+
+ _NXDisplayWriteFunction = handler;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetDisplayWriteHandler: Set the handler to [%p] with previous value [%p].\n",
+ handler, previous);
+ #endif
+
+ return previous;
+}
+
+NXDisplayFlushHandler NXSetDisplayFlushHandler(NXDisplayFlushHandler handler, Display *display)
+{
+ NXDisplayFlushHandler previous = _NXDisplayFlushFunction;
+
+ _NXDisplayFlushFunction = handler;
+
+ NXTransHandler(NX_FD_ANY, NX_HANDLER_FLUSH,
+ (void (*)(void *, int)) handler, (void *) display);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetDisplayFlushHandler: Set the handler to [%p] with display [%p] "
+ "and previous value [%p].\n", handler, display, previous);
+ #endif
+
+ return previous;
+}
+
+NXDisplayStatisticsHandler NXSetDisplayStatisticsHandler(NXDisplayStatisticsHandler handler, char **buffer)
+{
+ NXDisplayStatisticsHandler previous = _NXDisplayStatisticsFunction;
+
+ _NXDisplayStatisticsFunction = handler;
+
+ /*
+ * Propagate the handler.
+ */
+
+ NXTransHandler(NX_FD_ANY, NX_HANDLER_STATISTICS,
+ (void (*)(void *, int)) handler, (void *) buffer);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetDisplayStatisticsHandler: Set the handler to [%p] with buffer pointer [%p] "
+ "and previous value [%p].\n", handler, buffer, previous);
+ #endif
+
+ return previous;
+}
+
+NXLostSequenceHandler NXSetLostSequenceHandler(NXLostSequenceHandler handler)
+{
+ NXLostSequenceHandler previous = _NXLostSequenceFunction;
+
+ _NXLostSequenceFunction = handler;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetLostSequenceHandler: Set the handler to [%p] with previous value [%p].\n",
+ handler, previous);
+ #endif
+
+ return previous;
+}
+
+int _NXInternalReplyErrorFunction(Display *dpy, XErrorEvent *error)
+{
+ #ifdef TEST
+ fprintf(stderr, "******_NXInternalReplyErrorFunction: Internal error handler called.\n");
+ #endif
+
+ return 0;
+}
+
+void _NXInternalLostSequenceFunction(Display *dpy, unsigned long newseq,
+ unsigned long lastseq, unsigned int type)
+{
+ #ifdef TEST
+
+ fprintf(stderr, "******_NXInternalLostSequenceFunction: WARNING! Sequence lost with new "
+ "sequence %ld last request %ld.\n", newseq, dpy -> request);
+
+ /*
+ * TODO: Reply or event info must be implemented.
+ *
+ * fprintf(stderr, "******_NXInternalLostSequenceFunction: WARNING! Expected event or reply "
+ * "was %ld with sequence %ld.\n", (long) rep -> type, (long) rep -> sequenceNumber);
+ */
+
+ fprintf(stderr, "******_NXInternalLostSequenceFunction: WARNING! Last sequence read "
+ "was %ld display request is %ld.\n", lastseq & 0xffff, dpy -> request & 0xffff);
+
+ #endif
+}
+
+Status NXGetControlParameters(Display *dpy, unsigned int *link_type, unsigned int *local_major,
+ unsigned int *local_minor, unsigned int *local_patch,
+ unsigned int *remote_major, unsigned int *remote_minor,
+ unsigned int *remote_patch, int *split_timeout, int *motion_timeout,
+ int *split_mode, int *split_size, unsigned int *pack_method,
+ unsigned int *pack_quality, int *data_level, int *stream_level,
+ int *delta_level, unsigned int *load_cache,
+ unsigned int *save_cache, unsigned int *startup_cache)
+{
+ xNXGetControlParametersReply rep;
+
+ register xReq *req;
+
+ LockDisplay(dpy);
+
+ GetEmptyReq(NXGetControlParameters, req);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetControlParameters: Sending message opcode [%d].\n",
+ X_NXGetControlParameters);
+ #endif
+
+ if (_XReply(dpy, (xReply *) &rep, 0, xTrue) == xFalse)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetControlParameters: Error receiving reply.\n");
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 0;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetControlParameters: Got reply with link type [%u].\n", rep.linkType);
+
+ fprintf(stderr, "******NXGetControlParameters: Local protocol major [%u] minor [%u] patch [%u].\n",
+ rep.localMajor, rep.localMinor, rep.localPatch);
+
+ fprintf(stderr, "******NXGetControlParameters: Remote protocol major [%u] minor [%u] patch [%u].\n",
+ rep.remoteMajor, rep.remoteMinor, rep.remotePatch);
+
+ fprintf(stderr, "******NXGetControlParameters: Split timeout [%d] motion timeout [%d].\n",
+ (int) rep.splitTimeout, (int) rep.motionTimeout);
+
+ fprintf(stderr, "******NXGetControlParameters: Split mode [%d] split size [%d].\n",
+ (int) rep.splitMode, (int) rep.splitSize);
+
+ fprintf(stderr, "******NXGetControlParameters: Preferred pack method [%d] pack quality [%d].\n",
+ (int) rep.packMethod, (int) rep.packQuality);
+
+ fprintf(stderr, "******NXGetControlParameters: Data level [%d] stream level [%d] delta level [%d].\n",
+ rep.dataLevel, rep.streamLevel, rep.deltaLevel);
+ #endif
+
+ *link_type = rep.linkType;
+
+ *local_major = rep.localMajor;
+ *local_minor = rep.localMinor;
+ *local_patch = rep.localPatch;
+
+ *remote_major = rep.remoteMajor;
+ *remote_minor = rep.remoteMinor;
+ *remote_patch = rep.remotePatch;
+
+ *split_timeout = rep.splitTimeout;
+ *motion_timeout = rep.motionTimeout;
+
+ *split_mode = rep.splitMode;
+ *split_size = rep.splitSize;
+
+ *pack_method = rep.packMethod;
+ *pack_quality = rep.packQuality;
+
+ *data_level = rep.dataLevel;
+ *stream_level = rep.streamLevel;
+ *delta_level = rep.deltaLevel;
+
+ *load_cache = rep.loadCache;
+ *save_cache = rep.saveCache;
+ *startup_cache = rep.startupCache;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ /*
+ * Install our internal out-of-sync handler.
+ */
+
+ _NXLostSequenceFunction = _NXInternalLostSequenceFunction;
+
+ return 1;
+}
+
+/*
+ * Which unpack methods are supported by the
+ * remote proxy?
+ */
+
+Status NXGetUnpackParameters(Display *dpy, unsigned int *entries, unsigned char supported_methods[])
+{
+ register xNXGetUnpackParametersReq *req;
+
+ xNXGetUnpackParametersReply rep;
+
+ register unsigned n;
+
+ #ifdef TEST
+ register unsigned i;
+ #endif
+
+ if (*entries < NXNumberOfPackMethods)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetUnpackParameters: Requested only [%d] entries while they should be [%d].\n",
+ *entries, NXNumberOfPackMethods);
+ #endif
+
+ return 0;
+ }
+
+ LockDisplay(dpy);
+
+ GetReq(NXGetUnpackParameters, req);
+
+ req -> entries = *entries;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetUnpackParameters: Sending message opcode [%d] with [%d] requested entries.\n",
+ X_NXGetUnpackParameters, *entries);
+ #endif
+
+ if (_XReply(dpy, (xReply *) &rep, 0, xFalse) == xFalse || rep.length == 0)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetUnpackParameters: Error receiving reply.\n");
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 0;
+ }
+
+ if ((n = rep.length << 2) > *entries)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetUnpackParameters: Got [%d] bytes of reply data while they should be [%d].\n",
+ n, *entries);
+ #endif
+
+ _XEatData(dpy, (unsigned long) n);
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 0;
+ }
+
+ *entries = n;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetUnpackParameters: Reading [%d] bytes of reply data.\n", n);
+ #endif
+
+ _XReadPad(dpy, (char *) supported_methods, n);
+
+ #ifdef TEST
+
+ fprintf(stderr, "******NXGetUnpackParameters: Got reply with methods: ");
+
+ for (i = 0; i < n; i++)
+ {
+ if (supported_methods[i] != 0)
+ {
+ fprintf(stderr, "[%d]", i);
+ }
+ }
+
+ fprintf(stderr, ".\n");
+
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * Query and enable the MIT-SHM support between the
+ * proxy and the X server. The 'enable' flags must be
+ * true if shared memory PutImages and PutPackedImages
+ * are desired. On return the flags will say if support
+ * has been successfully enabled.
+ *
+ * Note that the the client part is not useful and not
+ * implemented. The size of the segment is chosen by
+ * the proxy. The main purpose of the message is to
+ * reserve the XID that will be used by the remote.
+ */
+
+Status NXGetShmemParameters(Display *dpy, unsigned int *enable_client,
+ unsigned int *enable_server, unsigned int *client_segment,
+ unsigned int *server_segment, unsigned int *client_size,
+ unsigned int *server_size)
+{
+ register xNXGetShmemParametersReq *req;
+
+ register int stage;
+
+ xNXGetShmemParametersReply rep;
+
+ /*
+ * Save the previous handler.
+ */
+
+ int (*handler)(Display *, XErrorEvent *) = _XErrorFunction;
+
+ *client_segment = 0;
+ *server_segment = 0;
+
+ if (*enable_client)
+ {
+ *client_segment = XAllocID(dpy);
+ }
+
+ if (*enable_server)
+ {
+ *server_segment = XAllocID(dpy);
+ }
+
+ LockDisplay(dpy);
+
+ _XErrorFunction = _NXInternalReplyErrorFunction;
+
+ for (stage = 0; stage < 3; stage++)
+ {
+ GetReq(NXGetShmemParameters, req);
+
+ req -> stage = stage;
+
+ req -> enableClient = (*enable_client != 0 ? 1 : 0);
+ req -> enableServer = (*enable_server != 0 ? 1 : 0);
+
+ req -> clientSegment = *client_segment;
+ req -> serverSegment = *server_segment;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetShmemParameters: Sending message opcode [%d] at stage [%d].\n",
+ X_NXGetShmemParameters, stage);
+ #endif
+
+ #ifdef TEST
+
+ if (stage == 0)
+ {
+ fprintf(stderr, "******NXGetShmemParameters: Enable client is [%u] enable server is [%u].\n",
+ *enable_client, *enable_server);
+
+ fprintf(stderr, "******NXGetShmemParameters: Client segment is [%u] server segment is [%u].\n",
+ *client_segment, *server_segment);
+ }
+
+ #endif
+
+ /*
+ * There isn't X server reply in the second stage.
+ * The procedure followed at X server side is:
+ *
+ * Stage 0: Send X_QueryExtension and masquerade
+ * the reply.
+ *
+ * Stage 1: Allocate the shared memory and send
+ * X_ShmAttach to the X server.
+ *
+ * Stage 2: Send X_GetInputFocus and masquerade
+ * the reply.
+ *
+ * The last message is used to force a reply and
+ * collect any X error caused by a failure in the
+ * shared memory initialization.
+ */
+
+ if (stage != 1)
+ {
+ /*
+ * We are only interested in the final reply.
+ */
+
+ if (_XReply(dpy, (xReply *) &rep, 0, xTrue) == xFalse)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetShmemParameters: Error receiving reply.\n");
+ #endif
+
+ _XErrorFunction = handler;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 0;
+ }
+ }
+ }
+
+ /*
+ * Return the settings to client.
+ */
+
+ *enable_client = rep.clientEnabled;
+ *enable_server = rep.serverEnabled;
+
+ *client_size = rep.clientSize;
+ *server_size = rep.serverSize;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetShmemParameters: Got final reply with enabled client [%u] and server [%u].\n",
+ *enable_client, *enable_server);
+
+ fprintf(stderr, "******NXGetShmemParameters: Client segment size [%u] server segment size [%u].\n",
+ *client_size, *server_size);
+ #endif
+
+ _XErrorFunction = handler;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * Get the path to the font server that can be used by the X
+ * server to tunnel the font connections across the NX link.
+ * The path actually represents the TCP port where the proxy
+ * on the NX client side is listening. The agent can tempora-
+ * rily enable the tunneling when it needs a font that is not
+ * available on the client, for example when the session is
+ * migrated from a different X server.
+ *
+ * Note that it is not advisable to use the font server chan-
+ * nel for other purposes than restoring a font that is found
+ * missing at the time the session is migrated to a different
+ * display. This is because the agent implements a caching of
+ * the list of fonts supported by the client as it needs to
+ * advertise only the fonts that can be opened at both sides.
+ */
+
+Status NXGetFontParameters(Display *dpy, unsigned int path_length, char path_data[])
+{
+ register xNXGetFontParametersReq *req;
+
+ xNXGetFontParametersReply rep;
+
+ register unsigned n;
+
+ #ifdef TEST
+ register unsigned i;
+ #endif
+
+ if (path_length < 1)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetFontParameters: No room to store the reply.\n");
+ #endif
+
+ return 0;
+ }
+
+ *path_data = '\0';
+
+ LockDisplay(dpy);
+
+ GetReq(NXGetFontParameters, req);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetFontParameters: Sending message opcode [%d].\n",
+ X_NXGetFontParameters);
+ #endif
+
+ if (_XReply(dpy, (xReply *) &rep, 0, xFalse) == xFalse || rep.length == 0)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetFontParameters: Error receiving reply.\n");
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 0;
+ }
+
+ if ((n = rep.length << 2) > path_length)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetFontParameters: Got [%d] bytes of reply data with only room for [%d].\n",
+ n, path_length);
+ #endif
+
+ _XEatData(dpy, (unsigned long) n);
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 0;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetFontParameters: Reading [%d] bytes of reply data.\n", n);
+ #endif
+
+ _XReadPad(dpy, (char *) path_data, n);
+
+ /*
+ * Check if the string can be fully
+ * contained by the buffer.
+ */
+
+ if (*path_data > path_length - 1)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXGetFontParameters: Inconsistent length in the returned string.\n");
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 0;
+ }
+
+ #ifdef TEST
+
+ fprintf(stderr, "******NXGetFontParameters: Got font path of [%d] bytes and value [",
+ (int) *path_data);
+
+ for (i = 0; i < *path_data; i++)
+ {
+ fprintf(stderr, "%c", *(path_data + i + 1));
+ }
+
+ fprintf(stderr, "].\n");
+
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+unsigned int NXAllocSplit(Display *dpy, unsigned int resource)
+{
+ if (resource == NXAnyResource)
+ {
+ for (resource = 0; resource < NXNumberOfResources; resource++)
+ {
+ if (_NXSplitResources[resource] == 0)
+ {
+ _NXSplitResources[resource] = 1;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXAllocSplit: Reserved resource [%u].\n",
+ resource);
+ #endif
+
+ return resource;
+ }
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******NXAllocSplit: WARNING! Resource limit exausted.\n");
+ #endif
+
+ return NXNoResource;
+ }
+ else if (resource >= 0 && resource < NXNumberOfResources)
+ {
+ #ifdef TEST
+
+ if (_NXSplitResources[resource] == 0)
+ {
+ fprintf(stderr, "******NXAllocSplit: Reserved requested resource [%u].\n",
+ resource);
+ }
+ else
+ {
+ fprintf(stderr, "******NXAllocSplit: Requested resource [%u] already reserved.\n",
+ resource);
+ }
+
+ #endif
+
+ _NXSplitResources[resource] = 1;
+ }
+
+ #ifdef PANIC
+ fprintf(stderr, "******NXAllocSplit: PANIC! Can't reserve requested resource [%u].\n",
+ resource);
+ #endif
+
+ return NXNoResource;
+}
+
+/*
+ * Tell the proxy to split the next messages.
+ */
+
+int NXStartSplit(Display *dpy, unsigned int resource, unsigned int mode)
+{
+ register xNXStartSplitReq *req;
+
+ LockDisplay(dpy);
+
+ GetReq(NXStartSplit, req);
+
+ req -> resource = resource;
+ req -> mode = mode;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXStartSplit: Sending opcode [%d] with resource [%d] mode [%d].\n",
+ X_NXStartSplit, resource, mode);
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * Send the closure of the split sequence and
+ * tell the proxy to send the results.
+ */
+
+int NXEndSplit(Display *dpy, unsigned int resource)
+{
+ register xNXEndSplitReq *req;
+
+ LockDisplay(dpy);
+
+ GetReq(NXEndSplit, req);
+
+ req -> resource = resource;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXEndSplit: Sending opcode [%d] with resource [%d].\n",
+ X_NXStartSplit, resource);
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * This message must be sent whenever the proxy notifies
+ * the client of the completion of a split. If the 'pro-
+ * pagate' field is 0, the proxy will not send the ori-
+ * ginal request to the X server, but will only free the
+ * internal state.
+ */
+
+int NXCommitSplit(Display *dpy, unsigned int resource, unsigned int propagate,
+ unsigned char request, unsigned int position)
+{
+ register xNXCommitSplitReq *req;
+
+ LockDisplay(dpy);
+
+ GetReq(NXCommitSplit, req);
+
+ req -> resource = resource;
+ req -> propagate = propagate;
+ req -> request = request;
+ req -> position = position;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXCommitSplit: Sending opcode [%d] with resource [%d] propagate [%d] "
+ "request [%d] position [%d].\n", X_NXCommitSplit, resource,
+ propagate, request, position);
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+int NXAbortSplit(Display *dpy, unsigned int resource)
+{
+ register xNXAbortSplitReq *req;
+
+ LockDisplay(dpy);
+
+ GetReq(NXAbortSplit, req);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXAbortSplit: Sending message opcode [%d] with resource [%u].\n",
+ X_NXAbortSplit, resource);
+ #endif
+
+ req -> resource = resource;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+int NXFinishSplit(Display *dpy, unsigned int resource)
+{
+ register xNXFinishSplitReq *req;
+
+ LockDisplay(dpy);
+
+ GetReq(NXFinishSplit, req);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXFinishSplit: Sending message opcode [%d] with resource [%u].\n",
+ X_NXFinishSplit, resource);
+ #endif
+
+ req -> resource = resource;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+int NXFreeSplit(Display *dpy, unsigned int resource)
+{
+ register xNXFreeSplitReq *req;
+
+ if (_NXSplitResources[resource] != 0)
+ {
+ LockDisplay(dpy);
+
+ GetReq(NXFreeSplit, req);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXFreeSplit: Sending message opcode [%d] with resource [%u].\n",
+ X_NXFreeSplit, resource);
+ #endif
+
+ req -> resource = resource;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ #ifdef TEST
+ fprintf(stderr, "******NXFreeSplit: Making the resource [%u] newly available.\n",
+ resource);
+ #endif
+
+ _NXSplitResources[resource] = 0;
+ }
+ #ifdef TEST
+ else
+ {
+ fprintf(stderr, "******NXFreeSplit: Nothing to do for resource [%u].\n",
+ resource);
+ }
+ #endif
+
+ return 1;
+}
+
+/*
+ * Tell to remote proxy to discard expose events
+ * of one or more types.
+ */
+
+int NXSetExposeParameters(Display *dpy, int expose, int graphics_expose, int no_expose)
+{
+ register xNXSetExposeParametersReq *req;
+
+ LockDisplay(dpy);
+
+ GetReq(NXSetExposeParameters, req);
+
+ req -> expose = expose;
+ req -> graphicsExpose = graphics_expose;
+ req -> noExpose = no_expose;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetExposeParameters: Sending message opcode [%d] with flags [%d][%d][%d].\n",
+ X_NXSetExposeParameters, req -> expose, req -> graphicsExpose, req -> noExpose);
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * Tell to the local proxy how to handle the next requests.
+ */
+
+int NXSetCacheParameters(Display *dpy, int enable_cache, int enable_split,
+ int enable_save, int enable_load)
+{
+ register xNXSetCacheParametersReq *req;
+
+ LockDisplay(dpy);
+
+ GetReq(NXSetCacheParameters, req);
+
+ req -> enableCache = enable_cache;
+ req -> enableSplit = enable_split;
+ req -> enableSave = enable_save;
+ req -> enableLoad = enable_load;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetCacheParameters: Sending message opcode [%d] with "
+ "flags [%d][%d][%d][%d].\n", X_NXSetCacheParameters, req -> enableCache,
+ req -> enableSplit, req -> enableSave, req -> enableLoad);
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+unsigned int NXAllocUnpack(Display *dpy, unsigned int resource)
+{
+ if (resource == NXAnyResource)
+ {
+ for (resource = 0; resource < NXNumberOfResources; resource++)
+ {
+ if (_NXUnpackResources[resource] == 0)
+ {
+ _NXUnpackResources[resource] = 1;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXAllocUnpack: Reserved resource [%u].\n",
+ resource);
+ #endif
+
+ return resource;
+ }
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******NXAllocUnpack: WARNING! Resource limit exausted.\n");
+ #endif
+
+ return NXNoResource;
+ }
+ else if (resource >= 0 && resource < NXNumberOfResources)
+ {
+ #ifdef TEST
+
+ if (_NXUnpackResources[resource] == 0)
+ {
+ fprintf(stderr, "******NXAllocUnpack: Reserved requested resource [%u].\n",
+ resource);
+ }
+ else
+ {
+ fprintf(stderr, "******NXAllocUnpack: Requested resource [%u] already reserved.\n",
+ resource);
+ }
+
+ #endif
+
+ _NXUnpackResources[resource] = 1;
+ }
+
+ #ifdef PANIC
+ fprintf(stderr, "******NXAllocUnpack: PANIC! Can't reserve requested resource [%u].\n",
+ resource);
+ #endif
+
+ return NXNoResource;
+}
+
+int NXSetUnpackGeometry(Display *dpy, unsigned int resource, Visual *visual)
+{
+ register xNXSetUnpackGeometryReq *req;
+
+ LockDisplay(dpy);
+
+ GetReq(NXSetUnpackGeometry, req);
+
+ req -> resource = resource;
+
+ req -> depth1Bpp = _XGetBitsPerPixel(dpy, 1);
+ req -> depth4Bpp = _XGetBitsPerPixel(dpy, 4);
+ req -> depth8Bpp = _XGetBitsPerPixel(dpy, 8);
+ req -> depth16Bpp = _XGetBitsPerPixel(dpy, 16);
+ req -> depth24Bpp = _XGetBitsPerPixel(dpy, 24);
+ req -> depth32Bpp = _XGetBitsPerPixel(dpy, 32);
+
+ if (visual != NULL)
+ {
+ req -> redMask = visual -> red_mask;
+ req -> greenMask = visual -> green_mask;
+ req -> blueMask = visual -> blue_mask;
+ }
+ else
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXSetUnpackGeometry: PANIC! Can't set the geometry without a visual.\n");
+ #endif
+
+ UnGetReq(NXSetUnpackGeometry);
+
+ UnlockDisplay(dpy);
+
+ return -1;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetUnpackGeometry: Resource [%u] Depth/Bpp [1/%d][4/%d][8/%d]"
+ "[16/%d][24/%d][32/%d].\n", resource, req -> depth1Bpp, req -> depth4Bpp,
+ req -> depth8Bpp, req -> depth16Bpp, req -> depth24Bpp, req -> depth32Bpp);
+
+ fprintf(stderr, "******NXSetUnpackGeometry: red [0x%x] green [0x%x] blue [0x%x].\n",
+ (unsigned) req -> redMask, (unsigned) req -> greenMask, (unsigned) req -> blueMask);
+ #endif
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * Store a colormap table on the remote side.
+ * The colormap can then be used to unpack
+ * an image.
+ */
+
+int NXSetUnpackColormap(Display *dpy, unsigned int resource, unsigned int method,
+ unsigned int entries, const char *data, unsigned int data_length)
+{
+ register xNXSetUnpackColormapReq *req;
+
+ register int dst_data_length;
+
+ LockDisplay(dpy);
+
+ GetReq(NXSetUnpackColormap, req);
+
+ req -> resource = resource;
+ req -> method = method;
+
+ req -> srcLength = data_length;
+ req -> dstLength = entries << 2;
+
+ dst_data_length = ROUNDUP(data_length, 4);
+
+ req -> length += (dst_data_length >> 2);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetUnpackColormap: Resource [%u] data size [%u] destination "
+ "data size [%u].\n", resource, data_length, dst_data_length);
+ #endif
+
+ if (data_length > 0)
+ {
+ if (dpy -> bufptr + dst_data_length <= dpy -> bufmax)
+ {
+ /*
+ * Clean the padding bytes in the request.
+ */
+
+ *((int *) (dpy -> bufptr + dst_data_length - 4)) = 0x0;
+
+ memcpy(dpy -> bufptr, data, data_length);
+
+ dpy -> bufptr += dst_data_length;
+ }
+ else
+ {
+ /*
+ * The _XSend() will pad the request for us.
+ */
+
+ _XSend(dpy, data, data_length);
+ }
+ }
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * Store data of the alpha blending channel
+ * that will be combined with the next image
+ * to be unpacked.
+ */
+
+int NXSetUnpackAlpha(Display *dpy, unsigned int resource, unsigned int method,
+ unsigned int entries, const char *data, unsigned int data_length)
+{
+ register xNXSetUnpackAlphaReq *req;
+
+ register unsigned int dst_data_length;
+
+ LockDisplay(dpy);
+
+ GetReq(NXSetUnpackAlpha, req);
+
+ req -> resource = resource;
+ req -> method = method;
+
+ req -> srcLength = data_length;
+ req -> dstLength = entries;
+
+ dst_data_length = ROUNDUP(data_length, 4);
+
+ req -> length += (dst_data_length >> 2);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetUnpackAlpha: Resource [%u] data size [%u] destination data size [%u].\n",
+ resource, data_length, dst_data_length);
+ #endif
+
+ if (data_length > 0)
+ {
+ if (dpy -> bufptr + dst_data_length <= dpy -> bufmax)
+ {
+ /*
+ * Clean the padding bytes in the request.
+ */
+
+ *((int *) (dpy -> bufptr + dst_data_length - 4)) = 0x0;
+
+ memcpy(dpy -> bufptr, data, data_length);
+
+ dpy -> bufptr += dst_data_length;
+ }
+ else
+ {
+ /*
+ * The _XSend() will pad the request for us.
+ */
+
+ _XSend(dpy, data, data_length);
+ }
+ }
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * Compatibility versions to be used when
+ * connected to a 1.X.X proxy.
+ */
+
+/*
+ * These are for compatibility with the 1.X.X
+ * versions.
+ */
+
+#define sz_xNXSetUnpackColormapCompatReq 8
+
+typedef struct _NXSetUnpackColormapCompatReq {
+ CARD8 reqType;
+ CARD8 resource;
+ CARD16 length B16;
+ CARD32 entries B32;
+} xNXSetUnpackColormapCompatReq;
+
+#define X_NXSetUnpackColormapCompat X_NXSetUnpackColormap
+
+int NXSetUnpackColormapCompat(Display *dpy, unsigned int resource,
+ unsigned int entries, const char *data)
+{
+ register xNXSetUnpackColormapCompatReq *req;
+
+ register char *dst_data;
+
+ register int dst_data_length;
+
+ #ifdef DUMP
+
+ int i;
+
+ #endif
+
+ LockDisplay(dpy);
+
+ GetReq(NXSetUnpackColormapCompat, req);
+
+ req -> resource = resource;
+ req -> entries = entries;
+
+ dst_data_length = entries << 2;
+
+ req -> length += (dst_data_length >> 2);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetUnpackColormapCompat: Resource [%u] number of entries [%u] "
+ "destination data size [%u].\n", resource, entries, dst_data_length);
+ #endif
+
+ if (entries > 0)
+ {
+ if ((dpy -> bufptr + dst_data_length) <= dpy -> bufmax)
+ {
+ dst_data = dpy -> bufptr;
+ }
+ else
+ {
+ if ((dst_data = _XAllocScratch(dpy, dst_data_length)) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXSetUnpackColormapCompat: PANIC! Cannot allocate memory.\n");
+ #endif
+
+ UnGetReq(NXSetUnpackColormapCompat);
+
+ UnlockDisplay(dpy);
+
+ return -1;
+ }
+ }
+
+ memcpy(dst_data, data, entries << 2);
+
+ #ifdef DUMP
+
+ fprintf(stderr, "******NXSetUnpackColormapCompat: Dumping colormap entries:\n");
+
+ for (i = 0; i < entries; i++)
+ {
+ fprintf(stderr, "******NXSetUnpackColormapCompat: [%d] -> [0x%x].\n",
+ i, *((int *) (dst_data + (i * 4))));
+ }
+
+ #endif
+
+ if (dst_data == dpy -> bufptr)
+ {
+ dpy -> bufptr += dst_data_length;
+ }
+ else
+ {
+ _XSend(dpy, dst_data, dst_data_length);
+ }
+ }
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+#define sz_xNXSetUnpackAlphaCompatReq 8
+
+typedef struct _NXSetUnpackAlphaCompatReq {
+ CARD8 reqType;
+ CARD8 resource;
+ CARD16 length B16;
+ CARD32 entries B32;
+} xNXSetUnpackAlphaCompatReq;
+
+#define X_NXSetUnpackAlphaCompat X_NXSetUnpackAlpha
+
+int NXSetUnpackAlphaCompat(Display *dpy, unsigned int resource,
+ unsigned int entries, const char *data)
+{
+ register xNXSetUnpackAlphaCompatReq *req;
+
+ register char *dst_data;
+
+ register unsigned int dst_data_length;
+
+ #ifdef DUMP
+
+ int i;
+
+ #endif
+
+ LockDisplay(dpy);
+
+ GetReq(NXSetUnpackAlphaCompat, req);
+
+ req -> resource = resource;
+ req -> entries = entries;
+
+ dst_data_length = ROUNDUP(entries, 4);
+
+ req -> length += (dst_data_length >> 2);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXSetUnpackAlphaCompat: Resource [%u] number of entries [%u] "
+ "destination data size [%u].\n", resource, entries, dst_data_length);
+ #endif
+
+ if (entries > 0)
+ {
+ if ((dpy -> bufptr + dst_data_length) <= dpy -> bufmax)
+ {
+ dst_data = dpy -> bufptr;
+ }
+ else
+ {
+ if ((dst_data = _XAllocScratch(dpy, dst_data_length)) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXSetUnpackAlphaCompat: PANIC! Cannot allocate memory.\n");
+ #endif
+
+ UnGetReq(NXSetUnpackAlphaCompat);
+
+ UnlockDisplay(dpy);
+
+ return -1;
+ }
+ }
+
+ memcpy(dst_data, data, entries);
+
+ if (dst_data_length != entries)
+ {
+ memset(dst_data + entries, 0, dst_data_length - entries);
+ }
+
+ #ifdef DUMP
+
+ fprintf(stderr, "******NXSetUnpackAlphaCompat: Dumping alpha channel data:\n");
+
+ for (i = 0; i < dst_data_length; i++)
+ {
+ fprintf(stderr, "******NXSetUnpackAlphaCompat: [%d] -> [0x%02x].\n",
+ i, ((unsigned int) *(dst_data + i)) & 0xff);
+ }
+
+ #endif
+
+ if (dst_data == dpy -> bufptr)
+ {
+ dpy -> bufptr += dst_data_length;
+ }
+ else
+ {
+ _XSend(dpy, dst_data, dst_data_length);
+ }
+ }
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+/*
+ * Free any geometry, colormap and alpha channel
+ * data stored by the remote proxy to unpack the
+ * image. Resource, as usual, must be a value
+ * between 0 and 255.
+ */
+
+int NXFreeUnpack(Display *dpy, unsigned int resource)
+{
+ register xNXFreeUnpackReq *req;
+
+ if (_NXUnpackResources[resource] != 0)
+ {
+ LockDisplay(dpy);
+
+ GetReq(NXFreeUnpack, req);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXFreeUnpack: Sending message opcode [%d] with resource [%u].\n",
+ X_NXFreeUnpack, resource);
+ #endif
+
+ req -> resource = resource;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ #ifdef TEST
+ fprintf(stderr, "******NXFreeUnpack: Making the resource [%u] newly available.\n",
+ resource);
+ #endif
+
+ _NXUnpackResources[resource] = 0;
+ }
+ #ifdef TEST
+ else
+ {
+ fprintf(stderr, "******NXFreeUnpack: Nothing to do for resource [%u].\n",
+ resource);
+ }
+ #endif
+
+ return 1;
+}
+
+/*
+ * Wrapper of XCreateImage(). Note that we use offset
+ * field of XImage to store size of source image in
+ * packed format. Note also that method is currently
+ * not stored in the NXignored.
+ */
+
+NXPackedImage *NXCreatePackedImage(Display *dpy, Visual *visual, unsigned int method,
+ unsigned int depth, int format, char *data,
+ int data_length, unsigned int width,
+ unsigned int height, int bitmap_pad,
+ int bytes_per_line)
+{
+ XImage* image;
+
+ image = XCreateImage(dpy, visual, depth, format, 0, data,
+ width, height, bitmap_pad, bytes_per_line);
+
+ if (image != NULL)
+ {
+ image -> xoffset = data_length;
+ }
+
+ return (NXPackedImage *) image;
+}
+
+/*
+ * Wrapper of XDestroyImage().
+ */
+
+int NXDestroyPackedImage(NXPackedImage *image)
+{
+ return XDestroyImage((XImage *) image);
+}
+
+/*
+ * Clean the image data directly in the current buffer.
+ */
+
+int NXCleanImage(XImage *image)
+{
+ #ifdef TEST
+ fprintf(stderr, "******NXCleanImage: Cleaning image with format [%d] depth [%d] "
+ "bits per pixel [%d].\n", image -> format, image -> depth,
+ image -> bits_per_pixel);
+ #endif
+
+ if (image -> format == ZPixmap)
+ {
+ if (image -> depth == 1)
+ {
+ return CleanXYImage(image);
+ }
+ else
+ {
+ return CleanZImage(image);
+ }
+ }
+ else
+ {
+ return CleanXYImage(image);
+ }
+}
+
+NXPackedImage *NXPackImage(Display *dpy, XImage *src_image, unsigned int method)
+{
+ XImage *dst_image;
+
+ const ColorMask *mask;
+
+ unsigned int dst_data_size;
+ unsigned int dst_packed_data_size;
+
+ unsigned int dst_bits_per_pixel;
+ unsigned int dst_packed_bits_per_pixel;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXPackImage: Going to pack a new image with method [%d].\n",
+ method);
+ #endif
+
+ /*
+ * Get the mask out of the method and
+ * check if the visual is supported by
+ * the color reduction algorithm.
+ */
+
+ mask = MethodColorMask(method);
+
+ if (mask == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXPackImage: WARNING! No mask to apply for pack method [%d].\n",
+ method);
+ #endif
+
+ return NULL;
+ }
+ else if (CanMaskImage(src_image, mask) == 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXPackImage: PANIC! Invalid source with format [%d] depth [%d] bits per pixel [%d].\n",
+ src_image -> format, src_image -> depth, src_image -> bits_per_pixel);
+
+ fprintf(stderr, "******NXPackImage: PANIC! Visual colormask is red 0x%lx green 0x%lx blue 0x%lx.\n",
+ src_image -> red_mask, src_image -> green_mask, src_image -> blue_mask);
+ #endif
+
+ return NULL;
+ }
+
+ /*
+ * Create a destination image from
+ * source and apply the color mask.
+ */
+
+ if ((dst_image = (XImage *) Xmalloc(sizeof(XImage))) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXPackImage: PANIC! Cannot allocate [%d] bytes for the image.\n",
+ (int) sizeof(XImage));
+ #endif
+
+ return NULL;
+ }
+
+ *dst_image = *src_image;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXPackImage: Source width [%d], bytes per line [%d] with depth [%d].\n",
+ src_image -> width, src_image -> bytes_per_line, src_image -> depth);
+ #endif
+
+ dst_data_size = src_image -> bytes_per_line * src_image -> height;
+
+ dst_image -> data = Xmalloc(dst_data_size);
+
+ if (dst_image -> data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXPackImage: PANIC! Cannot allocate [%d] bytes for masked image data.\n",
+ dst_data_size);
+ #endif
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * If the pixel resulting from the mask
+ * needs more bits than available, then
+ * just clean the padding bits in the
+ * image.
+ */
+
+ dst_bits_per_pixel = dst_image -> bits_per_pixel;
+ dst_packed_bits_per_pixel = MethodBitsPerPixel(method);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXPackImage: Destination depth [%d], bits per pixel [%d], packed bits per pixel [%d].\n",
+ dst_image -> depth, dst_bits_per_pixel, dst_packed_bits_per_pixel);
+ #endif
+
+ if (dst_packed_bits_per_pixel > dst_bits_per_pixel ||
+ ShouldMaskImage(src_image, mask) == 0)
+ {
+ /*
+ * Should use the same data for source
+ * and destination to avoid the memcpy.
+ */
+
+ if (CopyAndCleanImage(src_image, dst_image) <= 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXPackImage: PANIC! Failed to clean the image.\n");
+ #endif
+
+ Xfree(dst_image -> data);
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+ }
+ else if (MaskImage(mask, src_image, dst_image) <= 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXPackImage: PANIC! Failed to apply the color mask.\n");
+ #endif
+
+ Xfree(dst_image -> data);
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * Let's pack the same pixels in fewer bytes.
+ * Note that we save a new memory allocation
+ * by using the same image as source and des-
+ * tination. This means that PackImage() must
+ * be able to handle ovelapping areas.
+ */
+
+ #ifdef TEST
+ fprintf(stderr, "******NXPackImage: Plain bits per pixel [%d], data size [%d].\n",
+ dst_bits_per_pixel, dst_data_size);
+ #endif
+
+ dst_packed_data_size = dst_data_size * dst_packed_bits_per_pixel /
+ dst_bits_per_pixel;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXPackImage: Packed bits per pixel [%d], data size [%d].\n",
+ dst_packed_bits_per_pixel, dst_packed_data_size);
+ #endif
+
+ if (PackImage(method, dst_data_size, dst_image,
+ dst_packed_data_size, dst_image) <= 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXPackImage: PANIC! Failed to pack image from [%d] to [%d] bits per pixel.\n",
+ dst_bits_per_pixel, dst_packed_bits_per_pixel);
+ #endif
+
+ Xfree(dst_image -> data);
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * Save data size in xoffset field
+ * to comply with NX packed images.
+ */
+
+ dst_image -> xoffset = dst_packed_data_size;
+
+ return dst_image;
+}
+
+/*
+ * NXInPlacePackImage creates a NXPackedImage
+ * from a XImage, sharing the same data buffer.
+ * Is up to the caller to free the data buffer
+ * only once.
+ */
+
+XImage *NXInPlacePackImage(Display *dpy, XImage *src_image, unsigned int method)
+{
+ XImage *dst_image;
+
+ const ColorMask *mask;
+
+ unsigned int dst_data_size;
+ unsigned int dst_packed_data_size;
+
+ unsigned int dst_bits_per_pixel;
+ unsigned int dst_packed_bits_per_pixel;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXInPlacePackImage: Going to pack a new image with method [%d].\n",
+ method);
+ #endif
+
+ /*
+ * Get mask out of method and check if
+ * visual is supported by current color
+ * reduction algorithm.
+ */
+
+ mask = MethodColorMask(method);
+
+ if (mask == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXInPlacePackImage: WARNING! No mask to apply for pack method [%d].\n",
+ method);
+ #endif
+
+ return NULL;
+ }
+ else if (CanMaskImage(src_image, mask) == 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXInPlacePackImage: PANIC! Invalid source with format [%d] depth [%d] bits per pixel [%d].\n",
+ src_image -> format, src_image -> depth, src_image -> bits_per_pixel);
+
+ fprintf(stderr, "******NXInPlacePackImage: PANIC! Visual colormask is red 0x%lx green 0x%lx blue 0x%lx.\n",
+ src_image -> red_mask, src_image -> green_mask, src_image -> blue_mask);
+ #endif
+ return NULL;
+ }
+
+ /*
+ * Create a destination image from
+ * source and apply the color mask.
+ */
+
+ if ((dst_image = (XImage *) Xmalloc(sizeof(XImage))) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXInPlacePackImage: PANIC! Cannot allocate [%d] bytes for the image.\n",
+ (int) sizeof(XImage));
+ #endif
+
+ return NULL;
+ }
+
+ *dst_image = *src_image;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXInPlacePackImage: Source width [%d], bytes per line [%d] with depth [%d].\n",
+ src_image -> width, src_image -> bytes_per_line, src_image -> depth);
+ #endif
+
+ dst_data_size = src_image -> bytes_per_line * src_image -> height;
+
+ dst_image -> data = src_image -> data;
+
+ /*
+ * If pixel resulting from mask needs
+ * more bits than available, then just
+ * clean the pad bits in image.
+ */
+
+ dst_bits_per_pixel = dst_image -> bits_per_pixel;
+ dst_packed_bits_per_pixel = MethodBitsPerPixel(method);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXInPlacePackImage: Destination depth [%d], bits per pixel [%d], packed bits per pixel [%d].\n",
+ dst_image -> depth, dst_bits_per_pixel, dst_packed_bits_per_pixel);
+ #endif
+
+ if (dst_packed_bits_per_pixel > dst_bits_per_pixel ||
+ ShouldMaskImage(src_image, mask) == 0)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXInPlacePackImage: Just clean image packed_bits_per_pixel[%d], bits_per_pixel[%d].\n",
+ dst_packed_bits_per_pixel, dst_bits_per_pixel);
+ #endif
+
+ if (NXCleanImage(dst_image) <= 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXInPlacePackImage: PANIC! Failed to clean the image.\n");
+ #endif
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+ }
+ else if (MaskInPlaceImage(mask, dst_image) <= 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXInPlacePackImage: PANIC! Failed to apply the color mask.\n");
+ #endif
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * Let's pack the same pixels in fewer bytes.
+ * Note that we save a new memory allocation
+ * by using the same image as source and des-
+ * tination. This means that PackImage() must
+ * be able to handle ovelapping areas.
+ */
+
+ #ifdef TEST
+ fprintf(stderr, "******NXInPlacePackImage: Plain bits per pixel [%d], data size [%d].\n",
+ dst_bits_per_pixel, dst_data_size);
+ #endif
+
+ dst_packed_data_size = dst_data_size * dst_packed_bits_per_pixel /
+ dst_bits_per_pixel;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXInPlacePackImage: Packed bits per pixel [%d], data size [%d].\n",
+ dst_packed_bits_per_pixel, dst_packed_data_size);
+ #endif
+
+ /*
+ * Save data size in xoffset field
+ * to comply with NX packed images.
+ */
+
+ dst_image -> xoffset = dst_packed_data_size;
+
+ return dst_image;
+}
+
+int NXPutPackedImage(Display *dpy, unsigned int resource, Drawable drawable,
+ void *gc, NXPackedImage *image, unsigned int method,
+ unsigned int depth, int src_x, int src_y, int dst_x,
+ int dst_y, unsigned int width, unsigned int height)
+{
+ register xNXPutPackedImageReq *req;
+
+ register unsigned int src_data_length;
+ register unsigned int dst_data_length;
+
+ LockDisplay(dpy);
+
+ FlushGC(dpy, (GC) gc);
+
+ GetReq(NXPutPackedImage, req);
+
+ req -> resource = resource;
+ req -> drawable = drawable;
+ req -> gc = ((GC) gc) -> gid;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXPutPackedImage: Image resource [%d] drawable [%d] gc [%d].\n",
+ req -> resource, (int) req -> drawable, (int) req -> gc);
+ #endif
+
+ /*
+ * There is no leftPad field in request. We only
+ * support a leftPad of 0. Anyway, X imposes a
+ * leftPad of 0 in case of ZPixmap format.
+ */
+
+ req -> format = image -> format;
+
+ /*
+ * Source depth, as well as width and height,
+ * are taken from the image structure.
+ */
+
+ req -> srcDepth = image -> depth;
+
+ req -> srcX = src_x;
+ req -> srcY = src_y;
+
+ req -> srcWidth = image -> width;
+ req -> srcHeight = image -> height;
+
+ /*
+ * The destination depth is provided
+ * by the caller.
+ */
+
+ req -> dstDepth = depth;
+
+ req -> dstX = dst_x;
+ req -> dstY = dst_y;
+
+ req -> dstWidth = width;
+ req -> dstHeight = height;
+
+ req -> method = method;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXPutPackedImage: Source image depth [%d] destination depth [%d] "
+ "method [%d].\n", req -> srcDepth, req -> dstDepth, req -> method);
+ #endif
+
+ /*
+ * Source data length is the size of image in packed format,
+ * as stored in xoffset field of XImage. Destination data
+ * size is calculated according to bytes per line of target
+ * image, so the caller must provide the right depth at the
+ * time XImage structure is created.
+ */
+
+ req -> srcLength = image -> xoffset;
+
+ if (image -> width == (int) width &&
+ image -> height == (int) height)
+ {
+ req -> dstLength = image -> bytes_per_line * image -> height;
+ }
+ else if (image -> format == ZPixmap)
+ {
+ req -> dstLength = ROUNDUP((image -> bits_per_pixel * width),
+ image -> bitmap_pad) * height >> 3;
+ }
+ else
+ {
+ req -> dstLength = ROUNDUP(width, image -> bitmap_pad) * height >> 3;
+ }
+
+ src_data_length = image -> xoffset;
+
+ dst_data_length = ROUNDUP(src_data_length, 4);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXPutPackedImage: Source data length [%d] request data length [%d].\n",
+ src_data_length, dst_data_length);
+ #endif
+
+ req -> length += (dst_data_length >> 2);
+
+ if (src_data_length > 0)
+ {
+ if (dpy -> bufptr + dst_data_length <= dpy -> bufmax)
+ {
+ /*
+ * Clean the padding bytes in the request.
+ */
+
+ *((int *) (dpy -> bufptr + dst_data_length - 4)) = 0x0;
+
+ memcpy(dpy -> bufptr, image -> data, src_data_length);
+
+ dpy -> bufptr += dst_data_length;
+ }
+ else
+ {
+ /*
+ * The _XSend() will pad the request for us.
+ */
+
+ _XSend(dpy, image -> data, src_data_length);
+ }
+ }
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+int NXAllocColors(Display *dpy, Colormap colormap, unsigned int entries,
+ XColor screens_in_out[], Bool results_in_out[])
+{
+ Status result = 0;
+ xAllocColorReply rep;
+ register xAllocColorReq *req;
+
+ Bool alloc_error = False;
+
+ register unsigned int i;
+
+ LockDisplay(dpy);
+
+ for (i = 0; i < entries; i++)
+ {
+ GetReq(AllocColor, req);
+
+ req -> cmap = colormap;
+
+ req -> red = screens_in_out[i].red;
+ req -> green = screens_in_out[i].green;
+ req -> blue = screens_in_out[i].blue;
+ }
+
+ for (i = 0; i < entries; i++)
+ {
+ result = _XReply(dpy, (xReply *) &rep, 0, xTrue);
+
+ if (result)
+ {
+ screens_in_out[i].pixel = rep.pixel;
+
+ screens_in_out[i].red = rep.red;
+ screens_in_out[i].green = rep.green;
+ screens_in_out[i].blue = rep.blue;
+
+ results_in_out[i] = True;
+ }
+ else
+ {
+ results_in_out[i] = False;
+
+ alloc_error = True;
+ }
+ }
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return (alloc_error == False);
+}
+
+char *NXEncodeColormap(const char *src_data, unsigned int src_size, unsigned int *dst_size)
+{
+ return ColormapCompressData(src_data, src_size, dst_size);
+}
+
+char *NXEncodeAlpha(const char *src_data, unsigned int src_size, unsigned int *dst_size)
+{
+ return AlphaCompressData(src_data, src_size, dst_size);
+}
+
+NXPackedImage *NXEncodeRgb(XImage *src_image, unsigned int method, unsigned int quality)
+{
+ NXPackedImage *dst_image = NULL;
+
+ unsigned int dst_size;
+
+ /*
+ * Create a new image structure as a copy
+ * of the source.
+ */
+
+ if ((dst_image = (NXPackedImage *) Xmalloc(sizeof(NXPackedImage))) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeRgb: PANIC! Cannot allocate [%d] bytes for the image.\n",
+ (int) sizeof(XImage));
+ #endif
+
+ return NULL;
+ }
+
+ *dst_image = *src_image;
+
+ dst_image -> data = RgbCompressData(src_image, &dst_size);
+
+ if (dst_image -> data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeRgb: PANIC! Rgb compression failed.\n");
+ #endif
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * Store the Rgb size in the xoffset field.
+ */
+
+ dst_image -> xoffset = dst_size;
+
+ return dst_image;
+}
+
+NXPackedImage *NXEncodeRle(XImage *src_image, unsigned int method, unsigned int quality)
+{
+ NXPackedImage *dst_image = NULL;
+
+ unsigned int dst_size;
+
+ /*
+ * Create a new image structure as a copy
+ * of the source.
+ */
+
+ if ((dst_image = (NXPackedImage *) Xmalloc(sizeof(NXPackedImage))) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeRle: PANIC! Cannot allocate [%d] bytes for the image.\n",
+ (int) sizeof(XImage));
+ #endif
+
+ return NULL;
+ }
+
+ *dst_image = *src_image;
+
+ dst_image -> data = RleCompressData(src_image, &dst_size);
+
+ if (dst_image -> data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeRle: PANIC! Rle compression failed.\n");
+ #endif
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * Store the Rle size in the xoffset field.
+ */
+
+ dst_image -> xoffset = dst_size;
+
+ return dst_image;
+}
+
+NXPackedImage *NXEncodeBitmap(XImage *src_image, unsigned int method, unsigned int quality)
+{
+ NXPackedImage *dst_image = NULL;
+
+ unsigned int dst_size;
+
+ /*
+ * Create a new image structure as a copy
+ * of the source.
+ */
+
+ if ((dst_image = (NXPackedImage *) Xmalloc(sizeof(NXPackedImage))) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeBitmap: PANIC! Cannot allocate [%d] bytes for the image.\n",
+ (int) sizeof(XImage));
+ #endif
+
+ return NULL;
+ }
+
+ *dst_image = *src_image;
+
+ dst_image -> data = BitmapCompressData(src_image, &dst_size);
+
+ if (dst_image -> data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeBitmap: PANIC! Bitmap compression failed.\n");
+ #endif
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * Store the bitmap size in the xoffset field.
+ */
+
+ dst_image -> xoffset = dst_size;
+
+ return dst_image;
+}
+
+NXPackedImage *NXEncodeJpeg(XImage *src_image, unsigned int method, unsigned int quality)
+{
+ NXPackedImage *dst_image = NULL;
+
+ int size;
+
+ /*
+ * Check if the bpp of the image is valid
+ * for the Jpeg compression.
+ */
+
+ if (src_image -> bits_per_pixel < 15)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeJpeg: PANIC! Invalid bpp for Jpeg compression [%d]\n.",
+ src_image -> bits_per_pixel);
+ #endif
+
+ return NULL;
+ }
+
+ /*
+ * Create the destination image as a copy
+ * of the source.
+ */
+
+ if ((dst_image = (NXPackedImage *) Xmalloc(sizeof(NXPackedImage))) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeJpeg: PANIC! Cannot allocate [%d] bytes for the Jpeg image.\n",
+ (int) sizeof(NXPackedImage));
+ #endif
+
+ return NULL;
+ }
+
+ *dst_image = *src_image;
+
+ dst_image -> data = JpegCompressData(src_image, quality, &size);
+
+ if (dst_image -> data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodeJpeg: PANIC! Jpeg compression failed.\n");
+ #endif
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * Store the Jpeg size in the xoffset field.
+ */
+
+ dst_image -> xoffset = size;
+
+ return dst_image;
+}
+
+NXPackedImage *NXEncodePng(XImage *src_image, unsigned int method, unsigned int quality)
+{
+ NXPackedImage *dst_image = NULL;
+
+ int size;
+
+ /*
+ * Check if the bpp of the image is valid
+ * for png compression.
+ */
+
+ if (src_image -> bits_per_pixel < 15)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodePng: PANIC! Invalid bpp for Png compression [%d].\n",
+ src_image -> bits_per_pixel);
+ #endif
+
+ return NULL;
+ }
+
+ if ((dst_image = (NXPackedImage *) Xmalloc(sizeof(NXPackedImage))) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodePng: PANIC! Cannot allocate [%d] bytes for the Png image.\n",
+ (int) sizeof(NXPackedImage));
+ #endif
+
+ return NULL;
+ }
+
+ *dst_image = *src_image;
+
+ dst_image -> data = PngCompressData(dst_image, &size);
+
+ if (dst_image -> data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXEncodePng: PANIC! Png compression failed.\n");
+ #endif
+
+ Xfree(dst_image);
+
+ return NULL;
+ }
+
+ /*
+ * Store the Png size in the xoffset field.
+ */
+
+ dst_image -> xoffset = size;
+
+ return dst_image;
+}
+
+int NXEncodeColors(XImage *src_image, NXColorTable *color_table, int nb_max)
+{
+ int x, y, t, p;
+
+ long pixel;
+
+ /*
+ * We need a smarter way to extract
+ * the colors from the image and
+ * create a color table.
+ */
+
+ memset(color_table, 0, nb_max * sizeof(NXColorTable));
+
+ for (x = 0, p = 0; x < src_image -> width; x++)
+ {
+ for (y = 0; y < src_image -> height; y++)
+ {
+ pixel = XGetPixel(src_image, x, y);
+
+ for (t = 0; t < nb_max; t++)
+ {
+ if ( color_table[t].found == 0)
+ {
+ color_table[t].pixel = pixel;
+ color_table[t].found = 1;
+
+ p++;
+
+ break;
+ }
+ else if ((color_table[t].pixel) == pixel)
+ {
+ break;
+ }
+ }
+
+ if (p == nb_max)
+ {
+ return nb_max + 1;
+ }
+ }
+ }
+
+ return p;
+}
+
+void NXMaskImage(XImage *image, unsigned int method)
+{
+ unsigned int maskMethod;
+
+ const ColorMask *mask;
+
+ /*
+ * Choose the correct mask method
+ */
+
+ switch(method)
+ {
+ case PACK_JPEG_8_COLORS:
+ case PACK_PNG_8_COLORS:
+ {
+ maskMethod = MASK_8_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_8_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_64_COLORS:
+ case PACK_PNG_64_COLORS:
+ {
+ maskMethod = MASK_64_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_64K_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_256_COLORS:
+ case PACK_PNG_256_COLORS:
+ {
+ maskMethod = MASK_256_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_256_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_512_COLORS:
+ case PACK_PNG_512_COLORS:
+ {
+ maskMethod = MASK_512_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_512K_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_4K_COLORS:
+ case PACK_PNG_4K_COLORS:
+ {
+ maskMethod = MASK_4K_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_4K_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_32K_COLORS:
+ case PACK_PNG_32K_COLORS:
+ {
+ maskMethod = MASK_32K_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_32K_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_64K_COLORS:
+ case PACK_PNG_64K_COLORS:
+ {
+ maskMethod = MASK_64K_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_64K_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_256K_COLORS:
+ case PACK_PNG_256K_COLORS:
+ {
+ maskMethod = MASK_256K_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_256K_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_2M_COLORS:
+ case PACK_PNG_2M_COLORS:
+ {
+ maskMethod = MASK_2M_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_2M_COLORS\n");
+ #endif
+
+ break;
+ }
+ case PACK_JPEG_16M_COLORS:
+ case PACK_PNG_16M_COLORS:
+ {
+ maskMethod = MASK_16M_COLORS;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXMaskImage: Method is MASK_16M_COLORS\n");
+ #endif
+
+ break;
+ }
+ default:
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXMaskImage: PANIC! Cannot find mask method for pack method [%d]\n",
+ method);
+ #endif
+
+ return;
+ }
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******NXMaskImage: packMethod[%d] => maskMethod[%d]\n",
+ method, maskMethod);
+ #endif
+
+ /*
+ * Get mask out of method and check if
+ * visual is supported by current color
+ * reduction algorithm.
+ */
+
+ mask = MethodColorMask(maskMethod);
+
+ if (mask == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXMaskImage: PANIC! No mask to apply for pack method [%d].\n",
+ method);
+ #endif
+
+ return;
+ }
+ else if (CanMaskImage(image, mask) == 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXMaskImage: PANIC! Invalid source with format [%d] depth [%d] bits per pixel [%d].\n",
+ image -> format, image -> depth, image -> bits_per_pixel);
+
+ fprintf(stderr, "******NXMaskImage: PANIC! Visual colormask is red 0x%lx green 0x%lx blue 0x%lx.\n",
+ image -> red_mask, image -> green_mask, image -> blue_mask);
+ #endif
+
+ return;
+ }
+
+ /*
+ * Calling ShouldMaskImage you get 0 in the case
+ * of MASK_256_COLORS and MASK_64K_COLORS, which
+ * means that the image should not be masked.
+ */
+
+ if (ShouldMaskImage(image, mask) == 0)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******NXMaskImage: the image will not be masked\n");
+ #endif
+ }
+ else
+ {
+ if (MaskInPlaceImage(mask, image) <= 0)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXMaskImage: PANIC! Failed to apply the color mask in place.\n");
+ #endif
+ }
+ }
+}
+
+/*
+ * The display parameter is ignored.
+ */
+
+void NXInitCache(Display *dpy, int entries)
+{
+ if (NXImageCache != NULL && NXImageCacheSize == entries)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******NXInitCache: Nothing to do with image cache at [%p] and [%d] entries.\n",
+ NXImageCache, NXImageCacheSize);
+ #endif
+
+ return;
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXInitCache: Initializing the cache with [%d] entries.\n",
+ entries);
+ #endif
+
+ NXImageCacheSize = 0;
+
+ if (NXImageCache != NULL)
+ {
+ Xfree(NXImageCache);
+
+ NXImageCache = NULL;
+ }
+
+ if (entries > 0)
+ {
+ NXImageCache = Xmalloc(entries * sizeof(_NXImageCacheEntry));
+
+ if (NXImageCache != NULL)
+ {
+ memset(NXImageCache, 0, entries * sizeof(_NXImageCacheEntry));
+
+ NXImageCacheSize = entries;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXInitCache: Image cache initialized with [%d] entries.\n", entries);
+ #endif
+ }
+ }
+}
+
+#ifdef DUMP
+
+void _NXCacheDump(const char *label)
+{
+ char s[MD5_LENGTH * 2 + 1];
+
+ int i;
+ int j;
+
+ #ifdef DEBUG
+ fprintf(stderr, "%s: Dumping the content of image cache:\n", label);
+ #endif
+
+ for (i = 0; i < NXImageCacheSize; i++)
+ {
+ if (NXImageCache[i].image == NULL)
+ {
+ break;
+ }
+
+ for (j = 0; j < MD5_LENGTH; j++)
+ {
+ sprintf(s + (j * 2), "%02X", ((unsigned char *) NXImageCache[i].md5)[j]);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "%s: [%d][%s].\n", label, i, s);
+ #endif
+ }
+}
+
+#endif
+
+XImage *NXCacheFindImage(NXPackedImage *src_image, unsigned int *method, unsigned char **md5)
+{
+ md5_state_t new_state;
+ md5_byte_t *new_md5;
+ unsigned int data_size, i;
+
+ if (NXImageCache == NULL)
+ {
+ return NULL;
+ }
+
+ /*
+ * Will return the allocated checksum
+ * if the image is not found.
+ */
+
+ *md5 = NULL;
+
+ if ((new_md5 = Xmalloc(MD5_LENGTH)) == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCacheFindImage: Can't allocate memory for the checksum.\n");
+ #endif
+
+ return NULL;
+ }
+
+ data_size = (src_image -> bytes_per_line * src_image -> height);
+
+ md5_init(&new_state);
+
+ md5_append(&new_state, (unsigned char *) &src_image -> width, sizeof(int));
+ md5_append(&new_state, (unsigned char *) &src_image -> height, sizeof(int));
+
+ md5_append(&new_state, (unsigned char *) src_image -> data, data_size);
+
+ md5_finish(&new_state, new_md5);
+
+ for (i = 0; i < NXImageCacheSize; i++)
+ {
+ if (NXImageCache[i].image != NULL)
+ {
+ if (memcmp(NXImageCache[i].md5, new_md5, MD5_LENGTH) == 0)
+ {
+ _NXImageCacheEntry found;
+
+ found.image = NXImageCache[i].image;
+ found.method = NXImageCache[i].method;
+ found.md5 = NXImageCache[i].md5;
+
+ *method = found.method;
+
+ NXImageCacheHits++;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXCacheFindImage: Found at position [%d] with hits [%d] and [%d] packs.\n",
+ i, NXImageCacheHits, NXImageCacheOps);
+ #endif
+
+ Xfree(new_md5);
+
+ /*
+ * Move the images down one slot, from
+ * the head of the list, and place the
+ * image just found at top.
+ */
+
+ if (i > 16)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******NXCacheFindImage: Moving the image at the head of the list.\n");
+ #endif
+
+ memmove(&NXImageCache[1], &NXImageCache[0], (i * sizeof(_NXImageCacheEntry)));
+
+ NXImageCache[0].image = found.image;
+ NXImageCache[0].method = found.method;
+ NXImageCache[0].md5 = found.md5;
+
+ #ifdef DUMP
+
+ _NXCacheDump("******NXCacheFindImage");
+
+ #endif
+ }
+
+ /*
+ * Return the checksum and image
+ * structure allocated in cache.
+ */
+
+ *md5 = found.md5;
+
+ return found.image;
+ }
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ *md5 = new_md5;
+
+ return NULL;
+}
+
+/*
+ * Add a packed image to the cache. A new image
+ * structure is allocated and copied, data and
+ * checksum are inherited from the passed image.
+ */
+
+int NXCacheAddImage(NXPackedImage *image, unsigned int method, unsigned char *md5)
+{
+ unsigned int i;
+
+ if (image == NULL || image -> data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCacheAddImage: PANIC! Invalid image passed to function.\n");
+ #endif
+
+ return -1;
+ }
+
+ i = (NXImageCacheOps < NXImageCacheSize) ? NXImageCacheOps : NXImageCacheSize;
+
+ if (NXImageCacheOps >= NXImageCacheSize)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******NXCacheAddImage: Freeing up the oldest entry.\n");
+ #endif
+
+ i--;
+
+ Xfree(NXImageCache[NXImageCacheSize - 1].image -> data);
+ Xfree(NXImageCache[NXImageCacheSize - 1].image);
+ Xfree(NXImageCache[NXImageCacheSize - 1].md5);
+ }
+
+ if (i > 0)
+ {
+ memmove(&NXImageCache[1], &NXImageCache[0], i * sizeof(_NXImageCacheEntry));
+ }
+
+ NXImageCacheOps++;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXCacheAddImage: Going to add new image with data size [%d].\n",
+ image -> xoffset);
+ #endif
+
+ NXImageCache[0].image = image;
+ NXImageCache[0].method = method;
+ NXImageCache[0].md5 = md5;
+
+ #ifdef DUMP
+
+ _NXCacheDump("******NXCacheAddImage");
+
+ #endif
+
+ return 1;
+}
+
+/*
+ * The display parameter is ignored.
+ */
+
+void NXFreeCache(Display *dpy)
+{
+ int i;
+
+ if (NXImageCache == NULL)
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******NXFreeCache: Nothing to do with a null image cache.\n");
+ #endif
+
+ return;
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******NXFreeCache: Freeing the cache with [%d] entries.\n",
+ NXImageCacheSize);
+ #endif
+
+ for (i = 0; i < NXImageCacheSize; i++)
+ {
+ if (NXImageCache[i].image != NULL)
+ {
+ if (NXImageCache[i].image -> data != NULL)
+ {
+ Xfree(NXImageCache[i].image -> data);
+ }
+
+ Xfree(NXImageCache[i].image);
+
+ NXImageCache[i].image = NULL;
+ }
+
+ if (NXImageCache[i].md5 != NULL)
+ {
+ Xfree(NXImageCache[i].md5);
+
+ NXImageCache[i].md5 = NULL;
+ }
+ }
+
+ Xfree(NXImageCache);
+
+ NXImageCache = NULL;
+
+ NXImageCacheSize = 0;
+ NXImageCacheHits = 0;
+ NXImageCacheOps = 0;
+}
+
+static void _NXNotifyImage(Display *dpy, int resource, Bool success)
+{
+ XEvent async_event;
+
+ /*
+ * Enqueue an event to tell client
+ * the result of GetImage.
+ */
+
+ async_event.type = ClientMessage;
+
+ async_event.xclient.serial = _NXCollectedImages[resource] -> sequence;
+
+ async_event.xclient.window = 0;
+ async_event.xclient.message_type = 0;
+ async_event.xclient.format = 32;
+
+ async_event.xclient.data.l[0] = NXCollectImageNotify;
+ async_event.xclient.data.l[1] = resource;
+ async_event.xclient.data.l[2] = success;
+
+ XPutBackEvent(dpy, &async_event);
+}
+
+static Bool _NXCollectImageHandler(Display *dpy, xReply *rep, char *buf,
+ int len, XPointer data)
+{
+ register _NXCollectImageState *state;
+
+ register xGetImageReply *async_rep;
+
+ char *async_head;
+ char *async_data;
+
+ int async_size;
+
+ state = (_NXCollectImageState *) data;
+
+ if ((rep -> generic.sequenceNumber % 65536) !=
+ ((int)(state -> sequence) % 65536))
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectImageHandler: Unmatched sequence [%d] for opcode [%d] "
+ "with length [%d].\n", rep -> generic.sequenceNumber, rep -> generic.type,
+ (int) rep -> generic.length << 2);
+ #endif
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectImageHandler: Going to handle asynchronous GetImage reply.\n");
+ #endif
+
+ /*
+ * As even reply data is managed asynchronously,
+ * we can use state to get to vector and vector
+ * to get to handler. In this way, we can safely
+ * dequeue and free the handler itself.
+ */
+
+ DeqAsyncHandler(dpy, state -> handler);
+
+ Xfree(state -> handler);
+
+ state -> handler = NULL;
+
+ if (rep -> generic.type == X_Error)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectImageHandler: Error received from X server for resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyImage(dpy, state -> resource, False);
+
+ _NXCollectedImages[state -> resource] = NULL;
+
+ Xfree(state);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectImageHandler: Matched request with sequence [%ld].\n",
+ state -> sequence);
+ #endif
+
+ async_size = SIZEOF(xGetImageReply);
+
+ async_head = Xmalloc(async_size);
+
+ if (async_head == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectImageHandler: PANIC! Failed to allocate memory with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyImage(dpy, state -> resource, False);
+
+ _NXCollectedImages[state -> resource] = NULL;
+
+ Xfree(state);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectImageHandler: Going to get reply with size [%d].\n",
+ (int) rep -> generic.length << 2);
+ #endif
+
+ async_rep = (xGetImageReply *) _XGetAsyncReply(dpy, async_head, rep, buf, len, 0, False);
+
+ if (async_rep == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectImageHandler: PANIC! Failed to get reply with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyImage(dpy, state -> resource, False);
+
+ _NXCollectedImages[state -> resource] = NULL;
+
+ Xfree(state);
+
+ Xfree(async_head);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectImageHandler: Got reply with depth [%d] visual [%d] size [%d].\n",
+ async_rep -> depth, (int) async_rep -> visual, (int) async_rep -> length << 2);
+ #endif
+
+ async_size = async_rep -> length << 2;
+
+ if (async_size > 0)
+ {
+ async_data = Xmalloc(async_size);
+
+ if (async_data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectImageHandler: PANIC! Failed to allocate memory with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyImage(dpy, state -> resource, False);
+
+ _NXCollectedImages[state -> resource] = NULL;
+
+ Xfree(state);
+
+ Xfree(async_head);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectImageHandler: Going to get data with size [%d].\n",
+ async_size);
+ #endif
+
+ _XGetAsyncData(dpy, async_data, buf, len, SIZEOF(xGetImageReply), async_size, async_size);
+
+ /*
+ * From now on we can return True, as all
+ * data has been consumed from buffer.
+ */
+
+ if (state -> format == XYPixmap)
+ {
+ unsigned long depth = DepthOnes(state -> mask & (((unsigned long)0xFFFFFFFF) >>
+ (32 - async_rep -> depth)));
+
+ state -> image = XCreateImage(dpy, _XVIDtoVisual(dpy, async_rep -> visual),
+ depth, XYPixmap, 0, async_data, state -> width,
+ state -> height, dpy -> bitmap_pad, 0);
+ }
+ else
+ {
+ state -> image = XCreateImage(dpy, _XVIDtoVisual(dpy, async_rep -> visual),
+ async_rep -> depth, ZPixmap, 0, async_data, state -> width,
+ state -> height, _XGetScanlinePad(dpy, async_rep -> depth), 0);
+ }
+
+ if (state -> image == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectImageHandler: PANIC! Failed to create image for resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyImage(dpy, state -> resource, False);
+
+ _NXCollectedImages[state -> resource] = NULL;
+
+ Xfree(state);
+
+ Xfree(async_head);
+ Xfree(async_data);
+
+ return True;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectImageHandler: Successfully stored image data for resource [%d].\n",
+ state -> resource);
+ #endif
+ }
+ #ifdef WARNING
+ else
+ {
+ fprintf(stderr, "******_NXCollectImageHandler: WARNING! Null image data stored for resource [%d].\n",
+ state -> resource);
+ }
+ #endif
+
+ _NXNotifyImage(dpy, state -> resource, True);
+
+ Xfree(async_head);
+
+ return True;
+}
+
+int NXGetCollectImageResource(Display *dpy)
+{
+ int i;
+
+ for (i = 0; i < NXNumberOfResources; i++)
+ {
+ if (_NXCollectedImages[i] == NULL)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int NXCollectImage(Display *dpy, unsigned int resource, Drawable drawable,
+ int src_x, int src_y, unsigned int width, unsigned int height,
+ unsigned long plane_mask, int format)
+{
+ register xGetImageReq *req;
+
+ _NXCollectImageState *state;
+ _XAsyncHandler *handler;
+
+ if (resource >= NXNumberOfResources)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectImage: PANIC! Provided resource [%u] is out of range.\n",
+ resource);
+ #endif
+
+ return -1;
+ }
+
+ state = _NXCollectedImages[resource];
+
+ if (state != NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectImage: PANIC! Having to remove previous state for resource [%u].\n",
+ resource);
+ #endif
+
+ if (state -> handler != NULL)
+ {
+ DeqAsyncHandler(dpy, state -> handler);
+
+ Xfree(state -> handler);
+ }
+
+ if (state -> image != NULL)
+ {
+ XDestroyImage(state -> image);
+ }
+
+ Xfree(state);
+
+ _NXCollectedImages[resource] = NULL;
+ }
+
+ LockDisplay(dpy);
+
+ GetReq(GetImage, req);
+
+ req -> format = format;
+ req -> drawable = drawable;
+ req -> x = src_x;
+ req -> y = src_y;
+ req -> width = width;
+ req -> height = height;
+ req -> planeMask = plane_mask;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXCollectImage: Sending message opcode [%d] sequence [%ld] for resource [%d].\n",
+ X_GetImage, dpy -> request, resource);
+
+ fprintf(stderr, "******NXCollectImage: Format [%d] drawable [%d] src_x [%d] src_y [%d].\n",
+ req -> format, (int) req -> drawable, req -> x, req -> y);
+
+ fprintf(stderr, "******NXCollectImage: Width [%d] height [%d] plane_mask [%x].\n",
+ req -> width, req -> height, (int) req -> planeMask);
+ #endif
+
+ state = Xmalloc(sizeof(_NXCollectImageState));
+ handler = Xmalloc(sizeof(_XAsyncHandler));
+
+ if (state == NULL || handler == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectImage: PANIC! Failed to allocate memory with resource [%d].\n",
+ resource);
+ #endif
+
+ UnGetReq(GetImage);
+
+ if (state != NULL)
+ {
+ Xfree(state);
+ }
+
+ if (handler != NULL)
+ {
+ Xfree(handler);
+ }
+
+ UnlockDisplay(dpy);
+
+ return -1;
+ }
+
+ state -> sequence = dpy -> request;
+ state -> resource = resource;
+ state -> mask = plane_mask;
+ state -> format = format;
+ state -> width = width;
+ state -> height = height;
+ state -> image = NULL;
+
+ state -> handler = handler;
+
+ handler -> next = dpy -> async_handlers;
+ handler -> handler = _NXCollectImageHandler;
+ handler -> data = (XPointer) state;
+ dpy -> async_handlers = handler;
+
+ _NXCollectedImages[resource] = state;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return 1;
+}
+
+int NXGetCollectedImage(Display *dpy, unsigned int resource, XImage **image)
+{
+ register _NXCollectImageState *state;
+
+ state = _NXCollectedImages[resource];
+
+ if (state == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXGetCollectedImage: PANIC! No image collected for resource [%u].\n",
+ resource);
+ #endif
+
+ return 0;
+ }
+
+ _NXCollectedImages[resource] = NULL;
+
+ *image = state -> image;
+
+ Xfree(state);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetCollectedImage: Returning GetImage data for resource [%u].\n",
+ resource);
+ #endif
+
+ return 1;
+}
+
+static void _NXNotifyProperty(Display *dpy, int resource, Bool success)
+{
+ XEvent async_event;
+
+ /*
+ * Enqueue an event to tell client
+ * the result of GetProperty.
+ */
+
+ async_event.type = ClientMessage;
+
+ async_event.xclient.serial = _NXCollectedProperties[resource] -> sequence;
+
+ async_event.xclient.window = 0;
+ async_event.xclient.message_type = 0;
+ async_event.xclient.format = 32;
+
+ async_event.xclient.data.l[0] = NXCollectPropertyNotify;
+ async_event.xclient.data.l[1] = resource;
+ async_event.xclient.data.l[2] = success;
+
+ XPutBackEvent(dpy, &async_event);
+}
+
+static Bool _NXCollectPropertyHandler(Display *dpy, xReply *rep, char *buf,
+ int len, XPointer data)
+{
+ register _NXCollectPropertyState *state;
+
+ register xGetPropertyReply *async_rep;
+
+ char *async_head;
+ char *async_data;
+
+ int async_size;
+
+ state = (_NXCollectPropertyState *) data;
+
+ if ((rep -> generic.sequenceNumber % 65536) !=
+ ((int)(state -> sequence) % 65536))
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectPropertyHandler: Unmatched sequence [%d] for opcode [%d] "
+ "with length [%d].\n", rep -> generic.sequenceNumber, rep -> generic.type,
+ (int) rep -> generic.length << 2);
+ #endif
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectPropertyHandler: Going to handle asynchronous GetProperty reply.\n");
+ #endif
+
+ /*
+ * Reply data is managed asynchronously. We can
+ * use state to get to vector and vector to get
+ * to handler. In this way, we can dequeue and
+ * free the handler itself.
+ */
+
+ DeqAsyncHandler(dpy, state -> handler);
+
+ Xfree(state -> handler);
+
+ state -> handler = NULL;
+
+ if (rep -> generic.type == X_Error)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectPropertyHandler: Error received from X server for resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyProperty(dpy, state -> resource, False);
+
+ _NXCollectedProperties[state -> resource] = NULL;
+
+ Xfree(state);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectPropertyHandler: Matched request with sequence [%ld].\n",
+ state -> sequence);
+ #endif
+
+ async_size = SIZEOF(xGetPropertyReply);
+
+ async_head = Xmalloc(async_size);
+
+ if (async_head == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectPropertyHandler: PANIC! Failed to allocate memory with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyProperty(dpy, state -> resource, False);
+
+ _NXCollectedProperties[state -> resource] = NULL;
+
+ Xfree(state);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectPropertyHandler: Going to get reply with size [%d].\n",
+ (int) rep -> generic.length << 2);
+ #endif
+
+ async_rep = (xGetPropertyReply *) _XGetAsyncReply(dpy, async_head, rep, buf, len, 0, False);
+
+ if (async_rep == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectPropertyHandler: PANIC! Failed to get reply with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyProperty(dpy, state -> resource, False);
+
+ _NXCollectedProperties[state -> resource] = NULL;
+
+ Xfree(state);
+
+ Xfree(async_head);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectPropertyHandler: Got reply with format [%d] type [%d] size [%d].\n",
+ async_rep -> format, (int) async_rep -> propertyType, (int) async_rep -> length << 2);
+
+ fprintf(stderr, "******_NXCollectPropertyHandler: Bytes after [%d] number of items [%d].\n",
+ (int) async_rep -> bytesAfter, (int) async_rep -> nItems);
+ #endif
+
+ state -> format = async_rep -> format;
+ state -> type = async_rep -> propertyType;
+ state -> items = async_rep -> nItems;
+ state -> after = async_rep -> bytesAfter;
+
+ async_size = async_rep -> length << 2;
+
+ if (async_size > 0)
+ {
+ async_data = Xmalloc(async_size);
+
+ if (async_data == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectPropertyHandler: PANIC! Failed to allocate memory with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyProperty(dpy, state -> resource, False);
+
+ _NXCollectedProperties[state -> resource] = NULL;
+
+ Xfree(state);
+
+ Xfree(async_head);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectPropertyHandler: Going to get data with size [%d].\n",
+ async_size);
+ #endif
+
+ _XGetAsyncData(dpy, async_data, buf, len, SIZEOF(xGetPropertyReply), async_size, async_size);
+
+ /*
+ * From now on we can return True, as all
+ * data has been consumed from buffer.
+ */
+
+ state -> data = async_data;
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectPropertyHandler: Successfully stored property data for resource [%d].\n",
+ state -> resource);
+ #endif
+ }
+ #ifdef TEST
+ else
+ {
+ fprintf(stderr, "******_NXCollectPropertyHandler: WARNING! Null property data stored for resource [%d].\n",
+ state -> resource);
+ }
+ #endif
+
+ _NXNotifyProperty(dpy, state -> resource, True);
+
+ Xfree(async_head);
+
+ return True;
+}
+
+int NXGetCollectPropertyResource(Display *dpy)
+{
+ int i;
+
+ for (i = 0; i < NXNumberOfResources; i++)
+ {
+ if (_NXCollectedProperties[i] == NULL)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int NXCollectProperty(Display *dpy, unsigned int resource, Window window, Atom property,
+ long long_offset, long long_length, Bool delete, Atom req_type)
+{
+ register xGetPropertyReq *req;
+
+ _NXCollectPropertyState *state;
+ _XAsyncHandler *handler;
+
+ if (resource >= NXNumberOfResources)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectProperty: PANIC! Provided resource [%u] is out of range.\n",
+ resource);
+ #endif
+
+ return -1;
+ }
+
+ state = _NXCollectedProperties[resource];
+
+ if (state != NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectProperty: PANIC! Having to remove previous state for resource [%u].\n",
+ resource);
+ #endif
+
+ if (state -> handler != NULL)
+ {
+ DeqAsyncHandler(dpy, state -> handler);
+
+ Xfree(state -> handler);
+ }
+
+ if (state -> data != NULL)
+ {
+ Xfree(state -> data);
+ }
+
+ Xfree(state);
+
+ _NXCollectedProperties[resource] = NULL;
+ }
+
+ LockDisplay(dpy);
+
+ GetReq(GetProperty, req);
+
+ req -> delete = delete;
+ req -> window = window;
+ req -> property = property;
+ req -> type = req_type;
+ req -> longOffset = long_offset;
+ req -> longLength = long_length;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXCollectProperty: Sending message opcode [%d] sequence [%ld] for resource [%d].\n",
+ X_GetProperty, dpy -> request, resource);
+
+ fprintf(stderr, "******NXCollectProperty: Delete [%u] window [%d] property [%d] type [%d].\n",
+ req -> delete, (int) req -> window, (int) req -> property, (int) req -> type);
+
+ fprintf(stderr, "******NXCollectProperty: Long offset [%d] long length [%d].\n",
+ (int) req -> longOffset, (int) req -> longLength);
+ #endif
+
+ state = Xmalloc(sizeof(_NXCollectPropertyState));
+ handler = Xmalloc(sizeof(_XAsyncHandler));
+
+ if (state == NULL || handler == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectProperty: Failed to allocate memory with resource [%d].\n",
+ resource);
+ #endif
+
+ if (state != NULL)
+ {
+ Xfree(state);
+ }
+
+ if (handler != NULL)
+ {
+ Xfree(handler);
+ }
+
+ UnGetReq(GetProperty);
+
+ UnlockDisplay(dpy);
+
+ return -1;
+ }
+
+ state -> sequence = dpy -> request;
+ state -> resource = resource;
+ state -> window = window;
+ state -> property = property;
+ state -> type = 0;
+ state -> format = 0;
+ state -> items = 0;
+ state -> after = 0;
+ state -> data = NULL;
+
+ state -> handler = handler;
+
+ handler -> next = dpy -> async_handlers;
+ handler -> handler = _NXCollectPropertyHandler;
+ handler -> data = (XPointer) state;
+ dpy -> async_handlers = handler;
+
+ _NXCollectedProperties[resource] = state;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return True;
+}
+
+int NXGetCollectedProperty(Display *dpy, unsigned int resource, Atom *actual_type_return,
+ int *actual_format_return, unsigned long *nitems_return,
+ unsigned long *bytes_after_return, unsigned char **data)
+{
+ register _NXCollectPropertyState *state;
+
+ state = _NXCollectedProperties[resource];
+
+ if (state == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXGetCollectedProperty: PANIC! No data collected for resource [%u].\n",
+ resource);
+ #endif
+
+ return 0;
+ }
+
+ *actual_type_return = state -> type;
+ *actual_format_return = state -> format;
+ *nitems_return = state -> items;
+ *bytes_after_return = state -> after;
+
+ *data = (unsigned char *) _NXCollectedProperties[resource] -> data;
+
+ Xfree(state);
+
+ _NXCollectedProperties[resource] = NULL;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetCollectedProperty: Returning GetProperty data for resource [%u].\n",
+ resource);
+ #endif
+
+ return True;
+}
+
+static void _NXNotifyGrabPointer(Display *dpy, int resource, Bool success)
+{
+ XEvent async_event;
+
+ async_event.type = ClientMessage;
+
+ async_event.xclient.serial = _NXCollectedGrabPointers[resource] -> sequence;
+
+ async_event.xclient.window = 0;
+ async_event.xclient.message_type = 0;
+ async_event.xclient.format = 32;
+
+ async_event.xclient.data.l[0] = NXCollectGrabPointerNotify;
+ async_event.xclient.data.l[1] = resource;
+ async_event.xclient.data.l[2] = success;
+
+ XPutBackEvent(dpy, &async_event);
+}
+
+static Bool _NXCollectGrabPointerHandler(Display *dpy, xReply *rep, char *buf,
+ int len, XPointer data)
+{
+ register _NXCollectGrabPointerState *state;
+
+ register xGrabPointerReply *async_rep;
+
+ char *async_head;
+
+ int async_size;
+
+ state = (_NXCollectGrabPointerState *) data;
+
+ if ((rep -> generic.sequenceNumber % 65536) !=
+ ((int)(state -> sequence) % 65536))
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectGrabPointerHandler: Unmatched sequence [%d] for opcode [%d] "
+ "with length [%d].\n", rep -> generic.sequenceNumber, rep -> generic.type,
+ (int) rep -> generic.length << 2);
+ #endif
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectGrabPointerHandler: Going to handle asynchronous GrabPointer reply.\n");
+ #endif
+
+ DeqAsyncHandler(dpy, state -> handler);
+
+ Xfree(state -> handler);
+
+ state -> handler = NULL;
+
+ if (rep -> generic.type == X_Error)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectGrabPointerHandler: Error received from X server for resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyGrabPointer(dpy, state -> resource, False);
+
+ _NXCollectedGrabPointers[state -> resource] = NULL;
+
+ Xfree(state);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectGrabPointerHandler: Matched request with sequence [%ld].\n",
+ state -> sequence);
+ #endif
+
+ async_size = SIZEOF(xGrabPointerReply);
+
+ async_head = Xmalloc(async_size);
+
+ if (async_head == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectGrabPointerHandler: PANIC! Failed to allocate memory with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyGrabPointer(dpy, state -> resource, False);
+
+ _NXCollectedGrabPointers[state -> resource] = NULL;
+
+ Xfree(state);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectGrabPointerHandler: Going to get reply with size [%d].\n",
+ (int) rep -> generic.length << 2);
+ #endif
+
+ async_rep = (xGrabPointerReply *) _XGetAsyncReply(dpy, async_head, rep, buf, len, 0, False);
+
+ if (async_rep == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectGrabPointerHandler: PANIC! Failed to get reply with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyGrabPointer(dpy, state -> resource, False);
+
+ _NXCollectedGrabPointers[state -> resource] = NULL;
+
+ Xfree(state);
+
+ Xfree(async_head);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectGrabPointerHandler: Got reply with status [%d] size [%d].\n",
+ async_rep -> status, (int) async_rep -> length << 2);
+ #endif
+
+ state -> status = async_rep -> status;
+
+ _NXNotifyGrabPointer(dpy, state -> resource, True);
+
+ Xfree(async_head);
+
+ return True;
+}
+
+int NXGetCollectGrabPointerResource(Display *dpy)
+{
+ int i;
+
+ for (i = 0; i < NXNumberOfResources; i++)
+ {
+ if (_NXCollectedGrabPointers[i] == NULL)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int NXCollectGrabPointer(Display *dpy, unsigned int resource, Window grab_window, Bool owner_events,
+ unsigned int event_mask, int pointer_mode, int keyboard_mode,
+ Window confine_to, Cursor cursor, Time time)
+{
+ register xGrabPointerReq *req;
+
+ _NXCollectGrabPointerState *state;
+ _XAsyncHandler *handler;
+
+ if (resource >= NXNumberOfResources)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectGrabPointer: PANIC! Provided resource [%u] is out of range.\n",
+ resource);
+ #endif
+
+ return -1;
+ }
+
+ state = _NXCollectedGrabPointers[resource];
+
+ if (state != NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectGrabPointer: PANIC! Having to remove previous state for resource [%u].\n",
+ resource);
+ #endif
+
+ if (state -> handler != NULL)
+ {
+ DeqAsyncHandler(dpy, state -> handler);
+
+ Xfree(state -> handler);
+ }
+
+ Xfree(state);
+
+ _NXCollectedGrabPointers[resource] = NULL;
+ }
+
+ LockDisplay(dpy);
+
+ GetReq(GrabPointer, req);
+
+ req -> grabWindow = grab_window;
+ req -> ownerEvents = owner_events;
+ req -> eventMask = event_mask;
+ req -> pointerMode = pointer_mode;
+ req -> keyboardMode = keyboard_mode;
+ req -> confineTo = confine_to;
+ req -> cursor = cursor;
+ req -> time = time;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXCollectGrabPointer: Sending message opcode [%d] sequence [%ld] "
+ "for resource [%d].\n", X_GrabPointer, dpy -> request, resource);
+ #endif
+
+ state = Xmalloc(sizeof(_NXCollectGrabPointerState));
+ handler = Xmalloc(sizeof(_XAsyncHandler));
+
+ if (state == NULL || handler == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectGrabPointer: Failed to allocate memory with resource [%d].\n",
+ resource);
+ #endif
+
+ if (state != NULL)
+ {
+ Xfree(state);
+ }
+
+ if (handler != NULL)
+ {
+ Xfree(handler);
+ }
+
+ UnGetReq(GrabPointer);
+
+ UnlockDisplay(dpy);
+
+ return -1;
+ }
+
+ state -> sequence = dpy -> request;
+ state -> resource = resource;
+ state -> status = 0;
+
+ state -> handler = handler;
+
+ handler -> next = dpy -> async_handlers;
+ handler -> handler = _NXCollectGrabPointerHandler;
+ handler -> data = (XPointer) state;
+ dpy -> async_handlers = handler;
+
+ _NXCollectedGrabPointers[resource] = state;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return True;
+}
+
+int NXGetCollectedGrabPointer(Display *dpy, unsigned int resource, int *status)
+{
+ register _NXCollectGrabPointerState *state;
+
+ state = _NXCollectedGrabPointers[resource];
+
+ if (state == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXGetCollectedGrabPointer: PANIC! No data collected for resource [%u].\n",
+ resource);
+ #endif
+
+ return 0;
+ }
+
+ *status = state -> status;
+
+ Xfree(state);
+
+ _NXCollectedGrabPointers[resource] = NULL;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetCollectedGrabPointer: Returning GrabPointer data for resource [%u].\n",
+ resource);
+ #endif
+
+ return True;
+}
+
+static void _NXNotifyInputFocus(Display *dpy, int resource, Bool success)
+{
+ XEvent async_event;
+
+ async_event.type = ClientMessage;
+
+ async_event.xclient.serial = _NXCollectedInputFocuses[resource] -> sequence;
+
+ async_event.xclient.window = 0;
+ async_event.xclient.message_type = 0;
+ async_event.xclient.format = 32;
+
+ async_event.xclient.data.l[0] = NXCollectInputFocusNotify;
+ async_event.xclient.data.l[1] = resource;
+ async_event.xclient.data.l[2] = success;
+
+ XPutBackEvent(dpy, &async_event);
+}
+
+static Bool _NXCollectInputFocusHandler(Display *dpy, xReply *rep, char *buf,
+ int len, XPointer data)
+{
+ register _NXCollectInputFocusState *state;
+
+ register xGetInputFocusReply *async_rep;
+
+ char *async_head;
+
+ int async_size;
+
+ state = (_NXCollectInputFocusState *) data;
+
+ if ((rep -> generic.sequenceNumber % 65536) !=
+ ((int)(state -> sequence) % 65536))
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectInputFocusHandler: Unmatched sequence [%d] for opcode [%d] "
+ "with length [%d].\n", rep -> generic.sequenceNumber, rep -> generic.type,
+ (int) rep -> generic.length << 2);
+ #endif
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectInputFocusHandler: Going to handle asynchronous GetInputFocus reply.\n");
+ #endif
+
+ DeqAsyncHandler(dpy, state -> handler);
+
+ Xfree(state -> handler);
+
+ state -> handler = NULL;
+
+ if (rep -> generic.type == X_Error)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectInputFocusHandler: Error received from X server for resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyInputFocus(dpy, state -> resource, False);
+
+ _NXCollectedInputFocuses[state -> resource] = NULL;
+
+ Xfree(state);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectInputFocusHandler: Matched request with sequence [%ld].\n",
+ state -> sequence);
+ #endif
+
+ async_size = SIZEOF(xGetInputFocusReply);
+
+ async_head = Xmalloc(async_size);
+
+ if (async_head == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectInputFocusHandler: PANIC! Failed to allocate memory with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyInputFocus(dpy, state -> resource, False);
+
+ _NXCollectedInputFocuses[state -> resource] = NULL;
+
+ Xfree(state);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectInputFocusHandler: Going to get reply with size [%d].\n",
+ (int) rep -> generic.length << 2);
+ #endif
+
+ async_rep = (xGetInputFocusReply *) _XGetAsyncReply(dpy, async_head, rep, buf, len, 0, False);
+
+ if (async_rep == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******_NXCollectInputFocusHandler: PANIC! Failed to get reply with resource [%d].\n",
+ state -> resource);
+ #endif
+
+ _NXNotifyInputFocus(dpy, state -> resource, False);
+
+ _NXCollectedInputFocuses[state -> resource] = NULL;
+
+ Xfree(state);
+
+ Xfree(async_head);
+
+ return False;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******_NXCollectInputFocusHandler: Got reply with focus [%d] revert to [%d] "
+ "size [%d].\n", (int) async_rep -> focus, (int) async_rep -> revertTo,
+ (int) async_rep -> length << 2);
+ #endif
+
+ state -> focus = async_rep -> focus;
+ state -> revert_to = async_rep -> revertTo;
+
+ _NXNotifyInputFocus(dpy, state -> resource, True);
+
+ Xfree(async_head);
+
+ return True;
+}
+
+int NXGetCollectInputFocusResource(Display *dpy)
+{
+ int i;
+
+ for (i = 0; i < NXNumberOfResources; i++)
+ {
+ if (_NXCollectedInputFocuses[i] == NULL)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+int NXCollectInputFocus(Display *dpy, unsigned int resource)
+{
+ register xReq *req;
+
+ _NXCollectInputFocusState *state;
+ _XAsyncHandler *handler;
+
+ if (resource >= NXNumberOfResources)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectInputFocus: PANIC! Provided resource [%u] is out of range.\n",
+ resource);
+ #endif
+
+ return -1;
+ }
+
+ state = _NXCollectedInputFocuses[resource];
+
+ if (state != NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectInputFocus: PANIC! Having to remove previous state for resource [%u].\n",
+ resource);
+ #endif
+
+ if (state -> handler != NULL)
+ {
+ DeqAsyncHandler(dpy, state -> handler);
+
+ Xfree(state -> handler);
+ }
+
+ Xfree(state);
+
+ _NXCollectedInputFocuses[resource] = NULL;
+ }
+
+ LockDisplay(dpy);
+
+ GetEmptyReq(GetInputFocus, req);
+
+ #ifdef TEST
+ fprintf(stderr, "******NXCollectInputFocus: Sending message opcode [%d] sequence [%ld] for resource [%d].\n",
+ X_GetInputFocus, dpy -> request, resource);
+ #endif
+
+ state = Xmalloc(sizeof(_NXCollectInputFocusState));
+ handler = Xmalloc(sizeof(_XAsyncHandler));
+
+ if (state == NULL || handler == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXCollectInputFocus: Failed to allocate memory with resource [%d].\n",
+ resource);
+ #endif
+
+ if (state != NULL)
+ {
+ Xfree(state);
+ }
+
+ if (handler != NULL)
+ {
+ Xfree(handler);
+ }
+
+ UnGetEmptyReq();
+
+ UnlockDisplay(dpy);
+
+ return -1;
+ }
+
+ state -> sequence = dpy -> request;
+ state -> resource = resource;
+ state -> focus = 0;
+ state -> revert_to = 0;
+
+ state -> handler = handler;
+
+ handler -> next = dpy -> async_handlers;
+ handler -> handler = _NXCollectInputFocusHandler;
+ handler -> data = (XPointer) state;
+ dpy -> async_handlers = handler;
+
+ _NXCollectedInputFocuses[resource] = state;
+
+ UnlockDisplay(dpy);
+
+ SyncHandle();
+
+ return True;
+}
+
+int NXGetCollectedInputFocus(Display *dpy, unsigned int resource,
+ Window *focus_return, int *revert_to_return)
+{
+ register _NXCollectInputFocusState *state;
+
+ state = _NXCollectedInputFocuses[resource];
+
+ if (state == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******NXGetCollectedInputFocus: PANIC! No data collected for resource [%u].\n",
+ resource);
+ #endif
+
+ return 0;
+ }
+
+ *focus_return = state -> focus;
+ *revert_to_return = state -> revert_to;
+
+ Xfree(state);
+
+ _NXCollectedInputFocuses[resource] = NULL;
+
+ #ifdef TEST
+ fprintf(stderr, "******NXGetCollectedInputFocus: Returning GetInputFocus data for resource [%u].\n",
+ resource);
+ #endif
+
+ return True;
+}
+
+#ifdef DUMP
+
+void _NXDumpData(const unsigned char *buffer, unsigned int size)
+{
+ if (buffer != NULL)
+ {
+ unsigned int i = 0;
+
+ unsigned int ii;
+
+ while (i < size)
+ {
+ fprintf(stderr, "[%d]\t", i);
+
+ for (ii = 0; i < size && ii < 8; i++, ii++)
+ {
+ fprintf(stderr, "%d\t", (unsigned int) (buffer[i]));
+ }
+
+ fprintf(stderr, "\n");
+ }
+ }
+}
+
+#endif
diff --git a/nxcompext/NXlib.h b/nxcompext/NXlib.h
new file mode 100644
index 000000000..d77ff6046
--- /dev/null
+++ b/nxcompext/NXlib.h
@@ -0,0 +1,904 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef NXlib_H
+#define NXlib_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <X11/X.h>
+#include <X11/Xlib.h>
+
+#include "NX.h"
+#include "NXpack.h"
+#include "NXproto.h"
+#include "NXvars.h"
+
+/*
+ * All the NX code should use these.
+ */
+
+#define Xmalloc(size) malloc((size))
+#define Xfree(ptr) free((ptr))
+
+/*
+ * Maximum number of supported pack methods.
+ */
+
+#define NXNumberOfPackMethods 128
+
+/*
+ * Assume this as the limit of resources that
+ * can be provided to the split and unpack
+ * requests.
+ */
+
+#define NXNumberOfResources 256
+
+#define NXNoResource 256 + 1
+#define NXAnyResource 256 + 2
+
+/*
+ * Initialize the internal structures used by
+ * the library. Should be executed again after
+ * having reopened the display.
+ */
+
+extern int NXInitDisplay(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+/*
+ * Reset all the internal structures. Should be
+ * executed after closing the display.
+ */
+
+extern int NXResetDisplay(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+/*
+ * Set the NX display flush policy. The policy can
+ * be either NXFlushDeferred or NXFlushImmediate.
+ */
+
+extern int NXSetDisplayPolicy(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ int /* policy */
+#endif
+);
+
+/*
+ * Set the display output buffer size.
+ */
+
+extern int NXSetDisplayBuffer(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ int /* size */
+#endif
+);
+
+/*
+ * If set, the Popen() function in the X server
+ * wil remove the LD_LIBRARY_PATH variable from
+ * the environment before calling the execl()
+ * function on the child process. The function
+ * returns the previous value.
+ */
+
+extern int NXUnsetLibraryPath(
+#if NeedFunctionPrototypes
+ int /* value */
+#endif
+);
+
+/*
+ * If the parameter is true, the Xlib I/O error
+ * handler will return, instead of quitting the
+ * program. The function returns the previous
+ * value.
+ */
+
+extern int NXHandleDisplayError(
+#if NeedFunctionPrototypes
+ int /* value */
+#endif
+);
+
+/*
+ * Shutdown the display descriptor and force Xlib
+ * to set the I/O error flag.
+ */
+
+extern Bool NXForceDisplayError(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+/*
+ * Check the value of the XlibDisplayIOError flag.
+ * If not set, try to call the display error hand-
+ * ler to give to the application a chance to see
+ * whether it needs to close the connection.
+ */
+
+extern int NXDisplayError(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+/*
+ * Query the number of bytes readable from the
+ * display connection.
+ */
+
+extern int NXDisplayReadable(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+/*
+ * Query the number of the outstanding bytes to
+ * flush to the display connection.
+ */
+
+extern int NXDisplayFlushable(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+/*
+ * Return a value between 0 and 9 indicating the
+ * congestion level of the NX transport based on
+ * the tokens remaining. A value of 9 means that
+ * the link is congested and no further data can
+ * be sent.
+ */
+
+extern int NXDisplayCongestion(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+/*
+ * Flush the Xlib display buffer and/or the
+ * outstanding data accumulated by the NX
+ * transport.
+ */
+
+extern int NXFlushDisplay(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ int /* what */
+#endif
+);
+
+/*
+ * Public interfaces used to set the handlers.
+ * They all return the previous handler.
+ */
+
+extern NXDisplayErrorPredicate NXSetDisplayErrorPredicate(
+#if NeedFunctionPrototypes
+ NXDisplayErrorPredicate /* predicate */
+#endif
+);
+
+/*
+ * Called when the display blocks waiting to read or
+ * write more data.
+ */
+
+extern NXDisplayBlockHandler NXSetDisplayBlockHandler(
+#if NeedFunctionPrototypes
+ NXDisplayBlockHandler /* handler */
+#endif
+);
+
+/*
+ * Called after more data is written to the display.
+ * When the NX transport is running, data may be queued
+ * until an explicit flush.
+ */
+
+extern NXDisplayWriteHandler NXSetDisplayWriteHandler(
+#if NeedFunctionPrototypes
+ NXDisplayWriteHandler /* handler */
+#endif
+);
+
+/*
+ * Called after more data is sent to the remote proxy.
+ *
+ * Here the display pointer is passed as the second
+ * parameter to make clear that the function does not
+ * tie the callback to the display, but, similarly to
+ * all the Xlib error handlers, to a global variable
+ * shared by all the Xlib functions. The display
+ * pointer will be passed back by nxcomp at the time
+ * it will call the handler. This is because nxcomp
+ * doesn't have access to the display structure.
+ */
+
+extern NXDisplayFlushHandler NXSetDisplayFlushHandler(
+#if NeedFunctionPrototypes
+ NXDisplayFlushHandler /* handler */,
+ Display* /* display */
+#endif
+);
+
+/*
+ * Get an arbitrary null terminated buffer to be added
+ * to the NX statistics.
+ */
+
+extern NXDisplayStatisticsHandler NXSetDisplayStatisticsHandler(
+#if NeedFunctionPrototypes
+ NXDisplayStatisticsHandler /* handler */,
+ char ** /* buffer */
+#endif
+);
+
+/*
+ * Redefine the function called by Xlib in the case of
+ * an out-of-order sequence number received in the X
+ * protocol stream.
+ */
+
+extern NXLostSequenceHandler NXSetLostSequenceHandler(
+#if NeedFunctionPrototypes
+ NXLostSequenceHandler /* handler */
+#endif
+);
+
+/*
+ * The agent should get the NX parameters at startup, just after
+ * having opened the display. If the agent is not able to satisfy
+ * the pack method set by user (because a method is not applica-
+ * ble, it is not supported by the remote or it simply requires a
+ * screen depth greater than the depth available), it should fall
+ * back to the nearest method of the same type.
+ */
+
+extern Status NXGetControlParameters(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int* /* link_type */,
+ unsigned int* /* local_major */,
+ unsigned int* /* local_minor */,
+ unsigned int* /* local_patch */,
+ unsigned int* /* remote_major */,
+ unsigned int* /* remote_minor */,
+ unsigned int* /* remote_patch */,
+ int* /* frame_timeout */,
+ int* /* ping_timeout */,
+ int* /* split_mode */,
+ int* /* split_size */,
+ unsigned int* /* pack_method */,
+ unsigned int* /* pack_quality */,
+ int* /* data_level */,
+ int* /* stream_level */,
+ int* /* delta_level */,
+ unsigned int* /* load_cache */,
+ unsigned int* /* save_cache */,
+ unsigned int* /* startup_cache */
+#endif
+);
+
+/*
+ * Which unpack methods are supported by the remote proxy?
+ */
+
+extern Status NXGetUnpackParameters(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int* /* entries */,
+ unsigned char[] /* supported_methods */
+#endif
+);
+
+/*
+ * Query and enable shared memory support on path agent to X
+ * client proxy and X server proxy to real X server. At the
+ * moment only the path proxy to real X server is implemented.
+ * On return flags will say if support has been successfully
+ * activated. Segments will contain the XID associated to the
+ * shared memory blocks. A MIT-SHM compliant protocol is used
+ * between proxy and the real server, while a simplified
+ * version is used between the agent and the client proxy to
+ * accomodate both packed images and plain X bitmaps.
+ */
+
+extern Status NXGetShmemParameters(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int* /* enable_client */,
+ unsigned int* /* enable_server */,
+ unsigned int* /* client_segment */,
+ unsigned int* /* server_segment */,
+ unsigned int* /* client_size */,
+ unsigned int* /* server_size */
+#endif
+);
+
+/*
+ * Get the path to the font server that can be used by the X
+ * server to tunnel the font connections across the NX link.
+ * The path actually represents the TCP port where the proxy
+ * on the NX client side is listening. The agent can tempora-
+ * rily enable the tunneling when it needs a font that is not
+ * available on the client, for example when the session is
+ * migrated from a different X server.
+ */
+
+extern Status NXGetFontParameters(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* path_length */,
+ char[] /* path_data */
+#endif
+);
+
+/*
+ * This set of functions is used to leverage the image stream-
+ * ing capabilities built in nxcomp. An image can be streamed
+ * by sending a start-split message, followed by the X messages
+ * that will have to be split by the proxy, followed by an end-
+ * split closure. Usually, in the middle of a start-split/end-
+ * split sequence there will be a single PutImage() or PutPack-
+ * edImage(), that, in turn, can generate multiple partial
+ * requests, like a SetUnpackColormap() and SetUnpackAlpha()
+ * that will be later used to decompress the image to its ori-
+ * ginal form. Multiple requests may be also generated because
+ * of the maximum size of a X request being exceeded, so that
+ * Xlib has to divide the single image in multiple sub-image re-
+ * quests. The agent doesn't need to take care of these details
+ * but will rather have to track the result of the split opera-
+ * tion. By monitoring the notify events sent by the proxy, the
+ * agent will have to implement its own strategy to deal with
+ * the resources. For example, it will be able to:
+ *
+ * - Mark a drawable as dirty, if the image was not sent
+ * synchronously, in the main X oputput stream.
+ *
+ * - Choose to commit or discard the original image, at the
+ * time it will be recomposed at the remote side. This may
+ * include all the messages that were part of the split
+ * (the colormap, the alpha channel, etc.)
+ *
+ * - Mark the drawable as clean again, if the image was
+ * committed and the drawable didn't change in the mean-
+ * while.
+ *
+ * At the time the proxy receives the end-split, it reports the
+ * result of the operation to the agent. The agent will be able
+ * to identify the original split operation (the one referenced
+ * in the start-split/end-split sequence) by the small integer
+ * number (0-255) named 'resource' sent in the events.
+ *
+ * One of the following cases may be encountered:
+ *
+ *
+ * NXNoSplitNotify All messages were sent in the main out-
+ * put stream, so that no split actually
+ * took place.
+ *
+ * NXStartSplitNotify One or more messages were split, so,
+ * at discrection of the agent, the client
+ * may be suspended until the transferral
+ * is completed.
+ *
+ * NXCommitSplitNotify One of the requests that made up the
+ * split was recomposed. The agent should
+ * either commit the given request or tell
+ * the proxy to discard it.
+ *
+ * NXEndSplitNotify The split was duly completed. The agent
+ * can restart the client.
+ *
+ * NXEmptySplitNotify No more split operation are pending.
+ * The agent can use this information to
+ * implement specific strategies requiring
+ * that all messages have been recomposed
+ * at the remote end, like updating the
+ * drawables that were not synchronized
+ * because of the lazy encoding.
+ *
+ * The 'mode' field that is sent by the agent in the start-split
+ * request, determines the strategy that the proxy will adopt to
+ * deal with the image. If set to 'eager', the proxy will only
+ * split the messages whose size exceeds the split threshold (the
+ * current threshold can be found in the NXGetControlParameters()
+ * reply). If the mode is set to lazy, the proxy will split any
+ * image that would have generated an actual transfer of the data
+ * part (in practice all images that are not found in the cache).
+ * This second strategy can be leveraged by an agent to further
+ * reduce the bandwidth requirements. For example, by setting the
+ * mode to lazy and by monitoring the result, an agent can easi-
+ * ly verify if the drawable was successfully updated, mark the
+ * drawable if not, and synchronize it at later time.
+ *
+ * See NXproto.h for the definition of the available modes.
+ */
+
+extern unsigned int NXAllocSplit(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */
+#endif
+);
+
+extern int NXStartSplit(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ unsigned int /* mode */
+#endif
+);
+
+extern int NXEndSplit(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */
+#endif
+);
+
+extern int NXCommitSplit(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ unsigned int /* propagate */,
+ unsigned char /* request */,
+ unsigned int /* position */
+#endif
+);
+
+extern int NXAbortSplit(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */
+#endif
+);
+
+extern int NXFinishSplit(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */
+#endif
+);
+
+extern int NXFreeSplit(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */
+#endif
+);
+
+extern int NXSetExposeParameters(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ int /* expose */,
+ int /* graphics_expose */,
+ int /* no_expose */
+#endif
+);
+
+extern int NXSetCacheParameters(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ int /* enable_cache */,
+ int /* enable_split */,
+ int /* enable_save */,
+ int /* enable_load */
+#endif
+);
+
+extern unsigned int NXAllocUnpack(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */
+#endif
+);
+
+extern int NXSetUnpackGeometry(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ Visual* /* visual */
+#endif
+);
+
+extern int NXSetUnpackColormap(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ unsigned int /* method */,
+ unsigned int /* entries */,
+ const char* /* data */,
+ unsigned int /* data_length */
+#endif
+);
+
+extern int NXSetUnpackAlpha(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ unsigned int /* method */,
+ unsigned int /* entries */,
+ const char* /* data */,
+ unsigned int /* data_length */
+#endif
+);
+
+extern int NXSetUnpackColormapCompat(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ unsigned int /* entries */,
+ const char* /* data */
+#endif
+);
+
+extern int NXSetUnpackAlphaCompat(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ unsigned int /* entries */,
+ const char* /* data */
+#endif
+);
+
+extern int NXFreeUnpack(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */
+#endif
+);
+
+/*
+ * A packed image is a XImage but with
+ * offset field containing total amount
+ * of packed image data.
+ */
+
+typedef XImage NXPackedImage;
+
+NXPackedImage *NXCreatePackedImage(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ Visual* /* visual */,
+ unsigned int /* method */,
+ unsigned int /* depth */,
+ int /* format */,
+ char* /* data */,
+ int /* data_length */,
+ unsigned int /* width */,
+ unsigned int /* height */,
+ int /* bitmap_pad */,
+ int /* bytes_per_line */
+#endif
+);
+
+extern int NXDestroyPackedImage(
+#if NeedFunctionPrototypes
+ NXPackedImage* /* image */
+#endif
+);
+
+NXPackedImage *NXPackImage(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XImage* /* src_image */,
+ unsigned int /* method */
+#endif
+);
+
+NXPackedImage *NXInPlacePackImage(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ XImage* /* src_image */,
+ unsigned int /* method */
+#endif
+);
+
+/*
+ * GC is declared void * to get rid of mess
+ * with different GC definitions in some X
+ * server code (like in nxagent).
+ */
+
+extern int NXPutPackedImage(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ Drawable /* drawable */,
+ void* /* gc */,
+ NXPackedImage* /* image */,
+ unsigned int /* method */,
+ unsigned int /* depth */,
+ int /* src_x */,
+ int /* src_y */,
+ int /* dst_x */,
+ int /* dst_y */,
+ unsigned int /* width */,
+ unsigned int /* height */
+#endif
+);
+
+/*
+ * Get multiple colors with a single call by
+ * pipelining X_AllocColor requests/replies.
+ */
+
+extern int NXAllocColors(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ Colormap /* colormap */,
+ unsigned int /* entries */,
+ XColor[] /* screens_in_out */,
+ Bool [] /* flags allocation errors */
+#endif
+);
+
+/*
+ * Encode the data in the given format.
+ */
+
+extern char *NXEncodeColormap(
+#if NeedFunctionPrototypes
+ const char* /* src_data */,
+ unsigned int /* src_size */,
+ unsigned int* /* dst_size */
+#endif
+);
+
+extern char *NXEncodeAlpha(
+#if NeedFunctionPrototypes
+ const char* /* src_data */,
+ unsigned int /* src_size */,
+ unsigned int* /* dst_size */
+#endif
+);
+
+extern NXPackedImage *NXEncodeRgb(
+#if NeedFunctionPrototypes
+ XImage* /* src_image */,
+ unsigned int /* method */,
+ unsigned int /* quality */
+#endif
+);
+
+extern NXPackedImage *NXEncodeRle(
+#if NeedFunctionPrototypes
+ XImage* /* src_image */,
+ unsigned int /* method */,
+ unsigned int /* quality */
+#endif
+);
+
+extern NXPackedImage *NXEncodeJpeg(
+#if NeedFunctionPrototypes
+ XImage* /* src_image */,
+ unsigned int /* method */,
+ unsigned int /* quality */
+#endif
+);
+
+typedef struct
+{
+ long pixel;
+ int found;
+
+} NXColorTable;
+
+extern int NXEncodeColors(
+#if NeedFunctionPrototypes
+ XImage* /* src_image */,
+ NXColorTable* /* color_table */,
+ int /* nb_max */
+#endif
+);
+
+extern NXPackedImage *NXEncodePng(
+#if NeedFunctionPrototypes
+ XImage* /* src_image */,
+ unsigned int /* method */,
+ unsigned int /* quality */
+#endif
+);
+
+extern NXPackedImage *NXEncodeBitmap(
+#if NeedFunctionPrototypes
+ XImage* /* src_image */,
+ unsigned int /* method */,
+ unsigned int /* quality */
+#endif
+);
+
+extern int NXCleanImage(
+#if NeedFunctionPrototypes
+ XImage*
+#endif
+);
+
+extern void NXMaskImage(
+#if NeedFunctionPrototypes
+ XImage* /* pointer to image to mask */ ,
+ unsigned int /* method */
+#endif
+);
+
+extern int NXImageCacheSize;
+
+extern void NXInitCache(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ int /* entries in image cache */
+#endif
+);
+
+extern void NXFreeCache(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+extern XImage *NXCacheFindImage(
+#if NeedFunctionPrototypes
+ NXPackedImage* /* packed image to find */,
+ unsigned int* /* pointer to the pack method if found */,
+ unsigned char** /* pointer to the calculated MD5 if found */
+#endif
+);
+
+extern int NXCacheAddImage(
+#if NeedFunctionPrototypes
+ NXPackedImage* /* packed image to be added to the cache */,
+ unsigned int /* pack method of the image to add */,
+ unsigned char* /* pointer to MD5 of the original unpacked image */
+#endif
+);
+
+
+extern int NXGetCollectImageResource(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+extern int NXCollectImage(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ Drawable /* drawable */,
+ int /* src_x */,
+ int /* src_y */,
+ unsigned int /* width */,
+ unsigned int /* height */,
+ unsigned long /* plane_mask */,
+ int /* format */
+#endif
+);
+
+extern int NXGetCollectedImage(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ XImage** /* image */
+#endif
+);
+
+extern int NXGetCollectPropertyResource(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+extern int NXCollectProperty(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ Window /* window */,
+ Atom /* property */,
+ long /* long_offset */,
+ long /* long_length */,
+ Bool /* delete */,
+ Atom /* req_type */
+#endif
+);
+
+extern int NXGetCollectedProperty(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ Atom* /* actual_type_return */,
+ int* /* actual_format_return */,
+ unsigned long* /* nitems_return */,
+ unsigned long* /* bytes_after_return */,
+ unsigned char** /* data */
+#endif
+);
+
+extern int NXGetCollectGrabPointerResource(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+extern int NXCollectGrabPointer(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ Window /* grab_window */,
+ Bool /* owner_events */,
+ unsigned int /* event_mask */,
+ int /* pointer_mode */,
+ int /* keyboard_mode */,
+ Window /* confine_to */,
+ Cursor /* cursor */,
+ Time /* time */
+#endif
+);
+
+extern int NXGetCollectedGrabPointer(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ int* /* status */
+#endif
+);
+
+extern int NXGetCollectInputFocusResource(
+#if NeedFunctionPrototypes
+ Display* /* display */
+#endif
+);
+
+extern int NXCollectInputFocus(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */
+#endif
+);
+
+extern int NXGetCollectedInputFocus(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ unsigned int /* resource */,
+ Window* /* focus_return */,
+ int* /* revert_to_return */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NXlib_H */
diff --git a/nxcompext/NXlibint.h b/nxcompext/NXlibint.h
new file mode 100644
index 000000000..37ba63723
--- /dev/null
+++ b/nxcompext/NXlibint.h
@@ -0,0 +1,31 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef NXlibint_H
+#define NXlibint_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "NXvars.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* NXlibint_H */
diff --git a/nxcompext/Pgn.c b/nxcompext/Pgn.c
new file mode 100644
index 000000000..d8fa919cc
--- /dev/null
+++ b/nxcompext/Pgn.c
@@ -0,0 +1,722 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "Xutil.h"
+
+#include "NXlib.h"
+
+#include "Mask.h"
+#include "Pgn.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+/*
+ * Selected ZLIB compression level.
+ */
+
+#define PNG_Z_LEVEL 4
+
+/*
+ * Local function prototypes.
+ */
+
+static void PrepareRowForPng(CARD8 *dst, int y, int count);
+static void PrepareRowForPng24(CARD8 *dst, int y, int count);
+static void PrepareRowForPng16(CARD8 *dst, int y, int count);
+static void PrepareRowForPng32(CARD8 *dst, int y, int count);
+
+static void PngWriteData(png_structp png_ptr, png_bytep data, png_size_t length);
+static void PngFlushData(png_structp png_ptr);
+
+/*
+ * Image characteristics.
+ */
+
+static int bytesPerLine;
+static int byteOrder;
+
+static CARD8 bitsPerPixel;
+static CARD16 redMax, greenMax, blueMax;
+static CARD8 redShift, greenShift, blueShift;
+
+/*
+ * Other variables used for the Png
+ * encoding.
+ */
+
+png_byte color_type;
+png_structp png_ptr;
+png_infop info_ptr;
+png_colorp palette;
+static char *pngCompBuf;
+static int pngDataLen;
+static char *pngBeforeBuf = NULL;
+
+/*
+ * Allocate data for the compressed image.
+ * We need to ensure that there is enough
+ * space to include the palette and the
+ * header.
+ */
+
+#define PNG_DEST_SIZE(width, height) ((width) * 3 * (height) + 1024 + 256)
+
+/*
+ * Just for debug purposes.
+ */
+
+#ifdef DEBUG
+
+static int pngId;
+static char pngName[10];
+static FILE *pngFile;
+
+#endif
+
+int PngCompareColorTable(NXColorTable *c1, NXColorTable *c2)
+{
+ return (c1 -> pixel - c2 -> pixel);
+}
+
+#define NB_COLOR_MAX 256
+
+int NXCreatePalette32(XImage *src_image, NXColorTable *color_table, CARD8 *image_index, int nb_max)
+{
+ int x, y, t, p;
+ CARD8 *fbptr;
+ CARD32 pixel;
+
+ fbptr = (CARD8 *) (src_image -> data);
+
+ /*
+ * TODO: Find a more intelligent way to
+ * estimate the number of colors.
+ */
+
+ memset(color_table, 0, nb_max * sizeof(NXColorTable));
+
+ for (x = 0, p = 0; x < src_image -> height; x++)
+ {
+ for (y = 0; y < src_image -> width; y++)
+ {
+ if (byteOrder == LSBFirst)
+ {
+ pixel = (CARD32) *(fbptr + 3);
+ pixel = (pixel << 8) | (CARD32) *(fbptr + 2);
+ pixel = (pixel << 8) | (CARD32) *(fbptr + 1);
+ pixel = (pixel << 8) | (CARD32) *fbptr;
+ }
+ else
+ {
+ pixel = (CARD32) *fbptr;
+ pixel = (pixel << 8) | (CARD32) *(fbptr + 1);
+ pixel = (pixel << 8) | (CARD32) *(fbptr + 2);
+ pixel = (pixel << 8) | (CARD32) *(fbptr + 3);
+ }
+
+ fbptr += 4;
+
+ for (t = 0; t < nb_max; t++)
+ {
+ if (color_table[t].found == 0)
+ {
+ color_table[t].pixel = pixel;
+ color_table[t].found = 1;
+ p++;
+ image_index[((x * src_image -> width) + y)] = t;
+
+ break;
+ }
+ else if ((CARD32)(color_table[t].pixel) == pixel)
+ {
+ image_index[((x * src_image -> width) + y)] = t;
+
+ break;
+ }
+ }
+
+ if (p == nb_max)
+ {
+ return nb_max + 1;
+ }
+ }
+ }
+ return p;
+}
+
+int NXCreatePalette16(XImage *src_image, NXColorTable *color_table, CARD8 *image_index, int nb_max)
+{
+ int x, y, t, p;
+ CARD8 *fbptr;
+ CARD16 pixel;
+
+ fbptr = (CARD8 *) (src_image -> data);
+
+ /*
+ * TODO: Find a more intelligent way to
+ * estimate the number of colors.
+ */
+
+ memset(color_table, 0, nb_max * sizeof(NXColorTable));
+
+ for (x = 0, p = 0; x < src_image -> height; x++)
+ {
+ for (y = 0; y < src_image -> width; y++)
+ {
+ if (byteOrder == LSBFirst)
+ {
+ pixel = (CARD16) *(fbptr + 1);
+ pixel = (pixel << 8) | (CARD16) *fbptr;
+ }
+ else
+ {
+ pixel = (CARD16) *fbptr;
+ pixel = (pixel << 8) | (CARD16) *(fbptr + 1);
+ }
+
+ fbptr += 2;
+
+ for (t = 0; t < nb_max; t++)
+ {
+ if (color_table[t].found == 0)
+ {
+ color_table[t].pixel = pixel;
+ color_table[t].found = 1;
+ p++;
+ image_index[((x * src_image -> width) + y)] = t;
+
+ break;
+ }
+ else if ((color_table[t].pixel) == pixel)
+ {
+ image_index[((x * src_image -> width) + y)] = t;
+
+ break;
+ }
+ }
+
+ /*
+ * In case the number of 16bit words is not even
+ * we have 2 padding bytes that we have to skip.
+ */
+
+ if ((y == src_image -> width - 1) && (src_image -> width % 2 == 1)) fbptr += 2;
+
+ if (p == nb_max)
+ {
+ return nb_max + 1;
+ }
+ }
+ }
+
+ return p;
+}
+
+char *PngCompressData(XImage *image, int *compressed_size)
+{
+ unsigned int num = 0;
+ CARD8 *srcBuf;
+
+ int dy, w, h;
+
+ int nb_colors;
+
+ NXColorTable color_table[NB_COLOR_MAX];
+ CARD8 *image_index;
+
+ image_index = (CARD8 *) malloc((image -> height) * (image -> width) * sizeof(CARD8));
+
+ /*
+ * TODO: Be sure the padded bytes are cleaned.
+ * It would be better to set to zero the bytes
+ * that are not alligned to the word boundary
+ * at the end of the procedure.
+ */
+
+ memset(image_index, 0, (image -> height) * (image -> width) * sizeof(CARD8));
+
+ *compressed_size = 0;
+
+ pngDataLen = 0;
+
+ /*
+ * Initialize the image stuff.
+ */
+
+ bitsPerPixel = image -> bits_per_pixel;
+ bytesPerLine = image -> bytes_per_line;
+ byteOrder = image -> byte_order;
+
+ if (bitsPerPixel < 15)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Can't compress images with [%d] bits per pixel.\n",
+ bitsPerPixel);
+ #endif
+
+ return NULL;
+ }
+
+ redShift = FindLSB(image -> red_mask) - 1;
+ greenShift = FindLSB(image -> green_mask) - 1;
+ blueShift = FindLSB(image -> blue_mask) - 1;
+
+ redMax = image -> red_mask >> redShift;
+ greenMax = image -> green_mask >> greenShift;
+ blueMax = image -> blue_mask >> blueShift;
+
+ w = image -> width;
+ h = image -> height;
+ pngBeforeBuf = image -> data;
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PngCompressData: Compressing image with width [%d] height [%d].\n",
+ w, h );
+ #endif
+
+ /*
+ * Initialize the PNG stuff.
+ */
+
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+
+ if (png_ptr == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Failed creating the png_create_write_struct.\n");
+ #endif
+
+ return NULL;
+ }
+
+ info_ptr = png_create_info_struct(png_ptr);
+
+ if (info_ptr == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Failed creating the png_create_info_struct.\n");
+ #endif
+
+ png_destroy_write_struct(&png_ptr, NULL);
+
+ return NULL;
+ }
+
+ if (setjmp(png_jmpbuf(png_ptr)))
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Error during compression initialization.\n");
+ #endif
+
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+
+ return NULL;
+ }
+
+ /*
+ * Be sure we allocate enough data.
+ */
+
+ #ifdef TEST
+ fprintf(stderr, "******PngCompressData: Allocating [%d] bytes for the destination data.\n",
+ PNG_DEST_SIZE(w, h));
+ #endif
+
+ pngCompBuf = malloc(PNG_DEST_SIZE(w, h));
+
+ if (pngCompBuf == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Error allocating [%d] bytes for the Png data.\n",
+ PNG_DEST_SIZE(w, h));
+ #endif
+
+ return NULL;
+ }
+
+ png_set_write_fn(png_ptr, (void *) pngCompBuf, PngWriteData, PngFlushData);
+
+ if (setjmp(png_jmpbuf(png_ptr)))
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Error writing the header.\n");
+ #endif
+
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+
+ free(pngCompBuf);
+
+ return NULL;
+ }
+
+ png_set_compression_level(png_ptr, PNG_Z_LEVEL);
+
+ if (bitsPerPixel == 16)
+ {
+ nb_colors = NXCreatePalette16(image, color_table, image_index, NB_COLOR_MAX);
+ }
+ else
+ {
+ nb_colors = NXCreatePalette32(image, color_table, image_index, NB_COLOR_MAX);
+ }
+
+ if (nb_colors <= NB_COLOR_MAX)
+ {
+ color_type = PNG_COLOR_TYPE_PALETTE;
+ }
+ else
+ {
+ color_type = PNG_COLOR_TYPE_RGB;
+ }
+
+ png_set_IHDR(png_ptr, info_ptr, w, h,
+ 8, color_type, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+
+ if (color_type == PNG_COLOR_TYPE_PALETTE)
+ {
+ palette = png_malloc(png_ptr, sizeof(*palette) * 256);
+
+ /*
+ * TODO: Do we need to clean these bytes?
+ *
+ * memset(palette, 0, sizeof(*palette) * 256);
+ */
+
+ for (num = 0; num < 256 && color_table[num].found != 0; num++)
+ {
+ if (bitsPerPixel == 24)
+ {
+ palette[num].red = (color_table[num].pixel >> redShift) & redMax;
+ palette[num].green = (color_table[num].pixel >> greenShift) & greenMax;
+ palette[num].blue = color_table[num].pixel >> blueShift & blueMax;
+ }
+ else
+ {
+ int inRed, inGreen, inBlue;
+
+ inRed = (color_table[num].pixel >> redShift) & redMax;
+ inGreen = (color_table[num].pixel >> greenShift) & greenMax;
+ inBlue = color_table[num].pixel >> blueShift & blueMax;
+
+ palette[num].red = (CARD8)((inRed * 255 + redMax / 2) / redMax);
+ palette[num].green = (CARD8)((inGreen * 255 + greenMax / 2) / greenMax);
+ palette[num].blue = (CARD8)((inBlue * 255 + blueMax / 2) / blueMax);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PngCompressData: pixel[%d] r[%d] g[%d] b[%d].\n",
+ (int) color_table[num].pixel,palette[num].red,palette[num].green,palette[num].blue);
+ #endif
+ }
+
+ png_set_PLTE(png_ptr, info_ptr, palette, num);
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PngCompressedData: Setting palette.\n");
+ #endif
+ }
+
+ /*
+ * End of palette.
+ */
+
+ png_write_info(png_ptr, info_ptr);
+
+ /*
+ * Allocate space for one line of
+ * the image, 3 bytes per pixel.
+ */
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PngCompressedData: Initialization finished.\n");
+ #endif
+
+ if (setjmp(png_jmpbuf(png_ptr)))
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Error while writing the image rows.\n");
+ #endif
+
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+
+ free(pngCompBuf);
+
+ return NULL;
+ }
+
+ if (color_type == PNG_COLOR_TYPE_PALETTE)
+ {
+ srcBuf = (CARD8 *) malloc(w * sizeof(CARD8));
+
+ if (srcBuf == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Cannot allocate [%d] bytes.\n",
+ (int) (w * sizeof(CARD8)));
+ #endif
+
+ return NULL;
+ }
+
+ /*
+ * TODO: Be sure the padded bytes are cleaned.
+ * It would be better to set to zero the bytes
+ * that are not alligned to the word boundary
+ * at the end of the procedure.
+ */
+
+ memset(srcBuf, 0, w * sizeof(CARD8));
+ }
+ else
+ {
+ srcBuf = (CARD8 *) malloc(w * 3 * sizeof(CARD8));
+
+ /*
+ * TODO: See above.
+ */
+
+ memset(srcBuf, 0, w * 3 * sizeof(CARD8));
+ }
+
+ if (srcBuf == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! Cannot allocate [%d] bytes.\n",
+ w * 3);
+ #endif
+
+ free(pngCompBuf);
+
+ return NULL;
+ }
+
+ for (dy = 0; dy < h; dy++)
+ {
+ if (color_type == PNG_COLOR_TYPE_RGB)
+ {
+ PrepareRowForPng(srcBuf, dy, w);
+ }
+ else
+ {
+ memcpy(srcBuf, image_index + (dy * w), w);
+ }
+
+ png_write_row(png_ptr, srcBuf);
+ }
+
+ #ifdef DEBUG
+ fprintf(stderr, "******PngCompressedData: Compression finished. Lines handled [%d,%d].\n",
+ dy, h);
+ #endif
+
+ free(srcBuf);
+ free(image_index);
+
+ if (setjmp(png_jmpbuf(png_ptr)))
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******PngCompressData: PANIC! error during end of write.\n");
+ #endif
+
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+
+ free(pngCompBuf);
+
+ return NULL;
+ }
+
+ png_write_end(png_ptr, NULL);
+
+ if (color_type == PNG_COLOR_TYPE_PALETTE)
+ {
+ png_free(png_ptr, palette);
+ }
+
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+
+ /*
+ * Check the size of the resulting data.
+ */
+
+ if (pngDataLen > 0)
+ {
+ #ifdef DEBUG
+
+ int i = 0;
+
+ fprintf(stderr, "******PngCompressedData: Compressed size [%d].\n",
+ pngDataLen);
+
+ pngId++;
+ sprintf(pngName, "png%d", pngId);
+ pngFile = fopen(pngName, "w");
+
+ for (i = 0; i < pngDataLen; i++)
+ {
+ fprintf(pngFile, "%c", *(pngCompBuf + i));
+ }
+
+ fclose(pngFile);
+
+ #endif
+
+ *compressed_size = pngDataLen;
+
+ return pngCompBuf;
+ }
+ else
+ {
+ #ifdef DEBUG
+ fprintf(stderr, "******PngCompressedData: PANIC! Invalid size of the compressed data [%d].\n",
+ pngDataLen);
+ #endif
+
+ free(pngCompBuf);
+
+ return NULL;
+ }
+}
+
+static void PngWriteData(png_structp png_ptr, png_bytep data, png_size_t length)
+{
+ memcpy(((char *) png_get_io_ptr(png_ptr) + pngDataLen), data, length);
+
+ pngDataLen += length;
+}
+
+static void PngFlushData(png_structp png_ptr)
+{
+}
+
+void PrepareRowForPng(CARD8 *dst, int y, int count)
+{
+ if (bitsPerPixel == 32)
+ {
+ if (redMax == 0xff &&
+ greenMax == 0xff &&
+ blueMax == 0xff)
+ {
+ PrepareRowForPng24(dst, y, count);
+ }
+ else
+ {
+ PrepareRowForPng32(dst, y, count);
+ }
+ }
+ else if (bitsPerPixel == 24)
+ {
+ memcpy(dst, pngBeforeBuf + y * bytesPerLine, count * 3);
+ }
+ else
+ {
+ /*
+ * 16 bpp assumed.
+ */
+
+ PrepareRowForPng16(dst, y, count);
+ }
+}
+
+
+
+void PrepareRowForPng24(CARD8 *dst, int y, int count)
+{
+ CARD8 *fbptr;
+ CARD32 pix;
+
+ fbptr = (CARD8 *) (pngBeforeBuf + y * bytesPerLine);
+
+ while (count--)
+ {
+ if (byteOrder == LSBFirst)
+ {
+ pix = (CARD32) *(fbptr + 2);
+ pix = (pix << 8) | (CARD32) *(fbptr+1);
+ pix = (pix << 8) | (CARD32) *fbptr;
+ }
+ else
+ {
+ pix = (CARD32) *(fbptr + 1);
+ pix = (pix << 8) | (CARD32) *(fbptr + 2);
+ pix = (pix << 8) | (CARD32) *(fbptr + 3);
+ }
+
+ *dst++ = (CARD8)(pix >> redShift);
+ *dst++ = (CARD8)(pix >> greenShift);
+ *dst++ = (CARD8)(pix >> blueShift);
+
+ fbptr+=4;
+ }
+}
+
+#define DEFINE_PNG_GET_ROW_FUNCTION(bpp) \
+ \
+void PrepareRowForPng##bpp(CARD8 *dst, int y, int count) \
+{ \
+ CARD8 *fbptr; \
+ CARD##bpp pix; \
+ int inRed, inGreen, inBlue; \
+ int i; \
+ \
+ fbptr = (CARD8 *) (pngBeforeBuf + y * bytesPerLine); \
+ \
+ while (count--) \
+ { \
+ pix = 0; \
+ \
+ if (byteOrder == LSBFirst) \
+ { \
+ for (i = (bpp >> 3) - 1; i >= 0; i--) \
+ { \
+ pix = (pix << 8) | (CARD32) *(fbptr + i); \
+ } \
+ } \
+ else \
+ { \
+ for (i = 0; i < (bpp >> 3); i++) \
+ { \
+ pix = (pix << 8) | (CARD32) *(fbptr + i); \
+ } \
+ } \
+ \
+ fbptr += (bpp >> 3); \
+ \
+ inRed = (int) \
+ (pix >> redShift & redMax); \
+ inGreen = (int) \
+ (pix >> greenShift & greenMax); \
+ inBlue = (int) \
+ (pix >> blueShift & blueMax); \
+ *dst++ = (CARD8)((inRed * 255 + redMax / 2) / \
+ redMax); \
+ *dst++ = (CARD8)((inGreen * 255 + greenMax / 2) / \
+ greenMax); \
+ *dst++ = (CARD8)((inBlue * 255 + blueMax / 2) / \
+ blueMax); \
+ } \
+}
+
+DEFINE_PNG_GET_ROW_FUNCTION(16)
+DEFINE_PNG_GET_ROW_FUNCTION(32)
diff --git a/nxcompext/Pgn.h b/nxcompext/Pgn.h
new file mode 100644
index 000000000..999e8ea01
--- /dev/null
+++ b/nxcompext/Pgn.h
@@ -0,0 +1,68 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Pgn_H
+#define Pgn_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "X11/X.h"
+#include "X11/Xlib.h"
+#include "X11/Xmd.h"
+
+#include <png.h>
+
+extern int PngCompareColorTable(
+#if NeedFunctionPrototypes
+ NXColorTable* /* color_table_1 */,
+ NXColorTable* /* color_table_2 */
+#endif
+);
+
+extern char *PngCompressData(
+#if NeedFunctionPrototypes
+ XImage* /* image */,
+ int* /* compressed_size */
+#endif
+);
+
+int NXCreatePalette16(
+#if NeedFunctionPrototypes
+ XImage* /* src_image */,
+ NXColorTable* /* color_table */,
+ CARD8* /* image_index */,
+ int /* nb_max */
+#endif
+);
+
+int NXCreatePalette32(
+#if NeedFunctionPrototypes
+ XImage* /* src_image */,
+ NXColorTable* /* color_table */,
+ CARD8* /* image_index */,
+ int /* nb_max */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Pgn_H */
+
diff --git a/nxcompext/README b/nxcompext/README
new file mode 100644
index 000000000..39648e76b
--- /dev/null
+++ b/nxcompext/README
@@ -0,0 +1,15 @@
+README
+------
+
+1. To compile:
+
+ > tar zxvf nxcompext-X.Y.Z-N.tar.gz
+ > cd nxcompext
+ > ./configure
+ > make
+
+ You'll have to run gmake under Solaris.
+
+2. The 'make install' target is not currently supported
+ in the Makefile, but it should be simple to fix.
+
diff --git a/nxcompext/Rgb.c b/nxcompext/Rgb.c
new file mode 100644
index 000000000..d6cecb4b6
--- /dev/null
+++ b/nxcompext/Rgb.c
@@ -0,0 +1,43 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <zlib.h>
+
+#include "NXlib.h"
+
+#include "Rgb.h"
+#include "Z.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+#define RGB_COMPRESSION_LEVEL 4
+#define RGB_COMPRESSION_THRESHOLD 32
+#define RGB_COMPRESSION_STRATEGY Z_DEFAULT_STRATEGY
+
+static int rgbCompressionLevel = RGB_COMPRESSION_LEVEL;
+static int rgbCompressionThreshold = RGB_COMPRESSION_THRESHOLD;
+static int rgbCompressionStrategy = RGB_COMPRESSION_STRATEGY;
+
+char *RgbCompressData(XImage *image, unsigned int *size)
+{
+ return ZCompressData(image -> data, image -> bytes_per_line * image -> height,
+ rgbCompressionThreshold, rgbCompressionLevel,
+ rgbCompressionStrategy, size);
+}
diff --git a/nxcompext/Rgb.h b/nxcompext/Rgb.h
new file mode 100644
index 000000000..931ee6af7
--- /dev/null
+++ b/nxcompext/Rgb.h
@@ -0,0 +1,36 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Rgb_H
+#define Rgb_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char *RgbCompressData(
+#if NeedFunctionPrototypes
+ XImage* /* image */,
+ unsigned int* /* compressed_size */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Rgb_H */
diff --git a/nxcompext/Rle.c b/nxcompext/Rle.c
new file mode 100644
index 000000000..b647dbbae
--- /dev/null
+++ b/nxcompext/Rle.c
@@ -0,0 +1,43 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <zlib.h>
+
+#include "NXlib.h"
+
+#include "Rle.h"
+#include "Z.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+#define RLE_COMPRESSION_LEVEL 1
+#define RLE_COMPRESSION_THRESHOLD 32
+#define RLE_COMPRESSION_STRATEGY Z_RLE
+
+static int rleCompressionLevel = RLE_COMPRESSION_LEVEL;
+static int rleCompressionThreshold = RLE_COMPRESSION_THRESHOLD;
+static int rleCompressionStrategy = RLE_COMPRESSION_STRATEGY;
+
+char *RleCompressData(XImage *image, unsigned int *size)
+{
+ return ZCompressData(image -> data, image -> bytes_per_line * image -> height,
+ rleCompressionThreshold, rleCompressionLevel,
+ rleCompressionStrategy, size);
+}
diff --git a/nxcompext/Rle.h b/nxcompext/Rle.h
new file mode 100644
index 000000000..7125d2f24
--- /dev/null
+++ b/nxcompext/Rle.h
@@ -0,0 +1,36 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Rle_H
+#define Rle_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char *RleCompressData(
+#if NeedFunctionPrototypes
+ XImage* /* image */,
+ unsigned int* /* compressed_size */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Rle_H */
diff --git a/nxcompext/VERSION b/nxcompext/VERSION
new file mode 100644
index 000000000..1545d9665
--- /dev/null
+++ b/nxcompext/VERSION
@@ -0,0 +1 @@
+3.5.0
diff --git a/nxcompext/Z.c b/nxcompext/Z.c
new file mode 100644
index 000000000..d6ed3d149
--- /dev/null
+++ b/nxcompext/Z.c
@@ -0,0 +1,301 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <zlib.h>
+
+#include "NXlib.h"
+
+#include "Z.h"
+
+#define PANIC
+#define WARNING
+#undef TEST
+#undef DEBUG
+
+#define Z_COMPRESSION_LEVEL 4
+#define Z_COMPRESSION_THRESHOLD 32
+#define Z_COMPRESSION_STRATEGY Z_DEFAULT_STRATEGY
+
+static int zCompressionLevel = Z_COMPRESSION_LEVEL;
+static int zCompressionStrategy = Z_COMPRESSION_STRATEGY;
+
+static z_stream *zStream;
+
+static int zInitialized;
+
+static int ZConfigure(int level, int strategy);
+
+static int ZDeflate(char *dest, unsigned int *destLen,
+ const char *source, unsigned int sourceLen);
+
+char *ZCompressData(const char *plainData, unsigned int plainSize, int threshold,
+ int level, int strategy, unsigned int *compressedSize)
+{
+ char *compressedData;
+
+ /*
+ * Determine the size of the source image
+ * data and make sure there is enough
+ * space in the destination buffer.
+ */
+
+ *compressedSize = plainSize + (plainSize / 1000) + 12 + 1;
+
+ compressedData = Xmalloc(*compressedSize);
+
+ if (compressedData == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******ZCompressData: PANIC! Failed to allocate [%d] bytes for the destination.\n",
+ *compressedSize);
+ #endif
+
+ *compressedSize = 0;
+
+ return NULL;
+ }
+
+ if (level == Z_NO_COMPRESSION || plainSize < threshold)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******ZCompressData: Not compressing [%d] bytes with level [%d] and "
+ "threshold [%d].\n", plainSize, level, threshold);
+ #endif
+
+ /*
+ * Tell in the first byte of the buffer
+ * if the remaining data is compressed
+ * or not. This same byte can be used
+ * in future to store some other flag.
+ */
+
+ *compressedData = 0;
+
+ memcpy(compressedData + 1, plainData, plainSize);
+
+ *compressedSize = plainSize + 1;
+
+ return compressedData;
+ }
+ else
+ {
+ int result;
+
+ /*
+ * Reconfigure the stream if needed.
+ */
+
+ if (zCompressionLevel != level ||
+ zCompressionStrategy != strategy)
+ {
+ ZConfigure(level, strategy);
+
+ zCompressionLevel = level;
+ zCompressionStrategy = strategy;
+ }
+
+ result = ZDeflate(compressedData + 1, compressedSize, plainData, plainSize);
+
+ if (result != Z_OK)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******ZCompressData: PANIC! Failed to compress [%d] bytes with error [%s].\n",
+ plainSize, zError(result));
+ #endif
+
+ Xfree(compressedData);
+
+ *compressedSize = 0;
+
+ return NULL;
+ }
+
+ #ifdef TEST
+ fprintf(stderr, "******ZCompressData: Source data of [%d] bytes compressed to [%d].\n",
+ plainSize, *compressedSize);
+ #endif
+
+ *compressedData = 1;
+
+ *compressedSize = *compressedSize + 1;
+
+ return compressedData;
+ }
+}
+
+int ZConfigure(int level, int strategy)
+{
+ /*
+ * ZLIB wants the avail_out to be
+ * non zero, even if the stream was
+ * already flushed.
+ */
+
+ unsigned char dest[1];
+
+ zStream -> next_out = dest;
+ zStream -> avail_out = 1;
+
+ if (deflateParams(zStream, level, strategy) != Z_OK)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******ZConfigure: PANIC! Failed to set level to [%d] and strategy to [%d].\n",
+ level, strategy);
+ #endif
+
+ return -1;
+ }
+ #ifdef TEST
+ else
+ {
+ fprintf(stderr, "******ZConfigure: Reconfigured the stream with level [%d] and strategy [%d].\n",
+ level, strategy);
+ }
+ #endif
+
+ return 1;
+}
+
+int ZDeflate(char *dest, unsigned int *destLen, const char *source, unsigned int sourceLen)
+{
+ int saveOut;
+ int result;
+
+ /*
+ * Deal with the possible overflow.
+ */
+
+ if (zStream -> total_out & 0x80000000)
+ {
+ #ifdef TEST
+ fprintf(stderr, "******ZDeflate: Reset Z stream counters with total in [%ld] total out [%ld].\n",
+ zStream -> total_in, zStream -> total_out);
+ #endif
+
+ zStream -> total_in = 0;
+ zStream -> total_out = 0;
+ }
+
+ saveOut = zStream -> total_out;
+
+ zStream -> next_in = (Bytef *) source;
+ zStream -> avail_in = (uInt) sourceLen;
+
+ #ifdef MAXSEG_64K
+
+ /*
+ * Check if the source is greater
+ * than 64K on a 16-bit machine.
+ */
+
+ if ((uLong) zStream -> avail_in != sourceLen) return Z_BUF_ERROR;
+
+ #endif
+
+ zStream -> next_out = (unsigned char *) dest;
+ zStream -> avail_out = (uInt) *destLen;
+
+ if ((uLong) zStream -> avail_out != *destLen) return Z_BUF_ERROR;
+
+ result = deflate(zStream, Z_FINISH);
+
+ if (result != Z_STREAM_END)
+ {
+ deflateReset(zStream);
+
+ return (result == Z_OK ? Z_BUF_ERROR : result);
+ }
+
+ *destLen = zStream -> total_out - saveOut;
+
+ result = deflateReset(zStream);
+
+ return result;
+}
+
+int ZInitEncoder()
+{
+ if (zInitialized == 0)
+ {
+ int result;
+
+ zStream = Xmalloc(sizeof(z_stream));
+
+ if (zStream == NULL)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******ZInitEncoder: PANIC! Failed to allocate memory for the stream.\n");
+ #endif
+
+ return -1;
+ }
+
+ zStream -> zalloc = (alloc_func) 0;
+ zStream -> zfree = (free_func) 0;
+ zStream -> opaque = (voidpf) 0;
+
+ #ifdef TEST
+ fprintf(stderr, "******ZInitEncoder: Initializing compressor with level [%d] and startegy [%d].\n",
+ zCompressionLevel, zCompressionStrategy);
+ #endif
+
+ result = deflateInit2(zStream, zCompressionLevel, Z_DEFLATED,
+ 15, 9, zCompressionStrategy);
+
+ if (result != Z_OK)
+ {
+ #ifdef PANIC
+ fprintf(stderr, "******ZInitEncoder: Failed to initialize the compressor with error [%s].\n",
+ zError(result));
+ #endif
+
+ return -1;
+ }
+
+ zInitialized = 1;
+ }
+
+ return zInitialized;
+}
+
+int ZResetEncoder()
+{
+ int result;
+
+ if (zInitialized == 1)
+ {
+ result = deflateEnd(zStream);
+
+ if (result != Z_OK)
+ {
+ #ifdef WARNING
+ fprintf(stderr, "******ZResetEncoder: WARNING! Failed to deinitialize the compressor with error [%s].\n",
+ zError(result));
+ #endif
+ }
+
+ Xfree(zStream);
+ }
+
+ zInitialized = 0;
+
+ return 1;
+}
diff --git a/nxcompext/Z.h b/nxcompext/Z.h
new file mode 100644
index 000000000..b6733c607
--- /dev/null
+++ b/nxcompext/Z.h
@@ -0,0 +1,52 @@
+/**************************************************************************/
+/* */
+/* Copyright (c) 2001, 2007 NoMachine, http://www.nomachine.com/. */
+/* */
+/* NXCOMPEXT, NX protocol compression and NX extensions to this software */
+/* are copyright of NoMachine. Redistribution and use of the present */
+/* software is allowed according to terms specified in the file LICENSE */
+/* which comes in the source distribution. */
+/* */
+/* Check http://www.nomachine.com/licensing.html for applicability. */
+/* */
+/* NX and NoMachine are trademarks of NoMachine S.r.l. */
+/* */
+/* All rigths reserved. */
+/* */
+/**************************************************************************/
+
+#ifndef Z_H
+#define Z_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int ZInitEncoder(
+#if NeedFunctionPrototypes
+void
+#endif
+);
+
+int ZResetEncoder(
+#if NeedFunctionPrototypes
+void
+#endif
+);
+
+extern char *ZCompressData(
+#if NeedFunctionPrototypes
+ const char* /* data */,
+ unsigned int /* size */,
+ int /* threshold */,
+ int /* level */,
+ int /* strategy */,
+ unsigned int* /* compressed_size */
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* Z_H */
diff --git a/nxcompext/configure b/nxcompext/configure
new file mode 100755
index 000000000..87d630ec2
--- /dev/null
+++ b/nxcompext/configure
@@ -0,0 +1,5618 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59.
+#
+# Copyright (C) 2003 Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_unique_file="NXlib.h"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS CXX CXXFLAGS LDFLAGS CPPFLAGS ac_ct_CXX EXEEXT OBJEXT CC CFLAGS ac_ct_CC INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CXXCPP X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS LIBVERSION VERSION MAKEDEPEND ALL LIBOBJS LTLIBOBJS'
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c | -n)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+# FIXME: To remove some day.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: To remove some day.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<_ACEOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_ACEOF
+
+ cat <<\_ACEOF
+
+X features:
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\_ACEOF
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-x use the X Window System
+
+Some influential environment variables:
+ CXX C++ compiler command
+ CXXFLAGS C++ compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CC C compiler command
+ CFLAGS C compiler flags
+ CXXCPP C++ preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_srcdir/configure; then
+ echo
+ $SHELL $ac_srcdir/configure --help=recursive
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+_ACEOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<_ACEOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+cat <<_ASUNAME
+## --------- ##
+## Platform. ##
+## --------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+_ASUNAME
+
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ echo "PATH: $as_dir"
+done
+
+} >&5
+
+cat >&5 <<_ACEOF
+
+
+## ----------- ##
+## Core tests. ##
+## ----------- ##
+
+_ACEOF
+
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Strip out --silent because we don't want to record it for future runs.
+# Also quote any args containing shell meta-characters.
+# Make two passes to allow for proper duplicate-argument suppression.
+ac_configure_args=
+ac_configure_args0=
+ac_configure_args1=
+ac_sep=
+ac_must_keep_next=false
+for ac_pass in 1 2
+do
+ for ac_arg
+ do
+ case $ac_arg in
+ -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ continue ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$ac_configure_args1 '$ac_arg'"
+ if test $ac_must_keep_next = true; then
+ ac_must_keep_next=false # Got value, back to normal.
+ else
+ case $ac_arg in
+ *=* | --config-cache | -C | -disable-* | --disable-* \
+ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
+ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
+ | -with-* | --with-* | -without-* | --without-* | --x)
+ case "$ac_configure_args0 " in
+ "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
+ esac
+ ;;
+ -* ) ac_must_keep_next=true ;;
+ esac
+ fi
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+# WARNING: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Predefined preprocessor variables.
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_NAME "$PACKAGE_NAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_VERSION "$PACKAGE_VERSION"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_STRING "$PACKAGE_STRING"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
+ *) ac_arg=$ac_var=$ac_new_val ;;
+ esac
+ case " $ac_configure_args " in
+ *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+CXXFLAGS="-O3"
+CFLAGS="-O3"
+
+
+LIBSTATIC=""
+LIBSHARED=""
+
+
+if test -d "../nx-X11/include" ; then
+ CXXFLAGS="$CXXFLAGS -I../nx-X11/exports/include -I../nx-X11/lib/X11 \
+ -I../nx-X11/include -I../nx-X11/programs/Xserver/include"
+ CFLAGS="$CFLAGS -I../nx-X11/exports/include -I../nx-X11/lib/X11 \
+ -I../nx-X11/include -I../nx-X11/programs/Xserver/include"
+ LDFLAGS="$LDFLAGS -L../nx-X11/exports/lib"
+fi
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CXX"; then
+ ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CXX"; then
+ ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+ CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe b.out"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5
+echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5
+echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C++ compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in conftest.exe conftest conftest.*; do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cxx_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+
+/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has
+ function prototypes and stuff, but not '\xHH' hex character constants.
+ These don't provoke an error unfortunately, instead are silently treated
+ as 'x'. The following induces an error, until -std1 is added to get
+ proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an
+ array size at least. It's necessary to write '\x00'==0 to get something
+ that's true only with -std1. */
+int osf4_cc_array ['\x00' == 0 ? 1 : -1];
+
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# OS/2's system install, which has a completely different semantic
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ # Account for people who put trailing slashes in PATH elements.
+case $as_dir/ in
+ ./ | .// | /cC/* | \
+ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
+ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
+ /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CXXCPP needs to be expanded
+ for CXXCPP in "$CXX -E" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+ CXXCPP=$ac_cv_prog_CXXCPP
+else
+ ac_cv_prog_CXXCPP=$CXXCPP
+fi
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$CXXCPP" >&6
+ac_preproc_ok=false
+for ac_cxx_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ # <limits.h> exists even on freestanding compilers.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+echo "$as_me:$LINENO: checking for X" >&5
+echo $ECHO_N "checking for X... $ECHO_C" >&6
+
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+ withval="$with_x"
+
+fi;
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+ # The user explicitly disabled X.
+ have_x=disabled
+else
+ if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+ # Both variables are already set.
+ have_x=yes
+ else
+ if test "${ac_cv_have_x+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -fr conftest.dir
+if mkdir conftest.dir; then
+ cd conftest.dir
+ # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+ cat >Imakefile <<'_ACEOF'
+acfindx:
+ @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+_ACEOF
+ if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+ eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl; do
+ if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
+ test -f $ac_im_libdir/libX11.$ac_extension; then
+ ac_im_usrlibdir=$ac_im_libdir; break
+ fi
+ done
+ # Screen out bogus values from the imake configuration. They are
+ # bogus both because they are the default anyway, and because
+ # using them would break gcc on systems where it needs fixed includes.
+ case $ac_im_incroot in
+ /usr/include) ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+ esac
+ case $ac_im_usrlibdir in
+ /usr/lib | /lib) ;;
+ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+ esac
+ fi
+ cd ..
+ rm -fr conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+ # Guess where to find include files, by looking for Intrinsic.h.
+ # First, try using that file with no special directory specified.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <X11/Intrinsic.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ for ac_dir in $ac_x_header_dirs; do
+ if test -r "$ac_dir/X11/Intrinsic.h"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+done
+fi
+rm -f conftest.err conftest.$ac_ext
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+ # Check for the libraries.
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS=$LIBS
+ LIBS="-lXt $LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <X11/Intrinsic.h>
+int
+main ()
+{
+XtMalloc (0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+LIBS=$ac_save_LIBS
+for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+ # Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl; do
+ if test -r $ac_dir/libXt.$ac_extension; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then
+ # Didn't find X anywhere. Cache the known absence of X.
+ ac_cv_have_x="have_x=no"
+else
+ # Record where we found X for the cache.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+
+ fi
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ echo "$as_me:$LINENO: result: $have_x" >&5
+echo "${ECHO_T}$have_x" >&6
+ no_x=yes
+else
+ # If each of the values was on the command line, it overrides each guess.
+ test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+ # Update the cache value to reflect the command line values.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+ echo "$as_me:$LINENO: result: libraries $x_libraries, headers $x_includes" >&5
+echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6
+fi
+
+if test "$no_x" = yes; then
+ # Not all programs may use this symbol, but it does not hurt to define it.
+
+cat >>confdefs.h <<\_ACEOF
+#define X_DISPLAY_MISSING 1
+_ACEOF
+
+ X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
+else
+ if test -n "$x_includes"; then
+ X_CFLAGS="$X_CFLAGS -I$x_includes"
+ fi
+
+ # It would also be nice to do this for all -L options, not just this one.
+ if test -n "$x_libraries"; then
+ X_LIBS="$X_LIBS -L$x_libraries"
+ # For Solaris; some versions of Sun CC require a space after -R and
+ # others require no space. Words are not sufficient . . . .
+ case `(uname -sr) 2>/dev/null` in
+ "SunOS 5"*)
+ echo "$as_me:$LINENO: checking whether -R must be followed by a space" >&5
+echo $ECHO_N "checking whether -R must be followed by a space... $ECHO_C" >&6
+ ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_R_nospace=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_R_nospace=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $ac_R_nospace = yes; then
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ X_LIBS="$X_LIBS -R$x_libraries"
+ else
+ LIBS="$ac_xsave_LIBS -R $x_libraries"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_R_space=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_R_space=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test $ac_R_space = yes; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ X_LIBS="$X_LIBS -R $x_libraries"
+ else
+ echo "$as_me:$LINENO: result: neither works" >&5
+echo "${ECHO_T}neither works" >&6
+ fi
+ fi
+ LIBS=$ac_xsave_LIBS
+ esac
+ fi
+
+ # Check for system-dependent libraries X programs must link with.
+ # Do this before checking for the system-independent R6 libraries
+ # (-lICE), since we may need -lsocket or whatever for X linking.
+
+ if test "$ISC" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+ else
+ # Martyn Johnson says this is needed for Ultrix, if the X
+ # libraries were built with DECnet support. And Karl Berry says
+ # the Alpha needs dnet_stub (dnet does not exist).
+ ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XOpenDisplay ();
+int
+main ()
+{
+XOpenDisplay ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_dnet_ntoa+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa ();
+int
+main ()
+{
+dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dnet_dnet_ntoa=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dnet_dnet_ntoa=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_dnet_ntoa" >&6
+if test $ac_cv_lib_dnet_dnet_ntoa = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+fi
+
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ echo "$as_me:$LINENO: checking for dnet_ntoa in -ldnet_stub" >&5
+echo $ECHO_N "checking for dnet_ntoa in -ldnet_stub... $ECHO_C" >&6
+if test "${ac_cv_lib_dnet_stub_dnet_ntoa+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldnet_stub $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa ();
+int
+main ()
+{
+dnet_ntoa ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dnet_stub_dnet_ntoa=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dnet_stub_dnet_ntoa=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5
+echo "${ECHO_T}$ac_cv_lib_dnet_stub_dnet_ntoa" >&6
+if test $ac_cv_lib_dnet_stub_dnet_ntoa = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+fi
+
+ fi
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ LIBS="$ac_xsave_LIBS"
+
+ # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+ # to get the SysV transport functions.
+ # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
+ # needs -lnsl.
+ # The nsl library prevents programs from opening the X display
+ # on Irix 5.2, according to T.E. Dickey.
+ # The functions gethostbyname, getservbyname, and inet_addr are
+ # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
+ echo "$as_me:$LINENO: checking for gethostbyname" >&5
+echo $ECHO_N "checking for gethostbyname... $ECHO_C" >&6
+if test "${ac_cv_func_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define gethostbyname to an innocuous variant, in case <limits.h> declares gethostbyname.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define gethostbyname innocuous_gethostbyname
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char gethostbyname (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef gethostbyname
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+char (*f) () = gethostbyname;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != gethostbyname;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_gethostbyname=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_func_gethostbyname" >&6
+
+ if test $ac_cv_func_gethostbyname = no; then
+ echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5
+echo $ECHO_N "checking for gethostbyname in -lnsl... $ECHO_C" >&6
+if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnsl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main ()
+{
+gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_nsl_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_nsl_gethostbyname=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_nsl_gethostbyname" >&6
+if test $ac_cv_lib_nsl_gethostbyname = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+fi
+
+ if test $ac_cv_lib_nsl_gethostbyname = no; then
+ echo "$as_me:$LINENO: checking for gethostbyname in -lbsd" >&5
+echo $ECHO_N "checking for gethostbyname in -lbsd... $ECHO_C" >&6
+if test "${ac_cv_lib_bsd_gethostbyname+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lbsd $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname ();
+int
+main ()
+{
+gethostbyname ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_bsd_gethostbyname=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_bsd_gethostbyname=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_gethostbyname" >&5
+echo "${ECHO_T}$ac_cv_lib_bsd_gethostbyname" >&6
+if test $ac_cv_lib_bsd_gethostbyname = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
+fi
+
+ fi
+ fi
+
+ # lieder@skyler.mavd.honeywell.com says without -lsocket,
+ # socket/setsockopt and other routines are undefined under SCO ODT
+ # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary
+ # on later versions), says Simon Leinen: it contains gethostby*
+ # variants that don't use the name server (or something). -lsocket
+ # must be given before -lnsl if both are needed. We assume that
+ # if connect needs -lnsl, so does gethostbyname.
+ echo "$as_me:$LINENO: checking for connect" >&5
+echo $ECHO_N "checking for connect... $ECHO_C" >&6
+if test "${ac_cv_func_connect+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define connect to an innocuous variant, in case <limits.h> declares connect.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define connect innocuous_connect
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char connect (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef connect
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_connect) || defined (__stub___connect)
+choke me
+#else
+char (*f) () = connect;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != connect;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_connect=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_connect=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_connect" >&5
+echo "${ECHO_T}$ac_cv_func_connect" >&6
+
+ if test $ac_cv_func_connect = no; then
+ echo "$as_me:$LINENO: checking for connect in -lsocket" >&5
+echo $ECHO_N "checking for connect in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_connect+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect ();
+int
+main ()
+{
+connect ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_socket_connect=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_socket_connect=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_socket_connect" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_connect" >&6
+if test $ac_cv_lib_socket_connect = yes; then
+ X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+fi
+
+ fi
+
+ # Guillermo Gomez says -lposix is necessary on A/UX.
+ echo "$as_me:$LINENO: checking for remove" >&5
+echo $ECHO_N "checking for remove... $ECHO_C" >&6
+if test "${ac_cv_func_remove+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define remove to an innocuous variant, in case <limits.h> declares remove.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define remove innocuous_remove
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char remove (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef remove
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char remove ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_remove) || defined (__stub___remove)
+choke me
+#else
+char (*f) () = remove;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != remove;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_remove=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_remove=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_remove" >&5
+echo "${ECHO_T}$ac_cv_func_remove" >&6
+
+ if test $ac_cv_func_remove = no; then
+ echo "$as_me:$LINENO: checking for remove in -lposix" >&5
+echo $ECHO_N "checking for remove in -lposix... $ECHO_C" >&6
+if test "${ac_cv_lib_posix_remove+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lposix $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char remove ();
+int
+main ()
+{
+remove ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_posix_remove=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_posix_remove=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_posix_remove" >&5
+echo "${ECHO_T}$ac_cv_lib_posix_remove" >&6
+if test $ac_cv_lib_posix_remove = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+fi
+
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ echo "$as_me:$LINENO: checking for shmat" >&5
+echo $ECHO_N "checking for shmat... $ECHO_C" >&6
+if test "${ac_cv_func_shmat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shmat to an innocuous variant, in case <limits.h> declares shmat.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shmat innocuous_shmat
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shmat (); below.
+ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
+ <limits.h> exists even on freestanding compilers. */
+
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+
+#undef shmat
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shmat ();
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shmat) || defined (__stub___shmat)
+choke me
+#else
+char (*f) () = shmat;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shmat;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shmat=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shmat=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shmat" >&5
+echo "${ECHO_T}$ac_cv_func_shmat" >&6
+
+ if test $ac_cv_func_shmat = no; then
+ echo "$as_me:$LINENO: checking for shmat in -lipc" >&5
+echo $ECHO_N "checking for shmat in -lipc... $ECHO_C" >&6
+if test "${ac_cv_lib_ipc_shmat+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lipc $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shmat ();
+int
+main ()
+{
+shmat ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_ipc_shmat=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_ipc_shmat=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_ipc_shmat" >&5
+echo "${ECHO_T}$ac_cv_lib_ipc_shmat" >&6
+if test $ac_cv_lib_ipc_shmat = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+fi
+
+ fi
+ fi
+
+ # Check for libraries that X11R6 Xt/Xaw programs need.
+ ac_save_LDFLAGS=$LDFLAGS
+ test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+ # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+ # check for ICE first), but we must link in the order -lSM -lICE or
+ # we get undefined symbols. So assume we have SM if we have ICE.
+ # These have to be linked with before -lX11, unlike the other
+ # libraries we check for below, so use a different variable.
+ # John Interrante, Karl Berry
+ echo "$as_me:$LINENO: checking for IceConnectionNumber in -lICE" >&5
+echo $ECHO_N "checking for IceConnectionNumber in -lICE... $ECHO_C" >&6
+if test "${ac_cv_lib_ICE_IceConnectionNumber+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char IceConnectionNumber ();
+int
+main ()
+{
+IceConnectionNumber ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_ICE_IceConnectionNumber=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_ICE_IceConnectionNumber=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5
+echo "${ECHO_T}$ac_cv_lib_ICE_IceConnectionNumber" >&6
+if test $ac_cv_lib_ICE_IceConnectionNumber = yes; then
+ X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+fi
+
+ LDFLAGS=$ac_save_LDFLAGS
+
+fi
+
+
+ac_help="$ac_help
+ --with-symbols add the -g flag to produce the debug symbols
+ --with-info enable basic log output to trace the program
+ --with-valgrind clean up allocated buffers to avoid valgrind warnings
+ --with-version use this version for produced libraries
+
+ --with-static-png enable static linking of PNG library
+ --with-static-jpeg enable static linking of JPEG library"
+
+
+
+
+
+echo "$as_me:$LINENO: checking for Cygwin32 environment" >&5
+echo $ECHO_N "checking for Cygwin32 environment... $ECHO_C" >&6
+if test "${nxproxy_cv_cygwin32+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+return __CYGWIN32__;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ nxproxy_cv_cygwin32=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+nxproxy_cv_cygwin32=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f conftest*
+fi
+echo "$as_me:$LINENO: result: $nxproxy_cv_cygwin32" >&5
+echo "${ECHO_T}$nxproxy_cv_cygwin32" >&6
+CYGWIN32=
+test "$nxproxy_cv_cygwin32" = yes && CYGWIN32=yes
+if test "$CYGWIN32" = yes; then
+ LIBS="$LIBS -mwindows -lstdc++"
+fi
+
+
+
+echo "$as_me:$LINENO: checking for Amd64 environment" >&5
+echo $ECHO_N "checking for Amd64 environment... $ECHO_C" >&6
+if test "${nxconf_cv_amd64+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+return (__amd64__ || __x86_64__);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ nxconf_cv_amd64=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+nxconf_cv_amd64=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f conftest*
+fi
+echo "$as_me:$LINENO: result: $nxconf_cv_amd64" >&5
+echo "${ECHO_T}$nxconf_cv_amd64" >&6
+AMD64=
+test "$nxconf_cv_amd64" = yes && AMD64=yes
+
+
+
+echo "$as_me:$LINENO: checking for SunOS environment" >&5
+echo $ECHO_N "checking for SunOS environment... $ECHO_C" >&6
+if test "${nxconf_cv_sun+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+return __sun;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ nxconf_cv_sun=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+nxconf_cv_sun=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f conftest*
+fi
+echo "$as_me:$LINENO: result: $nxconf_cv_sun" >&5
+echo "${ECHO_T}$nxconf_cv_sun" >&6
+SUN=
+test "$nxconf_cv_sun" = yes && SUN=yes
+
+if test "$SUN" = yes; then
+ CFLAGS="$CFLAGS -I/usr/sfw/include"
+fi
+
+if test "$SUN" = yes; then
+ LDFLAGS="$LDFLAGS -G -h \$(LIBLOAD) -L/usr/sfw/lib"
+else
+ LDFLAGS="$LDFLAGS -shared -Wl,-soname,\$(LIBLOAD)"
+fi
+
+
+
+echo "$as_me:$LINENO: checking for FreeBSD environment" >&5
+echo $ECHO_N "checking for FreeBSD environment... $ECHO_C" >&6
+if test "${nxconf_cv_freebsd+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+return __FreeBSD__;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ nxconf_cv_freebsd=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+nxconf_cv_freebsd=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+rm -f conftest*
+fi
+echo "$as_me:$LINENO: result: $nxconf_cv_freebsd" >&5
+echo "${ECHO_T}$nxconf_cv_freebsd" >&6
+FreeBSD=
+test "$nxconf_cv_freebsd" = yes && FreeBSD=yes
+
+
+if test "$CYGWIN32" != yes -a "$DARWIN" != yes; then
+ CXXFLAGS="$CXXFLAGS -fPIC"
+ CFLAGS="$CFLAGS -fPIC"
+fi
+
+
+if test "$FreeBSD" = yes; then
+ LIBS="$LIBS -L/usr/local/lib"
+ CXXFLAGS="$CXXFLAGS -I/usr/local/include"
+ CFLAGS="$CFLAGS -I/usr/local/include"
+fi
+
+
+if test "${with_static_png}" = yes; then
+ echo -e "enabling static linking of PNG library"
+ if test "$CYGWIN32" = yes; then
+ LIBS="$LIBSTATIC -static -lpng"
+ else
+ if test -f "/usr/lib/libpng.a" ; then
+ LIBS="/usr/lib/libpng.a $LIBS"
+ else
+ if test -f "/usr/local/lib/libpng.a" ; then
+ echo -e "assuming libpng.a in /usr/local/lib"
+ LIBS="/usr/local/lib/libpng.a $LIBS"
+ else
+ echo -e "assuming libpng.a in default linker path"
+ LIBS="libpng.a $LIBS"
+ fi
+ fi
+ fi
+else
+ echo -e "enabling dynamic linking of PNG library"
+ LIBS="-lpng $LIBS"
+fi
+
+if test "${with_static_jpeg}" = yes; then
+ echo -e "enabling static linking of JPEG library"
+ if test "$CYGWIN32" = yes; then
+ LIBSTATIC="$LIBS -static -ljpeg"
+ else
+ if test -f "/usr/lib/libjpeg.a" ; then
+ LIBS="/usr/lib/libjpeg.a $LIBS"
+ else
+ if test -f "/usr/local/lib/libjpeg.a" ; then
+ echo -e "assuming libjpeg.a in /usr/local/lib"
+ LIBS="/usr/local/lib/libjpeg.a $LIBS"
+ else
+ echo -e "assuming libjpeg.a in default linker path"
+ LIBS="libjpeg.a $LIBS"
+ fi
+ fi
+ fi
+else
+ echo -e "enabling dynamic linking of JPEG library"
+ LIBS="-ljpeg $LIBS"
+fi
+
+if test "${with_symbols}" = yes; then
+ echo -e "enabling production of debug symbols"
+ CXXFLAGS="-g $CXXFLAGS"
+ CFLAGS="-g $CFLAGS"
+else
+ echo -e "disabling production of debug symbols"
+fi
+
+if test "${with_info}" = yes; then
+ echo -e "enabling info output in the log file"
+ CXXFLAGS="$CXXFLAGS -DINFO"
+ CFLAGS="$CFLAGS -DINFO"
+else
+ echo -e "disabling info output in the log file"
+fi
+
+if test "${with_valgrind}" = yes; then
+ echo -e "enabling valgrind memory checker workarounds"
+ CXXFLAGS="$CXXFLAGS -DVALGRIND"
+ CFLAGS="$CFLAGS -DVALGRIND"
+else
+ echo -e "disabling valgrind memory checker workarounds"
+fi
+
+
+
+if test "${with_version}" = yes; then
+ VERSION=${ac_option}
+else
+ VERSION=`cat VERSION`
+fi
+echo -e "compiling version ${VERSION}"
+
+LIBVERSION=`echo ${VERSION} | cut -d '.' -f 1`
+
+CXXFLAGS="$CXXFLAGS -DVERSION=\\\"${VERSION}\\\""
+CFLAGS="$CFLAGS -DVERSION=\\\"${VERSION}\\\""
+
+
+
+
+if test -x "../nx-X11/config/makedepend/makedepend" ; then
+ MAKEDEPEND=../nx-X11/config/makedepend/makedepend
+else
+ if test -x "/usr/X11R6/bin/makedepend" ; then
+ MAKEDEPEND=/usr/X11R6/bin/makedepend
+ else
+ if test -x "/usr/openwin/bin/makedepend" ; then
+ MAKEDEPEND=/usr/openwin/bin/makedepend
+ else
+ MAKEDEPEND=/usr/bin/makedepend
+ fi
+ fi
+fi
+
+
+
+
+if test "$CYGWIN32" = yes; then
+ ALL="\$(LIBCYGARCHIVE) \$(LIBCYGSHARED) \$(LIBARCHIVE)"
+else
+ ALL="\$(LIBFULL) \$(LIBLOAD) \$(LIBSHARED) \$(LIBARCHIVE)"
+fi
+
+ ac_config_files="$ac_config_files Makefile"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overridden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+#
+# If the first sed substitution is executed (which looks for macros that
+# take arguments), then we branch to the quote section. Otherwise,
+# look for a macro that doesn't take arguments.
+cat >confdef2opt.sed <<\_ACEOF
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g
+t quote
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g
+t quote
+d
+: quote
+s,[ `~#$^&*(){}\\|;'"<>?],\\&,g
+s,\[,\\&,g
+s,\],\\&,g
+s,\$,$$,g
+p
+_ACEOF
+# We use echo to avoid assuming a particular line-breaking character.
+# The extra dot is to prevent the shell from consuming trailing
+# line-breaks from the sub-command output. A line-break within
+# single-quotes doesn't work because, if this script is created in a
+# platform that uses two characters for line-breaks (e.g., DOS), tr
+# would break.
+ac_LF_and_DOT=`echo; echo .`
+DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'`
+rm -f confdef2opt.sed
+
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated by $as_me.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+ac_cs_recheck=false
+ac_cs_silent=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+ # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
+ # is contrary to our usage. Disable this feature.
+ alias -g '${1+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ case $0 in
+ *[\\/]* ) as_myself=$0 ;;
+ *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
+done
+
+ ;;
+ esac
+ # We did not find ourselves, most probably we were run as `sh COMMAND'
+ # in which case we are not to be found in the path.
+ if test "x$as_myself" = x; then
+ as_myself=$0
+ fi
+ if test ! -f "$as_myself"; then
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by $as_me, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -q, --quiet do not print progress messages
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+
+Configuration files:
+$config_files
+
+Report bugs to <bug-autoconf@gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ ac_shift=:
+ ;;
+ -*)
+ ac_option=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+ac_configure_extra_args=
+
+if $ac_cs_silent; then
+ exec 6>/dev/null
+ ac_configure_extra_args="$ac_configure_extra_args --silent"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+fi
+
+# Have a temporary directory for convenience. Make it in the build tree
+# simply because there is no reason to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@DEFS@,$DEFS,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@LIBS@,$LIBS,;t t
+s,@CXX@,$CXX,;t t
+s,@CXXFLAGS@,$CXXFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CXX@,$ac_ct_CXX,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@CXXCPP@,$CXXCPP,;t t
+s,@X_CFLAGS@,$X_CFLAGS,;t t
+s,@X_PRE_LIBS@,$X_PRE_LIBS,;t t
+s,@X_LIBS@,$X_LIBS,;t t
+s,@X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t
+s,@LIBVERSION@,$LIBVERSION,;t t
+s,@VERSION@,$VERSION,;t t
+s,@MAKEDEPEND@,$MAKEDEPEND,;t t
+s,@ALL@,$ALL,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated by config.status. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@abs_srcdir@,$ac_abs_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s,@builddir@,$ac_builddir,;t t
+s,@abs_builddir@,$ac_abs_builddir,;t t
+s,@top_builddir@,$ac_top_builddir,;t t
+s,@abs_top_builddir@,$ac_abs_top_builddir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ ac_config_status_args=
+ test "$silent" = yes &&
+ ac_config_status_args="$ac_config_status_args --quiet"
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
diff --git a/nxcompext/configure.in b/nxcompext/configure.in
new file mode 100644
index 000000000..fe5abf7cb
--- /dev/null
+++ b/nxcompext/configure.in
@@ -0,0 +1,249 @@
+dnl Process this file with autoconf to produce a configure script.
+
+dnl Prolog
+
+AC_INIT(NXlib.h)
+AC_PREREQ(2.13)
+
+dnl Reset default compilation flags.
+
+CXXFLAGS="-O3"
+CFLAGS="-O3"
+
+dnl Reset default linking directives.
+
+LIBSTATIC=""
+LIBSHARED=""
+
+dnl Prefer headers and libraries from nx-X11, if present.
+
+if test -d "../nx-X11/include" ; then
+ CXXFLAGS="$CXXFLAGS -I../nx-X11/exports/include -I../nx-X11/lib/X11 \
+ -I../nx-X11/include -I../nx-X11/programs/Xserver/include"
+ CFLAGS="$CFLAGS -I../nx-X11/exports/include -I../nx-X11/lib/X11 \
+ -I../nx-X11/include -I../nx-X11/programs/Xserver/include"
+ LDFLAGS="$LDFLAGS -L../nx-X11/exports/lib"
+fi
+
+dnl Check for programs.
+
+AC_PROG_CXX
+AC_PROG_CC
+AC_LANG_CPLUSPLUS
+
+dnl Check for BSD compatible install.
+
+AC_PROG_INSTALL
+
+dnl Check for extra header files.
+
+AC_PATH_XTRA
+
+dnl Custom addition.
+ac_help="$ac_help
+ --with-symbols add the -g flag to produce the debug symbols
+ --with-info enable basic log output to trace the program
+ --with-valgrind clean up allocated buffers to avoid valgrind warnings
+ --with-version use this version for produced libraries
+
+ --with-static-png enable static linking of PNG library
+ --with-static-jpeg enable static linking of JPEG library"
+
+dnl Check to see if we're running under Cygwin32.
+
+AC_DEFUN(nxproxy_CYGWIN32,
+[AC_CACHE_CHECK(for Cygwin32 environment, nxproxy_cv_cygwin32,
+[AC_TRY_COMPILE(,[return __CYGWIN32__;],
+nxproxy_cv_cygwin32=yes, nxproxy_cv_cygwin32=no)
+rm -f conftest*])
+CYGWIN32=
+test "$nxproxy_cv_cygwin32" = yes && CYGWIN32=yes])
+
+dnl CygWin32 requires the stdc++ library explicitly linked.
+
+nxproxy_CYGWIN32
+if test "$CYGWIN32" = yes; then
+ LIBS="$LIBS -mwindows -lstdc++"
+fi
+
+dnl Check whether we're building on a AMD64.
+
+AC_DEFUN(nxconf_AMD64,
+[AC_CACHE_CHECK(for Amd64 environment, nxconf_cv_amd64,
+[AC_TRY_COMPILE(,[return (__amd64__ || __x86_64__);],
+nxconf_cv_amd64=yes, nxconf_cv_amd64=no)
+rm -f conftest*])
+AMD64=
+test "$nxconf_cv_amd64" = yes && AMD64=yes])
+nxconf_AMD64
+
+dnl Check to see if we're running under Solaris.
+
+AC_DEFUN(nxconf_SUN,
+[AC_CACHE_CHECK(for SunOS environment, nxconf_cv_sun,
+[AC_TRY_COMPILE(,[return __sun;],
+nxconf_cv_sun=yes, nxconf_cv_sun=no)
+rm -f conftest*])
+SUN=
+test "$nxconf_cv_sun" = yes && SUN=yes])
+nxconf_SUN
+
+if test "$SUN" = yes; then
+ CFLAGS="$CFLAGS -I/usr/sfw/include"
+fi
+
+if test "$SUN" = yes; then
+ LDFLAGS="$LDFLAGS -G -h \$(LIBLOAD) -L/usr/sfw/lib"
+else
+ LDFLAGS="$LDFLAGS -shared -Wl,-soname,\$(LIBLOAD)"
+fi
+
+dnl Check to see if we're running under FreeBSD.
+
+AC_DEFUN(nxconf_FreeBSD,
+[AC_CACHE_CHECK(for FreeBSD environment, nxconf_cv_freebsd,
+[AC_TRY_COMPILE(,[return __FreeBSD__;],
+nxconf_cv_freebsd=yes, nxconf_cv_freebsd=no)
+rm -f conftest*])
+FreeBSD=
+test "$nxconf_cv_freebsd" = yes && FreeBSD=yes])
+nxconf_FreeBSD
+
+dnl Build PIC libraries.
+
+if test "$CYGWIN32" != yes -a "$DARWIN" != yes; then
+ CXXFLAGS="$CXXFLAGS -fPIC"
+ CFLAGS="$CFLAGS -fPIC"
+fi
+
+dnl On FreeBSD search libraries and includes under /usr/local.
+
+if test "$FreeBSD" = yes; then
+ LIBS="$LIBS -L/usr/local/lib"
+ CXXFLAGS="$CXXFLAGS -I/usr/local/include"
+ CFLAGS="$CFLAGS -I/usr/local/include"
+fi
+
+dnl Check whether --with-static-png was
+dnl given and add -lpng or libpng.a to linking.
+
+if test "${with_static_png}" = yes; then
+ echo -e "enabling static linking of PNG library"
+ if test "$CYGWIN32" = yes; then
+ LIBS="$LIBSTATIC -static -lpng"
+ else
+ if test -f "/usr/lib/libpng.a" ; then
+ LIBS="/usr/lib/libpng.a $LIBS"
+ else
+ if test -f "/usr/local/lib/libpng.a" ; then
+ echo -e "assuming libpng.a in /usr/local/lib"
+ LIBS="/usr/local/lib/libpng.a $LIBS"
+ else
+ echo -e "assuming libpng.a in default linker path"
+ LIBS="libpng.a $LIBS"
+ fi
+ fi
+ fi
+else
+ echo -e "enabling dynamic linking of PNG library"
+ LIBS="-lpng $LIBS"
+fi
+
+dnl Check whether --with-static-jpeg was
+dnl given and add -ljpeg or libjpeg.a to linking.
+if test "${with_static_jpeg}" = yes; then
+ echo -e "enabling static linking of JPEG library"
+ if test "$CYGWIN32" = yes; then
+ LIBSTATIC="$LIBS -static -ljpeg"
+ else
+ if test -f "/usr/lib/libjpeg.a" ; then
+ LIBS="/usr/lib/libjpeg.a $LIBS"
+ else
+ if test -f "/usr/local/lib/libjpeg.a" ; then
+ echo -e "assuming libjpeg.a in /usr/local/lib"
+ LIBS="/usr/local/lib/libjpeg.a $LIBS"
+ else
+ echo -e "assuming libjpeg.a in default linker path"
+ LIBS="libjpeg.a $LIBS"
+ fi
+ fi
+ fi
+else
+ echo -e "enabling dynamic linking of JPEG library"
+ LIBS="-ljpeg $LIBS"
+fi
+
+dnl Check whether --with-symbols or --without-symbols was
+dnl given and set the required optimization level.
+if test "${with_symbols}" = yes; then
+ echo -e "enabling production of debug symbols"
+ CXXFLAGS="-g $CXXFLAGS"
+ CFLAGS="-g $CFLAGS"
+else
+ echo -e "disabling production of debug symbols"
+fi
+
+dnl Check whether --with-info or --without-info was given.
+if test "${with_info}" = yes; then
+ echo -e "enabling info output in the log file"
+ CXXFLAGS="$CXXFLAGS -DINFO"
+ CFLAGS="$CFLAGS -DINFO"
+else
+ echo -e "disabling info output in the log file"
+fi
+
+dnl Check whether --with-valgrind or --without-valgrind was given.
+if test "${with_valgrind}" = yes; then
+ echo -e "enabling valgrind memory checker workarounds"
+ CXXFLAGS="$CXXFLAGS -DVALGRIND"
+ CFLAGS="$CFLAGS -DVALGRIND"
+else
+ echo -e "disabling valgrind memory checker workarounds"
+fi
+
+dnl Check whether --with-version was given.
+AC_SUBST(LIBVERSION)
+AC_SUBST(VERSION)
+if test "${with_version}" = yes; then
+ VERSION=${ac_option}
+else
+ VERSION=`cat VERSION`
+fi
+echo -e "compiling version ${VERSION}"
+
+LIBVERSION=`echo ${VERSION} | cut -d '.' -f 1`
+
+CXXFLAGS="$CXXFLAGS -DVERSION=\\\"${VERSION}\\\""
+CFLAGS="$CFLAGS -DVERSION=\\\"${VERSION}\\\""
+
+dnl Find makedepend somewhere.
+
+AC_SUBST(MAKEDEPEND)
+
+if test -x "../nx-X11/config/makedepend/makedepend" ; then
+ MAKEDEPEND=../nx-X11/config/makedepend/makedepend
+else
+ if test -x "/usr/X11R6/bin/makedepend" ; then
+ MAKEDEPEND=/usr/X11R6/bin/makedepend
+ else
+ if test -x "/usr/openwin/bin/makedepend" ; then
+ MAKEDEPEND=/usr/openwin/bin/makedepend
+ else
+ MAKEDEPEND=/usr/bin/makedepend
+ fi
+ fi
+fi
+
+dnl Determine what to build based on the platform.
+dnl Override the LIBS settings on Cygwin32 so that
+dnl we always link with the exact set of libraries.
+
+AC_SUBST(ALL)
+
+if test "$CYGWIN32" = yes; then
+ ALL="\$(LIBCYGARCHIVE) \$(LIBCYGSHARED) \$(LIBARCHIVE)"
+else
+ ALL="\$(LIBFULL) \$(LIBLOAD) \$(LIBSHARED) \$(LIBARCHIVE)"
+fi
+
+AC_OUTPUT(Makefile)
diff --git a/nxcompext/install-sh b/nxcompext/install-sh
new file mode 100755
index 000000000..58719246f
--- /dev/null
+++ b/nxcompext/install-sh
@@ -0,0 +1,238 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.
+#
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/nxcompext/mkinstalldirs b/nxcompext/mkinstalldirs
new file mode 100755
index 000000000..936cf3407
--- /dev/null
+++ b/nxcompext/mkinstalldirs
@@ -0,0 +1,34 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Last modified: 1995-03-05
+# Public domain
+
+errstatus=0
+
+for file in ${1+"$@"} ; do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d in ${1+"$@"} ; do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp" 1>&2
+ mkdir "$pathcomp" > /dev/null 2>&1 || lasterr=$?
+ fi
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus