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):
|
||||
|
||||
|
|
180
configure.in
180
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
|
||||
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
|
||||
|
|
|
@ -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