Skip to content

Commit

Permalink
Turn the mp_todecimal macro into a function...
Browse files Browse the repository at this point in the history
that uses MP_HAS to decide whether to use `mp_toradix` or
`s_mp_todecimal_fast`.
  • Loading branch information
MasterDuke17 committed Aug 31, 2019
1 parent 4accd98 commit fc55954
Show file tree
Hide file tree
Showing 12 changed files with 87 additions and 49 deletions.
20 changes: 20 additions & 0 deletions bn_mp_todecimal.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#include "tommath_private.h"
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
/* SPDX-License-Identifier: Unlicense */

/* stores a bignum as a decimal ASCII string, using Barrett
* reduction if available.
*/

mp_err s_mp_todecimal(const mp_int *a, char *str)
{
mp_err err;

if (MP_HAS(S_MP_TODECIMAL_FAST)) {
err = s_mp_todecimal_fast(a, str);
} else {
err = mp_toradix(a, str, 10);
}

return err;
}
17 changes: 9 additions & 8 deletions bn_mp_todecimal_fast.c → bn_s_mp_todecimal_fast.c
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
#include "tommath_private.h"
#include <string.h>
#ifdef BN_MP_TODECIMAL_FAST_C
#ifdef BN_S_MP_TODECIMAL_FAST_C
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
/* SPDX-License-Identifier: Unlicense */

