]> www.ginac.de Git - cln.git/blob - src/integer/bitwise/cl_I_log_aux.cc
f6dcaf49b569ccfc9bd33dc4efc865880d6f1cac
[cln.git] / src / integer / bitwise / cl_I_log_aux.cc
1 // I_to_DS_n_aux().
2 // General includes.
3 #include "cl_sysdep.h"
4
5 // Specification.
6 #include "cl_I_log.h"
7
8
9 // Implementation.
10
11 #include "cl_number.h"
12 #include "cl_I.h"
13 #include "cl_DS.h"
14
15 uintD* I_to_DS_n_aux (const cl_I& obj, uintC n, uintD* destptr)
16     { // Nun sind unterhalb von destptr n Digits Platz.
17       // oberen Teil der DS aus obj füllen, dabei destptr erniedrigen:
18       if (fixnump(obj))
19         // Fixnum:
20         {
21           #if (intDsize==64) // && (FN_maxlength==1)
22            lsprefnext(destptr) = FN_to_Q(obj);
23           #else // (intDsize<=32)
24            var uint32 wert = FN_to_L(obj);
25            #define FN_maxlength_a  (intLsize/intDsize)
26            #define FN_maxlength_b  (FN_maxlength<=FN_maxlength_a ? FN_maxlength : FN_maxlength_a)
27            // FN_maxlength Digits ablegen. Davon kann man FN_maxlength_b Digits aus wert nehmen.
28            #if (FN_maxlength_b > 1)
29            doconsttimes(FN_maxlength_b-1,
30              lsprefnext(destptr) = (uintD)wert; wert = wert >> intDsize;
31              );
32            #endif
33            lsprefnext(destptr) = (uintD)wert;
34            #if (FN_maxlength > FN_maxlength_b)
35            // Es ist oint_data_len = intLsize, brauche
36            // noch FN_maxlength-FN_maxlength_b = 1 Digit.
37            lsprefnext(destptr) = (sintD)sign_of(FN_to_L(obj));
38            #endif
39           #endif
40           n -= FN_maxlength;
41         }
42         else
43         // Bignum:
44         { var uintC len = TheBignum(obj)->length;
45           n -= len;
46           destptr = copy_loop_lsp(BN_LSDptr(obj),destptr,len); // DS kopieren
47         }
48       // unteren Teil mit Fülldigits, gebildet aus dem Vorzeichen, füllen:
49       if (!(n==0))
50         { destptr = fill_loop_lsp(destptr,n,sign_of_sintD(mspref(destptr,0))); }
51       // destptr zeigt nun aufs untere Ende der DS.
52       return destptr;
53     }