mirror of https://github.com/OpenTTD/OpenTTD
Change: ParseInteger now checks for trailing junk chars.
parent
79b2202f2e
commit
3973199879
|
@ -71,18 +71,6 @@ static IntervalTimer<TimerGameCalendar> _scheduled_monthly_timer = {{TimerGameCa
|
||||||
IConsoleCmdExec(fmt::format("exec {}", filename));
|
IConsoleCmdExec(fmt::format("exec {}", filename));
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Change a string into its number representation. Supports decimal and hexadecimal numbers.
|
|
||||||
* @param arg The string to be converted.
|
|
||||||
* @param base The base for parsing the number, defaults to only decimal numbers. Use 0 to also allow hexadecimal.
|
|
||||||
* @return The number, or std::nullopt when it could not be parsed.
|
|
||||||
*/
|
|
||||||
static std::optional<uint32_t> ParseInteger(std::string_view arg, int base = 10)
|
|
||||||
{
|
|
||||||
return StringConsumer{arg}.TryReadIntegerBase<uint32_t>(base);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse an integer using #ParseInteger and convert it to the requested type.
|
* Parse an integer using #ParseInteger and convert it to the requested type.
|
||||||
* @param arg The string to be converted.
|
* @param arg The string to be converted.
|
||||||
|
|
|
@ -892,4 +892,23 @@ public:
|
||||||
void SkipIntegerBase(int base);
|
void SkipIntegerBase(int base);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change a string into its number representation.
|
||||||
|
* Supports decimal and hexadecimal numbers.
|
||||||
|
* Accepts leading and trailing whitespace. Trailing junk is an error.
|
||||||
|
* @param arg The string to be converted.
|
||||||
|
* @param base The base for parsing the number, defaults to only decimal numbers. Use 0 to also allow hexadecimal.
|
||||||
|
* @return The number, or std::nullopt if it could not be parsed.
|
||||||
|
*/
|
||||||
|
template <class T = uint32_t>
|
||||||
|
static inline std::optional<T> ParseInteger(std::string_view arg, int base = 10)
|
||||||
|
{
|
||||||
|
StringConsumer consumer{arg};
|
||||||
|
consumer.SkipUntilCharNotIn(StringConsumer::WHITESPACE_NO_NEWLINE);
|
||||||
|
auto result = consumer.TryReadIntegerBase<T>(base);
|
||||||
|
consumer.SkipUntilCharNotIn(StringConsumer::WHITESPACE_NO_NEWLINE);
|
||||||
|
if (consumer.AnyBytesLeft()) return std::nullopt;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* STRING_CONSUMER_HPP */
|
#endif /* STRING_CONSUMER_HPP */
|
||||||
|
|
Loading…
Reference in New Issue