Use libxml2 if requested (with --enable-libxml2) or if expat is not
available. reviewed by: plam
This commit is contained in:
parent
649cc3616d
commit
e99f0f0a45
11
ChangeLog
11
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):
|
||||
|
||||
|
|
24
configure.in
24
configure.in
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
71
src/fcxml.c
71
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)));
|
||||
|
|
Loading…
Reference in New Issue