#ifndef __BIGNUM_H__
#define __BIGNUM_H__

#include <stdlib.h>

typedef struct BigNum {
    int sign; // Знак числа, 1 или -1.
    int *data; // Массив с частями числа.
        // Каждая часть хранит числа от 0 до 9999 включительно,
        // что соответствует записи числа в системе с основанием
        // 10000.
        // data[0] хранит в себе младший разряд числа.
    size_t size; // Размер массива data.
} BigNum;

BigNum *BigNum_make(char *source);	// Create
BigNum *BigNum_copy(BigNum * bn);	// Copy
void BigNum_free(BigNum * bn);	// Destroy

void BigNum_print(BigNum * bn);	// Print to standard output.
void BigNum_set_size(BigNum * bn, size_t new_size);	// Adjust size.
// Тонкий момент: если новый размер больше старого, нужно
// записать в новые добавленные элементы массива нули,
// иначе там будет мусор.

void BigNum_add(BigNum * nb1, BigNum * nb2);	// Addition. bn1 += bn2
void BigNum_sub(BigNum * nb1, BigNum * nb2);	// Substraction. bn1 -= bn2
void BigNum_mul(BigNum * nb1, BigNum * nb2);	// Multiplication. bn1 *- nb2

int BigNum_eq(BigNum * nb1, BigNum * nb2);	// Equality. bn1 == bn2
void BigNum_check_add(char *bn1_str, char *bn2_str, char *result_str);
// Проверяем, правильно ли работает сложение.
// результат сложения чисел из строк bn1_str и bn2_str должен быть равен 
// числу в result_str.

#endif