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

任意長非負整数に関する実装をする。
まず、数字列による10進数表記で任意長非負整数を初期化する関数と後始末する関数から。

#include <stdlib.h>
#include <string.h>

typedef struct {
    size_t ndigit;
    unsigned char *digit;
} Mpi;

void mpi_init_with_decimal_expr(Mpi *mpi, const char *str);
void mpi_fin(Mpi *mpi);

void mpi_init_with_decimal_expr(Mpi *mpi, const char *str)
{
    unsigned char *digit = malloc((size_t)(0.4152410119 * strlen(str)) + 1);
    size_t ndigit = 1;

    digit[0] = 0;
    while (*str != '\0') {
        unsigned int c = *str++ - '0';
        size_t n = 0;
        do {
            c += 10 * digit[n];
            digit[n] = c & (256 - 1);
            c >>= 8;
            n++;
        } while (n < ndigit);
        while (c > 0) {
            digit[n] = c & (256 - 1);
            c >>= 8;
            n++;
        }
        ndigit = n;
    }

    mpi->ndigit = ndigit;
    mpi->digit = digit;
}

void mpi_fin(Mpi *mpi)
{
    free(mpi->digit);
}