From a5ce4bc032a03aa4d6d19d1bbed2a6a03f4afd17 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Fri, 5 May 2017 19:59:13 -0700 Subject: [PATCH] Write simple initialization function as well as a test function. --- include/pyliblexmodule.h | 27 +++++++++++++++++++++++++++ src/pyliblexmodule.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 include/pyliblexmodule.h create mode 100644 src/pyliblexmodule.c diff --git a/include/pyliblexmodule.h b/include/pyliblexmodule.h new file mode 100644 index 0000000..ce14e77 --- /dev/null +++ b/include/pyliblexmodule.h @@ -0,0 +1,27 @@ +#ifndef PYLIBLEX_H +#define PYLIBLEX_H + +#include "Python.h" + +static PyObject* pyliblex_init(PyObject* self, PyObject* args); +static PyObject* pyliblex_add_definitions(PyObject* self, PyObject* args); +static PyObject* pyliblex_lex(PyObject* self, PyObject* args); +static PyObject* pyliblex_test(PyObject* self, PyObject* args); + +static const char module_docstring[] = "A wrapper around a homemade lexing library, liblex."; +static PyMethodDef module_methods[] = { + {"init", pyliblex_init, METH_VARARGS, "Initialize a liblex library object." }, + {"test", pyliblex_test, METH_VARARGS, "Tests whether the library is working." }, + { NULL, NULL, 0, NULL } +}; +static struct PyModuleDef module_object = { + PyModuleDef_HEAD_INIT, + "pyliblex", + module_docstring, + -1, + module_methods +}; + +PyMODINIT_FUNC PyInit_pyliblex(); + +#endif diff --git a/src/pyliblexmodule.c b/src/pyliblexmodule.c new file mode 100644 index 0000000..7931c40 --- /dev/null +++ b/src/pyliblexmodule.c @@ -0,0 +1,36 @@ +#include "pyliblexmodule.h" +#include "liblex.h" +#include "eval.h" + +static void _pyliblex_free_eval(PyObject* object){ + eval_config* config = PyCapsule_GetPointer(object, NULL); + if(config){ + liblex_result result = eval_config_free(config); + if(result != LIBLEX_SUCCESS){ + PyErr_NoMemory(); + } + } +} + +static PyObject* pyliblex_init(PyObject* self, PyObject* args){ + PyObject* return_object = NULL; + eval_config* config = malloc(sizeof(*config)); + + if(config){ + eval_config_init(config); + return_object = PyCapsule_New(config, NULL, _pyliblex_free_eval); + } else { + return_object = PyErr_NoMemory(); + } + + return return_object; +} +static PyObject* pyliblex_add_definitions(PyObject* self, PyObject* args); +static PyObject* pyliblex_lex(PyObject* self, PyObject* args); +static PyObject* pyliblex_test(PyObject* self, PyObject* args) { + return PyUnicode_FromString("Test from liblex!"); +} + +PyMODINIT_FUNC PyInit_pyliblex() { + return PyModule_Create(&module_object); +}