00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <plang/errors.h>
00021 #include "term-priv.h"
00022 #include "context-priv.h"
00023
00061
00062
00063
00064 static p_term *p_wrap_error(p_context *context, p_term *term)
00065 {
00066 p_term *goal;
00067 p_term *name;
00068 p_term *error;
00069 p_term *pred;
00070 int arity;
00071 if (context->current_node)
00072 goal = p_term_deref(context->current_node->goal);
00073 else
00074 goal = p_term_create_atom(context, "unknown");
00075 if (goal && goal->header.type == P_TERM_FUNCTOR) {
00076 name = goal->functor.functor_name;
00077 arity = (int)(goal->header.size);
00078 } else {
00079 name = goal;
00080 arity = 0;
00081 }
00082 error = p_term_create_functor
00083 (context, p_term_create_atom(context, "error"), 2);
00084 p_term_bind_functor_arg(error, 0, term);
00085 pred = p_term_create_functor(context, context->slash_atom, 2);
00086 p_term_bind_functor_arg(pred, 0, name);
00087 p_term_bind_functor_arg
00088 (pred, 1, p_term_create_integer(context, arity));
00089 p_term_bind_functor_arg(error, 1, pred);
00090 return error;
00091 }
00092
00101 p_term *p_create_instantiation_error(p_context *context)
00102 {
00103 return p_wrap_error
00104 (context, p_term_create_atom(context, "instantiation_error"));
00105 }
00106
00118 p_term *p_create_type_error
00119 (p_context *context, const char *expected_type, p_term *culprit)
00120 {
00121 p_term *error = p_term_create_functor
00122 (context, p_term_create_atom(context, "type_error"), 2);
00123 p_term_bind_functor_arg
00124 (error, 0, p_term_create_atom(context, expected_type));
00125 p_term_bind_functor_arg(error, 1, p_term_clone(context, culprit));
00126 return p_wrap_error(context, error);
00127 }
00128
00140 p_term *p_create_domain_error
00141 (p_context *context, const char *expected_domain, p_term *culprit)
00142 {
00143 p_term *error = p_term_create_functor
00144 (context, p_term_create_atom(context, "domain_error"), 2);
00145 p_term_bind_functor_arg
00146 (error, 0, p_term_create_atom(context, expected_domain));
00147 p_term_bind_functor_arg(error, 1, p_term_clone(context, culprit));
00148 return p_wrap_error(context, error);
00149 }
00150
00162 p_term *p_create_existence_error
00163 (p_context *context, const char *object_type, p_term *culprit)
00164 {
00165 p_term *error = p_term_create_functor
00166 (context, p_term_create_atom(context, "existence_error"), 2);
00167 p_term_bind_functor_arg
00168 (error, 0, p_term_create_atom(context, object_type));
00169 p_term_bind_functor_arg(error, 1, p_term_clone(context, culprit));
00170 return p_wrap_error(context, error);
00171 }
00172
00184 p_term *p_create_permission_error
00185 (p_context *context, const char *operation,
00186 const char *permission_type, p_term *culprit)
00187 {
00188 p_term *error = p_term_create_functor
00189 (context, p_term_create_atom(context, "permission_error"), 3);
00190 p_term_bind_functor_arg
00191 (error, 0, p_term_create_atom(context, operation));
00192 p_term_bind_functor_arg
00193 (error, 1, p_term_create_atom(context, permission_type));
00194 p_term_bind_functor_arg(error, 2, p_term_clone(context, culprit));
00195 return p_wrap_error(context, error);
00196 }
00197
00207 p_term *p_create_representation_error(p_context *context, const char *flag)
00208 {
00209 p_term *error = p_term_create_functor
00210 (context, p_term_create_atom(context, "representation_error"), 1);
00211 p_term_bind_functor_arg
00212 (error, 0, p_term_create_atom(context, flag));
00213 return p_wrap_error(context, error);
00214 }
00215
00225 p_term *p_create_evaluation_error(p_context *context, const char *eval_type)
00226 {
00227 p_term *error = p_term_create_functor
00228 (context, p_term_create_atom(context, "evaluation_error"), 1);
00229 p_term_bind_functor_arg
00230 (error, 0, p_term_create_atom(context, eval_type));
00231 return p_wrap_error(context, error);
00232 }
00233
00245 p_term *p_create_resource_error(p_context *context, p_term *resource)
00246 {
00247 p_term *error = p_term_create_functor
00248 (context, p_term_create_atom(context, "resource_error"), 1);
00249 p_term_bind_functor_arg
00250 (error, 0, p_term_clone(context, resource));
00251 return p_wrap_error(context, error);
00252 }
00253
00264 p_term *p_create_syntax_error(p_context *context, p_term *term)
00265 {
00266 p_term *error = p_term_create_functor
00267 (context, p_term_create_atom(context, "syntax_error"), 1);
00268 p_term_bind_functor_arg
00269 (error, 0, p_term_clone(context, term));
00270 return p_wrap_error(context, error);
00271 }
00272
00281 p_term *p_create_system_error(p_context *context)
00282 {
00283 return p_wrap_error
00284 (context, p_term_create_atom(context, "system_error"));
00285 }
00286
00300 p_term *p_create_generic_error(p_context *context, p_term *term)
00301 {
00302 return p_wrap_error(context, p_term_clone(context, term));
00303 }
00304
00305