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,6 +197,7 @@ 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)
if test "$enable_libxml2" != "yes"; then
case "$expat" in
no)
;;
@ -285,14 +286,33 @@ no)
LIBS="$expatsaved_LIBS"
;;
esac
AC_SUBST(EXPAT_LIBS)
AC_SUBST(EXPAT_CFLAGS)
AC_SUBST(EXPAT_LIBS)
case "$expat" in
no)
AC_MSG_ERROR([Cannot find usable expat library. This could mean that your version is too old.])
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)));