bignum support in ei?

Kent Boortz kent@REDACTED
Thu Jun 12 01:35:23 CEST 2003

Vance Shipley <vances@REDACTED> writes:
> How do I receive a bignum in ei?  Using ei_decode_long() doesn't work.

You mean an Erlang integer that don't fit in a C long or unsigned long?
No, there is no way to decode this in the current version of ei.

> When I send integers and use ei_print_term() to see what was received
> and ei_get_type() to see the type I get the following:
> Sent              Received                           Type
> ----------------  ---------------------------------  ---------------------
> 16#00000000       0                                  ERL_SMALL_INTEGER_EXT
> 16#00000001       1                                  ERL_SMALL_INTEGER_EXT
> 16#000000ff       1                                  ERL_SMALL_INTEGER_EXT
> 16#000001ff       65535                              ERL_INTEGER_EXT
> 16#00ffffff       16777215                           ERL_INTEGER_EXT
> 16#07ffffff       134217727                          ERL_INTEGER_EXT
> 16#08ffffff       #integer(2) = {65535,2303}         ERL_SMALL_BIG_EXT
> 16#ffffffff       #integer(2) = {65535,65535}        ERL_SMALL_BIG_EXT
> 16#fffffffffffff  #integer(3) = {65535,65535,65535}  ERL_SMALL_BIG_EXT
> Seems like a strange place to make the last break but anyway.

What do you mean? What break and why is it strange?

> The ei_get_type() function returns a size of 0 for ERL_SMALL_INTEGER_EXT
> and ERL_INTEGER_EXT but when the type is ERL_SMALL_BIG_EXT size is the
> number of elements in the tuple.  There is also an ERL_LARGE_BIG_EXT 
> type defined but I don't know how big a number you need to get it.
> I see from the source that there is an ei_decode_bignum() however it is
> noted that it just skips past it.

In R9C there will be a ei_decode_longlong() and ei_decode_ulonglong(),
e.i. 64-bit integers.

R9C on Unix will also include support for GMP bignums that can be
enabled if you have the GMP library installed and configure before
compiling from source using

  --with-gmp=PATH         specify location of GNU MP include and lib
  --with-gmp              use GNU MP (will search for it)

Using GMP you can handle integers of all sizes,



New functions (preleminary):

  int ei_decode_longlong(const char *buf, int *index, EI_LONGLONG *p);
  int ei_decode_ulonglong(const char *buf, int *index, EI_ULONGLONG *p);
  int ei_encode_longlong(char *buf, int *index, EI_LONGLONG p);
  int ei_encode_ulonglong(char *buf, int *index, EI_ULONGLONG p);
  int ei_x_encode_longlong(ei_x_buff* x, EI_LONGLONG n);
  int ei_x_encode_ulonglong(ei_x_buff* x, EI_ULONGLONG n);

  int ei_decode_bignum(const char *buf, int *index, mpz_t obj);
  int ei_encode_bignum(char *buf, int *index, mpz_t obj);
  int ei_x_encode_bignum(ei_x_buff *x, mpz_t obj);

More information about the erlang-questions mailing list