#ifndef _BIGNUM_H_
#define _BIGNUM_H_

#include "internal.h"

typedef struct big_struct bignum;

#define BIG_SIGN_0 0
#define BIG_SIGN_PLUS 1
#define BIG_SIGN_MINUS -1

#define BIG_OK 0
#define BIG_MEMERR 1
#define BIG_DIV_ZERO 2
#define BIG_ARGERR 3

#ifdef BIG_SHORT_NAMES
#define big_set_big	big_sb
#define big_set_long	big_sl
#define big_set_ulong	big_usl
#define big_string	big_rs
#define big_leqp	big_lq
#define big_expt	big_x
#endif

/* External variables to take care about when using the bignums */
typedef int bigerr_t;
extern int big_errno;
extern char *big_end_string;

/* External functions to enable use of bignums */
extern bigerr_t big_init_pkg();
extern void big_release_pkg();

extern bigerr_t big_create();
extern void big_destroy();

extern unsigned long big_bitcount();

extern bigerr_t big_set_big();
extern void big_set_long();
extern void big_set_ulong();
extern bigerr_t big_set_string();

extern int big_long();
extern int big_ulong();
extern char *big_string();

extern int big_sign();
extern bigerr_t big_abs();

extern bigerr_t big_negate();

extern int big_compare();
extern int big_lessp();
extern int big_leqp();
extern int big_equalp();
extern int big_geqp();
extern int big_greaterp();

extern int big_zerop();
extern int big_evenp();
extern int big_oddp();

extern bigerr_t big_add();
extern bigerr_t big_sub();

extern bigerr_t big_mul();

extern bigerr_t big_trunc();
extern bigerr_t big_floor();
extern bigerr_t big_ceil();
extern bigerr_t big_round();

extern bigerr_t big_random();

extern bigerr_t big_expt();
extern bigerr_t big_exptmod();
extern bigerr_t big_gcd();

#ifndef NULL
#define NULL 0
#endif

#endif /* _BIGNUM_H_ */

