]> git.wh0rd.org - fontconfig.git/commitdiff
Use libxml2 if requested (with --enable-libxml2) or if expat is not
authorPatrick Lam <plam@MIT.EDU>
Thu, 29 Sep 2005 20:53:30 +0000 (20:53 +0000)
committerPatrick Lam <plam@MIT.EDU>
Thu, 29 Sep 2005 20:53:30 +0000 (20:53 +0000)
    available.
reviewed by: plam

ChangeLog
configure.in
src/Makefile.am
src/fcxml.c

index 7450b58e9d35ad43386888916b34a5ca0c5803c9..318d26a4ee15c35740e9886ee09ee25fb48081bc 100644 (file)
--- a/ChangeLog
+++ b/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):
 
index 4505b93ed23e9f4f8222013d41479469d438079c..9e2fdde016bf978a4556ae27e0affc0e86e97edd 100644 (file)
@@ -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
index 1891c3c900a779d34b2ddf1db39c2c47b34bbfcd..db2d8ef5cfc7f4203b2ff9239788cb5aceb9981f 100644 (file)
@@ -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
 
index 950bc9aa015003d91e8eb6196fa8dc0c28c5fba9..b497bd7297f596d3244791c80bb49993e1578328 100644 (file)
 #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)));