Skip to content

Commit a9a93ab

Browse files
authored
fix for issue #221 (#222)
The problem is corrected by applying the endian setting to the packed time. Since two of the fields are 16 bit in size they need to be modified on the packed integer.
1 parent 5764389 commit a9a93ab

1 file changed

Lines changed: 23 additions & 13 deletions

File tree

lib/source/pl/lib/std/time.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,39 @@
1111

1212
namespace pl::lib::libstd::time {
1313

14-
static u128 packTMValue(const std::tm &tm) {
15-
return
14+
static u128 packTMValue(const std::tm &tm, pl::PatternLanguage &runtime) {
15+
auto endian = runtime.getInternals().evaluator->getDefaultEndian();
16+
std::tm tmCopy = tm;
17+
tmCopy.tm_year = hlp::changeEndianess(tm.tm_year, 2, endian);
18+
tmCopy.tm_yday = hlp::changeEndianess(tm.tm_yday, 2, endian);
19+
u128 result =
1620
(u128(tm.tm_sec) << 0) |
1721
(u128(tm.tm_min) << 8) |
1822
(u128(tm.tm_hour) << 16) |
1923
(u128(tm.tm_mday) << 24) |
2024
(u128(tm.tm_mon) << 32) |
21-
(u128(tm.tm_year) << 40) |
25+
(u128(tmCopy.tm_year) << 40) |
2226
(u128(tm.tm_wday) << 56) |
23-
(u128(tm.tm_yday) << 64) |
27+
(u128(tmCopy.tm_yday) << 64) |
2428
(u128(tm.tm_isdst) << 80);
29+
30+
return hlp::changeEndianess(result, 16, endian);
2531
}
2632

27-
static tm unpackTMValue(u128 value) {
33+
static tm unpackTMValue(u128 value, pl::PatternLanguage &runtime) {
34+
auto endian = runtime.getInternals().evaluator->getDefaultEndian();
35+
value = hlp::changeEndianess(value, 16, endian);
2836
tm tm = { };
2937
tm.tm_sec = (int)(value >> 0) & 0xFF;
3038
tm.tm_min = (int)(value >> 8) & 0xFF;
3139
tm.tm_hour = (int)(value >> 16) & 0xFF;
3240
tm.tm_mday = (int)(value >> 24) & 0xFF;
3341
tm.tm_mon = (int)(value >> 32) & 0xFF;
3442
tm.tm_year = (int)(value >> 40) & 0xFFFF;
43+
tm.tm_year = hlp::changeEndianess(tm.tm_year, 2, endian);
3544
tm.tm_wday = (int)(value >> 56) & 0xFF;
3645
tm.tm_yday = (int)(value >> 64) & 0xFFFF;
46+
tm.tm_yday = hlp::changeEndianess(tm.tm_yday, 2, endian);
3747
tm.tm_isdst = (int)(value >> 80) & 0xFF;
3848

3949
return tm;
@@ -53,48 +63,48 @@ namespace pl::lib::libstd::time {
5363
});
5464

5565
/* to_local(time) */
56-
runtime.addFunction(nsStdTime, "to_local", FunctionParameterCount::exactly(1), [](Evaluator *, auto params) -> std::optional<Token::Literal> {
66+
runtime.addFunction(nsStdTime, "to_local", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional<Token::Literal> {
5767
auto time = time_t(params[0].toUnsigned());
5868

5969
try {
6070
auto localTime = std::localtime(&time);
6171
if (localTime == nullptr) return u128(0);
6272

63-
return { packTMValue(*localTime) };
73+
return { packTMValue(*localTime, runtime) };
6474
} catch (const fmt::format_error&) {
6575
return u128(0);
6676
}
6777
});
6878

6979
/* to_utc(time) */
70-
runtime.addFunction(nsStdTime, "to_utc", FunctionParameterCount::exactly(1), [](Evaluator *, auto params) -> std::optional<Token::Literal> {
80+
runtime.addFunction(nsStdTime, "to_utc", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional<Token::Literal> {
7181
auto time = time_t(params[0].toUnsigned());
7282

7383
try {
7484
auto gmTime = std::gmtime(&time);
7585
if (gmTime == nullptr) return u128(0);
7686

77-
return { packTMValue(*gmTime) };
87+
return { packTMValue(*gmTime, runtime) };
7888
} catch (const fmt::format_error&) {
7989
return u128(0);
8090
}
8191
});
8292

8393
/* to_epoch(structured_time) */
84-
runtime.addFunction(nsStdTime, "to_epoch", FunctionParameterCount::exactly(1), [](Evaluator *, auto params) -> std::optional<Token::Literal> {
94+
runtime.addFunction(nsStdTime, "to_epoch", FunctionParameterCount::exactly(1), [&runtime](Evaluator *, auto params) -> std::optional<Token::Literal> {
8595
u128 structuredTime = params[0].toUnsigned();
8696

87-
tm time = unpackTMValue(structuredTime);
97+
tm time = unpackTMValue(structuredTime, runtime);
8898

8999
return { u128(std::mktime(&time)) };
90100
});
91101

92102
/* format(format_string, structured_time) */
93-
runtime.addFunction(nsStdTime, "format", FunctionParameterCount::exactly(2), [](Evaluator *, auto params) -> std::optional<Token::Literal> {
103+
runtime.addFunction(nsStdTime, "format", FunctionParameterCount::exactly(2), [&runtime](Evaluator *, auto params) -> std::optional<Token::Literal> {
94104
auto formatString = params[0].toString(false);
95105
u128 structuredTime = params[1].toUnsigned();
96106

97-
auto time = unpackTMValue(structuredTime);
107+
auto time = unpackTMValue(structuredTime, runtime);
98108

99109
if (time.tm_sec < 0 || time.tm_sec > 61 ||
100110
time.tm_min < 0 || time.tm_min > 59 ||

0 commit comments

Comments
 (0)