master ohmu/fastfetch-openbsd / src / common / impl / parsing.c
ohmu  ·  2026-10-15
  1#include "fastfetch.h"
  2#include "common/parsing.h"
  3
  4#ifdef _WIN32
  5    #pragma GCC diagnostic push
  6    #pragma GCC diagnostic ignored "-Wformat"
  7#endif
  8
  9void ffParseSemver(FFstrbuf* buffer, const FFstrbuf* major, const FFstrbuf* minor, const FFstrbuf* patch) {
 10    if (major->length > 0) {
 11        ffStrbufAppend(buffer, major);
 12    } else if (minor->length > 0 || patch->length > 0) {
 13        ffStrbufAppendC(buffer, '1');
 14    }
 15
 16    if (minor->length == 0 && patch->length == 0) {
 17        return;
 18    }
 19
 20    ffStrbufAppendC(buffer, '.');
 21
 22    if (minor->length > 0) {
 23        ffStrbufAppend(buffer, minor);
 24    } else if (patch->length > 0) {
 25        ffStrbufAppendC(buffer, '0');
 26    }
 27
 28    if (patch->length == 0) {
 29        return;
 30    }
 31
 32    ffStrbufAppendC(buffer, '.');
 33
 34    ffStrbufAppend(buffer, patch);
 35}
 36
 37int8_t ffVersionCompare(const FFVersion* version1, const FFVersion* version2) {
 38    if (version1->major != version2->major) {
 39        return version1->major > version2->major ? 1 : -1;
 40    }
 41
 42    if (version1->minor != version2->minor) {
 43        return version1->minor > version2->minor ? 1 : -1;
 44    }
 45
 46    if (version1->patch != version2->patch) {
 47        return version1->patch > version2->patch ? 1 : -1;
 48    }
 49
 50    return 0;
 51}
 52
 53void ffVersionToPretty(const FFVersion* version, FFstrbuf* pretty) {
 54    if (version->major > 0 || version->minor > 0 || version->patch > 0) {
 55        ffStrbufAppendUInt(pretty, version->major);
 56    }
 57
 58    if (version->minor > 0 || version->patch > 0) {
 59        ffStrbufAppendC(pretty, '.');
 60        ffStrbufAppendUInt(pretty, version->minor);
 61    }
 62
 63    if (version->patch > 0) {
 64        ffStrbufAppendC(pretty, '.');
 65        ffStrbufAppendUInt(pretty, version->patch);
 66    }
 67}
 68
 69void ffParseGTK(FFstrbuf* buffer, const FFstrbuf* gtk2, const FFstrbuf* gtk3, const FFstrbuf* gtk4) {
 70    if (gtk2->length > 0 && gtk3->length > 0 && gtk4->length > 0) {
 71        if ((ffStrbufIgnCaseEqual(gtk2, gtk3)) && (ffStrbufIgnCaseEqual(gtk2, gtk4))) {
 72            ffStrbufAppend(buffer, gtk4);
 73            ffStrbufAppendS(buffer, " [GTK2/3/4]");
 74        } else if (ffStrbufIgnCaseEqual(gtk2, gtk3)) {
 75            ffStrbufAppend(buffer, gtk3);
 76            ffStrbufAppendS(buffer, " [GTK2/3], ");
 77            ffStrbufAppend(buffer, gtk4);
 78            ffStrbufAppendS(buffer, " [GTK4]");
 79        } else if (ffStrbufIgnCaseEqual(gtk3, gtk4)) {
 80            ffStrbufAppend(buffer, gtk2);
 81            ffStrbufAppendS(buffer, " [GTK2], ");
 82            ffStrbufAppend(buffer, gtk4);
 83            ffStrbufAppendS(buffer, " [GTK3/4]");
 84        } else {
 85            ffStrbufAppend(buffer, gtk2);
 86            ffStrbufAppendS(buffer, " [GTK2], ");
 87            ffStrbufAppend(buffer, gtk3);
 88            ffStrbufAppendS(buffer, " [GTK3], ");
 89            ffStrbufAppend(buffer, gtk4);
 90            ffStrbufAppendS(buffer, " [GTK4]");
 91        }
 92    } else if (gtk2->length > 0 && gtk3->length > 0) {
 93        if (ffStrbufIgnCaseEqual(gtk2, gtk3)) {
 94            ffStrbufAppend(buffer, gtk3);
 95            ffStrbufAppendS(buffer, " [GTK2/3]");
 96        } else {
 97            ffStrbufAppend(buffer, gtk2);
 98            ffStrbufAppendS(buffer, " [GTK2], ");
 99            ffStrbufAppend(buffer, gtk3);
100            ffStrbufAppendS(buffer, " [GTK3]");
101        }
102    } else if (gtk2->length > 0 && gtk4->length > 0) {
103        if (ffStrbufIgnCaseEqual(gtk2, gtk4)) {
104            ffStrbufAppend(buffer, gtk4);
105            ffStrbufAppendS(buffer, " [GTK2/4]");
106        } else {
107            ffStrbufAppend(buffer, gtk2);
108            ffStrbufAppendS(buffer, " [GTK2], ");
109            ffStrbufAppend(buffer, gtk4);
110            ffStrbufAppendS(buffer, " [GTK4]");
111        }
112    } else if (gtk3->length > 0 && gtk4->length > 0) {
113        if (ffStrbufIgnCaseEqual(gtk3, gtk4)) {
114            ffStrbufAppend(buffer, gtk4);
115            ffStrbufAppendS(buffer, " [GTK3/4]");
116        } else {
117            ffStrbufAppend(buffer, gtk3);
118            ffStrbufAppendS(buffer, " [GTK3], ");
119            ffStrbufAppend(buffer, gtk4);
120            ffStrbufAppendS(buffer, " [GTK4]");
121        }
122    } else if (gtk2->length > 0) {
123        ffStrbufAppend(buffer, gtk2);
124        ffStrbufAppendS(buffer, " [GTK2]");
125    } else if (gtk3->length > 0) {
126        ffStrbufAppend(buffer, gtk3);
127        ffStrbufAppendS(buffer, " [GTK3]");
128    } else if (gtk4->length > 0) {
129        ffStrbufAppend(buffer, gtk4);
130        ffStrbufAppendS(buffer, " [GTK4]");
131    }
132}
133
134#ifdef _WIN32
135    #pragma GCC diagnostic pop
136#endif