aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRay <raysan5@gmail.com>2019-02-11 18:02:32 +0100
committerRay <raysan5@gmail.com>2019-02-11 18:02:32 +0100
commit6dbec4748858d84ecf48837270fb040c3de0aac8 (patch)
treef15022b16f95f1bfd5a5b157cc0e194503f28b39 /src
parentdde99f45d95f06445abe3ca1da96a50cb1381dfa (diff)
downloadraylib-6dbec4748858d84ecf48837270fb040c3de0aac8.tar.gz
raylib-6dbec4748858d84ecf48837270fb040c3de0aac8.zip
Redesigned TextSplit() function
Diffstat (limited to 'src')
-rw-r--r--src/text.c78
1 files changed, 24 insertions, 54 deletions
diff --git a/src/text.c b/src/text.c
index 464c0f02..a6253ffd 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1180,70 +1180,40 @@ const char *TextJoin(const char **textList, int count, const char *delimiter)
}
// Split string into multiple strings
-// REQUIRES: strlen(), strcpy(), strtok()
-// WARNING: Allocated memory should be manually freed
-char **TextSplit(const char *text, char delimiter, int *count)
+const char **TextSplit(const char *text, char delimiter, int *count)
{
- #define MAX_SUBSTRING_LENGTH 128
+ // NOTE: Current implementation returns a copy of the provided string with '\0' (string end delimiter)
+ // inserted between strings defined by "delimiter" parameter. No memory is dynamically allocated,
+ // all used memory is static... it has some limitations:
+ // 1. Maximum number of possible split strings is set by MAX_SUBSTRINGS_COUNT
+ // 2. Maximum size of text to split is MAX_TEXT_BUFFER_LENGTH
- // TODO: Allocate memory properly for every substring size
-
- char **result = NULL;
+ #define MAX_SUBSTRINGS_COUNT 64
- int len = strlen(text);
- char *textcopy = (char *)malloc(len + 1);
- strcpy(textcopy, text);
- int counter = 1;
-
- // Count how many substrings we have on text and init memory for each of them
- for (int i = 0; i < len; i++) if (text[i] == delimiter) counter++;
-
- // Memory allocation for substrings
- result = (char **)malloc(sizeof(char *)*counter);
- for (int i = 0; i < counter; i++) result[i] = (char *)malloc(sizeof(char)*MAX_SUBSTRING_LENGTH);
-
- char *substrPtr = NULL;
- char delimiters[1] = { delimiter }; // Only caring for one delimiter
- substrPtr = strtok(textcopy, delimiters);
-
- for (int i = 0; (i < counter) && (substrPtr != NULL); i++)
- {
- strcpy(result[i], substrPtr);
- substrPtr = strtok(NULL, delimiters);
- }
-
- *count = counter;
- free(textcopy);
-
- return result;
-}
-
-// Get pointers to substrings separated by delimiter
-void TextSplitEx(const char *text, char delimiter, int *count, const char **ptrs, int *lengths)
-{
- int elementsCount = 0;
- int charsCount = 0;
+ static const char *result[MAX_SUBSTRINGS_COUNT] = { NULL };
+ static char buffer[MAX_TEXT_BUFFER_LENGTH] = { 0 };
+ memset(buffer, 0, MAX_TEXT_BUFFER_LENGTH);
- ptrs[0] = text;
+ result[0] = buffer;
+ int counter = 1;
- for (int i = 0; text[i] != '\0'; i++)
+ // Count how many substrings we have on text and point to every one
+ for (int i = 0; i < MAX_TEXT_BUFFER_LENGTH; i++)
{
- charsCount++;
-
- if (text[i] == delimiter)
+ buffer[i] = text[i];
+ if (buffer[i] == '\0') break;
+ else if (buffer[i] == delimiter)
{
- lengths[elementsCount] = charsCount - 1;
- charsCount = 0;
- elementsCount++;
-
- ptrs[elementsCount] = &text[i + 1];
+ buffer[i] = '\0'; // Set an end of string at this point
+ result[counter] = buffer + i + 1;
+ counter++;
+
+ if (counter == MAX_SUBSTRINGS_COUNT) break;
}
}
- lengths[elementsCount] = charsCount;
- elementsCount++;
-
- *count = elementsCount;
+ *count = counter;
+ return result;
}
// Append text at specific position and move cursor!