mstr.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Convert bignum to string
  2. #include "stdafx.h"
  3. #include "defs.h"
  4. static int divby1billion(unsigned int *);
  5. static char *str;
  6. static int len;
  7. char *
  8. mstr(unsigned int *a)
  9. {
  10. int k, n, r, sign;
  11. char c;
  12. if (str == NULL) {
  13. str = (char *) malloc(1000);
  14. len = 1000;
  15. }
  16. // estimate string size
  17. n = 10 * MLENGTH(a) + 2;
  18. if (n > len) {
  19. free(str);
  20. str = (char *) malloc(n);
  21. len = n;
  22. }
  23. sign = MSIGN(a);
  24. a = mcopy(a);
  25. k = len - 1;
  26. str[k] = 0;
  27. for (;;) {
  28. k -= 9;
  29. r = divby1billion(a);
  30. c = str[k + 9];
  31. sprintf(str + k, "%09d", r);
  32. str[k + 9] = c;
  33. if (MZERO(a))
  34. break;
  35. }
  36. // remove leading zeroes
  37. while (str[k] == '0')
  38. k++;
  39. if (str[k] == 0)
  40. k--;
  41. // sign
  42. if (sign == -1) {
  43. k--;
  44. str[k] = '-';
  45. }
  46. mfree(a);
  47. return str + k;
  48. }
  49. // Returns remainder as function value, quotient returned in a.
  50. static int
  51. divby1billion(unsigned int *a)
  52. {
  53. int i;
  54. unsigned long long kk;
  55. kk = 0;
  56. for (i = MLENGTH(a) - 1; i >= 0; i--) {
  57. if (little_endian()) {
  58. ((unsigned int *) &kk)[1] = ((unsigned int *) &kk)[0];
  59. ((unsigned int *) &kk)[0] = a[i];
  60. } else {
  61. ((unsigned int *) &kk)[0] = ((unsigned int *) &kk)[1];
  62. ((unsigned int *) &kk)[1] = a[i];
  63. }
  64. a[i] = (int) (kk / 1000000000);
  65. kk -= (unsigned long long) 1000000000 * a[i];
  66. }
  67. // length of quotient
  68. for (i = MLENGTH(a) - 1; i > 0; i--)
  69. if (a[i])
  70. break;
  71. MLENGTH(a) = i + 1;
  72. if (little_endian())
  73. return ((unsigned int *) &kk)[0];
  74. else
  75. return ((unsigned int *) &kk)[1];
  76. }