795cd2013f
Originally I made those as macros. However we have many other small functions like mp_clamp, mp_exch which are also not implemented as macros right now. If we would use c99, I would implement them as private static inline functions. And mp_exch would be a public static inline function. But since we are bound to c89, we simply use normal functions. To achieve optimal performance one should either use link time optimization or amalgamation.
35 lines
1.0 KiB
C
35 lines
1.0 KiB
C
#include "tommath_private.h"
|
|
#ifdef MP_GROW_C
|
|
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
|
|
/* SPDX-License-Identifier: Unlicense */
|
|
|
|
/* grow as required */
|
|
mp_err mp_grow(mp_int *a, int size)
|
|
{
|
|
/* if the alloc size is smaller alloc more ram */
|
|
if (a->alloc < size) {
|
|
/* reallocate the array a->dp
|
|
*
|
|
* We store the return in a temporary variable
|
|
* in case the operation failed we don't want
|
|
* to overwrite the dp member of a.
|
|
*/
|
|
mp_digit *dp = (mp_digit *) MP_REALLOC(a->dp,
|
|
(size_t)a->alloc * sizeof(mp_digit),
|
|
(size_t)size * sizeof(mp_digit));
|
|
if (dp == NULL) {
|
|
/* reallocation failed but "a" is still valid [can be freed] */
|
|
return MP_MEM;
|
|
}
|
|
|
|
/* reallocation succeeded so set a->dp */
|
|
a->dp = dp;
|
|
|
|
/* zero excess digits */
|
|
s_mp_zero_digs(a->dp + a->alloc, size - a->alloc);
|
|
a->alloc = size;
|
|
}
|
|
return MP_OKAY;
|
|
}
|
|
#endif
|