diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2014-12-26 09:32:06 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2014-12-28 00:33:27 -0800 |
commit | e092accb6bb8aea08dab1796d707b3adce55a38c (patch) | |
tree | f3f2bad267ce9f3f2ec61441a03447027ae3a3ea /src/xml.c | |
parent | 1505643bb70ce66e86d6c72902fe7e9199e93606 (diff) | |
download | emacs-e092accb6bb8aea08dab1796d707b3adce55a38c.tar.gz |
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.
Diffstat (limited to 'src/xml.c')
-rw-r--r-- | src/xml.c | 94 |
1 files changed, 49 insertions, 45 deletions
diff --git a/src/xml.c b/src/xml.c index d418202182b..6be3bc74e97 100644 --- a/src/xml.c +++ b/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 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, |