Skip to content

Commit 0747669

Browse files
committed
parse_number: Switch to C library's strtod
Replaces the hand written floating point parser with the C library implementation.
1 parent f09bdef commit 0747669

File tree

1 file changed

+11
-60
lines changed

1 file changed

+11
-60
lines changed

cJSON.c

+11-60
Original file line numberDiff line numberDiff line change
@@ -164,83 +164,34 @@ void cJSON_Delete(cJSON *c)
164164
/* Parse the input text to generate a number, and populate the result into item. */
165165
static const unsigned char *parse_number(cJSON *item, const unsigned char *num)
166166
{
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;
172169

173-
/* Has sign? */
174-
if (*num == '-')
170+
number = strtod((const char*)num, (char**)&endpointer);
171+
if ((num == endpointer) || (num == NULL))
175172
{
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;
222175
}
223176

224-
/* number = +/- number.fraction * 10^+/- exponent */
225-
n = sign * n * pow(10.0, (scale + subscale * signsubscale));
177+
item->valuedouble = number;
226178

227-
item->valuedouble = n;
228179
/* use saturation in case of overflow */
229-
if (n >= INT_MAX)
180+
if (number >= INT_MAX)
230181
{
231182
item->valueint = INT_MAX;
232183
}
233-
else if (n <= INT_MIN)
184+
else if (number <= INT_MIN)
234185
{
235186
item->valueint = INT_MIN;
236187
}
237188
else
238189
{
239-
item->valueint = (int)n;
190+
item->valueint = (int)number;
240191
}
241192
item->type = cJSON_Number;
242193

243-
return num;
194+
return endpointer;
244195
}
245196

246197
/* calculate the next largest power of 2 */

0 commit comments

Comments
 (0)