14 #include "gnc-guile-utils.h"
18 # define strdup _strdup
26 static SCM helper_scm_to_string(
void *ptr_void)
30 *(ptr->msg) = gnc_scm_to_utf8_string(*ptr->scm_string);
35 static int gfec_catcher_recursion_level = 0;
51 gfec_catcher(
void *data, SCM tag, SCM throw_args)
58 if (gfec_catcher_recursion_level > 2)
60 *(
char**)data = strdup(
"Guile error: Too many recursions in error catch handler.");
64 gfec_catcher_recursion_level++;
66 func = scm_c_eval_string(
"gnc:error->string");
67 if (scm_is_procedure(func))
69 result = scm_call_2(func, tag, throw_args);
70 if (scm_is_string(result))
72 char *internal_err_msg = NULL;
75 helper_data.msg = &msg;
76 helper_data.scm_string = &result;
79 scm_internal_stack_catch(SCM_BOOL_T,
81 (
void *) &helper_data,
92 msg = internal_err_msg;
99 *(
char**)data = strdup(
"Error running guile function.");
103 *(
char**)data = strdup(msg);
107 --gfec_catcher_recursion_level;
108 return SCM_UNDEFINED;
122 gfec_string_helper(
void *data)
126 return scm_c_eval_string(
string);
130 gfec_eval_string(
const char *str, gfec_error_handler error_handler)
132 char *err_msg = NULL;
135 result = scm_internal_stack_catch(SCM_BOOL_T,
144 error_handler(err_msg);
148 return SCM_UNDEFINED;
155 gfec_eval_file(
const char *file, gfec_error_handler error_handler)
157 char *err_msg = NULL;
158 gchar *contents = NULL;
159 GError *save_error = NULL;
162 if (!g_file_get_contents (file, &contents, NULL, &save_error))
164 gchar *full_msg = g_strdup_printf (
"Couldn't read contents of %s.\nReason: %s", file, save_error->message);
165 error_handler(full_msg);
167 g_error_free (save_error);
170 return SCM_UNDEFINED;
173 result = gfec_eval_string (contents, error_handler);
186 gfec_apply_helper(
void *data)
190 return scm_apply(apply_rec->proc, apply_rec->arglist, SCM_EOL);
194 gfec_apply(SCM proc, SCM arglist, gfec_error_handler error_handler)
196 char *err_msg = NULL;
200 apply_rec.proc = proc;
201 apply_rec.arglist = arglist;
203 result = scm_internal_stack_catch(SCM_BOOL_T,
212 error_handler(err_msg);
216 return SCM_UNDEFINED;
222 static int error_in_scm_eval = FALSE;
225 error_handler(
const char *msg)
227 g_warning(
"%s", msg);
228 error_in_scm_eval = TRUE;
232 gfec_try_load(gchar *fn)
234 g_debug(
"looking for %s", fn);
235 if (g_file_test(fn, G_FILE_TEST_EXISTS))
237 g_debug(
"trying to load %s", fn);
238 error_in_scm_eval = FALSE;
239 gfec_eval_file(fn, error_handler);
240 return !error_in_scm_eval;