SatCat5
build_date.cc
1 // Copyright 2021-2024 The Aerospace Corporation.
3 // This file is a part of SatCat5, licensed under CERN-OHL-W v2 or later.
5 
6 #include <satcat5/build_date.h>
7 
8 // Convert month to a number:
9 #define BUILD_MONTH_IS_JAN (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')
10 #define BUILD_MONTH_IS_FEB (__DATE__[0] == 'F')
11 #define BUILD_MONTH_IS_MAR (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')
12 #define BUILD_MONTH_IS_APR (__DATE__[0] == 'A' && __DATE__[1] == 'p')
13 #define BUILD_MONTH_IS_MAY (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')
14 #define BUILD_MONTH_IS_JUN (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')
15 #define BUILD_MONTH_IS_JUL (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')
16 #define BUILD_MONTH_IS_AUG (__DATE__[0] == 'A' && __DATE__[1] == 'u')
17 #define BUILD_MONTH_IS_SEP (__DATE__[0] == 'S')
18 #define BUILD_MONTH_IS_OCT (__DATE__[0] == 'O')
19 #define BUILD_MONTH_IS_NOV (__DATE__[0] == 'N')
20 #define BUILD_MONTH_IS_DEC (__DATE__[0] == 'D')
21 
22 static constexpr unsigned BUILD_MONTH_IDX =
23  (BUILD_MONTH_IS_JAN) ? 0x01 :
24  (BUILD_MONTH_IS_FEB) ? 0x02 :
25  (BUILD_MONTH_IS_MAR) ? 0x03 :
26  (BUILD_MONTH_IS_APR) ? 0x04 :
27  (BUILD_MONTH_IS_MAY) ? 0x05 :
28  (BUILD_MONTH_IS_JUN) ? 0x06 :
29  (BUILD_MONTH_IS_JUL) ? 0x07 :
30  (BUILD_MONTH_IS_AUG) ? 0x08 :
31  (BUILD_MONTH_IS_SEP) ? 0x09 :
32  (BUILD_MONTH_IS_OCT) ? 0x0A :
33  (BUILD_MONTH_IS_NOV) ? 0x0B :
34  (BUILD_MONTH_IS_DEC) ? 0x0C : 0xFF;
35 
36 static constexpr char space2zero(char c) {
37  return (c == ' ') ? '0' : c;
38 }
39 
40 static constexpr u32 char2int(char c) {
41  return (u32)(space2zero(c) - '0');
42 }
43 
44 // Calculate software build date as a 32-bit integer, 0xYYMMDDHH.
46 {
47  constexpr u32 yy = 10 * char2int(__DATE__[9]) + char2int(__DATE__[10]);
48  constexpr u32 mm = BUILD_MONTH_IDX;
49  constexpr u32 dd = 10 * char2int(__DATE__[4]) + char2int(__DATE__[5]);
50  constexpr u32 hh = 10 * char2int(__TIME__[0]) + char2int(__TIME__[1]);
51  return (yy << 24) | (mm << 16) | (dd << 8) | hh;
52 }
53 
54 // Construct ISO8601 date and time and return pointer to result.
55 // e.g., "2020-12-31T17:56:09"
56 static constexpr char iso8601[] = {
57  __DATE__[7], // Year (YYYY)
58  __DATE__[8],
59  __DATE__[9],
60  __DATE__[10],
61  '-', // Month (MM)
62  (BUILD_MONTH_IDX / 10) + '0',
63  (BUILD_MONTH_IDX % 10) + '0',
64  '-', // Day (DD)
65  space2zero(__DATE__[4]),
66  __DATE__[5],
67  'T', // Time (HH:MM:SS)
68  __TIME__[0],
69  __TIME__[1],
70  ':',
71  __TIME__[3],
72  __TIME__[4],
73  ':',
74  __TIME__[6],
75  __TIME__[7],
76  '\0'
77 };
78 
80 {
81  return iso8601;
82 }
Build-date reporting.
u32 get_sw_build_code()
Calculate software build date as a 32-bit integer, 0xYYMMDDHH.
Definition: build_date.cc:45
const char * get_sw_build_string()
Return a pointer to the ISO8601 date and time constructed at build time.
Definition: build_date.cc:79