Skip to content

Commit c11d1a1

Browse files
Christoph Zurniedenczurnieden
Christoph Zurnieden
authored andcommitted
Print big integers with (f)printf
1 parent 787c614 commit c11d1a1

20 files changed

+1122
-57
lines changed

demo/shared.c

+5-1
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,18 @@ void print_header(void)
3636
#ifdef MP_16BIT
3737
printf("Digit size 16 Bit \n");
3838
#endif
39-
#ifdef MP_32BIT
39+
#if ((defined MP_32BIT) || (defined MP_31BIT))
4040
printf("Digit size 32 Bit \n");
4141
#endif
4242
#ifdef MP_64BIT
4343
printf("Digit size 64 Bit \n");
4444
#endif
4545
printf("Size of mp_digit: %u\n", (unsigned int)sizeof(mp_digit));
4646
printf("Size of mp_word: %u\n", (unsigned int)sizeof(mp_word));
47+
/* Some of the architectures are mixed e.g. -mx32 */
48+
printf("Size of int: %u\n", (unsigned int)sizeof(int));
49+
printf("Size of long: %u\n", (unsigned int)sizeof(long));
50+
printf("Size of pointers: %u\n", (unsigned int)sizeof(int *));
4751
printf("MP_DIGIT_BIT: %d\n", MP_DIGIT_BIT);
4852
printf("MP_DEFAULT_DIGIT_COUNT: %d\n", MP_DEFAULT_DIGIT_COUNT);
4953
}

demo/test.c

+482
Large diffs are not rendered by default.

doc/bn.tex

+60
Original file line numberDiff line numberDiff line change
@@ -2421,6 +2421,66 @@ \subsection{To ASCII}
24212421
mp_err mp_fwrite(const mp_int *a, int radix, FILE *stream);
24222422
\end{alltt}
24232423

2424+
Also available in that case is a small extension to \texttt{printf(3)} to print
2425+
a big integer in a formated way. Not every formating is supported (e.g.: no
2426+
thousands separator) but normal alignment works well.
2427+
2428+
Modifiers are \texttt{Z} for a big integer \texttt{M} for a \texttt{mp\_digit} and
2429+
\texttt{N} to print the array \texttt{a->dp} of a \texttt{mp\_int a}.
2430+
2431+
Specifiers are \texttt{d, x, o, b, @} for decimal, hexadecimal, octal, binary, and
2432+
base-64 representations respectively. These specifiers are bound to the extensions
2433+
but can be unregistered individually or all together
2434+
2435+
See example below for the necessary details.
2436+
2437+
This functions are not threadsafe!
2438+
\index{mp\_printf\_extension\_init}
2439+
\index{mp\_printf\_extension\_clear}
2440+
\begin{alltt}
2441+
mp_err mp_printf_extension_init(void);
2442+
void mp_printf_extension_clear(void);
2443+
\end{alltt}
2444+
2445+
2446+
Example:
2447+
\begin{alltt}
2448+
2449+
/* Switch on the extension */
2450+
if((err = mp_printf_extension_init()) != MP_OKAY) goto LTM_ERR;
2451+
...
2452+
/* Do some calculation with big integer a */
2453+
...
2454+
2455+
printf("Bigint decimal: %Zd \textbackslash{}n", &a);
2456+
printf("Bigint hexadecimal: %Zx \textbackslash{}n", &a);
2457+
printf("Bigint octal: %Zo \textbackslash{}n", &a);
2458+
printf("Bigint binary: %Zb \textbackslash{}n", &a);
2459+
printf("Bigint base-64: %Z@ \textbackslash{}n", &a);
2460+
2461+
printf("Limb decimal: %Md \textbackslash{}n", a.dp[0]);
2462+
printf("Limb hexdecimal: %Mx \textbackslash{}n", a.dp[0]);
2463+
/* and so on */
2464+
2465+
printf("Array decimal: %Nd \textbackslash{}n", &a);
2466+
printf("Array hexadecimal: %Nx \textbackslash{}n", &a);
2467+
2468+
#include <printf.h>
2469+
register_printf_specifier('d', NULL, NULL);
2470+
printf("Bigint number %d: %Zx \textbackslash{}n", 123, &a);
2471+
2472+
/* re-registering is only possible completely */
2473+
if((err = mp_printf_extension_init()) != MP_OKAY) goto LTM_ERR;
2474+
printf("Bigint number %i: %Zd \textbackslash{}n", 123, &a);
2475+
2476+
/* and so on */
2477+
2478+
/* Switch off all extension */
2479+
mp_printf_extension_clear()
2480+
2481+
\end{alltt}
2482+
\textttt{mp\_printf\_extension\_init} returns \texttt{MP\_VAL} if those functions are not supported.
2483+
24242484
\subsection{From ASCII}
24252485
\index{mp\_read\_radix}
24262486
\begin{alltt}

