master ohmu/fastfetch-openbsd / src / common / impl / duration.c
ohmu  ·  2026-10-15
 1#include "common/duration.h"
 2
 3void ffDurationAppendNum(uint64_t totalSeconds, FFstrbuf* result) {
 4    const FFOptionsDisplay* options = &instance.config.display;
 5
 6    bool spaceBeforeUnit = options->durationSpaceBeforeUnit != FF_SPACE_BEFORE_UNIT_NEVER;
 7
 8    if (totalSeconds < 60) {
 9        ffStrbufAppendUInt(result, totalSeconds);
10        if (spaceBeforeUnit) {
11            ffStrbufAppendC(result, ' ');
12        }
13        ffStrbufAppendS(result, options->durationAbbreviation ? "sec" : "second");
14        if (totalSeconds != 1) {
15            ffStrbufAppendC(result, 's');
16        }
17        return;
18    }
19
20    uint32_t seconds = (uint32_t) (totalSeconds % 60);
21    totalSeconds /= 60;
22    if (seconds >= 30) {
23        totalSeconds++;
24    }
25
26    uint32_t minutes = (uint32_t) (totalSeconds % 60);
27    totalSeconds /= 60;
28    uint32_t hours = (uint32_t) (totalSeconds % 24);
29    totalSeconds /= 24;
30    uint32_t days = (uint32_t) totalSeconds;
31
32    if (days > 0) {
33        ffStrbufAppendUInt(result, days);
34        if (spaceBeforeUnit) {
35            ffStrbufAppendC(result, ' ');
36        }
37        if (options->durationAbbreviation) {
38            ffStrbufAppendC(result, 'd');
39
40            if (hours > 0 || minutes > 0) {
41                ffStrbufAppendC(result, ' ');
42            }
43        } else {
44            ffStrbufAppendS(result, days == 1 ? "day" : "days");
45
46            if (days >= 100) {
47                ffStrbufAppendS(result, "(!)");
48            }
49
50            if (hours > 0 || minutes > 0) {
51                ffStrbufAppendS(result, ", ");
52            }
53        }
54    }
55
56    if (hours > 0) {
57        ffStrbufAppendUInt(result, hours);
58        if (spaceBeforeUnit) {
59            ffStrbufAppendC(result, ' ');
60        }
61        if (options->durationAbbreviation) {
62            ffStrbufAppendC(result, 'h');
63
64            if (minutes > 0) {
65                ffStrbufAppendC(result, ' ');
66            }
67        } else {
68            ffStrbufAppendS(result, hours == 1 ? "hour" : "hours");
69
70            if (minutes > 0) {
71                ffStrbufAppendS(result, ", ");
72            }
73        }
74    }
75
76    if (minutes > 0) {
77        ffStrbufAppendUInt(result, minutes);
78        if (spaceBeforeUnit) {
79            ffStrbufAppendC(result, ' ');
80        }
81        if (options->durationAbbreviation) {
82            ffStrbufAppendC(result, 'm');
83        } else {
84            ffStrbufAppendS(result, minutes == 1 ? "min" : "mins");
85        }
86    }
87}