Skip to content

Commit a0174e8

Browse files
committed
Global: add new unit related options
1. `--<module>-space-before-unit` 2. `--duration-abbreviation` 3. various code refactoring and cleanups
1 parent 8be419c commit a0174e8

File tree

33 files changed

+556
-174
lines changed

33 files changed

+556
-174
lines changed

CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,10 +351,11 @@ file(GENERATE OUTPUT logo_builtin.h CONTENT "${LOGO_BUILTIN_H}")
351351
#######################
352352

353353
set(LIBFASTFETCH_SRC
354-
src/common/percent.c
355354
src/common/commandoption.c
355+
src/common/duration.c
356356
src/common/font.c
357357
src/common/format.c
358+
src/common/frequency.c
358359
src/common/init.c
359360
src/common/jsonconfig.c
360361
src/common/library.c
@@ -363,9 +364,11 @@ set(LIBFASTFETCH_SRC
363364
src/common/networking/networking_common.c
364365
src/common/option.c
365366
src/common/parsing.c
367+
src/common/percent.c
366368
src/common/printing.c
367369
src/common/properties.c
368370
src/common/settings.c
371+
src/common/size.c
369372
src/common/temps.c
370373
src/detection/bluetoothradio/bluetoothradio.c
371374
src/detection/bootmgr/bootmgr.c

doc/json_schema.json

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,24 @@
232232
}
233233
}
234234
},
235+
"spaceBeforeUnit": {
236+
"type": "string",
237+
"description": "Whether to put a space before the unit",
238+
"oneOf": [
239+
{
240+
"const": "default",
241+
"description": "Use the default behavior of the module"
242+
},
243+
{
244+
"const": "always",
245+
"description": "Always add a space before the unit"
246+
},
247+
{
248+
"const": "never",
249+
"description": "Never add a space before the unit"
250+
}
251+
]
252+
},
235253

236254

237255
"batteryFormat": {
@@ -923,6 +941,9 @@
923941
"minimum": 0,
924942
"maximum": 9,
925943
"default": 2
944+
},
945+
"spaceBeforeUnit": {
946+
"$ref": "#/$defs/spaceBeforeUnit"
926947
}
927948
}
928949
},
@@ -965,6 +986,9 @@
965986
"default": "light_red"
966987
}
967988
}
989+
},
990+
"spaceBeforeUnit": {
991+
"$ref": "#/$defs/spaceBeforeUnit"
968992
}
969993
}
970994
},
@@ -1037,6 +1061,9 @@
10371061
"default": "light_red"
10381062
}
10391063
}
1064+
},
1065+
"spaceBeforeUnit": {
1066+
"$ref": "#/$defs/spaceBeforeUnit"
10401067
}
10411068
}
10421069
},
@@ -1051,6 +1078,23 @@
10511078
"minimum": -1,
10521079
"maximum": 9,
10531080
"default": 2
1081+
},
1082+
"spaceBeforeUnit": {
1083+
"$ref": "#/$defs/spaceBeforeUnit"
1084+
}
1085+
}
1086+
},
1087+
"duration": {
1088+
"type": "object",
1089+
"description": "Set how duration values should be displayed",
1090+
"properties": {
1091+
"abbreviation": {
1092+
"type": "boolean",
1093+
"description": "Set whether to abbreviate duration values\nIf true, the output will be in the form of \"1h 2m\" instead of \"1 hour, 2 mins\"",
1094+
"default": false
1095+
},
1096+
"spaceBeforeUnit": {
1097+
"$ref": "#/$defs/spaceBeforeUnit"
10541098
}
10551099
}
10561100
},

