Use libxml2 if requested (with --enable-libxml2) or if expat is not

available.
reviewed by: plam
This commit is contained in:
Patrick Lam 2005-09-29 20:53:30 +00:00
parent 649cc3616d
commit e99f0f0a45
4 changed files with 183 additions and 82 deletions

View File

@ -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):

View File

@ -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
yes)
;;
*)
EXPAT_CFLAGS="-I$expat/include"
;;
esac
;;
no)
EXPAT_CFLAGS=""
;;
*)
EXPAT_CFLAGS="-I$expat_includes"
;;
esac
case "$expat_lib" in
yes)
case "$expat" in
case "$expat_includes" in
yes)
EXPAT_LIBS="-lexpat"
case "$expat" in
yes)
;;
*)
EXPAT_CFLAGS="-I$expat/include"
;;
esac
;;
*)
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"
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
no)
have_expat_header=no;
EXPAT_CFLAGS=""
;;
*)
EXPAT_CFLAGS="-I$expat_includes"
;;
esac
case "$expat_lib" in
yes)
case "$expat" in
yes)
EXPAT_LIBS="-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"
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
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

View File

@ -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

View File

@ -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)));