bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-gnulib] Re: snprintf


From: Simon Josefsson
Subject: [Bug-gnulib] Re: snprintf
Date: Thu, 30 Sep 2004 23:59:33 +0200
User-agent: Gnus/5.110003 (No Gnus v0.3) Emacs/21.3.50 (gnu/linux)

Perhaps this thread was forgotten.  Or do you feel snprintf should not
be included?

I went over all uses of snprintf in GnuTLS, and in most places it
would have been better to use asprintf.

However, in some places, I feel snprintf is useful, consider:

    char keyid[16];
    unsigned int kid[2];
...
    snprintf(keyid, 16, "%08lX%08lX", kid[0], kid[1]);

FWIW, someone also asked me off-list to resubmit the snprintf module
because he needed it.

Finally, snprintf is part of POSIX and perhaps also C99 (the
opengroup.org man pages suggest the latter).

Below is the complete fixed module again.

2004-09-21  Simon Josefsson  <address@hidden>

        * MODULES.html.sh (Support for systems lacking POSIX:2001): Add
        snprintf.

        * modules/snprintf: New file.

2004-09-21  Simon Josefsson  <address@hidden>

        * snprintf.m4: New file.

2004-09-21  Simon Josefsson  <address@hidden>

        * snprintf.h, snprintf.c: New file.

Index: modules/snprintf
===================================================================
RCS file: modules/snprintf
diff -N modules/snprintf
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ modules/snprintf    30 Sep 2004 21:53:45 -0000
@@ -0,0 +1,23 @@
+Description:
+snprintf() function: print formatted output to a fixed length string
+
+Files:
+lib/snprintf.h
+lib/snprintf.c
+m4/snprintf.m4
+
+Depends-on:
+vasnprintf
+minmax
+
+configure.ac:
+gl_FUNC_SNPRINTF
+
+Makefile.am:
+lib_SOURCES += snprintf.h
+
+Include:
+"snprintf.h"
+
+Maintainer:
+Simon Josefsson
Index: m4/snprintf.m4
===================================================================
RCS file: m4/snprintf.m4
diff -N m4/snprintf.m4
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ m4/snprintf.m4      30 Sep 2004 21:53:45 -0000
@@ -0,0 +1,17 @@
+# sprintf.m4 serial 1
+dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
+dnl This file is free software, distributed under the terms of the GNU
+dnl General Public License.  As a special exception to the GNU General
+dnl Public License, this file may be distributed as part of a program
+dnl that contains a configuration script generated by Autoconf, under
+dnl the same distribution terms as the rest of that program.
+
+AC_DEFUN([gl_FUNC_SNPRINTF],
+[
+  AC_REPLACE_FUNCS(snprintf)
+  AC_CHECK_DECLS_ONCE(snprintf)
+  gl_PREREQ_SNPRINTF
+])
+
+# Prerequisites of lib/snprintf.c.
+AC_DEFUN([gl_PREREQ_SNPRINTF], [:])
Index: lib/snprintf.h
===================================================================
RCS file: lib/snprintf.h
diff -N lib/snprintf.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/snprintf.h      30 Sep 2004 21:53:45 -0000
@@ -0,0 +1,29 @@
+/* Formatted output to strings.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+   Written by Simon Josefsson.
+
+   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
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifndef SNPRINTF_H
+#define SNPRINTF_H
+
+/* Get snprintf declaration, if available.  */
+#include <stdio.h>
+
+#if defined HAVE_DECL_SNPRINTF && !HAVE_DECL_SNPRINTF
+int snprintf(char *str, size_t size, const char *format, ...);
+#endif
+
+#endif /* SNPRINTF_H */
Index: lib/snprintf.c
===================================================================
RCS file: lib/snprintf.c
diff -N lib/snprintf.c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ lib/snprintf.c      30 Sep 2004 21:53:45 -0000
@@ -0,0 +1,55 @@
+/* Formatted output to strings.
+   Copyright (C) 2004 Free Software Foundation, Inc.
+   Written by Simon Josefsson.
+
+   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
+   the Free Software Foundation; either version 2, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License along
+   with this program; if not, write to the Free Software Foundation,
+   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+/* Get specification.  */
+#include "snprintf.h"
+
+/* Get vasnprintf.  */
+#include "vasnprintf.h"
+
+/* Get MIN. */
+#include <minmax.h>
+
+/* 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).
+   STR may be NULL, in which case nothing will be written.  On error,
+   return a negative value. */
+int
+snprintf (char *str, size_t size, const char *format, ...)
+{
+  size_t len;
+  char *out = vasnprintf (NULL, &len, format, args);
+
+  if (!out)
+    return -1;
+
+  if (str)
+    {
+      memcpy (str, out, MIN (len + 1, size));
+      str[size - 1] = '\0';
+    }
+
+  free (out);
+
+  return len;
+}
Index: MODULES.html.sh
===================================================================
RCS file: /cvsroot/gnulib/gnulib/MODULES.html.sh,v
retrieving revision 1.61
diff -u -p -r1.61 MODULES.html.sh
--- MODULES.html.sh     29 Sep 2004 22:10:44 -0000      1.61
+++ MODULES.html.sh     30 Sep 2004 21:53:45 -0000
@@ -1735,6 +1737,7 @@ func_all_modules ()
   func_module regex
   func_module rename
   func_module rmdir
+  func_module snprintf
   func_module utime
   func_end_table
 





reply via email to

[Prev in Thread] Current Thread [Next in Thread]