#include #include int last_line_loaded = 0; int last_col_loaded = 0; SCM last_expr_loaded = SCM_BOOL_F; void scm_c_primitive_load2(const char *filename) { SCM port = scm_open_file(scm_from_locale_string (filename), scm_from_locale_string ("r")); while (1) { SCM expr = scm_read(port); if (scm_is_true (scm_eof_object_p (expr))) break; SCM line_cur = scm_port_line (port); SCM col_cur = scm_port_column (port); if (scm_is_integer (line_cur)) last_line_loaded = scm_to_int (line_cur); if (scm_is_integer (col_cur)) last_col_loaded = scm_to_int (col_cur); if (scm_is_true (expr)) last_expr_loaded = expr; scm_eval (expr, scm_interaction_environment()); } } SCM catch_handler (void *data, SCM key, SCM args) { SCM filename = scm_from_locale_string (data); SCM oport = scm_open_output_string (); scm_print_exception (oport, SCM_BOOL_F, key, args); scm_simple_format (scm_current_output_port (), scm_from_locale_string ("Error in ~A somewhere near line ~A col ~A\n"), scm_list_3 (filename, scm_from_int (last_line_loaded + 1), scm_from_int (last_col_loaded + 1))); scm_puts("possibly in expression\n", scm_current_output_port()); scm_display (last_expr_loaded, scm_current_output_port()); scm_puts("\n", scm_current_output_port()); SCM lines = scm_string_split (scm_get_output_string (oport), SCM_MAKE_CHAR ('\n')); for (; scm_is_pair (lines); lines = scm_cdr (lines)) if (scm_c_string_length (scm_car (lines))) { scm_puts (" ", scm_current_output_port ()); scm_display (scm_car (lines), scm_current_output_port ()); scm_newline (scm_current_output_port ()); } scm_close_port (oport); return SCM_BOOL_F; } int main (int argc, char **argv) { scm_init_guile (); scm_c_catch (SCM_BOOL_T, (scm_t_catch_body) scm_c_primitive_load2, (void *) argv[1], catch_handler, (void *) argv[1], NULL, NULL); return 0; }