]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix build with zlib on MS-Windows.
authorEli Zaretskii <eliz@gnu.org>
Mon, 12 Aug 2013 13:15:01 +0000 (16:15 +0300)
committerEli Zaretskii <eliz@gnu.org>
Mon, 12 Aug 2013 13:15:01 +0000 (16:15 +0300)
 configure.ac (LIBZ): Comment on w32 peculiarities regarding LIBZ.

 src/decompress.c [WINDOWSNT]: Include windows.h and w32.h.
 (DEF_ZLIB_FN, LOAD_ZLIB_FN) [WINDOWSNT]: New macros.  Use them to
 define static variables that are pointers to zlib functions to be
 dynamically loaded.
 (init_zlib_functions) [WINDOWSNT]: New function.
 (fn_inflateInit2_, fn_inflate, fn_inflateEnd, fn_inflateInit2):
 New macros.
 (Fdecompress_gzipped_region, unwind_decompress): Use the fn_*
 macros instead of invoking the zlib functions directly.
 (syms_of_decompress): DEFSYM Qzlib_dll.  Staticpro
 Szlib_available_p.

 lisp/term/w32-win.el (dynamic-library-alist): Add DLLs for zlib.

ChangeLog
configure.ac
lisp/ChangeLog
lisp/term/w32-win.el
src/ChangeLog
src/decompress.c

index 1feddc0a8e278e15b58ea48dee6cacc01cebc842..641cbefce20632f50fd8e0cd518ed46b872b3323 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-08-12  Eli Zaretskii  <eliz@gnu.org>
+
+       * configure.ac (LIBZ): Comment on w32 peculiarities regarding LIBZ.
+
 2013-08-12  Paul Eggert  <eggert@cs.ucla.edu>
 
        Merge from gnulib, incorporating:
index 3a31198988705f7572153be5a4cb6dada30f3143..5daf84be2ba4cc69a3f0cf5464519e83eef15dce 100644 (file)
@@ -2948,6 +2948,9 @@ LIBZ=
 if test "${with_zlib}" != "no"; then
   if test "${HAVE_PNG}" = "yes"; then
     ### PNG depends on zlib, so if we have PNG, we have zlib.
+    ### Note: w32 does not link against libpng, but instead loads it
+    ### dynamically, but it also does the same with zlib.  So it is OK
+    ### not to have -lz in LIBZ on w32.
     HAVE_ZLIB=yes
   else
     ### No PNG, so check zlib ourselves.
index 1b7aceb5979517f3638031e2570b5f019ec8b173..8d83862268032e170aaf26289641553af63a1b22 100644 (file)
@@ -1,3 +1,7 @@
+2013-08-12  Eli Zaretskii  <eliz@gnu.org>
+
+       * term/w32-win.el (dynamic-library-alist): Add DLLs for zlib.
+
 2013-08-12  Glenn Morris  <rgm@gnu.org>
 
        * format.el (format-annotate-function):
