1
/*****************************************************************************
3
* This function contains the error handling routine of the sgml parser. This
4
* routine creates the error term to throw in case of an exception.
6
***************************************************************************/
16
#include "error_term.h"
18
prolog_term global_error_term = (prolog_term)NULL;
19
prolog_term global_warning_term = (prolog_term)NULL;
22
* Function to handle the errors. It creates an appropriate error term
23
* for the prolog side to throw.
24
* Input : type of error
25
* Output : TRUE on success, FALSE on failure
28
sgml2pl_error(plerrorid id, ...)
30
prolog_term except = p2p_new();
31
prolog_term formal = p2p_new();
32
prolog_term swi = p2p_new();
33
prolog_term tmp1 = p2p_new();
41
/*Create the appropriate error term based on the type of error*/
44
case ERR_ERRNO: /*Standard unix errors*/
46
int err = va_arg(args, int);
51
/*Not enough memory error*/
54
c2p_functor("sgml", 1, tmp1);
55
tmp = p2p_arg( tmp1, 1);
56
c2p_functor( "resource_error", 1, tmp);
58
c2p_string( "no_memory", p2p_arg( tmp, 1));
59
p2p_unify( tmp1, formal);
64
const char *file = va_arg(args, const char *);
65
const char *action = va_arg(args, const char *);
67
c2p_functor("sgml", 1, tmp1);
68
tmp = p2p_arg( tmp1, 1);
70
c2p_functor( "permission_error", 3, tmp);
71
c2p_string( (char*)action, p2p_arg(tmp, 1));
72
c2p_string( "file", p2p_arg(tmp, 2));
73
c2p_string ( (char*)file, p2p_arg(tmp, 3));
75
p2p_unify( tmp1, formal);
78
/*Entity not found error*/
81
const char *file = va_arg(args, const char *);
84
c2p_functor("sgml", 1, tmp1);
85
tmp = p2p_arg( tmp1, 1);
87
c2p_functor( "permission_error", 2, tmp);
89
c2p_string( "file", p2p_arg(tmp, 1));
90
c2p_string ( (char*)file, p2p_arg(tmp, 2));
92
p2p_unify( tmp1, formal);
96
/*Defaults to system error*/
99
c2p_functor("sgml", 1, tmp1);
100
tmp = p2p_arg( tmp1, 1);
102
c2p_string("system_error", tmp);
103
p2p_unify( tmp1, formal);
111
const char *expected = va_arg(args, const char*);
112
prolog_term actual = va_arg(args, prolog_term);
116
c2p_functor("sgml", 1, tmp1);
117
tmp = p2p_arg( tmp1, 1);
119
if( is_attv( actual) && strcmp(expected, "variable") != 0 )
121
c2p_string( "instantiation_error", tmp);
122
p2p_unify( tmp1, formal);
126
c2p_functor( "type_error", 2, tmp);
127
c2p_string( (char*)expected, p2p_arg(tmp, 1));
128
p2p_unify ( actual, p2p_arg(tmp, 2));
129
p2p_unify( tmp1, formal);
133
case ERR_DOMAIN: /*Domain error*/
135
const char *expected = va_arg(args, const char*);
136
prolog_term actual = va_arg(args, prolog_term);
138
/*Improper domain of functor*/
139
c2p_functor("sgml", 1, tmp1);
140
tmp = p2p_arg( tmp1, 1);
142
if( is_attv( actual) && strcmp(expected, "variable") != 0 )
144
c2p_string( "instantiation_error", tmp);
145
p2p_unify( tmp1, formal);
149
c2p_functor( "domain_error", 2, tmp);
150
c2p_string( (char*)expected, p2p_arg(tmp, 1));
151
p2p_unify( actual, p2p_arg(tmp, 2));
152
p2p_unify( tmp1, formal);
156
case ERR_EXISTENCE: /*Existence error*/
158
const char *type = va_arg(args, const char *);
159
prolog_term obj = va_arg(args, prolog_term);
161
/*Resource not found*/
162
c2p_functor("sgml", 1, tmp1);
163
tmp = p2p_arg( tmp1, 1);
165
c2p_functor( "existence_error", 2, tmp);
167
c2p_string( (char*)type, p2p_arg(tmp, 1));
168
p2p_unify ( obj, p2p_arg(tmp, 2));
170
p2p_unify( tmp1, formal);
175
/*Goal failed error*/
176
prolog_term goal = va_arg(args, prolog_term);
178
c2p_functor("sgml", 1, tmp1);
179
tmp = p2p_arg( tmp1, 1);
181
c2p_functor( "goal_failed", 1, tmp);
183
p2p_unify( p2p_arg( tmp,1), goal);
185
p2p_unify( tmp1, formal);
190
/*Limit exceeded error*/
191
const char *limit = va_arg(args, const char *);
192
long maxval = va_arg(args, long);
194
c2p_functor("sgml", 1, tmp1);
195
tmp = p2p_arg( tmp1, 1);
197
c2p_functor( "limit_exceeded", 2, tmp);
198
c2p_string( (char*)limit, p2p_arg( tmp,1));
199
c2p_int( maxval, p2p_arg( tmp, 2));
200
p2p_unify( tmp1, formal);
205
/*Miscellaneous error*/
206
const char *id = va_arg(args, const char *);
208
const char *fmt = va_arg(args, const char *);
210
vsprintf(msgbuf, fmt, args);
213
c2p_functor("sgml", 1, tmp1);
214
tmp = p2p_arg( tmp1, 1);
216
c2p_functor( "miscellaneous", 1, tmp);
217
c2p_string( (char*)id, p2p_arg( tmp, 1));
218
p2p_unify( tmp1, formal);
229
prolog_term msgterm = p2p_new();
233
c2p_string( msg, msgterm);
238
c2p_functor( "context", 1, tmp);
239
p2p_unify( p2p_arg( tmp, 1), msgterm);
240
p2p_unify( tmp, swi);
243
/*Create the error term to throw*/
245
c2p_functor( "error", 2, tmp);
246
p2p_unify( p2p_arg( tmp, 1), formal);
247
p2p_unify( p2p_arg( tmp, 2), swi);
248
p2p_unify( tmp, except);
250
return p2p_unify( global_error_term, except);