Home | History | Annotate | Download | only in libtommath
      1 #include <tommath.h>
      2 #ifdef BN_MP_RADIX_SIZE_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 /* returns size of ASCII reprensentation */
     19 int mp_radix_size (mp_int * a, int radix, int *size)
     20 {
     21   int     res, digs;
     22   mp_int  t;
     23   mp_digit d;
     24 
     25   *size = 0;
     26 
     27   /* special case for binary */
     28   if (radix == 2) {
     29     *size = mp_count_bits (a) + (a->sign == MP_NEG ? 1 : 0) + 1;
     30     return MP_OKAY;
     31   }
     32 
     33   /* make sure the radix is in range */
     34   if (radix < 2 || radix > 64) {
     35     return MP_VAL;
     36   }
     37 
     38   if (mp_iszero(a) == MP_YES) {
     39     *size = 2;
     40     return MP_OKAY;
     41   }
     42 
     43   /* digs is the digit count */
     44   digs = 0;
     45 
     46   /* if it's negative add one for the sign */
     47   if (a->sign == MP_NEG) {
     48     ++digs;
     49   }
     50 
     51   /* init a copy of the input */
     52   if ((res = mp_init_copy (&t, a)) != MP_OKAY) {
     53     return res;
     54   }
     55 
     56   /* force temp to positive */
     57   t.sign = MP_ZPOS;
     58 
     59   /* fetch out all of the digits */
     60   while (mp_iszero (&t) == MP_NO) {
     61     if ((res = mp_div_d (&t, (mp_digit) radix, &t, &d)) != MP_OKAY) {
     62       mp_clear (&t);
     63       return res;
     64     }
     65     ++digs;
     66   }
     67   mp_clear (&t);
     68 
     69   /* return digs + 1, the 1 is for the NULL byte that would be required. */
     70   *size = digs + 1;
     71   return MP_OKAY;
     72 }
     73 
     74 #endif
     75 
     76 /* $Source: /cvs/libtom/libtommath/bn_mp_radix_size.c,v $ */
     77 /* $Revision: 1.4 $ */
     78 /* $Date: 2006/03/31 14:18:44 $ */
     79