Beispiel #1
0
SCM
gfec_apply(SCM proc, SCM arglist, gfec_error_handler error_handler)
{
    char *err_msg = NULL;
    struct gfec_apply_rec apply_rec;
    SCM result;

    apply_rec.proc = proc;
    apply_rec.arglist = arglist;

    result = scm_internal_stack_catch(SCM_BOOL_T,
                                      gfec_apply_helper,
                                      &apply_rec,
                                      gfec_catcher,
                                      &err_msg);

    if (err_msg != NULL)
    {
        if (error_handler)
            error_handler(err_msg);

        free(err_msg);

        return SCM_UNDEFINED;
    }

    return result;
}
Beispiel #2
0
static GnmValue*
func_marshal_func (GnmFuncEvalInfo *ei, GnmValue *argv[])
{
	GnmFunc const *fndef;
	SCM args = SCM_EOL, result, function;
	GnmCellRef dummy = { 0, 0, 0, 0 };
	GnmEvalPos const *old_eval_pos;
	GnmGuileCallRec ggcr;
	int i, min, max;

	g_return_val_if_fail (ei != NULL, NULL);
	g_return_val_if_fail (ei->func_call != NULL, NULL);
	g_return_val_if_fail (ei->func_call->func != NULL, NULL);

	fndef = ei->func_call->func;
	function_def_count_args (fndef, &min, &max);

	function = (SCM) gnm_func_get_user_data (fndef);

	for (i = min - 1; i >= 0; --i)
		args = scm_cons (value_to_scm (argv [i], dummy), args);

	old_eval_pos  = eval_pos;
	eval_pos      = ei->pos;
	ggcr.function = function;
	ggcr.args     = args;
	result        = scm_internal_stack_catch (SCM_BOOL_T,
						  gnm_guile_helper, &ggcr,
						  gnm_guile_catcher, NULL);
	eval_pos     = old_eval_pos;

	return scm_to_value (result);
}
Beispiel #3
0
SCM
gfec_eval_file(const char *file, gfec_error_handler error_handler)
{
    char *err_msg = NULL;
    SCM result;

    result = scm_internal_stack_catch(SCM_BOOL_T,
                                      gfec_file_helper,
                                      (void *) file,
                                      gfec_catcher,
                                      &err_msg);

    if (err_msg != NULL)
    {
        if (error_handler)
            error_handler(err_msg);

        free(err_msg);

        return SCM_UNDEFINED;
    }

    return result;
}