changeset 10257:cd550069240e

assume vsnprintf from gnulib; use sstream instead of snprintf
author John W. Eaton <jwe@octave.org>
date Wed, 03 Feb 2010 06:34:29 -0500
parents c84186ad78f3
children e317791645c4
files ChangeLog acinclude.m4 bootstrap.conf configure.ac src/ChangeLog src/DLD-FUNCTIONS/convhulln.cc src/utils.cc
diffstat 7 files changed, 43 insertions(+), 106 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Wed Feb 03 05:31:47 2010 -0500
+++ b/ChangeLog	Wed Feb 03 06:34:29 2010 -0500
@@ -1,3 +1,10 @@
+2010-02-03  John W. Eaton  <jwe@octave.org>
+
+	* acinclude.m4 (OCTAVE_HAVE_C99_VSNPRINTF): Delete.
+	* configure.ac: Don't call OCTAVE_HAVE_C99_VSNPRINTF.
+	Don't check for snprintf, vfprintf, vsprintf, vsnprintf, or _snprintf.
+	* bootstrap.conf (gnulib_modules): Include vsprintf in the list.
+
 2010-02-03  John W. Eaton  <jwe@octave.org>
 
 	* configure.ac: Don't check for strerror.
--- a/acinclude.m4	Wed Feb 03 05:31:47 2010 -0500
+++ b/acinclude.m4	Wed Feb 03 06:34:29 2010 -0500
@@ -1360,44 +1360,6 @@
     [$5]
   fi
 ])
-dnl
-dnl Do we have a working c99 vsnprintf function?
-dnl
-dnl OCTAVE_HAVE_C99_VSNPRINTF
-AC_DEFUN([OCTAVE_HAVE_C99_VSNPRINTF], [
-  AC_CACHE_CHECK([for c99 vsnprintf], [oct_cv_c99_vsnprintf],
-    [AC_RUN_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-int
-doit(char * s, ...)
-{
-  char buffer[32];
-  va_list args;
-  int r;
-
-  va_start(args, s);
-  r = vsnprintf(buffer, 5, s, args);
-  va_end(args);
-
-  if (r != 7)
-    exit(1);
-
-  exit(0);
-}
-  ]],[
-doit("1234567");])],
-  [oct_cv_c99_vsnprintf=yes],
-  [oct_cv_c99_vsnprintf=no],
-  [oct_cv_c99_vsnprintf="guessing no"])])
-
-case $oct_cv_c99_vsnprintf in
-yes)
-    AC_DEFINE([HAVE_C99_VSNPRINTF], [1], [Define if you have a c99 vsnprintf])
-  ;;
-esac
-])
 
 ##############################################################################
 ##############################################################################
--- a/bootstrap.conf	Wed Feb 03 05:31:47 2010 -0500
+++ b/bootstrap.conf	Wed Feb 03 06:34:29 2010 -0500
@@ -51,6 +51,7 @@
   times
   unistd
   unlink
+  vsnprintf
   round
 "
 
--- a/configure.ac	Wed Feb 03 05:31:47 2010 -0500
+++ b/configure.ac	Wed Feb 03 06:34:29 2010 -0500
@@ -1496,9 +1496,9 @@
   mkstemp pipe putenv \
   realpath resolvepath rindex roundl select setgrent setlocale \
   setpwent setvbuf siglongjmp \
