1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <mflib/exceptions.h>
#include <mfmod/mfmod.h>
/*
* echo
* ----
* If the argument is of type string or number, return it unchanged.
* Otherwise (mfmod_message), signal argument type error (e_inval).
*/
int
echo(long count, MFMOD_PARAM *p, MFMOD_PARAM *r)
{
ASSERT_ARGCOUNT(r, count, 1);
switch (p->type) {
case mfmod_string:
r->string = strdup(p->string);
assert(r->string != NULL);
break;
case mfmod_number:
r->number = p->number;
break;
default:
return mfmod_error_argtype(p, r, 0, mfmod_string);
}
r->type = p->type;
return 0;
}
/*
* argcheck
* --------
* Checks number and types of its argument and signals a corresponding
* exception if something's wrong. Apart from that does nothing useful.
*
* Arguments:
* p[0] string
* p[1] number
*/
int
argcheck(long count, MFMOD_PARAM *p, MFMOD_PARAM *r)
{
ASSERT_ARGCOUNT(r, count, 2);
ASSERT_ARGTYPE(p, r, 0, mfmod_string);
ASSERT_ARGTYPE(p, r, 1, mfmod_number);
r->type = mfmod_number;
return 0;
}
/*
* sum(...)
* --------
* Returns sum of its arguments. Intended for testing type checking in
* variadic functions.
*
* Arguments: Any number (zero allowed) of numeric values.
* Return: numeric value.
*/
int
sum(long count, MFMOD_PARAM *p, MFMOD_PARAM *r)
{
long i;
long sum = 0;
for (i = 0; i < count; i++) {
ASSERT_ARGTYPE(p, r, i, mfmod_number);
sum += p[i].number;
}
r->type = mfmod_number;
r->number = sum;
return 0;
}
|