mirror of
https://github.com/fastfetch-cli/fastfetch.git
synced 2026-09-13 10:52:08 +02:00
FFstrbuf: adds more functions to match separated strings
1. ffStrbufMatchSeparatedIgnCaseNS 2. ffStrbufSeparatedContainNS 3. ffStrbufSeparatedContainNS
This commit is contained in:
+65
-1
@@ -730,7 +730,7 @@ bool ffStrbufRemoveDupWhitespaces(FFstrbuf* strbuf)
|
||||
return changed;
|
||||
}
|
||||
|
||||
/// @brief Check if a separated string contains a substring.
|
||||
/// @brief Check if a separated string (comp) contains a substring (strbuf).
|
||||
/// @param strbuf The substring to check.
|
||||
/// @param compLength The length of the separated string to check.
|
||||
/// @param comp The separated string to check.
|
||||
@@ -759,6 +759,31 @@ bool ffStrbufMatchSeparatedNS(const FFstrbuf* strbuf, uint32_t compLength, const
|
||||
return false;
|
||||
}
|
||||
|
||||
/// @brief Case insensitive version of ffStrbufMatchSeparatedNS.
|
||||
bool ffStrbufMatchSeparatedIgnCaseNS(const FFstrbuf* strbuf, uint32_t compLength, const char* comp, char separator)
|
||||
{
|
||||
if (strbuf->length == 0)
|
||||
return true;
|
||||
|
||||
if (compLength == 0)
|
||||
return false;
|
||||
|
||||
for (const char* p = comp; p < comp + compLength;)
|
||||
{
|
||||
const char* colon = memchr(p, separator, compLength);
|
||||
if (colon == NULL)
|
||||
return strcasecmp(strbuf->chars, p) == 0;
|
||||
|
||||
uint32_t substrLength = (uint32_t) (colon - p);
|
||||
if (strbuf->length == substrLength && strncasecmp(strbuf->chars, p, substrLength) == 0)
|
||||
return true;
|
||||
|
||||
p = colon + 1;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int ffStrbufAppendUtf32CodePoint(FFstrbuf* strbuf, uint32_t codepoint)
|
||||
{
|
||||
if (codepoint <= 0x7F) {
|
||||
@@ -790,3 +815,42 @@ int ffStrbufAppendUtf32CodePoint(FFstrbuf* strbuf, uint32_t codepoint)
|
||||
ffStrbufAppendS(strbuf, "�"); // U+FFFD REPLACEMENT CHARACTER
|
||||
return 1;
|
||||
}
|
||||
|
||||
/// @brief Check if a separated string (strbuf) contains a substring (comp).
|
||||
/// @param strbuf The separated to check.
|
||||
/// @param compLength The length of the separated string to check.
|
||||
/// @param comp The substring to check.
|
||||
/// @param separator The separator character.
|
||||
bool ffStrbufSeparatedContainNS(const FFstrbuf* strbuf, uint32_t compLength, const char* comp, char separator)
|
||||
{
|
||||
uint32_t startIndex = 0;
|
||||
while(startIndex < strbuf->length)
|
||||
{
|
||||
uint32_t colonIndex = ffStrbufNextIndexC(strbuf, startIndex, separator);
|
||||
|
||||
uint32_t folderLength = colonIndex - startIndex;
|
||||
if (folderLength == compLength && memcmp(strbuf->chars + startIndex, comp, compLength) == 0)
|
||||
return true;
|
||||
|
||||
startIndex = colonIndex + 1;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ffStrbufSeparatedContainIgnCaseNS(const FFstrbuf* strbuf, uint32_t compLength, const char* comp, char separator)
|
||||
{
|
||||
uint32_t startIndex = 0;
|
||||
while(startIndex < strbuf->length)
|
||||
{
|
||||
uint32_t colonIndex = ffStrbufNextIndexC(strbuf, startIndex, separator);
|
||||
|
||||
uint32_t folderLength = colonIndex - startIndex;
|
||||
if (folderLength == compLength && strncasecmp(strbuf->chars + startIndex, comp, compLength) == 0)
|
||||
return true;
|
||||
|
||||
startIndex = colonIndex + 1;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -100,6 +100,9 @@ bool ffStrbufGetline(char** lineptr, size_t* n, FFstrbuf* buffer);
|
||||
void ffStrbufGetlineRestore(char** lineptr, size_t* n, FFstrbuf* buffer);
|
||||
bool ffStrbufRemoveDupWhitespaces(FFstrbuf* strbuf);
|
||||
bool ffStrbufMatchSeparatedNS(const FFstrbuf* strbuf, uint32_t compLength, const char* comp, char separator);
|
||||
bool ffStrbufMatchSeparatedIgnCaseNS(const FFstrbuf* strbuf, uint32_t compLength, const char* comp, char separator);
|
||||
bool ffStrbufSeparatedContainNS(const FFstrbuf* strbuf, uint32_t compLength, const char* comp, char separator);
|
||||
bool ffStrbufSeparatedContainIgnCaseNS(const FFstrbuf* strbuf, uint32_t compLength, const char* comp, char separator);
|
||||
|
||||
int ffStrbufAppendUtf32CodePoint(FFstrbuf* strbuf, uint32_t codepoint);
|
||||
|
||||
@@ -566,4 +569,34 @@ static inline bool ffStrbufMatchSeparated(const FFstrbuf* strbuf, const FFstrbuf
|
||||
return ffStrbufMatchSeparatedNS(strbuf, comp->length, comp->chars, separator);
|
||||
}
|
||||
|
||||
static inline bool ffStrbufMatchSeparatedIgnCaseS(const FFstrbuf* strbuf, const char* comp, char separator)
|
||||
{
|
||||
return ffStrbufMatchSeparatedIgnCaseNS(strbuf, (uint32_t) strlen(comp), comp, separator);
|
||||
}
|
||||
|
||||
static inline bool ffStrbufMatchSeparatedIgnCase(const FFstrbuf* strbuf, const FFstrbuf* comp, char separator)
|
||||
{
|
||||
return ffStrbufMatchSeparatedIgnCaseNS(strbuf, comp->length, comp->chars, separator);
|
||||
}
|
||||
|
||||
static inline bool ffStrbufSeparatedContainS(const FFstrbuf* strbuf, const char* comp, char separator)
|
||||
{
|
||||
return ffStrbufSeparatedContainNS(strbuf, (uint32_t) strlen(comp), comp, separator);
|
||||
}
|
||||
|
||||
static inline bool ffStrbufSeparatedContain(const FFstrbuf* strbuf, const FFstrbuf* comp, char separator)
|
||||
{
|
||||
return ffStrbufSeparatedContainNS(strbuf, comp->length, comp->chars, separator);
|
||||
}
|
||||
|
||||
static inline bool ffStrbufSeparatedContainIgnCaseS(const FFstrbuf* strbuf, const char* comp, char separator)
|
||||
{
|
||||
return ffStrbufSeparatedContainIgnCaseNS(strbuf, (uint32_t) strlen(comp), comp, separator);
|
||||
}
|
||||
|
||||
static inline bool ffStrbufSeparatedContainIgnCase(const FFstrbuf* strbuf, const FFstrbuf* comp, char separator)
|
||||
{
|
||||
return ffStrbufSeparatedContainIgnCaseNS(strbuf, comp->length, comp->chars, separator);
|
||||
}
|
||||
|
||||
#define FF_STRBUF_AUTO_DESTROY FFstrbuf __attribute__((__cleanup__(ffStrbufDestroy)))
|
||||
|
||||
@@ -663,6 +663,48 @@ int main(void)
|
||||
VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":abc:", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedS(&strbuf, "abc:", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":abc", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":ABC", ':') == false);
|
||||
VERIFY(ffStrbufMatchSeparatedS(&strbuf, ":abcdef", ':') == false);
|
||||
}
|
||||
|
||||
{
|
||||
ffStrbufSetStatic(&strbuf, "ABC");
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "abc:def:ghi", ' ') == false);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "abc:def:ghi", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "def:ghi", ' ') == false);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "def:ghi", ':') == false);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "def", ':') == false);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "abc", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "", ' ') == false);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, ":abc:", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, "abc:", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, ":abc", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, ":ABC", ':') == true);
|
||||
VERIFY(ffStrbufMatchSeparatedIgnCaseS(&strbuf, ":abcdef", ':') == false);
|
||||
}
|
||||
|
||||
{
|
||||
ffStrbufSetStatic(&strbuf, "abc:def:ghi");
|
||||
VERIFY(ffStrbufSeparatedContainS(&strbuf, "abc", ' ') == false);
|
||||
VERIFY(ffStrbufSeparatedContainS(&strbuf, "abc", ':') == true);
|
||||
VERIFY(ffStrbufSeparatedContainS(&strbuf, "def", ' ') == false);
|
||||
VERIFY(ffStrbufSeparatedContainS(&strbuf, "def", ':') == true);
|
||||
VERIFY(ffStrbufSeparatedContainS(&strbuf, "DEF", ':') == false);
|
||||
VERIFY(ffStrbufSeparatedContainS(&strbuf, "a", ':') == false);
|
||||
VERIFY(ffStrbufSeparatedContainS(&strbuf, "e", ':') == false);
|
||||
VERIFY(ffStrbufSeparatedContainS(&strbuf, "i", ':') == false);
|
||||
}
|
||||
|
||||
{
|
||||
ffStrbufSetStatic(&strbuf, "ABC:DEF:GHI");
|
||||
VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "abc", ' ') == false);
|
||||
VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "abc", ':') == true);
|
||||
VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "def", ' ') == false);
|
||||
VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "def", ':') == true);
|
||||
VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "DEF", ':') == true);
|
||||
VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "a", ':') == false);
|
||||
VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "e", ':') == false);
|
||||
VERIFY(ffStrbufSeparatedContainIgnCaseS(&strbuf, "i", ':') == false);
|
||||
}
|
||||
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user