From d89bc67baf8e8f77de9240a4c991a6a98ff950c4 Mon Sep 17 00:00:00 2001 From: Jeff Armstrong Date: Sun, 10 Jul 2011 11:50:53 -0400 Subject: Initial commit. --- external/core/dynload_mint.c | 70 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 external/core/dynload_mint.c (limited to 'external/core/dynload_mint.c') diff --git a/external/core/dynload_mint.c b/external/core/dynload_mint.c new file mode 100644 index 0000000..11431da --- /dev/null +++ b/external/core/dynload_mint.c @@ -0,0 +1,70 @@ +/* Dynamic Libraries for FreeMiNT (LDG) */ + +#include +#include "importdl.h" +#include + +#define PY_API_FCOUNT 3 + +const struct filedescr _PyImport_DynLoadFiletab[] = { + {".ldg", "rb", C_EXTENSION}, + {"module.ldg", "rb", C_EXTENSION}, + {0, 0, 0} +}; + +//PyObject *Py_InitModule(char *name, PyMethodDef *methods); + +dl_funcptr _PyImport_GetDynLoadFunc(const char *fqname, const char *shortname, + const char *pathname, FILE *fp) +{ + dl_funcptr p; + LDG *library; + short aes_gl; + char errBuf[256]; + + char funcname[258]; + + /* For assigning callbacks to the module */ + void (*assign_pycalls)(void *); + void *callbacks[PY_API_FCOUNT]; + + PyOS_snprintf(funcname, sizeof(funcname), "init%.200s", shortname); + + p = NULL; + + library = ldg_open(pathname, &aes_gl); + + /* Proceed on success */ + if(library != NULL) { + + /* Initialize the callbacks */ + assign_pycalls = ldg_find("assign_pycalls",library); + if(assign_pycalls == NULL) { + PyOS_snprintf(errBuf, sizeof(errBuf), + "Could not find function assign_pycalls"); + PyErr_SetString(PyExc_ImportError, errBuf); + } else { + + callbacks[0] = &Py_InitModule4; + callbacks[1] = &PyArg_ParseTuple; + callbacks[2] = &Py_BuildValue; + + assign_pycalls(callbacks); + + p = (dl_funcptr)ldg_find(funcname,library); + if(p == NULL) { + PyOS_snprintf(errBuf, sizeof(errBuf), + "Could not find function %s",funcname); + PyErr_SetString(PyExc_ImportError, errBuf); + } + } + + } else { + PyOS_snprintf(errBuf, sizeof(errBuf), + "LDG load failed with error code %d", + ldg_error()); + PyErr_SetString(PyExc_ImportError, errBuf); + } + + return p; +} \ No newline at end of file -- cgit v1.2.3