1 #include <tommath.h> 2 #ifdef BN_MP_TORADIX_C 3 /* LibTomMath, multiple-precision integer library -- Tom St Denis 4 * 5 * LibTomMath is a library that provides multiple-precision 6 * integer arithmetic as well as number theoretic functionality. 7 * 8 * The library was designed directly after the MPI library by 9 * Michael Fromberger but has been written from scratch with 10 * additional optimizations in place. 11 * 12 * The library is free for all purposes without any express 13 * guarantee it works. 14 * 15 * Tom St Denis, tomstdenis (at) gmail.com, http://math.libtomcrypt.com 16 */ 17 18 /* stores a bignum as a ASCII string in a given radix (2..64) */ 19 int mp_toradix (mp_int * a, char *str, int radix) 20 { 21 int res, digs; 22 mp_int t; 23 mp_digit d; 24 char *_s = str; 25 26 /* check range of the radix */ 27 if (radix < 2 || radix > 64) { 28 return MP_VAL; 29 } 30 31 /* quick out if its zero */ 32 if (mp_iszero(a) == 1) { 33 *str++ = '0'; 34 *str = '\0'; 35 return MP_OKAY; 36 } 37 38 if ((res = mp_init_copy (&t, a)) != MP_OKAY) { 39 return res; 40 } 41 42 /* if it is negative output a - */ 43 if (t.sign == MP_NEG) { 44 ++_s; 45 *str++ = '-'; 46 t.sign = MP_ZPOS; 47 } 48 49 digs = 0; 50 while (mp_iszero (&t) == 0) { 51 if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { 52 mp_clear (&t); 53 return res; 54 } 55 *str++ = mp_s_rmap[d]; 56 ++digs; 57 } 58 59 /* reverse the digits of the string. In this case _s points 60 * to the first digit [exluding the sign] of the number] 61 */ 62 bn_reverse ((unsigned char *)_s, digs); 63 64 /* append a NULL so the string is properly terminated */ 65 *str = '\0'; 66 67 mp_clear (&t); 68 return MP_OKAY; 69 } 70 71 #endif 72 73 /* $Source: /cvs/libtom/libtommath/bn_mp_toradix.c,v $ */ 74 /* $Revision: 1.3 $ */ 75 /* $Date: 2006/03/31 14:18:44 $ */ 76