5
#include <grass/glocale.h>
11
* This is a backdoor for strange types only. We only handle void pointer
12
* references and make no kind of typecheck; lot's of errors can be made
13
* by the user. But at least it's possible to deal with minor issues
14
* without touching the parser.
15
* Memory for "any" should be one single block.
18
typedef ANY *(*a_func) (void);
19
typedef ANY *(*a_func_a) (void *a0);
20
typedef ANY *(*a_func_aa) (void *a0, void *a1);
22
typedef struct Anyfunc
29
static ANY *mkstring(void *a);
30
void setany(SYMBOL * var, SYMBOL * any);
31
SYMBOL *mkanyvar(SYMBOL * var, SYMBOL * any);
32
SYMBOL *anyfunc(SYMBOL * func, SYMBOL * arglist);
34
static ANYFUNC af[] = {
35
{"mkstring", mkstring, "a"},
39
/***************************************************************************
42
static ANY *mkstring(void *a)
46
str = (ANY *) listitem(sizeof(ANY));
48
str->any = (char *)strdup(a);
50
fprintf(stdout, "\t%s\n", (char *)a);
56
* End test function only
57
***************************************************************************/
64
for (i = 0; af[i].name; i++) {
65
sym = putsym(af[i].name);
66
sym->type = sym->itype = st_afunc;
67
sym->v.p = af[i].func;
68
sym->proto = af[i].proto;
69
sym->rettype = st_any;
73
void setany(SYMBOL * var, SYMBOL * any)
78
sym = getsym(var->name);
80
if (--((ANY *) sym->v.p)->refcnt < 1)
86
if (--((ANY *) var->v.p)->refcnt < 1)
91
/* can't show an anyvar */
96
SYMBOL *mkanyvar(SYMBOL * var, SYMBOL * any)
98
var->type = var->itype = st_any;
102
symtab = (SYMBOL *) listadd((LIST *) symtab, (LIST *) var, cmpsymsym);
109
SYMBOL *anyfunc(SYMBOL * func, SYMBOL * arglist)
115
if (!func || !func->v.p || func->type != st_afunc) {
117
G_warning(_("Can't call bad any-function"));
120
argc = listcnt((LIST *) arglist);
122
if (argc == 0 && (!func->proto || !*func->proto))
123
res = (*(a_func) func->v.p) ();
124
else if (argc == 1 && !strcmp(func->proto, "a"))
125
res = (*(a_func_a) func->v.p) (arglist->v.p);
126
else if (argc == 2 && !strcmp(func->proto, "aa"))
127
res = (*(a_func_aa) func->v.p) (arglist->v.p, arglist->next->v.p);
129
G_warning(_("Bad arguments to anyfunc %s (argc = %d)"), func->name,
134
listdelall((LIST *) func, freesym);
135
listdelall((LIST *) arglist, freesym);
137
sym = (SYMBOL *) listitem(sizeof(SYMBOL));