bug-gnulib
[Top][All Lists]
Advanced

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

*printf string functions without INT_MAX limitations


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.

Attachment: 0001-vzsnprintf-New-module.patch
Description: Text Data

Attachment: 0002-vsnprintf-Use-vzsnprintf.patch
Description: Text Data

Attachment: 0003-zsnprintf-New-module.patch
Description: Text Data

Attachment: 0004-snprintf-Use-vzsnprintf.patch
Description: Text Data

Attachment: 0005-vzsprintf-New-module.patch
Description: Text Data

Attachment: 0006-vsprintf-posix-Use-vzsprintf.patch
Description: Text Data

Attachment: 0007-zsprintf-New-module.patch
Description: Text Data

Attachment: 0008-sprintf-posix-Use-vzsprintf.patch
Description: Text Data

Attachment: 0009-vazsprintf-New-module.patch
Description: Text Data

Attachment: 0010-vasprintf-Make-return-convention-consistent-with-oth.patch
Description: Text Data

Attachment: 0011-xvasprintf-Guarantee-a-non-NULL-result.patch
Description: Text Data


reply via email to

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