protected JsonToken parseNumberText(int ch)
            throws IOException, JsonParseException
    {
        /* Although we will always be complete with respect to textual
         * representation (that is, all characters will be parsed),
         * actual conversion to a number is deferred. Thus, need to
         * note that no representations are valid yet
         */
        boolean negative = (ch == INT_MINUS);
        int ptr = _inputPtr;
        int startPtr = ptr-1; // to include sign/digit already read
        final int inputLen = _inputEnd;

        dummy_loop:
        do { // dummy loop, to be able to break out
            if (negative) { // need to read the next digit
                if (ptr >= _inputEnd) {
                    break dummy_loop;
                }
                ch = _inputBuffer[ptr++];
                // First check: must have a digit to follow minus sign
                if (ch > INT_9 || ch < INT_0) {
                    _inputPtr = ptr;
                    return _handleInvalidNumberStart(ch, true);
                }
                /* (note: has been checked for non-negative already, in
                 * the dispatching code that determined it should be
                 * a numeric value)
                 */
            }
            // One special case, leading zero(es):
            if (ch == INT_0) {
                break dummy_loop;
            }

            /* First, let's see if the whole number is contained within
            * the input buffer unsplit. This should be the common case;
            * and to simplify processing, we will just reparse contents
            * in the alternative case (number split on buffer boundary)
            */

            int intLen = 1; // already got one

            // First let's get the obligatory integer part:

            int_loop:
            while (true) {
                if (ptr >= _inputEnd) {
                    break dummy_loop;
                }
                ch = (int) _inputBuffer[ptr++];
                if (ch < INT_0 || ch > INT_9) {
                    break int_loop;
                }
                ++intLen;
            }

            int fractLen = 0;

            // And then see if we get other parts
            if (ch == '.') { // yes, fraction
                fract_loop:
                while (true) {
                    if (ptr >= inputLen) {
                        break dummy_loop;
                    }
                    ch = (int) _inputBuffer[ptr++];
                    if (ch < INT_0 || ch > INT_9) {
                        break fract_loop;
                    }
                    ++fractLen;
                }
                // must be followed by sequence of ints, one minimum
                if (fractLen == 0) {
                    reportUnexpectedNumberChar(ch, "Decimal point not followed by a digit");
                }
            }

            int expLen = 0;
            if (ch == INT_e || ch == INT_E) { // and/or exponent
                if (ptr >= inputLen) {
                    break dummy_loop;
                }
                // Sign indicator?
                ch = (int) _inputBuffer[ptr++];
                if (ch == INT_MINUS || ch == INT_PLUS) { // yup, skip for now
                    if (ptr >= inputLen) {
                        break dummy_loop;
                    }
                    ch = (int) _inputBuffer[ptr++];
                }
                while (ch <= INT_9 && ch >= INT_0) {
                    ++expLen;
                    if (ptr >= inputLen) {
                        break dummy_loop;
                    }
                    ch = (int) _inputBuffer[ptr++];
                }
                // must be followed by sequence of ints, one minimum
                if (expLen == 0) {
                    reportUnexpectedNumberChar(ch, "Exponent indicator not followed by a digit");
                }
            }

            // Got it all: let's add to text buffer for parsing, access
            --ptr; // need to push back following separator
            _inputPtr = ptr;
            int len = ptr-startPtr;
            _textBuffer.resetWithShared(_inputBuffer, startPtr, len);
            return reset(negative, intLen, fractLen, expLen);
        } while (false);

        _inputPtr = negative ? (startPtr+1) : startPtr;
        return parseNumberText2(negative);
    }
protected JsonToken parseNumberText(int ch)
            throws IOException, JsonParseException
    {
        
        boolean negative = (ch == INT_MINUS);
        int ptr = _inputPtr;
        int startPtr = ptr-1; 
        final int inputLen = _inputEnd;

        dummy_loop:
        do { 
            if (negative) { 
                if (ptr >= _inputEnd) {
                    break dummy_loop;
                }
                ch = _inputBuffer[ptr++];
                
                if (ch > INT_9 || ch < INT_0) {
                    _inputPtr = ptr;
                    return _handleInvalidNumberStart(ch, true);
                }
                
            }
            
            if (ch == INT_0) {
                break dummy_loop;
            }

            

            int intLen = 1; 

            

            int_loop:
            while (true) {
                if (ptr >= _inputEnd) {
                    break dummy_loop;
                }
                ch = (int) _inputBuffer[ptr++];
                if (ch < INT_0 || ch > INT_9) {
                    break int_loop;
                }
                ++intLen;
            }

            int fractLen = 0;

            
            if (ch == '.') { 
                fract_loop:
                while (true) {
                    if (ptr >= inputLen) {
                        break dummy_loop;
                    }
                    ch = (int) _inputBuffer[ptr++];
                    if (ch < INT_0 || ch > INT_9) {
                        break fract_loop;
                    }
                    ++fractLen;
                }
                
                if (fractLen == 0) {
                    reportUnexpectedNumberChar(ch, "Decimal point not followed by a digit");
                }
            }

            int expLen = 0;
            if (ch == INT_e || ch == INT_E) { 
                if (ptr >= inputLen) {
                    break dummy_loop;
                }
                
                ch = (int) _inputBuffer[ptr++];
                if (ch == INT_MINUS || ch == INT_PLUS) { 
                    if (ptr >= inputLen) {
                        break dummy_loop;
                    }
                    ch = (int) _inputBuffer[ptr++];
                }
                while (ch <= INT_9 && ch >= INT_0) {
                    ++expLen;
                    if (ptr >= inputLen) {
                        break dummy_loop;
                    }
                    ch = (int) _inputBuffer[ptr++];
                }
                
                if (expLen == 0) {
                    reportUnexpectedNumberChar(ch, "Exponent indicator not followed by a digit");
                }
            }

            
            --ptr; 
            _inputPtr = ptr;
            int len = ptr-startPtr;
            _textBuffer.resetWithShared(_inputBuffer, startPtr, len);
            return reset(negative, intLen, fractLen, expLen);
        } while (false);

        _inputPtr = negative ? (startPtr+1) : startPtr;
        return parseNumberText2(negative);
    }
