bug-gettext
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]