|
@@ -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; }
|