/* yap2swi.h */ /* * Project: SWI emulation for Yap Prolog * Author: Steve Moyle and Vitor Santos Costa * Email: steve.moyle@comlab.ox.ac.uk * Date: 21 January 2002 * Copyright (c) 2002 Steve Moyle and Vitor Santos Costa. All rights reserved. */ #ifndef _FLI_H_INCLUDED #define _FLI_H_INCLUDED #ifdef __cplusplus extern "C" { #endif //=== includes =============================================================== #ifdef _YAP_NOT_INSTALLED_ #include #include #else #include #include #endif #include #include #include #include #if HAVE_TIME_H #include #endif #ifndef X_API #if (defined(_MSC_VER) || defined(__MINGW32__)) && defined(PL_KERNEL) #define X_API __declspec(dllexport) #else #define X_API #endif #endif /******************************* * EXPORT * *******************************/ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - See SWI-Prolog.h, containing the same code for an explanation on this stuff. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #ifndef _PL_EXPORT_DONE #define _PL_EXPORT_DONE #if (defined(__WINDOWS__) || defined(__CYGWIN__) || defined(__MINGW32__)) && !defined(__LCC__) #define HAVE_DECLSPEC #endif #ifdef HAVE_DECLSPEC # ifdef PL_KERNEL #define PL_EXPORT(type) __declspec(dllexport) type #define PL_EXPORT_DATA(type) __declspec(dllexport) type #define install_t void # else # ifdef __BORLANDC__ #define PL_EXPORT(type) type _stdcall #define PL_EXPORT_DATA(type) extern type # else #define PL_EXPORT(type) extern type #define PL_EXPORT_DATA(type) __declspec(dllimport) type # endif #define install_t __declspec(dllexport) void # endif #else /*HAVE_DECLSPEC*/ #define PL_EXPORT(type) extern type #define PL_EXPORT_DATA(type) extern type #define install_t void #endif /*HAVE_DECLSPEC*/ #endif /*_PL_EXPORT_DONE*/ typedef unsigned long term_t; typedef void *module_t; typedef void *record_t; typedef unsigned long atom_t; typedef YAP_Term *predicate_t; typedef struct open_query_struct *qid_t; typedef long functor_t; typedef int (*PL_agc_hook_t)(atom_t); typedef unsigned long foreign_t; /* return type of foreign functions */ typedef wchar_t pl_wchar_t; /* wide character support */ #ifdef WIN32 typedef __int64 int64_t; typedef unsigned __int64 uint64_t; #else #include /* more portable than stdint.h */ #endif #if !defined(_MSC_VER) typedef uintptr_t PL_fid_t; /* opaque foreign context handle */ #endif typedef void *function_t; #define fid_t PL_fid_t /* avoid AIX name-clash */ typedef struct _PL_extension { const char *predicate_name; /* Name of the predicate */ short arity; /* Arity of the predicate */ function_t function; /* Implementing functions */ short flags; /* Or of PL_FA_... */ } PL_extension; typedef struct { unsigned long local_size; /* Stack sizes */ unsigned long global_size; unsigned long trail_size; unsigned long argument_size; char * alias; /* alias name */ int (*cancel)(int id); /* cancel function */ void * reserved[5]; /* reserved for extensions */ } PL_thread_attr_t; typedef void *PL_engine_t; #define PL_FA_NOTRACE (0x01) /* foreign cannot be traced */ #define PL_FA_TRANSPARENT (0x02) /* foreign is module transparent */ #define PL_FA_NONDETERMINISTIC (0x04) /* foreign is non-deterministic */ #define PL_FA_VARARGS (0x08) /* call using t0, ac, ctx */ #define PL_FA_CREF (0x10) /* Internal: has clause-reference */ #define PL_FA_ISO (0x20) /* Internal: ISO core predicate */ /* begin from pl-itf.h */ #define PL_VARIABLE (1) /* nothing */ #define PL_ATOM (2) /* const char * */ #define PL_INTEGER (3) /* int */ #define PL_FLOAT (4) /* double */ #define PL_STRING (5) /* const char * */ #define PL_TERM (6) /* PL_unify_term() */ #define PL_FUNCTOR (10) /* functor_t, arg ... */ #define PL_LIST (11) /* length, arg ... */ #define PL_CHARS (12) /* const char * */ #define PL_POINTER (13) /* void * */ /* PlArg::PlArg(text, type) */ #define PL_CODE_LIST (14) /* [ascii...] */ #define PL_CHAR_LIST (15) /* [h,e,l,l,o] */ #define PL_BOOL (16) /* PL_set_feature() */ #define PL_FUNCTOR_CHARS (17) /* PL_unify_term() */ #define PL_PREDICATE_INDICATOR (18) /* predicate_t (Procedure) */ #define PL_SHORT (19) /* short */ #define PL_INT (20) /* int */ #define PL_LONG (21) /* long */ #define PL_DOUBLE (22) /* double */ #define PL_NCHARS (23) /* unsigned, const char * */ #define PL_UTF8_CHARS (24) /* const char * */ #define PL_UTF8_STRING (25) /* const char * */ #define PL_INT64 (26) /* int64_t */ #define PL_NUTF8_CHARS (27) /* unsigned, const char * */ #define PL_NUTF8_CODES (29) /* unsigned, const char * */ #define PL_NUTF8_STRING (30) /* unsigned, const char * */ #define PL_NWCHARS (31) /* unsigned, const wchar_t * */ #define PL_NWCODES (32) /* unsigned, const wchar_t * */ #define PL_NWSTRING (33) /* unsigned, const wchar_t * */ #define PL_MBCHARS (34) /* const char * */ #define PL_MBCODES (35) /* const char * */ #define PL_MBSTRING (36) /* const char * */ #define PL_INTPTR (37) /* intptr_t */ #define PL_CHAR (38) /* int */ #define PL_CODE (39) /* int */ #define PL_BYTE (40) /* int */ #define CVT_ATOM 0x0001 #define CVT_STRING 0x0002 #define CVT_LIST 0x0004 #define CVT_INTEGER 0x0008 #define CVT_FLOAT 0x0010 #define CVT_VARIABLE 0x0020 #define CVT_NUMBER (CVT_INTEGER|CVT_FLOAT) #define CVT_ATOMIC (CVT_NUMBER|CVT_ATOM|CVT_STRING) #define CVT_WRITE 0x0040 /* as of version 3.2.10 */ #define CVT_ALL (CVT_ATOMIC|CVT_LIST) #define CVT_MASK 0x00ff #define CVT_EXCEPTION 0x10000 #define BUF_DISCARDABLE 0x0000 #define BUF_RING 0x0100 #define BUF_MALLOC 0x0200 #define PL_ENGINE_CURRENT ((PL_engine_t)-1) #define PL_ENGINE_SET 0 /* engine set successfully */ #define PL_ENGINE_INVAL 2 /* engine doesn't exist */ #define PL_ENGINE_INUSE 3 /* engine is in use */ #define PL_ACTION_TRACE 1 /* switch to trace mode */ #define PL_ACTION_DEBUG 2 /* switch to debug mode */ #define PL_ACTION_BACKTRACE 3 /* show a backtrace (stack dump) */ #define PL_ACTION_BREAK 4 /* create a break environment */ #define PL_ACTION_HALT 5 /* halt Prolog execution */ #define PL_ACTION_ABORT 6 /* generate a Prolog abort */ /* 7: Obsolete PL_ACTION_SYMBOLFILE */ #define PL_ACTION_WRITE 8 /* write via Prolog i/o buffer */ #define PL_ACTION_FLUSH 9 /* Flush Prolog i/o buffer */ #define PL_ACTION_GUIAPP 10 /* Win32: set when this is a gui */ #define PL_ACTION_ATTACH_CONSOLE 11 /* MT: Attach a console */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Foreign language interface definitions. Note that these macros MUST be consistent with the definitions in pl-itf.h, which is included with users foreign language code. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #define NOTRACE PL_FA_NOTRACE #define META PL_FA_TRANSPARENT #define NDET PL_FA_NONDETERMINISTIC #define VA PL_FA_VARARGS #define CREF PL_FA_CREF #define ISO PL_FA_ISO typedef enum { FRG_FIRST_CALL = 0, /* Initial call */ FRG_CUTTED = 1, /* Context was cutted */ FRG_REDO = 2 /* Normal redo */ } frg_code; struct foreign_context { uintptr_t context; /* context value */ frg_code control; /* FRG_* action */ struct PL_local_data *engine; /* invoking engine */ }; typedef struct foreign_context *control_t; #define PRED_IMPL(name, arity, fname, flags) \ foreign_t \ pl_ ## fname ## _va(term_t PL__t0, int PL__ac, control_t PL__ctx) #define Arg(N) (PL__t0+((n)-1)) #define A1 (PL__t0) #define A2 (PL__t0+1) #define A3 (PL__t0+2) #define A3 (PL__t0+2) #define A4 (PL__t0+3) #define A5 (PL__t0+4) #define A6 (PL__t0+5) #define A7 (PL__t0+6) #define A8 (PL__t0+7) #define A9 (PL__t0+8) #define A10 (PL__t0+9) #define CTX_CNTRL ForeignControl(PL__ctx) #define CTX_PTR ForeignContextPtr(PL__ctx) #define CTX_INT ForeignContextInt(PL__ctx) #define CTX_ARITY PL__ac #define BeginPredDefs(id) \ PL_extension PL_predicates_from_ ## id[] = { #define PRED_DEF(name, arity, fname, flags) \ { name, arity, pl_ ## fname ## _va, (flags)|PL_FA_VARARGS }, #define EndPredDefs \ { NULL, 0, NULL, 0 } \ }; #define FRG_REDO_MASK 0x00000003L #define FRG_REDO_BITS 2 #define REDO_INT 0x02 /* Returned an integer */ #define REDO_PTR 0x03 /* returned a pointer */ #define ForeignRedoIntVal(v) (((uintptr_t)(v)<control) #define ForeignContextInt(h) ((intptr_t)(h)->context) #define ForeignContextPtr(h) ((void *)(h)->context) #define ForeignEngine(h) ((h)->engine) #define FRG(n, a, f, flags) { n, a, f, flags } /* end from pl-itf.h */ /******************************* * CALL-BACK * *******************************/ #ifdef PL_KERNEL #define PL_Q_DEBUG 0x01 /* = TRUE for backward compatibility */ #endif #define PL_Q_NORMAL 0x02 /* normal usage */ #define PL_Q_NODEBUG 0x04 /* use this one */ #define PL_Q_CATCH_EXCEPTION 0x08 /* handle exceptions in C */ #define PL_Q_PASS_EXCEPTION 0x10 /* pass to parent environment */ #ifdef PL_KERNEL #define PL_Q_DETERMINISTIC 0x20 /* call was deterministic */ #endif #define PL_fail return FALSE /* fail */ #define PL_succeed return TRUE /* success */ extern X_API PL_agc_hook_t PL_agc_hook(PL_agc_hook_t); extern X_API char* PL_atom_chars(atom_t); extern X_API term_t PL_copy_term_ref(term_t); extern X_API term_t PL_new_term_ref(void); extern X_API term_t PL_new_term_refs(int); extern X_API void PL_reset_term_refs(term_t); /* begin PL_get_* functions =============================*/ extern X_API int PL_get_arg(int, term_t, term_t); extern X_API int PL_get_atom(term_t, atom_t *); extern X_API int PL_get_atom_chars(term_t, char **); extern X_API int PL_get_bool(term_t, int *); extern X_API int PL_get_chars(term_t, char **, unsigned); extern X_API int PL_get_nchars(term_t, size_t *, char **, unsigned); extern X_API int PL_get_wchars(term_t, size_t *, wchar_t **, unsigned); extern X_API int PL_get_functor(term_t, functor_t *); extern X_API int PL_get_float(term_t, double *); extern X_API int PL_get_head(term_t, term_t); extern X_API int PL_get_int64(term_t, int64_t *); extern X_API int PL_get_integer(term_t, int *); extern X_API int PL_get_list(term_t, term_t, term_t); extern X_API int PL_get_long(term_t, long *); extern X_API int PL_get_list_chars(term_t, char **, unsigned); extern X_API int PL_get_module(term_t, module_t *); extern X_API module_t PL_context(void); extern X_API int PL_strip_module(term_t, module_t *, term_t); extern X_API atom_t PL_module_name(module_t); extern X_API module_t PL_new_module(atom_t); extern X_API int PL_get_name_arity(term_t, atom_t *, int *); extern X_API int PL_get_nil(term_t); extern X_API int PL_get_pointer(term_t, void **); extern X_API int PL_get_string(term_t, char **, int *); extern X_API int PL_get_tail(term_t, term_t); /* end PL_get_* functions =============================*/ /* begin PL_new_* functions =============================*/ extern X_API atom_t PL_new_atom(const char *); extern X_API atom_t PL_new_atom_wchars(int, const pl_wchar_t *); extern X_API char *PL_atom_nchars(atom_t, size_t *); extern X_API pl_wchar_t *PL_atom_wchars(atom_t, size_t *); extern X_API functor_t PL_new_functor(atom_t, int); extern X_API atom_t PL_functor_name(functor_t); extern X_API int PL_functor_arity(functor_t); /* end PL_new_* functions =============================*/ /* begin PL_put_* functions =============================*/ extern X_API int PL_cons_functor(term_t, functor_t,...); extern X_API int PL_cons_functor_v(term_t, functor_t,term_t); extern X_API int PL_cons_list(term_t, term_t, term_t); extern X_API int PL_put_atom(term_t, atom_t); extern X_API int PL_put_atom_chars(term_t, const char *); extern X_API int PL_put_float(term_t, double); extern X_API int PL_put_functor(term_t, functor_t t); extern X_API int PL_put_int64(term_t, int64_t); extern X_API int PL_put_integer(term_t, long); extern X_API int PL_put_list(term_t); extern X_API int PL_put_list_chars(term_t, const char *); extern X_API void PL_put_nil(term_t); extern X_API int PL_put_pointer(term_t, void *); extern X_API int PL_put_string_chars(term_t, const char *); extern X_API int PL_put_term(term_t, term_t); extern X_API int PL_put_variable(term_t); extern X_API int PL_compare(term_t, term_t); /* end PL_put_* functions =============================*/ /* begin PL_unify_* functions =============================*/ extern X_API int PL_unify(term_t, term_t); extern X_API int PL_unify_atom(term_t, atom_t); extern X_API int PL_unify_atom_chars(term_t, const char *); extern X_API int PL_unify_atom_nchars(term_t, size_t len, const char *); extern X_API int PL_unify_float(term_t, double); extern X_API int PL_unify_functor(term_t, functor_t); extern X_API int PL_unify_int64(term_t, int64_t); extern X_API int PL_unify_integer(term_t, long); extern X_API int PL_unify_list(term_t, term_t, term_t); extern X_API int PL_unify_list_chars(term_t, const char *); extern X_API int PL_unify_nil(term_t); extern X_API int PL_unify_pointer(term_t, void *); extern X_API int PL_unify_string_chars(term_t, const char *); extern X_API int PL_unify_term(term_t,...); extern X_API int PL_unify_chars(term_t, int, size_t, const char *); extern X_API int PL_unify_chars_diff(term_t, term_t, int, size_t, const char *); extern X_API int PL_unify_wchars(term_t, int, size_t, const pl_wchar_t *); extern X_API int PL_unify_wchars_diff(term_t, term_t, int, size_t, const pl_wchar_t *); extern X_API int PL_chars_to_term(term_t,const char *); /* begin PL_is_* functions =============================*/ extern X_API int PL_is_atom(term_t); extern X_API int PL_is_atomic(term_t); extern X_API int PL_is_compound(term_t); extern X_API int PL_is_float(term_t); extern X_API int PL_is_functor(term_t, functor_t); extern X_API int PL_is_integer(term_t); extern X_API int PL_is_list(term_t); extern X_API int PL_is_number(term_t); extern X_API int PL_is_string(term_t); extern X_API int PL_is_variable(term_t); extern X_API int PL_term_type(term_t); extern X_API int PL_is_inf(term_t); /* end PL_is_* functions =============================*/ extern X_API void PL_halt(int); extern X_API int PL_initialise(int, char **); extern X_API int PL_is_initialised(int *, char ***); extern X_API void PL_close_foreign_frame(fid_t); extern X_API void PL_discard_foreign_frame(fid_t); extern X_API void PL_rewind_foreign_frame(fid_t); extern X_API fid_t PL_open_foreign_frame(void); extern X_API int PL_raise_exception(term_t); extern X_API void PL_register_atom(atom_t); extern X_API void PL_unregister_atom(atom_t); extern X_API predicate_t PL_pred(functor_t, module_t); extern X_API predicate_t PL_predicate(const char *, int, const char *); extern X_API void PL_predicate_info(predicate_t, atom_t *, int *, module_t *); extern X_API qid_t PL_open_query(module_t, int, predicate_t, term_t); extern X_API int PL_next_solution(qid_t); extern X_API void PL_cut_query(qid_t); extern X_API void PL_close_query(qid_t); extern X_API int PL_toplevel(void); extern X_API term_t PL_exception(qid_t); extern X_API int PL_call_predicate(module_t, int, predicate_t, term_t); extern X_API int PL_call(term_t, module_t); extern X_API void PL_register_foreign_in_module(const char *, const char *, int, foreign_t (*)(void), int); extern X_API void PL_register_extensions(const PL_extension *); extern X_API void PL_load_extensions(const PL_extension *); extern X_API int PL_handle_signals(void); extern X_API int PL_thread_self(void); extern X_API int PL_thread_attach_engine(const PL_thread_attr_t *); extern X_API int PL_thread_destroy_engine(void); extern X_API int PL_thread_at_exit(void (*)(void *), void *, int); extern X_API PL_engine_t PL_create_engine(const PL_thread_attr_t *); extern X_API int PL_destroy_engine(PL_engine_t); extern X_API int PL_set_engine(PL_engine_t,PL_engine_t *); extern X_API int PL_get_string_chars(term_t, char **, int *); extern X_API record_t PL_record(term_t); extern X_API void PL_recorded(record_t, term_t); extern X_API void PL_erase(record_t); extern X_API int PL_action(int,...); extern X_API void *PL_malloc(int); extern X_API void *PL_realloc(void*,int); extern X_API void PL_free(void *); extern X_API int PL_eval_expression_to_int64_ex(term_t t, int64_t *val); #define PL_register_foreign(name, arity, function, flags) PL_register_foreign_in_module(NULL, (name), (arity), (function), (flags)) extern X_API int Sprintf(const char * fm,...); extern X_API int Sdprintf(const char *,...); /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Output representation for PL_get_chars() and friends. The prepresentation type REP_FN is for PL_get_file_name() and friends. On Windows we use UTF-8 which is translated by the `XOS' layer to Windows UNICODE file functions. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #define REP_ISO_LATIN_1 0x0000 /* output representation */ #define REP_UTF8 0x1000 #define REP_MB 0x2000 #ifdef __WINDOWS__ #define REP_FN REP_UTF8 #else #define REP_FN REP_MB #endif #define PL_DIFF_LIST 0x20000 /* PL_unify_chars() */ #ifdef SIO_MAGIC /* defined from */ /* Make IOSTREAM known to Prolog */ PL_EXPORT(int) PL_open_stream(term_t t, IOSTREAM *s); PL_EXPORT(int) PL_unify_stream(term_t t, IOSTREAM *s); #define PL_open_stream PL_unify_stream PL_EXPORT(int) PL_get_stream_handle(term_t t, IOSTREAM **s); PL_EXPORT(int) PL_release_stream(IOSTREAM *s); #endif #define succeed return TRUE #define fail return FALSE extern X_API const char *PL_cwd(void); void swi_install(void); X_API int PL_error(const char *pred, int arity, const char *msg, int id, ...); X_API int PL_warning(const char *msg, ...); /******************************** * NON-DETERMINISTIC CALL/RETURN * *********************************/ /* Note 1: Non-deterministic foreign functions may also use the deterministic return methods PL_succeed and PL_fail. Note 2: The argument to PL_retry is a sizeof(ptr)-2 bits signed integer (use type intptr_t). */ #define PL_FIRST_CALL (0) #define PL_CUTTED (1) #define PL_REDO (2) #define PL_retry(n) return _PL_retry(n) #define PL_retry_address(a) return _PL_retry_address(a) PL_EXPORT(foreign_t) _PL_retry(intptr_t); PL_EXPORT(foreign_t) _PL_retry_address(void *); PL_EXPORT(int) PL_foreign_control(control_t); PL_EXPORT(intptr_t) PL_foreign_context(control_t); PL_EXPORT(void *) PL_foreign_context_address(control_t); #ifdef __cplusplus } #endif #endif /* _FLI_H_INCLUDED */