From: Bruno Haible Date: Sat, 22 Jun 2024 10:21:35 +0000 (+0200) Subject: c-snprintf: Use c-vzsnprintf. X-Git-Url: https://gitweb.git.savannah.gnu.org/gitweb/?a=commitdiff_plain;h=eaf2341422e0b74d594839556f74d19dcce839c1;p=gnulib.git c-snprintf: Use c-vzsnprintf. * lib/c-snprintf.h (c_snprintf): Move specification to here. * lib/c-snprintf.c: Change license to LGPLv2+. Don't include , , c-vasnprintf.h. Include , c-vsnprintf.h. (c_snprintf): Implement based on c_vzsnprintf. * modules/c-snprintf (Depends-on): Add stdint, c-vzsnprintf. Remove c-vasnprintf. --- diff --git a/ChangeLog b/ChangeLog index 83445e3e8c..fcc60208f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2024-06-22 Bruno Haible + c-snprintf: Use c-vzsnprintf. + * lib/c-snprintf.h (c_snprintf): Move specification to here. + * lib/c-snprintf.c: Change license to LGPLv2+. + Don't include , , c-vasnprintf.h. Include + , c-vsnprintf.h. + (c_snprintf): Implement based on c_vzsnprintf. + * modules/c-snprintf (Depends-on): Add stdint, c-vzsnprintf. Remove + c-vasnprintf. + c-zsnprintf: New module. * lib/c-snprintf.h: Change license to LGPLv2+. (c_zsnprintf): New declaration. diff --git a/lib/c-snprintf.c b/lib/c-snprintf.c index 8ded5a8fd2..658f3faed4 100644 --- a/lib/c-snprintf.c +++ b/lib/c-snprintf.c @@ -1,20 +1,18 @@ /* Formatted output to strings in C locale. Copyright (C) 2004, 2006-2024 Free Software Foundation, Inc. - Written by Simon Josefsson and Paul Eggert. - Modified for C locale by Ben Pfaff. - 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 3, or (at your option) - any later version. + This file is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation; either version 2.1 of the + License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + This file 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. + GNU Lesser General Public License for more details. - You should have received a copy of the GNU General Public License along - with this program; if not, see . */ + You should have received a copy of the GNU Lesser General Public License + along with this program. If not, see . */ #include @@ -24,52 +22,27 @@ #include #include #include -#include -#include +#include -#include "c-vasnprintf.h" +#include "c-vsnprintf.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. - - Formatting takes place in the C locale, that is, the decimal point - used in floating-point formatting directives is always '.'. */ int c_snprintf (char *str, size_t size, const char *format, ...) { - char *output; - size_t len; - size_t lenbuf = size; va_list args; + ptrdiff_t ret; va_start (args, format); - output = c_vasnprintf (str, &lenbuf, format, args); - len = lenbuf; + ret = c_vzsnprintf (str, size, format, args); va_end (args); - if (!output) - return -1; - - if (output != str) - { - if (size) - { - size_t pruned_len = (len < size ? len : size - 1); - memcpy (str, output, pruned_len); - str[pruned_len] = '\0'; - } - - free (output); - } - - if (INT_MAX < len) +#if PTRDIFF_MAX > INT_MAX + if (ret > INT_MAX) { errno = EOVERFLOW; return -1; } +#endif - return len; + return ret; } diff --git a/lib/c-snprintf.h b/lib/c-snprintf.h index 8e4a6cbe59..f52e058e9e 100644 --- a/lib/c-snprintf.h +++ b/lib/c-snprintf.h @@ -48,6 +48,14 @@ extern ptrdiff_t c_zsnprintf (char *restrict str, size_t size, const char *format, ...) _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4)); +/* Prints formatted output to string STR. Similar to sprintf, but the + additional parameter SIZE limits how much is written into STR. + STR may be NULL, in which case nothing will be written. + Returns the string length of the formatted string (which may be larger + than SIZE). Upon failure, returns -1 with errno set. + + Formatting takes place in the C locale, that is, the decimal point + used in floating-point formatting directives is always '.'. */ extern int c_snprintf (char *restrict str, size_t size, const char *format, ...) _GL_ATTRIBUTE_FORMAT ((_GL_ATTRIBUTE_SPEC_PRINTF_STANDARD, 3, 4)); diff --git a/modules/c-snprintf b/modules/c-snprintf index 456691d868..49857beca7 100644 --- a/modules/c-snprintf +++ b/modules/c-snprintf @@ -6,8 +6,9 @@ lib/c-snprintf.h lib/c-snprintf.c Depends-on: +stdint stdio -c-vasnprintf +c-vzsnprintf configure.ac: AC_REQUIRE([AC_C_RESTRICT]) @@ -19,7 +20,7 @@ Include: "c-snprintf.h" License: -GPL +LGPLv2+ Maintainer: -Ben Pfaff +all