@@ -164,83 +164,34 @@ void cJSON_Delete(cJSON *c)
164
164
/* Parse the input text to generate a number, and populate the result into item. */
165
165
static const unsigned char * parse_number (cJSON * item , const unsigned char * num )
166
166
{
167
- double n = 0 ;
168
- double sign = 1 ;
169
- double scale = 0 ;
170
- int subscale = 0 ;
171
- int signsubscale = 1 ;
167
+ double number = 0 ;
168
+ unsigned char * endpointer = NULL ;
172
169
173
- /* Has sign? */
174
- if (* num == '-' )
170
+ number = strtod (( const char * ) num , ( char * * ) & endpointer );
171
+ if (( num == endpointer ) || ( num == NULL ) )
175
172
{
176
- sign = -1 ;
177
- num ++ ;
178
- }
179
- /* is zero */
180
- if (* num == '0' )
181
- {
182
- num ++ ;
183
- }
184
- /* Number? */
185
- if ((* num >= '1' ) && (* num <= '9' ))
186
- {
187
- do
188
- {
189
- n = (n * 10.0 ) + (* num ++ - '0' );
190
- }
191
- while ((* num >= '0' ) && (* num <='9' ));
192
- }
193
- /* Fractional part? */
194
- if ((* num == '.' ) && (num [1 ] >= '0' ) && (num [1 ] <= '9' ))
195
- {
196
- num ++ ;
197
- do
198
- {
199
- n = (n * 10.0 ) + (* num ++ - '0' );
200
- scale -- ;
201
- } while ((* num >= '0' ) && (* num <= '9' ));
202
- }
203
- /* Exponent? */
204
- if ((* num == 'e' ) || (* num == 'E' ))
205
- {
206
- num ++ ;
207
- /* With sign? */
208
- if (* num == '+' )
209
- {
210
- num ++ ;
211
- }
212
- else if (* num == '-' )
213
- {
214
- signsubscale = -1 ;
215
- num ++ ;
216
- }
217
- /* Number? */
218
- while ((* num >='0' ) && (* num <='9' ))
219
- {
220
- subscale = (subscale * 10 ) + (* num ++ - '0' );
221
- }
173
+ /* parse_error */
174
+ return NULL ;
222
175
}
223
176
224
- /* number = +/- number.fraction * 10^+/- exponent */
225
- n = sign * n * pow (10.0 , (scale + subscale * signsubscale ));
177
+ item -> valuedouble = number ;
226
178
227
- item -> valuedouble = n ;
228
179
/* use saturation in case of overflow */
229
- if (n >= INT_MAX )
180
+ if (number >= INT_MAX )
230
181
{
231
182
item -> valueint = INT_MAX ;
232
183
}
233
- else if (n <= INT_MIN )
184
+ else if (number <= INT_MIN )
234
185
{
235
186
item -> valueint = INT_MIN ;
236
187
}
237
188
else
238
189
{
239
- item -> valueint = (int )n ;
190
+ item -> valueint = (int )number ;
240
191
}
241
192
item -> type = cJSON_Number ;
242
193
243
- return num ;
194
+ return endpointer ;
244
195
}
245
196
246
197
/* calculate the next largest power of 2 */
0 commit comments