mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-06 03:40:56 -08:00
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.
This commit is contained in:
parent
1505643bb7
commit
e092accb6b
6 changed files with 929 additions and 879 deletions
|
|
@ -1,5 +1,19 @@
|
|||
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))
|
||||
# undef inflate
|
||||
# undef inflateEnd
|
||||
# undef inflateInit2_
|
||||
|
||||
#else /* !WINDOWSNT */
|
||||
|
||||
#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);
|
||||
|
|
|
|||
724
src/gnutls.c
724
src/gnutls.c
File diff suppressed because it is too large
Load diff
912
src/image.c
912
src/image.c
File diff suppressed because it is too large
Load diff
13
src/w32.h
13
src/w32.h
|
|
@ -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 */
|
||||
|
|
|
|||
94
src/xml.c
94
src/xml.c
|
|
@ -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 fn_htmlReadMemory htmlReadMemory
|
||||
#define fn_xmlReadMemory xmlReadMemory
|
||||
#define fn_xmlDocGetRootElement xmlDocGetRootElement
|
||||
#define fn_xmlFreeDoc xmlFreeDoc
|
||||
#define fn_xmlCleanupParser xmlCleanupParser
|
||||
#define fn_xmlCheckVersion xmlCheckVersion
|
||||
# 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;
|
||||
}
|
||||
|
||||
#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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue