Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / mstr.cpp
blobf09b066a1bf846b8cbab9fff58c3e0c0e0fb2871
1 // Convert bignum to string
3 #include "stdafx.h"
4 #include "defs.h"
6 static int divby1billion(unsigned int *);
8 static char *str;
9 static int len;
11 char *
12 mstr(unsigned int *a)
14 int k, n, r, sign;
15 char c;
17 if (str == NULL) {
18 str = (char *) malloc(1000);
19 len = 1000;
22 // estimate string size
24 n = 10 * MLENGTH(a) + 2;
26 if (n > len) {
27 free(str);
28 str = (char *) malloc(n);
29 len = n;
32 sign = MSIGN(a);
34 a = mcopy(a);
36 k = len - 1;
38 str[k] = 0;
40 for (;;) {
41 k -= 9;
42 r = divby1billion(a);
43 c = str[k + 9];
44 sprintf(str + k, "%09d", r);
45 str[k + 9] = c;
46 if (MZERO(a))
47 break;
50 // remove leading zeroes
52 while (str[k] == '0')
53 k++;
55 if (str[k] == 0)
56 k--;
58 // sign
60 if (sign == -1) {
61 k--;
62 str[k] = '-';
65 mfree(a);
67 return str + k;
70 // Returns remainder as function value, quotient returned in a.
72 static int
73 divby1billion(unsigned int *a)
75 int i;
76 unsigned long long kk;
78 kk = 0;
80 for (i = MLENGTH(a) - 1; i >= 0; i--) {
82 if (little_endian()) {
83 ((unsigned int *) &kk)[1] = ((unsigned int *) &kk)[0];
84 ((unsigned int *) &kk)[0] = a[i];
85 } else {
86 ((unsigned int *) &kk)[0] = ((unsigned int *) &kk)[1];
87 ((unsigned int *) &kk)[1] = a[i];
90 a[i] = (int) (kk / 1000000000);
92 kk -= (unsigned long long) 1000000000 * a[i];
95 // length of quotient
97 for (i = MLENGTH(a) - 1; i > 0; i--)
98 if (a[i])
99 break;
101 MLENGTH(a) = i + 1;
103 if (little_endian())
104 return ((unsigned int *) &kk)[0];
105 else
106 return ((unsigned int *) &kk)[1];