helper.pl

+1-1
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ sub update_dep
446446

447447
sub generate_def {
448448
my @files = glob '*mp_*.c';
449-
@files = map { my $x = $_; $x =~ s/\.c$//g; $x; } @files;
449+
@files = map { my $x = $_; $x =~ s/\.c$//g;$x; } @files;
450450
@files = grep(!/mp_cutoffs/, @files);
451451

452452
my $files = join("\n ", sort(grep(/^mp_/, @files)));

libtommath_VS2008.vcproj

+20
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,14 @@
644644
RelativePath="mp_prime_strong_lucas_selfridge.c"
645645
>
646646
</File>
647+
<File
648+
RelativePath="mp_printf_extension_clear.c"
649+
>
650+
</File>
651+
<File
652+
RelativePath="mp_printf_extension_init.c"
653+
>
654+
</File>
647655
<File
648656
RelativePath="mp_radix_size.c"
649657
>
@@ -852,6 +860,10 @@
852860
RelativePath="s_mp_invmod_odd.c"
853861
>
854862
</File>
863+
<File
864+
RelativePath="s_mp_isneg.c"
865+
>
866+
</File>
855867
<File
856868
RelativePath="s_mp_log_2expt.c"
857869
>
@@ -896,6 +908,10 @@
896908
RelativePath="s_mp_prime_tab.c"
897909
>
898910
</File>
911+
<File
912+
RelativePath="s_mp_print_mp_digit.c"
913+
>
914+
</File>
899915
<File
900916
RelativePath="s_mp_radix_map.c"
901917
>
@@ -924,6 +940,10 @@
924940
RelativePath="s_mp_sqr_toom.c"
925941
>
926942
</File>
943+
<File
944+
RelativePath="s_mp_str_reverse.c"
945+
>
946+
</File>
927947
<File
928948
RelativePath="s_mp_sub.c"
929949
>

makefile

+12-11
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,20 @@ mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log.o mp_log_n.o mp_lshd.o
3737
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
3838
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
3939
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
40-
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
41-
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
42-
mp_reduce_2k_l.o mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o \
43-
mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o \
44-
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
45-
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
46-
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
47-
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o \
48-
s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
40+
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o \
41+
mp_printf_extension_clear.o mp_printf_extension_init.o mp_radix_size.o mp_radix_size_overestimate.o \
42+
mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \
43+
mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o mp_reduce_setup.o \
44+
mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o mp_set_l.o \
45+
mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o mp_sqrtmod_prime.o \
46+
mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o mp_unpack.o mp_xor.o \
47+
mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o s_mp_div_school.o s_mp_div_small.o \
48+
s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o s_mp_get_bit.o s_mp_invmod.o \
49+
s_mp_invmod_odd.o s_mp_isneg.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
4950
s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o s_mp_mul_high_comba.o s_mp_mul_karatsuba.o \
50-
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_radix_map.o \
51+
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_print_mp_digit.o s_mp_radix_map.o \
5152
s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o s_mp_sqr_karatsuba.o \
52-
s_mp_sqr_toom.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
53+
s_mp_sqr_toom.o s_mp_str_reverse.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
5354

5455
#END_INS
5556

makefile.mingw

+12-11
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,20 @@ mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log.o mp_log_n.o mp_lshd.o
3939
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
4040
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
4141
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
42-
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
43-
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
44-
mp_reduce_2k_l.o mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o \
45-
mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o \
46-
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
47-
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
48-
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
49-
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o \
50-
s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
42+
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o \
43+
mp_printf_extension_clear.o mp_printf_extension_init.o mp_radix_size.o mp_radix_size_overestimate.o \
44+
mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \
45+
mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o mp_reduce_setup.o \
46+
mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o mp_set_l.o \
47+
mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o mp_sqrtmod_prime.o \
48+
mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o mp_unpack.o mp_xor.o \
49+
mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o s_mp_div_school.o s_mp_div_small.o \
50+
s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o s_mp_get_bit.o s_mp_invmod.o \
51+
s_mp_invmod_odd.o s_mp_isneg.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
5152
s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o s_mp_mul_high_comba.o s_mp_mul_karatsuba.o \
52-
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_radix_map.o \
53+
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_print_mp_digit.o s_mp_radix_map.o \
5354
s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o s_mp_sqr_karatsuba.o \
54-
s_mp_sqr_toom.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
55+
s_mp_sqr_toom.o s_mp_str_reverse.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
5556

5657
HEADERS_PUB=tommath.h
5758
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB)

makefile.msvc

+12-11
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,20 @@ mp_invmod.obj mp_is_square.obj mp_kronecker.obj mp_lcm.obj mp_log.obj mp_log_n.o
3535
mp_montgomery_calc_normalization.obj mp_montgomery_reduce.obj mp_montgomery_setup.obj mp_mul.obj mp_mul_2.obj \
3636
mp_mul_2d.obj mp_mul_d.obj mp_mulmod.obj mp_neg.obj mp_or.obj mp_pack.obj mp_pack_count.obj mp_prime_fermat.obj \
3737
mp_prime_frobenius_underwood.obj mp_prime_is_prime.obj mp_prime_miller_rabin.obj mp_prime_next_prime.obj \
38-
mp_prime_rabin_miller_trials.obj mp_prime_rand.obj mp_prime_strong_lucas_selfridge.obj mp_radix_size.obj \
39-
mp_radix_size_overestimate.obj mp_rand.obj mp_rand_source.obj mp_read_radix.obj mp_reduce.obj mp_reduce_2k.obj \
40-
mp_reduce_2k_l.obj mp_reduce_2k_setup.obj mp_reduce_2k_setup_l.obj mp_reduce_is_2k.obj mp_reduce_is_2k_l.obj \
41-
mp_reduce_setup.obj mp_root_n.obj mp_rshd.obj mp_sbin_size.obj mp_set.obj mp_set_double.obj mp_set_i32.obj mp_set_i64.obj \
42-
mp_set_l.obj mp_set_u32.obj mp_set_u64.obj mp_set_ul.obj mp_shrink.obj mp_signed_rsh.obj mp_sqrmod.obj mp_sqrt.obj \
43-
mp_sqrtmod_prime.obj mp_sub.obj mp_sub_d.obj mp_submod.obj mp_to_radix.obj mp_to_sbin.obj mp_to_ubin.obj mp_ubin_size.obj \
44-
mp_unpack.obj mp_xor.obj mp_zero.obj s_mp_add.obj s_mp_copy_digs.obj s_mp_div_3.obj s_mp_div_recursive.obj \
45-
s_mp_div_school.obj s_mp_div_small.obj s_mp_exptmod.obj s_mp_exptmod_fast.obj s_mp_fp_log.obj s_mp_fp_log_d.obj \
46-
s_mp_get_bit.obj s_mp_invmod.obj s_mp_invmod_odd.obj s_mp_log_2expt.obj s_mp_montgomery_reduce_comba.obj s_mp_mul.obj \
38+
mp_prime_rabin_miller_trials.obj mp_prime_rand.obj mp_prime_strong_lucas_selfridge.obj \
39+
mp_printf_extension_clear.obj mp_printf_extension_init.obj mp_radix_size.obj mp_radix_size_overestimate.obj \
40+
mp_rand.obj mp_rand_source.obj mp_read_radix.obj mp_reduce.obj mp_reduce_2k.obj mp_reduce_2k_l.obj \
41+
mp_reduce_2k_setup.obj mp_reduce_2k_setup_l.obj mp_reduce_is_2k.obj mp_reduce_is_2k_l.obj mp_reduce_setup.obj \
42+
mp_root_n.obj mp_rshd.obj mp_sbin_size.obj mp_set.obj mp_set_double.obj mp_set_i32.obj mp_set_i64.obj mp_set_l.obj \
43+
mp_set_u32.obj mp_set_u64.obj mp_set_ul.obj mp_shrink.obj mp_signed_rsh.obj mp_sqrmod.obj mp_sqrt.obj mp_sqrtmod_prime.obj \
44+
mp_sub.obj mp_sub_d.obj mp_submod.obj mp_to_radix.obj mp_to_sbin.obj mp_to_ubin.obj mp_ubin_size.obj mp_unpack.obj mp_xor.obj \
45+
mp_zero.obj s_mp_add.obj s_mp_copy_digs.obj s_mp_div_3.obj s_mp_div_recursive.obj s_mp_div_school.obj s_mp_div_small.obj \
46+
s_mp_exptmod.obj s_mp_exptmod_fast.obj s_mp_fp_log.obj s_mp_fp_log_d.obj s_mp_get_bit.obj s_mp_invmod.obj \
47+
s_mp_invmod_odd.obj s_mp_isneg.obj s_mp_log_2expt.obj s_mp_montgomery_reduce_comba.obj s_mp_mul.obj \
4748
s_mp_mul_balance.obj s_mp_mul_comba.obj s_mp_mul_high.obj s_mp_mul_high_comba.obj s_mp_mul_karatsuba.obj \
48-
s_mp_mul_toom.obj s_mp_prime_is_divisible.obj s_mp_prime_tab.obj s_mp_radix_map.obj \
49+
s_mp_mul_toom.obj s_mp_prime_is_divisible.obj s_mp_prime_tab.obj s_mp_print_mp_digit.obj s_mp_radix_map.obj \
4950
s_mp_radix_size_overestimate.obj s_mp_rand_platform.obj s_mp_sqr.obj s_mp_sqr_comba.obj s_mp_sqr_karatsuba.obj \
50-
s_mp_sqr_toom.obj s_mp_sub.obj s_mp_zero_buf.obj s_mp_zero_digs.obj
51+
s_mp_sqr_toom.obj s_mp_str_reverse.obj s_mp_sub.obj s_mp_zero_buf.obj s_mp_zero_digs.obj
5152

5253
HEADERS_PUB=tommath.h
5354
HEADERS=tommath_private.h tommath_class.h tommath_superclass.h tommath_cutoffs.h $(HEADERS_PUB)

makefile.shared

+12-11
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,20 @@ mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log.o mp_log_n.o mp_lshd.o
3434
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
3535
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
3636
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
37-
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
38-
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
39-
mp_reduce_2k_l.o mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o \
40-
mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o \
41-
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
42-
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
43-
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
44-
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o \
45-
s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
37+
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o \
38+
mp_printf_extension_clear.o mp_printf_extension_init.o mp_radix_size.o mp_radix_size_overestimate.o \
39+
mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \
40+
mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o mp_reduce_setup.o \
41+
mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o mp_set_l.o \
42+
mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o mp_sqrtmod_prime.o \
43+
mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o mp_unpack.o mp_xor.o \
44+
mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o s_mp_div_school.o s_mp_div_small.o \
45+
s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o s_mp_get_bit.o s_mp_invmod.o \
46+
s_mp_invmod_odd.o s_mp_isneg.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
4647
s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o s_mp_mul_high_comba.o s_mp_mul_karatsuba.o \
47-
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_radix_map.o \
48+
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_print_mp_digit.o s_mp_radix_map.o \
4849
s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o s_mp_sqr_karatsuba.o \
49-
s_mp_sqr_toom.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
50+
s_mp_sqr_toom.o s_mp_str_reverse.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
5051

5152
#END_INS
5253

makefile.unix

+12-11
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,20 @@ mp_invmod.o mp_is_square.o mp_kronecker.o mp_lcm.o mp_log.o mp_log_n.o mp_lshd.o
4040
mp_montgomery_calc_normalization.o mp_montgomery_reduce.o mp_montgomery_setup.o mp_mul.o mp_mul_2.o \
4141
mp_mul_2d.o mp_mul_d.o mp_mulmod.o mp_neg.o mp_or.o mp_pack.o mp_pack_count.o mp_prime_fermat.o \
4242
mp_prime_frobenius_underwood.o mp_prime_is_prime.o mp_prime_miller_rabin.o mp_prime_next_prime.o \
43-
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o mp_radix_size.o \
44-
mp_radix_size_overestimate.o mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o \
45-
mp_reduce_2k_l.o mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o \
46-
mp_reduce_setup.o mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o \
47-
mp_set_l.o mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o \
48-
mp_sqrtmod_prime.o mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o \
49-
mp_unpack.o mp_xor.o mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o \
50-
s_mp_div_school.o s_mp_div_small.o s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o \
51-
s_mp_get_bit.o s_mp_invmod.o s_mp_invmod_odd.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
43+
mp_prime_rabin_miller_trials.o mp_prime_rand.o mp_prime_strong_lucas_selfridge.o \
44+
mp_printf_extension_clear.o mp_printf_extension_init.o mp_radix_size.o mp_radix_size_overestimate.o \
45+
mp_rand.o mp_rand_source.o mp_read_radix.o mp_reduce.o mp_reduce_2k.o mp_reduce_2k_l.o \
46+
mp_reduce_2k_setup.o mp_reduce_2k_setup_l.o mp_reduce_is_2k.o mp_reduce_is_2k_l.o mp_reduce_setup.o \
47+
mp_root_n.o mp_rshd.o mp_sbin_size.o mp_set.o mp_set_double.o mp_set_i32.o mp_set_i64.o mp_set_l.o \
48+
mp_set_u32.o mp_set_u64.o mp_set_ul.o mp_shrink.o mp_signed_rsh.o mp_sqrmod.o mp_sqrt.o mp_sqrtmod_prime.o \
49+
mp_sub.o mp_sub_d.o mp_submod.o mp_to_radix.o mp_to_sbin.o mp_to_ubin.o mp_ubin_size.o mp_unpack.o mp_xor.o \
50+
mp_zero.o s_mp_add.o s_mp_copy_digs.o s_mp_div_3.o s_mp_div_recursive.o s_mp_div_school.o s_mp_div_small.o \
51+
s_mp_exptmod.o s_mp_exptmod_fast.o s_mp_fp_log.o s_mp_fp_log_d.o s_mp_get_bit.o s_mp_invmod.o \
52+
s_mp_invmod_odd.o s_mp_isneg.o s_mp_log_2expt.o s_mp_montgomery_reduce_comba.o s_mp_mul.o \
5253
s_mp_mul_balance.o s_mp_mul_comba.o s_mp_mul_high.o s_mp_mul_high_comba.o s_mp_mul_karatsuba.o \
53-
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_radix_map.o \
54+
s_mp_mul_toom.o s_mp_prime_is_divisible.o s_mp_prime_tab.o s_mp_print_mp_digit.o s_mp_radix_map.o \
5455
s_mp_radix_size_overestimate.o s_mp_rand_platform.o s_mp_sqr.o s_mp_sqr_comba.o s_mp_sqr_karatsuba.o \
55-
s_mp_sqr_toom.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
56+
s_mp_sqr_toom.o s_mp_str_reverse.o s_mp_sub.o s_mp_zero_buf.o s_mp_zero_digs.o
5657

5758

5859
HEADERS_PUB=tommath.h

mp_printf_extension_clear.c

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
#include "tommath_private.h"
2+
#ifdef MP_PRINTF_EXTENSION_CLEAR_C
3+
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
4+
/* SPDX-License-Identifier: Unlicense */
5+
6+
7+
8+
#if (!(defined(_MSC_VER)) && !(defined(MP_NO_FILE)) && (defined(GLIBC_VERSION)) && (GLIBC_VERSION > 2009) )
9+
#include <printf.h>
10+
/* Unregister printf extensions */
11+
void mp_printf_extension_clear(void)
12+
{
13+
/* The modifiers cannot be "unregistered" only the specifiers */
14+
register_printf_specifier('d', NULL, NULL);
15+
register_printf_specifier('x', NULL, NULL);
16+
register_printf_specifier('o', NULL, NULL);
17+
register_printf_specifier('b', NULL, NULL);
18+
register_printf_specifier('@', NULL, NULL);
19+
}
20+
#else
21+
void mp_printf_extension_clear(void)
22+
{
23+
}
24+
#endif
25+
26+
27+
#endif

0 commit comments

Comments
 (0)