From a80e1a9a8863235102faf5250d3021065d1eea1f Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Tue, 16 Sep 2014 20:07:18 -0400 Subject: start writing a c shim --- .gitignore | 1 + .gitmodules | 3 ++ libvt100 | 1 + setup.py | 32 ++++++++++++++ vt100module.c | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 .gitmodules create mode 160000 libvt100 create mode 100644 setup.py create mode 100644 vt100module.c diff --git a/.gitignore b/.gitignore index bee8a64..2774e31 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ __pycache__ +/build/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..0077c76 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libvt100"] + path = libvt100 + url = https://github.com/doy/libvt100 diff --git a/libvt100 b/libvt100 new file mode 160000 index 0000000..d4fc5e5 --- /dev/null +++ b/libvt100 @@ -0,0 +1 @@ +Subproject commit d4fc5e5cfaa006937b7f12c4104b6ea6e6ff1bd9 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..f80af6f --- /dev/null +++ b/setup.py @@ -0,0 +1,32 @@ +from distutils.core import setup, Extension +import subprocess + +# http://code.activestate.com/recipes/502261-python-distutils-pkg-config/ +def pkgconfig(*packages, **kw): + flag_map = {'-I': 'include_dirs', '-L': 'library_dirs', '-l': 'libraries'} + args = ["pkg-config", "--libs", "--cflags"] + args.extend(packages) + for token in subprocess.check_output(args).split(): + token = token.decode('utf-8') + kw.setdefault(flag_map.get(token[:2]), []).append(token[2:]) + return kw + +setup( + name="vt100", + version="0.0.1", + description="an in-memory terminal parsing library", + author="Jesse Luehrs", + author_email="doy@tozt.net", + url="https://github.com/doy/vt100/", + ext_modules=[ + Extension( + name="vt100", + sources=[ + "vt100module.c", + "libvt100/src/screen.c", + "libvt100/src/parser.c" + ], + **pkgconfig('glib-2.0') + ) + ], +) diff --git a/vt100module.c b/vt100module.c new file mode 100644 index 0000000..b30f5f5 --- /dev/null +++ b/vt100module.c @@ -0,0 +1,132 @@ +#define PY_SSIZE_T_CLEAN +#include + +#include "libvt100/src/vt100.h" + +static PyObject *py_vt100_new(PyObject *self, PyObject *args) +{ + VT100Screen *vt; + int rows, cols; + + if (!PyArg_ParseTuple(args, "ii", &rows, &cols)) { + return NULL; + } + + vt = vt100_screen_new(rows, cols); + + return Py_BuildValue("n", (Py_ssize_t)vt); +} + +static PyObject *py_vt100_set_window_size(PyObject *self, PyObject *args) +{ + VT100Screen *vt; + int rows, cols; + + if (!PyArg_ParseTuple(args, "nii", &vt, &rows, &cols)) { + return NULL; + } + + vt100_screen_set_window_size(vt, rows, cols); + + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject *py_vt100_process_string(PyObject *self, PyObject *args) +{ + VT100Screen *vt; + char *str; + size_t len; + int processed; + + if (!PyArg_ParseTuple(args, "ns#", &vt, &str, &len)) { + return NULL; + } + + processed = vt100_screen_process_string(vt, str, len); + + return PyLong_FromLong(processed); +} + +static PyObject *py_vt100_cell_at(PyObject *self, PyObject *args) +{ + VT100Screen *vt; + int row, col; + struct vt100_cell *cell; + + if (!PyArg_ParseTuple(args, "nii", &vt, &row, &col)) { + return NULL; + } + + cell = vt100_screen_cell_at(vt, row, col); + + return Py_BuildValue("n", (Py_ssize_t)cell); +} + +static PyObject *py_vt100_get_string_formatted(PyObject *self, PyObject *args) +{ + VT100Screen *vt; + struct vt100_loc start, end; + char *outstr; + size_t outlen; + + if (!PyArg_ParseTuple(args, "niiii", &vt, &start.row, &start.col, &end.row, &end.col)) { + return NULL; + } + + vt100_screen_get_string_formatted(vt, &start, &end, &outstr, &outlen); + + return Py_BuildValue("y#", outstr, outlen); +} + +static PyObject *py_vt100_get_string_plaintext(PyObject *self, PyObject *args) +{ + VT100Screen *vt; + struct vt100_loc start, end; + char *outstr; + size_t outlen; + + if (!PyArg_ParseTuple(args, "niiii", &vt, &start.row, &start.col, &end.row, &end.col)) { + return NULL; + } + + vt100_screen_get_string_plaintext(vt, &start, &end, &outstr, &outlen); + + return Py_BuildValue("y#", outstr, outlen); +} + +static PyObject *py_vt100_delete(PyObject *self, PyObject *args) +{ + VT100Screen *vt; + + if (!PyArg_ParseTuple(args, "n", &vt)) { + return NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef vt100_methods[] = { + { "vt100_new", py_vt100_new, METH_VARARGS, "create a new vt100 object" }, + { "vt100_set_window_size", py_vt100_set_window_size, METH_VARARGS, "create a new vt100 object" }, + { "vt100_process_string", py_vt100_process_string, METH_VARARGS, "create a new vt100 object" }, + { "vt100_cell_at", py_vt100_cell_at, METH_VARARGS, "create a new vt100 object" }, + { "vt100_get_string_formatted", py_vt100_get_string_formatted, METH_VARARGS, "create a new vt100 object" }, + { "vt100_get_string_plaintext", py_vt100_get_string_plaintext, METH_VARARGS, "create a new vt100 object" }, + { "vt100_delete", py_vt100_delete, METH_VARARGS, "create a new vt100 object" }, + { NULL, NULL, 0, NULL } +}; + +static struct PyModuleDef vt100module = { + PyModuleDef_HEAD_INIT, + "vt100", + NULL, + -1, + vt100_methods +}; + +PyMODINIT_FUNC PyInit_vt100() +{ + return PyModule_Create(&vt100module); +} -- cgit v1.2.3-54-g00ecf