aboutsummaryrefslogtreecommitdiffstats
path: root/include/stdio.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/stdio.h')
-rw-r--r--include/stdio.h845
1 files changed, 826 insertions, 19 deletions
diff --git a/include/stdio.h b/include/stdio.h
index d23339d..598c6ef 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -26,35 +26,842 @@
#define __NEED_off_t
#define __NEED_size_t
#define __NEED_ssize_t
+#define __NEED_wchar_t
#define __NEED_va_list
#if __STDC_VERSION__ >= 201112L
# define __NEED_max_align_t
#endif
+#define FILE void /* TODO temporary */
#include <bits/types.h>
/* TODO implement I/O */
-int fflush(void*);
-#define stdin NULL
-#define stdout NULL
-#define stderr NULL
-int printf(const char*, ...);
-int fprintf(void*, const char*, ...);
-int dprintf(int, const char*, ...);
-int sprintf(char*, const char*, ...);
-int snprintf(char*, size_t, const char*, ...);
-#if (defined(_GNU_SOURCE) || defined(_SLIBC_SOURCE)) && !defined(__PORTABLE)
-int asprintf(char**, const char*, ...);
-#endif
-int vprintf(const char*, va_list);
-int vfprintf(void*, const char*, va_list);
-int vdprintf(int, const char*, va_list);
-int vsprintf(char*, const char*, va_list);
-int vsnprintf(char*, size_t, const char*, va_list);
-#if (defined(_GNU_SOURCE) || defined(_SLIBC_SOURCE)) && !defined(__PORTABLE)
-int vasprintf(char**, const char*, va_list);
+int fflush(FILE*);
+#define stdin ((void*)1) /* TODO temporary */
+#define stdout ((void*)2) /* TODO temporary */
+#define stderr ((void*)3) /* TODO temporary */
+
+
+/**
+ * This function is identical to `fprintf` with
+ * `stdout` as the first argument.
+ *
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written bytes.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` bytes are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite`.
+ */
+int printf(const char* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1), format(slibc_printf, 1, 2))));
+
+/**
+ * Print a formatted string to a stream.
+ *
+ * TODO list format rules for fprintf
+ *
+ * @param stream The output stream.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written bytes.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` bytes are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite`.
+ */
+int fprintf(FILE* restrict, const char* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2), format(slibc_printf, 2, 3))));
+
+#if defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `fprintf`,
+ * except it does not lock the stream.
+ *
+ * This is a slibc extension.
+ *
+ * @param stream The output stream.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written bytes.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` bytes are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite_unlocked`.
+ */
+int fprintf_unlocked(FILE* restrict, const char* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2), format(slibc_printf, 2, 3))));
+#endif
+
+/**
+ * This function is identical to `fprintf`,
+ * except it is limited to file descriptor-backed
+ * streams, and uses the file descriptor as the
+ * first argument rather than the stream.
+ *
+ * @param fd The file descriptor.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written bytes.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` bytes are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `write`.
+ */
+int dprintf(int, const char* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(2), format(slibc_printf, 2, 3))));
+
+/**
+ * This function is identical to `fprintf`,
+ * except it is limited to buffer-backed
+ * streams, and uses the buffer as the first
+ * argument rather than then the stream.
+ *
+ * This is identical to `sprintf` with
+ * `SIZE_MAX` as the second argument.
+ *
+ * @param buffer The output buffer.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written bytes, excluding
+ * the NUL byte. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * bytes are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ */
+int sprintf(char* restrict, const char* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2), format(slibc_printf, 2, 3))));
+
+/**
+ * This function is identical to `sprintf`,
+ * expect it truncates the output.
+ *
+ * @param buffer The output buffer.
+ * @param size The allocation size of `buffer`.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written bytes, excluding
+ * the NUL byte, that would have been written
+ * if `size` was ignored. On error, a negative
+ * value (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * bytes would have been written; in slibc,
+ * `INT_MAX` is returned if more would have
+ * been written, you can use "%zn" to find the
+ * actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ */
+int snprintf(char* restrict, size_t, const char* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(3), format(slibc_printf, 3, 4))));
+
+#if defined(_GNU_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `sprintf`,
+ * except it allocates a sufficiently large
+ * buffer.
+ *
+ * This is a GNU extension.
+ *
+ * @param buffer Output parameter for the output buffer.
+ * On error the content of this pointer is undefined.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written bytes, excluding
+ * the NUL byte. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * bytes are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws ENOMEM The process cannot allocation the
+ * sufficient amount of memory.
+ */
+int asprintf(char** restrict, const char* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2), format(slibc_printf, 2, 3), warn_unused_result)));
+#endif
+
+#if defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `asprintf`,
+ * except it can reuse allocated buffers.
+ *
+ * This is a slibc extension.
+ *
+ * @param buffer Reference parameter for the output buffer.
+ * It should point to the buffer than shall
+ * be used, or point to `NULL` if a new buffer
+ * shall be allocated. It will be updated with
+ * a new buffer if it points to `NULL`, or the
+ * new pointer if `buffer` needed to be reallocated.
+ * On error, this pointer will only have been
+ * updated if the buffer was reallocated during
+ * the call; if it pointed to `NULL`, it will
+ * still point to `NULL`.
+ * @param size Reference parameter for the buffer size.
+ * It shall point to a variable whose value is
+ * the allocation size of `*buffer`, or point to
+ * a variable whose value is zero if `*buffer`
+ * is `NULL`
+ * @param offset The offset in the buffer where the function
+ * shall start the printing.
+ * @param secure Non-zero if the function must override the
+ * buffer with zero before freeing it if it
+ * creates a new allocation.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written bytes, excluding
+ * the NUL byte. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * bytes are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws ENOMEM The process cannot allocation the
+ * sufficient amount of memory.
+ */
+int bprintf(char** restrict, size_t* restrict, size_t, int, const char* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2, 5), format(slibc_printf, 5, 6), warn_unused_result)));
+#endif
+
+
+/**
+ * This function is identical to `printf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written bytes.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` bytes are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite`.
+ */
+int vprintf(const char* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1))));
+
+/**
+ * This function is identical to `fprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * @param stream The output stream.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written bytes.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` bytes are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite`.
+ */
+int vfprintf(FILE* restrict, const char* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2))));
+
+#if defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `fprintf_unlocked`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * This is a slibc extension.
+ *
+ * @param stream The output stream.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written bytes.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` bytes are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite_unlocked`.
+ */
+int vfprintf_unlocked(FILE* restrict, const char* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2))));
+#endif
+
+/**
+ * This function is identical to `vdprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * @param fd The file descriptor.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written bytes.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` bytes are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `write`.
+ */
+int vdprintf(int, const char* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(2))));
+
+/**
+ * This function is identical to `sprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * @param buffer The output buffer.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written bytes, excluding
+ * the NUL byte. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * bytes are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ */
+int vsprintf(char* restrict, const char* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2))));
+
+/**
+ * This function is identical to `snprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * @param buffer The output buffer.
+ * @param size The allocation size of `buffer`.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written bytes, excluding
+ * the NUL byte, that would have been written
+ * if `size` was ignored. On error, a negative
+ * value (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * bytes would have been written; in slibc,
+ * `INT_MAX` is returned if more would have
+ * been written, you can use "%zn" to find the
+ * actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ */
+int vsnprintf(char* restrict, size_t, const char* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 3))));
+
+#if defined(_GNU_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `asprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * This is a GNU extension.
+ *
+ * @param buffer Output parameter for the output buffer.
+ * On error the content of this pointer is undefined.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written bytes, excluding
+ * the NUL byte. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * bytes are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws ENOMEM The process cannot allocation the
+ * sufficient amount of memory.
+ */
+int vasprintf(char** restrict, const char* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2), warn_unused_result)));
+#endif
+
+#if defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `bprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * This is a slibc extension.
+ *
+ * @param buffer Reference parameter for the output buffer.
+ * It should point to the buffer than shall
+ * be used, or point to `NULL` if a new buffer
+ * shall be allocated. It will be updated with
+ * a new buffer if it points to `NULL`, or the
+ * new pointer if `buffer` needed to be reallocated.
+ * On error, this pointer will only have been
+ * updated if the buffer was reallocated during
+ * the call; if it pointed to `NULL`, it will
+ * still point to `NULL`.
+ * @param size Reference parameter for the buffer size.
+ * It shall point to a variable whose value is
+ * the allocation size of `*buffer`, or point to
+ * a variable whose value is zero if `*buffer`
+ * is `NULL`
+ * @param offset The offset in the buffer where the function
+ * shall start the printing.
+ * @param secure Non-zero if the function must override the
+ * buffer with zero before freeing it if it
+ * creates a new allocation.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written bytes, excluding
+ * the NUL byte. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * bytes are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws ENOMEM The process cannot allocation the
+ * sufficient amount of memory.
+ */
+int vbprintf(char** restrict, size_t* restrict, size_t, int, const char* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2, 5), warn_unused_result)));
+#endif
+
+
+#if !defined(__PORTABLE) /* wchar_t is not portable. */
+/**
+ * This function is identical to `printf` except
+ * it uses wide characters.
+ *
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written characters.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` characters are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite`.
+ */
+int wprintf(const wchar_t* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1))));
+
+/**
+ * This function is identical to `fprintf` except
+ * it uses wide characters.
+ *
+ * @param stream The output stream.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written characters.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` characters are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite`.
+ */
+int fwprintf(FILE* restrict, const wchar_t* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2))));
+
+# if defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `fprintf_unlocked` except
+ * it uses wide characters.
+ *
+ * This is a slibc extension added for completeness.
+ *
+ * @param stream The output stream.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written characters.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` characters are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite_unlocked`.
+ */
+int fwprintf_unlocked(FILE* restrict, const wchar_t* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2))));
+
+/**
+ * This function is identical to `dprintf` except
+ * it uses wide characters.
+ *
+ * This is a slibc extension added for completeness.
+ *
+ * @param fd The file descriptor.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written characters.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` characters are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `write`.
+ */
+int dwprintf(int, const wchar_t* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(2))));
+# endif
+
+/**
+ * This function is identical to `snprintf`
+ * (not `sprintf`) except it uses wide characters.
+ *
+ * @param buffer The output buffer.
+ * @param size The allocation size of `buffer`.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written characters, excluding
+ * the NUL character, that would have been written
+ * if `size` was ignored. On error, a negative
+ * value (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * characters would have been written; in slibc,
+ * `INT_MAX` is returned if more would have
+ * been written, you can use "%zn" to find the
+ * actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ */
+int swprintf(wchar_t* restrict, size_t, const wchar_t* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(3))));
+
+# if defined(_GNU_SOURCE) && defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `aswprintf` except
+ * it uses wide characters.
+ *
+ * This is a slibc extension added for completeness.
+ * This is only available if GNU extensions are enabled.
+ *
+ * @param buffer Output parameter for the output buffer.
+ * On error the content of this pointer is undefined.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written characters, excluding
+ * the NUL character. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * characters are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws ENOMEM The process cannot allocation the
+ * sufficient amount of memory.
+ */
+int aswprintf(wchar_t** restrict, const wchar_t* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2), warn_unused_result)));
+# endif
+
+# if defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `bprintf` except
+ * it uses wide characters.
+ *
+ * This is a slibc extension added for completeness.
+ *
+ * @param buffer Reference parameter for the output buffer.
+ * It should point to the buffer than shall
+ * be used, or point to `NULL` if a new buffer
+ * shall be allocated. It will be updated with
+ * a new buffer if it points to `NULL`, or the
+ * new pointer if `buffer` needed to be reallocated.
+ * On error, this pointer will only have been
+ * updated if the buffer was reallocated during
+ * the call; if it pointed to `NULL`, it will
+ * still point to `NULL`.
+ * @param size Reference parameter for the buffer size,
+ * in `wchar_t`.
+ * It shall point to a variable whose value is
+ * the allocation size of `*buffer`, or point to
+ * a variable whose value is zero if `*buffer`
+ * is `NULL`
+ * @param offset The offset in the buffer where the function
+ * shall start the printing.
+ * @param secure Non-zero if the function must override the
+ * buffer with zero before freeing it if it
+ * creates a new allocation.
+ * @param format The formatting-string.
+ * @param ... The formatting-arguments.
+ * @return The number of written characters, excluding
+ * the NUL character. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * characters are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws ENOMEM The process cannot allocation the
+ * sufficient amount of memory.
+ */
+int bwprintf(wchar_t** restrict, size_t* restrict, size_t, int, const wchar_t* restrict, ...)
+ __GCC_ONLY(__attribute__((nonnull(1, 2, 5), warn_unused_result)));
+# endif
+
+
+/**
+ * This function is identical to `wprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written characters.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` characters are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite`.
+ */
+int vwprintf(const wchar_t* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1))));
+
+/**
+ * This function is identical to `fwprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * @param stream The output stream.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written characters.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` characters are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite`.
+ */
+int vfwprintf(FILE* restrict, const wchar_t* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2))));
+
+# if defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `fwprintf_unlocked`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * This is a slibc extension added for completeness.
+ *
+ * @param stream The output stream.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written characters.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` characters are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `fwrite_unlocked`.
+ */
+int vfwprintf_unlocked(FILE* restrict, const wchar_t* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2))));
+
+/**
+ * This function is identical to `vdprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * This is a slibc extension added for completeness.
+ *
+ * @param fd The file descriptor.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written characters.
+ * On error, a negative value (namely -1
+ * in this implementation) is returned.
+ * It is unspecified what shall happen if
+ * more than `INT_MAX` characters are written;
+ * in slibc, `INT_MAX` is returned if more
+ * is written, you can use "%zn" to find
+ * the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws Any error specified for `write`.
+ */
+int vdwprintf(int, const wchar_t* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(2))));
+# endif
+
+/**
+ * This function is identical to `swprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * @param buffer The output buffer.
+ * @param size The allocation size of `buffer`.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written characters, excluding
+ * the NUL character, that would have been written
+ * if `size` was ignored. On error, a negative
+ * value (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * characters would have been written; in slibc,
+ * `INT_MAX` is returned if more would have
+ * been written, you can use "%zn" to find the
+ * actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ */
+int vswprintf(wchar_t* restrict, size_t, const wchar_t* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(3))));
+
+# if defined(_GNU_SOURCE) && defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `aswprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * This is a slibc extension added for completeness.
+ * This is only available if GNU extensions are enabled.
+ *
+ * @param buffer Output parameter for the output buffer.
+ * On error the content of this pointer is undefined.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written characters, excluding
+ * the NUL character. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * characters are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws ENOMEM The process cannot allocation the
+ * sufficient amount of memory.
+ */
+int vaswprintf(wchar_t** restrict, const wchar_t* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2), warn_unused_result)));
+# endif
+
+# if defined(_SLIBC_SOURCE) && !defined(__PORTABLE)
+/**
+ * This function is identical to `bwprintf`,
+ * except it uses `va_list` instead of variadic argument.
+ *
+ * This is a slibc extension added for completeness.
+ *
+ * @param buffer Reference parameter for the output buffer.
+ * It should point to the buffer than shall
+ * be used, or point to `NULL` if a new buffer
+ * shall be allocated. It will be updated with
+ * a new buffer if it points to `NULL`, or the
+ * new pointer if `buffer` needed to be reallocated.
+ * On error, this pointer will only have been
+ * updated if the buffer was reallocated during
+ * the call; if it pointed to `NULL`, it will
+ * still point to `NULL`.
+ * @param size Reference parameter for the buffer size,
+ * in `wchar_t`.
+ * It shall point to a variable whose value is
+ * the allocation size of `*buffer`, or point to
+ * a variable whose value is zero if `*buffer`
+ * is `NULL`
+ * @param offset The offset in the buffer where the function
+ * shall start the printing.
+ * @param secure Non-zero if the function must override the
+ * buffer with zero before freeing it if it
+ * creates a new allocation.
+ * @param format The formatting-string.
+ * @param args The formatting-arguments.
+ * @return The number of written characters, excluding
+ * the NUL character. On error, a negative value
+ * (namely -1 in this implementation) is
+ * returned. It is unspecified what shall
+ * happen if more than `INT_MAX` non-NUL
+ * characters are written; in slibc, `INT_MAX`
+ * is returned if more is written, you can
+ * use "%zn" to find the actual length.
+ *
+ * @throws EINVAL `format` contained unsupported formatting codes.
+ * @throws ENOMEM The process cannot allocation the
+ * sufficient amount of memory.
+ */
+int vbwprintf(wchar_t** restrict, size_t* restrict, size_t, int, const wchar_t* restrict, va_list)
+ __GCC_ONLY(__attribute__((nonnull(1, 2, 5), warn_unused_result)));
+# endif
#endif