Files
fastfetch/src/common/impl/duration.c
T

88 lines
2.4 KiB
C
Raw Normal View History

2026-01-06 09:48:38 +08:00
#include "common/duration.h"
2025-07-30 14:30:36 +08:00
2026-03-29 09:28:49 +08:00
void ffDurationAppendNum(uint64_t totalSeconds, FFstrbuf* result) {
2025-07-30 14:30:36 +08:00
const FFOptionsDisplay* options = &instance.config.display;
2025-08-19 15:19:12 +08:00
bool spaceBeforeUnit = options->durationSpaceBeforeUnit != FF_SPACE_BEFORE_UNIT_NEVER;
2025-07-30 14:30:36 +08:00
2026-03-29 09:28:49 +08:00
if (totalSeconds < 60) {
2025-08-19 15:19:12 +08:00
ffStrbufAppendUInt(result, totalSeconds);
2026-03-29 09:28:49 +08:00
if (spaceBeforeUnit) {
ffStrbufAppendC(result, ' ');
}
2025-08-19 15:19:12 +08:00
ffStrbufAppendS(result, options->durationAbbreviation ? "sec" : "second");
2026-03-29 09:28:49 +08:00
if (totalSeconds != 1) {
2025-07-30 14:30:36 +08:00
ffStrbufAppendC(result, 's');
2026-03-29 09:28:49 +08:00
}
2025-07-30 14:30:36 +08:00
return;
}
uint32_t seconds = (uint32_t) (totalSeconds % 60);
totalSeconds /= 60;
2026-03-29 09:28:49 +08:00
if (seconds >= 30) {
2025-07-30 14:30:36 +08:00
totalSeconds++;
2026-03-29 09:28:49 +08:00
}
2025-07-30 14:30:36 +08:00
uint32_t minutes = (uint32_t) (totalSeconds % 60);
totalSeconds /= 60;
uint32_t hours = (uint32_t) (totalSeconds % 24);
totalSeconds /= 24;
uint32_t days = (uint32_t) totalSeconds;
2026-03-29 09:28:49 +08:00
if (days > 0) {
2025-08-19 15:19:12 +08:00
ffStrbufAppendUInt(result, days);
2026-03-29 09:28:49 +08:00
if (spaceBeforeUnit) {
ffStrbufAppendC(result, ' ');
}
if (options->durationAbbreviation) {
2025-08-19 15:19:12 +08:00
ffStrbufAppendC(result, 'd');
2025-07-30 14:30:36 +08:00
2026-03-29 09:28:49 +08:00
if (hours > 0 || minutes > 0) {
2025-07-30 14:30:36 +08:00
ffStrbufAppendC(result, ' ');
2026-03-29 09:28:49 +08:00
}
} else {
2025-08-19 15:19:12 +08:00
ffStrbufAppendS(result, days == 1 ? "day" : "days");
2025-07-30 14:30:36 +08:00
2026-03-29 09:28:49 +08:00
if (days >= 100) {
2025-07-30 14:30:36 +08:00
ffStrbufAppendS(result, "(!)");
2026-03-29 09:28:49 +08:00
}
2025-07-30 14:30:36 +08:00
2026-03-29 09:28:49 +08:00
if (hours > 0 || minutes > 0) {
2025-07-30 14:30:36 +08:00
ffStrbufAppendS(result, ", ");
2026-03-29 09:28:49 +08:00
}
2025-07-30 14:30:36 +08:00
}
}
2026-03-29 09:28:49 +08:00
if (hours > 0) {
2025-08-19 15:19:12 +08:00
ffStrbufAppendUInt(result, hours);
2026-03-29 09:28:49 +08:00
if (spaceBeforeUnit) {
ffStrbufAppendC(result, ' ');
}
if (options->durationAbbreviation) {
2025-08-19 15:19:12 +08:00
ffStrbufAppendC(result, 'h');
2025-07-30 14:30:36 +08:00
2026-03-29 09:28:49 +08:00
if (minutes > 0) {
2025-07-30 14:30:36 +08:00
ffStrbufAppendC(result, ' ');
2026-03-29 09:28:49 +08:00
}
} else {
2025-08-19 15:19:12 +08:00
ffStrbufAppendS(result, hours == 1 ? "hour" : "hours");
2025-07-30 14:30:36 +08:00
2026-03-29 09:28:49 +08:00
if (minutes > 0) {
2025-07-30 14:30:36 +08:00
ffStrbufAppendS(result, ", ");
2026-03-29 09:28:49 +08:00
}
2025-07-30 14:30:36 +08:00
}
}
2026-03-29 09:28:49 +08:00
if (minutes > 0) {
2025-08-19 15:19:12 +08:00
ffStrbufAppendUInt(result, minutes);
2026-03-29 09:28:49 +08:00
if (spaceBeforeUnit) {
ffStrbufAppendC(result, ' ');
}
if (options->durationAbbreviation) {
2025-08-19 15:19:12 +08:00
ffStrbufAppendC(result, 'm');
2026-03-29 09:28:49 +08:00
} else {
2025-08-19 15:19:12 +08:00
ffStrbufAppendS(result, minutes == 1 ? "min" : "mins");
2026-03-29 09:28:49 +08:00
}
2025-07-30 14:30:36 +08:00
}
}