7 #include "cln/integer.h"
12 #include "cln/number.h"
16 #include "cln/integer_io.h"
17 #include "cln/abort.h"
21 sint32 cl_I_to_L (const cl_I& obj)
27 var cl_heap_bignum* bn = TheBignum(obj);
28 var uintC len = bn->length;
29 if ((sintD)mspref(arrayMSDptr(bn->data,len),0) >= 0) {
31 #define IF_LENGTH(i) \
32 if (bn_minlength <= i) /* genau i Digits überhaupt möglich? */\
33 if (len == i) /* genau i Digits? */ \
34 /* 2^((i-1)*intDsize-1) <= obj < 2^(i*intDsize-1) */ \
35 if ( (i*intDsize > 32) \
36 && ( ((i-1)*intDsize >= 32) \
37 || (mspref(arrayMSDptr(bn->data,len),0) >= (uintD)bitc(31-(i-1)*intDsize)) \
42 return get_uint1D_Dptr(arrayLSDptr(bn->data,1));
44 return get_uint2D_Dptr(arrayLSDptr(bn->data,2));
46 return get_uint3D_Dptr(arrayLSDptr(bn->data,3));
48 return get_uint4D_Dptr(arrayLSDptr(bn->data,4));
52 #define IF_LENGTH(i) \
53 if (bn_minlength <= i) /* genau i Digits überhaupt möglich? */\
54 if (len == i) /* genau i Digits? */ \
55 /* - 2^(i*intDsize-1) <= obj < - 2^((i-1)*intDsize-1) */ \
56 if ( (i*intDsize > 32) \
57 && ( ((i-1)*intDsize >= 32) \
58 || (mspref(arrayMSDptr(bn->data,len),0) < (uintD)(-bitc(31-(i-1)*intDsize))) \
63 return get_sint1D_Dptr(arrayLSDptr(bn->data,1));
65 return get_sint2D_Dptr(arrayLSDptr(bn->data,2));
67 return get_sint3D_Dptr(arrayLSDptr(bn->data,3));
69 return get_sint4D_Dptr(arrayLSDptr(bn->data,4));
72 bad: // unpassendes Objekt
73 fprint(std::cerr, "Not a 32-bit integer: ");
74 fprint(std::cerr, obj);
75 fprint(std::cerr, "\n");