"Stage 2" of num_get::do_get() depends on "a check ... to determine if c is
allowed as the next character of an input field of the conversion specifier
returned by Stage 1". Previously this was a very simple check whether the next
character was in a set of allowed characters. This could lead to Stage 2
accumulating character sequences such as "1.2f" and passing them to strtold
Stage 3 can fail, however, if the entire character sequence from Stage 2 is not
used in the conversion. For example, the "f" in "1.2f" is not used.
As a result, parsing a sequence like "1.2f" would return value 0.0 with failbit
This change improves the checks made in Stage 2, determining what is passed to
- Hex digits are only considered valid if "0x" has been seen
- INFINITY value is recognised
- Characters in INFINITY and NAN are only valid in sequence. This is done by checking one character backwards, which has obvious limitations.
- New tests are added. The old ones are preserved but refactored.