Skip to content

Commit 13382bd

Browse files
committed
2nd merge attempt
2 parents 9eb4c1d + fe69cf5 commit 13382bd

3 files changed

Lines changed: 16 additions & 10 deletions

File tree

lib/source/pl/core/ast/ast_node_attribute.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <pl/patterns/pattern_bitfield.hpp>
1111

1212
#include <bit>
13+
#include <wolv/utils/charconv.hpp>
1314

1415
namespace pl::core::ast {
1516

@@ -348,7 +349,7 @@ namespace pl::core::ast {
348349
if (!pattern->hasOverriddenColor()) {
349350
if (const auto &arguments = attributable->getAttributeArguments("color"); arguments.size() == 1) {
350351
auto colorString = getAttributeValueAsString(arguments.front(), evaluator);
351-
u32 color = strtoul(colorString.c_str(), nullptr, 16);
352+
u32 color = wolv::util::from_chars<u32>(colorString, 16).value_or(0);
352353
pattern->setColor(hlp::changeEndianess(color, std::endian::big) >> 8);
353354
} else if (auto singleColor = attributable->hasAttribute("single_color", false); singleColor) {
354355
pattern->setColor(pattern->getColor());
@@ -406,7 +407,7 @@ namespace pl::core::ast {
406407

407408
if (const auto &arguments = attributable->getAttributeArguments("color"); arguments.size() == 1) {
408409
auto colorString = getAttributeValueAsString(arguments.front(), evaluator);
409-
u32 color = strtoul(colorString.c_str(), nullptr, 16);
410+
u32 color = wolv::util::from_chars<u32>(colorString, 16).value_or(0);
410411
pattern->setColor(hlp::changeEndianess(color, std::endian::big) >> 8);
411412
} else if (auto singleColor = attributable->hasAttribute("single_color", false); singleColor) {
412413
pattern->setColor(pattern->getColor());

lib/source/pl/core/lexer.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <pl/api.hpp>
88
#include <pl/core/token.hpp>
99
#include <pl/core/tokens.hpp>
10+
#include <wolv/utils/charconv.hpp>
1011

1112
#include <lexertl/lookup.hpp>
1213
#include <lexertl/state_machine.hpp>
@@ -121,22 +122,21 @@ namespace pl::core {
121122
}
122123

123124
std::optional<double> Lexer::parseFloatingPoint(std::string_view literal, const char suffix, const auto &location) {
124-
char *end = nullptr;
125-
double val = std::strtod(literal.data(), &end);
125+
const auto value = wolv::util::from_chars<double>(literal);
126126

127-
if(end != literal.data() + literal.size()) {
127+
if(!value.has_value()) {
128128
error(location(), "Invalid float literal: {}", literal);
129129
return std::nullopt;
130130
}
131131

132132
switch (suffix) {
133133
case 'f':
134134
case 'F':
135-
return float(val);
135+
return float(*value);
136136
case 'd':
137137
case 'D':
138138
default:
139-
return val;
139+
return *value;
140140
}
141141
}
142142

@@ -546,3 +546,4 @@ namespace pl::core {
546546
}
547547

548548
} // namespace pl::core
549+

lib/source/pl/lib/std/string.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
#include <fmt/args.h>
1313

14+
#include <wolv/utils/charconv.hpp>
15+
1416
namespace pl::lib::libstd::string {
1517

1618
void registerFunctions(pl::PatternLanguage &runtime) {
@@ -63,16 +65,18 @@ namespace pl::lib::libstd::string {
6365
auto string = params[0].toString(false);
6466
auto base = u64(params[1].toUnsigned());
6567

66-
// TODO: support 128-bit integers
68+
if constexpr (std::integral<i128>)
69+
return wolv::util::from_chars<i128>(string, base).value_or(0);
70+
else
71+
return wolv::util::from_chars<i64>(string, base).value_or(0);
6772

68-
return i128(std::strtoll(string.c_str(), nullptr, base));
6973
});
7074

7175
/* parse_float(string) */
7276
runtime.addFunction(nsStdString, "parse_float", FunctionParameterCount::exactly(1), [](Evaluator *, auto params) -> std::optional<Token::Literal> {
7377
auto string = params[0].toString(false);
7478

75-
return double(std::strtod(string.c_str(), nullptr));
79+
return wolv::util::from_chars<double>(string).value_or(0.0);
7680
});
7781
}
7882

0 commit comments

Comments
 (0)