From a971fb6e945d2dc81050f1a93e9a0e9a994d2647 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sat, 2 Oct 2021 22:43:55 +0100 Subject: [PATCH] Make `TextFormat` use static internal buffers; Add `TextFormatAlloc` --- vendor/raylib/raylib.odin | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/vendor/raylib/raylib.odin b/vendor/raylib/raylib.odin index b9f3ce9eb..533801beb 100644 --- a/vendor/raylib/raylib.odin +++ b/vendor/raylib/raylib.odin @@ -10,6 +10,9 @@ when USE_LINALG { import "core:math/linalg" } +MAX_TEXTFORMAT_BUFFERS :: #config(RAYLIB_MAX_TEXTFORMAT_BUFFERS, 4) +MAX_TEXT_BUFFER_LENGTH :: #config(RAYLIB_MAX_TEXT_BUFFER_LENGTH, 1024) + #assert(size_of(rune) == size_of(c.int)) when ODIN_OS == "windows" { @@ -1404,8 +1407,25 @@ foreign lib { } + // Text formatting with variables (sprintf style) TextFormat :: proc(text: cstring, args: ..any) -> cstring { + @static buffers: [MAX_TEXTFORMAT_BUFFERS][MAX_TEXT_BUFFER_LENGTH]byte + @static index: u32 + + buffer := buffers[index][:] + mem.zero_slice(buffer) + + index = (index+1)%MAX_TEXTFORMAT_BUFFERS + + str := fmt.bprintf(buffer[:len(buffer)-1], string(text), ..args) + buffer[len(str)] = 0 + + return cstring(raw_data(buffer)) +} + +// Text formatting with variables (sprintf style) and allocates (must be freed with 'MemFree') +TextFormatAlloc :: proc(text: cstring, args: ..any) -> cstring { str := fmt.tprintf(string(text), ..args) return strings.clone_to_cstring(str, MemAllocator()) }