On Wed, Dec 15, 2010 at 12:46:00PM -0600, Peter O'Gorman wrote:

> While it is possible to check in configure how the system's stdio
> implementation is broken, it seems easier to use libxml's included trio.
> Trio's vsnprintf doesn't like NULL buffers either, so we avoid doing
> that.
> 
> Hack attached

Of course it helps if you get the whole hack - the one that actually
uses trio's vsnprintf :)

Peter
-- 
Peter O'Gorman
[email protected]
diff --git a/Makefile.am b/Makefile.am
index b8cbb4a..2cd345b 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -31,17 +31,6 @@ libxml2_la_LDFLAGS = @CYGWIN_EXTRA_LDFLAGS@ 
@WIN32_EXTRA_LDFLAGS@ \
                     -version-info @LIBXML_VERSION_INFO@ \
                     @MODULE_PLATFORM_LIBS@
 
-if WITH_TRIO_SOURCES
-libxml2_la_SOURCES = SAX.c entities.c encoding.c error.c parserInternals.c  \
-               parser.c tree.c hash.c list.c xmlIO.c xmlmemory.c uri.c  \
-               valid.c xlink.c HTMLparser.c HTMLtree.c debugXML.c xpath.c  \
-               xpointer.c xinclude.c nanohttp.c nanoftp.c DOCBparser.c \
-               catalog.c globals.c threads.c c14n.c xmlstring.c \
-               xmlregexp.c xmlschemas.c xmlschemastypes.c xmlunicode.c \
-               triostr.c trio.c xmlreader.c relaxng.c dict.c SAX2.c \
-               xmlwriter.c legacy.c chvalid.c pattern.c xmlsave.c \
-               xmlmodule.c schematron.c
-else
 libxml2_la_SOURCES = SAX.c entities.c encoding.c error.c parserInternals.c  \
                parser.c tree.c hash.c list.c xmlIO.c xmlmemory.c uri.c  \
                valid.c xlink.c HTMLparser.c HTMLtree.c debugXML.c xpath.c  \
@@ -51,6 +40,8 @@ libxml2_la_SOURCES = SAX.c entities.c encoding.c error.c 
parserInternals.c  \
                xmlreader.c relaxng.c dict.c SAX2.c \
                xmlwriter.c legacy.c chvalid.c pattern.c xmlsave.c \
                xmlmodule.c schematron.c
+if WITH_TRIO_SOURCES
+libxml2_la_SOURCES += trio.c triostr.c
 endif
 
 DEPS = $(top_builddir)/libxml2.la
diff --git a/configure.in b/configure.in
index a1d2c89..346b7df 100644
--- a/configure.in
+++ b/configure.in
@@ -479,6 +479,25 @@ AC_CHECK_FUNCS(stat _stat signal)
 dnl Checking the standard string functions availability
 AC_CHECK_FUNCS(printf sprintf fprintf snprintf vfprintf vsprintf vsnprintf 
sscanf,,
                NEED_TRIO=1)
+AC_CACHE_CHECK([if vsnprintf is POSIX compliant],[xml_cv_working_vsnprintf],
+[xml_cv_working_vsnprintf=yes
+AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
+#include <stdarg.h>
+static int printit(const char *format, ...) {
+int retcode = 0;
+va_list ap;
+char buf[2];
+va_start(ap,format);
+retcode = vsnprintf(buf,1,format,ap);
+va_end(ap);
+return retcode;
+}]],[
+return printit("%s","hello") != 5;
+])],,[xml_cv_working_vsnprintf=no])])
+if test "X$xml_cv_working_vsnprintf" = "Xno"; then
+  NEED_TRIO=1
+  AC_DEFINE([BROKEN_VSNPRINTF],[1],[if vsnprintf does not work properly])
+fi
 
 dnl Checking for va_copy availability
 AC_MSG_CHECKING([for va_copy])
diff --git a/libxml.h b/libxml.h
index dfc6c64..a78611a 100644
--- a/libxml.h
+++ b/libxml.h
@@ -51,6 +51,9 @@ int vfprintf(FILE *, const char *, va_list);
  */
 #define TRIO_REPLACE_STDIO
 #include "trio.h"
+#ifdef BROKEN_VSNPRINTF
+#define vnsprintf trio_vsnprintf
+#endif
 #endif
 
 /*
diff --git a/xmlreader.c b/xmlreader.c
index 97c71ab..1a491d2 100644
--- a/xmlreader.c
+++ b/xmlreader.c
@@ -4545,6 +4545,11 @@ xmlTextReaderBuildMessage(const char *msg, va_list ap) {
     char *str = NULL;
     va_list aq;
 
+    /* While it should work to call vsnprintf(NULL, it does not work
+     * on Solaris < 10, HP-UX, AIX 5.1, IRIX, or Tru64 Unix, so we
+     * allocate a string to start with */
+    size = 64;
+    str = xmlMalloc(size);
     while (1) {
         VA_COPY(aq, ap);
         chars = vsnprintf(str, size, msg, aq);
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml

Reply via email to