From: Miguel Ángel Arruga Vivas Date: Sat, 2 Mar 2013 21:42:00 +0000 (+0100) Subject: Extract libexpat compatibility layer to libexpat-compat.{c,h} files. X-Git-Tag: v0.19~184 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=52b1068fb113af2e860a16d00dc2167d1a093c86;p=thirdparty%2Fgettext.git Extract libexpat compatibility layer to libexpat-compat.{c,h} files. Move expat loading code out from x-glade.c to a separate file, so it can be used by GSettings extractor. --- diff --git a/gettext-tools/src/ChangeLog b/gettext-tools/src/ChangeLog index 430e0faff..ff21d1be1 100644 --- a/gettext-tools/src/ChangeLog +++ b/gettext-tools/src/ChangeLog @@ -1,3 +1,9 @@ +2013-03-02 Miguel Angel Arruga Vivas + + Extract libexpat compatibility layer. + * libexpat-compat.h, libexpat-compat.c: Extracted from x-glade.c + * x-glade.c: Use libexpat-compat.h + 2013-07-11 Daiki Ueno Fix crash when parsing '..' with non-string argument. diff --git a/gettext-tools/src/Makefile.am b/gettext-tools/src/Makefile.am index 0e9dd9c9e..6a1228782 100644 --- a/gettext-tools/src/Makefile.am +++ b/gettext-tools/src/Makefile.am @@ -52,7 +52,7 @@ po-time.h plural-table.h lang-table.h format.h filters.h \ xgettext.h x-c.h x-po.h x-sh.h x-python.h x-lisp.h x-elisp.h x-librep.h \ x-scheme.h x-smalltalk.h x-java.h x-properties.h x-csharp.h x-awk.h x-ycp.h \ x-tcl.h x-perl.h x-php.h x-stringtable.h x-rst.h x-glade.h x-lua.h \ -x-javascript.h x-vala.h +x-javascript.h x-vala.h libexpat-compat.h EXTRA_DIST += FILES project-id ChangeLog.0 @@ -177,7 +177,7 @@ endif xgettext_SOURCES += \ x-c.c x-po.c x-sh.c x-python.c x-lisp.c x-elisp.c x-librep.c x-scheme.c \ x-smalltalk.c x-java.c x-csharp.c x-awk.c x-ycp.c x-tcl.c x-perl.c x-php.c \ - x-rst.c x-glade.c x-lua.c x-javascript.c x-vala.c + x-rst.c x-glade.c x-lua.c x-javascript.c x-vala.c libexpat-compat.c if !WOE32DLL msgattrib_SOURCES = msgattrib.c else diff --git a/gettext-tools/src/libexpat-compat.c b/gettext-tools/src/libexpat-compat.c new file mode 100644 index 000000000..b9bbbddda --- /dev/null +++ b/gettext-tools/src/libexpat-compat.c @@ -0,0 +1,314 @@ +/* xgettext libexpat compatibility. + Copyright (C) 2002-2003, 2005-2009, 2013 Free Software Foundation, Inc. + + This file was written by Bruno Haible , 2002. + + 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 3 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, see . */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#include "libexpat-compat.h" + +/* ======================= Different libexpat ABIs. ======================= */ + +/* There are three different ABIs of libexpat, regarding the functions + XML_GetCurrentLineNumber and XML_GetCurrentColumnNumber. + In expat < 2.0, they return an 'int'. + In expat >= 2.0, they return + - a 'long' if expat was compiled with the default flags, or + - a 'long long' if expat was compiled with -DXML_LARGE_SIZE. + But the include file does not contain the information whether + expat was compiled with -DXML_LARGE_SIZE; so the include file is lying! + For this information, we need to call XML_GetFeatureList(), for + expat >= 2.0.1; for expat = 2.0.0, we have to assume the default flags. */ + +#if !DYNLOAD_LIBEXPAT && XML_MAJOR_VERSION >= 2 + +/* expat >= 2.0 -> Return type is 'int64_t' worst-case. */ + +/* Return true if libexpat was compiled with -DXML_LARGE_SIZE. */ +static bool +is_XML_LARGE_SIZE_ABI (void) +{ + static bool tested; + static bool is_large; + + if (!tested) + { + const XML_Feature *features; + + is_large = false; + for (features = XML_GetFeatureList (); features->name != NULL; features++) + if (strcmp (features->name, "XML_LARGE_SIZE") == 0) + { + is_large = true; + break; + } + + tested = true; + } + return is_large; +} + +static void *p_XML_GetCurrentLineNumber = (void *) &XML_GetCurrentLineNumber; + +int64_t +rpl_XML_GetCurrentLineNumber (XML_Parser parser) +{ + if (is_XML_LARGE_SIZE_ABI ()) + return ((int64_t (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); + else + return ((long (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); +} + +static void *p_XML_GetCurrentColumnNumber = (void *) &XML_GetCurrentColumnNumber; + +int64_t +rpl_XML_GetCurrentColumnNumber (XML_Parser parser) +{ + if (is_XML_LARGE_SIZE_ABI ()) + return ((int64_t (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); + else + return ((long (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); +} +#endif + + +/* ===================== Dynamic loading of libexpat. ===================== */ + +#if DYNLOAD_LIBEXPAT + +static XML_Expat_Version (*p_XML_ExpatVersionInfo) (void); + +XML_Expat_Version +XML_ExpatVersionInfo (void) +{ + return (*p_XML_ExpatVersionInfo) (); +} + +static const XML_Feature * (*p_XML_GetFeatureList) (void); + +const XML_Feature * +XML_GetFeatureList (void) +{ + return (*p_XML_GetFeatureList) (); +} + +enum XML_Size_ABI +get_XML_Size_ABI (void) +{ + static bool tested; + static enum XML_Size_ABI abi; + + if (!tested) + { + if (XML_ExpatVersionInfo () .major >= 2) + /* expat >= 2.0 -> XML_Size is 'int64_t' or 'long'. */ + { + const XML_Feature *features; + + abi = is_long; + for (features = XML_GetFeatureList (); + features->name != NULL; + features++) + if (strcmp (features->name, "XML_LARGE_SIZE") == 0) + { + abi = is_int64_t; + break; + } + } + else + /* expat < 2.0 -> XML_Size is 'int'. */ + abi = is_int; + tested = true; + } + return abi; +} + +static XML_Parser (*p_XML_ParserCreate) (const XML_Char *encoding); + +XML_Parser +XML_ParserCreate (const XML_Char *encoding) +{ + return (*p_XML_ParserCreate) (encoding); +} + +static void (*p_XML_SetElementHandler) (XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end); + +void +XML_SetElementHandler (XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end) +{ + (*p_XML_SetElementHandler) (parser, start, end); +} + + +static void (*p_XML_SetCharacterDataHandler) (XML_Parser parser, + XML_CharacterDataHandler handler); + +void +XML_SetCharacterDataHandler (XML_Parser parser, + XML_CharacterDataHandler handler) +{ + (*p_XML_SetCharacterDataHandler) (parser, handler); +} + + +static void (*p_XML_SetCommentHandler) (XML_Parser parser, + XML_CommentHandler handler); + +void +XML_SetCommentHandler (XML_Parser parser, XML_CommentHandler handler) +{ + (*p_XML_SetCommentHandler) (parser, handler); +} + + +static int (*p_XML_Parse) (XML_Parser parser, const char *s, + int len, int isFinal); + +int +XML_Parse (XML_Parser parser, const char *s, int len, int isFinal) +{ + return (*p_XML_Parse) (parser, s, len, isFinal); +} + + +static enum XML_Error (*p_XML_GetErrorCode) (XML_Parser parser); + +enum XML_Error +XML_GetErrorCode (XML_Parser parser) +{ + return (*p_XML_GetErrorCode) (parser); +} + + +static void *p_XML_GetCurrentLineNumber; + +int64_t +XML_GetCurrentLineNumber (XML_Parser parser) +{ + switch (get_XML_Size_ABI ()) + { + case is_int: + return ((int (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); + case is_long: + return ((long (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); + case is_int64_t: + return ((int64_t (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); + default: + abort (); + } +} + +static void *p_XML_GetCurrentColumnNumber; + +int64_t +XML_GetCurrentColumnNumber (XML_Parser parser) +{ + switch (get_XML_Size_ABI ()) + { + case is_int: + return ((int (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); + case is_long: + return ((long (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); + case is_int64_t: + return ((int64_t (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); + default: + abort (); + } +} + + +static const XML_LChar * (*p_XML_ErrorString) (int code); + +const XML_LChar * +XML_ErrorString (int code) +{ + return (*p_XML_ErrorString) (code); +} + +static void (*p_XML_ParserFree) (XML_Parser parser); + +void +XML_ParserFree (XML_Parser parser) +{ + return (*p_XML_ParserFree) (parser); +} + +static int libexpat_loaded = 0; + +bool +load_libexpat () +{ + if (libexpat_loaded == 0) + { + void *handle; + + /* Try to load libexpat-2.x. */ + handle = dlopen ("libexpat.so.1", RTLD_LAZY); + if (handle == NULL) + /* Try to load libexpat-1.x. */ + handle = dlopen ("libexpat.so.0", RTLD_LAZY); + if (handle != NULL + && (p_XML_ExpatVersionInfo = + (XML_Expat_Version (*) (void)) + dlsym (handle, "XML_ExpatVersionInfo")) != NULL + && (p_XML_GetFeatureList = + (const XML_Feature * (*) (void)) + dlsym (handle, "XML_GetFeatureList")) != NULL + && (p_XML_ParserCreate = + (XML_Parser (*) (const XML_Char *)) + dlsym (handle, "XML_ParserCreate")) != NULL + && (p_XML_SetElementHandler = + (void (*) (XML_Parser, XML_StartElementHandler, XML_EndElementHandler)) + dlsym (handle, "XML_SetElementHandler")) != NULL + && (p_XML_SetCharacterDataHandler = + (void (*) (XML_Parser, XML_CharacterDataHandler)) + dlsym (handle, "XML_SetCharacterDataHandler")) != NULL + && (p_XML_SetCommentHandler = + (void (*) (XML_Parser, XML_CommentHandler)) + dlsym (handle, "XML_SetCommentHandler")) != NULL + && (p_XML_Parse = + (int (*) (XML_Parser, const char *, int, int)) + dlsym (handle, "XML_Parse")) != NULL + && (p_XML_GetErrorCode = + (enum XML_Error (*) (XML_Parser)) + dlsym (handle, "XML_GetErrorCode")) != NULL + && (p_XML_GetCurrentLineNumber = + dlsym (handle, "XML_GetCurrentLineNumber")) != NULL + && (p_XML_GetCurrentColumnNumber = + dlsym (handle, "XML_GetCurrentColumnNumber")) != NULL + && (p_XML_ParserFree = + (void (*) (XML_Parser)) + dlsym (handle, "XML_ParserFree")) != NULL + && (p_XML_ErrorString = + (const XML_LChar * (*) (int)) + dlsym (handle, "XML_ErrorString")) != NULL) + libexpat_loaded = 1; + else + libexpat_loaded = -1; + } + return libexpat_loaded >= 0; +} + +#endif diff --git a/gettext-tools/src/libexpat-compat.h b/gettext-tools/src/libexpat-compat.h new file mode 100644 index 000000000..2ff6465e1 --- /dev/null +++ b/gettext-tools/src/libexpat-compat.h @@ -0,0 +1,94 @@ +/* xgettext libexpat compatibility. + Copyright (C) 2002-2003, 2005-2009, 2013 Free Software Foundation, Inc. + + This file was written by Bruno Haible , 2002. + + 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 3 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, see . */ + +#include +#include +#if DYNLOAD_LIBEXPAT +# include +#else +# if HAVE_LIBEXPAT +# include +# endif +#endif + +#if !DYNLOAD_LIBEXPAT && XML_MAJOR_VERSION >= 2 +int64_t rpl_XML_GetCurrentLineNumber (XML_Parser parser); +# undef XML_GetCurrentLineNumber +# define XML_GetCurrentLineNumber rpl_XML_GetCurrentLineNumber + +int64_t rpl_XML_GetCurrentColumnNumber (XML_Parser parser); +# undef XML_GetCurrentColumnNumber +# define XML_GetCurrentColumnNumber rpl_XML_GetCurrentColumnNumber +#endif + +/* ===================== Dynamic loading of libexpat. ===================== */ + +#if DYNLOAD_LIBEXPAT +typedef struct + { + int major; + int minor; + int micro; + } + XML_Expat_Version; +enum XML_FeatureEnum { XML_FEATURE_END = 0 }; +typedef struct + { + enum XML_FeatureEnum feature; + const char *name; + long int value; + } + XML_Feature; +typedef void *XML_Parser; +typedef char XML_Char; +typedef char XML_LChar; +enum XML_Error { XML_ERROR_NONE }; +typedef void (*XML_StartElementHandler) (void *userData, const XML_Char *name, const XML_Char **atts); +typedef void (*XML_EndElementHandler) (void *userData, const XML_Char *name); +typedef void (*XML_CharacterDataHandler) (void *userData, const XML_Char *s, int len); +typedef void (*XML_CommentHandler) (void *userData, const XML_Char *data); + +XML_Expat_Version XML_ExpatVersionInfo (void); +const XML_Feature * XML_GetFeatureList (void); + +enum XML_Size_ABI { is_int, is_long, is_int64_t }; +enum XML_Size_ABI get_XML_Size_ABI (void); + +XML_Parser XML_ParserCreate (const XML_Char *encoding); +void XML_SetElementHandler (XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end); +void XML_SetCharacterDataHandler (XML_Parser parser, + XML_CharacterDataHandler handler); +void XML_SetCommentHandler (XML_Parser parser, XML_CommentHandler handler); +int XML_Parse (XML_Parser parser, const char *s, int len, int isFinal); +enum XML_Error XML_GetErrorCode (XML_Parser parser); +int64_t XML_GetCurrentLineNumber (XML_Parser parser); +int64_t XML_GetCurrentColumnNumber (XML_Parser parser); +const XML_LChar * XML_ErrorString (int code); +void XML_ParserFree (XML_Parser parser); + +bool load_libexpat (); + +#define LIBEXPAT_AVAILABLE() (load_libexpat ()) + +#elif HAVE_LIBEXPAT + +#define LIBEXPAT_AVAILABLE() true + +#endif diff --git a/gettext-tools/src/x-glade.c b/gettext-tools/src/x-glade.c index 3d1ec4286..d95cd8e48 100644 --- a/gettext-tools/src/x-glade.c +++ b/gettext-tools/src/x-glade.c @@ -29,13 +29,6 @@ #include #include #include -#if DYNLOAD_LIBEXPAT -# include -#else -# if HAVE_LIBEXPAT -# include -# endif -#endif #include "message.h" #include "xgettext.h" @@ -48,6 +41,7 @@ #include "hash.h" #include "po-charset.h" #include "gettext.h" +#include "libexpat-compat.h" #define _(s) gettext(s) @@ -120,266 +114,6 @@ init_keywords () } -/* ======================= Different libexpat ABIs. ======================= */ - -/* There are three different ABIs of libexpat, regarding the functions - XML_GetCurrentLineNumber and XML_GetCurrentColumnNumber. - In expat < 2.0, they return an 'int'. - In expat >= 2.0, they return - - a 'long' if expat was compiled with the default flags, or - - a 'long long' if expat was compiled with -DXML_LARGE_SIZE. - But the include file does not contain the information whether - expat was compiled with -DXML_LARGE_SIZE; so the include file is lying! - For this information, we need to call XML_GetFeatureList(), for - expat >= 2.0.1; for expat = 2.0.0, we have to assume the default flags. */ - -#if !DYNLOAD_LIBEXPAT - -# if XML_MAJOR_VERSION >= 2 - -/* expat >= 2.0 -> Return type is 'int64_t' worst-case. */ - -/* Put the function pointers into variables, because some GCC 4 versions - generate an abort when we convert symbol address to different function - pointer types. */ -static void *p_XML_GetCurrentLineNumber = (void *) &XML_GetCurrentLineNumber; -static void *p_XML_GetCurrentColumnNumber = (void *) &XML_GetCurrentColumnNumber; - -/* Return true if libexpat was compiled with -DXML_LARGE_SIZE. */ -static bool -is_XML_LARGE_SIZE_ABI (void) -{ - static bool tested; - static bool is_large; - - if (!tested) - { - const XML_Feature *features; - - is_large = false; - for (features = XML_GetFeatureList (); features->name != NULL; features++) - if (strcmp (features->name, "XML_LARGE_SIZE") == 0) - { - is_large = true; - break; - } - - tested = true; - } - return is_large; -} - -static int64_t -GetCurrentLineNumber (XML_Parser parser) -{ - if (is_XML_LARGE_SIZE_ABI ()) - return ((int64_t (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); - else - return ((long (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); -} -# define XML_GetCurrentLineNumber GetCurrentLineNumber - -static int64_t -GetCurrentColumnNumber (XML_Parser parser) -{ - if (is_XML_LARGE_SIZE_ABI ()) - return ((int64_t (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); - else - return ((long (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); -} -# define XML_GetCurrentColumnNumber GetCurrentColumnNumber - -# else - -/* expat < 2.0 -> Return type is 'int'. */ - -# endif - -#endif - - -/* ===================== Dynamic loading of libexpat. ===================== */ - -#if DYNLOAD_LIBEXPAT - -typedef struct - { - int major; - int minor; - int micro; - } - XML_Expat_Version; -enum XML_FeatureEnum { XML_FEATURE_END = 0 }; -typedef struct - { - enum XML_FeatureEnum feature; - const char *name; - long int value; - } - XML_Feature; -typedef void *XML_Parser; -typedef char XML_Char; -typedef char XML_LChar; -enum XML_Error { XML_ERROR_NONE }; -typedef void (*XML_StartElementHandler) (void *userData, const XML_Char *name, const XML_Char **atts); -typedef void (*XML_EndElementHandler) (void *userData, const XML_Char *name); -typedef void (*XML_CharacterDataHandler) (void *userData, const XML_Char *s, int len); -typedef void (*XML_CommentHandler) (void *userData, const XML_Char *data); - -static XML_Expat_Version (*p_XML_ExpatVersionInfo) (void); -static const XML_Feature * (*p_XML_GetFeatureList) (void); -static XML_Parser (*p_XML_ParserCreate) (const XML_Char *encoding); -static void (*p_XML_SetElementHandler) (XML_Parser parser, XML_StartElementHandler start, XML_EndElementHandler end); -static void (*p_XML_SetCharacterDataHandler) (XML_Parser parser, XML_CharacterDataHandler handler); -static void (*p_XML_SetCommentHandler) (XML_Parser parser, XML_CommentHandler handler); -static int (*p_XML_Parse) (XML_Parser parser, const char *s, int len, int isFinal); -static enum XML_Error (*p_XML_GetErrorCode) (XML_Parser parser); -static void *p_XML_GetCurrentLineNumber; -static void *p_XML_GetCurrentColumnNumber; -static void (*p_XML_ParserFree) (XML_Parser parser); -static const XML_LChar * (*p_XML_ErrorString) (int code); - -#define XML_ExpatVersionInfo (*p_XML_ExpatVersionInfo) -#define XML_GetFeatureList (*p_XML_GetFeatureList) - -enum XML_Size_ABI { is_int, is_long, is_int64_t }; - -static enum XML_Size_ABI -get_XML_Size_ABI (void) -{ - static bool tested; - static enum XML_Size_ABI abi; - - if (!tested) - { - if (XML_ExpatVersionInfo () .major >= 2) - /* expat >= 2.0 -> XML_Size is 'int64_t' or 'long'. */ - { - const XML_Feature *features; - - abi = is_long; - for (features = XML_GetFeatureList (); - features->name != NULL; - features++) - if (strcmp (features->name, "XML_LARGE_SIZE") == 0) - { - abi = is_int64_t; - break; - } - } - else - /* expat < 2.0 -> XML_Size is 'int'. */ - abi = is_int; - tested = true; - } - return abi; -} - -#define XML_ParserCreate (*p_XML_ParserCreate) -#define XML_SetElementHandler (*p_XML_SetElementHandler) -#define XML_SetCharacterDataHandler (*p_XML_SetCharacterDataHandler) -#define XML_SetCommentHandler (*p_XML_SetCommentHandler) -#define XML_Parse (*p_XML_Parse) -#define XML_GetErrorCode (*p_XML_GetErrorCode) - -static int64_t -XML_GetCurrentLineNumber (XML_Parser parser) -{ - switch (get_XML_Size_ABI ()) - { - case is_int: - return ((int (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); - case is_long: - return ((long (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); - case is_int64_t: - return ((int64_t (*) (XML_Parser)) p_XML_GetCurrentLineNumber) (parser); - default: - abort (); - } -} - -static int64_t -XML_GetCurrentColumnNumber (XML_Parser parser) -{ - switch (get_XML_Size_ABI ()) - { - case is_int: - return ((int (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); - case is_long: - return ((long (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); - case is_int64_t: - return ((int64_t (*) (XML_Parser)) p_XML_GetCurrentColumnNumber) (parser); - default: - abort (); - } -} - -#define XML_ParserFree (*p_XML_ParserFree) -#define XML_ErrorString (*p_XML_ErrorString) - -static int libexpat_loaded = 0; - -static bool -load_libexpat () -{ - if (libexpat_loaded == 0) - { - void *handle; - - /* Try to load libexpat-2.x. */ - handle = dlopen ("libexpat.so.1", RTLD_LAZY); - if (handle == NULL) - /* Try to load libexpat-1.x. */ - handle = dlopen ("libexpat.so.0", RTLD_LAZY); - if (handle != NULL - && (p_XML_ExpatVersionInfo = - (XML_Expat_Version (*) (void)) - dlsym (handle, "XML_ExpatVersionInfo")) != NULL - && (p_XML_GetFeatureList = - (const XML_Feature * (*) (void)) - dlsym (handle, "XML_GetFeatureList")) != NULL - && (p_XML_ParserCreate = - (XML_Parser (*) (const XML_Char *)) - dlsym (handle, "XML_ParserCreate")) != NULL - && (p_XML_SetElementHandler = - (void (*) (XML_Parser, XML_StartElementHandler, XML_EndElementHandler)) - dlsym (handle, "XML_SetElementHandler")) != NULL - && (p_XML_SetCharacterDataHandler = - (void (*) (XML_Parser, XML_CharacterDataHandler)) - dlsym (handle, "XML_SetCharacterDataHandler")) != NULL - && (p_XML_SetCommentHandler = - (void (*) (XML_Parser, XML_CommentHandler)) - dlsym (handle, "XML_SetCommentHandler")) != NULL - && (p_XML_Parse = - (int (*) (XML_Parser, const char *, int, int)) - dlsym (handle, "XML_Parse")) != NULL - && (p_XML_GetErrorCode = - (enum XML_Error (*) (XML_Parser)) - dlsym (handle, "XML_GetErrorCode")) != NULL - && (p_XML_GetCurrentLineNumber = - dlsym (handle, "XML_GetCurrentLineNumber")) != NULL - && (p_XML_GetCurrentColumnNumber = - dlsym (handle, "XML_GetCurrentColumnNumber")) != NULL - && (p_XML_ParserFree = - (void (*) (XML_Parser)) - dlsym (handle, "XML_ParserFree")) != NULL - && (p_XML_ErrorString = - (const XML_LChar * (*) (int)) - dlsym (handle, "XML_ErrorString")) != NULL) - libexpat_loaded = 1; - else - libexpat_loaded = -1; - } - return libexpat_loaded >= 0; -} - -#define LIBEXPAT_AVAILABLE() (load_libexpat ()) - -#elif HAVE_LIBEXPAT - -#define LIBEXPAT_AVAILABLE() true - -#endif /* ============================= XML parsing. ============================= */