X-Git-Url: https://pd.if.org/git/?a=blobdiff_plain;f=tomsfastmath%2Fsrc%2Fbin%2Ffp_toradix_n.c;fp=tomsfastmath%2Fsrc%2Fbin%2Ffp_toradix_n.c;h=5c9bf62d14e959ab7ae4d303e782adcadedba1b7;hb=66bc25938679f1d6a1d1200f329093d82a5e99b4;hp=0000000000000000000000000000000000000000;hpb=a52ee0733f420ca20224049260d6fc5cf7d8f621;p=zpackage diff --git a/tomsfastmath/src/bin/fp_toradix_n.c b/tomsfastmath/src/bin/fp_toradix_n.c new file mode 100644 index 0000000..5c9bf62 --- /dev/null +++ b/tomsfastmath/src/bin/fp_toradix_n.c @@ -0,0 +1,71 @@ +/* TomsFastMath, a fast ISO C bignum library. + * + * This project is meant to fill in where LibTomMath + * falls short. That is speed ;-) + * + * This project is public domain and free for all purposes. + * + * Tom St Denis, tomstdenis@gmail.com + */ +#include + +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 radix */ + if (maxlen < 2 || radix < 2 || radix > 64) + return FP_VAL; + + /* quick check for zero */ + if (fp_iszero(a) == FP_YES) { + *str++ = '0'; + *str = '\0'; + return FP_OKAY; + } + + fp_init_copy(&t, a); + + /* if it is negative output a - */ + if (t.sign == FP_NEG) { + /* we have to reverse our digits later... but not the - sign!! */ + ++_s; + + /* store the flag and mark the number as positive */ + *str++ = '-'; + t.sign = FP_ZPOS; + + /* subtract a char */ + --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'; + + if (maxlen < 1) + return FP_VAL; + return FP_OKAY; +} + +/* $Source$ */ +/* $Revision$ */ +/* $Date$ */