aboutsummaryrefslogtreecommitdiffstats
path: root/vt100module.c
blob: 9c44ae8215b8214ce49ed437b82f68ab3a683185 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#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);

#if PY_MAJOR_VERSION == 3
    return Py_BuildValue("y#", outstr, outlen);
#else
    return Py_BuildValue("s#", outstr, outlen);
#endif
}

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);

#if PY_MAJOR_VERSION == 3
    return Py_BuildValue("y#", outstr, outlen);
#else
    return Py_BuildValue("s#", outstr, outlen);
#endif
}

static PyObject *py_vt100_delete(PyObject *self, PyObject *args)
{
    VT100Screen *vt;

    if (!PyArg_ParseTuple(args, "n", &vt)) {
        return NULL;
    }

    vt100_screen_delete(vt);

    Py_INCREF(Py_None);
    return Py_None;
}

static PyMethodDef vt100_methods[] = {
    { "new", py_vt100_new, METH_VARARGS, "create a new vt100 object" },
    { "set_window_size", py_vt100_set_window_size, METH_VARARGS, "create a new vt100 object" },
    { "process_string", py_vt100_process_string, METH_VARARGS, "create a new vt100 object" },
    { "cell_at", py_vt100_cell_at, METH_VARARGS, "create a new vt100 object" },
    { "get_string_formatted", py_vt100_get_string_formatted, METH_VARARGS, "create a new vt100 object" },
    { "get_string_plaintext", py_vt100_get_string_plaintext, METH_VARARGS, "create a new vt100 object" },
    { "delete", py_vt100_delete, METH_VARARGS, "create a new vt100 object" },
    { NULL, NULL, 0, NULL }
};

#if PY_MAJOR_VERSION == 3
static struct PyModuleDef vt100module = {
    PyModuleDef_HEAD_INIT,
    "vt100_raw",
    NULL,
    -1,
    vt100_methods
};

PyMODINIT_FUNC PyInit_vt100_raw()
{
    return PyModule_Create(&vt100module);
}
#else
PyMODINIT_FUNC initvt100_raw()
{
    (void) Py_InitModule("vt100_raw", vt100_methods);
}
#endif