base_conv.c

Upload User: acmefrp
Upload Date: 2010-03-06
Package Size: 23768k
Code Size: 2k
Category: OS Develop
Development Platform: C/C++
  1. #ifdef sccsid
  2. static char     sccsid[] = "@(#)base_conv.c 1.1 92/07/30 Copyr 1986 Sun Micro";
  3. #endif
  4. /*
  5.  * Copyright (c) 1986 by Sun Microsystems, Inc. 
  6.  */
  7. /*
  8.  * Machine-independent versions of base conversion primitives.
  9.  * Routines to multiply buffers by 2**16 or 10**4. Base 10**4 buffers have
  10.  * b[i] < 10000, carry in and out < 65536. Base 2**16 buffers have b[i] <
  11.  * 65536, carry in and out < 10000. If n is positive, b[0]..b[n-1] are
  12.  * processed; if n is negative, b[0]..b[n+1] are processed. 
  13.  */
  14. void 
  15. _fourdigits(t, d)
  16. unsigned        t;
  17. char            d[4];
  18. /* Converts t < 10000 into four ascii digits at *pc.  */
  19. {
  20. register short  i;
  21. i = 3;
  22. do {
  23. d[i] = '0' + t % 10;
  24. t = t / 10;
  25. }
  26. while (--i != -1);
  27. }
  28. unsigned 
  29. _quorem10000(u, pr)
  30. unsigned        u;
  31. unsigned       *pr;
  32. {
  33. *pr = u % 10000;
  34. return (u / 10000);
  35. }
  36. void 
  37. _mul_10000(b, n, c)
  38. unsigned       *b;
  39. int             n;
  40. unsigned       *c;
  41. {
  42. /* Multiply base-2**16 buffer by 10000. */
  43. register unsigned carry, t;
  44. register short int i;
  45. register unsigned *pb;
  46. carry = *c;
  47. pb = b;
  48. if ((i = n) > 0) {
  49. i--;
  50. do {
  51. *pb = (t = (*pb * 10000) + carry) & 0xffff;
  52. pb++;
  53. carry = t >> 16;
  54. }
  55. while (--i != -1);
  56. } else {
  57. i = -i - 1;
  58. do {
  59. *pb = (t = (*pb * 10000) + carry) & 0xffff;
  60. pb--;
  61. carry = t >> 16;
  62. }
  63. while (--i != -1);
  64. }
  65. *c = carry;
  66. }
  67. void 
  68. _mul_65536(b, n, c)
  69. unsigned       *b;
  70. int             n;
  71. unsigned       *c;
  72. {
  73. /* Multiply base-10**4 buffer by 65536. */
  74. register unsigned carry, t;
  75. register short int i;
  76. register unsigned *pb;
  77. carry = *c;
  78. pb = b;
  79. if ((i = n) > 0) {
  80. i--;
  81. do {
  82. *pb = (t = (*pb << 16) | carry) % 10000;
  83. pb++;
  84. carry = t / 10000;
  85. }
  86. while (--i != -1);
  87. } else {
  88. i = -i - 1;
  89. do {
  90. *pb = (t = (*pb << 16) | carry) % 10000;
  91. pb--;
  92. carry = t / 10000;
  93. }
  94. while (--i != -1);
  95. }
  96. *c = carry;
  97. }