This repository has been archived by the owner on Jan 30, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 7
/
cb_pari_err_handle.patch
105 lines (97 loc) · 2.94 KB
/
cb_pari_err_handle.patch
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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);