Mercurial > dropbear
comparison libtommath/bn_mp_toradix_n.c @ 435:337c45621e81
merge of 'a9b0496634cdd25647b65e585cc3240f3fa699ee'
and 'c22be8b8f570b48e9662dac32c7b3e7148a42206'
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 22 Feb 2007 14:53:49 +0000 |
parents | 5ff8218bcee9 |
children | 60fc6476e044 |
comparison
equal
deleted
inserted
replaced
434:0aaaf68e97dc | 435:337c45621e81 |
---|---|
10 * additional optimizations in place. | 10 * additional optimizations in place. |
11 * | 11 * |
12 * The library is free for all purposes without any express | 12 * The library is free for all purposes without any express |
13 * guarantee it works. | 13 * guarantee it works. |
14 * | 14 * |
15 * Tom St Denis, [email protected], http://math.libtomcrypt.org | 15 * Tom St Denis, [email protected], http://math.libtomcrypt.com |
16 */ | 16 */ |
17 | 17 |
18 /* stores a bignum as a ASCII string in a given radix (2..64) | 18 /* stores a bignum as a ASCII string in a given radix (2..64) |
19 * | 19 * |
20 * Stores upto maxlen-1 chars and always a NULL byte | 20 * Stores upto maxlen-1 chars and always a NULL byte |
25 mp_int t; | 25 mp_int t; |
26 mp_digit d; | 26 mp_digit d; |
27 char *_s = str; | 27 char *_s = str; |
28 | 28 |
29 /* check range of the maxlen, radix */ | 29 /* check range of the maxlen, radix */ |
30 if (maxlen < 3 || radix < 2 || radix > 64) { | 30 if (maxlen < 2 || radix < 2 || radix > 64) { |
31 return MP_VAL; | 31 return MP_VAL; |
32 } | 32 } |
33 | 33 |
34 /* quick out if its zero */ | 34 /* quick out if its zero */ |
35 if (mp_iszero(a) == 1) { | 35 if (mp_iszero(a) == MP_YES) { |
36 *str++ = '0'; | 36 *str++ = '0'; |
37 *str = '\0'; | 37 *str = '\0'; |
38 return MP_OKAY; | 38 return MP_OKAY; |
39 } | 39 } |
40 | 40 |
55 --maxlen; | 55 --maxlen; |
56 } | 56 } |
57 | 57 |
58 digs = 0; | 58 digs = 0; |
59 while (mp_iszero (&t) == 0) { | 59 while (mp_iszero (&t) == 0) { |
60 if (--maxlen < 1) { | |
61 /* no more room */ | |
62 break; | |
63 } | |
60 if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { | 64 if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) { |
61 mp_clear (&t); | 65 mp_clear (&t); |
62 return res; | 66 return res; |
63 } | 67 } |
64 *str++ = mp_s_rmap[d]; | 68 *str++ = mp_s_rmap[d]; |
65 ++digs; | 69 ++digs; |
66 | |
67 if (--maxlen == 1) { | |
68 /* no more room */ | |
69 break; | |
70 } | |
71 } | 70 } |
72 | 71 |
73 /* reverse the digits of the string. In this case _s points | 72 /* reverse the digits of the string. In this case _s points |
74 * to the first digit [exluding the sign] of the number] | 73 * to the first digit [exluding the sign] of the number |
75 */ | 74 */ |
76 bn_reverse ((unsigned char *)_s, digs); | 75 bn_reverse ((unsigned char *)_s, digs); |
77 | 76 |
78 /* append a NULL so the string is properly terminated */ | 77 /* append a NULL so the string is properly terminated */ |
79 *str = '\0'; | 78 *str = '\0'; |
81 mp_clear (&t); | 80 mp_clear (&t); |
82 return MP_OKAY; | 81 return MP_OKAY; |
83 } | 82 } |
84 | 83 |
85 #endif | 84 #endif |
85 | |
86 /* $Source: /cvs/libtom/libtommath/bn_mp_toradix_n.c,v $ */ | |
87 /* $Revision: 1.4 $ */ | |
88 /* $Date: 2006/03/31 14:18:44 $ */ |