* modules/snprintf (Depends-on): Remove minmax.
authorPaul Eggert <eggert@cs.ucla.edu>
Thu, 10 Aug 2006 19:32:38 +0000 (19:32 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 10 Aug 2006 19:32:38 +0000 (19:32 +0000)
(Maintainer): Add self.
* lib/.cppi-disable: Add snprintf.h, socket_.h.
* lib/snprintf.c: Include <errno.h> and <limits.h>.
(EOVERFLOW): Define if the system does not.
Do not include "minmax.h"; it wasn't used.
(snprintf): Don't assume size_t promotes to an unsigned type.
Fix bug when generated string was too long for the buffer: the
buffer's contents are supposed to be the initial prefix of the
output.  Don't assume vasnprintf returns EOVERFLOW if the size
exceeds INT_MAX; do the check ourselves.

ChangeLog
lib/.cppi-disable
lib/ChangeLog
lib/snprintf.c
modules/snprintf

index fedabc50eff4e6249090fc6e41d25907c5066087..a8bcb871d319e2e9b00aab959d9bb98c99c0ef23 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-08-10  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * modules/snprintf (Depends-on): Remove minmax.
+       (Maintainer): Add self.
+
 2006-08-10  Bruno Haible  <bruno@clisp.org>
 
        * gnulib-tool (func_create_testdir): Detect unexpanded macros here
index 7106f0cbc7e356423cfeef248e1feddd8562eec8..049783935fd96e33037f6c6cccc51c3c09ccb04c 100644 (file)
@@ -29,6 +29,8 @@ regex.c
 regex.h
 regex_internal.c
 regex_internal.h
+snprintf.h
+socket_.h
 stat-time.h
 stdbool_.h
 stdint_.h
index 3ae7e876b5e015c52098db61a80fb65f06daac67..6f2ba3fcb85aff6a0519df08cd8473b07aef454c 100644 (file)
@@ -1,3 +1,15 @@
+2006-08-10  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * .cppi-disable: Add snprintf.h, socket_.h.
+       * snprintf.c: Include <errno.h> and <limits.h>.
+       (EOVERFLOW): Define if the system does not.
+       Do not include "minmax.h"; it wasn't used.
+       (snprintf): Don't assume size_t promotes to an unsigned type.
+       Fix bug when generated string was too long for the buffer: the
+       buffer's contents are supposed to be the initial prefix of the
+       output.  Don't assume vasnprintf returns EOVERFLOW if the size
+       exceeds INT_MAX; do the check ourselves.
+
 2006-08-09  Paul Eggert  <eggert@cs.ucla.edu>
 
        Sync from coreutils.
index 5870f8dde30f08250f6d78a1683cc14c034aaa27..c281f7c5830d09318773909a9e850bc074d3ced4 100644 (file)
@@ -1,6 +1,6 @@
 /* Formatted output to strings.
-   Copyright (C) 2004 Free Software Foundation, Inc.
-   Written by Simon Josefsson.
+   Copyright (C) 2004, 2006 Free Software Foundation, Inc.
+   Written by Simon Josefsson and Paul Eggert.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
 #include "snprintf.h"
 
+#include <errno.h>
+#include <limits.h>
 #include <stdarg.h>
 #include <stdlib.h>
 #include <string.h>
 
-#include "minmax.h"
 #include "vasnprintf.h"
 
+/* Some systems, like OSF/1 4.0 and Woe32, don't have EOVERFLOW.  */
+#ifndef EOVERFLOW
+# define EOVERFLOW E2BIG
+#endif
+
 /* Print formatted output to string STR.  Similar to sprintf, but
    additional length SIZE limit how much is written into STR.  Returns
    string length of formatted string (which may be larger than SIZE).
@@ -49,12 +55,22 @@ snprintf (char *str, size_t size, const char *format, ...)
   if (!output)
     return -1;
 
-  if (str != NULL)
-    if (len > size - 1) /* equivalent to: (size > 0 && len >= size) */
-      str[size - 1] = '\0';
-
   if (output != str)
-    free (output);
+    {
+      if (size)
+       {
+         memcpy (str, output, size - 1);
+         str[size - 1] = '\0';
+       }
+
+      free (output);
+    }
+
+  if (INT_MAX < len)
+    {
+      errno = EOVERFLOW;
+      return -1;
+    }
 
   return len;
 }
index 3f53fdfdbc149c61e566fc184f3d7feb25fce3ea..5b1035031f34eda6f225804cbe25ee1d2c357e73 100644 (file)
@@ -8,7 +8,6 @@ m4/snprintf.m4
 
 Depends-on:
 vasnprintf
-minmax
 
 configure.ac:
 gl_FUNC_SNPRINTF
@@ -23,4 +22,4 @@ License:
 LGPL
 
 Maintainer:
-Simon Josefsson
+Simon Josefsson, Paul Eggert