static GnmValue * call_python_function_args (GnmFuncEvalInfo *ei, GnmValue const * const *args) { GOPluginService *service; ServiceLoaderDataFunctionGroup *loader_data; PyObject *fn_info_tuple; PyObject *python_fn; GnmFunc const * fndef; gint min_n_args, max_n_args, n_args; g_return_val_if_fail (ei != NULL, NULL); g_return_val_if_fail (ei->func_call != NULL, NULL); g_return_val_if_fail (args != NULL, NULL); fndef = ei->func_call->func; service = (GOPluginService *) gnm_func_get_user_data (fndef); loader_data = g_object_get_data (G_OBJECT (service), "loader_data"); SWITCH_TO_PLUGIN (go_plugin_service_get_plugin (service)); fn_info_tuple = PyDict_GetItemString (loader_data->python_fn_info_dict, (gchar *) gnm_func_get_name (fndef, FALSE)); g_assert (fn_info_tuple != NULL); python_fn = PyTuple_GetItem (fn_info_tuple, 2); function_def_count_args (fndef, &min_n_args, &max_n_args); for (n_args = min_n_args; n_args < max_n_args && args[n_args] != NULL; n_args++) { ; } return call_python_function (python_fn, ei->pos, n_args, args); }
static GnmValue * call_python_function_nodes (GnmFuncEvalInfo *ei, int argc, GnmExprConstPtr const *argv) { GOPluginService *service; ServiceLoaderDataFunctionGroup *loader_data; PyObject *python_fn; GnmFunc const * fndef; GnmValue **values; gint i; GnmValue *ret_value; g_return_val_if_fail (ei != NULL, NULL); g_return_val_if_fail (ei->func_call != NULL, NULL); fndef = ei->func_call->func; service = (GOPluginService *) gnm_func_get_user_data (fndef); loader_data = g_object_get_data (G_OBJECT (service), "loader_data"); SWITCH_TO_PLUGIN (go_plugin_service_get_plugin (service)); python_fn = PyDict_GetItemString (loader_data->python_fn_info_dict, (gchar *) gnm_func_get_name (fndef, FALSE)); values = g_new (GnmValue *, argc); for (i = 0; i < argc; i++) { values[i] = gnm_expr_eval (argv[i], ei->pos, GNM_EXPR_EVAL_PERMIT_NON_SCALAR); } ret_value = call_python_function (python_fn, ei->pos, argc, (GnmValue const * const *)values); for (i = 0; i < argc; i++) { value_release (values[i]); } g_free (values); return ret_value; }
static void xlsx_func_map_out (GnmConventionsOut *out, GnmExprFunction const *func) { XLSXExprConventions const *xconv = (XLSXExprConventions const *)(out->convs); char const *name = gnm_func_get_name (func->func, FALSE); gboolean (*handler) (GnmConventionsOut *out, GnmExprFunction const *func); handler = g_hash_table_lookup (xconv->xlfn_handler_map, name); if (handler == NULL || !handler (out, func)) { char const *new_name = g_hash_table_lookup (xconv->xlfn_map, name); GString *target = out->accum; if (new_name == NULL) { char *new_u_name; new_u_name = g_ascii_strup (name, -1); if (func->func->impl_status == GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC) g_string_append (target, "_xlfngnumeric."); /* LO & friends use _xlfnodf */ g_string_append (target, new_u_name); g_free (new_u_name); } else { g_string_append (target, "_xlfn."); g_string_append (target, new_name); } gnm_expr_list_as_string (func->argc, func->argv, out); } return; }
static void gplp_func_load_stub (GOPluginService *service, GnmFunc *func) { char const *name = gnm_func_get_name (func, FALSE); char *args[] = { NULL }; gchar *help_perl_func = g_strconcat ("help_", name, NULL); gchar *desc_perl_func = g_strconcat ("desc_", name, NULL); GnmFuncHelp *help = NULL; gchar *arg_spec = NULL; int count; dSP; ENTER; SAVETMPS; PUSHMARK(SP); PUTBACK; count = call_argv (help_perl_func, G_EVAL | G_ARRAY | G_NOARGS, args); SPAGAIN; if (SvTRUE(ERRSV)) { /* Error handling */ STRLEN n_a; g_print ( _("Perl error: %s\n"), SvPV (ERRSV, n_a)); while (count-- > 0) POPs; } else { help = make_gnm_help(name, count, SP); } PUTBACK; FREETMPS; LEAVE; ENTER; SAVETMPS; PUSHMARK(SP); PUTBACK; call_argv (desc_perl_func, G_EVAL | G_ARRAY | G_NOARGS, args); SPAGAIN; if (SvTRUE(ERRSV)) { /* Error handling */ STRLEN n_a; g_print ( _("Perl error: %s\n"), SvPV (ERRSV, n_a)); POPs; } else { arg_spec = g_strdup (POPp); gnm_perl_loader_free_later (arg_spec); } PUTBACK; FREETMPS; LEAVE; g_free (help_perl_func); g_free (desc_perl_func); gnm_func_set_fixargs (func, call_perl_function_args, arg_spec); gnm_func_set_help (func, help, -1); gnm_func_set_impl_status (func, GNM_FUNC_IMPL_STATUS_UNIQUE_TO_GNUMERIC); }
static GnmValue* call_perl_function_args (GnmFuncEvalInfo *ei, GnmValue const * const *args) { GnmFunc *fndef; gint min_n_args, max_n_args, n_args; gint i; gchar *perl_func; GnmValue* result; dSP; fndef = gnm_expr_get_func_def ((GnmExpr *)(ei->func_call)); perl_func = g_strconcat ("func_", gnm_func_get_name (fndef, FALSE), NULL); gnm_func_count_args (fndef, &min_n_args, &max_n_args); for (n_args = min_n_args; n_args < max_n_args && args[n_args] != NULL; n_args++); ENTER; SAVETMPS; PUSHMARK(SP); for (i = 0; i < n_args; i++) { SV* sv = value2perl (args[i]); XPUSHs(sv_2mortal(sv)); } PUTBACK; call_pv (perl_func, G_EVAL | G_SCALAR); SPAGAIN; if (SvTRUE(ERRSV)) { /* Error handling */ gchar *errmsg; STRLEN n_a; errmsg = g_strconcat (_("Perl error: "), SvPV (ERRSV, n_a), NULL); POPs; result = value_new_error (ei->pos, errmsg); g_free (errmsg); } else { result = perl2value (POPs); } PUTBACK; FREETMPS; LEAVE; g_free (perl_func); return result; }