diff --git a/src/string.cpp b/src/string.cpp --- a/src/string.cpp +++ b/src/string.cpp @@ -302,6 +302,66 @@ bool StrValid(const char *str, const cha return *str == '\0'; } +/** + * Trim the spaces from the begin of given string in place, i.e. the string buffer + * that is passed will be modified whenever spaces exist in the given string. + * When there are spaces at the begin, the whole string is moved forward. + * @param str The string to perform the in place left trimming on. + */ +static void StrLeftTrimInPlace(char *str) +{ + if (StrEmpty(str)) return; + + char *first_non_space = str; + while (*first_non_space == ' ') first_non_space++; + + if (first_non_space == str) return; + + /* The source will reach '\0' first, but set the '\0' on the destination afterwards. */ + char *dst = str; + for (char *src = first_non_space; *src != '\0'; dst++, src++) *dst = *src; + *dst = '\0'; +} + +/** + * Trim the spaces from the end of given string in place, i.e. the string buffer + * that is passed will be modified whenever spaces exist in the given string. + * When there are spaces at the end, the '\0' will be moved forward. + * @param str The string to perform the in place left trimming on. + */ +static void StrRightTrimInPlace(char *str) +{ + if (StrEmpty(str)) return; + + char *end = str; + while (*end != '\0') end++; + + char *last_non_space = end - 1; + while (last_non_space >= str && *last_non_space == ' ') last_non_space--; + + /* The last non space points to the last character of the string that is not + * a space. For a string with only spaces or an empty string this would be + * the position before the begin of the string. The previous search ensures + * that this location before the string is not read. + * In any case, the character after the last non space character will be + * either a space or the existing termination, so it can be set to '\0'. + */ + last_non_space[1] = '\0'; +} + +/** + * Trim the spaces from given string in place, i.e. the string buffer that + * is passed will be modified whenever spaces exist in the given string. + * When there are spaces at the begin, the whole string is moved forward + * and when there are spaces at the back the '\0' termination is moved. + * @param str The string to perform the in place trimming on. + */ +void StrTrimInPlace(char *str) +{ + StrLeftTrimInPlace(str); + StrRightTrimInPlace(str); +} + /** Scans the string for colour codes and strips them */ void str_strip_colours(char *str) {