|  | @@ -130,25 +130,73 @@ void cJSON_Delete(cJSON *c)
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* Parse the input text to generate a number, and populate the result into item. */
 | 
	
		
			
				|  |  | -static const char *parse_number(cJSON *item,const char *num)
 | 
	
		
			
				|  |  | +static const char *parse_number(cJSON *item, const char *num)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -	double n=0,sign=1,scale=0;int subscale=0,signsubscale=1;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	if (*num=='-') sign=-1,num++;	/* Has sign? */
 | 
	
		
			
				|  |  | -	if (*num=='0') num++;			/* is zero */
 | 
	
		
			
				|  |  | -	if (*num>='1' && *num<='9')	do	n=(n*10.0)+(*num++ -'0');	while (*num>='0' && *num<='9');	/* Number? */
 | 
	
		
			
				|  |  | -	if (*num=='.' && num[1]>='0' && num[1]<='9') {num++;		do	n=(n*10.0)+(*num++ -'0'),scale--; while (*num>='0' && *num<='9');}	/* Fractional part? */
 | 
	
		
			
				|  |  | -	if (*num=='e' || *num=='E')		/* Exponent? */
 | 
	
		
			
				|  |  | -	{	num++;if (*num=='+') num++;	else if (*num=='-') signsubscale=-1,num++;		/* With sign? */
 | 
	
		
			
				|  |  | -		while (*num>='0' && *num<='9') subscale=(subscale*10)+(*num++ - '0');	/* Number? */
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +    double n = 0;
 | 
	
		
			
				|  |  | +    double sign = 1;
 | 
	
		
			
				|  |  | +    double scale = 0;
 | 
	
		
			
				|  |  | +    int subscale = 0;
 | 
	
		
			
				|  |  | +    int signsubscale = 1;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    /* Has sign? */
 | 
	
		
			
				|  |  | +    if (*num == '-')
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        sign = -1;
 | 
	
		
			
				|  |  | +        num++;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /* is zero */
 | 
	
		
			
				|  |  | +    if (*num == '0')
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        num++;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /* Number? */
 | 
	
		
			
				|  |  | +    if ((*num >= '1') && (*num <= '9'))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        do
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            n = (n * 10.0) + (*num++ - '0');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        while ((*num >= '0') && (*num<='9'));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /* Fractional part? */
 | 
	
		
			
				|  |  | +    if ((*num == '.') && (num[1] >= '0') && (num[1] <= '9'))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        num++;
 | 
	
		
			
				|  |  | +        do
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            n = (n  *10.0) + (*num++ - '0');
 | 
	
		
			
				|  |  | +            scale--;
 | 
	
		
			
				|  |  | +        } while ((*num >= '0') && (*num <= '9'));
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    /* Exponent? */
 | 
	
		
			
				|  |  | +    if ((*num == 'e') || (*num == 'E'))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        num++;
 | 
	
		
			
				|  |  | +        /* With sign? */
 | 
	
		
			
				|  |  | +        if (*num == '+')
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            num++;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        else if (*num == '-')
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            signsubscale = -1;
 | 
	
		
			
				|  |  | +            num++;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        /* Number? */
 | 
	
		
			
				|  |  | +        while ((*num>='0') && (*num<='9'))
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +            subscale = (subscale * 10) + (*num++ - '0');
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	n=sign*n*pow(10.0,(scale+subscale*signsubscale));	/* number = +/- number.fraction * 10^+/- exponent */
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -	item->valuedouble=n;
 | 
	
		
			
				|  |  | -	item->valueint=(int)n;
 | 
	
		
			
				|  |  | -	item->type=cJSON_Number;
 | 
	
		
			
				|  |  | -	return num;
 | 
	
		
			
				|  |  | +    /* number = +/- number.fraction * 10^+/- exponent */
 | 
	
		
			
				|  |  | +    n = sign * n * pow(10.0, (scale + subscale * signsubscale));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    item->valuedouble = n;
 | 
	
		
			
				|  |  | +    item->valueint = (int)n;
 | 
	
		
			
				|  |  | +    item->type = cJSON_Number;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return num;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static int pow2gt (int x)	{	--x;	x|=x>>1;	x|=x>>2;	x|=x>>4;	x|=x>>8;	x|=x>>16;	return x+1;	}
 |