summaryrefslogtreecommitdiffstats
path: root/src/common/impl/duration.c
diff options
context:
space:
mode:
authorsumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
committersumuel <samuel@yakubos.org>2026-08-17 20:44:55 +0000
commit76424950e373d3b04ac3dd13019151bfba3e8423 (patch)
tree4c3cfdbda039e592b9186be3e28f8d7cfd439e8a /src/common/impl/duration.c
Add the files
Diffstat (limited to 'src/common/impl/duration.c')
-rw-r--r--src/common/impl/duration.c87
1 files changed, 87 insertions, 0 deletions
diff --git a/src/common/impl/duration.c b/src/common/impl/duration.c
new file mode 100644
index 0000000..a6a4965
--- /dev/null
+++ b/src/common/impl/duration.c
@@ -0,0 +1,87 @@
+#include "common/duration.h"
+
+void ffDurationAppendNum(uint64_t totalSeconds, FFstrbuf* result) {
+ const FFOptionsDisplay* options = &instance.config.display;
+
+ bool spaceBeforeUnit = options->durationSpaceBeforeUnit != FF_SPACE_BEFORE_UNIT_NEVER;
+
+ if (totalSeconds < 60) {
+ ffStrbufAppendUInt(result, totalSeconds);
+ if (spaceBeforeUnit) {
+ ffStrbufAppendC(result, ' ');
+ }
+ ffStrbufAppendS(result, options->durationAbbreviation ? "sec" : "second");
+ if (totalSeconds != 1) {
+ ffStrbufAppendC(result, 's');
+ }
+ return;
+ }
+
+ uint32_t seconds = (uint32_t) (totalSeconds % 60);
+ totalSeconds /= 60;
+ if (seconds >= 30) {
+ totalSeconds++;
+ }
+
+ uint32_t minutes = (uint32_t) (totalSeconds % 60);
+ totalSeconds /= 60;
+ uint32_t hours = (uint32_t) (totalSeconds % 24);
+ totalSeconds /= 24;
+ uint32_t days = (uint32_t) totalSeconds;
+
+ if (days > 0) {
+ ffStrbufAppendUInt(result, days);
+ if (spaceBeforeUnit) {
+ ffStrbufAppendC(result, ' ');
+ }
+ if (options->durationAbbreviation) {
+ ffStrbufAppendC(result, 'd');
+
+ if (hours > 0 || minutes > 0) {
+ ffStrbufAppendC(result, ' ');
+ }
+ } else {
+ ffStrbufAppendS(result, days == 1 ? "day" : "days");
+
+ if (days >= 100) {
+ ffStrbufAppendS(result, "(!)");
+ }
+
+ if (hours > 0 || minutes > 0) {
+ ffStrbufAppendS(result, ", ");
+ }
+ }
+ }
+
+ if (hours > 0) {
+ ffStrbufAppendUInt(result, hours);
+ if (spaceBeforeUnit) {
+ ffStrbufAppendC(result, ' ');
+ }
+ if (options->durationAbbreviation) {
+ ffStrbufAppendC(result, 'h');
+
+ if (minutes > 0) {
+ ffStrbufAppendC(result, ' ');
+ }
+ } else {
+ ffStrbufAppendS(result, hours == 1 ? "hour" : "hours");
+
+ if (minutes > 0) {
+ ffStrbufAppendS(result, ", ");
+ }
+ }
+ }
+
+ if (minutes > 0) {
+ ffStrbufAppendUInt(result, minutes);
+ if (spaceBeforeUnit) {
+ ffStrbufAppendC(result, ' ');
+ }
+ if (options->durationAbbreviation) {
+ ffStrbufAppendC(result, 'm');
+ } else {
+ ffStrbufAppendS(result, minutes == 1 ? "min" : "mins");
+ }
+ }
+}