Add cb_pari_err_handle() callback Backported from upstream commits e9e659dc9ecb5ca6a8296c7922528a4ecbb89cb0 26a7ae0f42918407febe9901ded41faf26ef43a6 diff -ru src/src/headers/paricom.h b/src/headers/paricom.h --- src/src/headers/paricom.h 2014-03-25 09:59:21.000000000 +0100 +++ b/src/headers/paricom.h 2015-01-13 19:41:47.430885048 +0100 @@ -81,6 +81,7 @@ extern int (*cb_pari_whatnow)(PariOUT *out, const char *, int); extern void (*cb_pari_sigint)(void); extern int (*cb_pari_handle_exception)(long); +extern int (*cb_pari_err_handle)(GEN); extern void (*cb_pari_pre_recover)(long); extern void (*cb_pari_err_recover)(long); extern const char *pari_library_path; diff -ru src/src/language/init.c b/src/language/init.c --- src/src/language/init.c 2015-01-13 19:40:30.643622993 +0100 +++ b/src/language/init.c 2015-01-13 19:41:47.431884833 +0100 @@ -87,6 +87,7 @@ void (*cb_pari_ask_confirm)(const char *); int (*cb_pari_handle_exception)(long); +int (*cb_pari_err_handle)(GEN); int (*cb_pari_whatnow)(PariOUT *out, const char *, int); void (*cb_pari_sigint)(void); void (*cb_pari_pre_recover)(long); @@ -732,6 +733,8 @@ static void dflt_err_recover(long errnum) { (void) errnum; pari_exit(); } +static int pari_err_display(GEN err); + /* initialize PARI data. Initialize [new|old]fun to NULL for default set. */ void pari_init_opts(size_t parisize, ulong maxprime, ulong init_opts) @@ -739,6 +742,8 @@ ulong u; cb_pari_whatnow = NULL; + cb_pari_handle_exception = NULL; + cb_pari_err_handle = pari_err_display; cb_pari_pre_recover = NULL; cb_pari_sigint = dflt_sigint_fun; if (init_opts&INIT_JMPm) cb_pari_err_recover = dflt_err_recover; @@ -887,9 +892,6 @@ evalstate_reset(); killallfiles(); pari_init_errcatch(); - out_puts(pariErr, "\n"); - pariErr->flush(); - cb_pari_err_recover(numerr); } @@ -1266,21 +1268,22 @@ return NULL; /*NOT REACHED*/ } -static void +static int pari_err_display(GEN err) { long numerr=err_get_num(err); + err_init(); if (numerr==e_SYNTAX) { const char *msg = GSTR(gel(err,2)); const char *s = (const char *) gmael(err,3,1); const char *entry = (const char *) gmael(err,3,2); print_errcontext(pariErr, msg, s, entry); - return; } else { char *s = pari_err2str(err); + closure_err(0); err_init_msg(numerr, e_USER); pariErr->puts(s); if (numerr==e_NOTFUNC) @@ -1295,6 +1298,8 @@ } pari_free(s); } + out_term_color(pariErr, c_NONE); + pariErr->flush(); return 0; } void @@ -1315,12 +1320,9 @@ global_err_data = E; if (*iferr_env) longjmp(*iferr_env, numerr); mt_err_recover(numerr); - err_init(); - if (numerr != e_SYNTAX) closure_err(0); - pari_err_display(E); - out_term_color(pariErr, c_NONE); va_end(ap); - pariErr->flush(); + if (cb_pari_err_handle && + cb_pari_err_handle(E)) return; if (cb_pari_handle_exception && cb_pari_handle_exception(numerr)) return; err_recover(numerr);