diff --git a/src/modules/os.c b/src/modules/os.c index a638a9b9f..2109e6ac8 100644 --- a/src/modules/os.c +++ b/src/modules/os.c @@ -89,54 +89,58 @@ void ffPrintOS(FFinstance* instance) return; } - FF_STRBUF_CREATE(os); + FFstrbuf os; + ffStrbufInit(&os); + + //Create the basic output - //Name if(result->name.length > 0) ffStrbufAppend(&os, &result->name); + else if(result->prettyName.length > 0) + ffStrbufAppend(&os, &result->name); else if(result->id.length > 0) ffStrbufAppend(&os, &result->id); - else if(result->prettyName.length > 0) - ffStrbufAppend(&os, &result->prettyName); - else + else if(result->systemName.length > 0) ffStrbufAppend(&os, &result->systemName); + else + ffStrbufAppendS(&os, "Linux"); - //Version - if(result->versionID.length > 0) + //Append version if it is missing + + if(result->versionID.length > 0 && ffStrbufFirstIndex(&os, &result->versionID) == os.length) { ffStrbufAppendC(&os, ' '); ffStrbufAppend(&os, &result->versionID); } - else if(result->version.length > 0) + else if(result->versionID.length == 0 && result->version.length > 0 && ffStrbufFirstIndex(&os, &result->version) == os.length) { ffStrbufAppendC(&os, ' '); ffStrbufAppend(&os, &result->version); } - //Codename - if(result->codename.length > 0) - { - ffStrbufAppendC(&os, ' '); - ffStrbufAppend(&os, &result->codename); - } + //Append variant if it is missing - //Variant - if(result->variant.length > 0) + if(result->variant.length > 0 && ffStrbufFirstIndex(&os, &result->variant) == os.length) { - ffStrbufAppendS(&os, " ["); + ffStrbufAppendS(&os, " ("); ffStrbufAppend(&os, &result->variant); - ffStrbufAppendC(&os, ']'); + ffStrbufAppendC(&os, ')'); } - else if(result->variantID.length > 0) + else if(result->variant.length == 0 && result->variantID.length > 0 && ffStrbufFirstIndex(&os, &result->variantID) == os.length) { - ffStrbufAppendS(&os, " ["); + ffStrbufAppendS(&os, " ("); ffStrbufAppend(&os, &result->variantID); - ffStrbufAppendC(&os, ']'); + ffStrbufAppendC(&os, ')'); } - ffStrbufAppendS(&os, " ("); - ffStrbufAppend(&os, &result->architecture); - ffStrbufAppendC(&os, ')'); + //Append architecture if it is missing + + if(ffStrbufFirstIndex(&os, &result->architecture) == os.length) + { + ffStrbufAppendS(&os, " ["); + ffStrbufAppend(&os, &result->architecture); + ffStrbufAppendC(&os, ']'); + } ffPrintAndSaveToCache(instance, FF_OS_MODULE_NAME, &instance->config.osKey, &os, &instance->config.osFormat, FF_OS_NUM_FORMAT_ARGS, (FFformatarg[]){ {FF_FORMAT_ARG_TYPE_STRBUF, &result->systemName}, diff --git a/src/util/FFstrbuf.c b/src/util/FFstrbuf.c index f0f510b9a..1c6f8baec 100644 --- a/src/util/FFstrbuf.c +++ b/src/util/FFstrbuf.c @@ -4,6 +4,16 @@ #include #include +static bool strbufCharsLeft(uint32_t i, const void* strbuf) +{ + return i < ((const FFstrbuf*) strbuf)->length; +} + +static bool strbufCharsLeftS(uint32_t i, const void* str) +{ + return ((const char*) str)[i] != '\0'; +} + void ffStrbufInit(FFstrbuf* strbuf) { ffStrbufInitA(strbuf, FASTFETCH_STRBUF_DEFAULT_ALLOC); @@ -391,23 +401,18 @@ uint32_t ffStrbufNextIndexC(const FFstrbuf* strbuf, uint32_t start, char c) return strbuf->length; } -uint32_t ffStrbufFirstIndexC(const FFstrbuf* strbuf, char c) -{ - return ffStrbufNextIndexC(strbuf, 0, c); -} - -uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* str) +static uint32_t strbufNextIndex(const FFstrbuf* strbuf, uint32_t start, const char* chars, const void* container, bool(*charsLeft)(uint32_t, const void*)) { for(uint32_t i = start; i < strbuf->length; i++) { bool found = true; - for(uint32_t k = 0; str[k] != '\0'; k++) + for(uint32_t k = 0; charsLeft(k, container); k++) { if(i + k == strbuf->length) return strbuf->length; - if(strbuf->chars[i + k] != str[k]) + if(strbuf->chars[i + k] != chars[k]) { found = false; break; @@ -421,6 +426,26 @@ uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* return strbuf->length; } +uint32_t ffStrbufNextIndex(const FFstrbuf* strbuf, uint32_t start, const FFstrbuf* searched) +{ + return strbufNextIndex(strbuf, start, searched->chars, searched, strbufCharsLeft); +} + +uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* str) +{ + return strbufNextIndex(strbuf, start, str, str, strbufCharsLeftS); +} + +uint32_t ffStrbufFirstIndexC(const FFstrbuf* strbuf, char c) +{ + return ffStrbufNextIndexC(strbuf, 0, c); +} + +uint32_t ffStrbufFirstIndex(const FFstrbuf* strbuf, const FFstrbuf* searched) +{ + return ffStrbufNextIndex(strbuf, 0, searched); +} + uint32_t ffStrbufFirstIndexS(const FFstrbuf* strbuf, const char* str) { return ffStrbufNextIndexS(strbuf, 0, str); diff --git a/src/util/FFstrbuf.h b/src/util/FFstrbuf.h index c1464bc00..3f5feca46 100644 --- a/src/util/FFstrbuf.h +++ b/src/util/FFstrbuf.h @@ -73,9 +73,13 @@ void ffStrbufRemoveStringsV(FFstrbuf* strbuf, uint32_t numStrings, va_list argum void ffStrbufRemoveStrings(FFstrbuf* strbuf, uint32_t numStrings, ...); uint32_t ffStrbufNextIndexC(const FFstrbuf* strbuf, uint32_t start, char c); -uint32_t ffStrbufFirstIndexC(const FFstrbuf* strbuf, char c); +uint32_t ffStrbufNextIndex(const FFstrbuf* strbuf, uint32_t start, const FFstrbuf* searched); uint32_t ffStrbufNextIndexS(const FFstrbuf* strbuf, uint32_t start, const char* str); + +uint32_t ffStrbufFirstIndexC(const FFstrbuf* strbuf, char c); +uint32_t ffStrbufFirstIndex(const FFstrbuf* strbuf, const FFstrbuf* searched); uint32_t ffStrbufFirstIndexS(const FFstrbuf* strbuf, const char* str); + uint32_t ffStrbufPreviousIndexC(const FFstrbuf* strbuf, uint32_t start, char c); uint32_t ffStrbufLastIndexC(const FFstrbuf* strbuf, char c);