1111
1212namespace 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