-  snprintf strsignal tempnam tgammaf trunc umask \
-  uname utime vfprintf vsprintf vsnprintf waitpid \
-  _chmod _snprintf x_utime _utime32)
+  strsignal tempnam tgammaf trunc umask \
+  uname utime waitpid \
+  _chmod x_utime _utime32)
 
 AC_LANG_PUSH(C++)
 AC_CHECK_DECLS([exp2, round, tgamma], [], [], [[#include <cmath>]])
@@ -1544,7 +1544,6 @@
    ;;
 esac
 
-OCTAVE_HAVE_C99_VSNPRINTF
 OCTAVE_SMART_PUTENV
 
 case "$canonical_host_type" in
--- a/src/ChangeLog	Wed Feb 03 05:31:47 2010 -0500
+++ b/src/ChangeLog	Wed Feb 03 06:34:29 2010 -0500
@@ -1,3 +1,11 @@
+2010-02-03  John W. Eaton  <jwe@octave.org>
+
+	* utils.cc (octave_vsnprintf): Assume we have vsnprintf with
+	semantics that match the version provided by gnulib.
+
+	* DLD-FUNCTIONS/convhulln.cc (Fconvhulln):
+	Use std::sstream instead of fixed-length buffer and snprintf.
+
 2010-02-03  John W. Eaton  <jwe@octave.org>
 
 	* cutils.c (octave_usleep): Implement using nanosleep.
--- a/src/DLD-FUNCTIONS/convhulln.cc	Wed Feb 03 05:31:47 2010 -0500
+++ b/src/DLD-FUNCTIONS/convhulln.cc	Wed Feb 03 06:34:29 2010 -0500
@@ -41,19 +41,13 @@
 #include "oct-obj.h"
 #include "parse.h"
 
-#ifdef HAVE_QHULL
-#if defined(HAVE__SNPRINTF) && !defined(HAVE_SNPRINTF)
-#define snprintf _snprintf
-#endif
-
 extern "C" {
 #include <qhull/qhull_a.h>
 }
 
-#ifdef NEED_QHULL_VERSION
+#if defined (HAVE_QHULL) && defined (NEED_QHULL_VERSION)
 char qh_version[] = "convhulln.oct 2007-07-24";
 #endif
-#endif
 
 DEFUN_DLD (convhulln, args, nargout,
   "-*- texinfo -*-\n\
@@ -122,11 +116,20 @@
 
   boolT ismalloc = False;
 
-  OCTAVE_LOCAL_BUFFER (char, flags, 250);
+  std::ostringstream buf;
+
+  buf << "qhull QJ " << options;
+
+  std::string buf_string = buf.str ();
 
-  // hmm, lots of options for qhull here
-  // QJ guarantees that the output will be triangles
-  snprintf (flags, 250, "qhull QJ %s", options.c_str ());
+  // FIXME -- we can't just pass buf_string.c_str () to qh_new_qhull
+  // because the argument is not declared const.  Ugh.  Unless
+  // qh_new_qhull really needs to modify this argument, someone should
+  // fix QHULL.
+
+  OCTAVE_LOCAL_BUFFER (char, flags, buf_string.length () + 1);
+
+  strcpy (flags, buf_string.c_str ());
 
   if (! qh_new_qhull (dim, n, pt_array, ismalloc, flags, 0, stderr)) 
     {
--- a/src/utils.cc	Wed Feb 03 05:31:47 2010 -0500
+++ b/src/utils.cc	Wed Feb 03 06:34:29 2010 -0500
@@ -1225,11 +1225,7 @@
 
   static char *buf = 0;
 
-#if defined (HAVE_C99_VSNPRINTF)
-  size_t nchars = 0;
-#else
   int nchars = 0;
-#endif
 
   if (! buf)
     buf = new char [size];
@@ -1237,43 +1233,6 @@
   if (! buf)
     return 0;
 
-#if defined (HAVE_C99_VSNPRINTF)
-
-  // Note that the caller is responsible for calling va_end on args.
-  // We will do it for saved_args.
-
-  va_list saved_args;
-
-  SAVE_ARGS (saved_args, args);
-
-  BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_FOR_VSNPRINTF;
-
-  nchars = octave_raw_vsnprintf (buf, size, fmt, args);
-
-  END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-
-  if (nchars >= size)
-    {
-      size = nchars + 1;
-
-      delete [] buf;
-
-      buf = new char [size];
-
-      if (buf)
-	{
-	  BEGIN_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE_FOR_VSNPRINTF;
-
-	  octave_raw_vsnprintf (buf, size, fmt, saved_args);
-
-	  END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
-	}
-    }
-
-  va_end (saved_args);
-
-#else
-
   while (1)
     {
       va_list saved_args;
@@ -1288,23 +1247,21 @@
 
       END_INTERRUPT_IMMEDIATELY_IN_FOREIGN_CODE;
 
-      if (nchars > -1 && nchars < size-1)
-       return buf;
+      if (nchars > -1 && nchars < size)
+        break;
       else
-       {
-	 delete [] buf;
-
-         size *= 2;
+        {
+          delete [] buf;
 
-	 buf = new char [size];
+          size = nchars + 1;;
+
+          buf = new char [size];
 
-         if (! buf)
-           return 0;
-       }
+          if (! buf)
+            return 0;
+        }
     }
 
-#endif
-
   return buf;
 }