Index: configure.in =================================================================== RCS file: /cvs/fontconfig/fontconfig/configure.in,v retrieving revision 1.66.2.1 diff -u -2 -r1.66.2.1 configure.in --- configure.in 23 Sep 2005 05:59:19 -0000 1.66.2.1 +++ configure.in 29 Sep 2005 07:20:21 -0000 @@ -198,100 +198,120 @@ 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 # Index: src/Makefile.am =================================================================== RCS file: /cvs/fontconfig/fontconfig/src/Makefile.am,v retrieving revision 1.12 diff -u -2 -r1.12 Makefile.am --- src/Makefile.am 5 Dec 2004 05:49:20 -0000 1.12 +++ src/Makefile.am 29 Sep 2005 07:20:21 -0000 @@ -67,4 +67,5 @@ INCLUDES = \ $(FREETYPE_CFLAGS) \ + $(LIBXML2_CFLAGS) \ $(EXPAT_CFLAGS) \ $(WARN_CFLAGS) \ @@ -103,5 +104,5 @@ -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 Index: src/fcxml.c =================================================================== RCS file: /cvs/fontconfig/fontconfig/src/fcxml.c,v retrieving revision 1.37.4.6 diff -u -2 -r1.37.4.6 fcxml.c --- src/fcxml.c 22 Sep 2005 23:45:53 -0000 1.37.4.6 +++ src/fcxml.c 29 Sep 2005 07:20:22 -0000 @@ -27,4 +27,17 @@ #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 @@ -37,4 +50,6 @@ #endif +#endif /* ENABLE_LIBXML2 */ + #ifdef _WIN32 #define STRICT @@ -2214,4 +2229,26 @@ } +#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) @@ -2219,4 +2256,6 @@ } +#endif /* ENABLE_LIBXML2 */ + static FcBool FcConfigParseAndLoadDir (FcConfig *config, @@ -2312,8 +2351,14 @@ 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) @@ -2341,5 +2386,18 @@ 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; @@ -2348,4 +2406,6 @@ goto bail2; +#if !ENABLE_LIBXML2 + XML_SetUserData (p, &parse); @@ -2354,5 +2414,8 @@ XML_SetCharacterDataHandler (p, FcCharacterData); +#endif /* ENABLE_LIBXML2 */ + do { +#if !ENABLE_LIBXML2 buf = XML_GetBuffer (p, BUFSIZ); if (!buf) @@ -2361,4 +2424,5 @@ goto bail3; } +#endif len = fread (buf, 1, BUFSIZ, f); if (len < 0) @@ -2367,5 +2431,10 @@ 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",