1 #include <gnumeric-config.h>
2 #include "perl-gnumeric.h"
3
4 SV *
value2perl(const GnmValue * v)5 value2perl(const GnmValue *v)
6 {
7 SV *sv;
8
9 switch (v->v_any.type) {
10 case VALUE_BOOLEAN:
11 sv = newSViv(value_get_as_int (v));
12 break;
13
14 case VALUE_FLOAT:
15 sv = newSVnv(value_get_as_float (v));
16 break;
17
18 case VALUE_STRING: {
19 const char *s = value_peek_string (v);
20 sv = newSVpv(s,strlen(s));
21 break;
22 }
23
24 default:
25 sv = NULL;
26 break;
27 }
28 return sv;
29 }
30
31 GnmValue *
perl2value(SV * sv)32 perl2value(SV *sv)
33 {
34 GnmValue *v = NULL;
35
36 if (SvIOK(sv))
37 v = value_new_int (SvIV(sv));
38 else if (SvNOK(sv))
39 v = value_new_float ((gnm_float) SvNV(sv));
40 else if (SvPOK(sv)) {
41 STRLEN size;
42 gchar *tmp;
43
44 tmp = SvPV(sv, size);
45 v = value_new_string_nocopy (g_strndup (tmp, size));
46 }
47
48 return v;
49 }
50
51 #if 0
52 GnmValue *
53 marshal_func (GnmFuncEvalInfo *ei, GnmValue *argv[])
54 {
55 dSP;
56 GnmFunc const *func = gnm_eval_info_get_func (ei);
57 I32 r;
58 int i, min, max;
59 SV * result;
60 GnmValue *v;
61
62 /* Read the perlcall man page for more information. */
63 ENTER;
64 SAVETMPS;
65
66 PUSHMARK(sp);
67 gnm_func_count_args (func, &min, &max);
68
69 for (i = 0; i < max && argv[i] != NULL; i++) {
70 XPUSHs(sv_2mortal(value2perl(argv[i])));
71 }
72 PUTBACK;
73
74 /* gnm_func_get_user_data doesn't exist anymore and in any case
75 it was never set to a value sane for this. */
76 r = perl_call_sv (gnm_func_get_user_data (func), G_SCALAR);
77 SPAGAIN;
78 if (r != 1)
79 croak("uh oh, beter get maco");
80
81 result = POPs;
82 v = perl2value(result);
83
84 PUTBACK;
85 FREETMPS;
86 LEAVE;
87
88 return v;
89 }
90 #endif
91