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; }
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); }
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; }