src/common/duration.c

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
#include "duration.h"
2+
3+
void ffDurationAppendNum(uint64_t totalSeconds, FFstrbuf* result)
4+
{
5+
const FFOptionsDisplay* options = &instance.config.display;
6+
7+
const char* space = instance.config.display.durationSpaceBeforeUnit != FF_SPACE_BEFORE_UNIT_NEVER ? " " : "";
8+
9+
if(totalSeconds < 60)
10+
{
11+
ffStrbufAppendF(result, options->durationAbbreviation ? "%u%ssec" : "%u%ssecond", (unsigned) totalSeconds, space);
12+
if (totalSeconds != 1)
13+
ffStrbufAppendC(result, 's');
14+
return;
15+
}
16+
17+
uint32_t seconds = (uint32_t) (totalSeconds % 60);
18+
totalSeconds /= 60;
19+
if (seconds >= 30)
20+
totalSeconds++;
21+
22+
uint32_t minutes = (uint32_t) (totalSeconds % 60);
23+
totalSeconds /= 60;
24+
uint32_t hours = (uint32_t) (totalSeconds % 24);
25+
totalSeconds /= 24;
26+
uint32_t days = (uint32_t) totalSeconds;
27+
28+
if(days > 0)
29+
{
30+
if(options->durationAbbreviation)
31+
{
32+
ffStrbufAppendF(result, "%u%sd", days, space);
33+
34+
if(hours > 0 || minutes > 0)
35+
ffStrbufAppendC(result, ' ');
36+
}
37+
else
38+
{
39+
ffStrbufAppendF(result, "%u%sday", days, space);
40+
41+
if(days > 1)
42+
ffStrbufAppendC(result, 's');
43+
44+
if(days >= 100)
45+
ffStrbufAppendS(result, "(!)");
46+
47+
if(hours > 0 || minutes > 0)
48+
ffStrbufAppendS(result, ", ");
49+
}
50+
}
51+
52+
if(hours > 0)
53+
{
54+
if(options->durationAbbreviation)
55+
{
56+
ffStrbufAppendF(result, "%u%sh", hours, space);
57+
58+
if (minutes > 0)
59+
ffStrbufAppendC(result, ' ');
60+
}
61+
else
62+
{
63+
ffStrbufAppendF(result, "%u%shour", hours, space);
64+
65+
if(hours > 1)
66+
ffStrbufAppendC(result, 's');
67+
68+
if(minutes > 0)
69+
ffStrbufAppendS(result, ", ");
70+
}
71+
}
72+
73+
if(minutes > 0)
74+
{
75+
if(options->durationAbbreviation)
76+
{
77+
ffStrbufAppendF(result, "%u%sm", minutes, space);
78+
}
79+
else
80+
{
81+
ffStrbufAppendF(result, "%u%smin", minutes, space);
82+
83+
if(minutes > 1)
84+
ffStrbufAppendC(result, 's');
85+
}
86+
}
87+
}

src/common/duration.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#include "fastfetch.h"
2+
3+
void ffDurationAppendNum(uint64_t totalSeconds, FFstrbuf* result);

src/common/frequency.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#include "frequency.h"
2+
3+
bool ffFreqAppendNum(uint32_t mhz, FFstrbuf* result)
4+
{
5+
if (mhz == 0)
6+
return false;
7+
8+
const FFOptionsDisplay* options = &instance.config.display;
9+
const char* space = options->freqSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_NEVER ? "" : " ";
10+
int8_t ndigits = options->freqNdigits;
11+
12+
if (ndigits >= 0)
13+
ffStrbufAppendF(result, "%.*f%sGHz", ndigits, mhz / 1000., space);
14+
else
15+
ffStrbufAppendF(result, "%u%sMHz", (unsigned) mhz, space);
16+
return true;
17+
}

src/common/frequency.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#include "fastfetch.h"
2+
3+
bool ffFreqAppendNum(uint32_t mhz, FFstrbuf* result);

src/common/parsing.c

Lines changed: 0 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
#include "common/parsing.h"
33

44
#include <ctype.h>
5-
#include <inttypes.h>
65

76
#ifdef _WIN32
87
#pragma GCC diagnostic push
@@ -60,56 +59,6 @@ void ffVersionToPretty(const FFVersion* version, FFstrbuf* pretty)
6059
ffStrbufAppendF(pretty, ".%u", version->patch);
6160
}
6261

