From 08e9348db712c9f73e558faaed5e497064a6e90c Mon Sep 17 00:00:00 2001 From: Brett Date: Wed, 11 Oct 2023 04:29:25 -0400 Subject: [PATCH] [rtext] TextFormat now alerts user to truncation. --- src/rcore.c | 13 ++++++++++++- src/rtext.c | 12 +++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/rcore.c b/src/rcore.c index fa8f50d86..c96bf3e6c 100644 --- a/src/rcore.c +++ b/src/rcore.c @@ -2876,6 +2876,7 @@ static void PlayAutomationEvent(unsigned int frame) #if !defined(SUPPORT_MODULE_RTEXT) // Formatting of text with variables to 'embed' // WARNING: String returned will expire after this function is called MAX_TEXTFORMAT_BUFFERS times + const char *TextFormat(const char *text, ...) { #ifndef MAX_TEXTFORMAT_BUFFERS @@ -2894,12 +2895,22 @@ const char *TextFormat(const char *text, ...) va_list args; va_start(args, text); - vsnprintf(currentBuffer, MAX_TEXT_BUFFER_LENGTH, text, args); + int charCountRequired = vsnprintf(currentBuffer, MAX_TEXT_BUFFER_LENGTH, text, args); va_end(args); + // If charCountRequired is larger than the MAX_TEXT_BUFFER_LENGTH, then overflow occured + if(charCountRequired > MAX_TEXT_BUFFER_LENGTH) + { + // We are going to insert [TRUN] at the end of the string so the user knows what happened + char *truncBuffer = buffers[index] + MAX_TEXT_BUFFER_LENGTH - 7; // 7 = six letters + '\0' + sprintf(truncBuffer, "[TRUN]"); + TRACELOG(LOG_WARNING, "RTEXT: TextFormat string was [TRUN]cated. If you need longer strings, please increase MAX_TEXT_BUFFER_LENGTH."); + } + index += 1; // Move to next buffer for next function call if (index >= MAX_TEXTFORMAT_BUFFERS) index = 0; return currentBuffer; } + #endif // !SUPPORT_MODULE_RTEXT diff --git a/src/rtext.c b/src/rtext.c index fb8440131..690c7f714 100644 --- a/src/rtext.c +++ b/src/rtext.c @@ -1371,15 +1371,25 @@ const char *TextFormat(const char *text, ...) va_list args; va_start(args, text); - vsnprintf(currentBuffer, MAX_TEXT_BUFFER_LENGTH, text, args); + charCountRequired = vsnprintf(currentBuffer, MAX_TEXT_BUFFER_LENGTH, text, args); va_end(args); + // If charCountRequired is larger than the MAX_TEXT_BUFFER_LENGTH, then overflow occured + if(charCountRequired > MAX_TEXT_BUFFER_LENGTH) + { + // We are going to insert [TRUN] at the end of the string so the user knows what happened + char *truncBuffer = buffers[index] + MAX_TEXT_BUFFER_LENGTH - 7; // 7 = six letters + '\0' + sprintf(truncBuffer, "[TRUN]"); + TRACELOG(LOG_WARNING, "RTEXT: TextFormat string was [TRUN]cated. If you need longer strings, please increase MAX_TEXT_BUFFER_LENGTH."); + } + index += 1; // Move to next buffer for next function call if (index >= MAX_TEXTFORMAT_BUFFERS) index = 0; return currentBuffer; } + // Get integer value from text // NOTE: This function replaces atoi() [stdlib.h] int TextToInteger(const char *text)