Commit e092accb authored by Paul Eggert's avatar Paul Eggert
Browse files

Wrap dll functions more simply

* decompress.c, gnutls.c, image.c, xml.c:
If WINDOWSNT, use '#define FOO fn_FOO' to wrap dll functions,
rather than the inverse when not WINDOWSNT.  This isolates the
fn_* business into the WINDOWSNT-specific section of the code,
which makes it easier to maintain the generic code.
* decompress.c (DEF_ZLIB_FN, LOAD_ZLIB_FN):
* gnutls.c (DEF_GNUTLS_FN, LOAD_GNUTLS_FN):
* image.c (DEF_IMGLIB_FN, LOAD_IMGLIB_FN):
* xml.c (DEF_XML2_FN, LOAD_XML2_FN):
Remove.  All uses replaced by DEF_DLL_FN.
* w32.h (DEF_DLL_FN, LOAD_DLL_FN): New macros.
parent 1505643b
2014-12-28 Paul Eggert <eggert@Penguin.CS.UCLA.EDU>
 
Wrap dll functions more simply
* decompress.c, gnutls.c, image.c, xml.c:
If WINDOWSNT, use '#define FOO fn_FOO' to wrap dll functions,
rather than the inverse when not WINDOWSNT. This isolates the
fn_* business into the WINDOWSNT-specific section of the code,
which makes it easier to maintain the generic code.
* decompress.c (DEF_ZLIB_FN, LOAD_ZLIB_FN):
* gnutls.c (DEF_GNUTLS_FN, LOAD_GNUTLS_FN):
* image.c (DEF_IMGLIB_FN, LOAD_IMGLIB_FN):
* xml.c (DEF_XML2_FN, LOAD_XML2_FN):
Remove. All uses replaced by DEF_DLL_FN.
* decompress.c (inflateInit2): Remove; no longer needed.
* w32.h (DEF_DLL_FN, LOAD_DLL_FN): New macros.
Port memory-full checking to GnuTLS 3.3
Instead of using gnutls_global_set_mem_functions, check every call
to a GnuTLS function that might return an indication of memory
......
......@@ -31,26 +31,14 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
static Lisp_Object Qzlib_dll;
#ifdef WINDOWSNT
#include <windows.h>
#include "w32.h"
# 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 false; \
}
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));
DEF_DLL_FN (int, inflateInit2_,
(z_streamp strm, int windowBits, const char *version,
int stream_size));
DEF_DLL_FN (int, inflate, (z_streamp strm, int flush));
DEF_DLL_FN (int, inflateEnd, (z_streamp strm));
static bool zlib_initialized;
......@@ -62,20 +50,19 @@ init_zlib_functions (void)
if (!library)
return false;
LOAD_ZLIB_FN (library, inflateInit2_);
LOAD_ZLIB_FN (library, inflate);
LOAD_ZLIB_FN (library, inflateEnd);
LOAD_DLL_FN (library, inflateInit2_);
LOAD_DLL_FN (library, inflate);
LOAD_DLL_FN (library, inflateEnd);
return true;
}
#define fn_inflateInit2(strm, windowBits) \
fn_inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
#else /* !WINDOWSNT */
# undef inflate
# undef inflateEnd
# undef inflateInit2_
#define fn_inflateInit2 inflateInit2
#define fn_inflate inflate
#define fn_inflateEnd inflateEnd
# define inflate fn_inflate
# define inflateEnd fn_inflateEnd
# define inflateInit2_ fn_inflateInit2_
#endif /* WINDOWSNT */
......@@ -90,7 +77,7 @@ static void
unwind_decompress (void *ddata)
{
struct decompress_unwind_data *data = ddata;
fn_inflateEnd (data->stream);
inflateEnd (data->stream);
/* Delete any uncompressed data already inserted on error. */
if (data->start)
......@@ -167,7 +154,7 @@ This function can be called only in unibyte buffers. */)
/* The magic number 32 apparently means "autodetect both the gzip and
zlib formats" according to zlib.h. */
if (fn_inflateInit2 (&stream, MAX_WBITS + 32) != Z_OK)
if (inflateInit2 (&stream, MAX_WBITS + 32) != Z_OK)
return Qnil;
unwind_data.start = iend;
......@@ -197,7 +184,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 = fn_inflate (&stream, Z_NO_FLUSH);
inflate_status = inflate (&stream, Z_NO_FLUSH);
pos_byte += avail_in - stream.avail_in;
decompressed = avail_out - stream.avail_out;
insert_from_gap (decompressed, decompressed, 0);
......
This diff is collapsed.
This diff is collapsed.
......@@ -225,4 +225,17 @@ extern ssize_t emacs_gnutls_push (gnutls_transport_ptr_t p,
const void* buf, size_t sz);
#endif /* HAVE_GNUTLS */
/* Definine a function that will be loaded from a DLL. */
#define DEF_DLL_FN(type, func, args) static type (FAR CDECL *fn_##func) args
/* Load a function from the DLL. */
#define LOAD_DLL_FN(lib, func) \
do \
{ \
fn_##func = (void *) GetProcAddress (lib, #func); \
if (!fn_##func) \
return false; \
} \
while (false)
#endif /* EMACS_W32_H */
......@@ -33,26 +33,17 @@ static Lisp_Object Qlibxml2_dll;
#ifdef WINDOWSNT
#include <windows.h>
#include "w32.h"
# include <windows.h>
# include "w32.h"
/* Macro for defining functions that will be loaded from the libxml2 DLL. */
#define DEF_XML2_FN(rettype,func,args) static rettype (FAR CDECL *fn_##func)args
/* Macro for loading libxml2 functions from the library. */
#define LOAD_XML2_FN(lib,func) { \
fn_##func = (void *) GetProcAddress (lib, #func); \
if (!fn_##func) goto bad_library; \
}
DEF_XML2_FN (htmlDocPtr, htmlReadMemory,
DEF_DLL_FN (htmlDocPtr, htmlReadMemory,
(const char *, int, const char *, const char *, int));
DEF_XML2_FN (xmlDocPtr, xmlReadMemory,
DEF_DLL_FN (xmlDocPtr, xmlReadMemory,
(const char *, int, const char *, const char *, int));
DEF_XML2_FN (xmlNodePtr, xmlDocGetRootElement, (xmlDocPtr));
DEF_XML2_FN (void, xmlFreeDoc, (xmlDocPtr));
DEF_XML2_FN (void, xmlCleanupParser, (void));
DEF_XML2_FN (void, xmlCheckVersion, (int));
DEF_DLL_FN (xmlNodePtr, xmlDocGetRootElement, (xmlDocPtr));
DEF_DLL_FN (void, xmlFreeDoc, (xmlDocPtr));
DEF_DLL_FN (void, xmlCleanupParser, (void));
DEF_DLL_FN (void, xmlCheckVersion, (int));
static int
libxml2_loaded_p (void)
......@@ -64,14 +55,33 @@ libxml2_loaded_p (void)
return 0;
}
#else /* !WINDOWSNT */
# undef htmlReadMemory
# undef xmlCheckVersion
# undef xmlCleanupParser
# undef xmlDocGetRootElement
# undef xmlFreeDoc
# undef xmlReadMemory
# define htmlReadMemory fn_htmlReadMemory
# define xmlCheckVersion fn_xmlCheckVersion
# define xmlCleanupParser fn_xmlCleanupParser
# define xmlDocGetRootElement fn_xmlDocGetRootElement
# define xmlFreeDoc fn_xmlFreeDoc
# define xmlReadMemory fn_xmlReadMemory
static bool
load_dll_functions (HMODULE library)
{
LOAD_DLL_FN (library, htmlReadMemory);
LOAD_DLL_FN (library, xmlReadMemory);
LOAD_DLL_FN (library, xmlDocGetRootElement);
LOAD_DLL_FN (library, xmlFreeDoc);
LOAD_DLL_FN (library, xmlCleanupParser);
LOAD_DLL_FN (library, xmlCheckVersion);
return true;
}
#define fn_htmlReadMemory htmlReadMemory
#define fn_xmlReadMemory xmlReadMemory
#define fn_xmlDocGetRootElement xmlDocGetRootElement
#define fn_xmlFreeDoc xmlFreeDoc
#define fn_xmlCleanupParser xmlCleanupParser
#define fn_xmlCheckVersion xmlCheckVersion
#else /* !WINDOWSNT */
static int
libxml2_loaded_p (void)
......@@ -97,14 +107,8 @@ init_libxml2_functions (void)
return 0;
}
/* LOAD_XML2_FN jumps to bad_library if it fails to find the
named function. */
LOAD_XML2_FN (library, htmlReadMemory);
LOAD_XML2_FN (library, xmlReadMemory);
LOAD_XML2_FN (library, xmlDocGetRootElement);
LOAD_XML2_FN (library, xmlFreeDoc);
LOAD_XML2_FN (library, xmlCleanupParser);
LOAD_XML2_FN (library, xmlCheckVersion);
if (! load_dll_functions (library))
goto bad_library;
Vlibrary_cache = Fcons (Fcons (Qlibxml2_dll, Qt), Vlibrary_cache);
return 1;
......@@ -182,7 +186,7 @@ parse_region (Lisp_Object start, Lisp_Object end, Lisp_Object base_url, Lisp_Obj
const char *burl = "";
ptrdiff_t istart, iend, istart_byte, iend_byte;
fn_xmlCheckVersion (LIBXML_VERSION);
xmlCheckVersion (LIBXML_VERSION);
validate_region (&start, &end);
......@@ -201,16 +205,16 @@ parse_region (Lisp_Object start, Lisp_Object end, Lisp_Object base_url, Lisp_Obj
}
if (htmlp)
doc = fn_htmlReadMemory ((char *) BYTE_POS_ADDR (istart_byte),
iend_byte - istart_byte, burl, "utf-8",
HTML_PARSE_RECOVER|HTML_PARSE_NONET|
HTML_PARSE_NOWARNING|HTML_PARSE_NOERROR|
HTML_PARSE_NOBLANKS);
doc = htmlReadMemory ((char *) BYTE_POS_ADDR (istart_byte),
iend_byte - istart_byte, burl, "utf-8",
HTML_PARSE_RECOVER|HTML_PARSE_NONET|
HTML_PARSE_NOWARNING|HTML_PARSE_NOERROR|
HTML_PARSE_NOBLANKS);
else
doc = fn_xmlReadMemory ((char *) BYTE_POS_ADDR (istart_byte),
iend_byte - istart_byte, burl, "utf-8",
XML_PARSE_NONET|XML_PARSE_NOWARNING|
XML_PARSE_NOBLANKS |XML_PARSE_NOERROR);
doc = xmlReadMemory ((char *) BYTE_POS_ADDR (istart_byte),
iend_byte - istart_byte, burl, "utf-8",
XML_PARSE_NONET|XML_PARSE_NOWARNING|
XML_PARSE_NOBLANKS |XML_PARSE_NOERROR);
if (doc != NULL)
{
......@@ -232,14 +236,14 @@ parse_region (Lisp_Object start, Lisp_Object end, Lisp_Object base_url, Lisp_Obj
if (NILP (result)) {
/* The document doesn't have toplevel comments or we discarded
them. Get the tree the proper way. */
xmlNode *node = fn_xmlDocGetRootElement (doc);
xmlNode *node = xmlDocGetRootElement (doc);
if (node != NULL)
result = make_dom (node);
} else
result = Fcons (intern ("top"),
Fcons (Qnil, Fnreverse (Fcons (r, result))));
fn_xmlFreeDoc (doc);
xmlFreeDoc (doc);
}
return result;
......@@ -249,7 +253,7 @@ void
xml_cleanup_parser (void)
{
if (libxml2_loaded_p ())
fn_xmlCleanupParser ();
xmlCleanupParser ();
}
DEFUN ("libxml-parse-html-region", Flibxml_parse_html_region,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment