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>
|
2005-09-29 Patrick Lam <plam@mit.edu>
|
||||||
* src/fccache.c (FcGlobalCacheSave, FcDirCacheWrite):
|
* 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-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)
|
AC_ARG_WITH(expat-lib, [ --with-expat-lib=DIR Use Expat library in DIR], expat_lib=$withval, expat_lib=yes)
|
||||||
|
|
||||||
case "$expat" in
|
if test "$enable_libxml2" != "yes"; then
|
||||||
no)
|
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"
|
case "$expat_includes" in
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case "$expat_lib" in
|
|
||||||
yes)
|
|
||||||
case "$expat" in
|
|
||||||
yes)
|
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)
|
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)
|
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
|
have_expat_header=yes
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
;;
|
case "$have_expat_header" in
|
||||||
yes)
|
no)
|
||||||
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])
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
expat=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
|
esac
|
||||||
|
CPPFLAGS="$expatsaved_CPPFLAGS"
|
||||||
|
LIBS="$expatsaved_LIBS"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
CPPFLAGS="$expatsaved_CPPFLAGS"
|
|
||||||
LIBS="$expatsaved_LIBS"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AC_SUBST(EXPAT_LIBS)
|
|
||||||
AC_SUBST(EXPAT_CFLAGS)
|
|
||||||
|
|
||||||
case "$expat" in
|
AC_SUBST(EXPAT_CFLAGS)
|
||||||
no)
|
AC_SUBST(EXPAT_LIBS)
|
||||||
AC_MSG_ERROR([Cannot find usable expat library. This could mean that your version is too old.])
|
|
||||||
;;
|
case "$expat" in
|
||||||
esac
|
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
|
# Set default font directory
|
||||||
|
|
|
@ -66,6 +66,7 @@ endif
|
||||||
|
|
||||||
INCLUDES = \
|
INCLUDES = \
|
||||||
$(FREETYPE_CFLAGS) \
|
$(FREETYPE_CFLAGS) \
|
||||||
|
$(LIBXML2_CFLAGS) \
|
||||||
$(EXPAT_CFLAGS) \
|
$(EXPAT_CFLAGS) \
|
||||||
$(WARN_CFLAGS) \
|
$(WARN_CFLAGS) \
|
||||||
-DFONTCONFIG_PATH='"$(CONFDIR)"' \
|
-DFONTCONFIG_PATH='"$(CONFDIR)"' \
|
||||||
|
@ -102,7 +103,7 @@ lib_LTLIBRARIES = libfontconfig.la
|
||||||
libfontconfig_la_LDFLAGS = \
|
libfontconfig_la_LDFLAGS = \
|
||||||
-version-info @LT_VERSION_INFO@ $(no_undefined) $(export_symbols)
|
-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
|
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 "fcint.h"
|
||||||
#include <dirent.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
|
#ifndef HAVE_XMLPARSE_H
|
||||||
#define HAVE_XMLPARSE_H 0
|
#define HAVE_XMLPARSE_H 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -36,6 +49,8 @@
|
||||||
#include <expat.h>
|
#include <expat.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* ENABLE_LIBXML2 */
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#define STRICT
|
#define STRICT
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
@ -2213,11 +2228,35 @@ FcStartDoctypeDecl (void *userData,
|
||||||
FcConfigMessage (parse, FcSevereError, "invalid doctype \"%s\"", doctypeName);
|
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
|
static void
|
||||||
FcEndDoctypeDecl (void *userData)
|
FcEndDoctypeDecl (void *userData)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* ENABLE_LIBXML2 */
|
||||||
|
|
||||||
static FcBool
|
static FcBool
|
||||||
FcConfigParseAndLoadDir (FcConfig *config,
|
FcConfigParseAndLoadDir (FcConfig *config,
|
||||||
const FcChar8 *name,
|
const FcChar8 *name,
|
||||||
|
@ -2311,10 +2350,16 @@ FcConfigParseAndLoad (FcConfig *config,
|
||||||
FcChar8 *filename;
|
FcChar8 *filename;
|
||||||
FILE *f;
|
FILE *f;
|
||||||
int len;
|
int len;
|
||||||
void *buf;
|
|
||||||
FcConfigParse parse;
|
FcConfigParse parse;
|
||||||
FcBool error = FcTrue;
|
FcBool error = FcTrue;
|
||||||
|
|
||||||
|
#if ENABLE_LIBXML2
|
||||||
|
xmlSAXHandler sax;
|
||||||
|
char buf[BUFSIZ];
|
||||||
|
#else
|
||||||
|
void *buf;
|
||||||
|
#endif
|
||||||
|
|
||||||
filename = FcConfigFilename (name);
|
filename = FcConfigFilename (name);
|
||||||
if (!filename)
|
if (!filename)
|
||||||
goto bail0;
|
goto bail0;
|
||||||
|
@ -2340,33 +2385,57 @@ FcConfigParseAndLoad (FcConfig *config,
|
||||||
if (!f)
|
if (!f)
|
||||||
goto bail0;
|
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");
|
p = XML_ParserCreate ("UTF-8");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!p)
|
if (!p)
|
||||||
goto bail1;
|
goto bail1;
|
||||||
|
|
||||||
if (!FcConfigInit (&parse, name, config, p))
|
if (!FcConfigInit (&parse, name, config, p))
|
||||||
goto bail2;
|
goto bail2;
|
||||||
|
|
||||||
|
#if !ENABLE_LIBXML2
|
||||||
|
|
||||||
XML_SetUserData (p, &parse);
|
XML_SetUserData (p, &parse);
|
||||||
|
|
||||||
XML_SetDoctypeDeclHandler (p, FcStartDoctypeDecl, FcEndDoctypeDecl);
|
XML_SetDoctypeDeclHandler (p, FcStartDoctypeDecl, FcEndDoctypeDecl);
|
||||||
XML_SetElementHandler (p, FcStartElement, FcEndElement);
|
XML_SetElementHandler (p, FcStartElement, FcEndElement);
|
||||||
XML_SetCharacterDataHandler (p, FcCharacterData);
|
XML_SetCharacterDataHandler (p, FcCharacterData);
|
||||||
|
|
||||||
|
#endif /* ENABLE_LIBXML2 */
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
#if !ENABLE_LIBXML2
|
||||||
buf = XML_GetBuffer (p, BUFSIZ);
|
buf = XML_GetBuffer (p, BUFSIZ);
|
||||||
if (!buf)
|
if (!buf)
|
||||||
{
|
{
|
||||||
FcConfigMessage (&parse, FcSevereError, "cannot get parse buffer");
|
FcConfigMessage (&parse, FcSevereError, "cannot get parse buffer");
|
||||||
goto bail3;
|
goto bail3;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
len = fread (buf, 1, BUFSIZ, f);
|
len = fread (buf, 1, BUFSIZ, f);
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
{
|
{
|
||||||
FcConfigMessage (&parse, FcSevereError, "failed reading config file");
|
FcConfigMessage (&parse, FcSevereError, "failed reading config file");
|
||||||
goto bail3;
|
goto bail3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if ENABLE_LIBXML2
|
||||||
|
if (xmlParseChunk (p, buf, len, len == 0))
|
||||||
|
#else
|
||||||
if (!XML_ParseBuffer (p, len, len == 0))
|
if (!XML_ParseBuffer (p, len, len == 0))
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
FcConfigMessage (&parse, FcSevereError, "%s",
|
FcConfigMessage (&parse, FcSevereError, "%s",
|
||||||
XML_ErrorString (XML_GetErrorCode (p)));
|
XML_ErrorString (XML_GetErrorCode (p)));
|
||||||
|
|
Loading…
Reference in New Issue