This repository has been archived on 2023-08-20. You can view files and clone it, but cannot push or open issues or pull requests.
yap-6.3/packages/python/python.c

236 lines
7.0 KiB
C
Raw Normal View History

2012-10-08 23:58:22 +01:00
2016-07-31 16:09:21 +01:00
#include "python.h"
2017-05-27 22:54:00 +01:00
#include <YapStreams.h>
#include <VFS.h>
2016-07-31 16:09:21 +01:00
atom_t ATOM_true, ATOM_false, ATOM_colon, ATOM_dot, ATOM_none, ATOM_t,
2017-05-08 18:51:29 +01:00
ATOM_comma, ATOM_builtin, ATOM_A, ATOM_V, ATOM_self, ATOM_nil, ATOM_brackets, ATOM_curly_brackets;
2016-07-31 16:09:21 +01:00
functor_t FUNCTOR_dollar1, FUNCTOR_abs1, FUNCTOR_all1, FUNCTOR_any1,
2017-05-08 18:51:29 +01:00
FUNCTOR_bin1, FUNCTOR_brackets1, FUNCTOR_comma2, FUNCTOR_dir1,
FUNCTOR_float1, FUNCTOR_int1, FUNCTOR_iter1, FUNCTOR_iter2, FUNCTOR_long1,
FUNCTOR_len1, FUNCTOR_curly1, FUNCTOR_ord1, FUNCTOR_range1, FUNCTOR_range2,
FUNCTOR_range3, FUNCTOR_sum1, FUNCTOR_pointer1, FUNCTOR_complex2,
FUNCTOR_plus2, FUNCTOR_sub2, FUNCTOR_mul2, FUNCTOR_div2, FUNCTOR_hat2,
FUNCTOR_colon2, FUNCTOR_comma2, FUNCTOR_equal2, FUNCTOR_sqbrackets2,
2017-02-20 14:37:26 +00:00
FUNCTOR_dot2, FUNCTOR_brackets1;
2015-09-21 23:05:36 +01:00
2017-02-20 14:37:26 +00:00
X_API PyObject *py_Builtin;
X_API PyObject *py_Yapex;
X_API PyObject *py_Sys;
PyObject *py_Context;
PyObject *py_ModDict;
2012-10-25 00:33:02 +01:00
2017-05-27 22:54:00 +01:00
VFS_t pystream;
static void *
py_open( const char *name, const char *io_mode) {
2017-06-08 22:16:52 +01:00
#if HAVE_STRCASESTR
2017-05-27 22:54:00 +01:00
if (strcasestr(name,"//python/")== name)
name += strlen("//python/");
2017-06-08 22:16:52 +01:00
#else
if (strstr(name,"//python/")== name)
name += strlen("//python/");
#endif
2017-05-27 22:54:00 +01:00
// we assume object is already open, so there is no need to open it.
PyObject *stream = string_to_python( name, true, NULL);
if (stream == Py_None)
return NULL;
return stream;
}
static bool
py_close(int sno) {
PyObject *s = YAP_foreign_stream(sno);
PyObject* fclose = PyObject_GetAttrString(s, "close");
PyObject* rc= PyObject_CallObject(fclose, NULL);
bool v = (rc == Py_True);
return v;
}
static PyObject * pyw; // buffer
static int pyw_kind;
PyObject * pyw_data;
static int
py_put(int sno, int ch) {
PyObject *s = YAP_foreign_stream(sno);
PyUnicode_WRITE( pyw_kind, pyw_data, 0, ch );
PyObject* fput = PyObject_GetAttrString(s, "write");
PyObject_CallFunctionObjArgs(fput, pyw, NULL);
return ch;
}
static int
py_get(int sno) {
PyObject *s = YAP_foreign_stream(sno);
PyObject* fget = PyObject_GetAttrString(s, "read");
PyObject *pyr = PyObject_CallFunctionObjArgs(fget, PyLong_FromLong(1), NULL);
return PyUnicode_READ_CHAR( pyr, 0) ;
}
static int64_t py_seek(int sno, int64_t where, int how) {
PyObject *s = YAP_foreign_stream(sno);
PyObject* fseek = PyObject_GetAttrString(s, "seek");
PyObject *pyr = PyObject_CallFunctionObjArgs(fseek, PyLong_FromLong(where), PyLong_FromLong(how), NULL);
return PyLong_AsLong(pyr);
}
static void
py_flush(int sno) {
PyObject *s = YAP_foreign_stream(sno);
PyObject* flush = PyObject_GetAttrString(s, "flush");
PyObject_CallFunction( flush, NULL);
}
static bool
init_python_stream(void)
{
pyw = PyUnicode_FromString("x");
pyw_kind = PyUnicode_KIND(pyw);
pyw_data = PyUnicode_DATA(pyw);
pystream.name = "python stream";
pystream.vflags = VFS_CAN_WRITE|VFS_CAN_EXEC| VFS_CAN_SEEK|VFS_HAS_PREFIX;
pystream.prefix = "//python/";
pystream.suffix = NULL;
pystream.open = py_open;
pystream.close = py_close;
pystream.get_char = py_get;
pystream.put_char = py_put;
pystream.flush = py_flush;
pystream.seek = py_seek;
pystream.next = GLOBAL_VFS;
GLOBAL_VFS = &pystream;
// NULL;
return true;
}
2017-02-20 14:37:26 +00:00
X_API PyObject *py_F2P;
2012-10-25 00:33:02 +01:00
2016-09-30 23:11:13 +01:00
bool python_in_python;
2017-05-02 07:38:23 +01:00
static void add_modules(void) {
py_Main = PyImport_AddModule("__main__");
Py_INCREF(py_Main);
py_Sys = PyImport_AddModule("sys");
Py_INCREF(py_Sys);
py_Builtin = PyImport_AddModule("__builtin__");
Py_INCREF(py_Builtin);
py_ModDict = PyObject_GetAttrString(py_Sys, "modules");
// py_Yapex = PyImport_ImportModule("yap4py.yapi");
// PyObject *py_Yap =
2017-05-14 11:36:09 +01:00
py_Yapex = PyImport_AddModule("yap4py.yapi");
2017-05-02 07:38:23 +01:00
if (py_Yapex)
Py_INCREF(py_Yapex);
//py_F2P = PyObject_GetAttrString(py_Yap, "globals");
py_F2P = NULL;
2017-05-27 22:54:00 +01:00
init_python_stream();
2017-05-02 07:38:23 +01:00
}
2017-05-27 22:54:00 +01:00
2016-07-31 16:09:21 +01:00
static void install_py_constants(void) {
FUNCTOR_dot2 = PL_new_functor(PL_new_atom("."), 2);
2012-10-08 23:58:22 +01:00
// FUNCTOR_equal2 = PL_new_functor(PL_new_atom("="), 2);
// FUNCTOR_boolop1 = PL_new_functor(PL_new_atom("@"), 1);
2016-07-31 16:09:21 +01:00
ATOM_A = PL_new_atom("A");
ATOM_V = PL_new_atom("V");
2015-09-21 23:05:36 +01:00
ATOM_builtin = PL_new_atom("__builtin__");
ATOM_comma = PL_new_atom(",");
2012-11-27 00:16:34 +00:00
ATOM_colon = PL_new_atom(":");
ATOM_true = PL_new_atom("true");
2012-10-17 10:56:44 +01:00
ATOM_false = PL_new_atom("false");
ATOM_dot = PL_new_atom(".");
2016-09-30 23:11:13 +01:00
ATOM_self = PL_new_atom("self");
2017-05-08 18:51:29 +01:00
ATOM_nil = PL_new_atom("[]");
ATOM_brackets = PL_new_atom("()");
ATOM_curly_brackets = PL_new_atom("{}");
2012-11-25 23:37:28 +00:00
FUNCTOR_abs1 = PL_new_functor(PL_new_atom("abs"), 1);
FUNCTOR_all1 = PL_new_functor(PL_new_atom("all"), 1);
FUNCTOR_any1 = PL_new_functor(PL_new_atom("any"), 1);
FUNCTOR_bin1 = PL_new_functor(PL_new_atom("bin"), 1);
FUNCTOR_ord1 = PL_new_functor(PL_new_atom("ord"), 1);
2012-11-27 00:16:34 +00:00
FUNCTOR_int1 = PL_new_functor(PL_new_atom("int"), 1);
FUNCTOR_long1 = PL_new_functor(PL_new_atom("long"), 1);
FUNCTOR_float1 = PL_new_functor(PL_new_atom("float"), 1);
2012-11-25 23:37:28 +00:00
FUNCTOR_curly1 = PL_new_functor(PL_new_atom("{}"), 1);
2017-02-20 14:37:26 +00:00
FUNCTOR_brackets1 = PL_new_functor(PL_new_atom("()"), 1);
2012-10-25 00:33:02 +01:00
FUNCTOR_dollar1 = PL_new_functor(PL_new_atom("$"), 1);
FUNCTOR_pointer1 = PL_new_functor(PL_new_atom("__obj__"), 1);
2012-11-05 13:49:15 +00:00
FUNCTOR_dir1 = PL_new_functor(PL_new_atom("dir"), 1);
FUNCTOR_iter1 = PL_new_functor(PL_new_atom("iter"), 1);
2012-11-27 12:10:41 +00:00
FUNCTOR_iter2 = PL_new_functor(PL_new_atom("iter"), 2);
2012-11-05 13:49:15 +00:00
FUNCTOR_len1 = PL_new_functor(PL_new_atom("len"), 1);
2012-11-27 12:10:41 +00:00
FUNCTOR_range1 = PL_new_functor(PL_new_atom("range"), 1);
FUNCTOR_range2 = PL_new_functor(PL_new_atom("range"), 2);
FUNCTOR_range3 = PL_new_functor(PL_new_atom("range"), 3);
FUNCTOR_sum1 = PL_new_functor(PL_new_atom("sum"), 1);
2015-08-07 22:57:53 +01:00
FUNCTOR_complex2 = PL_new_functor(PL_new_atom("i"), 2);
2012-11-05 13:49:15 +00:00
FUNCTOR_plus2 = PL_new_functor(PL_new_atom("+"), 2);
2012-10-25 00:33:02 +01:00
FUNCTOR_sub2 = PL_new_functor(PL_new_atom("-"), 2);
FUNCTOR_mul2 = PL_new_functor(PL_new_atom("*"), 2);
FUNCTOR_div2 = PL_new_functor(PL_new_atom("/"), 2);
FUNCTOR_hat2 = PL_new_functor(PL_new_atom("^"), 2);
2012-11-05 13:49:15 +00:00
FUNCTOR_colon2 = PL_new_functor(PL_new_atom(":"), 2);
2012-11-25 23:37:28 +00:00
FUNCTOR_comma2 = PL_new_functor(PL_new_atom(","), 2);
2012-11-05 13:49:15 +00:00
FUNCTOR_equal2 = PL_new_functor(PL_new_atom("="), 2);
FUNCTOR_sqbrackets2 = PL_new_functor(PL_new_atom("[]"), 2);
2017-05-02 07:38:23 +01:00
}
2016-07-31 16:09:21 +01:00
foreign_t end_python(void) {
2017-05-02 07:38:23 +01:00
if (!python_in_python)
Py_Finalize();
2016-07-31 16:09:21 +01:00
2017-02-20 14:37:26 +00:00
return true;
2016-07-31 16:09:21 +01:00
}
2017-02-20 14:37:26 +00:00
static bool libpython_initialized = 0;
2017-05-14 11:36:09 +01:00
X_API bool do_init_python(void) {
2017-02-20 14:37:26 +00:00
// char **argv;
2017-05-14 11:36:09 +01:00
if (libpython_initialized)
2017-02-20 14:37:26 +00:00
return true;
libpython_initialized = true;
2017-05-14 11:36:09 +01:00
// PyGILState_STATE gstate = PyGILState_Ensure();
2016-07-31 16:09:21 +01:00
term_t t = PL_new_term_ref();
2017-05-02 07:38:23 +01:00
if (!python_in_python)
Py_Initialize();
2016-07-31 16:09:21 +01:00
install_py_constants();
PL_reset_term_refs(t);
install_pypreds();
install_pl2pl();
2016-12-10 07:01:10 +00:00
// PyGILState_Release(gstate);
2017-05-02 07:38:23 +01:00
add_modules();
2017-05-14 11:36:09 +01:00
return true;
2017-02-20 14:37:26 +00:00
2012-10-08 23:58:22 +01:00
}
2017-02-20 14:37:26 +00:00
X_API bool init_python(void) {
2017-05-14 11:36:09 +01:00
if (python_in_python)
return true;
2017-02-20 14:37:26 +00:00
return do_init_python();
}
#ifdef _WIN32
#include <windows.h>
int WINAPI win_python(HANDLE, DWORD, LPVOID);
int WINAPI win_python(HANDLE hinst, DWORD reason, LPVOID reserved) {
switch (reason) {
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
}
#endif