blob: 68926397a661f21a80602e1b469e7959ffceea5c [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 Haouas09324352022-10-02 12:30:56 +02004#include <stdarg.h>
Edward O'Callaghan0ddb8262014-06-17 18:37:08 +10005#include <string.h>
Eric Biederman8ca8d762003-04-22 19:02:15 +00006
Elyes HAOUASa4184142018-05-15 20:57:01 +02007struct vsnprintf_context {
Vladimir Serbinenko22676582013-11-26 21:48:57 +01008 char *str_buf;
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +01009 size_t buf_limit;
Vladimir Serbinenko22676582013-11-26 21:48:57 +010010};
11
12static void str_tx_byte(unsigned char byte, void *data)
13{
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010014 struct vsnprintf_context *ctx = data;
15 if (ctx->buf_limit) {
16 *ctx->str_buf = byte;
17 ctx->str_buf++;
18 ctx->buf_limit--;
19 }
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000020}
Patrick Georgi736221f12009-05-26 14:31:37 +000021
David Hendricks6053a9c2018-01-28 18:01:10 -080022int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000023{
Eric Biederman8ca8d762003-04-22 19:02:15 +000024 int i;
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010025 struct vsnprintf_context ctx;
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000026
Vladimir Serbinenko22676582013-11-26 21:48:57 +010027 ctx.str_buf = buf;
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010028 ctx.buf_limit = size ? size - 1 : 0;
Kyösti Mälkkib04e0ff2014-02-04 14:28:17 +020029 i = vtxprintf(str_tx_byte, fmt, args, &ctx);
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010030 if (size)
31 *ctx.str_buf = '\0';
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000032
Eric Biederman8ca8d762003-04-22 19:02:15 +000033 return i;
34}
35
Vladimir Serbinenko4b5012a2013-11-26 22:07:47 +010036int snprintf(char *buf, size_t size, const char *fmt, ...)
37{
38 va_list args;
39 int i;
40
41 va_start(args, fmt);
42 i = vsnprintf(buf, size, fmt, args);
Eric Biederman8ca8d762003-04-22 19:02:15 +000043 va_end(args);
Stefan Reinauer52fc6b12009-10-24 13:06:04 +000044
Eric Biederman8ca8d762003-04-22 19:02:15 +000045 return i;
46}