mirror of
https://gitdl.cn/https://github.com/chakralinux/core.git
synced 2025-02-11 23:44:38 +08:00
106 lines
2.9 KiB
Diff
106 lines
2.9 KiB
Diff
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);
|