|
From: | Bruno Haible |
Subject: | *printf string functions without INT_MAX limitations |
Date: | Sat, 22 Jun 2024 12:20:28 +0200 |
As discussed in the thread starting at <https://lists.gnu.org/archive/html/bug-gnulib/2024-04/msg00352.html>, I'm adding *zs*printf modules, that are like the existing variants without 'z', except that - they support returning results of length > INT_MAX, - thus the length type is changed to 'ptrdiff_t' from 'int', - an attempt to return a result > PTRDIFF_MAX produces an error ENOMEM (consistently with malloc, calloc) instead of EOVERFLOW. For file stream and file descriptor based function, a similar thing will be done, with 'off64_t' (instead of ptrdiff_t) replacing 'int'. Here comes the first part of the string functions. snprintf -> vzsnprintf zsnprintf -> vasnprintf sprintf -> vzsprintf zsprintf -> vasnprintf vasprintf -> vazsprintf vazsprintf -> vasnprintf vsnprintf -> vzsnprintf vzsnprintf -> vasnprintf vsprintf -> vzsprintf vzsprintf -> vasnprintf xvasprintf -> vazsprintf Note that the last patch, in xvasprintf, also fixes a long-standing bug: The code was examining errno after vasprintf failed, but vasprintf is not documented to set errno upon failure. 2024-06-22 Bruno Haible <bruno@clisp.org> xvasprintf: Guarantee a non-NULL result. * lib/xvasprintf.h: Clarify the programmer's responsibilities. (xasprintf, xvasprintf): Declare as returning non-NULL. * lib/xvasprintf.c: Include <stdlib.h>. (xstrcat): Allow results longer than INT_MAX characters. Upon size overflow, invoke xalloc_die. (xvasprintf): Call vazsprintf instead of vasprintf. When some other error occurs, emit an error message and abort. * m4/strerrorname_np.m4 (gl_CHECK_STRERRORNAME_NP): New macro, extracted from gl_FUNC_STRERRORNAME_NP. (gl_FUNC_STRERRORNAME_NP): Invoke it. (gl_OPTIONAL_STRERRORNAME_NP): New macro. * m4/xvasprintf.m4 (gl_XVASPRINTF): Invoke gl_OPTIONAL_STRERRORNAME_NP. * modules/xvasprintf (Files): Add m4/strerrorname_np.m4. (Depends-on): Add extensions, vazsprintf. Remove vasprintf. * NEWS: Mention the change. 2024-06-22 Bruno Haible <bruno@clisp.org> vasprintf: Make return convention consistent with other modules. * lib/vasprintf.c: Include <stdint.h>. (vasprintf): If the length is > PTRDIFF_MAX, fail with ENOMEM, not EOVERFLOW. * modules/vasprintf (Depends-on): Add stdint. vazsprintf: New module. * lib/stdio.in.h (azsprintf, vazsprintf): New declarations. * lib/vazsprintf.c: New file, based on lib/vasprintf.c. * lib/azsprintf.c: New file, based on lib/asprintf.c. * m4/stdio_h.m4 (gl_STDIO_H_REQUIRE_DEFAULTS): Initialize GNULIB_VAZSPRINTF. * modules/stdio (Makefile.am): Substitute GNULIB_VAZSPRINTF. * modules/vazsprintf: New file. 2024-06-22 Bruno Haible <bruno@clisp.org> sprintf-posix: Use vzsprintf. * lib/stdio.in.h (sprintf): Move specification to here. * lib/sprintf.c: Don't include <stdlib.h>, vasnprintf.h. Include <stdint.h>. (sprintf): Implement based on vzsprintf. * modules/sprintf-posix (Depends-on): Add vzsprintf. Remove vasnprintf. zsprintf: New module. * lib/stdio.in.h (zsprintf): New declaration, based on lib/sprintf.c. * lib/zsprintf.c: New file, based on lib/sprintf.c. * m4/stdio_h.m4 (gl_STDIO_H_REQUIRE_DEFAULTS): Initialize GNULIB_ZSPRINTF. * modules/stdio (Makefile.am): Substitute GNULIB_ZSPRINTF. * modules/zsprintf: New file. 2024-06-22 Bruno Haible <bruno@clisp.org> vsprintf-posix: Use vzsprintf. * lib/stdio.in.h (vsprintf): Move specification to here. * lib/vsprintf.c: Don't include <stdlib.h>, vasnprintf.h. (SIZE_MAX): Remove macro. (vsprintf): Implement based on vzsprintf. * modules/vsprintf-posix (Depends-on): Add vzsprintf. Remove vasnprintf. vzsprintf: New module. * lib/stdio.in.h (vzsprintf): New declaration, based on lib/vsprintf.c. * lib/vzsprintf.c: New file, based on lib/vsprintf.c. * m4/stdio_h.m4 (gl_STDIO_H_REQUIRE_DEFAULTS): Initialize GNULIB_VZSPRINTF. * modules/stdio (Makefile.am): Substitute GNULIB_VZSPRINTF. * modules/vzsprintf: New file. 2024-06-22 Bruno Haible <bruno@clisp.org> snprintf: Use vzsnprintf. * lib/stdio.in.h (snprintf): Move specification to here. * lib/snprintf.c: Don't include <stdlib.h>, <string.h>, vasnprintf.h. Include <stdint.h>. (snprintf): Implement based on vzsnprintf. * modules/snprintf (Depends-on): Add stdint, vzsnprintf. Remove vasnprintf. zsnprintf: New module. * lib/stdio.in.h (zsnprintf): New declaration, based on lib/snprintf.c. * lib/zsnprintf.c: New file, based on lib/snprintf.c. * m4/stdio_h.m4 (gl_STDIO_H_REQUIRE_DEFAULTS): Initialize GNULIB_ZSNPRINTF. * modules/stdio (Makefile.am): Substitute GNULIB_ZSNPRINTF. * modules/zsnprintf: New file. 2024-06-22 Bruno Haible <bruno@clisp.org> vsnprintf: Use vzsnprintf. * lib/stdio.in.h (vsnprintf): Move specification to here. * lib/vsnprintf.c: Don't include <stdlib.h>, <string.h>, vasnprintf.h. Include <stdint.h>. (vsnprintf): Implement based on vzsnprintf. * modules/vsnprintf (Depends-on): Add stdint, vzsnprintf. Remove vasnprintf. vzsnprintf: New module. * lib/stdio.in.h (vzsnprintf): New declaration, based on lib/vsnprintf.c. * lib/vzsnprintf.c: New file, based on lib/vsnprintf.c. * m4/stdio_h.m4 (gl_STDIO_H_REQUIRE_DEFAULTS): Initialize GNULIB_VZSNPRINTF. * modules/stdio (Makefile.am): Substitute GNULIB_VZSNPRINTF. * modules/vzsnprintf: New file.
0001-vzsnprintf-New-module.patch
Description: Text Data
0002-vsnprintf-Use-vzsnprintf.patch
Description: Text Data
0003-zsnprintf-New-module.patch
Description: Text Data
0004-snprintf-Use-vzsnprintf.patch
Description: Text Data
0005-vzsprintf-New-module.patch
Description: Text Data
0006-vsprintf-posix-Use-vzsprintf.patch
Description: Text Data
0007-zsprintf-New-module.patch
Description: Text Data
0008-sprintf-posix-Use-vzsprintf.patch
Description: Text Data
0009-vazsprintf-New-module.patch
Description: Text Data
0010-vasprintf-Make-return-convention-consistent-with-oth.patch
Description: Text Data
0011-xvasprintf-Guarantee-a-non-NULL-result.patch
Description: Text Data
[Prev in Thread] | Current Thread | [Next in Thread] |