summaryrefslogtreecommitdiff
path: root/src/util/print_time.h
blob: b6ab625b11c970ef6a9ba1435e1a08ff08072392 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#pragma once

#include <al/lib.h>

static inline bool camu_split_time(u64 nanoseconds, u32 *hours, u32 *minutes, u32 *seconds, u32 *hundredths)
{
    *hours = nanoseconds / 3600000000u;
    *minutes = nanoseconds / 60000000u;
    *seconds = nanoseconds / 1000000u;
    *hundredths = nanoseconds / 10000u;
    bool over_an_hour = *minutes >= 60u;
    *hundredths -= *seconds * 100u;
    *seconds -= *minutes * 60u;
    *minutes -= *hours * 60u;
    return over_an_hour;
}

static inline s32 camu_print_time(char *buf, size_t size, u64 nanoseconds, bool always_show_hour, u32 hour_padding)
{
    u32 hours, minutes, seconds, hundredths;
    bool show_hour = camu_split_time(nanoseconds, &hours, &minutes, &seconds, &hundredths);
    show_hour |= always_show_hour;
    s32 offset = 0;
    if (show_hour && hour_padding >= 2 && hour_padding <= 4) {
        static const char *padding_table[] = { "%.2u:", "%.3u:", "%.4u:" };
        offset += al_snprintf(buf, size, padding_table[hour_padding - 2u], hours);
    }
    offset += al_snprintf(buf + offset, size - offset, "%.2u:%.2u.%.2u", minutes, seconds, hundredths);
    return offset;
}