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