24
int perl_eval_va (char *str, ...)
26
/* Evals a string, returns -1 if unsuccessful, else returns
27
* the number of return params
28
* char buf[10]; int a;
29
* perl_eval_va ("$a = 10; ($a, $a+1)",
35
SV* sv = newSVpv(str,0);
39
int nret = 0; /* number of return params expected*/
50
while (p = va_arg(vl, char *)) {
51
if ((*p != 's') && (*p != 'i') && (*p != 'd')) {
54
op[nret].pdata = (void*) va_arg(vl, char *);
59
result = perl_eval_sv(sv, (nret == 0) ? G_DISCARD :
60
(nret == 1) ? G_SCALAR :
64
/* if (SvTRUE(GvSV(errgv))) { // errgv == $@
68
/*printf ("nret: %d, result: %d\n", nret, result);*/
72
for (i = --nret; i >= 0; i--) {
76
/*printf ("String: %s\n", str);*/
77
strcpy((char *)op[i].pdata, str);
81
/*printf ("Int: %d\n", ii);*/
82
*((int *)(op[i].pdata)) = ii;
86
/*printf ("Double: %f\n", d);*/
87
*((double *) (op[i].pdata)) = d;
96
int perl_call_va (char *subname, ...)
99
char *str = NULL; int i = 0; double d = 0;
100
int nret = 0; /* number of return params expected*/
112
va_start (vl, subname);
114
/*printf ("Entering perl_call %s\n", subname);*/
115
while (p = va_arg(vl, char *)) {
116
/*printf ("Type: %s\n", p);*/
121
op[nret].pdata = (void*) va_arg(vl, char *);
122
op[nret++].type = 's';
124
str = va_arg(vl, char *);
125
/*printf ("IN: String %s\n", str);*/
127
XPUSHs(sv_2mortal(newSVpv(str,ii)));
132
op[nret].pdata = (void*) va_arg(vl, int *);
133
op[nret++].type = 'i';
135
ii = va_arg(vl, int);
136
/*printf ("IN: Int %d\n", ii);*/
137
XPUSHs(sv_2mortal(newSViv(ii)));
142
op[nret].pdata = (void*) va_arg(vl, double *);
143
op[nret++].type = 'd';
145
d = va_arg(vl, double);
146
/*printf ("IN: Double %f\n", d);*/
147
XPUSHs(sv_2mortal(newSVnv(d)));
151
out = 1; /* Out parameters starting */
161
result = perl_call_pv(subname, (nret == 0) ? G_DISCARD :
162
(nret == 1) ? G_SCALAR :
168
/*printf ("nret: %d, result: %d\n", nret, result);*/
172
for (i = --nret; i >= 0; i--) {
173
switch (op[i].type) {
176
/*printf ("String: %s\n", str);*/
177
strcpy((char *)op[i].pdata, str);
181
/*printf ("Int: %d\n", ii);*/
182
*((int *)(op[i].pdata)) = ii;
186
/*printf ("Double: %f\n", d);*/
187
*((double *) (op[i].pdata)) = d;