172 lines
4.1 KiB
C
172 lines
4.1 KiB
C
|
/* $Id$
|
||
|
|
||
|
Part of SWI-Prolog
|
||
|
|
||
|
Author: Jan Wielemaker
|
||
|
E-mail: wielemak@science.uva.nl
|
||
|
WWW: http://www.swi-prolog.org
|
||
|
Copyright (C): 2007, University of Amsterdam
|
||
|
|
||
|
This library is free software; you can redistribute it and/or
|
||
|
modify it under the terms of the GNU Lesser General Public
|
||
|
License as published by the Free Software Foundation; either
|
||
|
version 2.1 of the License, or (at your option) any later version.
|
||
|
|
||
|
This library is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
|
Lesser General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU Lesser General Public
|
||
|
License along with this library; if not, write to the Free Software
|
||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
*/
|
||
|
|
||
|
#include <SWI-Stream.h>
|
||
|
#include <SWI-Prolog.h>
|
||
|
|
||
|
#define O_DEBUG 1
|
||
|
|
||
|
static functor_t FUNCTOR_error2; /* error(Formal, Context) */
|
||
|
static functor_t FUNCTOR_type_error2; /* type_error(Term, Expected) */
|
||
|
static functor_t FUNCTOR_domain_error2; /* domain_error(Term, Expected) */
|
||
|
static functor_t FUNCTOR_permission_error3; /* permission_error(Op, Type, Term) */
|
||
|
static functor_t FUNCTOR_existence_error2; /* existence_error(Type, Term) */
|
||
|
static int debuglevel = 0;
|
||
|
|
||
|
#define MKFUNCTOR(name, arity) PL_new_functor(PL_new_atom(name), arity)
|
||
|
|
||
|
#ifdef O_DEBUG
|
||
|
#define DEBUG(n, g) if ( debuglevel >= n ) g
|
||
|
#else
|
||
|
#define DEBUG(n, g) (void)0
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#ifdef O_DEBUG
|
||
|
static foreign_t
|
||
|
http_stream_debug(term_t level)
|
||
|
{ return PL_get_integer(level, &debuglevel);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/*******************************
|
||
|
* ERRORS *
|
||
|
*******************************/
|
||
|
|
||
|
static int
|
||
|
type_error(term_t actual, const char *expected)
|
||
|
{ term_t ex;
|
||
|
|
||
|
if ( (ex = PL_new_term_ref()) &&
|
||
|
PL_unify_term(ex,
|
||
|
PL_FUNCTOR, FUNCTOR_error2,
|
||
|
PL_FUNCTOR, FUNCTOR_type_error2,
|
||
|
PL_CHARS, expected,
|
||
|
PL_TERM, actual,
|
||
|
PL_VARIABLE) )
|
||
|
return PL_raise_exception(ex);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int
|
||
|
domain_error(term_t actual, const char *domain)
|
||
|
{ term_t ex;
|
||
|
|
||
|
if ( (ex = PL_new_term_ref()) &&
|
||
|
PL_unify_term(ex,
|
||
|
PL_FUNCTOR, FUNCTOR_error2,
|
||
|
PL_FUNCTOR, FUNCTOR_domain_error2,
|
||
|
PL_CHARS, domain,
|
||
|
PL_TERM, actual,
|
||
|
PL_VARIABLE) )
|
||
|
return PL_raise_exception(ex);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int
|
||
|
existence_error(term_t actual, const char *type)
|
||
|
{ term_t ex;
|
||
|
|
||
|
if ( (ex = PL_new_term_ref()) &&
|
||
|
PL_unify_term(ex,
|
||
|
PL_FUNCTOR, FUNCTOR_error2,
|
||
|
PL_FUNCTOR, FUNCTOR_existence_error2,
|
||
|
PL_CHARS, type,
|
||
|
PL_TERM, actual,
|
||
|
PL_VARIABLE) )
|
||
|
return PL_raise_exception(ex);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int
|
||
|
permission_error(const char *op, const char *objtype, term_t obj)
|
||
|
{ term_t ex;
|
||
|
|
||
|
if ( (ex = PL_new_term_ref()) &&
|
||
|
PL_unify_term(ex,
|
||
|
PL_FUNCTOR, FUNCTOR_error2,
|
||
|
PL_FUNCTOR, FUNCTOR_permission_error3,
|
||
|
PL_CHARS, op,
|
||
|
PL_CHARS, objtype,
|
||
|
PL_TERM, obj,
|
||
|
PL_VARIABLE) )
|
||
|
return PL_raise_exception(ex);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int
|
||
|
instantiation_error()
|
||
|
{ term_t ex;
|
||
|
|
||
|
if ( (ex = PL_new_term_ref()) &&
|
||
|
PL_unify_term(ex,
|
||
|
PL_FUNCTOR, FUNCTOR_error2,
|
||
|
PL_CHARS, "instantiation_error",
|
||
|
PL_VARIABLE) )
|
||
|
return PL_raise_exception(ex);
|
||
|
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int
|
||
|
get_int_ex(term_t t, int *i)
|
||
|
{ if ( PL_get_integer(t, i) )
|
||
|
return TRUE;
|
||
|
|
||
|
return type_error(t, "integer");
|
||
|
}
|
||
|
|
||
|
|
||
|
static int
|
||
|
get_bool_ex(term_t t, int *i)
|
||
|
{ if ( PL_get_bool(t, i) )
|
||
|
return TRUE;
|
||
|
|
||
|
return type_error(t, "boolean");
|
||
|
}
|
||
|
|
||
|
|
||
|
static void
|
||
|
init_errors()
|
||
|
{ FUNCTOR_error2 = MKFUNCTOR("error", 2);
|
||
|
FUNCTOR_type_error2 = MKFUNCTOR("type_error", 2);
|
||
|
FUNCTOR_domain_error2 = MKFUNCTOR("domain_error", 2);
|
||
|
FUNCTOR_existence_error2 = MKFUNCTOR("existence_error", 2);
|
||
|
FUNCTOR_permission_error3 = MKFUNCTOR("permission_error", 3);
|
||
|
|
||
|
#ifdef O_DEBUG
|
||
|
PL_register_foreign("http_stream_debug", 1, http_stream_debug, 0);
|
||
|
#endif
|
||
|
}
|