monetdb5/modules/mal/*.mal
to get a glimpse on how to write them. The MonetDB kernel documentation provides more details. The file contains the MAL snippet:command reverse(ra1:str):str
address UDFreverse
comment "Reverse a string";
step 4. The signature says that it expects a command body implementation under the name UDFreverse, shown below. The C-signature is a direct mapping, where arguments are passed by reference and the return value(s) references are the first in the arguments list. The body should return a (malloced) string to denote an exception being raised or MAL_SUCCEED upon access.#include "udf.h"
static str
reverse(const char *src)
{
size_t len;
str ret, new;
/* The scalar function returns the new space */
len = strlen(src);
ret = new = GDKmalloc(len + 1);
if (new == NULL)
return NULL;
new[len] = 0;
while (len > 0)
*new++ = src[--len];
return ret;
}
str
UDFreverse(str *ret, str *src)
{
if (*src == 0 || strcmp(*src, str_nil) == 0)
*ret = GDKstrdup(str_nil);
else
*ret = reverse(*src);
return MAL_SUCCEED;
}
I don't know why the argument name of "command reverse(ra1:str):str" different from function definition UDFreverse(str *ret, str *src)?
how does ret come from? is it according to the naming rules that the first argument is the result, must it be a string type?
Thanks!
Meng