63-
static void parseSize(FFstrbuf* result, uint64_t bytes, uint32_t base, const char** prefixes)
64-
{
65-
double size = (double) bytes;
66-
uint8_t counter = 0;
67-
68-
while(size >= base && counter < instance.config.display.sizeMaxPrefix && prefixes[counter + 1])
69-
{
70-
size /= base;
71-
counter++;
72-
}
73-
74-
if(counter == 0)
75-
ffStrbufAppendF(result, "%" PRIu64 " %s", bytes, prefixes[0]);
76-
else
77-
ffStrbufAppendF(result, "%.*f %s", instance.config.display.sizeNdigits, size, prefixes[counter]);
78-
}
79-
80-
void ffParseSize(uint64_t bytes, FFstrbuf* result)
81-
{
82-
switch (instance.config.display.sizeBinaryPrefix)
83-
{
84-
case FF_SIZE_BINARY_PREFIX_TYPE_IEC:
85-
parseSize(result, bytes, 1024, (const char*[]) {"B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB", NULL});
86-
break;
87-
case FF_SIZE_BINARY_PREFIX_TYPE_SI:
88-
parseSize(result, bytes, 1000, (const char*[]) {"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB", NULL});
89-
break;
90-
case FF_SIZE_BINARY_PREFIX_TYPE_JEDEC:
91-
parseSize(result, bytes, 1024, (const char*[]) {"B", "KB", "MB", "GB", "TB", NULL});
92-
break;
93-
default:
94-
parseSize(result, bytes, 1024, (const char*[]) {"B", NULL});
95-
break;
96-
}
97-
}
98-
99-
bool ffParseFrequency(uint32_t mhz, FFstrbuf* result)
100-
{
101-
if (mhz == 0)
102-
return false;
103-
104-
int8_t ndigits = instance.config.display.freqNdigits;
105-
106-
if (ndigits >= 0)
107-
ffStrbufAppendF(result, "%.*f GHz", ndigits, mhz / 1000.);
108-
else
109-
ffStrbufAppendF(result, "%u MHz", (unsigned) mhz);
110-
return true;
111-
}
112-
11362
void ffParseGTK(FFstrbuf* buffer, const FFstrbuf* gtk2, const FFstrbuf* gtk3, const FFstrbuf* gtk4)
11463
{
11564
if(gtk2->length > 0 && gtk3->length > 0 && gtk4->length > 0)
@@ -190,61 +139,6 @@ void ffParseGTK(FFstrbuf* buffer, const FFstrbuf* gtk2, const FFstrbuf* gtk3, co
190139
}
191140
}
192141

193-
void ffParseDuration(uint64_t totalSeconds, FFstrbuf* result)
194-
{
195-
if(totalSeconds < 60)
196-
{
197-
ffStrbufAppendF(result, "%u second", (unsigned) totalSeconds);
198-
if (totalSeconds != 1)
199-
ffStrbufAppendC(result, 's');
200-
return;
201-
}
202-
203-
uint32_t seconds = (uint32_t) (totalSeconds % 60);
204-
totalSeconds /= 60;
205-
if (seconds >= 30)
206-
totalSeconds++;
207-
208-
uint32_t minutes = (uint32_t) (totalSeconds % 60);
209-
totalSeconds /= 60;
210-
uint32_t hours = (uint32_t) (totalSeconds % 24);
211-
totalSeconds /= 24;
212-
uint32_t days = (uint32_t) totalSeconds;
213-
214-
if(days > 0)
215-
{
216-
ffStrbufAppendF(result, "%u day", days);
217-
218-
if(days > 1)
219-
ffStrbufAppendC(result, 's');
220-
221-
if(days >= 100)
222-
ffStrbufAppendS(result, "(!)");
223-
224-
if(hours > 0 || minutes > 0)
225-
ffStrbufAppendS(result, ", ");
226-
}
227-
228-
if(hours > 0)
229-
{
230-
ffStrbufAppendF(result, "%u hour", hours);
231-
232-
if(hours > 1)
233-
ffStrbufAppendC(result, 's');
234-
235-
if(minutes > 0)
236-
ffStrbufAppendS(result, ", ");
237-
}
238-
239-
if(minutes > 0)
240-
{
241-
ffStrbufAppendF(result, "%u min", minutes);
242-
243-
if(minutes > 1)
244-
ffStrbufAppendC(result, 's');
245-
}
246-
}
247-
248142
#ifdef _WIN32
249143
#pragma GCC diagnostic pop
250144
#endif

src/common/parsing.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,3 @@ void ffParseGTK(FFstrbuf* buffer, const FFstrbuf* gtk2, const FFstrbuf* gtk3, co
2424

2525
void ffVersionToPretty(const FFVersion* version, FFstrbuf* pretty);
2626
int8_t ffVersionCompare(const FFVersion* version1, const FFVersion* version2);
27-
28-
void ffParseSize(uint64_t bytes, FFstrbuf* result);
29-
bool ffParseFrequency(uint32_t mhz, FFstrbuf* result);
30-
void ffParseDuration(uint64_t totalSeconds, FFstrbuf* result);

src/common/percent.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFPercentageModuleConf
175175
ffStrbufAppendF(buffer, "\e[%sm", colorYellow);
176176
else
177177
ffStrbufAppendF(buffer, "\e[%sm", colorGreen);
178-
179178
}
180179
else
181180
{
@@ -187,7 +186,8 @@ void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFPercentageModuleConf
187186
ffStrbufAppendF(buffer, "\e[%sm", colorGreen);
188187
}
189188
}
190-
ffStrbufAppendF(buffer, "%.*f%%", options->percentNdigits, percent);
189+
ffStrbufAppendF(buffer, "%.*f%s%%", options->percentNdigits, percent,
190+
options->percentSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_ALWAYS ? " " : "");
191191

192192
if (colored && !options->pipe)
193193
{

0 commit comments

Comments
 (0)