protected JsonToken parseNumberText ( int ch ) throws IOException , JsonParseException { /* Although we will always be complete with respect to textual
         * representation (that is, all characters will be parsed),
         * actual conversion to a number is deferred. Thus, need to
         * note that no representations are valid yet
         */ boolean negative = ( ch == INT_MINUS ) ; int ptr = _inputPtr ; int startPtr = ptr - 1 ; // to include sign/digit already read final int inputLen = _inputEnd ; dummy_loop : do { // dummy loop, to be able to break out if ( negative ) { // need to read the next digit if ( ptr >= _inputEnd ) { break dummy_loop ; } ch = _inputBuffer [ ptr ++ ] ; // First check: must have a digit to follow minus sign if ( ch > INT_9 || ch < INT_0 ) { _inputPtr = ptr ; return _handleInvalidNumberStart ( ch , true ) ; } /* (note: has been checked for non-negative already, in
                 * the dispatching code that determined it should be
                 * a numeric value)
                 */ } // One special case, leading zero(es): if ( ch == INT_0 ) { break dummy_loop ; } /* First, let's see if the whole number is contained within
            * the input buffer unsplit. This should be the common case;
            * and to simplify processing, we will just reparse contents
            * in the alternative case (number split on buffer boundary)
            */ int intLen = 1 ; // already got one // First let's get the obligatory integer part: int_loop : while ( true ) { if ( ptr >= _inputEnd ) { break dummy_loop ; } ch = ( int ) _inputBuffer [ ptr ++ ] ; if ( ch < INT_0 || ch > INT_9 ) { break int_loop ; } ++ intLen ; } int fractLen = 0 ; // And then see if we get other parts if ( ch == ' ' ) { // yes, fraction fract_loop : while ( true ) { if ( ptr >= inputLen ) { break dummy_loop ; } ch = ( int ) _inputBuffer [ ptr ++ ] ; if ( ch < INT_0 || ch > INT_9 ) { break fract_loop ; } ++ fractLen ; } // must be followed by sequence of ints, one minimum if ( fractLen == 0 ) { reportUnexpectedNumberChar ( ch , "Decimal point not followed by a digit" ) ; } } int expLen = 0 ; if ( ch == INT_e || ch == INT_E ) { // and/or exponent if ( ptr >= inputLen ) { break dummy_loop ; } // Sign indicator? ch = ( int ) _inputBuffer [ ptr ++ ] ; if ( ch == INT_MINUS || ch == INT_PLUS ) { // yup, skip for now if ( ptr >= inputLen ) { break dummy_loop ; } ch = ( int ) _inputBuffer [ ptr ++ ] ; } while ( ch <= INT_9 && ch >= INT_0 ) { ++ expLen ; if ( ptr >= inputLen ) { break dummy_loop ; } ch = ( int ) _inputBuffer [ ptr ++ ] ; } // must be followed by sequence of ints, one minimum if ( expLen == 0 ) { reportUnexpectedNumberChar ( ch , "Exponent indicator not followed by a digit" ) ; } } // Got it all: let's add to text buffer for parsing, access -- ptr ; // need to push back following separator _inputPtr = ptr ; int len = ptr - startPtr ; _textBuffer . resetWithShared ( _inputBuffer , startPtr , len ) ; return reset ( negative , intLen , fractLen , expLen ) ; } while ( false ) ; _inputPtr = negative ? ( startPtr + 1 ) : startPtr ; return parseNumberText2 ( negative ) ; }
Initial parsing method for number values. It needs to be able
to parse enough input to be able to determine whether the
value is to be considered a simple integer value, or a more
generic decimal value: latter of which needs to be expressed
as a floating point number. The basic rule is that if the number
has no fractional or exponential part, it is an integer; otherwise
a floating point number.
<p>
Because much of input has to be processed in any case, no partial
parsing is done: all input text will be stored for further
processing. However, actual numeric value conversion will be
deferred, since it is usually the most complicated and costliest
part of processing.
Initial parsing method for number values . It needs to be able to parse enough input to be able to determine whether the value is to be considered a simple integer value or a more generic decimal value : latter of which needs to be expressed as a floating point number . The basic rule is that if the number has no fractional or exponential part it is an integer ; otherwise a floating point number . <p > Because much of input has to be processed in any case no partial parsing is done : all input text will be stored for further processing . However actual numeric value conversion will be deferred since it is usually the most complicated and costliest part of processing .