Fixed numbers-as-strings for in-situ streams
This commit is contained in:
parent
7d4891e243
commit
e23bc0d1a5
@ -1100,10 +1100,12 @@ private:
|
|||||||
template<unsigned parseFlags, typename InputStream, typename Handler>
|
template<unsigned parseFlags, typename InputStream, typename Handler>
|
||||||
void ParseNumber(InputStream& is, Handler& handler) {
|
void ParseNumber(InputStream& is, Handler& handler) {
|
||||||
internal::StreamLocalCopy<InputStream> copy(is);
|
internal::StreamLocalCopy<InputStream> copy(is);
|
||||||
NumberStream<InputStream, (parseFlags & kParseFullPrecisionFlag) != 0> s(*this, copy.s);
|
NumberStream<InputStream,
|
||||||
size_t startOffset = s.Tell();
|
((parseFlags & kParseNumbersAsStringsFlag) != 0) ?
|
||||||
|
((parseFlags & kParseInsituFlag) == 0) :
|
||||||
|
((parseFlags & kParseFullPrecisionFlag) != 0)> s(*this, copy.s);
|
||||||
|
|
||||||
typename InputStream::Ch *head = is.PutBegin();
|
size_t startOffset = s.Tell();
|
||||||
|
|
||||||
// Parse minus
|
// Parse minus
|
||||||
bool minus = Consume(s, '-');
|
bool minus = Consume(s, '-');
|
||||||
@ -1189,6 +1191,9 @@ private:
|
|||||||
int expFrac = 0;
|
int expFrac = 0;
|
||||||
size_t decimalPosition;
|
size_t decimalPosition;
|
||||||
if (Consume(s, '.')) {
|
if (Consume(s, '.')) {
|
||||||
|
if (((parseFlags & kParseNumbersAsStringsFlag) != 0) && ((parseFlags & kParseInsituFlag) == 0)) {
|
||||||
|
s.Push('.');
|
||||||
|
}
|
||||||
decimalPosition = s.Length();
|
decimalPosition = s.Length();
|
||||||
|
|
||||||
if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9')))
|
if (RAPIDJSON_UNLIKELY(!(s.Peek() >= '0' && s.Peek() <= '9')))
|
||||||
@ -1236,6 +1241,10 @@ private:
|
|||||||
// Parse exp = e [ minus / plus ] 1*DIGIT
|
// Parse exp = e [ minus / plus ] 1*DIGIT
|
||||||
int exp = 0;
|
int exp = 0;
|
||||||
if (Consume(s, 'e') || Consume(s, 'E')) {
|
if (Consume(s, 'e') || Consume(s, 'E')) {
|
||||||
|
if ( ((parseFlags & kParseNumbersAsStringsFlag) != 0) && ((parseFlags & kParseInsituFlag) == 0) ) {
|
||||||
|
s.Push( 'e' );
|
||||||
|
}
|
||||||
|
|
||||||
if (!useDouble) {
|
if (!useDouble) {
|
||||||
d = static_cast<double>(use64bit ? i64 : i);
|
d = static_cast<double>(use64bit ? i64 : i);
|
||||||
useDouble = true;
|
useDouble = true;
|
||||||
@ -1277,15 +1286,24 @@ private:
|
|||||||
// Finish parsing, call event according to the type of number.
|
// Finish parsing, call event according to the type of number.
|
||||||
bool cont = true;
|
bool cont = true;
|
||||||
|
|
||||||
if (parseFlags & kParseNumbersAsStringsFlag)
|
if (parseFlags & kParseNumbersAsStringsFlag) {
|
||||||
{
|
|
||||||
s.Pop(); // Pop stack no matter if it will be used or not.
|
|
||||||
const size_t length = s.Tell() - startOffset;
|
|
||||||
|
|
||||||
cont = handler.RawNumber(head, length, (parseFlags & kParseInsituFlag) ? false : true);
|
if (parseFlags & kParseInsituFlag) {
|
||||||
|
s.Pop(); // Pop stack no matter if it will be used or not.
|
||||||
|
typename InputStream::Ch *head = is.PutBegin();
|
||||||
|
const size_t length = s.Tell() - startOffset;
|
||||||
|
RAPIDJSON_ASSERT(length <= 0xFFFFFFFF);
|
||||||
|
const typename TargetEncoding::Ch* const str = reinterpret_cast<typename TargetEncoding::Ch*>(head);
|
||||||
|
cont = handler.RawNumber(str, SizeType(length), false);
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
const char* str = s.Pop();
|
||||||
|
SizeType length = static_cast<SizeType>(s.Length()) - 1;
|
||||||
|
cont = handler.RawNumber(str, SizeType(length), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
size_t length = s.Length();
|
size_t length = s.Length();
|
||||||
const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not.
|
const char* decimal = s.Pop(); // Pop stack no matter if it will be used or not.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user