summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Lam <plam@MIT.EDU>2005-09-29 20:53:30 +0000
committerPatrick Lam <plam@MIT.EDU>2005-09-29 20:53:30 +0000
commite99f0f0a45b29ad195c96833c95771ccf7771fef (patch)
tree63b1ad14a1896930dc0edeb2b4cef4ab945fb8d6
parent649cc3616d11add9d5c39563f9f343614c2bb2eb (diff)
Use libxml2 if requested (with --enable-libxml2) or if expat is not
available. reviewed by: plam
-rw-r--r--ChangeLog11
-rw-r--r--configure.in162
-rw-r--r--src/Makefile.am3
-rw-r--r--src/fcxml.c71
4 files changed, 174 insertions, 73 deletions
diff --git a/ChangeLog b/ChangeLog
index 7450b58..318d26a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2005-09-29 Mathias Hasselmann <mathias.hasselmann@gmx.de>
+
+ reviewed by: plam
+
+ * configure.in:
+ * src/Makefile.am:
+ * src/fcxml.c:
+
+ Use libxml2 if requested (with --enable-libxml2) or if
+ expat is not available.
+
2005-09-29 Patrick Lam <plam@mit.edu>
* src/fccache.c (FcGlobalCacheSave, FcDirCacheWrite):
diff --git a/configure.in b/configure.in
index 4505b93..9e2fdde 100644
--- a/configure.in
+++ b/configure.in
@@ -197,102 +197,122 @@ AC_ARG_WITH(expat, [ --with-expat=DIR Use Expat in DIR
AC_ARG_WITH(expat-includes, [ --with-expat-includes=DIR Use Expat includes in DIR], expat_includes=$withval, expat_includes=yes)
AC_ARG_WITH(expat-lib, [ --with-expat-lib=DIR Use Expat library in DIR], expat_lib=$withval, expat_lib=yes)
-case "$expat" in
-no)
+if test "$enable_libxml2" != "yes"; then
+ case "$expat" in
+ no)
;;
-*)
- case "$expat_includes" in
- yes)
- case "$expat" in
+ *)
+ case "$expat_includes" in
yes)
+ case "$expat" in
+ yes)
+ ;;
+ *)
+ EXPAT_CFLAGS="-I$expat/include"
+ ;;
+ esac
+ ;;
+ no)
+ EXPAT_CFLAGS=""
;;
*)
- EXPAT_CFLAGS="-I$expat/include"
+ EXPAT_CFLAGS="-I$expat_includes"
;;
esac
- ;;
- no)
- EXPAT_CFLAGS=""
- ;;
- *)
- EXPAT_CFLAGS="-I$expat_includes"
- ;;
- esac
- case "$expat_lib" in
- yes)
- case "$expat" in
+ case "$expat_lib" in
yes)
- EXPAT_LIBS="-lexpat"
+ case "$expat" in
+ yes)
+ EXPAT_LIBS="-lexpat"
+ ;;
+ *)
+ EXPAT_LIBS="-L$expat/lib -lexpat"
+ ;;
+ esac
+ ;;
+ no)
;;
*)
- EXPAT_LIBS="-L$expat/lib -lexpat"
+ EXPAT_LIBS="-L$expat_lib -lexpat"
;;
esac
- ;;
- no)
- ;;
- *)
- EXPAT_LIBS="-L$expat_lib -lexpat"
- ;;
- esac
- expatsaved_CPPFLAGS="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $EXPAT_CFLAGS"
- expatsaved_LIBS="$LIBS"
- LIBS="$LIBS $EXPAT_LIBS"
+ expatsaved_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $EXPAT_CFLAGS"
+ expatsaved_LIBS="$LIBS"
+ LIBS="$LIBS $EXPAT_LIBS"
- AC_CHECK_HEADER(expat.h)
- case "$ac_cv_header_expat_h" in
- no)
- AC_CHECK_HEADER(xmlparse.h)
- case "$ac_cv_header_xmlparse_h" in
+ AC_CHECK_HEADER(expat.h)
+ case "$ac_cv_header_expat_h" in
no)
- have_expat_header=no;
+ AC_CHECK_HEADER(xmlparse.h)
+ case "$ac_cv_header_xmlparse_h" in
+ no)
+ have_expat_header=no;
+ ;;
+ yes)
+ HAVE_XMLPARSE_H=1
+ AC_SUBST(HAVE_XMLPARSE_H)
+ AC_DEFINE_UNQUOTED(HAVE_XMLPARSE_H,$HAVE_XMLPARSE_H,
+ [Use xmlparse.h instead of expat.h])
+ have_expat_header=yes
+ ;;
+ esac
;;
yes)
- HAVE_XMLPARSE_H=1
- AC_SUBST(HAVE_XMLPARSE_H)
- AC_DEFINE_UNQUOTED(HAVE_XMLPARSE_H,$HAVE_XMLPARSE_H,
- [Use xmlparse.h instead of expat.h])
have_expat_header=yes
;;
esac
- ;;
- yes)
- have_expat_header=yes
- ;;
- esac
- case "$have_expat_header" in
- no)
- expat=no
- ;;
- yes)
- AC_CHECK_FUNCS(XML_SetDoctypeDeclHandler)
- case "$ac_cv_func_XML_SetDoctypeDeclHandler" in
- yes)
- HAVE_EXPAT=1
- AC_SUBST(HAVE_EXPAT)
- AC_DEFINE_UNQUOTED(HAVE_EXPAT,$HAVE_EXPAT,
- [Found a useable expat library])
- ;;
- *)
+ case "$have_expat_header" in
+ no)
expat=no
;;
+ yes)
+ AC_CHECK_FUNCS(XML_SetDoctypeDeclHandler)
+ case "$ac_cv_func_XML_SetDoctypeDeclHandler" in
+ yes)
+ HAVE_EXPAT=1
+ AC_SUBST(HAVE_EXPAT)
+ AC_DEFINE_UNQUOTED(HAVE_EXPAT,$HAVE_EXPAT,
+ [Found a useable expat library])
+ ;;
+ *)
+ expat=no
+ ;;
+ esac
+ ;;
esac
+ CPPFLAGS="$expatsaved_CPPFLAGS"
+ LIBS="$expatsaved_LIBS"
;;
esac
- CPPFLAGS="$expatsaved_CPPFLAGS"
- LIBS="$expatsaved_LIBS"
- ;;
-esac
-AC_SUBST(EXPAT_LIBS)
-AC_SUBST(EXPAT_CFLAGS)
-case "$expat" in
-no)
- AC_MSG_ERROR([Cannot find usable expat library. This could mean that your version is too old.])
- ;;
-esac
+ AC_SUBST(EXPAT_CFLAGS)
+ AC_SUBST(EXPAT_LIBS)
+
+ case "$expat" in
+ no)
+ EXPAT_CFLAGS=""
+ EXPAT_LIBS=""
+
+ AC_MSG_WARN([Cannot find usable expat library. Trying to use libxml2 as fallback.])
+ ;;
+ esac
+fi
+
+#
+# Check libxml2 configuration
+#
+
+AC_ARG_ENABLE(libxml2, [ --enable-libxml2 Use libxml2 instead of Expat])
+
+if test "$enable_libxml2" = "yes" -o "$expat" = "no"; then
+ PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6])
+ AC_DEFINE_UNQUOTED(ENABLE_LIBXML2,1,[Use libxml2 instead of Expat])
+
+ AC_SUBST(LIBXML2_CFLAGS)
+ AC_SUBST(LIBXML2_LIBS)
+fi
#
# Set default font directory
diff --git a/src/Makefile.am b/src/Makefile.am
index 1891c3c..db2d8ef 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -66,6 +66,7 @@ endif
INCLUDES = \
$(FREETYPE_CFLAGS) \
+ $(LIBXML2_CFLAGS) \
$(EXPAT_CFLAGS) \
$(WARN_CFLAGS) \
-DFONTCONFIG_PATH='"$(CONFDIR)"' \
@@ -102,7 +103,7 @@ lib_LTLIBRARIES = libfontconfig.la
libfontconfig_la_LDFLAGS = \
-version-info @LT_VERSION_INFO@ $(no_undefined) $(export_symbols)
-libfontconfig_la_LIBADD = $(FREETYPE_LIBS) $(EXPAT_LIBS)
+libfontconfig_la_LIBADD = $(FREETYPE_LIBS) $(LIBXML2_LIBS) $(EXPAT_LIBS)
install-data-local: install-ms-import-lib install-libtool-import-lib
diff --git a/src/fcxml.c b/src/fcxml.c
index 950bc9a..b497bd7 100644
--- a/src/fcxml.c
+++ b/src/fcxml.c
@@ -26,6 +26,19 @@
#include "fcint.h"
#include <dirent.h>
+#if ENABLE_LIBXML2
+
+#include <libxml/parser.h>
+
+#define XML_Char xmlChar
+#define XML_Parser xmlParserCtxtPtr
+#define XML_ParserFree xmlFreeParserCtxt
+#define XML_GetCurrentLineNumber xmlSAX2GetLineNumber
+#define XML_GetErrorCode xmlCtxtGetLastError
+#define XML_ErrorString(Error) (Error)->message
+
+#else /* ENABLE_LIBXML2 */
+
#ifndef HAVE_XMLPARSE_H
#define HAVE_XMLPARSE_H 0
#endif
@@ -36,6 +49,8 @@
#include <expat.h>
#endif
+#endif /* ENABLE_LIBXML2 */
+
#ifdef _WIN32
#define STRICT
#include <windows.h>
@@ -2213,11 +2228,35 @@ FcStartDoctypeDecl (void *userData,
FcConfigMessage (parse, FcSevereError, "invalid doctype \"%s\"", doctypeName);
}
+#if ENABLE_LIBXML2
+
+static void
+FcInternalSubsetDecl (void *userData,
+ const XML_Char *doctypeName,
+ const XML_Char *sysid,
+ const XML_Char *pubid)
+{
+ FcStartDoctypeDecl (userData, doctypeName, sysid, pubid, 1);
+}
+
+static void
+FcExternalSubsetDecl (void *userData,
+ const XML_Char *doctypeName,
+ const XML_Char *sysid,
+ const XML_Char *pubid)
+{
+ FcStartDoctypeDecl (userData, doctypeName, sysid, pubid, 0);
+}
+
+#else /* ENABLE_LIBXML2 */
+
static void
FcEndDoctypeDecl (void *userData)
{
}
+#endif /* ENABLE_LIBXML2 */
+
static FcBool
FcConfigParseAndLoadDir (FcConfig *config,
const FcChar8 *name,
@@ -2311,10 +2350,16 @@ FcConfigParseAndLoad (FcConfig *config,
FcChar8 *filename;
FILE *f;
int len;
- void *buf;
FcConfigParse parse;
FcBool error = FcTrue;
+#if ENABLE_LIBXML2
+ xmlSAXHandler sax;
+ char buf[BUFSIZ];
+#else
+ void *buf;
+#endif
+
filename = FcConfigFilename (name);
if (!filename)
goto bail0;
@@ -2340,33 +2385,57 @@ FcConfigParseAndLoad (FcConfig *config,
if (!f)
goto bail0;
+#if ENABLE_LIBXML2
+ memset(&sax, 0, sizeof(sax));
+
+ sax.internalSubset = FcInternalSubsetDecl;
+ sax.externalSubset = FcExternalSubsetDecl;
+ sax.startElement = FcStartElement;
+ sax.endElement = FcEndElement;
+ sax.characters = FcCharacterData;
+
+ p = xmlCreatePushParserCtxt (&sax, &parse, NULL, 0, filename);
+#else
p = XML_ParserCreate ("UTF-8");
+#endif
+
if (!p)
goto bail1;
if (!FcConfigInit (&parse, name, config, p))
goto bail2;
+#if !ENABLE_LIBXML2
+
XML_SetUserData (p, &parse);
XML_SetDoctypeDeclHandler (p, FcStartDoctypeDecl, FcEndDoctypeDecl);
XML_SetElementHandler (p, FcStartElement, FcEndElement);
XML_SetCharacterDataHandler (p, FcCharacterData);
+#endif /* ENABLE_LIBXML2 */
+
do {
+#if !ENABLE_LIBXML2
buf = XML_GetBuffer (p, BUFSIZ);
if (!buf)
{
FcConfigMessage (&parse, FcSevereError, "cannot get parse buffer");
goto bail3;
}
+#endif
len = fread (buf, 1, BUFSIZ, f);
if (len < 0)
{
FcConfigMessage (&parse, FcSevereError, "failed reading config file");
goto bail3;
}
+
+#if ENABLE_LIBXML2
+ if (xmlParseChunk (p, buf, len, len == 0))
+#else
if (!XML_ParseBuffer (p, len, len == 0))
+#endif
{
FcConfigMessage (&parse, FcSevereError, "%s",
XML_ErrorString (XML_GetErrorCode (p)));