0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

Move some common code from if_python.c and if_python3.c to if_py_both.h.

This commit is contained in:
Bram Moolenaar
2010-07-24 23:51:45 +02:00
parent 365bdf7a7b
commit 170bf1aed5
5 changed files with 476 additions and 612 deletions

View File

@@ -54,6 +54,8 @@
#undef main /* Defined in python.h - aargh */
#undef HAVE_FCNTL_H /* Clash with os_win32.h */
static void init_structs(void);
#if !defined(FEAT_PYTHON) && defined(PROTO)
/* Use this to be able to generate prototypes without python being used. */
# define PyObject Py_ssize_t
@@ -412,6 +414,12 @@ get_exceptions()
}
#endif /* DYNAMIC_PYTHON */
/*
* Include the code shared with if_python3.c
*/
#include "if_py_both.h"
/******************************************************
* Internal function prototypes.
*/
@@ -437,8 +445,6 @@ static int InsertBufferLines(buf_T *, PyInt, PyObject *, PyInt *);
static PyObject *LineToString(const char *);
static char *StringToLine(PyObject *);
static int VimErrorCheck(void);
#define PyErr_SetVim(str) PyErr_SetString(VimError, str)
/******************************************************
@@ -484,20 +490,6 @@ Python_RestoreThread(void)
PyEval_RestoreThread(saved_python_thread);
saved_python_thread = NULL;
#endif
}
/*
* obtain a lock on the Vim data structures
*/
static void Python_Lock_Vim(void)
{
}
/*
* release a lock on the Vim data structures
*/
static void Python_Release_Vim(void)
{
}
void
@@ -550,6 +542,8 @@ Python_Init(void)
}
#endif
init_structs();
#if !defined(MACOS) || defined(MACOS_X_UNIX)
Py_Initialize();
#else
@@ -743,52 +737,6 @@ ex_pyfile(exarg_T *eap)
static PyObject *OutputGetattr(PyObject *, char *);
static int OutputSetattr(PyObject *, char *, PyObject *);
static PyObject *OutputWrite(PyObject *, PyObject *);
static PyObject *OutputWritelines(PyObject *, PyObject *);
typedef void (*writefn)(char_u *);
static void writer(writefn fn, char_u *str, PyInt n);
/* Output object definition
*/
typedef struct
{
PyObject_HEAD
long softspace;
long error;
} OutputObject;
static struct PyMethodDef OutputMethods[] = {
/* name, function, calling, documentation */
{"write", OutputWrite, 1, "" },
{"writelines", OutputWritelines, 1, "" },
{ NULL, NULL, 0, NULL }
};
static PyTypeObject OutputType = {
PyObject_HEAD_INIT(0)
0,
"message",
sizeof(OutputObject),
0,
(destructor) 0,
(printfunc) 0,
(getattrfunc) OutputGetattr,
(setattrfunc) OutputSetattr,
(cmpfunc) 0,
(reprfunc) 0,
0, /* as number */
0, /* as sequence */
0, /* as mapping */
(hashfunc) 0,
(ternaryfunc) 0,
(reprfunc) 0
};
/*************/
static PyObject *
@@ -823,186 +771,15 @@ OutputSetattr(PyObject *self, char *name, PyObject *val)
return -1;
}
/*************/
static PyObject *
OutputWrite(PyObject *self, PyObject *args)
{
int len;
char *str;
int error = ((OutputObject *)(self))->error;
if (!PyArg_ParseTuple(args, "s#", &str, &len))
return NULL;
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
writer((writefn)(error ? emsg : msg), (char_u *)str, len);
Python_Release_Vim();
Py_END_ALLOW_THREADS
Py_INCREF(Py_None);
return Py_None;
}
static PyObject *
OutputWritelines(PyObject *self, PyObject *args)
{
PyInt n;
PyInt i;
PyObject *list;
int error = ((OutputObject *)(self))->error;
if (!PyArg_ParseTuple(args, "O", &list))
return NULL;
Py_INCREF(list);
if (!PyList_Check(list)) {
PyErr_SetString(PyExc_TypeError, _("writelines() requires list of strings"));
Py_DECREF(list);
return NULL;
}
n = PyList_Size(list);
for (i = 0; i < n; ++i)
{
PyObject *line = PyList_GetItem(list, i);
char *str;
PyInt len;
if (!PyArg_Parse(line, "s#", &str, &len)) {
PyErr_SetString(PyExc_TypeError, _("writelines() requires list of strings"));
Py_DECREF(list);
return NULL;
}
Py_BEGIN_ALLOW_THREADS
Python_Lock_Vim();
writer((writefn)(error ? emsg : msg), (char_u *)str, len);
Python_Release_Vim();
Py_END_ALLOW_THREADS
}
Py_DECREF(list);
Py_INCREF(Py_None);
return Py_None;
}
/* Output buffer management
*/
static char_u *buffer = NULL;
static PyInt buffer_len = 0;
static PyInt buffer_size = 0;
static writefn old_fn = NULL;
static void
buffer_ensure(PyInt n)
{
PyInt new_size;
char_u *new_buffer;
if (n < buffer_size)
return;
new_size = buffer_size;
while (new_size < n)
new_size += 80;
if (new_size != buffer_size)
{
new_buffer = alloc((unsigned)new_size);
if (new_buffer == NULL)
return;
if (buffer)
{
memcpy(new_buffer, buffer, buffer_len);
vim_free(buffer);
}
buffer = new_buffer;
buffer_size = new_size;
}
}
static void
PythonIO_Flush(void)
{
if (old_fn && buffer_len)
{
buffer[buffer_len] = 0;
old_fn(buffer);
}
buffer_len = 0;
}
static void
writer(writefn fn, char_u *str, PyInt n)
{
char_u *ptr;
if (fn != old_fn && old_fn != NULL)
PythonIO_Flush();
old_fn = fn;
while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL)
{
PyInt len = ptr - str;
buffer_ensure(buffer_len + len + 1);
memcpy(buffer + buffer_len, str, len);
buffer_len += len;
buffer[buffer_len] = 0;
fn(buffer);
str = ptr + 1;
n -= len + 1;
buffer_len = 0;
}
/* Put the remaining text into the buffer for later printing */
buffer_ensure(buffer_len + n + 1);
memcpy(buffer + buffer_len, str, n);
buffer_len += n;
}
/***************/
static OutputObject Output =
{
PyObject_HEAD_INIT(&OutputType)
0,
0
};
static OutputObject Error =
{
PyObject_HEAD_INIT(&OutputType)
0,
1
};
static int
PythonIO_Init(void)
{
/* Fixups... */
OutputType.ob_type = &PyType_Type;
PySys_SetObject("stdout", (PyObject *)(void *)&Output);
PySys_SetObject("stderr", (PyObject *)(void *)&Error);
if (PyErr_Occurred())
{
EMSG(_("E264: Python: Error initialising I/O objects"));
return -1;
}
return 0;
return PythonIO_Init_io();
}
/******************************************************
@@ -1013,8 +790,6 @@ PythonIO_Init(void)
* -------------------------------------
*/
static PyObject *VimError;
static PyObject *VimCommand(PyObject *, PyObject *);
static PyObject *VimEval(PyObject *, PyObject *);
@@ -1326,6 +1101,7 @@ VimEval(PyObject *self UNUSED, PyObject *args)
/* Common routines for buffers and line ranges
* -------------------------------------------
*/
static int
CheckBuffer(BufferObject *this)
{
@@ -3018,26 +2794,6 @@ StringToLine(PyObject *obj)
return save;
}
/* Check to see whether a Vim error has been reported, or a keyboard
* interrupt has been detected.
*/
static int
VimErrorCheck(void)
{
if (got_int)
{
PyErr_SetNone(PyExc_KeyboardInterrupt);
return 1;
}
else if (did_emsg && !PyErr_Occurred())
{
PyErr_SetNone(VimError);
return 1;
}
return 0;
}
/* Don't generate a prototype for the next function, it generates an error on
* newer Python versions. */
@@ -3049,3 +2805,13 @@ Py_GetProgramName(void)
return "vim";
}
#endif /* Python 1.4 */
static void
init_structs(void)
{
vim_memset(&OutputType, 0, sizeof(OutputType));
OutputType.tp_name = "message";
OutputType.tp_basicsize = sizeof(OutputObject);
OutputType.tp_getattr = OutputGetattr;
OutputType.tp_setattr = OutputSetattr;
}