]> git.eshelyaron.com Git - emacs.git/commitdiff
Add a stub for snprintf, for ancient hosts lacking it.
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 31 Aug 2011 22:18:16 +0000 (15:18 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 31 Aug 2011 22:18:16 +0000 (15:18 -0700)
* configure.in (snprintf): New check.
* nt/config.nt (HAVE_SNPRINTF): New macro.
* src/sysdep.c (snprintf) [! HAVE_SNPRINTF]: New function.

ChangeLog
configure.in
nt/ChangeLog
nt/config.nt
src/ChangeLog
src/sysdep.c

index 1f38dbf71ca4b9becc35838ff47fbdc9031f750e..c973a82e8a47003bed9cc57885c3fc7c7d85bce8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2011-08-31  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * configure.in (snprintf): New check.
+
 2011-08-30  Paul Eggert  <eggert@cs.ucla.edu>
 
        * configure.in (opsys): Change pattern to *-*-linux*
index 715e8278df29568646719e3cc5ba0b3db88891f4..dcc2bdb99d11f8b36998a3b259c9bc5b9023a1d5 100644 (file)
@@ -3071,6 +3071,8 @@ fi
 
 AC_FUNC_FORK
 
+AC_CHECK_FUNCS(snprintf)
+
 dnl Adapted from Haible's version.
 AC_CACHE_CHECK([for nl_langinfo and CODESET], emacs_cv_langinfo_codeset,
   [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <langinfo.h>]],
index edbd1a1c1d431c9176051e3cdf83633004429606..f3c57c7e0d031edd8f8b5a0c957b82d69bb15e1b 100644 (file)
@@ -1,3 +1,7 @@
+2011-08-31  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * config.nt (HAVE_SNPRINTF): New macro.
+
 2011-07-28  Paul Eggert  <eggert@cs.ucla.edu>
 
        Assume freestanding C89 headers, string.h, stdlib.h.
index 3436bc989e08e91a531cb05501b1d29446d5b1f3..ae3807538c0f2eba2de0d34f019880c63c240067 100644 (file)
@@ -240,6 +240,7 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
 #define HAVE_SETSOCKOPT 1
 #define HAVE_GETSOCKNAME 1
 #define HAVE_GETPEERNAME 1
+#define HAVE_SNPRINTF 1
 #define HAVE_LANGINFO_CODESET 1
 /* Local (unix) sockets are not supported.  */
 #undef HAVE_SYS_UN_H
index 463f2965baa79a2e7e1c23f1247905de55706c0c..0ba2df421863b739afc90b1cad327253ab0683fb 100644 (file)
@@ -90,6 +90,8 @@
        * process.c (make_process): Use printmax_t, not int, to format
        process-name gensyms.
 
+       * sysdep.c (snprintf) [! HAVE_SNPRINTF]: New function.
+
        * term.c (produce_glyphless_glyph): Make sprintf buffer a bit bigger
        to avoid potential buffer overrun.
 
index 57fff94f552fbdbbd85ccdec9ffdb2a25d36ad5b..e20bd591da1a4d31bfac2b579d56983760606a12 100644 (file)
@@ -1811,6 +1811,45 @@ strerror (int errnum)
 }
 #endif /* not WINDOWSNT */
 #endif /* ! HAVE_STRERROR */
+
+#ifndef HAVE_SNPRINTF
+/* Approximate snprintf as best we can on ancient hosts that lack it.  */
+int
+snprintf (char *buf, size_t bufsize, char const *format, ...)
+{
+  ptrdiff_t size = min (bufsize, PTRDIFF_MAX);
+  ptrdiff_t nbytes = size - 1;
+  va_list ap;
+
+  if (size)
+    {
+      va_start (ap, format);
+      nbytes = doprnt (buf, size, format, 0, ap);
+      va_end (ap);
+    }
+
+  if (nbytes == size - 1)
+    {
+      /* Calculate the length of the string that would have been created
+        had the buffer been large enough.  */
+      char stackbuf[4000];
+      char *b = stackbuf;
+      ptrdiff_t bsize = sizeof stackbuf;
+      va_start (ap, format);
+      nbytes = evxprintf (&b, &bsize, stackbuf, -1, format, ap);
+      va_end (ap);
+      if (b != stackbuf)
+       xfree (b);
+    }
+
+  if (INT_MAX < nbytes)
+    {
+      errno = EOVERFLOW;
+      return -1;
+    }
+  return nbytes;
+}
+#endif
 \f
 int
 emacs_open (const char *path, int oflag, int mode)