/* TomsFastMath, a fast ISO C bignum library.
 * That project is public domain and free for all purposes.
 * fp_toradix_n included in TomsFastMath specification (tfm.h), but unimplemented until now.
 * It is based on conversion of mp_toradix_n from libtommath
 * Will send the body of this function back to the LibTom projects, if they want it
 */
#include "bignum_fast.h"

int fp_toradix_n(fp_int *a, char *str, int radix, int maxlen)
{
  int     digs;
  fp_int  t;
  fp_digit d;
  char   *_s = str;

  /* check range of the maxlen, radix */
  if (maxlen < 2 || radix < 2 || radix > 64) {
    return FP_VAL;
  }

  /* quick out if its zero */
  if (fp_iszero(a) == 1) {
     *str++ = '0';
     *str = '\0';
     return FP_OKAY;
  }

  fp_init_copy(&t, a);

  /* if it is negative output a - */
  if (t.sign == FP_NEG) {
    ++_s;
    *str++ = '-';
    t.sign = FP_ZPOS;
    --maxlen;
  }

  digs = 0;
  while (fp_iszero (&t) == FP_NO) {
    if (--maxlen < 1) {
       /* no more room */
       break;
    }
    fp_div_d (&t, (fp_digit) radix, &t, &d);
    *str++ = fp_s_rmap[d];
    ++digs;
  }

  /* reverse the digits of the string.  In this case _s points
   * to the first digit [exluding the sign] of the number]
   */
  fp_reverse ((unsigned char *)_s, digs);

  /* append a NULL so the string is properly terminated */
  *str = '\0';
  return FP_OKAY;
}