blob: 086ed7cc7886b9fdfad104b931f2dceebeab437a [file] [log] [blame]
Angel Ponsb706ab32020-04-02 23:48:09 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Eric Biederman8ca8d762003-04-22 19:02:15 +00002
Stefan Reinauer52fc6b12009-10-24 13:06:04 +00003#include <console/vtxprintf.h>
Elyes Haouasbdd03c22024-05-27 11:20:07 +02004#include <stdio.h>
Eric Biederman8ca8d762003-04-22 19:02:15 +00005
Elyes HAOUASa4184142018-05-15 20:57:01 +02006struct vsnprintf_context {
Vladimir Serbinenko22676582013-11-26 21:48:57 +01007 char *str_buf;
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +01008 size_t buf_limit;
Vladimir Serbinenko22676582013-11-26 21:48:57 +01009};
10
11static void str_tx_byte(unsigned char byte, void *data)
12{
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010013 struct vsnprintf_context *ctx = data;
14 if (ctx->buf_limit) {
15 *ctx->str_buf = byte;
16 ctx->str_buf++;
17 ctx->buf_limit--;
18 }
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000019}
Patrick Georgi736221f12009-05-26 14:31:37 +000020
David Hendricks6053a9c2018-01-28 18:01:10 -080021int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000022{
Eric Biederman8ca8d762003-04-22 19:02:15 +000023 int i;
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010024 struct vsnprintf_context ctx;
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000025
Vladimir Serbinenko22676582013-11-26 21:48:57 +010026 ctx.str_buf = buf;
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010027 ctx.buf_limit = size ? size - 1 : 0;
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020028 i = vtxprintf(str_tx_byte, fmt, args, &ctx);
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010029 if (size)
30 *ctx.str_buf = '\0';
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000031
Eric Biederman8ca8d762003-04-22 19:02:15 +000032 return i;
33}
34
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010035int snprintf(char *buf, size_t size, const char *fmt, ...)
36{
37 va_list args;
38 int i;
39
40 va_start(args, fmt);
41 i = vsnprintf(buf, size, fmt, args);
Eric Biederman8ca8d762003-04-22 19:02:15 +000042 va_end(args);
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000043
Eric Biederman8ca8d762003-04-22 19:02:15 +000044 return i;
45}