1 /* $NetBSD: bn_mp_radix_size.c,v 1.1.1.2 2014/04/24 12:45:31 pettai Exp $ */
2
3 #include <tommath.h>
4 #ifdef BN_MP_RADIX_SIZE_C
5 /* LibTomMath, multiple-precision integer library -- Tom St Denis
6 *
7 * LibTomMath is a library that provides multiple-precision
8 * integer arithmetic as well as number theoretic functionality.
9 *
10 * The library was designed directly after the MPI library by
11 * Michael Fromberger but has been written from scratch with
12 * additional optimizations in place.
13 *
14 * The library is free for all purposes without any express
15 * guarantee it works.
16 *
17 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
18 */
19
20 /* returns size of ASCII reprensentation */
mp_radix_size(mp_int * a,int radix,int * size)21 int mp_radix_size (mp_int * a, int radix, int *size)
22 {
23 int res, digs;
24 mp_int t;
25 mp_digit d;
26
27 *size = 0;
28
29 /* special case for binary */
30 if (radix == 2) {
31 *size = mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1;
32 return MP_OKAY;
33 }
34
35 /* make sure the radix is in range */
36 if (radix < 2 || radix > 64) {
37 return MP_VAL;
38 }
39
40 if (mp_iszero(a) == MP_YES) {
41 *size = 2;
42 return MP_OKAY;
43 }
44
45 /* digs is the digit count */
46 digs = 0;
47
48 /* if it's negative add one for the sign */
49 if (a->sign == MP_NEG) {
50 ++digs;
51 }
52
53 /* init a copy of the input */
54 if ((res = mp_init_copy (&t, a)) != MP_OKAY) {
55 return res;
56 }
57
58 /* force temp to positive */
59 t.sign = MP_ZPOS;
60
61 /* fetch out all of the digits */
62 while (mp_iszero (&t) == MP_NO) {
63 if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) {
64 mp_clear (&t);
65 return res;
66 }
67 ++digs;
68 }
69 mp_clear (&t);
70
71 /* return digs + 1, the 1 is for the NULL byte that would be required. */
72 *size = digs + 1;
73 return MP_OKAY;
74 }
75
76 #endif
77
78 /* Source: /cvs/libtom/libtommath/bn_mp_radix_size.c,v */
79 /* Revision: 1.5 */
80 /* Date: 2006/12/28 01:25:13 */
81