From d2f6c4924c36a8441d35ed944efd5c772f56d698 Mon Sep 17 00:00:00 2001 From: Ray Date: Tue, 26 Aug 2025 10:17:33 +0200 Subject: [PATCH] ADDED: [rtext] `LoadTextLines()`/`UnloadTextLines()` --- src/raylib.h | 3 ++- src/rtext.c | 34 ++++++++++++++++++++++++++++++++++ tools/rexm/rexm.c | 38 -------------------------------------- 3 files changed, 36 insertions(+), 39 deletions(-) diff --git a/src/raylib.h b/src/raylib.h index c9fdab553..e58469856 100644 --- a/src/raylib.h +++ b/src/raylib.h @@ -1506,6 +1506,8 @@ RLAPI const char *CodepointToUTF8(int codepoint, int *utf8Size); // Text strings management functions (no UTF-8 strings, only byte chars) // WARNING 1: Most of these functions use internal static buffers, it's recommended to store returned data on user-side for re-use // WARNING 2: Some strings allocate memory internally for the returned strings, those strings must be free by user using MemFree() +RLAPI char **LoadTextLines(const char *text, int *count); // Load text as separate lines ('\n') +RLAPI void UnloadTextLines(char **text); // Unload text lines RLAPI int TextCopy(char *dst, const char *src); // Copy one string to another, returns bytes copied RLAPI bool TextIsEqual(const char *text1, const char *text2); // Check if two text string are equal RLAPI unsigned int TextLength(const char *text); // Get text length, checks for '\0' ending @@ -1522,7 +1524,6 @@ RLAPI char *TextToLower(const char *text); RLAPI char *TextToPascal(const char *text); // Get Pascal case notation version of provided string RLAPI char *TextToSnake(const char *text); // Get Snake case notation version of provided string RLAPI char *TextToCamel(const char *text); // Get Camel case notation version of provided string - RLAPI int TextToInteger(const char *text); // Get integer value from text RLAPI float TextToFloat(const char *text); // Get float value from text diff --git a/src/rtext.c b/src/rtext.c index 08efa79bf..f54c71aef 100644 --- a/src/rtext.c +++ b/src/rtext.c @@ -1415,6 +1415,40 @@ Rectangle GetGlyphAtlasRec(Font font, int codepoint) //---------------------------------------------------------------------------------- // Text strings management functions //---------------------------------------------------------------------------------- +// Load text as separate lines ('\n') +// WARNING: There is a limit set for number of lines and line-size +char **LoadTextLines(const char *text, int *count) +{ + #define MAX_TEXTLINES_COUNT 512 + #define MAX_TEXTLINES_LINE_LEN 512 + + char **lines = (char **)RL_CALLOC(MAX_TEXTLINES_COUNT, sizeof(char *)); + for (int i = 0; i < MAX_TEXTLINES_COUNT; i++) lines[i] = (char *)RL_CALLOC(MAX_TEXTLINES_LINE_LEN, 1); + int textSize = (int)strlen(text); + int k = 0; + + for (int i = 0, len = 0; (i < textSize) && (k < MAX_TEXTLINES_COUNT); i++) + { + if ((text[i] == '\n') || (len == (MAX_TEXTLINES_LINE_LEN - 1))) + { + strncpy(lines[k], &text[i - len], len); + len = 0; + k++; + } + else len++; + } + + *count += k; + return lines; +} + +// Unload text lines +void UnloadTextLines(char **lines) +{ + for (int i = 0; i < MAX_TEXTLINES_COUNT; i++) RL_FREE(lines[i]); + RL_FREE(lines); +} + // Get text length in bytes, check for \0 character unsigned int TextLength(const char *text) { diff --git a/tools/rexm/rexm.c b/tools/rexm/rexm.c index 6e171287a..9ab4950c8 100644 --- a/tools/rexm/rexm.c +++ b/tools/rexm/rexm.c @@ -148,11 +148,6 @@ static int UpdateRequiredFiles(void); static rlExampleInfo *LoadExamplesData(const char *fileName, const char *category, bool sort, int *exCount); static void UnloadExamplesData(rlExampleInfo *exInfo); -// Get text lines (by line-breaks '\n') -// WARNING: It does not copy text data, just returns line pointers -static char **LoadTextLines(const char *text, int *count); -static void UnloadTextLines(char **text); - // Load example info from file header static rlExampleInfo *LoadExampleInfo(const char *exFileName); static void UnloadExampleInfo(rlExampleInfo *exInfo); @@ -1775,39 +1770,6 @@ static int FileMove(const char *srcPath, const char *dstPath) return result; } -// Load text lines -static char **LoadTextLines(const char *text, int *count) -{ - #define MAX_TEXT_LINES 512 - #define MAX_TEXT_LINE_LEN 512 - - char **lines = (char **)RL_CALLOC(MAX_TEXT_LINES, sizeof(char *)); - for (int i = 0; i < MAX_TEXT_LINES; i++) lines[i] = (char *)RL_CALLOC(MAX_TEXT_LINE_LEN, 1); - int textSize = (int)strlen(text); - int k = 0; - - for (int i = 0, len = 0; (i < textSize) && (k < MAX_TEXT_LINES); i++) - { - if ((text[i] == '\n') || (len == (MAX_TEXT_LINE_LEN - 1))) - { - strncpy(lines[k], &text[i - len], len); - len = 0; - k++; - } - else len++; - } - - *count += k; - return lines; -} - -// Unload text lines -static void UnloadTextLines(char **lines) -{ - for (int i = 0; i < MAX_TEXT_LINES; i++) RL_FREE(lines[i]); - RL_FREE(lines); -} - // Get example info from example file header // NOTE: Expecting the example to follow raylib_example_template.c rlExampleInfo *LoadExampleInfo(const char *exFileName)