cJSONコード読解(6)——JSON数値解析

1730 ワード

parse_numberはjson数値解析を行う関数である.
1、まず数値にマイナス記号があるかどうかを判断する
2、数値の先頭の0をスキップ
3、数値を計算する整数部分——文字列から数値に変換する
4、数値を計算する小数部——文字列から数値に変換する
5、次のjsonデータの位置を返す
/* Parse the input text to generate a number, and populate the result into item. */
//     
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? */

    //      0
    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? */
    }

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