数式の評価を原始的に #15

加算を行う関数を実装する。
これは第一引数に対して加算操作を行って結果をそれに反映するのでなく、
第一引数と第二引数を加算して第三引数をその結果で初期化する。
第三引数は初期化前または後始末後でないとメモリリークする。

...snip
void mpi_add(Mpi *a, Mpi *b, Mpi*c);
...snip
void mpi_add(Mpi *a, Mpi *b, Mpi*c)
{
    size_t i;
    unsigned int carry;

    if (a->ndigit < b->ndigit) {
        Mpi *t = a;
        a = b;
        b = t;
    }
    c->digit = malloc(a->ndigit + 1);
    for (i = 0, carry = 0; i < b->ndigit; i++) {
        unsigned int s = a->digit[i] + b->digit[i] + carry;
        c->digit[i] = s & (256 - 1);
        carry = s >> 8;
    }
    for (; i < a->ndigit; i++) {
        unsigned int s = a->digit[i] + carry;
        c->digit[i] = s & (256 - 1);
        carry = s >> 8;
    }
    if (carry != 0) {
        c->digit[i] = carry;
        c->ndigit = i + 1;
    } else {
        c->ndigit = i;
    }
}