/* store a bignum as a decimal ASCII string */
mp_err mp_todecimal_fast_rec(mp_int *number, mp_int *nL, mp_int *shiftL, mp_int *mL, int precalc_array_index, int left,
char **result)
mp_err s_mp_todecimal_fast_rec(const mp_int *number, mp_int *nL, mp_int *shiftL, mp_int *mL, int precalc_array_index,
int left,
char **result)
{
mp_int q, nLq, r;
mp_err err;
Expand Down Expand Up @@ -47,14 +48,14 @@ mp_err mp_todecimal_fast_rec(mp_int *number, mp_int *nL, mp_int *shiftL, mp_int

--precalc_array_index;
if (left && mp_iszero(&q)) {
if ((err = mp_todecimal_fast_rec(&r, nL, shiftL, mL, precalc_array_index, 1, result)) != MP_OKAY) {
if ((err = s_mp_todecimal_fast_rec(&r, nL, shiftL, mL, precalc_array_index, 1, result)) != MP_OKAY) {
goto LBL_ERR;
}
} else {
if ((err = mp_todecimal_fast_rec(&q, nL, shiftL, mL, precalc_array_index, left, result)) != MP_OKAY) {
if ((err = s_mp_todecimal_fast_rec(&q, nL, shiftL, mL, precalc_array_index, left, result)) != MP_OKAY) {
goto LBL_ERR;
}
if ((err = mp_todecimal_fast_rec(&r, nL, shiftL, mL, precalc_array_index, 0, result)) != MP_OKAY) {
if ((err = s_mp_todecimal_fast_rec(&r, nL, shiftL, mL, precalc_array_index, 0, result)) != MP_OKAY) {
goto LBL_ERR;
}
}
Expand All @@ -66,7 +67,7 @@ mp_err mp_todecimal_fast_rec(mp_int *number, mp_int *nL, mp_int *shiftL, mp_int
return err;
}

mp_err mp_todecimal_fast(mp_int *number, char *result)
mp_err s_mp_todecimal_fast(const mp_int *number, char *result)
{
mp_int n, shift, M, M2, M22, M4, M44;
mp_int nL[20], shiftL[20], mL[20];
Expand Down Expand Up @@ -187,7 +188,7 @@ mp_err mp_todecimal_fast(mp_int *number, char *result)
precalc_array_index++;
}

if ((err = mp_todecimal_fast_rec(number, nL, shiftL, mL, precalc_array_index - 1, 1, result_addr)) != MP_OKAY) {
if ((err = s_mp_todecimal_fast_rec(number, nL, shiftL, mL, precalc_array_index - 1, 1, result_addr)) != MP_OKAY) {
goto LBL_ERR;
}

Expand Down
6 changes: 5 additions & 1 deletion libtommath_VS2008.vcproj
Original file line number Diff line number Diff line change
Expand Up @@ -833,7 +833,7 @@
>
</File>
<File
RelativePath="bn_mp_todecimal_fast.c"
RelativePath="bn_mp_todecimal.c"
>
</File>
<File
Expand Down Expand Up @@ -944,6 +944,10 @@
RelativePath="bn_s_mp_sub.c"
>
</File>
<File
RelativePath="bn_s_mp_todecimal_fast.c"
>
</File>
<File
RelativePath="bn_s_mp_toom_mul.c"
>
Expand Down
9 changes: 5 additions & 4 deletions makefile
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,14 @@ bn_mp_set.o bn_mp_set_double.o bn_mp_set_i32.o bn_mp_set_i64.o bn_mp_set_l.o bn_
bn_mp_set_u32.o bn_mp_set_u64.o bn_mp_set_ul.o bn_mp_set_ull.o bn_mp_shrink.o bn_mp_signed_bin_size.o \
bn_mp_signed_rsh.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o bn_mp_sub_d.o \
bn_mp_submod.o bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o \
bn_mp_to_unsigned_bin_n.o bn_mp_todecimal_fast.o bn_mp_toradix.o bn_mp_toradix_n.o \
bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o \
bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
bn_mp_to_unsigned_bin_n.o bn_mp_todecimal.o bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o \
bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o \
bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o \
bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
bn_s_mp_prime_is_divisible.o bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o \
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_todecimal_fast.o bn_s_mp_toom_mul.o \
bn_s_mp_toom_sqr.o

#END_INS

Expand Down
9 changes: 5 additions & 4 deletions makefile.mingw
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,14 @@ bn_mp_set.o bn_mp_set_double.o bn_mp_set_i32.o bn_mp_set_i64.o bn_mp_set_l.o bn_
bn_mp_set_u32.o bn_mp_set_u64.o bn_mp_set_ul.o bn_mp_set_ull.o bn_mp_shrink.o bn_mp_signed_bin_size.o \
bn_mp_signed_rsh.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o bn_mp_sub_d.o \
bn_mp_submod.o bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o \
bn_mp_to_unsigned_bin_n.o bn_mp_todecimal_fast.o bn_mp_toradix.o bn_mp_toradix_n.o \
bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o \
bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
bn_mp_to_unsigned_bin_n.o bn_mp_todecimal.o bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o \
bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o \
bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o \
bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
bn_s_mp_prime_is_divisible.o bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o \
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_todecimal_fast.o bn_s_mp_toom_mul.o \
bn_s_mp_toom_sqr.o

HEADERS_PUB=tommath.h
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h $(HEADERS_PUB)
Expand Down
9 changes: 5 additions & 4 deletions makefile.msvc
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,14 @@ bn_mp_set.obj bn_mp_set_double.obj bn_mp_set_i32.obj bn_mp_set_i64.obj bn_mp_set
bn_mp_set_u32.obj bn_mp_set_u64.obj bn_mp_set_ul.obj bn_mp_set_ull.obj bn_mp_shrink.obj bn_mp_signed_bin_size.obj \
bn_mp_signed_rsh.obj bn_mp_sqr.obj bn_mp_sqrmod.obj bn_mp_sqrt.obj bn_mp_sqrtmod_prime.obj bn_mp_sub.obj bn_mp_sub_d.obj \
bn_mp_submod.obj bn_mp_to_signed_bin.obj bn_mp_to_signed_bin_n.obj bn_mp_to_unsigned_bin.obj \
bn_mp_to_unsigned_bin_n.obj bn_mp_todecimal_fast.obj bn_mp_toradix.obj bn_mp_toradix_n.obj \
bn_mp_unsigned_bin_size.obj bn_mp_xor.obj bn_mp_zero.obj bn_prime_tab.obj bn_s_mp_add.obj bn_s_mp_balance_mul.obj \
bn_s_mp_exptmod.obj bn_s_mp_exptmod_fast.obj bn_s_mp_get_bit.obj bn_s_mp_invmod_fast.obj bn_s_mp_invmod_slow.obj \
bn_mp_to_unsigned_bin_n.obj bn_mp_todecimal.obj bn_mp_toradix.obj bn_mp_toradix_n.obj bn_mp_unsigned_bin_size.obj \
bn_mp_xor.obj bn_mp_zero.obj bn_prime_tab.obj bn_s_mp_add.obj bn_s_mp_balance_mul.obj bn_s_mp_exptmod.obj \
bn_s_mp_exptmod_fast.obj bn_s_mp_get_bit.obj bn_s_mp_invmod_fast.obj bn_s_mp_invmod_slow.obj \
bn_s_mp_karatsuba_mul.obj bn_s_mp_karatsuba_sqr.obj bn_s_mp_montgomery_reduce_fast.obj bn_s_mp_mul_digs.obj \
bn_s_mp_mul_digs_fast.obj bn_s_mp_mul_high_digs.obj bn_s_mp_mul_high_digs_fast.obj \
bn_s_mp_prime_is_divisible.obj bn_s_mp_rand_jenkins.obj bn_s_mp_rand_platform.obj bn_s_mp_reverse.obj \
bn_s_mp_sqr.obj bn_s_mp_sqr_fast.obj bn_s_mp_sub.obj bn_s_mp_toom_mul.obj bn_s_mp_toom_sqr.obj
bn_s_mp_sqr.obj bn_s_mp_sqr_fast.obj bn_s_mp_sub.obj bn_s_mp_todecimal_fast.obj bn_s_mp_toom_mul.obj \
bn_s_mp_toom_sqr.obj

HEADERS_PUB=tommath.h
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h $(HEADERS_PUB)
Expand Down
9 changes: 5 additions & 4 deletions makefile.shared
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,14 @@ bn_mp_set.o bn_mp_set_double.o bn_mp_set_i32.o bn_mp_set_i64.o bn_mp_set_l.o bn_
bn_mp_set_u32.o bn_mp_set_u64.o bn_mp_set_ul.o bn_mp_set_ull.o bn_mp_shrink.o bn_mp_signed_bin_size.o \
bn_mp_signed_rsh.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o bn_mp_sub_d.o \
bn_mp_submod.o bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o \
bn_mp_to_unsigned_bin_n.o bn_mp_todecimal_fast.o bn_mp_toradix.o bn_mp_toradix_n.o \
bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o \
bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
bn_mp_to_unsigned_bin_n.o bn_mp_todecimal.o bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o \
bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o \
bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o \
bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
bn_s_mp_prime_is_divisible.o bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o \
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_todecimal_fast.o bn_s_mp_toom_mul.o \
bn_s_mp_toom_sqr.o

#END_INS

Expand Down
9 changes: 5 additions & 4 deletions makefile.unix
Original file line number Diff line number Diff line change
Expand Up @@ -53,13 +53,14 @@ bn_mp_set.o bn_mp_set_double.o bn_mp_set_i32.o bn_mp_set_i64.o bn_mp_set_l.o bn_
bn_mp_set_u32.o bn_mp_set_u64.o bn_mp_set_ul.o bn_mp_set_ull.o bn_mp_shrink.o bn_mp_signed_bin_size.o \
bn_mp_signed_rsh.o bn_mp_sqr.o bn_mp_sqrmod.o bn_mp_sqrt.o bn_mp_sqrtmod_prime.o bn_mp_sub.o bn_mp_sub_d.o \
bn_mp_submod.o bn_mp_to_signed_bin.o bn_mp_to_signed_bin_n.o bn_mp_to_unsigned_bin.o \
bn_mp_to_unsigned_bin_n.o bn_mp_todecimal_fast.o bn_mp_toradix.o bn_mp_toradix_n.o \
bn_mp_unsigned_bin_size.o bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o \
bn_s_mp_exptmod.o bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
bn_mp_to_unsigned_bin_n.o bn_mp_todecimal.o bn_mp_toradix.o bn_mp_toradix_n.o bn_mp_unsigned_bin_size.o \
bn_mp_xor.o bn_mp_zero.o bn_prime_tab.o bn_s_mp_add.o bn_s_mp_balance_mul.o bn_s_mp_exptmod.o \
bn_s_mp_exptmod_fast.o bn_s_mp_get_bit.o bn_s_mp_invmod_fast.o bn_s_mp_invmod_slow.o \
bn_s_mp_karatsuba_mul.o bn_s_mp_karatsuba_sqr.o bn_s_mp_montgomery_reduce_fast.o bn_s_mp_mul_digs.o \
bn_s_mp_mul_digs_fast.o bn_s_mp_mul_high_digs.o bn_s_mp_mul_high_digs_fast.o \
bn_s_mp_prime_is_divisible.o bn_s_mp_rand_jenkins.o bn_s_mp_rand_platform.o bn_s_mp_reverse.o \
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_toom_mul.o bn_s_mp_toom_sqr.o
bn_s_mp_sqr.o bn_s_mp_sqr_fast.o bn_s_mp_sub.o bn_s_mp_todecimal_fast.o bn_s_mp_toom_mul.o \
bn_s_mp_toom_sqr.o

HEADERS_PUB=tommath.h
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h $(HEADERS_PUB)
Expand Down
2 changes: 1 addition & 1 deletion tommath.def
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ EXPORTS
mp_to_signed_bin_n
mp_to_unsigned_bin
mp_to_unsigned_bin_n
mp_todecimal_fast
mp_todecimal
mp_toradix
mp_toradix_n
mp_unsigned_bin_size
Expand Down
2 changes: 1 addition & 1 deletion tommath.h
Original file line number Diff line number Diff line change
Expand Up @@ -702,6 +702,7 @@ mp_err mp_read_radix(mp_int *a, const char *str, int radix) MP_WUR;
mp_err mp_toradix(const mp_int *a, char *str, int radix) MP_WUR;
mp_err mp_toradix_n(const mp_int *a, char *str, int radix, int maxlen) MP_WUR;
mp_err mp_radix_size(const mp_int *a, int radix, int *size) MP_WUR;
mp_err mp_todecimal(const mp_int *a, char *str) MP_WUR;

#ifndef MP_NO_FILE
mp_err mp_fread(mp_int *a, int radix, FILE *stream) MP_WUR;
Expand All @@ -717,7 +718,6 @@ mp_err mp_fwrite(const mp_int *a, int radix, FILE *stream) MP_WUR;

#define mp_tobinary(M, S) mp_toradix((M), (S), 2)
#define mp_tooctal(M, S) mp_toradix((M), (S), 8)
#define mp_todecimal(M, S) mp_toradix((M), (S), 10)
#define mp_tohex(M, S) mp_toradix((M), (S), 16)

#ifdef __cplusplus
Expand Down
43 changes: 25 additions & 18 deletions tommath_class.h
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@
# define BN_MP_TO_SIGNED_BIN_N_C
# define BN_MP_TO_UNSIGNED_BIN_C
# define BN_MP_TO_UNSIGNED_BIN_N_C
# define BN_MP_TODECIMAL_FAST_C
# define BN_MP_TODECIMAL_C
# define BN_MP_TORADIX_C
# define BN_MP_TORADIX_N_C
# define BN_MP_UNSIGNED_BIN_SIZE_C
Expand Down Expand Up @@ -169,6 +169,7 @@
# define BN_S_MP_SQR_C
# define BN_S_MP_SQR_FAST_C
# define BN_S_MP_SUB_C
# define BN_S_MP_TODECIMAL_FAST_C
# define BN_S_MP_TOOM_MUL_C
# define BN_S_MP_TOOM_SQR_C
#endif
Expand Down Expand Up @@ -1072,23 +1073,10 @@
# define BN_MP_UNSIGNED_BIN_SIZE_C
#endif

#if defined(BN_MP_TODECIMAL_FAST_C)
# define BN_MP_ADD_C
# define BN_MP_ADD_D_C
# define BN_MP_CLEAR_MULTI_C
# define BN_MP_CMP_C
# define BN_MP_DIV_2D_C
# define BN_MP_GET_I32_C
# define BN_MP_INIT_COPY_C
# define BN_MP_INIT_MULTI_C
# define BN_MP_INIT_SET_C
# define BN_MP_MUL_2_C
# define BN_MP_MUL_C
# define BN_MP_NEG_C
# define BN_MP_SQR_C
# define BN_MP_SUB_C
# define BN_MP_SUB_D_C
# define BN_MP_TODECIMAL_FAST_REC_C
#if defined(BN_MP_TODECIMAL_C)
# define BN_MP_TORADIX_C
# define BN_S_MP_TODECIMAL_C
# define BN_S_MP_TODECIMAL_FAST_C
#endif

#if defined(BN_MP_TORADIX_C)
Expand Down Expand Up @@ -1286,6 +1274,25 @@
# define BN_MP_GROW_C
#endif

#if defined(BN_S_MP_TODECIMAL_FAST_C)
# define BN_MP_ADD_C
# define BN_MP_ADD_D_C
# define BN_MP_CLEAR_MULTI_C
# define BN_MP_CMP_C
# define BN_MP_DIV_2D_C
# define BN_MP_GET_I32_C
# define BN_MP_INIT_COPY_C
# define BN_MP_INIT_MULTI_C
# define BN_MP_INIT_SET_C
# define BN_MP_MUL_2_C
# define BN_MP_MUL_C
# define BN_MP_NEG_C
# define BN_MP_SQR_C
# define BN_MP_SUB_C
# define BN_MP_SUB_D_C
# define BN_S_MP_TODECIMAL_FAST_REC_C
#endif

#if defined(BN_S_MP_TOOM_MUL_C)
# define BN_MP_ADD_C
# define BN_MP_CLAMP_C
Expand Down
1 change: 1 addition & 0 deletions tommath_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ MP_PRIVATE mp_err s_mp_rand_platform(void *p, size_t n) MP_WUR;
MP_PRIVATE mp_err s_mp_prime_random_ex(mp_int *a, int t, int size, int flags, private_mp_prime_callback cb, void *dat);
MP_PRIVATE void s_mp_reverse(unsigned char *s, int len);
MP_PRIVATE mp_err s_mp_prime_is_divisible(const mp_int *a, mp_bool *result);
MP_PRIVATE mp_err s_mp_todecimal_fast(mp_int *number, char *result) MP_WUR;

/* TODO: jenkins prng is not thread safe as of now */
MP_PRIVATE mp_err s_mp_rand_jenkins(void *p, size_t n) MP_WUR;
Expand Down

0 comments on commit fc55954

Please sign in to comment.