e576bb | 2002-10-11 | Martin Nilsson | | |
1ab4ac | 2008-01-26 | Martin Stjernholm | | || $Id: bignum.c,v 1.42 2008/01/26 22:34:17 mast Exp $
|
e576bb | 2002-10-11 | Martin Nilsson | | */
|
1b10db | 2002-10-08 | Martin Nilsson | |
|
fda0de | 1999-10-08 | Fredrik Noring | | #include "global.h"
#ifdef AUTO_BIGNUM
#include "interpret.h"
#include "program.h"
#include "object.h"
#include "svalue.h"
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | #include "pike_error.h"
|
fda0de | 1999-10-08 | Fredrik Noring | |
|
6ad237 | 2002-05-11 | Martin Nilsson | | #define sp Pike_sp
|
c84bd1 | 2003-01-13 | Henrik Grubbström (Grubba) | | PMOD_EXPORT struct svalue auto_bignum_program = {
|
1ab4ac | 2008-01-26 | Martin Stjernholm | | PIKE_T_FREE, 0,
|
2fbeae | 2001-07-01 | Martin Stjernholm | | #ifdef HAVE_UNION_INIT
{0},
#endif
};
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct program *get_auto_bignum_program(void)
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | {
return program_from_function(&auto_bignum_program);
}
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct program *get_auto_bignum_program_or_zero(void)
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | {
|
1ab4ac | 2008-01-26 | Martin Stjernholm | | if (auto_bignum_program.type == PIKE_T_FREE)
|
91487e | 2003-01-11 | Martin Stjernholm | | return 0;
|
8852cb | 1999-10-25 | Fredrik Hübinette (Hubbe) | | return program_from_function(&auto_bignum_program);
}
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | void exit_auto_bignum(void)
{
free_svalue(&auto_bignum_program);
|
1ab4ac | 2008-01-26 | Martin Stjernholm | | mark_free_svalue (&auto_bignum_program);
|
fda0de | 1999-10-08 | Fredrik Noring | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void convert_stack_top_to_bignum(void)
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | {
apply_svalue(&auto_bignum_program, 1);
|
fda0de | 1999-10-08 | Fredrik Noring | |
|
ef2429 | 2003-02-14 | Martin Stjernholm | | if(sp[-1].type != T_OBJECT) {
|
2c83b4 | 2003-01-27 | Mirar (Pontus Hagland) | | if (auto_bignum_program.type!=T_PROGRAM)
|
543c04 | 2003-01-27 | Mirar (Pontus Hagland) | | Pike_error("Gmp.mpz conversion failed (Gmp.bignum not loaded).\n");
else
|
beec8d | 2003-01-27 | Mirar (Pontus Hagland) | | Pike_error("Gmp.mpz conversion failed (unknown error).\n");
|
ef2429 | 2003-02-14 | Martin Stjernholm | | }
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | }
|
fda0de | 1999-10-08 | Fredrik Noring | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void convert_stack_top_with_base_to_bignum(void)
|
31ea27 | 1999-10-22 | Fredrik Noring | | {
apply_svalue(&auto_bignum_program, 2);
|
ef2429 | 2003-02-14 | Martin Stjernholm | | if(sp[-1].type != T_OBJECT) {
|
2c83b4 | 2003-01-27 | Mirar (Pontus Hagland) | | if (auto_bignum_program.type!=T_PROGRAM)
|
543c04 | 2003-01-27 | Mirar (Pontus Hagland) | | Pike_error("Gmp.mpz conversion failed (Gmp.bignum not loaded).\n");
else
Pike_error("Gmp.mpz conversion failed (unknown error).\n");
|
ef2429 | 2003-02-14 | Martin Stjernholm | | }
|
31ea27 | 1999-10-22 | Fredrik Noring | | }
|
39ac73 | 1999-10-20 | Fredrik Noring | | int is_bignum_object(struct object *o)
{
|
e28b47 | 1999-10-25 | Fredrik Hübinette (Hubbe) | |
|
91487e | 2003-01-11 | Martin Stjernholm | | if (auto_bignum_program.type == T_INT)
|
3905cf | 1999-11-11 | Fredrik Hübinette (Hubbe) | | return 0;
|
e28b47 | 1999-10-25 | Fredrik Hübinette (Hubbe) | |
|
1c1c5e | 2001-04-08 | Fredrik Hübinette (Hubbe) | | return o->prog == program_from_svalue(&auto_bignum_program);
|
39ac73 | 1999-10-20 | Fredrik Noring | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT int is_bignum_object_in_svalue(struct svalue *sv)
|
39ac73 | 1999-10-20 | Fredrik Noring | | {
|
6b304c | 2004-12-30 | Henrik Grubbström (Grubba) | |
|
39ac73 | 1999-10-20 | Fredrik Noring | | return sv->type == T_OBJECT && is_bignum_object(sv->u.object);
}
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | |
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct object *make_bignum_object(void)
|
fda0de | 1999-10-08 | Fredrik Noring | | {
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | convert_stack_top_to_bignum();
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | dmalloc_touch_svalue(sp-1);
|
39ac73 | 1999-10-20 | Fredrik Noring | | return (--sp)->u.object;
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct object *bignum_from_svalue(struct svalue *s)
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | {
push_svalue(s);
convert_stack_top_to_bignum();
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | dmalloc_touch_svalue(sp-1);
|
39ac73 | 1999-10-20 | Fredrik Noring | | return (--sp)->u.object;
|
fda0de | 1999-10-08 | Fredrik Noring | | }
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT struct pike_string *string_from_bignum(struct object *o, int base)
|
ff0d46 | 1999-10-15 | Fredrik Noring | | {
push_int(base);
safe_apply(o, "digits", 1);
if(sp[-1].type != T_STRING)
|
b2d3e4 | 2000-12-01 | Fredrik Hübinette (Hubbe) | | Pike_error("Gmp.mpz string conversion failed.\n");
|
ff0d46 | 1999-10-15 | Fredrik Noring | |
|
50ea68 | 2003-03-14 | Henrik Grubbström (Grubba) | | dmalloc_touch_svalue(sp-1);
|
ff0d46 | 1999-10-15 | Fredrik Noring | | return (--sp)->u.string;
}
|
1f2133 | 2000-07-28 | Fredrik Hübinette (Hubbe) | | PMOD_EXPORT void convert_svalue_to_bignum(struct svalue *s)
|
fda0de | 1999-10-08 | Fredrik Noring | | {
|
e37a3e | 1999-10-09 | Fredrik Hübinette (Hubbe) | | push_svalue(s);
convert_stack_top_to_bignum();
free_svalue(s);
*s=sp[-1];
|
fda0de | 1999-10-08 | Fredrik Noring | | sp--;
|
e801bb | 1999-10-24 | Henrik Grubbström (Grubba) | | dmalloc_touch_svalue(sp);
|
fda0de | 1999-10-08 | Fredrik Noring | | }
|
bd35ec | 1999-10-30 | Fredrik Noring | | #ifdef INT64
|
0b926d | 2003-04-02 | Martin Stjernholm | | static void bootstrap_push_int64 (INT64 i)
|
2fe565 | 1999-10-29 | Fredrik Noring | | {
|
0a5d06 | 2000-08-08 | Henrik Grubbström (Grubba) | | if(i == DO_NOT_WARN((INT_TYPE)i))
|
2fe565 | 1999-10-29 | Fredrik Noring | | {
|
0a5d06 | 2000-08-08 | Henrik Grubbström (Grubba) | | push_int(DO_NOT_WARN((INT_TYPE)i));
|
2fe565 | 1999-10-29 | Fredrik Noring | | }
else
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | | Pike_fatal ("Failed to convert large integer (Gmp.bignum not loaded).\n");
|
2fe565 | 1999-10-29 | Fredrik Noring | | }
|
956e5e | 2003-03-28 | Martin Stjernholm | | PMOD_EXPORT void (*push_int64) (INT64) = bootstrap_push_int64;
PMOD_EXPORT int (*int64_from_bignum) (INT64 *, struct object *) = NULL;
|
00cf02 | 2003-11-15 | Martin Stjernholm | | PMOD_EXPORT void (*reduce_stack_top_bignum) (void) = NULL;
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | |
PMOD_EXPORT void hook_in_int64_funcs (
void (*push_int64_val)(INT64),
|
00cf02 | 2003-11-15 | Martin Stjernholm | | int (*int64_from_bignum_val) (INT64 *, struct object *),
void (*reduce_stack_top_bignum_val) (void))
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | | {
push_int64 = push_int64_val ? push_int64_val : bootstrap_push_int64;
int64_from_bignum = int64_from_bignum_val;
|
00cf02 | 2003-11-15 | Martin Stjernholm | | reduce_stack_top_bignum = reduce_stack_top_bignum_val;
|
f6a5c6 | 2003-04-02 | Martin Stjernholm | | }
|
956e5e | 2003-03-28 | Martin Stjernholm | | #endif
|
2fe565 | 1999-10-29 | Fredrik Noring | |
|
fda0de | 1999-10-08 | Fredrik Noring | | #endif /* AUTO_BIGNUM */
|