static bool extract_big_integer (emacs_env *env, emacs_value arg, mpz_t result) { int sign; unsigned long u; ptrdiff_t count = env->extract_big_integer (env, arg, &sign, 1, &u); if (count <= 1) mpz_set_ui (result, u); else { emacs_limb_t *magnitude = _Generic (*mpz_limbs_write (result, count), emacs_limb_t: mpz_limbs_write (result, count), default: checked_malloc (count * sizeof *magnitude)); env->extract_big_integer (env, arg, &sign, count, magnitude); if (_Generic (*mpz_limbs_write (result, count), emacs_limb_t: (mpz_limbs_finish (result, sign < 0 ? -count : count), true), default: false)) return true; mpz_import (result, count, -1, sizeof *magnitude, 0, 0, magnitude); free (magnitude); } if (sign < 0) mpz_neg (result, result); return true; }