aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--.gitmodules3
m---------libvt1000
-rw-r--r--setup.py32
-rw-r--r--vt100module.c132
5 files changed, 168 insertions, 0 deletions
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
+Subproject d4fc5e5cfaa006937b7f12c4104b6ea6e6ff1bd
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 <Python.h>
+
+#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);
+}