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}