PStringUtils::ToDouble: signal conversion errors like ToInt
ToDouble() had the same shortcoming as ToInt(): wrapping strtod() with a nullptr endptr made a failed conversion indistinguishable from a legitimate 0.0. Add an optional `bool *ok` out-parameter that reports success. strtod() (with endptr + errno) is kept instead of std::from_chars so the accepted input set stays identical to TString::Atof() (leading whitespace skipped, leading '+' honoured, trailing characters ignored); ok is set false on a non-numeric string or an ERANGE overflow. The parameter defaults to nullptr, so existing call sites keep compiling unchanged. Convert the IsFloat-guarded ToDouble call sites in PMsrHandler to the single-parse ToDouble(token, &ok) form (replacing the IsFloat() guard + separate ToDouble() that parsed every token twice). All downstream >=0 / <=0 / range checks are preserved, and push_back sites only append on success so no spurious 0.0 is stored on error. Number-vs-keyword discriminators (pos.error/boundary "none", rrf_phase/fourier-phase parX) are restructured so the keyword branch is taken when ok is false. As a side effect this fixes a latent gap in the GLOBAL rrf_freq handler, where a non-numeric frequency previously slipped through with a stale value instead of raising an error. The IsFloat-guarded ToInt fit-range offsets (fgb/lgb) are intentionally left untouched, as there the guard type differs from the conversion. All 85 integration tests pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -104,10 +104,15 @@ class PStringUtils
|
||||
* <p>Converts the leading part of the string to a double.
|
||||
* Mirrors TString::Atof(). Returns 0.0 if no conversion is possible.
|
||||
*
|
||||
* <p>If \a ok is non-null it is set to true when a value was parsed and
|
||||
* to false on error (no number, or value out of range), allowing callers
|
||||
* to distinguish a legitimate 0.0 from a failed conversion.
|
||||
*
|
||||
* @param str string to be converted
|
||||
* @return converted double value
|
||||
* @param ok optional out-parameter signalling conversion success
|
||||
* @return converted double value (0.0 on error)
|
||||
*/
|
||||
static double ToDouble(const std::string &str);
|
||||
static double ToDouble(const std::string &str, bool *ok = nullptr);
|
||||
|
||||
/**
|
||||
* <p>Case-insensitive full-string equality.
|
||||
|
||||
Reference in New Issue
Block a user