[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug-gettext] [PATCH 1/3] Extract libexpat compatibility layer to libexp
From: |
Daiki Ueno |
Subject: |
[bug-gettext] [PATCH 1/3] Extract libexpat compatibility layer to libexpat-compat.{c, h} files. |
Date: |
Mon, 5 Aug 2013 22:29:56 +0200 |
From: Miguel Ángel Arruga Vivas <address@hidden>
Move expat loading code out from x-glade.c to a separate file, so it
can be used by GSettings extractor.
---
gettext-tools/src/ChangeLog | 6 +
gettext-tools/src/Makefile.am | 4 +-
gettext-tools/src/libexpat-compat.c | 314 ++++++++++++++++++++++++++++++++++++
gettext-tools/src/libexpat-compat.h | 94 +++++++++++
gettext-tools/src/x-glade.c | 268 +-----------------------------
5 files changed, 417 insertions(+), 269 deletions(-)
create mode 100644 gettext-tools/src/libexpat-compat.c
create mode 100644 gettext-tools/src/libexpat-compat.h
diff --git a/gettext-tools/src/ChangeLog b/gettext-tools/src/ChangeLog
index 430e0fa..ff21d1b 100644
--- a/gettext-tools/src/ChangeLog
+++ b/gettext-tools/src/ChangeLog
@@ -1,3 +1,9 @@
+2013-03-02 Miguel Angel Arruga Vivas <address@hidden>
+
+ 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 <address@hidden>
Fix crash when parsing '..' with non-string argument.
diff --git a/gettext-tools/src/Makefile.am b/gettext-tools/src/Makefile.am
index 0e9dd9c..6a12287 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 0000000..b9bbbdd
--- /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 <address@hidden>, 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 <http://www.gnu.org/licenses/>. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#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 <expat.h> 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 0000000..2ff6465
--- /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 <address@hidden>, 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 <http://www.gnu.org/licenses/>. */
+
+#include <stdbool.h>
+#include <stdint.h>
+#if DYNLOAD_LIBEXPAT
+# include <dlfcn.h>
+#else
+# if HAVE_LIBEXPAT
+# include <expat.h>
+# 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 3d1ec42..d95cd8e 100644
--- a/gettext-tools/src/x-glade.c
+++ b/gettext-tools/src/x-glade.c
@@ -29,13 +29,6 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#if DYNLOAD_LIBEXPAT
-# include <dlfcn.h>
-#else
-# if HAVE_LIBEXPAT
-# include <expat.h>
-# 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 <expat.h> 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. ============================= */
--
1.8.3.1