From: Patrick Lam Date: Thu, 29 Sep 2005 20:53:30 +0000 (+0000) Subject: Use libxml2 if requested (with --enable-libxml2) or if expat is not X-Git-Tag: fc-2_3_91~1 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=e99f0f0a45b29ad195c96833c95771ccf7771fef;hp=649cc3616d11add9d5c39563f9f343614c2bb2eb;p=fontconfig.git Use libxml2 if requested (with --enable-libxml2) or if expat is not available. reviewed by: plam --- diff --git a/ChangeLog b/ChangeLog index 7450b58..318d26a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-09-29 Mathias Hasselmann + + 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 * src/fccache.c (FcGlobalCacheSave, FcDirCacheWrite): diff --git a/configure.in b/configure.in index 4505b93..9e2fdde 100644 --- a/configure.in +++ b/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 + *) + case "$expat_includes" in yes) + case "$expat" in + yes) + ;; + *) + EXPAT_CFLAGS="-I$expat/include" + ;; + esac + ;; + no) + EXPAT_CFLAGS="" ;; *) - EXPAT_CFLAGS="-I$expat/include" + EXPAT_CFLAGS="-I$expat_includes" ;; esac - ;; - no) - EXPAT_CFLAGS="" - ;; - *) - EXPAT_CFLAGS="-I$expat_includes" - ;; - esac - case "$expat_lib" in - yes) - case "$expat" in + case "$expat_lib" in yes) - EXPAT_LIBS="-lexpat" + case "$expat" in + yes) + EXPAT_LIBS="-lexpat" + ;; + *) + EXPAT_LIBS="-L$expat/lib -lexpat" + ;; + esac + ;; + no) ;; *) - EXPAT_LIBS="-L$expat/lib -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" + 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 + AC_CHECK_HEADER(expat.h) + case "$ac_cv_header_expat_h" in no) - have_expat_header=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 diff --git a/src/Makefile.am b/src/Makefile.am index 1891c3c..db2d8ef 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 diff --git a/src/fcxml.c b/src/fcxml.c index 950bc9a..b497bd7 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -26,6 +26,19 @@ #include "fcint.h" #include +#if ENABLE_LIBXML2 + +#include + +#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 #endif +#endif /* ENABLE_LIBXML2 */ + #ifdef _WIN32 #define STRICT #include @@ -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)));