K&Rを読もう(39) 4-2 atofの写経

K&Rのatofの写経をした。

double atof_copy(char s[])
{
    double value = 0, power = 1;
    int i,sign;

    for (i = 0; isspace(s[i]); i++)
        ;
    sign = (s[i] == '-') ? -1 : 1;
    if (s[i] == '+' || s[i] == '-')
        i++;
    for (; isdigit(s[i]); i++)
        value = value * 10 + s[i] - '0';
    if (s[i] == '.')
        i++;
    for (; isdigit(s[i]); i++) {
        value = value * 10 + s[i] - '0';
        power *= 10.0;
    }
    return sign * value / power;
}

数字は全て10倍でvalueに保存して、最後にpowerで割る。なるほど。

ついでにglibcのatofを読んでみる。

stdlib/atof.c -> strtol.c -> strtol_l.cと呼び出して、INT INTERNAL (__strtol_l) (nptr, endptr, base, group, loc)に実装がある。

読んでみる。

・・・

ぐはぁ。さすがはGNU。マクロだらけ。頑張って読んでみる。

・・・

読んでみると、マクロだらけな理由がわかってくる。使いまわしっぷりが凄い。