PStringUtils::ToInt: signal conversion errors via from_chars
ToInt() previously wrapped strtol() with a nullptr endptr, so a failed conversion was indistinguishable from a legitimate 0 (matching the old TString::Atoi() behaviour). Switch the implementation to std::from_chars and add an optional `bool *ok` out-parameter that reports success: it is set to false on a non-numeric string or an out-of-range value, true otherwise. Leading whitespace is skipped and trailing characters are ignored, preserving the Atoi-like prefix semantics. The parameter defaults to nullptr, so existing call sites keep compiling unchanged. Convert the parse-validation call sites in PMsrHandler to the single -parse ToInt(token, &ok) form, replacing the IsInt() guard + separate ToInt() (which parsed every token twice). All downstream >0 / >=0 / range / enum checks are preserved. Left untouched the call sites where IsInt() acts as a structural discriminator rather than a numeric validator (write path, xy-data index-vs-label, fParamInUse usage scans) and the IsFloat-guarded ToInt offsets, where switching to ToInt(&ok) would change parsing semantics. All 85 integration tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -89,10 +89,16 @@ class PStringUtils
|
||||
* <p>Converts the leading part of the string to an int (base 10).
|
||||
* Mirrors TString::Atoi(). Returns 0 if no conversion is possible.
|
||||
*
|
||||
* <p>If \a ok is non-null it is set to true when a valid integer was
|
||||
* parsed and to false on error (no digits, or value out of int range).
|
||||
* This allows callers to distinguish a legitimate 0 from a failed
|
||||
* conversion, which the bare return value cannot express.
|
||||
*
|
||||
* @param str string to be converted
|
||||
* @return converted integer value
|
||||
* @param ok optional out-parameter signalling conversion success
|
||||
* @return converted integer value (0 on error)
|
||||
*/
|
||||
static int ToInt(const std::string &str);
|
||||
static int ToInt(const std::string &str, bool *ok = nullptr);
|
||||
|
||||
/**
|
||||
* <p>Converts the leading part of the string to a double.
|
||||
|
||||
Reference in New Issue
Block a user