diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md index 2e27f53..f4e5f18 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,21 @@ node-swipl +========== -### A node.js interface to the SWI-Prolog library +A node.js interface to the SWI-Prolog library. A fork of [node-prolog-swi](https://github.com/kloni/node-prolog-swi). For now, this addon supports the creation of rules and facts 'on the fly' and querying. -The SWI-Prolog library requires the SWI_HOME_DIR environment variable to be set (See +The SWI-Prolog library requires the `SWI_HOME_DIR` environment variable to be set (See http://www.swi-prolog.org/FAQ/FindResources.html). Thus an example call could be: -SWI_HOME_DIR=/usr/lib/swi-prolog node tests/a.js + SWI_HOME_DIR=/usr/lib/swi-prolog node tests/a.js -Missing SWI_HOME_DIR will result in +Missing `SWI_HOME_DIR` will result in [FATAL ERROR: Could not find system resources] -Now builds with node-gyp (Thanks to Johny Jose): +Now builds with node-gyp (Thanks to Johny Jose): $ node-gyp configure $ SWI_HOME_DIR=/usr/lib/swi-prolog node-gyp build @@ -38,32 +39,36 @@ Create module var m = swipl.module("mymod"); -Facts and rules (shortcut for m.call_predicate("assert", [ term ]) ) +Facts and rules (shortcut for `m.call_predicate("assert", [ term ])`) m.assert("likes(romeo, julia)."); {} Querying - Single solution - m.call_predicate("likes", ["romeo", "X"]); - { X: 'julia' } + m.call_predicate("likes", ["romeo", "X"]); + { X: 'julia' } Querying - Query - m.assert("likes(john, julia)."); - {} - var q = m.open_query("likes", ["X", "julia"]); - undefined - q.next_solution(); - { X: 'romeo' } - q.next_solution(); - { X: 'john' } - q.next_solution(); - false - q.close(); - true + m.assert("likes(john, julia)."); + {} + var q = m.open_query("likes", ["X", "julia"]); + undefined + q.next_solution(); + { X: 'romeo' } + q.next_solution(); + { X: 'john' } + q.next_solution(); + false + q.close(); + true Cleanup swipl.cleanup(); +License +------- + +Licensed under LGPL a copy is available on [the LICENSE.txt file](LICENSE.txt). diff --git a/binding.gyp b/binding.gyp index 6b801b1..1860877 100644 --- a/binding.gyp +++ b/binding.gyp @@ -8,7 +8,7 @@ ], "include_dirs": [ "./src", - "$(SWI_HOME_DIR)" + "$(SWI_HOME_DIR)/include" ], "direct_dependent_settings": { "linkflags": [ diff --git a/package.json b/package.json index 2c28f62..2ee5499 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,13 @@ { - "name": "node-prolog-swi", - "version": "0.1.0", - "main": "swipl", + "name": "node-swipl", + "version": "0.2.0", + "main": "swipl.js", "description": "A node.js interface to the SWI-Prolog library", "keywords": [ - "c++", "swi", - "prolog" + "prolog", + "swipl", + "logic" ], "author": { "name": "Tom Klonikowski", @@ -15,18 +16,18 @@ "license": "LGPL", "repository": { "type": "git", - "url": "git@github.com:kloni/node-prolog-swi.git" + "url": "git@github.com:jansegre/node-swipl.git" }, "directories": { "src": "src", "tests": "tests" }, "engines": { - "node": ">=0.6.0", + "node": ">=0.10.0", "libswipl": ">=5.10.0" }, "scripts": { - "install": "node-waf configure build", + "install": "node-gyp configure build", "test": "node tests/a.js" } } diff --git a/src/SWI-Prolog.h b/src/SWI-Prolog.h deleted file mode 100644 index 75eeca9..0000000 --- a/src/SWI-Prolog.h +++ /dev/null @@ -1,1051 +0,0 @@ -/* $Id$ - - Part of SWI-Prolog - - Author: Jan Wielemaker - E-mail: J.Wielemak@cs.vu.nl - WWW: http://www.swi-prolog.org - Copyright (C): 1985-2010, 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 -*/ - -#ifndef _FLI_H_INCLUDED -#define _FLI_H_INCLUDED - -#ifndef __SWI_PROLOG__ /* use this to switch on Prolog dialect */ -#define __SWI_PROLOG__ /* normally defined by the swipl-ld compiler driver */ -#endif - -#if defined(_MSC_VER) && !defined(__WINDOWS__) -#define __WINDOWS__ 1 -#endif - -#include -#include /* get size_t */ -#include -#ifdef __WINDOWS__ -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -#if (_MSC_VER < 1300) -typedef long intptr_t; -typedef unsigned long uintptr_t; -#endif -#else -#include /* more portable than stdint.h */ -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* PLVERSION: 10000 * + 100 * + */ - -#ifndef PLVERSION -#define PLVERSION 51004 -#endif - - /******************************* - * EXPORT * - *******************************/ - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Traditional and ELF-based Unix systems don't need all this, but COFF -based systems need to import and export symbols explicitely from -executables and shared objects (DLL). On some systems (e.g. AIX) this is -achieved using import/export files, on Windows this is achieved using -special declarations on exported symbols. So, a symbol is local -(static), shared between the objects building an executable or DLL (no -special declaration) or exported from the executable or DLL. - -Both using native Microsoft MSVC as well as recent Cygwin (tested 1.1) -compilers support __declspec(...) for exporting symbols. - -As SWI-Prolog.h can be included seperately or together with this file we -duplicated this stuff. -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - -#ifndef _PL_EXPORT_DONE -#define _PL_EXPORT_DONE - -#if (defined(_MSC_VER) || defined(__CYGWIN__)) && !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*/ - - - /******************************* - * GCC ATTRIBUTES * - *******************************/ - -#if __GNUC__ >= 4 -#define WUNUSED __attribute__((warn_unused_result)) -#else -#define WUNUSED -#endif - - - /******************************* - * TYPES * - *******************************/ - -#ifdef _PL_INCLUDE_H -typedef Module module_t; /* a module */ -typedef Procedure predicate_t; /* a predicate handle */ -typedef Record record_t; /* handle to a recorded term */ -typedef struct PL_local_data *PL_engine_t; /* handle to a engine */ -#else -typedef uintptr_t atom_t; /* Prolog atom */ -typedef uintptr_t functor_t; /* Name/arity pair */ -typedef void * module_t; /* Prolog module */ -typedef void * predicate_t; /* Prolog procedure */ -typedef void * record_t; /* Prolog recorded term */ -typedef uintptr_t term_t; /* opaque term handle */ -typedef uintptr_t qid_t; /* opaque query handle */ -typedef uintptr_t PL_fid_t; /* opaque foreign context handle */ -typedef void * control_t; /* non-deterministic control arg */ -typedef void * PL_engine_t; /* opaque engine handle */ -#endif -typedef uintptr_t PL_atomic_t; /* same a word */ -typedef uintptr_t foreign_t; /* return type of foreign functions */ -typedef wchar_t pl_wchar_t; /* Prolog wide character */ -#ifdef __cplusplus -typedef void * pl_function_t; /* can only pass function as void * */ -#else -typedef foreign_t (*pl_function_t)(); /* foreign language functions */ -#endif - -#ifndef NORETURN -#define NORETURN -#endif - -#define fid_t PL_fid_t /* avoid AIX name-clash */ - - /* values for PL_get_term_value() */ -typedef union -{ int64_t i; /* PL_INTEGER */ - double f; /* PL_FLOAT */ - char * s; /* PL_STRING */ - atom_t a; /* PL_ATOM */ - struct /* PL_TERM */ - { atom_t name; - int arity; - } t; -} term_value_t; - -#ifndef TRUE -#define TRUE (1) -#define FALSE (0) -#endif - - /******************************* - * TERM-TYPE CONSTANTS * - *******************************/ - /* PL_unify_term() arguments */ -#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_prolog_flag() */ -#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) /* size_t, 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) /* size_t, const char * */ -#define PL_NUTF8_CODES (29) /* size_t, const char * */ -#define PL_NUTF8_STRING (30) /* size_t, const char * */ -#define PL_NWCHARS (31) /* size_t, const wchar_t * */ -#define PL_NWCODES (32) /* size_t, const wchar_t * */ -#define PL_NWSTRING (33) /* size_t, 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 */ - /* PL_skip_list() */ -#define PL_PARTIAL_LIST (41) /* a partial list */ -#define PL_CYCLIC_TERM (42) /* a cyclic list/term */ -#define PL_NOT_A_LIST (43) /* Object is not a list */ - -/* Or'ed flags for PL_set_prolog_flag() */ -/* MUST fit in a short int! */ -#define FF_READONLY 0x1000 /* Read-only prolog flag */ -#define FF_KEEP 0x2000 /* keep prolog flag if already set */ -#define FF_NOCREATE 0x4000 /* Fail if flag is non-existent */ -#define FF_MASK 0xf000 - - - /******************************** - * DETERMINISTIC CALL/RETURN * - *********************************/ - -#define PL_succeed return TRUE /* succeed deterministically */ -#define PL_fail return FALSE /* fail */ - - - /******************************** - * 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) /* deprecated */ -#define PL_PRUNED (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); - - - /******************************** - * REGISTERING FOREIGNS * - *********************************/ - -typedef struct PL_extension -{ const char *predicate_name; /* Name of the predicate */ - short arity; /* Arity of the predicate */ - pl_function_t function; /* Implementing functions */ - short flags; /* Or of PL_FA_... */ -} PL_extension; - -#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 */ - -extern PL_extension PL_extensions[]; /* not Win32! */ -PL_EXPORT(void) PL_register_extensions(const PL_extension *e); -PL_EXPORT(void) PL_register_extensions_in_module(const char *module, const PL_extension *e); -PL_EXPORT(int) PL_register_foreign(const char *name, int arity, - pl_function_t func, int flags); -PL_EXPORT(int) PL_register_foreign_in_module(const char *module, - const char *name, int arity, - pl_function_t func, int flags); -PL_EXPORT(void) PL_load_extensions(const PL_extension *e); - - - /******************************* - * LICENSE * - *******************************/ - -void PL_license(const char *license, const char *module); - - /******************************** - * MODULES * - *********************************/ - -PL_EXPORT(module_t) PL_context(void); -PL_EXPORT(atom_t) PL_module_name(module_t module); -PL_EXPORT(module_t) PL_new_module(atom_t name); -PL_EXPORT(int) PL_strip_module(term_t in, module_t *m, term_t out); - - - /******************************* - * 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 - - /* Foreign context frames */ -PL_EXPORT(fid_t) PL_open_foreign_frame(void); -PL_EXPORT(void) PL_rewind_foreign_frame(fid_t cid); -PL_EXPORT(void) PL_close_foreign_frame(fid_t cid); -PL_EXPORT(void) PL_discard_foreign_frame(fid_t cid); - - /* Finding predicates */ -PL_EXPORT(predicate_t) PL_pred(functor_t f, module_t m); -PL_EXPORT(predicate_t) PL_predicate(const char *name, int arity, - const char* module); -PL_EXPORT(int) PL_predicate_info(predicate_t pred, - atom_t *name, int *arity, - module_t *module); - - /* Call-back */ -PL_EXPORT(qid_t) PL_open_query(module_t m, int flags, - predicate_t pred, term_t t0); -PL_EXPORT(int) PL_next_solution(qid_t qid) WUNUSED; -PL_EXPORT(void) PL_close_query(qid_t qid); -PL_EXPORT(void) PL_cut_query(qid_t qid); - - /* Simplified (but less flexible) call-back */ -PL_EXPORT(int) PL_call(term_t t, module_t m); -PL_EXPORT(int) PL_call_predicate(module_t m, int debug, - predicate_t pred, term_t t0); - /* Handling exceptions */ -PL_EXPORT(term_t) PL_exception(qid_t qid); -PL_EXPORT(int) PL_raise_exception(term_t exception); -PL_EXPORT(int) PL_throw(term_t exception); -PL_EXPORT(void) PL_clear_exception(void); - - - /******************************* - * TERM-REFERENCES * - *******************************/ - - /* Creating and destroying term-refs */ -PL_EXPORT(term_t) PL_new_term_refs(int n); -PL_EXPORT(term_t) PL_new_term_ref(void); -PL_EXPORT(term_t) PL_copy_term_ref(term_t from); -PL_EXPORT(void) PL_reset_term_refs(term_t r); - - /* Constants */ -PL_EXPORT(atom_t) PL_new_atom(const char *s); -PL_EXPORT(atom_t) PL_new_atom_nchars(size_t len, const char *s); -PL_EXPORT(atom_t) PL_new_atom_wchars(size_t len, const wchar_t *s); -PL_EXPORT(const char *) PL_atom_chars(atom_t a); -PL_EXPORT(const char *) PL_atom_nchars(atom_t a, size_t *len); -PL_EXPORT(const wchar_t *) PL_atom_wchars(atom_t a, size_t *len); -#ifndef O_DEBUG_ATOMGC -PL_EXPORT(void) PL_register_atom(atom_t a); -PL_EXPORT(void) PL_unregister_atom(atom_t a); -#endif -PL_EXPORT(functor_t) PL_new_functor(atom_t f, int a); -PL_EXPORT(atom_t) PL_functor_name(functor_t f); -PL_EXPORT(int) PL_functor_arity(functor_t f); - - /* Get C-values from Prolog terms */ -PL_EXPORT(int) PL_get_atom(term_t t, atom_t *a) WUNUSED; -PL_EXPORT(int) PL_get_bool(term_t t, int *value) WUNUSED; -PL_EXPORT(int) PL_get_atom_chars(term_t t, char **a) WUNUSED; -#define PL_get_string_chars(t, s, l) PL_get_string(t,s,l) - /* PL_get_string() is deprecated */ -PL_EXPORT(int) PL_get_string(term_t t, char **s, size_t *len); WUNUSED -PL_EXPORT(int) PL_get_chars(term_t t, char **s, unsigned int flags) WUNUSED; -PL_EXPORT(int) PL_get_list_chars(term_t l, char **s, - unsigned int flags) WUNUSED; -PL_EXPORT(int) PL_get_atom_nchars(term_t t, size_t *len, char **a) WUNUSED; -PL_EXPORT(int) PL_get_list_nchars(term_t l, - size_t *len, char **s, - unsigned int flags) WUNUSED; -PL_EXPORT(int) PL_get_nchars(term_t t, - size_t *len, char **s, - unsigned int flags) WUNUSED; -PL_EXPORT(int) PL_get_integer(term_t t, int *i) WUNUSED; -PL_EXPORT(int) PL_get_long(term_t t, long *i) WUNUSED; -PL_EXPORT(int) PL_get_intptr(term_t t, intptr_t *i) WUNUSED; -PL_EXPORT(int) PL_get_pointer(term_t t, void **ptr) WUNUSED; -PL_EXPORT(int) PL_get_float(term_t t, double *f) WUNUSED; -PL_EXPORT(int) PL_get_functor(term_t t, functor_t *f) WUNUSED; -PL_EXPORT(int) PL_get_name_arity(term_t t, atom_t *name, int *arity) WUNUSED; -PL_EXPORT(int) PL_get_module(term_t t, module_t *module) WUNUSED; -PL_EXPORT(int) PL_get_arg(int index, term_t t, term_t a) WUNUSED; -PL_EXPORT(int) PL_get_list(term_t l, term_t h, term_t t) WUNUSED; -PL_EXPORT(int) PL_get_head(term_t l, term_t h) WUNUSED; -PL_EXPORT(int) PL_get_tail(term_t l, term_t t) WUNUSED; -PL_EXPORT(int) PL_get_nil(term_t l) WUNUSED; -PL_EXPORT(int) PL_get_term_value(term_t t, term_value_t *v) WUNUSED; -PL_EXPORT(char *) PL_quote(int chr, const char *data); - - /* Verify types */ -PL_EXPORT(int) PL_term_type(term_t t); -PL_EXPORT(int) PL_is_variable(term_t t); -PL_EXPORT(int) PL_is_ground(term_t t); -PL_EXPORT(int) PL_is_atom(term_t t); -PL_EXPORT(int) PL_is_integer(term_t t); -PL_EXPORT(int) PL_is_string(term_t t); -PL_EXPORT(int) PL_is_float(term_t t); -PL_EXPORT(int) PL_is_rational(term_t t); -PL_EXPORT(int) PL_is_compound(term_t t); -PL_EXPORT(int) PL_is_callable(term_t t); -PL_EXPORT(int) PL_is_functor(term_t t, functor_t f); -PL_EXPORT(int) PL_is_list(term_t t); -PL_EXPORT(int) PL_is_pair(term_t t); -PL_EXPORT(int) PL_is_atomic(term_t t); -PL_EXPORT(int) PL_is_number(term_t t); -PL_EXPORT(int) PL_is_acyclic(term_t t); - - /* Assign to term-references */ -PL_EXPORT(int) PL_put_variable(term_t t); -PL_EXPORT(int) PL_put_atom(term_t t, atom_t a); -PL_EXPORT(int) PL_put_atom_chars(term_t t, const char *chars); -PL_EXPORT(int) PL_put_string_chars(term_t t, const char *chars) WUNUSED; -PL_EXPORT(int) PL_put_list_chars(term_t t, const char *chars) WUNUSED; -PL_EXPORT(int) PL_put_list_codes(term_t t, const char *chars) WUNUSED; -PL_EXPORT(int) PL_put_atom_nchars(term_t t, size_t l, const char *chars); -PL_EXPORT(int) PL_put_string_nchars(term_t t, size_t len, const char *chars) WUNUSED; -PL_EXPORT(int) PL_put_list_nchars(term_t t, size_t l, const char *chars) WUNUSED; -PL_EXPORT(int) PL_put_list_ncodes(term_t t, size_t l, const char *chars) WUNUSED; -PL_EXPORT(int) PL_put_integer(term_t t, long i) WUNUSED; -PL_EXPORT(int) PL_put_pointer(term_t t, void *ptr) WUNUSED; -PL_EXPORT(int) PL_put_float(term_t t, double f) WUNUSED; -PL_EXPORT(int) PL_put_functor(term_t t, functor_t functor) WUNUSED; -PL_EXPORT(int) PL_put_list(term_t l) WUNUSED; -PL_EXPORT(void) PL_put_nil(term_t l); -PL_EXPORT(int) PL_put_term(term_t t1, term_t t2); - - /* construct a functor or list-cell */ -PL_EXPORT(int) PL_cons_functor(term_t h, functor_t f, ...) WUNUSED; -PL_EXPORT(int) PL_cons_functor_v(term_t h, functor_t fd, term_t a0) WUNUSED; -PL_EXPORT(int) PL_cons_list(term_t l, term_t h, term_t t) WUNUSED; - - /* Unify term-references */ -PL_EXPORT(int) PL_unify(term_t t1, term_t t2) WUNUSED; -PL_EXPORT(int) PL_unify_atom(term_t t, atom_t a) WUNUSED; -PL_EXPORT(int) PL_unify_atom_chars(term_t t, const char *chars) WUNUSED; -PL_EXPORT(int) PL_unify_list_chars(term_t t, const char *chars) WUNUSED; -PL_EXPORT(int) PL_unify_list_codes(term_t t, const char *chars) WUNUSED; -PL_EXPORT(int) PL_unify_string_chars(term_t t, const char *chars) WUNUSED; -PL_EXPORT(int) PL_unify_atom_nchars(term_t t, size_t l, const char *s) WUNUSED; -PL_EXPORT(int) PL_unify_list_ncodes(term_t t, size_t l, const char *s) WUNUSED; -PL_EXPORT(int) PL_unify_list_nchars(term_t t, size_t l, const char *s) WUNUSED; -PL_EXPORT(int) PL_unify_string_nchars(term_t t, - size_t len, - const char *chars) WUNUSED; -PL_EXPORT(int) PL_unify_bool(term_t t, int n) WUNUSED; -PL_EXPORT(int) PL_unify_integer(term_t t, intptr_t n) WUNUSED; -PL_EXPORT(int) PL_unify_float(term_t t, double f) WUNUSED; -PL_EXPORT(int) PL_unify_pointer(term_t t, void *ptr) WUNUSED; -PL_EXPORT(int) PL_unify_functor(term_t t, functor_t f) WUNUSED; -PL_EXPORT(int) PL_unify_list(term_t l, term_t h, term_t t) WUNUSED; -PL_EXPORT(int) PL_unify_nil(term_t l) WUNUSED; -PL_EXPORT(int) PL_unify_arg(int index, term_t t, term_t a) WUNUSED; -PL_EXPORT(int) PL_unify_term(term_t t, ...) WUNUSED; -PL_EXPORT(int) PL_unify_chars(term_t t, int flags, - size_t len, const char *s) WUNUSED; - - /******************************* - * LISTS * - *******************************/ - -PL_EXPORT(int) PL_skip_list(term_t list, term_t tail, size_t *len); - - - /******************************* - * WIDE CHARACTER VERSIONS * - *******************************/ - -PL_EXPORT(int) PL_unify_wchars(term_t t, int type, - size_t len, const pl_wchar_t *s) WUNUSED; -PL_EXPORT(int) PL_unify_wchars_diff(term_t t, term_t tail, int type, - size_t len, const pl_wchar_t *s) WUNUSED; -PL_EXPORT(int) PL_get_wchars(term_t l, - size_t *length, pl_wchar_t **s, - unsigned flags) WUNUSED; -PL_EXPORT(size_t) PL_utf8_strlen(const char *s, size_t len) WUNUSED; - - - /******************************* - * WIDE INTEGERS * - *******************************/ - - -PL_EXPORT(int) PL_get_int64(term_t t, int64_t *i) WUNUSED; -PL_EXPORT(int) PL_unify_int64(term_t t, int64_t value) WUNUSED; -PL_EXPORT(int) PL_put_int64(term_t t, int64_t i) WUNUSED; - - - /******************************* - * ATTRIBUTED VARIABLES * - *******************************/ - -PL_EXPORT(int) PL_is_attvar(term_t t); -PL_EXPORT(int) PL_get_attr(term_t v, term_t a); - - - /******************************* - * ERRORS * - *******************************/ - -PL_EXPORT(int) PL_get_atom_ex(term_t t, atom_t *a); -PL_EXPORT(int) PL_get_integer_ex(term_t t, int *i); -PL_EXPORT(int) PL_get_long_ex(term_t t, long *i); -PL_EXPORT(int) PL_get_int64_ex(term_t t, int64_t *i); -PL_EXPORT(int) PL_get_intptr_ex(term_t t, intptr_t *i); -PL_EXPORT(int) PL_get_size_ex(term_t t, size_t *i); -PL_EXPORT(int) PL_get_bool_ex(term_t t, int *i); -PL_EXPORT(int) PL_get_float_ex(term_t t, double *f); -PL_EXPORT(int) PL_get_char_ex(term_t t, int *p, int eof); -PL_EXPORT(int) PL_unify_bool_ex(term_t t, int val); -PL_EXPORT(int) PL_get_pointer_ex(term_t t, void **addrp); -PL_EXPORT(int) PL_unify_list_ex(term_t l, term_t h, term_t t); -PL_EXPORT(int) PL_unify_nil_ex(term_t l); -PL_EXPORT(int) PL_get_list_ex(term_t l, term_t h, term_t t); -PL_EXPORT(int) PL_get_nil_ex(term_t l); - -PL_EXPORT(int) PL_instantiation_error(term_t culprit); -PL_EXPORT(int) PL_representation_error(const char *resource); -PL_EXPORT(int) PL_type_error(const char *expected, term_t culprit); -PL_EXPORT(int) PL_domain_error(const char *expected, term_t culprit); -PL_EXPORT(int) PL_existence_error(const char *type, term_t culprit); -PL_EXPORT(int) PL_permission_error(const char *operation, - const char *type, term_t culprit); - - /******************************* - * BLOBS * - *******************************/ - -#define PL_BLOB_MAGIC_B 0x75293a00 /* Magic to validate a blob-type */ -#define PL_BLOB_VERSION 1 /* Current version */ -#define PL_BLOB_MAGIC (PL_BLOB_MAGIC_B|PL_BLOB_VERSION) - -#define PL_BLOB_UNIQUE 0x01 /* Blob content is unique */ -#define PL_BLOB_TEXT 0x02 /* blob contains text */ -#define PL_BLOB_NOCOPY 0x04 /* do not copy the data */ -#define PL_BLOB_WCHAR 0x08 /* wide character string */ - -typedef struct PL_blob_t -{ uintptr_t magic; /* PL_BLOB_MAGIC */ - uintptr_t flags; /* PL_BLOB_* */ - char * name; /* name of the type */ - int (*release)(atom_t a); - int (*compare)(atom_t a, atom_t b); -#ifdef SIO_MAGIC - int (*write)(IOSTREAM *s, atom_t a, int flags); -#else - int (*write)(void *s, atom_t a, int flags); -#endif - void (*acquire)(atom_t a); -#ifdef SIO_MAGIC - int (*save)(atom_t a, IOSTREAM *s); - atom_t (*load)(IOSTREAM *s); -#else - int (*save)(atom_t a, void*); - atom_t (*load)(void *s); -#endif - /* private */ - void * reserved[10]; /* for future extension */ - int registered; /* Already registered? */ - int rank; /* Rank for ordering atoms */ - struct PL_blob_t * next; /* next in registered type-chain */ - atom_t atom_name; /* Name as atom */ -} PL_blob_t; - -PL_EXPORT(int) PL_is_blob(term_t t, PL_blob_t **type); -PL_EXPORT(int) PL_unify_blob(term_t t, void *blob, size_t len, - PL_blob_t *type); -PL_EXPORT(int) PL_put_blob(term_t t, void *blob, size_t len, - PL_blob_t *type); -PL_EXPORT(int) PL_get_blob(term_t t, void **blob, size_t *len, - PL_blob_t **type); - -PL_EXPORT(void*) PL_blob_data(atom_t a, - size_t *len, - struct PL_blob_t **type); - -PL_EXPORT(void) PL_register_blob_type(PL_blob_t *type); -PL_EXPORT(PL_blob_t*) PL_find_blob_type(const char* name); -PL_EXPORT(int) PL_unregister_blob_type(PL_blob_t *type); - - -#ifdef __GNU_MP__ - - /******************************* - * GMP * - *******************************/ - -PL_EXPORT(int) PL_get_mpz(term_t t, mpz_t mpz) WUNUSED; -PL_EXPORT(int) PL_get_mpq(term_t t, mpq_t mpq) WUNUSED; -PL_EXPORT(int) PL_unify_mpz(term_t t, mpz_t mpz) WUNUSED; -PL_EXPORT(int) PL_unify_mpq(term_t t, mpq_t mpq) WUNUSED; - -#endif /*__GNU_MP__*/ - - /******************************* - * FILENAME SUPPORT * - *******************************/ - -#define PL_FILE_ABSOLUTE 0x01 /* return absolute path */ -#define PL_FILE_OSPATH 0x02 /* return path in OS notation */ -#define PL_FILE_SEARCH 0x04 /* use file_search_path */ -#define PL_FILE_EXIST 0x08 /* demand file to exist */ -#define PL_FILE_READ 0x10 /* demand read-access */ -#define PL_FILE_WRITE 0x20 /* demand write-access */ -#define PL_FILE_EXECUTE 0x40 /* demand execute-access */ -#define PL_FILE_NOERRORS 0x80 /* do not raise exceptions */ - -PL_EXPORT(int) PL_get_file_name(term_t n, char **name, int flags); -PL_EXPORT(int) PL_get_file_nameW(term_t n, wchar_t **name, int flags); -PL_EXPORT(void) PL_changed_cwd(void); /* foreign code changed CWD */ -PL_EXPORT(const char *) PL_cwd(void); - - - /******************************* - * QUINTUS/SICSTUS WRAPPER * - *******************************/ - -PL_EXPORT(int) PL_cvt_i_int(term_t p, int *c); -PL_EXPORT(int) PL_cvt_i_long(term_t p, long *c); -PL_EXPORT(int) PL_cvt_i_size_t(term_t p, size_t *c); -PL_EXPORT(int) PL_cvt_i_float(term_t p, double *c); -PL_EXPORT(int) PL_cvt_i_single(term_t p, float *c); -PL_EXPORT(int) PL_cvt_i_string(term_t p, char **c); -PL_EXPORT(int) PL_cvt_i_codes(term_t p, char **c); -PL_EXPORT(int) PL_cvt_i_atom(term_t p, atom_t *c); -PL_EXPORT(int) PL_cvt_i_address(term_t p, void *c); -PL_EXPORT(int) PL_cvt_o_int64(int64_t c, term_t p); -PL_EXPORT(int) PL_cvt_o_float(double c, term_t p); -PL_EXPORT(int) PL_cvt_o_single(float c, term_t p); -PL_EXPORT(int) PL_cvt_o_string(const char *c, term_t p); -PL_EXPORT(int) PL_cvt_o_codes(const char *c, term_t p); -PL_EXPORT(int) PL_cvt_o_atom(atom_t c, term_t p); -PL_EXPORT(int) PL_cvt_o_address(void *address, term_t p); -PL_EXPORT(term_t) PL_new_nil_ref(void); - -/* set/get encoding for PL_cvt_*_string() functions. The default - is UTF-8 (REP_UTF8) -*/ - -PL_EXPORT(int) PL_cvt_encoding(void); -PL_EXPORT(int) PL_cvt_set_encoding(int enc); -PL_EXPORT(void) SP_set_state(int state); -PL_EXPORT(int) SP_get_state(void); - - - /******************************* - * COMPARE * - *******************************/ - -PL_EXPORT(int) PL_compare(term_t t1, term_t t2); -PL_EXPORT(int) PL_same_compound(term_t t1, term_t t2); - - /******************************* - * MESSAGES * - *******************************/ - -PL_EXPORT(int) PL_warning(const char *fmt, ...); -PL_EXPORT(void) PL_fatal_error(const char *fmt, ...); - - /******************************* - * RECORDED DATABASE * - *******************************/ - -PL_EXPORT(record_t) PL_record(term_t term); -PL_EXPORT(int) PL_recorded(record_t record, term_t term); -PL_EXPORT(void) PL_erase(record_t record); - -PL_EXPORT(char *) PL_record_external(term_t t, size_t *size); -PL_EXPORT(int) PL_recorded_external(const char *rec, term_t term); -PL_EXPORT(int) PL_erase_external(char *rec); - - /******************************* - * PROLOG FLAGS * - *******************************/ - -#define PL_set_feature PL_set_prolog_flag /* compatibility */ -PL_EXPORT(int) PL_set_prolog_flag(const char *name, int type, ...); - - - /******************************* - * INTERNAL FUNCTIONS * - *******************************/ - -PL_EXPORT(PL_atomic_t) _PL_get_atomic(term_t t); -PL_EXPORT(void) _PL_put_atomic(term_t t, PL_atomic_t a); -PL_EXPORT(int) _PL_unify_atomic(term_t t, PL_atomic_t a); -PL_EXPORT(void) _PL_get_arg(int index, term_t t, term_t a); - - - /******************************* - * CHAR BUFFERS * - *******************************/ - -#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 -#define CVT_WRITE_CANONICAL 0x0080 -#define CVT_ALL (CVT_ATOMIC|CVT_LIST) -#define CVT_MASK 0x00ff - -#define BUF_DISCARDABLE 0x0000 -#define BUF_RING 0x0100 -#define BUF_MALLOC 0x0200 - -#define CVT_EXCEPTION 0x10000 /* throw exception on error */ -#define CVT_VARNOFAIL 0x20000 /* return 2 if argument is unbound */ - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -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 */ - /******************************* - * STREAM SUPPORT * - *******************************/ - - /* Make IOSTREAM known to Prolog */ -#define PL_open_stream PL_unify_stream /* compatibility */ -PL_EXPORT(int) PL_unify_stream(term_t t, IOSTREAM *s); -PL_EXPORT(int) PL_get_stream_handle(term_t t, IOSTREAM **s); -PL_EXPORT(int) PL_release_stream(IOSTREAM *s); -PL_EXPORT(IOSTREAM *) PL_open_resource(module_t m, - const char *name, - const char *rc_class, - const char *mode); - -PL_EXPORT(IOSTREAM *)*_PL_streams(void); /* base of streams */ -#ifndef PL_KERNEL -#define Suser_input (_PL_streams()[0]) -#define Suser_output (_PL_streams()[1]) -#define Suser_error (_PL_streams()[2]) -#endif - -#define PL_WRT_QUOTED 0x01 /* quote atoms */ -#define PL_WRT_IGNOREOPS 0x02 /* ignore list/operators */ -#define PL_WRT_NUMBERVARS 0x04 /* print $VAR(N) as a variable */ -#define PL_WRT_PORTRAY 0x08 /* call portray */ -#define PL_WRT_CHARESCAPES 0x10 /* Output ISO escape sequences */ -#define PL_WRT_BACKQUOTED_STRING 0x20 /* Write strings as `...` */ - /* Write attributed variables */ -#define PL_WRT_ATTVAR_IGNORE 0x040 /* Default: just write the var */ -#define PL_WRT_ATTVAR_DOTS 0x080 /* Write as Var{...} */ -#define PL_WRT_ATTVAR_WRITE 0x100 /* Write as Var{Attributes} */ -#define PL_WRT_ATTVAR_PORTRAY 0x200 /* Use Module:portray_attrs/2 */ -#define PL_WRT_ATTVAR_MASK \ - (PL_WRT_ATTVAR_IGNORE | \ - PL_WRT_ATTVAR_DOTS | \ - PL_WRT_ATTVAR_WRITE | \ - PL_WRT_ATTVAR_PORTRAY) -#define PL_WRT_BLOB_PORTRAY 0x400 /* Use portray to emit non-text blobs */ - -PL_EXPORT(int) PL_write_term(IOSTREAM *s, - term_t term, - int precedence, - int flags); - - /* PL_ttymode() results */ -#define PL_NOTTY 0 /* -tty in effect */ -#define PL_RAWTTY 1 /* get_single_char/1 */ -#define PL_COOKEDTTY 2 /* normal input */ - -PL_EXPORT(int) PL_ttymode(IOSTREAM *s); - -#endif /*SIO_MAGIC*/ - -PL_EXPORT(int) PL_chars_to_term(const char *chars, - term_t term); - - - /******************************* - * EMBEDDING * - *******************************/ - -PL_EXPORT(int) PL_initialise(int argc, char **argv); -PL_EXPORT(int) PL_is_initialised(int *argc, char ***argv); -#ifdef __CYGWIN__ -PL_EXPORT(void) PL_install_readline(void); -#else -install_t PL_install_readline(void); -#endif -PL_EXPORT(int) PL_toplevel(void); -PL_EXPORT(int) PL_cleanup(int status); -PL_EXPORT(void) PL_cleanup_fork(); -PL_EXPORT(void) PL_halt(int status) NORETURN; - - /******************************* - * INPUT/PROMPT/ETC * - *******************************/ - -/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -NOTE: the functions in this section are not documented, as as yet not -adviced for public usage. They are intended to provide an abstract -interface for the GNU readline interface as defined in pl-rl.c. This -abstract interface is necessary to make an embeddable system without the -readline overhead. -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ - /* PL_dispatch() modes */ -#define PL_DISPATCH_NOWAIT 0 /* Dispatch only once */ -#define PL_DISPATCH_WAIT 1 /* Dispatch till input available */ -#define PL_DISPATCH_INSTALLED 2 /* dispatch function installed? */ - -PL_EXPORT(int) PL_dispatch(int fd, int wait); -PL_EXPORT(void) PL_add_to_protocol(const char *buf, size_t count); -PL_EXPORT(char *) PL_prompt_string(int fd); -PL_EXPORT(void) PL_write_prompt(int dowrite); -PL_EXPORT(void) PL_prompt_next(int fd); -PL_EXPORT(char *) PL_atom_generator(const char *prefix, int state); -PL_EXPORT(pl_wchar_t*) PL_atom_generator_w(const pl_wchar_t *pref, - pl_wchar_t *buffer, - size_t buflen, - int state); -PL_EXPORT(void) PL_clock_wait_ticks(long waited); - - - /******************************* - * MEMORY ALLOCATION * - *******************************/ - -PL_EXPORT(void *) PL_malloc(size_t size); -PL_EXPORT(void *) PL_realloc(void *mem, size_t size); -PL_EXPORT(void) PL_free(void *mem); - - /******************************** - * HOOKS * - ********************************/ - -#define PL_DISPATCH_INPUT 0 /* There is input available */ -#define PL_DISPATCH_TIMEOUT 1 /* Dispatch timeout */ - -typedef int (*PL_dispatch_hook_t)(int fd); -typedef void (*PL_abort_hook_t)(void); -typedef void (*PL_initialise_hook_t)(int argc, char **argv); -typedef int (*PL_agc_hook_t)(atom_t a); - -PL_EXPORT(PL_dispatch_hook_t) PL_dispatch_hook(PL_dispatch_hook_t); -PL_EXPORT(void) PL_abort_hook(PL_abort_hook_t); -PL_EXPORT(void) PL_initialise_hook(PL_initialise_hook_t); -PL_EXPORT(int) PL_abort_unhook(PL_abort_hook_t); -PL_EXPORT(PL_agc_hook_t) PL_agc_hook(PL_agc_hook_t); - - - /******************************** - * SIGNALS * - *********************************/ - -#define PL_SIGSYNC 0x00010000 /* call handler synchronously */ -#define PL_SIGNOFRAME 0x00020000 /* Do not create a Prolog frame */ - -PL_EXPORT(void) (*PL_signal(int sig, void (*func)(int)))(int); -PL_EXPORT(void) PL_interrupt(int sig); -PL_EXPORT(int) PL_raise(int sig); -PL_EXPORT(int) PL_handle_signals(void); -PL_EXPORT(int) PL_get_signum_ex(term_t sig, int *n); - - - /******************************** - * PROLOG ACTION/QUERY * - *********************************/ - -#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 */ -#define PL_GMP_SET_ALLOC_FUNCTIONS 12 /* GMP: do not change allocation functions */ - -PL_EXPORT(int) PL_action(int, ...); /* perform some action */ -PL_EXPORT(void) PL_on_halt(void (*)(int, void *), void *); - - /******************************** - * QUERY PROLOG * - *********************************/ - -#define PL_QUERY_ARGC 1 /* return main() argc */ -#define PL_QUERY_ARGV 2 /* return main() argv */ - /* 3: Obsolete PL_QUERY_SYMBOLFILE */ - /* 4: Obsolete PL_QUERY_ORGSYMBOLFILE*/ -#define PL_QUERY_GETC 5 /* Read character from terminal */ -#define PL_QUERY_MAX_INTEGER 6 /* largest integer */ -#define PL_QUERY_MIN_INTEGER 7 /* smallest integer */ -#define PL_QUERY_MAX_TAGGED_INT 8 /* largest tagged integer */ -#define PL_QUERY_MIN_TAGGED_INT 9 /* smallest tagged integer */ -#define PL_QUERY_VERSION 10 /* 207006 = 2.7.6 */ -#define PL_QUERY_MAX_THREADS 11 /* maximum thread count */ -#define PL_QUERY_ENCODING 12 /* I/O encoding */ -#define PL_QUERY_USER_CPU 13 /* User CPU in milliseconds */ -#define PL_QUERY_HALTING 14 /* If TRUE, we are in PL_cleanup() */ - -PL_EXPORT(intptr_t) PL_query(int); /* get information from Prolog */ - - - /******************************* - * PROLOG THREADS * - *******************************/ - -typedef struct -{ long local_size; /* Stack sizes (Kbytes) */ - long global_size; - long trail_size; - long argument_size; - char * alias; /* alias name */ - int (*cancel)(int id); /* cancel function */ - void * reserved[5]; /* reserved for extensions */ -} PL_thread_attr_t; - - -PL_EXPORT(int) PL_thread_self(void); /* Prolog thread id (-1 if none) */ -PL_EXPORT(int) PL_unify_thread_id(term_t t, int i); -PL_EXPORT(int) PL_get_thread_id_ex(term_t t, int *idp); -PL_EXPORT(int) PL_get_thread_alias(int tid, atom_t *alias); /* Locks alias */ -PL_EXPORT(int) PL_thread_attach_engine(PL_thread_attr_t *attr); -PL_EXPORT(int) PL_thread_destroy_engine(void); -PL_EXPORT(int) PL_thread_at_exit(void (*function)(void *), - void *closure, - int global); -PL_EXPORT(int) PL_thread_raise(int tid, int sig); -#if defined(_WINDOWS_) /* is included */ -PL_EXPORT(int) PL_w32thread_raise(DWORD dwTid, int sig); -PL_EXPORT(int) PL_wait_for_console_input(void *handle); -PL_EXPORT(int) PL_w32_wrap_ansi_console(void); -#endif - - /******************************* - * ENGINES (MT-ONLY) * - *******************************/ - -#define PL_ENGINE_MAIN ((PL_engine_t)0x1) -#define PL_ENGINE_CURRENT ((PL_engine_t)0x2) - -#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 */ - -PL_EXPORT(PL_engine_t) PL_create_engine(PL_thread_attr_t *attributes); -PL_EXPORT(int) PL_set_engine(PL_engine_t engine, PL_engine_t *old); -PL_EXPORT(int) PL_destroy_engine(PL_engine_t engine); - - - /******************************* - * PROFILER * - *******************************/ - -typedef struct -{ int (*unify)(term_t t, void *handle); /* implementation --> Prolog */ - int (*get)(term_t t, void **handle); /* Prolog --> implementation */ - void (*activate)(int active); /* (de)activate */ - intptr_t magic; /* PROFTYPE_MAGIC */ -} PL_prof_type_t; - -PL_EXPORT(int) PL_register_profile_type(PL_prof_type_t *type); -PL_EXPORT(void*) PL_prof_call(void *handle, PL_prof_type_t *type); -PL_EXPORT(void) PL_prof_exit(void *node); - - - /******************************* - * WINDOWS MESSAGES * - *******************************/ - -#ifdef _WINDOWS_ /* is included */ -#define PL_MSG_EXCEPTION_RAISED -1 -#define PL_MSG_IGNORED 0 -#define PL_MSG_HANDLED 1 - -PL_EXPORT(LRESULT) PL_win_message_proc(HWND hwnd, - UINT message, - WPARAM wParam, - LPARAM lParam); -#endif /*_WINDOWS_*/ - - - /******************************* - * FAST XPCE SUPPORT * - *******************************/ - -typedef struct -{ int type; /* PL_INTEGER or PL_ATOM */ - union - { uintptr_t i; /* integer reference value */ - atom_t a; /* atom reference value */ - } value; -} xpceref_t; - -PL_EXPORT(int) _PL_get_xpce_reference(term_t t, xpceref_t *ref); -PL_EXPORT(int) _PL_unify_xpce_reference(term_t t, xpceref_t *ref); -PL_EXPORT(int) _PL_put_xpce_reference_i(term_t t, uintptr_t r); -PL_EXPORT(int) _PL_put_xpce_reference_a(term_t t, atom_t name); - - - - /******************************* - * TRACE SUPPORT * - *******************************/ - -PL_EXPORT(int) PL_walk_prolog_stack(void *ref, char* buf, size_t len, void** nextref); - - -#ifdef __cplusplus -} -#endif - -#endif /*_FLI_H_INCLUDED*/ diff --git a/swipl.js b/swipl.js index 048d563..66b6d39 100644 --- a/swipl.js +++ b/swipl.js @@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -var swipl = require("libswipl"); +var swipl = require("./build/Release/libswipl"); function Module(mod) { this.module_name = mod;