index acadb0fad4328f061b3f1ec28515130062438c67..55181ab7d6d5b63d7c4125abe12aedf552c5b552 100644 (file)
@@ -229,7 +229,8 @@ See the documentation of `create-fontset-from-fontset-spec' for the format.")
        '(glib "libglib-2.0-0.dll")
        '(gobject "libgobject-2.0-0.dll")
        '(gnutls "libgnutls-28.dll" "libgnutls-26.dll")
-       '(libxml2 "libxml2-2.dll" "libxml2.dll")))
+       '(libxml2 "libxml2-2.dll" "libxml2.dll")
+       '(zlib "zlib1.dll" "libz-1.dll")))
 
 ;;; multi-tty support
 (defvar w32-initialized nil
index 679b82ba63cee0298c7908ed5558859a6d03f738..44af7c6b38599985bd63723d5d3bbc3e717272d3 100644 (file)
@@ -1,3 +1,17 @@
+2013-08-12  Eli Zaretskii  <eliz@gnu.org>
+
+       * decompress.c [WINDOWSNT]: Include windows.h and w32.h.
+       (DEF_ZLIB_FN, LOAD_ZLIB_FN) [WINDOWSNT]: New macros.  Use them to
+       define static variables that are pointers to zlib functions to be
+       dynamically loaded.
+       (init_zlib_functions) [WINDOWSNT]: New function.
+       (fn_inflateInit2_, fn_inflate, fn_inflateEnd, fn_inflateInit2):
+       New macros.
+       (Fdecompress_gzipped_region, unwind_decompress): Use the fn_*
+       macros instead of invoking the zlib functions directly.
+       (syms_of_decompress): DEFSYM Qzlib_dll.  Staticpro
+       Szlib_available_p.
+
 2013-08-12  Dmitry Antipov  <dmantipov@yandex.ru>
 
        Avoid looping over all frame windows to freeze and unfreeze.
index 866f4f5151691a5bc8621c295a6be4cf4e93c496..af8435b2fd08261294ea72daebbc31ba1ccb50c2 100644 (file)
@@ -26,6 +26,58 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #include "character.h"
 #include "buffer.h"
 
+static Lisp_Object Qzlib_dll;
+
+#ifdef WINDOWSNT
+#include <windows.h>
+#include "w32.h"
+
+/* Macro for defining functions that will be loaded from the zlib DLL.  */
+#define DEF_ZLIB_FN(rettype,func,args) static rettype (FAR CDECL *fn_##func)args
+
+/* Macro for loading zlib functions from the library.  */
+#define LOAD_ZLIB_FN(lib,func) {                                       \
+    fn_##func = (void *) GetProcAddress (lib, #func);                  \
+    if (!fn_##func) return 0;                                          \
+  }
+
+DEF_ZLIB_FN (int, inflateInit2_,
+            (z_streamp strm, int  windowBits, const char *version, int stream_size));
+
+DEF_ZLIB_FN (int, inflate,
+            (z_streamp strm, int flush));
+
+DEF_ZLIB_FN (int, inflateEnd,
+            (z_streamp strm));
+
+static bool
+init_zlib_functions (void)
+{
+  HMODULE library = w32_delayed_load (Qzlib_dll);
+
+  if (!library)
+    {
+      message1 ("zlib library not found");
+      return 0;
+    }
+
+  LOAD_ZLIB_FN (library, inflateInit2_);
+  LOAD_ZLIB_FN (library, inflate);
+  LOAD_ZLIB_FN (library, inflateEnd);
+  return 1;
+}
+
+#else /* !WINDOWSNT */
+
+#define fn_inflateInit2_       inflateInit2_
+#define fn_inflate             inflate
+#define fn_inflateEnd          inflateEnd
+
+#endif /* WINDOWSNT */
+
+#define fn_inflateInit2(strm, windowBits) \
+        fn_inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+
 \f
 struct decompress_unwind_data
 {
@@ -37,7 +89,7 @@ static void
 unwind_decompress (void *ddata)
 {
   struct decompress_unwind_data *data = ddata;
-  inflateEnd (data->stream);
+  fn_inflateEnd (data->stream);
 
   /* Delete any uncompressed data already inserted and restore point.  */
   if (data->start)
@@ -47,6 +99,26 @@ unwind_decompress (void *ddata)
     }
 }
 
+DEFUN ("zlib-available-p", Fzlib_available_p, Szlib_available_p, 0, 0, 0,
+       doc: /* Return t if zlib decompression is available in this instance of Emacs.  */)
+     (void)
+{
+#ifdef WINDOWSNT
+  Lisp_Object found = Fassq (Qzlib_dll, Vlibrary_cache);
+  if (CONSP (found))
+    return XCDR (found);
+  else
+    {
+      Lisp_Object status;
+      status = init_zlib_functions () ? Qt : Qnil;
+      Vlibrary_cache = Fcons (Fcons (Qzlib_dll, status), Vlibrary_cache);
+      return status;
+    }
+#else
+  return Qt;
+#endif
+}
+
 DEFUN ("decompress-gzipped-region", Fdecompress_gzipped_region,
        Sdecompress_gzipped_region,
        2, 2, 0,
@@ -80,7 +152,7 @@ This function can be called only in unibyte buffers.  */)
   stream.next_in = Z_NULL;
 
   /* This magic number apparently means "this is gzip".  */
-  if (inflateInit2 (&stream, 16 + MAX_WBITS) != Z_OK)
+  if (fn_inflateInit2 (&stream, 16 + MAX_WBITS) != Z_OK)
     return Qnil;
 
   unwind_data.start = iend;
@@ -111,7 +183,7 @@ This function can be called only in unibyte buffers.  */)
       stream.avail_in = avail_in;
       stream.next_out = GPT_ADDR;
       stream.avail_out = avail_out;
-      inflate_status = inflate (&stream, Z_NO_FLUSH);
+      inflate_status = fn_inflate (&stream, Z_NO_FLUSH);
       pos_byte += avail_in - stream.avail_in;
       decompressed = avail_out - stream.avail_out;
       insert_from_gap (decompressed, decompressed, 0);
@@ -137,7 +209,9 @@ This function can be called only in unibyte buffers.  */)
 void
 syms_of_decompress (void)
 {
+  DEFSYM (Qzlib_dll, "zlib");
   defsubr (&Sdecompress_gzipped_region);
+  defsubr (&Szlib_available_p);
 }
 
 #endif /* HAVE_ZLIB */