Is there an option to truncate an mpz_t?

Simon Sobisch simonsobisch at gnu.org
Tue Feb 16 19:12:12 UTC 2021


Hi fellow GMP users,

the code to truncate or pad left that I'm currently using has different 
issues, especially when the value stored in mpz_t is quite big as it 
will allocate a huge string which is just freed directly afterwards and 
most of its content not being looked at.

The goal is a fixed-with field (positive integer) in an existing buffer 
[without null termination]; so left-padded with zeroes, or truncated 
(with a marker) on the left side.

The current approach (data buffer and fixed_len are passed to the 
function) is:

char *p = mpz_get_str(NULL, 10, op);
const size_t size = strlen (p);
const int diff = fixed_len - size;
int truncated = 0;

if (diff < 0) {
    truncated = 1;
    memcpy (data, p - diff, end_len);
} else {
    memset (data, '0', diff);
    memcpy (data + diff, p, fixed_len);
}

{
   void (*freefunc)(void *, size_t);
   mp_get_memory_functions (NULL, NULL, &freefunc);
   freefunc (p, strlen(p) + 1);
}


Do you see a better approach in general, maybe even an option to not 
allocate (and fill) a string of possibly 4000 or more bytes just to copy 
the last 4 [if the buffer was very small]?


Thank you very much in advance!
Simon


More information about the gmp-discuss mailing list