/* --- @ec_sameinfop@ --- *
*
- * Arguments: @ec_info *ei, *ej@ = two elliptic curve parameter sets
+ * Arguments: @const ec_info *ei, *ej@ = two elliptic curve parameter sets
*
* Returns: Nonzero if the curves are identical (not just isomorphic).
*
* Use: Checks for sameness of curve parameters.
*/
-int ec_sameinfop(ec_info *ei, ec_info *ej)
+int ec_sameinfop(const ec_info *ei, const ec_info *ej)
{
return (ec_samep(ei->c, ej->c) &&
MP_EQ(ei->r, ej->r) && MP_EQ(ei->h, ej->h) &&
/* --- @ec_sameinfop@ --- *
*
- * Arguments: @ec_info *ei, *ej@ = two elliptic curve parameter sets
+ * Arguments: @const ec_info *ei, *ej@ = two elliptic curve parameter sets
*
* Returns: Nonzero if the curves are identical (not just isomorphic).
*
* Use: Checks for sameness of curve parameters.
*/
-extern int ec_sameinfop(ec_info */*ei*/, ec_info */*ej*/);
+extern int ec_sameinfop(const ec_info */*ei*/, const ec_info */*ej*/);
/* --- @ec_freeinfo@ --- *
*
/* --- @gfreduce_dump@ --- *
*
- * Arguments: @gfreduce *r@ = structure to dump
+ * Arguments: @const gfreduce *r@ = structure to dump
* @FILE *fp@ = file to dump on
*
* Returns: ---
* Use: Dumps a reduction context.
*/
-void gfreduce_dump(gfreduce *r, FILE *fp)
+void gfreduce_dump(const gfreduce *r, FILE *fp)
{
size_t i;
/* --- @gfreduce_do@ --- *
*
- * Arguments: @gfreduce *r@ = reduction context
+ * Arguments: @const gfreduce *r@ = reduction context
* @mp *d@ = destination
* @mp *x@ = source
*
}
}
-mp *gfreduce_do(gfreduce *r, mp *d, mp *x)
+mp *gfreduce_do(const gfreduce *r, mp *d, mp *x)
{
mpw *v, *vl;
const gfreduce_instr *il;
/* --- @gfreduce_sqrt@ --- *
*
- * Arguments: @gfreduce *r@ = pointer to reduction context
+ * Arguments: @const gfreduce *r@ = pointer to reduction context
* @mp *d@ = destination
* @mp *x@ = some polynomial
*
* Returns: The square root of @x@ modulo @r->p@, or null.
*/
-mp *gfreduce_sqrt(gfreduce *r, mp *d, mp *x)
+mp *gfreduce_sqrt(const gfreduce *r, mp *d, mp *x)
{
mp *y = MP_COPY(x);
mp *z, *spare = MP_NEW;
/* --- @gfreduce_trace@ --- *
*
- * Arguments: @gfreduce *r@ = pointer to reduction context
+ * Arguments: @const gfreduce *r@ = pointer to reduction context
* @mp *x@ = some polynomial
*
* Returns: The trace of @x@. (%$\Tr(x)=x + x^2 + \cdots + x^{2^{m-1}}$%
* we only need a single bit to represent it.
*/
-int gfreduce_trace(gfreduce *r, mp *x)
+int gfreduce_trace(const gfreduce *r, mp *x)
{
mp *y = MP_COPY(x);
mp *spare = MP_NEW;
/* --- @gfreduce_halftrace@ --- *
*
- * Arguments: @gfreduce *r@ = pointer to reduction context
+ * Arguments: @const gfreduce *r@ = pointer to reduction context
* @mp *d@ = destination
* @mp *x@ = some polynomial
*
* if %$x \in \gf{2^m}$% with %$m$% odd).
*/
-mp *gfreduce_halftrace(gfreduce *r, mp *d, mp *x)
+mp *gfreduce_halftrace(const gfreduce *r, mp *d, mp *x)
{
mp *y = MP_COPY(x);
mp *spare = MP_NEW;
/* --- @gfreduce_quadsolve@ --- *
*
- * Arguments: @gfreduce *r@ = pointer to reduction context
+ * Arguments: @const gfreduce *r@ = pointer to reduction context
* @mp *d@ = destination
* @mp *x@ = some polynomial
*
* returns the one with zero scalar coefficient.
*/
-mp *gfreduce_quadsolve(gfreduce *r, mp *d, mp *x)
+mp *gfreduce_quadsolve(const gfreduce *r, mp *d, mp *x)
{
unsigned long m = mp_bits(r->p) - 1;
mp *t;
/* --- @gfreduce_exp@ --- *
*
- * Arguments: @gfreduce *gr@ = pointer to reduction context
+ * Arguments: @const gfreduce *gr@ = pointer to reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$a^e \bmod m$%.
*/
-mp *gfreduce_exp(gfreduce *gr, mp *d, mp *a, mp *e)
+mp *gfreduce_exp(const gfreduce *gr, mp *d, mp *a, mp *e)
{
mp *x = MP_ONE;
mp *spare = (e->f & MP_BURN) ? MP_NEWSEC : MP_NEW;
/* --- @gfreduce_dump@ --- *
*
- * Arguments: @gfreduce *r@ = structure to dump
+ * Arguments: @const gfreduce *r@ = structure to dump
* @FILE *fp@ = file to dump on
*
* Returns: ---
* Use: Dumps a reduction context.
*/
-extern void gfreduce_dump(gfreduce */*r*/, FILE */*fp*/);
+extern void gfreduce_dump(const gfreduce */*r*/, FILE */*fp*/);
/* --- @gfreduce_do@ --- *
*
- * Arguments: @gfreduce *r@ = reduction context
+ * Arguments: @const gfreduce *r@ = reduction context
* @mp *d@ = destination
* @mp *x@ = source
*
* Returns: Destination, @x@ reduced modulo the reduction poly.
*/
-extern mp *gfreduce_do(gfreduce */*r*/, mp */*d*/, mp */*x*/);
+extern mp *gfreduce_do(const gfreduce */*r*/, mp */*d*/, mp */*x*/);
/* --- @gfreduce_sqrt@ --- *
*
- * Arguments: @gfreduce *r@ = pointer to reduction context
+ * Arguments: @const gfreduce *r@ = pointer to reduction context
* @mp *d@ = destination
* @mp *x@ = some polynomial
*
* Returns: The square root of @x@ modulo @r->p@, or null.
*/
-extern mp *gfreduce_sqrt(gfreduce */*r*/, mp */*d*/, mp */*x*/);
+extern mp *gfreduce_sqrt(const gfreduce */*r*/, mp */*d*/, mp */*x*/);
/* --- @gfreduce_trace@ --- *
*
- * Arguments: @gfreduce *r@ = pointer to reduction context
+ * Arguments: @const gfreduce *r@ = pointer to reduction context
* @mp *x@ = some polynomial
*
* Returns: The trace of @x@. (%$\Tr(x)=x + x^2 + \cdots + x^{2^{m-1}}$%
* we only need a single bit to represent it.
*/
-extern int gfreduce_trace(gfreduce */*r*/, mp */*x*/);
+extern int gfreduce_trace(const gfreduce */*r*/, mp */*x*/);
/* --- @gfreduce_halftrace@ --- *
*
- * Arguments: @gfreduce *r@ = pointer to reduction context
+ * Arguments: @const gfreduce *r@ = pointer to reduction context
* @mp *d@ = destination
* @mp *x@ = some polynomial
*
* if %$x \in \gf{2^m}$% with %$m$% odd).
*/
-extern mp *gfreduce_halftrace(gfreduce */*r*/, mp */*d*/, mp */*x*/);
+extern mp *gfreduce_halftrace(const gfreduce */*r*/, mp */*d*/, mp */*x*/);
/* --- @gfreduce_quadsolve@ --- *
*
- * Arguments: @gfreduce *r@ = pointer to reduction context
+ * Arguments: @const gfreduce *r@ = pointer to reduction context
* @mp *d@ = destination
* @mp *x@ = some polynomial
*
* returns the one with zero scalar coefficient.
*/
-extern mp *gfreduce_quadsolve(gfreduce */*r*/, mp */*d*/, mp */*x*/);
+extern mp *gfreduce_quadsolve(const gfreduce */*r*/, mp */*d*/, mp */*x*/);
/* --- @gfreduce_exp@ --- *
*
- * Arguments: @gfreduce *gr@ = pointer to reduction context
+ * Arguments: @const gfreduce *gr@ = pointer to reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$a^e \bmod m$%.
*/
-extern mp *gfreduce_exp(gfreduce */*gr*/, mp */*d*/, mp */*a*/, mp */*e*/);
+extern mp *gfreduce_exp(const gfreduce */*gr*/, mp */*d*/,
+ mp */*a*/, mp */*e*/);
/*----- That's all, folks -------------------------------------------------*/
/* --- @mpbarrett_exp@ --- *
*
- * Arguments: @mpbarrett *mb@ = pointer to Barrett reduction context
+ * Arguments: @const mpbarrett *mb@ = pointer to Barrett reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$a^e \bmod m$%.
*/
-mp *mpbarrett_exp(mpbarrett *mb, mp *d, mp *a, mp *e)
+mp *mpbarrett_exp(const mpbarrett *mb, mp *d, mp *a, mp *e)
{
mp *x = MP_ONE;
mp *spare = (e->f & MP_BURN) ? MP_NEWSEC : MP_NEW;
/* --- @mpbarrett_mexp@ --- *
*
- * Arguments: @mpbarrett *mb@ = pointer to Barrett reduction context
+ * Arguments: @const mpbarrett *mb@ = pointer to Barrett reduction context
* @mp *d@ = fake destination
* @const mp_expfactor *f@ = pointer to array of factors
* @size_t n@ = number of factors supplied
* %$g_0^{e_0} g_1^{e_1} \ldots g_{n-1}^{e_{n-1}} \bmod m$%
*/
-mp *mpbarrett_mexp(mpbarrett *mb, mp *d, const mp_expfactor *f, size_t n)
+mp *mpbarrett_mexp(const mpbarrett *mb, mp *d,
+ const mp_expfactor *f, size_t n)
{
mp_expfactor *ff = xmalloc(n * sizeof(mp_expfactor));
mp *a = MP_ONE;
/* --- @mpbarrett_reduce@ --- *
*
- * Arguments: @mpbarrett *mb@ = pointer to Barrett reduction context
+ * Arguments: @const mpbarrett *mb@ = pointer to Barrett reduction context
* @mp *d@ = destination for result
* @mp *m@ = number to reduce
*
* Use: Performs an efficient modular reduction.
*/
-mp *mpbarrett_reduce(mpbarrett *mb, mp *d, mp *m)
+mp *mpbarrett_reduce(const mpbarrett *mb, mp *d, mp *m)
{
mp *q;
size_t k = mb->k;
/* --- @mpbarrett_reduce@ --- *
*
- * Arguments: @mpbarrett *mb@ = pointer to Barrett reduction context
+ * Arguments: @const mpbarrett *mb@ = pointer to Barrett reduction context
* @mp *d@ = destination for result
* @mp *m@ = number to reduce
*
* Use: Performs an efficient modular reduction.
*/
-extern mp *mpbarrett_reduce(mpbarrett */*mb*/, mp */*d*/, mp */*m*/);
+extern mp *mpbarrett_reduce(const mpbarrett */*mb*/, mp */*d*/, mp */*m*/);
/* --- @mpbarrett_exp@ --- *
*
- * Arguments: @mpbarrett *mb@ = pointer to Barrett reduction context
+ * Arguments: @const mpbarrett *mb@ = pointer to Barrett reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$a^e \bmod m$%.
*/
-extern mp *mpbarrett_exp(mpbarrett */*mb*/, mp */*d*/, mp */*a*/, mp */*e*/);
+extern mp *mpbarrett_exp(const mpbarrett */*mb*/, mp */*d*/,
+ mp */*a*/, mp */*e*/);
/* --- @mpbarrett_mexp@ --- *
*
- * Arguments: @mpbarrett *mb@ = pointer to Barrett reduction context
+ * Arguments: @const mpbarrett *mb@ = pointer to Barrett reduction context
* @mp *d@ = fake destination
* @const mp_expfactor *f@ = pointer to array of factors
* @size_t n@ = number of factors supplied
* %$g_0^{e_0} g_1^{e_1} \ldots g_{n-1}^{e_{n-1}} \bmod m$%
*/
-extern mp *mpbarrett_mexp(mpbarrett */*mb*/, mp */*d*/,
+extern mp *mpbarrett_mexp(const mpbarrett */*mb*/, mp */*d*/,
const mp_expfactor */*f*/, size_t /*n*/);
/*----- That's all, folks -------------------------------------------------*/
/* --- @mpmont_expr@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$(a R^{-1})^e R \bmod m$%.
*/
-mp *mpmont_expr(mpmont *mm, mp *d, mp *a, mp *e)
+mp *mpmont_expr(const mpmont *mm, mp *d, mp *a, mp *e)
{
mp *x = MP_COPY(mm->r);
mp *spare = (e->f & MP_BURN) ? MP_NEWSEC : MP_NEW;
/* --- @mpmont_exp@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$a^e \bmod m$%.
*/
-mp *mpmont_exp(mpmont *mm, mp *d, mp *a, mp *e)
+mp *mpmont_exp(const mpmont *mm, mp *d, mp *a, mp *e)
{
e = MP_COPY(e);
d = mpmont_mul(mm, d, a, mm->r2);
/* --- @mpmont_mexpr@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = fake destination
* @const mp_expfactor *f@ = pointer to array of factors
* @size_t n@ = number of factors supplied
* except that the %$g_i$% and result are in Montgomery form.
*/
-static mp *mexpr(mpmont *mm, mp *d, mp_expfactor *f, size_t n)
+static mp *mexpr(const mpmont *mm, mp *d, mp_expfactor *f, size_t n)
{
mp *a = MP_COPY(mm->r);
mp *spare = MP_NEW;
return (a);
}
-mp *mpmont_mexpr(mpmont *mm, mp *d, const mp_expfactor *f, size_t n)
+mp *mpmont_mexpr(const mpmont *mm, mp *d, const mp_expfactor *f, size_t n)
{
mp_expfactor *ff = xmalloc(n * sizeof(mp_expfactor));
size_t i;
/* --- @mpmont_mexp@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = fake destination
* @const mp_expfactor *f@ = pointer to array of factors
* @size_t n@ = number of factors supplied
* Use: Convenient interface over @mpmont_mexpr@.
*/
-mp *mpmont_mexp(mpmont *mm, mp *d, const mp_expfactor *f, size_t n)
+mp *mpmont_mexp(const mpmont *mm, mp *d, const mp_expfactor *f, size_t n)
{
mp_expfactor *ff = xmalloc(n * sizeof(mp_expfactor));
size_t i;
/* --- @finish@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to a Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to a Montgomery reduction
+ * context
* *mp *d@ = pointer to mostly-reduced operand
*
* Returns: ---
* need to do an additional subtraction if %$d$% is negative.
*/
-static void finish(mpmont *mm, mp *d)
+static void finish(const mpmont *mm, mp *d)
{
mpw *dv = d->v, *dvl = d->vl;
size_t n = mm->n;
/* --- @mpmont_reduce@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = destination
* @mp *a@ = source, assumed positive
*
#ifdef MPMONT_DISABLE
-mp *mpmont_reduce(mpmont *mm, mp *d, mp *a)
+mp *mpmont_reduce(const mpmont *mm, mp *d, mp *a)
{
mp_div(0, &d, a, mm->m);
return (d);
#else
-mp *mpmont_reduce(mpmont *mm, mp *d, mp *a)
+mp *mpmont_reduce(const mpmont *mm, mp *d, mp *a)
{
size_t n = mm->n;
/* --- @mpmont_mul@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = destination
* @mp *a, *b@ = sources, assumed positive
*
#ifdef MPMONT_DISABLE
-mp *mpmont_mul(mpmont *mm, mp *d, mp *a, mp *b)
+mp *mpmont_mul(const mpmont *mm, mp *d, mp *a, mp *b)
{
d = mp_mul(d, a, b);
mp_div(0, &d, d, mm->m);
#else
-mp *mpmont_mul(mpmont *mm, mp *d, mp *a, mp *b)
+mp *mpmont_mul(const mpmont *mm, mp *d, mp *a, mp *b)
{
size_t n = mm->n;
/* --- @mpmont_reduce@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = destination
* @mp *a@ = source, assumed positive
*
* Returns: Result, %$a R^{-1} \bmod m$%.
*/
-extern mp *mpmont_reduce(mpmont */*mm*/, mp */*d*/, mp */*a*/);
+extern mp *mpmont_reduce(const mpmont */*mm*/, mp */*d*/, mp */*a*/);
/* --- @mpmont_mul@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = destination
* @mp *a, *b@ = sources, assumed positive
*
* Returns: Result, %$a b R^{-1} \bmod m$%.
*/
-extern mp *mpmont_mul(mpmont */*mm*/, mp */*d*/, mp */*a*/, mp */*b*/);
+extern mp *mpmont_mul(const mpmont */*mm*/, mp */*d*/, mp */*a*/, mp */*b*/);
/* --- @mpmont_expr@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* further modular arithmetic is to be performed on the result.
*/
-extern mp *mpmont_expr(mpmont */*mm*/, mp */*d*/, mp */*a*/, mp */*e*/);
+extern mp *mpmont_expr(const mpmont */*mm*/, mp */*d*/,
+ mp */*a*/, mp */*e*/);
/* --- @mpmont_exp@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$a^e \bmod m$%.
*/
-extern mp *mpmont_exp(mpmont */*mm*/, mp */*d*/, mp */*a*/, mp */*e*/);
+extern mp *mpmont_exp(const mpmont */*mm*/, mp */*d*/, mp */*a*/, mp */*e*/);
/* --- @mpmont_mexpr@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = fake destination
* @const mp_expfactor *f@ = pointer to array of factors
* @size_t n@ = number of factors supplied
* except that the %$g_i$% and result are in Montgomery form.
*/
-extern mp *mpmont_mexpr(mpmont */*mm*/, mp */*d*/,
+extern mp *mpmont_mexpr(const mpmont */*mm*/, mp */*d*/,
const mp_expfactor */*f*/, size_t /*n*/);
/* --- @mpmont_mexp@ --- *
*
- * Arguments: @mpmont *mm@ = pointer to Montgomery reduction context
+ * Arguments: @const mpmont *mm@ = pointer to Montgomery reduction context
* @mp *d@ = fake destination
* @const mp_expfactor *f@ = pointer to array of factors
* @size_t n@ = number of factors supplied
* Use: Convenient interface over @mpmont_mexpr@.
*/
-extern mp *mpmont_mexp(mpmont */*mm*/, mp */*d*/,
+extern mp *mpmont_mexp(const mpmont */*mm*/, mp */*d*/,
const mp_expfactor */*f*/, size_t /*n*/);
/*----- That's all, folks -------------------------------------------------*/
/* --- @mpreduce_dump@ --- *
*
- * Arguments: @mpreduce *r@ = structure to dump
+ * Arguments: @const mpreduce *r@ = structure to dump
* @FILE *fp@ = file to dump on
*
* Returns: ---
* Use: Dumps a reduction context.
*/
-void mpreduce_dump(mpreduce *r, FILE *fp)
+void mpreduce_dump(const mpreduce *r, FILE *fp)
{
size_t i;
static const char *opname[] = { "add", "addshift", "sub", "subshift" };
/* --- @mpreduce_do@ --- *
*
- * Arguments: @mpreduce *r@ = reduction context
+ * Arguments: @const mpreduce *r@ = reduction context
* @mp *d@ = destination
* @mp *x@ = source
*
}
}
-mp *mpreduce_do(mpreduce *r, mp *d, mp *x)
+mp *mpreduce_do(const mpreduce *r, mp *d, mp *x)
{
mpw *v, *vl;
const mpreduce_instr *il;
/* --- @mpreduce_exp@ --- *
*
- * Arguments: @mpreduce *mr@ = pointer to reduction context
+ * Arguments: @const mpreduce *mr@ = pointer to reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$a^e \bmod m$%.
*/
-mp *mpreduce_exp(mpreduce *mr, mp *d, mp *a, mp *e)
+mp *mpreduce_exp(const mpreduce *mr, mp *d, mp *a, mp *e)
{
mp *x = MP_ONE;
mp *spare = (e->f & MP_BURN) ? MP_NEWSEC : MP_NEW;
/* --- @mpreduce_dump@ --- *
*
- * Arguments: @mpreduce *r@ = structure to dump
+ * Arguments: @const mpreduce *r@ = structure to dump
* @FILE *fp@ = file to dump on
*
* Returns: ---
* Use: Dumps a reduction context.
*/
-extern void mpreduce_dump(mpreduce */*r*/, FILE */*fp*/);
+extern void mpreduce_dump(const mpreduce */*r*/, FILE */*fp*/);
/* --- @mpreduce_do@ --- *
*
* Returns: Destination, @x@ reduced modulo the reduction poly.
*/
-extern mp *mpreduce_do(mpreduce */*r*/, mp */*d*/, mp */*x*/);
+extern mp *mpreduce_do(const mpreduce */*r*/, mp */*d*/, mp */*x*/);
/* --- @mpreduce_exp@ --- *
*
- * Arguments: @mpreduce *mr@ = pointer to reduction context
+ * Arguments: @const mpreduce *mr@ = pointer to reduction context
* @mp *d@ = fake destination
* @mp *a@ = base
* @mp *e@ = exponent
* Returns: Result, %$a^e \bmod m$%.
*/
-extern mp *mpreduce_exp(mpreduce */*mr*/, mp */*d*/, mp */*a*/, mp */*e*/);
+extern mp *mpreduce_exp(const mpreduce */*mr*/, mp */*d*/,
+ mp */*a*/, mp */*e*/);
/*----- That's all, folks -------------------------------------------------*/