Message ID | 20221228231741.125945-4-alx@kernel.org |
---|---|
State | New |
Headers | show |
Series | string: Add stpecpy(3) | expand |
stpeprintf(3) Library Functions Manual stpeprintf(3) NAME stpeprintf, vstpeprintf - create a formatted string with truncation LIBRARY stp string library (libstp, pkgconf ‐‐cflags ‐‐libs libstp) SYNOPSIS #include <stp/stpe/stpeprintf.h> char *_Nullable stpeprintf(char *_Nullable dst, char end[0], const char *restrict fmt, ...); char *_Nullable vstpeprintf(char *_Nullable dst, char end[0], const char *restrict fmt, va_list ap); DESCRIPTION These functions are almost identical to snprintf(3) and vsnprintf(3). The destination buffer is limited by a pointer to its end —one after its last element— instead of a size. These functions can be chained with calls to stpeprintf(3) and vstpeprintf(3). RETURN VALUE NULL • If this function failed (see ERRORS). • If dst was NULL. end • If this call truncated. • If dst was equal to end (a previous call to these functions truncated). dst + strlen(dst) On success, these functions return a pointer to the terminating null byte. ERRORS These functions may fail for any of the same reasons as vsnprintf(3). ATTRIBUTES For an explanation of the terms used in this section, see attrib‐ utes(7). ┌────────────────────────────────────────────┬───────────────┬─────────┐ │Interface │ Attribute │ Value │ ├────────────────────────────────────────────┼───────────────┼─────────┤ │stpeprintf(3), vstpeprintf(3) │ Thread safety │ MT‐Safe │ └────────────────────────────────────────────┴───────────────┴─────────┘ STANDARDS None. EXAMPLES See stpecpy(3). SEE ALSO stpecpy(3), string_copying(7) libstp (unreleased) (date) stpeprintf(3)
diff --git a/libio/stdio.h b/libio/stdio.h index 59b8047ecc..7456ea6885 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -385,6 +385,10 @@ extern int vsnprintf (char *__restrict __s, size_t __maxlen, #endif #if __USE_GNU +extern char *stpeprintf (char *__dest, char *__end, + const char *__restrict __fmt, ...) + __THROWNL __attribute__ ((__format__ (__printf__, 3, 4))); + extern char *vstpeprintf (char *__dest, char *__end, const char *__restrict __fmt, __gnuc_va_list __arg) __THROWNL __attribute__ ((__format__ (__printf__, 3, 0))); diff --git a/stdio-common/Makefile b/stdio-common/Makefile index 3e0c574ca5..d92942a86f 100644 --- a/stdio-common/Makefile +++ b/stdio-common/Makefile @@ -79,6 +79,7 @@ routines := \ snprintf \ sprintf \ sscanf \ + stpeprintf \ tempnam \ tempname \ tmpfile \ diff --git a/stdio-common/stpeprintf.c b/stdio-common/stpeprintf.c new file mode 100644 index 0000000000..7b953be3ee --- /dev/null +++ b/stdio-common/stpeprintf.c @@ -0,0 +1,32 @@ +/* Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library 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. + + The GNU C Library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <stdarg.h> +#include <stdio.h> + +char * +stpeprintf(char *dst, char *end, const char *restrict fmt, ...) +{ + char *p; + va_list ap; + + va_start(ap, fmt); + p = vstpeprintf(dst, end, fmt, ap); + va_end(ap); + + return p; +}
Add variadic-argument version of vstpeprintf(3). Signed-off-by: Alejandro Colomar <alx@kernel.org> --- libio/stdio.h | 4 ++++ stdio-common/Makefile | 1 + stdio-common/stpeprintf.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 stdio-common/stpeprintf.c