From 0e370b31ba98ec85720a4a5295b995348c247d3c Mon Sep 17 00:00:00 2001 From: Timerix22 Date: Sat, 23 Mar 2024 01:42:15 +0500 Subject: [PATCH] kprintf args count check --- src/kprint/kprintf.c | 16 ++++++++++++---- src/kprint/kprintf.h | 9 ++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/kprint/kprintf.c b/src/kprint/kprintf.c index e0a193a..f958b62 100644 --- a/src/kprint/kprintf.c +++ b/src/kprint/kprintf.c @@ -45,13 +45,17 @@ WORD unixColorToWin(u8 c){ } #endif -i32 kprintf(const char* format, ...){ +i32 _kprintf(const char* format, const i32 args_count, ...){ va_list vl; - va_start(vl, format); + va_start(vl, args_count); i32 i = 0; + i32 args_left = args_count; for(char c = format[i++]; c != 0; c = format[i++]){ // value format specifiers if(c == '%'){ + if(args_left-- == 0) + return kprintf_NOT_ENOUGH_ARGUMENTS; + char* argstr = NULL; bool l = false; c = format[i++]; @@ -152,17 +156,21 @@ i32 kprintf(const char* format, ...){ } -i32 ksprintf(char* buffer, i32 buffer_size, const char* format, ...){ +i32 _ksprintf(char* buffer, i32 buffer_size, const char* format, const i32 args_count, ...){ if(buffer == NULL) return kprintf_BUFFER_IS_NULL; va_list vl; - va_start(vl, format); + va_start(vl, args_count); i32 i = 0; i32 written = 0; + i32 args_left = args_count; for(char c = format[i++]; c != 0; c = format[i++]){ // value format specifiers if(c == '%'){ + if(args_left-- == 0) + return kprintf_NOT_ENOUGH_ARGUMENTS; + char* argstr = NULL; bool l = false; c = format[i++]; diff --git a/src/kprint/kprintf.h b/src/kprint/kprintf.h index 6d503de..9a9ee2c 100644 --- a/src/kprint/kprintf.h +++ b/src/kprint/kprintf.h @@ -7,15 +7,18 @@ extern "C" { #include "../base/type_system/base_toString.h" #define kprintf_INVALID_FORMAT -1 -#define kprintf_BUFFER_IS_NULL -2 +#define kprintf_NOT_ENOUGH_ARGUMENTS -2 #define kprintf_BUFFER_IS_TOO_SMALL -3 +#define kprintf_BUFFER_IS_NULL -4 /// cross-platform printf analog ///@return number of processed format string characters or error code -i32 kprintf(const char* format, ...); +i32 _kprintf(const char* format, const i32 args_count, ...); +#define kprintf(FORMAT, ARGS... ) _kprintf(FORMAT, count_args(ARGS) ,##ARGS) /// @return number of processed format string characters or error code -i32 ksprintf(char* buffer, i32 buffer_size, const char* format, ...); +i32 _ksprintf(char* buffer, i32 buffer_size, const char* format, const i32 args_count, ...); +#define ksprintf(BUFFER, BUFFER_SIZE, FORMAT, ARGS... ) _ksprintf(BUFFER, BUFFER_SIZE, FORMAT, count_args(ARGS) ,##ARGS) // printf format terminal color sequence