xref: /vim-8.2.3635/src/if_python.c (revision c236c16d)
1 /* vi:set ts=8 sts=4 sw=4:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  * See README.txt for an overview of the Vim source code.
8  */
9 /*
10  * Python extensions by Paul Moore.
11  * Changes for Unix by David Leonard.
12  *
13  * This consists of four parts:
14  * 1. Python interpreter main program
15  * 2. Python output stream: writes output via [e]msg().
16  * 3. Implementation of the Vim module for Python
17  * 4. Utility functions for handling the interface between Vim and Python.
18  */
19 
20 #include "vim.h"
21 
22 #include <limits.h>
23 
24 /* Python.h defines _POSIX_THREADS itself (if needed) */
25 #ifdef _POSIX_THREADS
26 # undef _POSIX_THREADS
27 #endif
28 
29 #if defined(_WIN32) && defined (HAVE_FCNTL_H)
30 # undef HAVE_FCNTL_H
31 #endif
32 
33 #ifdef _DEBUG
34 # undef _DEBUG
35 #endif
36 
37 #ifdef HAVE_STDARG_H
38 # undef HAVE_STDARG_H	/* Python's config.h defines it as well. */
39 #endif
40 
41 #define PY_SSIZE_T_CLEAN
42 
43 #include <Python.h>
44 #if defined(MACOS) && !defined(MACOS_X_UNIX)
45 # include "macglue.h"
46 # include <CodeFragments.h>
47 #endif
48 #undef main /* Defined in python.h - aargh */
49 #undef HAVE_FCNTL_H /* Clash with os_win32.h */
50 
51 #if !defined(FEAT_PYTHON) && defined(PROTO)
52 /* Use this to be able to generate prototypes without python being used. */
53 # define PyObject Py_ssize_t
54 # define PyThreadState Py_ssize_t
55 # define PyTypeObject Py_ssize_t
56 struct PyMethodDef { Py_ssize_t a; };
57 # define PySequenceMethods Py_ssize_t
58 #endif
59 
60 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000
61 # define PyInt Py_ssize_t
62 # define PyInquiry lenfunc
63 # define PyIntArgFunc ssizeargfunc
64 # define PyIntIntArgFunc ssizessizeargfunc
65 # define PyIntObjArgProc ssizeobjargproc
66 # define PyIntIntObjArgProc ssizessizeobjargproc
67 # define Py_ssize_t_fmt "n"
68 #else
69 # define PyInt int
70 # define PyInquiry inquiry
71 # define PyIntArgFunc intargfunc
72 # define PyIntIntArgFunc intintargfunc
73 # define PyIntObjArgProc intobjargproc
74 # define PyIntIntObjArgProc intintobjargproc
75 # define Py_ssize_t_fmt "i"
76 #endif
77 
78 /* Parser flags */
79 #define single_input	256
80 #define file_input	257
81 #define eval_input	258
82 
83 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x020300F0
84   /* Python 2.3: can invoke ":python" recursively. */
85 # define PY_CAN_RECURSE
86 #endif
87 
88 #if defined(DYNAMIC_PYTHON) || defined(PROTO)
89 # ifndef DYNAMIC_PYTHON
90 #  define HINSTANCE long_u		/* for generating prototypes */
91 # endif
92 
93 /* This makes if_python.c compile without warnings against Python 2.5
94  * on Win32 and Win64. */
95 #undef PyRun_SimpleString
96 #undef PyArg_Parse
97 #undef PyArg_ParseTuple
98 #undef Py_BuildValue
99 #undef Py_InitModule4
100 #undef Py_InitModule4_64
101 
102 /*
103  * Wrapper defines
104  */
105 # define PyArg_Parse dll_PyArg_Parse
106 # define PyArg_ParseTuple dll_PyArg_ParseTuple
107 # define PyDict_SetItemString dll_PyDict_SetItemString
108 # define PyErr_BadArgument dll_PyErr_BadArgument
109 # define PyErr_Clear dll_PyErr_Clear
110 # define PyErr_NoMemory dll_PyErr_NoMemory
111 # define PyErr_Occurred dll_PyErr_Occurred
112 # define PyErr_SetNone dll_PyErr_SetNone
113 # define PyErr_SetString dll_PyErr_SetString
114 # define PyEval_InitThreads dll_PyEval_InitThreads
115 # define PyEval_RestoreThread dll_PyEval_RestoreThread
116 # define PyEval_SaveThread dll_PyEval_SaveThread
117 # ifdef PY_CAN_RECURSE
118 #  define PyGILState_Ensure dll_PyGILState_Ensure
119 #  define PyGILState_Release dll_PyGILState_Release
120 # endif
121 # define PyInt_AsLong dll_PyInt_AsLong
122 # define PyInt_FromLong dll_PyInt_FromLong
123 # define PyInt_Type (*dll_PyInt_Type)
124 # define PyList_GetItem dll_PyList_GetItem
125 # define PyList_Append dll_PyList_Append
126 # define PyList_New dll_PyList_New
127 # define PyList_SetItem dll_PyList_SetItem
128 # define PyList_Size dll_PyList_Size
129 # define PyList_Type (*dll_PyList_Type)
130 # define PyImport_ImportModule dll_PyImport_ImportModule
131 # define PyDict_New dll_PyDict_New
132 # define PyDict_GetItemString dll_PyDict_GetItemString
133 # define PyModule_GetDict dll_PyModule_GetDict
134 # define PyRun_SimpleString dll_PyRun_SimpleString
135 # define PyString_AsString dll_PyString_AsString
136 # define PyString_FromString dll_PyString_FromString
137 # define PyString_FromStringAndSize dll_PyString_FromStringAndSize
138 # define PyString_Size dll_PyString_Size
139 # define PyString_Type (*dll_PyString_Type)
140 # define PySys_SetObject dll_PySys_SetObject
141 # define PySys_SetArgv dll_PySys_SetArgv
142 # define PyType_Type (*dll_PyType_Type)
143 # define Py_BuildValue dll_Py_BuildValue
144 # define Py_FindMethod dll_Py_FindMethod
145 # define Py_InitModule4 dll_Py_InitModule4
146 # define Py_Initialize dll_Py_Initialize
147 # define Py_Finalize dll_Py_Finalize
148 # define Py_IsInitialized dll_Py_IsInitialized
149 # define _PyObject_New dll__PyObject_New
150 # define _Py_NoneStruct (*dll__Py_NoneStruct)
151 # define PyObject_Init dll__PyObject_Init
152 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000
153 #  define PyType_IsSubtype dll_PyType_IsSubtype
154 # endif
155 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000
156 #  define PyObject_Malloc dll_PyObject_Malloc
157 #  define PyObject_Free dll_PyObject_Free
158 # endif
159 
160 /*
161  * Pointers for dynamic link
162  */
163 static int(*dll_PyArg_Parse)(PyObject *, char *, ...);
164 static int(*dll_PyArg_ParseTuple)(PyObject *, char *, ...);
165 static int(*dll_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
166 static int(*dll_PyErr_BadArgument)(void);
167 static void(*dll_PyErr_Clear)(void);
168 static PyObject*(*dll_PyErr_NoMemory)(void);
169 static PyObject*(*dll_PyErr_Occurred)(void);
170 static void(*dll_PyErr_SetNone)(PyObject *);
171 static void(*dll_PyErr_SetString)(PyObject *, const char *);
172 static void(*dll_PyEval_InitThreads)(void);
173 static void(*dll_PyEval_RestoreThread)(PyThreadState *);
174 static PyThreadState*(*dll_PyEval_SaveThread)(void);
175 # ifdef PY_CAN_RECURSE
176 static PyGILState_STATE	(*dll_PyGILState_Ensure)(void);
177 static void (*dll_PyGILState_Release)(PyGILState_STATE);
178 #endif
179 static long(*dll_PyInt_AsLong)(PyObject *);
180 static PyObject*(*dll_PyInt_FromLong)(long);
181 static PyTypeObject* dll_PyInt_Type;
182 static PyObject*(*dll_PyList_GetItem)(PyObject *, PyInt);
183 static PyObject*(*dll_PyList_Append)(PyObject *, PyObject *);
184 static PyObject*(*dll_PyList_New)(PyInt size);
185 static int(*dll_PyList_SetItem)(PyObject *, PyInt, PyObject *);
186 static PyInt(*dll_PyList_Size)(PyObject *);
187 static PyTypeObject* dll_PyList_Type;
188 static PyObject*(*dll_PyImport_ImportModule)(const char *);
189 static PyObject*(*dll_PyDict_New)(void);
190 static PyObject*(*dll_PyDict_GetItemString)(PyObject *, const char *);
191 static PyObject*(*dll_PyModule_GetDict)(PyObject *);
192 static int(*dll_PyRun_SimpleString)(char *);
193 static char*(*dll_PyString_AsString)(PyObject *);
194 static PyObject*(*dll_PyString_FromString)(const char *);
195 static PyObject*(*dll_PyString_FromStringAndSize)(const char *, PyInt);
196 static PyInt(*dll_PyString_Size)(PyObject *);
197 static PyTypeObject* dll_PyString_Type;
198 static int(*dll_PySys_SetObject)(char *, PyObject *);
199 static int(*dll_PySys_SetArgv)(int, char **);
200 static PyTypeObject* dll_PyType_Type;
201 static PyObject*(*dll_Py_BuildValue)(char *, ...);
202 static PyObject*(*dll_Py_FindMethod)(struct PyMethodDef[], PyObject *, char *);
203 static PyObject*(*dll_Py_InitModule4)(char *, struct PyMethodDef *, char *, PyObject *, int);
204 static void(*dll_Py_Initialize)(void);
205 static void(*dll_Py_Finalize)(void);
206 static int(*dll_Py_IsInitialized)(void);
207 static PyObject*(*dll__PyObject_New)(PyTypeObject *, PyObject *);
208 static PyObject*(*dll__PyObject_Init)(PyObject *, PyTypeObject *);
209 static PyObject* dll__Py_NoneStruct;
210 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000
211 static int (*dll_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *);
212 # endif
213 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000
214 static void* (*dll_PyObject_Malloc)(size_t);
215 static void (*dll_PyObject_Free)(void*);
216 # endif
217 
218 static HINSTANCE hinstPython = 0; /* Instance of python.dll */
219 
220 /* Imported exception objects */
221 static PyObject *imp_PyExc_AttributeError;
222 static PyObject *imp_PyExc_IndexError;
223 static PyObject *imp_PyExc_KeyboardInterrupt;
224 static PyObject *imp_PyExc_TypeError;
225 static PyObject *imp_PyExc_ValueError;
226 
227 # define PyExc_AttributeError imp_PyExc_AttributeError
228 # define PyExc_IndexError imp_PyExc_IndexError
229 # define PyExc_KeyboardInterrupt imp_PyExc_KeyboardInterrupt
230 # define PyExc_TypeError imp_PyExc_TypeError
231 # define PyExc_ValueError imp_PyExc_ValueError
232 
233 /*
234  * Table of name to function pointer of python.
235  */
236 # define PYTHON_PROC FARPROC
237 static struct
238 {
239     char *name;
240     PYTHON_PROC *ptr;
241 } python_funcname_table[] =
242 {
243     {"PyArg_Parse", (PYTHON_PROC*)&dll_PyArg_Parse},
244     {"PyArg_ParseTuple", (PYTHON_PROC*)&dll_PyArg_ParseTuple},
245     {"PyDict_SetItemString", (PYTHON_PROC*)&dll_PyDict_SetItemString},
246     {"PyErr_BadArgument", (PYTHON_PROC*)&dll_PyErr_BadArgument},
247     {"PyErr_Clear", (PYTHON_PROC*)&dll_PyErr_Clear},
248     {"PyErr_NoMemory", (PYTHON_PROC*)&dll_PyErr_NoMemory},
249     {"PyErr_Occurred", (PYTHON_PROC*)&dll_PyErr_Occurred},
250     {"PyErr_SetNone", (PYTHON_PROC*)&dll_PyErr_SetNone},
251     {"PyErr_SetString", (PYTHON_PROC*)&dll_PyErr_SetString},
252     {"PyEval_InitThreads", (PYTHON_PROC*)&dll_PyEval_InitThreads},
253     {"PyEval_RestoreThread", (PYTHON_PROC*)&dll_PyEval_RestoreThread},
254     {"PyEval_SaveThread", (PYTHON_PROC*)&dll_PyEval_SaveThread},
255 # ifdef PY_CAN_RECURSE
256     {"PyGILState_Ensure", (PYTHON_PROC*)&dll_PyGILState_Ensure},
257     {"PyGILState_Release", (PYTHON_PROC*)&dll_PyGILState_Release},
258 # endif
259     {"PyInt_AsLong", (PYTHON_PROC*)&dll_PyInt_AsLong},
260     {"PyInt_FromLong", (PYTHON_PROC*)&dll_PyInt_FromLong},
261     {"PyInt_Type", (PYTHON_PROC*)&dll_PyInt_Type},
262     {"PyList_GetItem", (PYTHON_PROC*)&dll_PyList_GetItem},
263     {"PyList_Append", (PYTHON_PROC*)&dll_PyList_Append},
264     {"PyList_New", (PYTHON_PROC*)&dll_PyList_New},
265     {"PyList_SetItem", (PYTHON_PROC*)&dll_PyList_SetItem},
266     {"PyList_Size", (PYTHON_PROC*)&dll_PyList_Size},
267     {"PyList_Type", (PYTHON_PROC*)&dll_PyList_Type},
268     {"PyImport_ImportModule", (PYTHON_PROC*)&dll_PyImport_ImportModule},
269     {"PyDict_GetItemString", (PYTHON_PROC*)&dll_PyDict_GetItemString},
270     {"PyDict_New", (PYTHON_PROC*)&dll_PyDict_New},
271     {"PyModule_GetDict", (PYTHON_PROC*)&dll_PyModule_GetDict},
272     {"PyRun_SimpleString", (PYTHON_PROC*)&dll_PyRun_SimpleString},
273     {"PyString_AsString", (PYTHON_PROC*)&dll_PyString_AsString},
274     {"PyString_FromString", (PYTHON_PROC*)&dll_PyString_FromString},
275     {"PyString_FromStringAndSize", (PYTHON_PROC*)&dll_PyString_FromStringAndSize},
276     {"PyString_Size", (PYTHON_PROC*)&dll_PyString_Size},
277     {"PyString_Type", (PYTHON_PROC*)&dll_PyString_Type},
278     {"PySys_SetObject", (PYTHON_PROC*)&dll_PySys_SetObject},
279     {"PySys_SetArgv", (PYTHON_PROC*)&dll_PySys_SetArgv},
280     {"PyType_Type", (PYTHON_PROC*)&dll_PyType_Type},
281     {"Py_BuildValue", (PYTHON_PROC*)&dll_Py_BuildValue},
282     {"Py_FindMethod", (PYTHON_PROC*)&dll_Py_FindMethod},
283 # if (PY_VERSION_HEX >= 0x02050000) && SIZEOF_SIZE_T != SIZEOF_INT
284     {"Py_InitModule4_64", (PYTHON_PROC*)&dll_Py_InitModule4},
285 # else
286     {"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4},
287 # endif
288     {"Py_Initialize", (PYTHON_PROC*)&dll_Py_Initialize},
289     {"Py_Finalize", (PYTHON_PROC*)&dll_Py_Finalize},
290     {"Py_IsInitialized", (PYTHON_PROC*)&dll_Py_IsInitialized},
291     {"_PyObject_New", (PYTHON_PROC*)&dll__PyObject_New},
292     {"PyObject_Init", (PYTHON_PROC*)&dll__PyObject_Init},
293     {"_Py_NoneStruct", (PYTHON_PROC*)&dll__Py_NoneStruct},
294 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000
295     {"PyType_IsSubtype", (PYTHON_PROC*)&dll_PyType_IsSubtype},
296 # endif
297 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000
298     {"PyObject_Malloc", (PYTHON_PROC*)&dll_PyObject_Malloc},
299     {"PyObject_Free", (PYTHON_PROC*)&dll_PyObject_Free},
300 # endif
301     {"", NULL},
302 };
303 
304 /*
305  * Free python.dll
306  */
307     static void
308 end_dynamic_python(void)
309 {
310     if (hinstPython)
311     {
312 	FreeLibrary(hinstPython);
313 	hinstPython = 0;
314     }
315 }
316 
317 /*
318  * Load library and get all pointers.
319  * Parameter 'libname' provides name of DLL.
320  * Return OK or FAIL.
321  */
322     static int
323 python_runtime_link_init(char *libname, int verbose)
324 {
325     int i;
326 
327     if (hinstPython)
328 	return OK;
329     hinstPython = LoadLibrary(libname);
330     if (!hinstPython)
331     {
332 	if (verbose)
333 	    EMSG2(_(e_loadlib), libname);
334 	return FAIL;
335     }
336 
337     for (i = 0; python_funcname_table[i].ptr; ++i)
338     {
339 	if ((*python_funcname_table[i].ptr = GetProcAddress(hinstPython,
340 			python_funcname_table[i].name)) == NULL)
341 	{
342 	    FreeLibrary(hinstPython);
343 	    hinstPython = 0;
344 	    if (verbose)
345 		EMSG2(_(e_loadfunc), python_funcname_table[i].name);
346 	    return FAIL;
347 	}
348     }
349     return OK;
350 }
351 
352 /*
353  * If python is enabled (there is installed python on Windows system) return
354  * TRUE, else FALSE.
355  */
356     int
357 python_enabled(int verbose)
358 {
359     return python_runtime_link_init(DYNAMIC_PYTHON_DLL, verbose) == OK;
360 }
361 
362 /* Load the standard Python exceptions - don't import the symbols from the
363  * DLL, as this can cause errors (importing data symbols is not reliable).
364  */
365 static void get_exceptions __ARGS((void));
366 
367     static void
368 get_exceptions()
369 {
370     PyObject *exmod = PyImport_ImportModule("exceptions");
371     PyObject *exdict = PyModule_GetDict(exmod);
372     imp_PyExc_AttributeError = PyDict_GetItemString(exdict, "AttributeError");
373     imp_PyExc_IndexError = PyDict_GetItemString(exdict, "IndexError");
374     imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt");
375     imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
376     imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
377     Py_XINCREF(imp_PyExc_AttributeError);
378     Py_XINCREF(imp_PyExc_IndexError);
379     Py_XINCREF(imp_PyExc_KeyboardInterrupt);
380     Py_XINCREF(imp_PyExc_TypeError);
381     Py_XINCREF(imp_PyExc_ValueError);
382     Py_XDECREF(exmod);
383 }
384 #endif /* DYNAMIC_PYTHON */
385 
386 /******************************************************
387  * Internal function prototypes.
388  */
389 
390 static void DoPythonCommand(exarg_T *, const char *);
391 static PyInt RangeStart;
392 static PyInt RangeEnd;
393 
394 static void PythonIO_Flush(void);
395 static int PythonIO_Init(void);
396 static int PythonMod_Init(void);
397 
398 /* Utility functions for the vim/python interface
399  * ----------------------------------------------
400  */
401 static PyObject *GetBufferLine(buf_T *, PyInt);
402 static PyObject *GetBufferLineList(buf_T *, PyInt, PyInt);
403 
404 static int SetBufferLine(buf_T *, PyInt, PyObject *, PyInt *);
405 static int SetBufferLineList(buf_T *, PyInt, PyInt, PyObject *, PyInt *);
406 static int InsertBufferLines(buf_T *, PyInt, PyObject *, PyInt *);
407 
408 static PyObject *LineToString(const char *);
409 static char *StringToLine(PyObject *);
410 
411 static int VimErrorCheck(void);
412 
413 #define PyErr_SetVim(str) PyErr_SetString(VimError, str)
414 
415 /******************************************************
416  * 1. Python interpreter main program.
417  */
418 
419 static int initialised = 0;
420 
421 #if PYTHON_API_VERSION < 1007 /* Python 1.4 */
422 typedef PyObject PyThreadState;
423 #endif
424 
425 #ifdef PY_CAN_RECURSE
426 static PyGILState_STATE pygilstate = PyGILState_UNLOCKED;
427 #else
428 static PyThreadState *saved_python_thread = NULL;
429 #endif
430 
431 /*
432  * Suspend a thread of the Python interpreter, other threads are allowed to
433  * run.
434  */
435     static void
436 Python_SaveThread(void)
437 {
438 #ifdef PY_CAN_RECURSE
439     PyGILState_Release(pygilstate);
440 #else
441     saved_python_thread = PyEval_SaveThread();
442 #endif
443 }
444 
445 /*
446  * Restore a thread of the Python interpreter, waits for other threads to
447  * block.
448  */
449     static void
450 Python_RestoreThread(void)
451 {
452 #ifdef PY_CAN_RECURSE
453     pygilstate = PyGILState_Ensure();
454 #else
455     PyEval_RestoreThread(saved_python_thread);
456     saved_python_thread = NULL;
457 #endif
458 }
459 
460 /*
461  * obtain a lock on the Vim data structures
462  */
463 static void Python_Lock_Vim(void)
464 {
465 }
466 
467 /*
468  * release a lock on the Vim data structures
469  */
470 static void Python_Release_Vim(void)
471 {
472 }
473 
474     void
475 python_end()
476 {
477     static int recurse = 0;
478 
479     /* If a crash occurs while doing this, don't try again. */
480     if (recurse != 0)
481 	return;
482 
483     ++recurse;
484 
485 #ifdef DYNAMIC_PYTHON
486     if (hinstPython && Py_IsInitialized())
487     {
488 	Python_RestoreThread();	    /* enter python */
489 	Py_Finalize();
490     }
491     end_dynamic_python();
492 #else
493     if (Py_IsInitialized())
494     {
495 	Python_RestoreThread();	    /* enter python */
496 	Py_Finalize();
497     }
498 #endif
499 
500     --recurse;
501 }
502 
503     static int
504 Python_Init(void)
505 {
506     if (!initialised)
507     {
508 #ifdef DYNAMIC_PYTHON
509 	if (!python_enabled(TRUE))
510 	{
511 	    EMSG(_("E263: Sorry, this command is disabled, the Python library could not be loaded."));
512 	    goto fail;
513 	}
514 #endif
515 
516 #if !defined(MACOS) || defined(MACOS_X_UNIX)
517 	Py_Initialize();
518 #else
519 	PyMac_Initialize();
520 #endif
521 	/* initialise threads */
522 	PyEval_InitThreads();
523 
524 #ifdef DYNAMIC_PYTHON
525 	get_exceptions();
526 #endif
527 
528 	if (PythonIO_Init())
529 	    goto fail;
530 
531 	if (PythonMod_Init())
532 	    goto fail;
533 
534 	/* the first python thread is vim's, release the lock */
535 	Python_SaveThread();
536 
537 	initialised = 1;
538     }
539 
540     return 0;
541 
542 fail:
543     /* We call PythonIO_Flush() here to print any Python errors.
544      * This is OK, as it is possible to call this function even
545      * if PythonIO_Init() has not completed successfully (it will
546      * not do anything in this case).
547      */
548     PythonIO_Flush();
549     return -1;
550 }
551 
552 /*
553  * External interface
554  */
555     static void
556 DoPythonCommand(exarg_T *eap, const char *cmd)
557 {
558 #ifndef PY_CAN_RECURSE
559     static int		recursive = 0;
560 #endif
561 #if defined(MACOS) && !defined(MACOS_X_UNIX)
562     GrafPtr		oldPort;
563 #endif
564 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
565     char		*saved_locale;
566 #endif
567 
568 #ifndef PY_CAN_RECURSE
569     if (recursive)
570     {
571 	EMSG(_("E659: Cannot invoke Python recursively"));
572 	return;
573     }
574     ++recursive;
575 #endif
576 
577 #if defined(MACOS) && !defined(MACOS_X_UNIX)
578     GetPort(&oldPort);
579     /* Check if the Python library is available */
580     if ((Ptr)PyMac_Initialize == (Ptr)kUnresolvedCFragSymbolAddress)
581 	goto theend;
582 #endif
583     if (Python_Init())
584 	goto theend;
585 
586     RangeStart = eap->line1;
587     RangeEnd = eap->line2;
588     Python_Release_Vim();	    /* leave vim */
589 
590 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
591     /* Python only works properly when the LC_NUMERIC locale is "C". */
592     saved_locale = setlocale(LC_NUMERIC, NULL);
593     if (saved_locale == NULL || STRCMP(saved_locale, "C") == 0)
594 	saved_locale = NULL;
595     else
596     {
597 	/* Need to make a copy, value may change when setting new locale. */
598 	saved_locale = (char *)vim_strsave((char_u *)saved_locale);
599 	(void)setlocale(LC_NUMERIC, "C");
600     }
601 #endif
602 
603     Python_RestoreThread();	    /* enter python */
604 
605     PyRun_SimpleString((char *)(cmd));
606 
607     Python_SaveThread();	    /* leave python */
608 
609 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
610     if (saved_locale != NULL)
611     {
612 	(void)setlocale(LC_NUMERIC, saved_locale);
613 	vim_free(saved_locale);
614     }
615 #endif
616 
617     Python_Lock_Vim();		    /* enter vim */
618     PythonIO_Flush();
619 #if defined(MACOS) && !defined(MACOS_X_UNIX)
620     SetPort(oldPort);
621 #endif
622 
623 theend:
624 #ifndef PY_CAN_RECURSE
625     --recursive;
626 #endif
627     return;	    /* keeps lint happy */
628 }
629 
630 /*
631  * ":python"
632  */
633     void
634 ex_python(exarg_T *eap)
635 {
636     char_u *script;
637 
638     script = script_get(eap, eap->arg);
639     if (!eap->skip)
640     {
641 	if (script == NULL)
642 	    DoPythonCommand(eap, (char *)eap->arg);
643 	else
644 	    DoPythonCommand(eap, (char *)script);
645     }
646     vim_free(script);
647 }
648 
649 #define BUFFER_SIZE 1024
650 
651 /*
652  * ":pyfile"
653  */
654     void
655 ex_pyfile(exarg_T *eap)
656 {
657     static char buffer[BUFFER_SIZE];
658     const char *file = (char *)eap->arg;
659     char *p;
660 
661     /* Have to do it like this. PyRun_SimpleFile requires you to pass a
662      * stdio file pointer, but Vim and the Python DLL are compiled with
663      * different options under Windows, meaning that stdio pointers aren't
664      * compatible between the two. Yuk.
665      *
666      * Put the string "execfile('file')" into buffer. But, we need to
667      * escape any backslashes or single quotes in the file name, so that
668      * Python won't mangle the file name.
669      */
670     strcpy(buffer, "execfile('");
671     p = buffer + 10; /* size of "execfile('" */
672 
673     while (*file && p < buffer + (BUFFER_SIZE - 3))
674     {
675 	if (*file == '\\' || *file == '\'')
676 	    *p++ = '\\';
677 	*p++ = *file++;
678     }
679 
680     /* If we didn't finish the file name, we hit a buffer overflow */
681     if (*file != '\0')
682 	return;
683 
684     /* Put in the terminating "')" and a null */
685     *p++ = '\'';
686     *p++ = ')';
687     *p++ = '\0';
688 
689     /* Execute the file */
690     DoPythonCommand(eap, buffer);
691 }
692 
693 /******************************************************
694  * 2. Python output stream: writes output via [e]msg().
695  */
696 
697 /* Implementation functions
698  */
699 
700 static PyObject *OutputGetattr(PyObject *, char *);
701 static int OutputSetattr(PyObject *, char *, PyObject *);
702 
703 static PyObject *OutputWrite(PyObject *, PyObject *);
704 static PyObject *OutputWritelines(PyObject *, PyObject *);
705 
706 typedef void (*writefn)(char_u *);
707 static void writer(writefn fn, char_u *str, PyInt n);
708 
709 /* Output object definition
710  */
711 
712 typedef struct
713 {
714     PyObject_HEAD
715     long softspace;
716     long error;
717 } OutputObject;
718 
719 static struct PyMethodDef OutputMethods[] = {
720     /* name,	    function,		calling,    documentation */
721     {"write",	    OutputWrite,	1,	    "" },
722     {"writelines",  OutputWritelines,	1,	    "" },
723     { NULL,	    NULL,		0,	    NULL }
724 };
725 
726 static PyTypeObject OutputType = {
727 	PyObject_HEAD_INIT(0)
728 	0,
729 	"message",
730 	sizeof(OutputObject),
731 	0,
732 
733 	(destructor) 0,
734 	(printfunc) 0,
735 	(getattrfunc) OutputGetattr,
736 	(setattrfunc) OutputSetattr,
737 	(cmpfunc) 0,
738 	(reprfunc) 0,
739 
740 	0, /* as number */
741 	0, /* as sequence */
742 	0, /* as mapping */
743 
744 	(hashfunc) 0,
745 	(ternaryfunc) 0,
746 	(reprfunc) 0
747 };
748 
749 /*************/
750 
751     static PyObject *
752 OutputGetattr(PyObject *self, char *name)
753 {
754     if (strcmp(name, "softspace") == 0)
755 	return PyInt_FromLong(((OutputObject *)(self))->softspace);
756 
757     return Py_FindMethod(OutputMethods, self, name);
758 }
759 
760     static int
761 OutputSetattr(PyObject *self, char *name, PyObject *val)
762 {
763     if (val == NULL) {
764 	PyErr_SetString(PyExc_AttributeError, _("can't delete OutputObject attributes"));
765 	return -1;
766     }
767 
768     if (strcmp(name, "softspace") == 0)
769     {
770 	if (!PyInt_Check(val)) {
771 	    PyErr_SetString(PyExc_TypeError, _("softspace must be an integer"));
772 	    return -1;
773 	}
774 
775 	((OutputObject *)(self))->softspace = PyInt_AsLong(val);
776 	return 0;
777     }
778 
779     PyErr_SetString(PyExc_AttributeError, _("invalid attribute"));
780     return -1;
781 }
782 
783 /*************/
784 
785     static PyObject *
786 OutputWrite(PyObject *self, PyObject *args)
787 {
788     int len;
789     char *str;
790     int error = ((OutputObject *)(self))->error;
791 
792     if (!PyArg_ParseTuple(args, "s#", &str, &len))
793 	return NULL;
794 
795     Py_BEGIN_ALLOW_THREADS
796     Python_Lock_Vim();
797     writer((writefn)(error ? emsg : msg), (char_u *)str, len);
798     Python_Release_Vim();
799     Py_END_ALLOW_THREADS
800 
801     Py_INCREF(Py_None);
802     return Py_None;
803 }
804 
805     static PyObject *
806 OutputWritelines(PyObject *self, PyObject *args)
807 {
808     PyInt n;
809     PyInt i;
810     PyObject *list;
811     int error = ((OutputObject *)(self))->error;
812 
813     if (!PyArg_ParseTuple(args, "O", &list))
814 	return NULL;
815     Py_INCREF(list);
816 
817     if (!PyList_Check(list)) {
818 	PyErr_SetString(PyExc_TypeError, _("writelines() requires list of strings"));
819 	Py_DECREF(list);
820 	return NULL;
821     }
822 
823     n = PyList_Size(list);
824 
825     for (i = 0; i < n; ++i)
826     {
827 	PyObject *line = PyList_GetItem(list, i);
828 	char *str;
829 	PyInt len;
830 
831 	if (!PyArg_Parse(line, "s#", &str, &len)) {
832 	    PyErr_SetString(PyExc_TypeError, _("writelines() requires list of strings"));
833 	    Py_DECREF(list);
834 	    return NULL;
835 	}
836 
837 	Py_BEGIN_ALLOW_THREADS
838 	Python_Lock_Vim();
839 	writer((writefn)(error ? emsg : msg), (char_u *)str, len);
840 	Python_Release_Vim();
841 	Py_END_ALLOW_THREADS
842     }
843 
844     Py_DECREF(list);
845     Py_INCREF(Py_None);
846     return Py_None;
847 }
848 
849 /* Output buffer management
850  */
851 
852 static char_u *buffer = NULL;
853 static PyInt buffer_len = 0;
854 static PyInt buffer_size = 0;
855 
856 static writefn old_fn = NULL;
857 
858     static void
859 buffer_ensure(PyInt n)
860 {
861     PyInt new_size;
862     char_u *new_buffer;
863 
864     if (n < buffer_size)
865 	return;
866 
867     new_size = buffer_size;
868     while (new_size < n)
869 	new_size += 80;
870 
871     if (new_size != buffer_size)
872     {
873 	new_buffer = alloc((unsigned)new_size);
874 	if (new_buffer == NULL)
875 	    return;
876 
877 	if (buffer)
878 	{
879 	    memcpy(new_buffer, buffer, buffer_len);
880 	    vim_free(buffer);
881 	}
882 
883 	buffer = new_buffer;
884 	buffer_size = new_size;
885     }
886 }
887 
888     static void
889 PythonIO_Flush(void)
890 {
891     if (old_fn && buffer_len)
892     {
893 	buffer[buffer_len] = 0;
894 	old_fn(buffer);
895     }
896 
897     buffer_len = 0;
898 }
899 
900     static void
901 writer(writefn fn, char_u *str, PyInt n)
902 {
903     char_u *ptr;
904 
905     if (fn != old_fn && old_fn != NULL)
906 	PythonIO_Flush();
907 
908     old_fn = fn;
909 
910     while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL)
911     {
912 	PyInt len = ptr - str;
913 
914 	buffer_ensure(buffer_len + len + 1);
915 
916 	memcpy(buffer + buffer_len, str, len);
917 	buffer_len += len;
918 	buffer[buffer_len] = 0;
919 	fn(buffer);
920 	str = ptr + 1;
921 	n -= len + 1;
922 	buffer_len = 0;
923     }
924 
925     /* Put the remaining text into the buffer for later printing */
926     buffer_ensure(buffer_len + n + 1);
927     memcpy(buffer + buffer_len, str, n);
928     buffer_len += n;
929 }
930 
931 /***************/
932 
933 static OutputObject Output =
934 {
935     PyObject_HEAD_INIT(&OutputType)
936     0,
937     0
938 };
939 
940 static OutputObject Error =
941 {
942     PyObject_HEAD_INIT(&OutputType)
943     0,
944     1
945 };
946 
947     static int
948 PythonIO_Init(void)
949 {
950     /* Fixups... */
951     OutputType.ob_type = &PyType_Type;
952 
953     PySys_SetObject("stdout", (PyObject *)(void *)&Output);
954     PySys_SetObject("stderr", (PyObject *)(void *)&Error);
955 
956     if (PyErr_Occurred())
957     {
958 	EMSG(_("E264: Python: Error initialising I/O objects"));
959 	return -1;
960     }
961 
962     return 0;
963 }
964 
965 /******************************************************
966  * 3. Implementation of the Vim module for Python
967  */
968 
969 /* Vim module - Implementation functions
970  * -------------------------------------
971  */
972 
973 static PyObject *VimError;
974 
975 static PyObject *VimCommand(PyObject *, PyObject *);
976 static PyObject *VimEval(PyObject *, PyObject *);
977 
978 /* Window type - Implementation functions
979  * --------------------------------------
980  */
981 
982 typedef struct
983 {
984     PyObject_HEAD
985     win_T	*win;
986 }
987 WindowObject;
988 
989 #define INVALID_WINDOW_VALUE ((win_T *)(-1))
990 
991 #define WindowType_Check(obj) ((obj)->ob_type == &WindowType)
992 
993 static PyObject *WindowNew(win_T *);
994 
995 static void WindowDestructor(PyObject *);
996 static PyObject *WindowGetattr(PyObject *, char *);
997 static int WindowSetattr(PyObject *, char *, PyObject *);
998 static PyObject *WindowRepr(PyObject *);
999 
1000 /* Buffer type - Implementation functions
1001  * --------------------------------------
1002  */
1003 
1004 typedef struct
1005 {
1006     PyObject_HEAD
1007     buf_T *buf;
1008 }
1009 BufferObject;
1010 
1011 #define INVALID_BUFFER_VALUE ((buf_T *)(-1))
1012 
1013 #define BufferType_Check(obj) ((obj)->ob_type == &BufferType)
1014 
1015 static PyObject *BufferNew (buf_T *);
1016 
1017 static void BufferDestructor(PyObject *);
1018 static PyObject *BufferGetattr(PyObject *, char *);
1019 static PyObject *BufferRepr(PyObject *);
1020 
1021 static PyInt BufferLength(PyObject *);
1022 static PyObject *BufferItem(PyObject *, PyInt);
1023 static PyObject *BufferSlice(PyObject *, PyInt, PyInt);
1024 static PyInt BufferAssItem(PyObject *, PyInt, PyObject *);
1025 static PyInt BufferAssSlice(PyObject *, PyInt, PyInt, PyObject *);
1026 
1027 static PyObject *BufferAppend(PyObject *, PyObject *);
1028 static PyObject *BufferMark(PyObject *, PyObject *);
1029 static PyObject *BufferRange(PyObject *, PyObject *);
1030 
1031 /* Line range type - Implementation functions
1032  * --------------------------------------
1033  */
1034 
1035 typedef struct
1036 {
1037     PyObject_HEAD
1038     BufferObject *buf;
1039     PyInt start;
1040     PyInt end;
1041 }
1042 RangeObject;
1043 
1044 #define RangeType_Check(obj) ((obj)->ob_type == &RangeType)
1045 
1046 static PyObject *RangeNew(buf_T *, PyInt, PyInt);
1047 
1048 static void RangeDestructor(PyObject *);
1049 static PyObject *RangeGetattr(PyObject *, char *);
1050 static PyObject *RangeRepr(PyObject *);
1051 
1052 static PyInt RangeLength(PyObject *);
1053 static PyObject *RangeItem(PyObject *, PyInt);
1054 static PyObject *RangeSlice(PyObject *, PyInt, PyInt);
1055 static PyInt RangeAssItem(PyObject *, PyInt, PyObject *);
1056 static PyInt RangeAssSlice(PyObject *, PyInt, PyInt, PyObject *);
1057 
1058 static PyObject *RangeAppend(PyObject *, PyObject *);
1059 
1060 /* Window list type - Implementation functions
1061  * -------------------------------------------
1062  */
1063 
1064 static PyInt WinListLength(PyObject *);
1065 static PyObject *WinListItem(PyObject *, PyInt);
1066 
1067 /* Buffer list type - Implementation functions
1068  * -------------------------------------------
1069  */
1070 
1071 static PyInt BufListLength(PyObject *);
1072 static PyObject *BufListItem(PyObject *, PyInt);
1073 
1074 /* Current objects type - Implementation functions
1075  * -----------------------------------------------
1076  */
1077 
1078 static PyObject *CurrentGetattr(PyObject *, char *);
1079 static int CurrentSetattr(PyObject *, char *, PyObject *);
1080 
1081 /* Vim module - Definitions
1082  */
1083 
1084 static struct PyMethodDef VimMethods[] = {
1085     /* name,	     function,		calling,    documentation */
1086     {"command",	     VimCommand,	1,	    "Execute a Vim ex-mode command" },
1087     {"eval",	     VimEval,		1,	    "Evaluate an expression using Vim evaluator" },
1088     { NULL,	     NULL,		0,	    NULL }
1089 };
1090 
1091 /* Vim module - Implementation
1092  */
1093 /*ARGSUSED*/
1094     static PyObject *
1095 VimCommand(PyObject *self, PyObject *args)
1096 {
1097     char *cmd;
1098     PyObject *result;
1099 
1100     if (!PyArg_ParseTuple(args, "s", &cmd))
1101 	return NULL;
1102 
1103     PyErr_Clear();
1104 
1105     Py_BEGIN_ALLOW_THREADS
1106     Python_Lock_Vim();
1107 
1108     do_cmdline_cmd((char_u *)cmd);
1109     update_screen(VALID);
1110 
1111     Python_Release_Vim();
1112     Py_END_ALLOW_THREADS
1113 
1114     if (VimErrorCheck())
1115 	result = NULL;
1116     else
1117 	result = Py_None;
1118 
1119     Py_XINCREF(result);
1120     return result;
1121 }
1122 
1123 /*
1124  * Function to translate a typval_T into a PyObject; this will recursively
1125  * translate lists/dictionaries into their Python equivalents.
1126  *
1127  * The depth parameter is to avoid infinite recursion, set it to 1 when
1128  * you call VimToPython.
1129  */
1130     static PyObject *
1131 VimToPython(typval_T *our_tv, int depth, PyObject *lookupDict)
1132 {
1133     PyObject	*result;
1134     PyObject	*newObj;
1135     char	ptrBuf[NUMBUFLEN];
1136 
1137     /* Avoid infinite recursion */
1138     if (depth > 100)
1139     {
1140 	Py_INCREF(Py_None);
1141 	result = Py_None;
1142 	return result;
1143     }
1144 
1145     /* Check if we run into a recursive loop.  The item must be in lookupDict
1146      * then and we can use it again. */
1147     sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, (long_u)our_tv);
1148     result = PyDict_GetItemString(lookupDict, ptrBuf);
1149     if (result != NULL)
1150 	Py_INCREF(result);
1151     else if (our_tv->v_type == VAR_STRING)
1152     {
1153 	result = Py_BuildValue("s", our_tv->vval.v_string);
1154 	PyDict_SetItemString(lookupDict, ptrBuf, result);
1155     }
1156     else if (our_tv->v_type == VAR_NUMBER)
1157     {
1158 	char buf[NUMBUFLEN];
1159 
1160 	/* For backwards compatibility numbers are stored as strings. */
1161 	sprintf(buf, "%ld", (long)our_tv->vval.v_number);
1162 	result = Py_BuildValue("s", buf);
1163 	PyDict_SetItemString(lookupDict, ptrBuf, result);
1164     }
1165 #ifdef FEAT_FLOAT
1166     else if (our_tv->v_type == VAR_FLOAT)
1167     {
1168 	char buf[NUMBUFLEN];
1169 
1170 	sprintf(buf, "%f", our_tv->vval.v_float);
1171 	result = Py_BuildValue("s", buf);
1172 	PyDict_SetItemString(lookupDict, ptrBuf, result);
1173     }
1174 #endif
1175     else if (our_tv->v_type == VAR_LIST)
1176     {
1177 	list_T		*list = our_tv->vval.v_list;
1178 	listitem_T	*curr;
1179 
1180 	result = PyList_New(0);
1181 	PyDict_SetItemString(lookupDict, ptrBuf, result);
1182 
1183 	if (list != NULL)
1184 	{
1185 	    for (curr = list->lv_first; curr != NULL; curr = curr->li_next)
1186 	    {
1187 		newObj = VimToPython(&curr->li_tv, depth + 1, lookupDict);
1188 		PyList_Append(result, newObj);
1189 		Py_DECREF(newObj);
1190 	    }
1191 	}
1192     }
1193     else if (our_tv->v_type == VAR_DICT)
1194     {
1195 	result = PyDict_New();
1196 	PyDict_SetItemString(lookupDict, ptrBuf, result);
1197 
1198 	if (our_tv->vval.v_dict != NULL)
1199 	{
1200 	    hashtab_T	*ht = &our_tv->vval.v_dict->dv_hashtab;
1201 	    long_u	todo = ht->ht_used;
1202 	    hashitem_T	*hi;
1203 	    dictitem_T	*di;
1204 
1205 	    for (hi = ht->ht_array; todo > 0; ++hi)
1206 	    {
1207 		if (!HASHITEM_EMPTY(hi))
1208 		{
1209 		    --todo;
1210 
1211 		    di = dict_lookup(hi);
1212 		    newObj = VimToPython(&di->di_tv, depth + 1, lookupDict);
1213 		    PyDict_SetItemString(result, (char *)hi->hi_key, newObj);
1214 		    Py_DECREF(newObj);
1215 		}
1216 	    }
1217 	}
1218     }
1219     else
1220     {
1221 	Py_INCREF(Py_None);
1222 	result = Py_None;
1223     }
1224 
1225     return result;
1226 }
1227 
1228 /*ARGSUSED*/
1229     static PyObject *
1230 VimEval(PyObject *self, PyObject *args)
1231 {
1232 #ifdef FEAT_EVAL
1233     char	*expr;
1234     typval_T	*our_tv;
1235     PyObject	*result;
1236     PyObject    *lookup_dict;
1237 
1238     if (!PyArg_ParseTuple(args, "s", &expr))
1239 	return NULL;
1240 
1241     Py_BEGIN_ALLOW_THREADS
1242     Python_Lock_Vim();
1243     our_tv = eval_expr((char_u *)expr, NULL);
1244 
1245     Python_Release_Vim();
1246     Py_END_ALLOW_THREADS
1247 
1248     if (our_tv == NULL)
1249     {
1250 	PyErr_SetVim(_("invalid expression"));
1251 	return NULL;
1252     }
1253 
1254     /* Convert the Vim type into a Python type.  Create a dictionary that's
1255      * used to check for recursive loops. */
1256     lookup_dict = PyDict_New();
1257     result = VimToPython(our_tv, 1, lookup_dict);
1258     Py_DECREF(lookup_dict);
1259 
1260 
1261     Py_BEGIN_ALLOW_THREADS
1262     Python_Lock_Vim();
1263     free_tv(our_tv);
1264     Python_Release_Vim();
1265     Py_END_ALLOW_THREADS
1266 
1267     return result;
1268 #else
1269     PyErr_SetVim(_("expressions disabled at compile time"));
1270     return NULL;
1271 #endif
1272 }
1273 
1274 /* Common routines for buffers and line ranges
1275  * -------------------------------------------
1276  */
1277     static int
1278 CheckBuffer(BufferObject *this)
1279 {
1280     if (this->buf == INVALID_BUFFER_VALUE)
1281     {
1282 	PyErr_SetVim(_("attempt to refer to deleted buffer"));
1283 	return -1;
1284     }
1285 
1286     return 0;
1287 }
1288 
1289     static PyObject *
1290 RBItem(BufferObject *self, PyInt n, PyInt start, PyInt end)
1291 {
1292     if (CheckBuffer(self))
1293 	return NULL;
1294 
1295     if (n < 0 || n > end - start)
1296     {
1297 	PyErr_SetString(PyExc_IndexError, _("line number out of range"));
1298 	return NULL;
1299     }
1300 
1301     return GetBufferLine(self->buf, n+start);
1302 }
1303 
1304     static PyObject *
1305 RBSlice(BufferObject *self, PyInt lo, PyInt hi, PyInt start, PyInt end)
1306 {
1307     PyInt size;
1308 
1309     if (CheckBuffer(self))
1310 	return NULL;
1311 
1312     size = end - start + 1;
1313 
1314     if (lo < 0)
1315 	lo = 0;
1316     else if (lo > size)
1317 	lo = size;
1318     if (hi < 0)
1319 	hi = 0;
1320     if (hi < lo)
1321 	hi = lo;
1322     else if (hi > size)
1323 	hi = size;
1324 
1325     return GetBufferLineList(self->buf, lo+start, hi+start);
1326 }
1327 
1328     static PyInt
1329 RBAssItem(BufferObject *self, PyInt n, PyObject *val, PyInt start, PyInt end, PyInt *new_end)
1330 {
1331     PyInt len_change;
1332 
1333     if (CheckBuffer(self))
1334 	return -1;
1335 
1336     if (n < 0 || n > end - start)
1337     {
1338 	PyErr_SetString(PyExc_IndexError, _("line number out of range"));
1339 	return -1;
1340     }
1341 
1342     if (SetBufferLine(self->buf, n+start, val, &len_change) == FAIL)
1343 	return -1;
1344 
1345     if (new_end)
1346 	*new_end = end + len_change;
1347 
1348     return 0;
1349 }
1350 
1351     static PyInt
1352 RBAssSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, PyInt start, PyInt end, PyInt *new_end)
1353 {
1354     PyInt size;
1355     PyInt len_change;
1356 
1357     /* Self must be a valid buffer */
1358     if (CheckBuffer(self))
1359 	return -1;
1360 
1361     /* Sort out the slice range */
1362     size = end - start + 1;
1363 
1364     if (lo < 0)
1365 	lo = 0;
1366     else if (lo > size)
1367 	lo = size;
1368     if (hi < 0)
1369 	hi = 0;
1370     if (hi < lo)
1371 	hi = lo;
1372     else if (hi > size)
1373 	hi = size;
1374 
1375     if (SetBufferLineList(self->buf, lo+start, hi+start, val, &len_change) == FAIL)
1376 	return -1;
1377 
1378     if (new_end)
1379 	*new_end = end + len_change;
1380 
1381     return 0;
1382 }
1383 
1384     static PyObject *
1385 RBAppend(BufferObject *self, PyObject *args, PyInt start, PyInt end, PyInt *new_end)
1386 {
1387     PyObject *lines;
1388     PyInt len_change;
1389     PyInt max;
1390     PyInt n;
1391 
1392     if (CheckBuffer(self))
1393 	return NULL;
1394 
1395     max = n = end - start + 1;
1396 
1397     if (!PyArg_ParseTuple(args, "O|" Py_ssize_t_fmt, &lines, &n))
1398 	return NULL;
1399 
1400     if (n < 0 || n > max)
1401     {
1402 	PyErr_SetString(PyExc_ValueError, _("line number out of range"));
1403 	return NULL;
1404     }
1405 
1406     if (InsertBufferLines(self->buf, n + start - 1, lines, &len_change) == FAIL)
1407 	return NULL;
1408 
1409     if (new_end)
1410 	*new_end = end + len_change;
1411 
1412     Py_INCREF(Py_None);
1413     return Py_None;
1414 }
1415 
1416 
1417 /* Buffer object - Definitions
1418  */
1419 
1420 static struct PyMethodDef BufferMethods[] = {
1421     /* name,	    function,		calling,    documentation */
1422     {"append",	    BufferAppend,	1,	    "Append data to Vim buffer" },
1423     {"mark",	    BufferMark,		1,	    "Return (row,col) representing position of named mark" },
1424     {"range",	    BufferRange,	1,	    "Return a range object which represents the part of the given buffer between line numbers s and e" },
1425     { NULL,	    NULL,		0,	    NULL }
1426 };
1427 
1428 static PySequenceMethods BufferAsSeq = {
1429     (PyInquiry)		BufferLength,	    /* sq_length,    len(x)   */
1430     (binaryfunc)	0, /* BufferConcat, */	     /* sq_concat,    x+y      */
1431     (PyIntArgFunc)	0, /* BufferRepeat, */	     /* sq_repeat,    x*n      */
1432     (PyIntArgFunc)	BufferItem,	    /* sq_item,      x[i]     */
1433     (PyIntIntArgFunc)	BufferSlice,	    /* sq_slice,     x[i:j]   */
1434     (PyIntObjArgProc)	BufferAssItem,	    /* sq_ass_item,  x[i]=v   */
1435     (PyIntIntObjArgProc)	BufferAssSlice,     /* sq_ass_slice, x[i:j]=v */
1436 };
1437 
1438 static PyTypeObject BufferType = {
1439     PyObject_HEAD_INIT(0)
1440     0,
1441     "buffer",
1442     sizeof(BufferObject),
1443     0,
1444 
1445     (destructor)    BufferDestructor,	/* tp_dealloc,	refcount==0  */
1446     (printfunc)     0,			/* tp_print,	print x      */
1447     (getattrfunc)   BufferGetattr,	/* tp_getattr,	x.attr	     */
1448     (setattrfunc)   0,			/* tp_setattr,	x.attr=v     */
1449     (cmpfunc)	    0,			/* tp_compare,	x>y	     */
1450     (reprfunc)	    BufferRepr,		/* tp_repr,	`x`, print x */
1451 
1452     0,		    /* as number */
1453     &BufferAsSeq,   /* as sequence */
1454     0,		    /* as mapping */
1455 
1456     (hashfunc) 0,			/* tp_hash, dict(x) */
1457     (ternaryfunc) 0,			/* tp_call, x()     */
1458     (reprfunc) 0,			/* tp_str,  str(x)  */
1459 };
1460 
1461 /* Buffer object - Implementation
1462  */
1463 
1464     static PyObject *
1465 BufferNew(buf_T *buf)
1466 {
1467     /* We need to handle deletion of buffers underneath us.
1468      * If we add a "b_python_ref" field to the buf_T structure,
1469      * then we can get at it in buf_freeall() in vim. We then
1470      * need to create only ONE Python object per buffer - if
1471      * we try to create a second, just INCREF the existing one
1472      * and return it. The (single) Python object referring to
1473      * the buffer is stored in "b_python_ref".
1474      * Question: what to do on a buf_freeall(). We'll probably
1475      * have to either delete the Python object (DECREF it to
1476      * zero - a bad idea, as it leaves dangling refs!) or
1477      * set the buf_T * value to an invalid value (-1?), which
1478      * means we need checks in all access functions... Bah.
1479      */
1480 
1481     BufferObject *self;
1482 
1483     if (buf->b_python_ref != NULL)
1484     {
1485 	self = buf->b_python_ref;
1486 	Py_INCREF(self);
1487     }
1488     else
1489     {
1490 	self = PyObject_NEW(BufferObject, &BufferType);
1491 	if (self == NULL)
1492 	    return NULL;
1493 	self->buf = buf;
1494 	buf->b_python_ref = self;
1495     }
1496 
1497     return (PyObject *)(self);
1498 }
1499 
1500     static void
1501 BufferDestructor(PyObject *self)
1502 {
1503     BufferObject *this = (BufferObject *)(self);
1504 
1505     if (this->buf && this->buf != INVALID_BUFFER_VALUE)
1506 	this->buf->b_python_ref = NULL;
1507 
1508     Py_DECREF(self);
1509 }
1510 
1511     static PyObject *
1512 BufferGetattr(PyObject *self, char *name)
1513 {
1514     BufferObject *this = (BufferObject *)(self);
1515 
1516     if (CheckBuffer(this))
1517 	return NULL;
1518 
1519     if (strcmp(name, "name") == 0)
1520 	return Py_BuildValue("s", this->buf->b_ffname);
1521     else if (strcmp(name, "number") == 0)
1522 	return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum);
1523     else if (strcmp(name,"__members__") == 0)
1524 	return Py_BuildValue("[ss]", "name", "number");
1525     else
1526 	return Py_FindMethod(BufferMethods, self, name);
1527 }
1528 
1529     static PyObject *
1530 BufferRepr(PyObject *self)
1531 {
1532     static char repr[100];
1533     BufferObject *this = (BufferObject *)(self);
1534 
1535     if (this->buf == INVALID_BUFFER_VALUE)
1536     {
1537 	vim_snprintf(repr, 100, _("<buffer object (deleted) at %p>"), (self));
1538 	return PyString_FromString(repr);
1539     }
1540     else
1541     {
1542 	char *name = (char *)this->buf->b_fname;
1543 	PyInt len;
1544 
1545 	if (name == NULL)
1546 	    name = "";
1547 	len = strlen(name);
1548 
1549 	if (len > 35)
1550 	    name = name + (35 - len);
1551 
1552 	vim_snprintf(repr, 100, "<buffer %s%s>", len > 35 ? "..." : "", name);
1553 
1554 	return PyString_FromString(repr);
1555     }
1556 }
1557 
1558 /******************/
1559 
1560     static PyInt
1561 BufferLength(PyObject *self)
1562 {
1563     /* HOW DO WE SIGNAL AN ERROR FROM THIS FUNCTION? */
1564     if (CheckBuffer((BufferObject *)(self)))
1565 	return -1; /* ??? */
1566 
1567     return (((BufferObject *)(self))->buf->b_ml.ml_line_count);
1568 }
1569 
1570     static PyObject *
1571 BufferItem(PyObject *self, PyInt n)
1572 {
1573     return RBItem((BufferObject *)(self), n, 1,
1574 		  (int)((BufferObject *)(self))->buf->b_ml.ml_line_count);
1575 }
1576 
1577     static PyObject *
1578 BufferSlice(PyObject *self, PyInt lo, PyInt hi)
1579 {
1580     return RBSlice((BufferObject *)(self), lo, hi, 1,
1581 		   (int)((BufferObject *)(self))->buf->b_ml.ml_line_count);
1582 }
1583 
1584     static PyInt
1585 BufferAssItem(PyObject *self, PyInt n, PyObject *val)
1586 {
1587     return RBAssItem((BufferObject *)(self), n, val, 1,
1588 		     (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1589 		     NULL);
1590 }
1591 
1592     static PyInt
1593 BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
1594 {
1595     return RBAssSlice((BufferObject *)(self), lo, hi, val, 1,
1596 		      (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1597 		      NULL);
1598 }
1599 
1600     static PyObject *
1601 BufferAppend(PyObject *self, PyObject *args)
1602 {
1603     return RBAppend((BufferObject *)(self), args, 1,
1604 		    (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1605 		    NULL);
1606 }
1607 
1608     static PyObject *
1609 BufferMark(PyObject *self, PyObject *args)
1610 {
1611     pos_T	*posp;
1612     char	mark;
1613     buf_T	*curbuf_save;
1614 
1615     if (CheckBuffer((BufferObject *)(self)))
1616 	return NULL;
1617 
1618     if (!PyArg_ParseTuple(args, "c", &mark))
1619 	return NULL;
1620 
1621     curbuf_save = curbuf;
1622     curbuf = ((BufferObject *)(self))->buf;
1623     posp = getmark(mark, FALSE);
1624     curbuf = curbuf_save;
1625 
1626     if (posp == NULL)
1627     {
1628 	PyErr_SetVim(_("invalid mark name"));
1629 	return NULL;
1630     }
1631 
1632     /* Ckeck for keyboard interrupt */
1633     if (VimErrorCheck())
1634 	return NULL;
1635 
1636     if (posp->lnum <= 0)
1637     {
1638 	/* Or raise an error? */
1639 	Py_INCREF(Py_None);
1640 	return Py_None;
1641     }
1642 
1643     return Py_BuildValue("(ll)", (long)(posp->lnum), (long)(posp->col));
1644 }
1645 
1646     static PyObject *
1647 BufferRange(PyObject *self, PyObject *args)
1648 {
1649     PyInt start;
1650     PyInt end;
1651 
1652     if (CheckBuffer((BufferObject *)(self)))
1653 	return NULL;
1654 
1655     if (!PyArg_ParseTuple(args, Py_ssize_t_fmt Py_ssize_t_fmt, &start, &end))
1656 	return NULL;
1657 
1658     return RangeNew(((BufferObject *)(self))->buf, start, end);
1659 }
1660 
1661 /* Line range object - Definitions
1662  */
1663 
1664 static struct PyMethodDef RangeMethods[] = {
1665     /* name,	    function,		calling,    documentation */
1666     {"append",	    RangeAppend,	1,	    "Append data to the Vim range" },
1667     { NULL,	    NULL,		0,	    NULL }
1668 };
1669 
1670 static PySequenceMethods RangeAsSeq = {
1671     (PyInquiry)		RangeLength,	    /* sq_length,    len(x)   */
1672     (binaryfunc)	0, /* RangeConcat, */	     /* sq_concat,    x+y      */
1673     (PyIntArgFunc)	0, /* RangeRepeat, */	     /* sq_repeat,    x*n      */
1674     (PyIntArgFunc)	RangeItem,	    /* sq_item,      x[i]     */
1675     (PyIntIntArgFunc)	RangeSlice,	    /* sq_slice,     x[i:j]   */
1676     (PyIntObjArgProc)	RangeAssItem,	    /* sq_ass_item,  x[i]=v   */
1677     (PyIntIntObjArgProc)	RangeAssSlice,	    /* sq_ass_slice, x[i:j]=v */
1678 };
1679 
1680 static PyTypeObject RangeType = {
1681     PyObject_HEAD_INIT(0)
1682     0,
1683     "range",
1684     sizeof(RangeObject),
1685     0,
1686 
1687     (destructor)    RangeDestructor,	/* tp_dealloc,	refcount==0  */
1688     (printfunc)     0,			/* tp_print,	print x      */
1689     (getattrfunc)   RangeGetattr,	/* tp_getattr,	x.attr	     */
1690     (setattrfunc)   0,			/* tp_setattr,	x.attr=v     */
1691     (cmpfunc)	    0,			/* tp_compare,	x>y	     */
1692     (reprfunc)	    RangeRepr,		/* tp_repr,	`x`, print x */
1693 
1694     0,		    /* as number */
1695     &RangeAsSeq,    /* as sequence */
1696     0,		    /* as mapping */
1697 
1698     (hashfunc) 0,			/* tp_hash, dict(x) */
1699     (ternaryfunc) 0,			/* tp_call, x()     */
1700     (reprfunc) 0,			/* tp_str,  str(x)  */
1701 };
1702 
1703 /* Line range object - Implementation
1704  */
1705 
1706     static PyObject *
1707 RangeNew(buf_T *buf, PyInt start, PyInt end)
1708 {
1709     BufferObject *bufr;
1710     RangeObject *self;
1711     self = PyObject_NEW(RangeObject, &RangeType);
1712     if (self == NULL)
1713 	return NULL;
1714 
1715     bufr = (BufferObject *)BufferNew(buf);
1716     if (bufr == NULL)
1717     {
1718 	Py_DECREF(self);
1719 	return NULL;
1720     }
1721     Py_INCREF(bufr);
1722 
1723     self->buf = bufr;
1724     self->start = start;
1725     self->end = end;
1726 
1727     return (PyObject *)(self);
1728 }
1729 
1730     static void
1731 RangeDestructor(PyObject *self)
1732 {
1733     Py_DECREF(((RangeObject *)(self))->buf);
1734     Py_DECREF(self);
1735 }
1736 
1737     static PyObject *
1738 RangeGetattr(PyObject *self, char *name)
1739 {
1740     if (strcmp(name, "start") == 0)
1741 	return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->start - 1);
1742     else if (strcmp(name, "end") == 0)
1743 	return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->end - 1);
1744     else
1745 	return Py_FindMethod(RangeMethods, self, name);
1746 }
1747 
1748     static PyObject *
1749 RangeRepr(PyObject *self)
1750 {
1751     static char repr[100];
1752     RangeObject *this = (RangeObject *)(self);
1753 
1754     if (this->buf->buf == INVALID_BUFFER_VALUE)
1755     {
1756 	vim_snprintf(repr, 100, "<range object (for deleted buffer) at %p>",
1757 								      (self));
1758 	return PyString_FromString(repr);
1759     }
1760     else
1761     {
1762 	char *name = (char *)this->buf->buf->b_fname;
1763 	int len;
1764 
1765 	if (name == NULL)
1766 	    name = "";
1767 	len = (int)strlen(name);
1768 
1769 	if (len > 45)
1770 	    name = name + (45 - len);
1771 
1772 	vim_snprintf(repr, 100, "<range %s%s (%d:%d)>",
1773 		len > 45 ? "..." : "", name,
1774 		this->start, this->end);
1775 
1776 	return PyString_FromString(repr);
1777     }
1778 }
1779 
1780 /****************/
1781 
1782     static PyInt
1783 RangeLength(PyObject *self)
1784 {
1785     /* HOW DO WE SIGNAL AN ERROR FROM THIS FUNCTION? */
1786     if (CheckBuffer(((RangeObject *)(self))->buf))
1787 	return -1; /* ??? */
1788 
1789     return (((RangeObject *)(self))->end - ((RangeObject *)(self))->start + 1);
1790 }
1791 
1792     static PyObject *
1793 RangeItem(PyObject *self, PyInt n)
1794 {
1795     return RBItem(((RangeObject *)(self))->buf, n,
1796 		  ((RangeObject *)(self))->start,
1797 		  ((RangeObject *)(self))->end);
1798 }
1799 
1800     static PyObject *
1801 RangeSlice(PyObject *self, PyInt lo, PyInt hi)
1802 {
1803     return RBSlice(((RangeObject *)(self))->buf, lo, hi,
1804 		   ((RangeObject *)(self))->start,
1805 		   ((RangeObject *)(self))->end);
1806 }
1807 
1808     static PyInt
1809 RangeAssItem(PyObject *self, PyInt n, PyObject *val)
1810 {
1811     return RBAssItem(((RangeObject *)(self))->buf, n, val,
1812 		     ((RangeObject *)(self))->start,
1813 		     ((RangeObject *)(self))->end,
1814 		     &((RangeObject *)(self))->end);
1815 }
1816 
1817     static PyInt
1818 RangeAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
1819 {
1820     return RBAssSlice(((RangeObject *)(self))->buf, lo, hi, val,
1821 		      ((RangeObject *)(self))->start,
1822 		      ((RangeObject *)(self))->end,
1823 		      &((RangeObject *)(self))->end);
1824 }
1825 
1826     static PyObject *
1827 RangeAppend(PyObject *self, PyObject *args)
1828 {
1829     return RBAppend(((RangeObject *)(self))->buf, args,
1830 		    ((RangeObject *)(self))->start,
1831 		    ((RangeObject *)(self))->end,
1832 		    &((RangeObject *)(self))->end);
1833 }
1834 
1835 /* Buffer list object - Definitions
1836  */
1837 
1838 typedef struct
1839 {
1840     PyObject_HEAD
1841 }
1842 BufListObject;
1843 
1844 static PySequenceMethods BufListAsSeq = {
1845     (PyInquiry)		BufListLength,	    /* sq_length,    len(x)   */
1846     (binaryfunc)	0,		    /* sq_concat,    x+y      */
1847     (PyIntArgFunc)	0,		    /* sq_repeat,    x*n      */
1848     (PyIntArgFunc)	BufListItem,	    /* sq_item,      x[i]     */
1849     (PyIntIntArgFunc)	0,		    /* sq_slice,     x[i:j]   */
1850     (PyIntObjArgProc)	0,		    /* sq_ass_item,  x[i]=v   */
1851     (PyIntIntObjArgProc)	0,		    /* sq_ass_slice, x[i:j]=v */
1852 };
1853 
1854 static PyTypeObject BufListType = {
1855     PyObject_HEAD_INIT(0)
1856     0,
1857     "buffer list",
1858     sizeof(BufListObject),
1859     0,
1860 
1861     (destructor)    0,			/* tp_dealloc,	refcount==0  */
1862     (printfunc)     0,			/* tp_print,	print x      */
1863     (getattrfunc)   0,			/* tp_getattr,	x.attr	     */
1864     (setattrfunc)   0,			/* tp_setattr,	x.attr=v     */
1865     (cmpfunc)	    0,			/* tp_compare,	x>y	     */
1866     (reprfunc)	    0,			/* tp_repr,	`x`, print x */
1867 
1868     0,		    /* as number */
1869     &BufListAsSeq,  /* as sequence */
1870     0,		    /* as mapping */
1871 
1872     (hashfunc) 0,			/* tp_hash, dict(x) */
1873     (ternaryfunc) 0,			/* tp_call, x()     */
1874     (reprfunc) 0,			/* tp_str,  str(x)  */
1875 };
1876 
1877 /* Buffer list object - Implementation
1878  */
1879 
1880 /*ARGSUSED*/
1881     static PyInt
1882 BufListLength(PyObject *self)
1883 {
1884     buf_T	*b = firstbuf;
1885     PyInt	n = 0;
1886 
1887     while (b)
1888     {
1889 	++n;
1890 	b = b->b_next;
1891     }
1892 
1893     return n;
1894 }
1895 
1896 /*ARGSUSED*/
1897     static PyObject *
1898 BufListItem(PyObject *self, PyInt n)
1899 {
1900     buf_T *b;
1901 
1902     for (b = firstbuf; b; b = b->b_next, --n)
1903     {
1904 	if (n == 0)
1905 	    return BufferNew(b);
1906     }
1907 
1908     PyErr_SetString(PyExc_IndexError, _("no such buffer"));
1909     return NULL;
1910 }
1911 
1912 /* Window object - Definitions
1913  */
1914 
1915 static struct PyMethodDef WindowMethods[] = {
1916     /* name,	    function,		calling,    documentation */
1917     { NULL,	    NULL,		0,	    NULL }
1918 };
1919 
1920 static PyTypeObject WindowType = {
1921     PyObject_HEAD_INIT(0)
1922     0,
1923     "window",
1924     sizeof(WindowObject),
1925     0,
1926 
1927     (destructor)    WindowDestructor,	/* tp_dealloc,	refcount==0  */
1928     (printfunc)     0,			/* tp_print,	print x      */
1929     (getattrfunc)   WindowGetattr,	/* tp_getattr,	x.attr	     */
1930     (setattrfunc)   WindowSetattr,	/* tp_setattr,	x.attr=v     */
1931     (cmpfunc)	    0,			/* tp_compare,	x>y	     */
1932     (reprfunc)	    WindowRepr,		/* tp_repr,	`x`, print x */
1933 
1934     0,		    /* as number */
1935     0,		    /* as sequence */
1936     0,		    /* as mapping */
1937 
1938     (hashfunc) 0,			/* tp_hash, dict(x) */
1939     (ternaryfunc) 0,			/* tp_call, x()     */
1940     (reprfunc) 0,			/* tp_str,  str(x)  */
1941 };
1942 
1943 /* Window object - Implementation
1944  */
1945 
1946     static PyObject *
1947 WindowNew(win_T *win)
1948 {
1949     /* We need to handle deletion of windows underneath us.
1950      * If we add a "w_python_ref" field to the win_T structure,
1951      * then we can get at it in win_free() in vim. We then
1952      * need to create only ONE Python object per window - if
1953      * we try to create a second, just INCREF the existing one
1954      * and return it. The (single) Python object referring to
1955      * the window is stored in "w_python_ref".
1956      * On a win_free() we set the Python object's win_T* field
1957      * to an invalid value. We trap all uses of a window
1958      * object, and reject them if the win_T* field is invalid.
1959      */
1960 
1961     WindowObject *self;
1962 
1963     if (win->w_python_ref)
1964     {
1965 	self = win->w_python_ref;
1966 	Py_INCREF(self);
1967     }
1968     else
1969     {
1970 	self = PyObject_NEW(WindowObject, &WindowType);
1971 	if (self == NULL)
1972 	    return NULL;
1973 	self->win = win;
1974 	win->w_python_ref = self;
1975     }
1976 
1977     return (PyObject *)(self);
1978 }
1979 
1980     static void
1981 WindowDestructor(PyObject *self)
1982 {
1983     WindowObject *this = (WindowObject *)(self);
1984 
1985     if (this->win && this->win != INVALID_WINDOW_VALUE)
1986 	this->win->w_python_ref = NULL;
1987 
1988     Py_DECREF(self);
1989 }
1990 
1991     static int
1992 CheckWindow(WindowObject *this)
1993 {
1994     if (this->win == INVALID_WINDOW_VALUE)
1995     {
1996 	PyErr_SetVim(_("attempt to refer to deleted window"));
1997 	return -1;
1998     }
1999 
2000     return 0;
2001 }
2002 
2003     static PyObject *
2004 WindowGetattr(PyObject *self, char *name)
2005 {
2006     WindowObject *this = (WindowObject *)(self);
2007 
2008     if (CheckWindow(this))
2009 	return NULL;
2010 
2011     if (strcmp(name, "buffer") == 0)
2012 	return (PyObject *)BufferNew(this->win->w_buffer);
2013     else if (strcmp(name, "cursor") == 0)
2014     {
2015 	pos_T *pos = &this->win->w_cursor;
2016 
2017 	return Py_BuildValue("(ll)", (long)(pos->lnum), (long)(pos->col));
2018     }
2019     else if (strcmp(name, "height") == 0)
2020 	return Py_BuildValue("l", (long)(this->win->w_height));
2021 #ifdef FEAT_VERTSPLIT
2022     else if (strcmp(name, "width") == 0)
2023 	return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
2024 #endif
2025     else if (strcmp(name,"__members__") == 0)
2026 	return Py_BuildValue("[sss]", "buffer", "cursor", "height");
2027     else
2028 	return Py_FindMethod(WindowMethods, self, name);
2029 }
2030 
2031     static int
2032 WindowSetattr(PyObject *self, char *name, PyObject *val)
2033 {
2034     WindowObject *this = (WindowObject *)(self);
2035 
2036     if (CheckWindow(this))
2037 	return -1;
2038 
2039     if (strcmp(name, "buffer") == 0)
2040     {
2041 	PyErr_SetString(PyExc_TypeError, _("readonly attribute"));
2042 	return -1;
2043     }
2044     else if (strcmp(name, "cursor") == 0)
2045     {
2046 	long lnum;
2047 	long col;
2048 
2049 	if (!PyArg_Parse(val, "(ll)", &lnum, &col))
2050 	    return -1;
2051 
2052 	if (lnum <= 0 || lnum > this->win->w_buffer->b_ml.ml_line_count)
2053 	{
2054 	    PyErr_SetVim(_("cursor position outside buffer"));
2055 	    return -1;
2056 	}
2057 
2058 	/* Check for keyboard interrupts */
2059 	if (VimErrorCheck())
2060 	    return -1;
2061 
2062 	/* NO CHECK ON COLUMN - SEEMS NOT TO MATTER */
2063 
2064 	this->win->w_cursor.lnum = lnum;
2065 	this->win->w_cursor.col = col;
2066 	update_screen(VALID);
2067 
2068 	return 0;
2069     }
2070     else if (strcmp(name, "height") == 0)
2071     {
2072 	int	height;
2073 	win_T	*savewin;
2074 
2075 	if (!PyArg_Parse(val, "i", &height))
2076 	    return -1;
2077 
2078 #ifdef FEAT_GUI
2079 	need_mouse_correct = TRUE;
2080 #endif
2081 	savewin = curwin;
2082 	curwin = this->win;
2083 	win_setheight(height);
2084 	curwin = savewin;
2085 
2086 	/* Check for keyboard interrupts */
2087 	if (VimErrorCheck())
2088 	    return -1;
2089 
2090 	return 0;
2091     }
2092 #ifdef FEAT_VERTSPLIT
2093     else if (strcmp(name, "width") == 0)
2094     {
2095 	int	width;
2096 	win_T	*savewin;
2097 
2098 	if (!PyArg_Parse(val, "i", &width))
2099 	    return -1;
2100 
2101 #ifdef FEAT_GUI
2102 	need_mouse_correct = TRUE;
2103 #endif
2104 	savewin = curwin;
2105 	curwin = this->win;
2106 	win_setwidth(width);
2107 	curwin = savewin;
2108 
2109 	/* Check for keyboard interrupts */
2110 	if (VimErrorCheck())
2111 	    return -1;
2112 
2113 	return 0;
2114     }
2115 #endif
2116     else
2117     {
2118 	PyErr_SetString(PyExc_AttributeError, name);
2119 	return -1;
2120     }
2121 }
2122 
2123     static PyObject *
2124 WindowRepr(PyObject *self)
2125 {
2126     static char repr[100];
2127     WindowObject *this = (WindowObject *)(self);
2128 
2129     if (this->win == INVALID_WINDOW_VALUE)
2130     {
2131 	vim_snprintf(repr, 100, _("<window object (deleted) at %p>"), (self));
2132 	return PyString_FromString(repr);
2133     }
2134     else
2135     {
2136 	int	i = 0;
2137 	win_T	*w;
2138 
2139 	for (w = firstwin; w != NULL && w != this->win; w = W_NEXT(w))
2140 	    ++i;
2141 
2142 	if (w == NULL)
2143 	    vim_snprintf(repr, 100, _("<window object (unknown) at %p>"),
2144 								      (self));
2145 	else
2146 	    vim_snprintf(repr, 100, _("<window %d>"), i);
2147 
2148 	return PyString_FromString(repr);
2149     }
2150 }
2151 
2152 /* Window list object - Definitions
2153  */
2154 
2155 typedef struct
2156 {
2157     PyObject_HEAD
2158 }
2159 WinListObject;
2160 
2161 static PySequenceMethods WinListAsSeq = {
2162     (PyInquiry)		WinListLength,	    /* sq_length,    len(x)   */
2163     (binaryfunc)	0,		    /* sq_concat,    x+y      */
2164     (PyIntArgFunc)	0,		    /* sq_repeat,    x*n      */
2165     (PyIntArgFunc)	WinListItem,	    /* sq_item,      x[i]     */
2166     (PyIntIntArgFunc)	0,		    /* sq_slice,     x[i:j]   */
2167     (PyIntObjArgProc)	0,		    /* sq_ass_item,  x[i]=v   */
2168     (PyIntIntObjArgProc)	0,		    /* sq_ass_slice, x[i:j]=v */
2169 };
2170 
2171 static PyTypeObject WinListType = {
2172     PyObject_HEAD_INIT(0)
2173     0,
2174     "window list",
2175     sizeof(WinListObject),
2176     0,
2177 
2178     (destructor)    0,			/* tp_dealloc,	refcount==0  */
2179     (printfunc)     0,			/* tp_print,	print x      */
2180     (getattrfunc)   0,			/* tp_getattr,	x.attr	     */
2181     (setattrfunc)   0,			/* tp_setattr,	x.attr=v     */
2182     (cmpfunc)	    0,			/* tp_compare,	x>y	     */
2183     (reprfunc)	    0,			/* tp_repr,	`x`, print x */
2184 
2185     0,		    /* as number */
2186     &WinListAsSeq,  /* as sequence */
2187     0,		    /* as mapping */
2188 
2189     (hashfunc) 0,			/* tp_hash, dict(x) */
2190     (ternaryfunc) 0,			/* tp_call, x()     */
2191     (reprfunc) 0,			/* tp_str,  str(x)  */
2192 };
2193 
2194 /* Window list object - Implementation
2195  */
2196 /*ARGSUSED*/
2197     static PyInt
2198 WinListLength(PyObject *self)
2199 {
2200     win_T	*w = firstwin;
2201     PyInt	n = 0;
2202 
2203     while (w != NULL)
2204     {
2205 	++n;
2206 	w = W_NEXT(w);
2207     }
2208 
2209     return n;
2210 }
2211 
2212 /*ARGSUSED*/
2213     static PyObject *
2214 WinListItem(PyObject *self, PyInt n)
2215 {
2216     win_T *w;
2217 
2218     for (w = firstwin; w != NULL; w = W_NEXT(w), --n)
2219 	if (n == 0)
2220 	    return WindowNew(w);
2221 
2222     PyErr_SetString(PyExc_IndexError, _("no such window"));
2223     return NULL;
2224 }
2225 
2226 /* Current items object - Definitions
2227  */
2228 
2229 typedef struct
2230 {
2231     PyObject_HEAD
2232 }
2233 CurrentObject;
2234 
2235 static PyTypeObject CurrentType = {
2236     PyObject_HEAD_INIT(0)
2237     0,
2238     "current data",
2239     sizeof(CurrentObject),
2240     0,
2241 
2242     (destructor)    0,			/* tp_dealloc,	refcount==0  */
2243     (printfunc)     0,			/* tp_print,	print x      */
2244     (getattrfunc)   CurrentGetattr,	/* tp_getattr,	x.attr	     */
2245     (setattrfunc)   CurrentSetattr,	/* tp_setattr,	x.attr=v     */
2246     (cmpfunc)	    0,			/* tp_compare,	x>y	     */
2247     (reprfunc)	    0,			/* tp_repr,	`x`, print x */
2248 
2249     0,		    /* as number */
2250     0,		    /* as sequence */
2251     0,		    /* as mapping */
2252 
2253     (hashfunc) 0,			/* tp_hash, dict(x) */
2254     (ternaryfunc) 0,			/* tp_call, x()     */
2255     (reprfunc) 0,			/* tp_str,  str(x)  */
2256 };
2257 
2258 /* Current items object - Implementation
2259  */
2260 /*ARGSUSED*/
2261     static PyObject *
2262 CurrentGetattr(PyObject *self, char *name)
2263 {
2264     if (strcmp(name, "buffer") == 0)
2265 	return (PyObject *)BufferNew(curbuf);
2266     else if (strcmp(name, "window") == 0)
2267 	return (PyObject *)WindowNew(curwin);
2268     else if (strcmp(name, "line") == 0)
2269 	return GetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum);
2270     else if (strcmp(name, "range") == 0)
2271 	return RangeNew(curbuf, RangeStart, RangeEnd);
2272     else if (strcmp(name,"__members__") == 0)
2273 	return Py_BuildValue("[ssss]", "buffer", "window", "line", "range");
2274     else
2275     {
2276 	PyErr_SetString(PyExc_AttributeError, name);
2277 	return NULL;
2278     }
2279 }
2280 
2281 /*ARGSUSED*/
2282     static int
2283 CurrentSetattr(PyObject *self, char *name, PyObject *value)
2284 {
2285     if (strcmp(name, "line") == 0)
2286     {
2287 	if (SetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum, value, NULL) == FAIL)
2288 	    return -1;
2289 
2290 	return 0;
2291     }
2292     else
2293     {
2294 	PyErr_SetString(PyExc_AttributeError, name);
2295 	return -1;
2296     }
2297 }
2298 
2299 /* External interface
2300  */
2301 
2302     void
2303 python_buffer_free(buf_T *buf)
2304 {
2305     if (buf->b_python_ref != NULL)
2306     {
2307 	BufferObject *bp = buf->b_python_ref;
2308 	bp->buf = INVALID_BUFFER_VALUE;
2309 	buf->b_python_ref = NULL;
2310     }
2311 }
2312 
2313 #if defined(FEAT_WINDOWS) || defined(PROTO)
2314     void
2315 python_window_free(win_T *win)
2316 {
2317     if (win->w_python_ref != NULL)
2318     {
2319 	WindowObject *wp = win->w_python_ref;
2320 	wp->win = INVALID_WINDOW_VALUE;
2321 	win->w_python_ref = NULL;
2322     }
2323 }
2324 #endif
2325 
2326 static BufListObject TheBufferList =
2327 {
2328     PyObject_HEAD_INIT(&BufListType)
2329 };
2330 
2331 static WinListObject TheWindowList =
2332 {
2333     PyObject_HEAD_INIT(&WinListType)
2334 };
2335 
2336 static CurrentObject TheCurrent =
2337 {
2338     PyObject_HEAD_INIT(&CurrentType)
2339 };
2340 
2341     static int
2342 PythonMod_Init(void)
2343 {
2344     PyObject *mod;
2345     PyObject *dict;
2346     static char *(argv[2]) = {"", NULL};
2347 
2348     /* Fixups... */
2349     BufferType.ob_type = &PyType_Type;
2350     RangeType.ob_type = &PyType_Type;
2351     WindowType.ob_type = &PyType_Type;
2352     BufListType.ob_type = &PyType_Type;
2353     WinListType.ob_type = &PyType_Type;
2354     CurrentType.ob_type = &PyType_Type;
2355 
2356     /* Set sys.argv[] to avoid a crash in warn(). */
2357     PySys_SetArgv(1, argv);
2358 
2359     mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION);
2360     dict = PyModule_GetDict(mod);
2361 
2362     VimError = Py_BuildValue("s", "vim.error");
2363 
2364     PyDict_SetItemString(dict, "error", VimError);
2365     PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferList);
2366     PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent);
2367     PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList);
2368 
2369     if (PyErr_Occurred())
2370 	return -1;
2371 
2372     return 0;
2373 }
2374 
2375 /*************************************************************************
2376  * 4. Utility functions for handling the interface between Vim and Python.
2377  */
2378 
2379 /* Get a line from the specified buffer. The line number is
2380  * in Vim format (1-based). The line is returned as a Python
2381  * string object.
2382  */
2383     static PyObject *
2384 GetBufferLine(buf_T *buf, PyInt n)
2385 {
2386     return LineToString((char *)ml_get_buf(buf, (linenr_T)n, FALSE));
2387 }
2388 
2389 /* Get a list of lines from the specified buffer. The line numbers
2390  * are in Vim format (1-based). The range is from lo up to, but not
2391  * including, hi. The list is returned as a Python list of string objects.
2392  */
2393     static PyObject *
2394 GetBufferLineList(buf_T *buf, PyInt lo, PyInt hi)
2395 {
2396     PyInt i;
2397     PyInt n = hi - lo;
2398     PyObject *list = PyList_New(n);
2399 
2400     if (list == NULL)
2401 	return NULL;
2402 
2403     for (i = 0; i < n; ++i)
2404     {
2405 	PyObject *str = LineToString((char *)ml_get_buf(buf, (linenr_T)(lo+i), FALSE));
2406 
2407 	/* Error check - was the Python string creation OK? */
2408 	if (str == NULL)
2409 	{
2410 	    Py_DECREF(list);
2411 	    return NULL;
2412 	}
2413 
2414 	/* Set the list item */
2415 	if (PyList_SetItem(list, i, str))
2416 	{
2417 	    Py_DECREF(str);
2418 	    Py_DECREF(list);
2419 	    return NULL;
2420 	}
2421     }
2422 
2423     /* The ownership of the Python list is passed to the caller (ie,
2424      * the caller should Py_DECREF() the object when it is finished
2425      * with it).
2426      */
2427 
2428     return list;
2429 }
2430 
2431 /*
2432  * Check if deleting lines made the cursor position invalid.
2433  * Changed the lines from "lo" to "hi" and added "extra" lines (negative if
2434  * deleted).
2435  */
2436     static void
2437 py_fix_cursor(linenr_T lo, linenr_T hi, linenr_T extra)
2438 {
2439     if (curwin->w_cursor.lnum >= lo)
2440     {
2441 	/* Adjust the cursor position if it's in/after the changed
2442 	 * lines. */
2443 	if (curwin->w_cursor.lnum >= hi)
2444 	{
2445 	    curwin->w_cursor.lnum += extra;
2446 	    check_cursor_col();
2447 	}
2448 	else if (extra < 0)
2449 	{
2450 	    curwin->w_cursor.lnum = lo;
2451 	    check_cursor();
2452 	}
2453 	else
2454 	    check_cursor_col();
2455 	changed_cline_bef_curs();
2456     }
2457     invalidate_botline();
2458 }
2459 
2460 /* Replace a line in the specified buffer. The line number is
2461  * in Vim format (1-based). The replacement line is given as
2462  * a Python string object. The object is checked for validity
2463  * and correct format. Errors are returned as a value of FAIL.
2464  * The return value is OK on success.
2465  * If OK is returned and len_change is not NULL, *len_change
2466  * is set to the change in the buffer length.
2467  */
2468     static int
2469 SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
2470 {
2471     /* First of all, we check the thpe of the supplied Python object.
2472      * There are three cases:
2473      *	  1. NULL, or None - this is a deletion.
2474      *	  2. A string	   - this is a replacement.
2475      *	  3. Anything else - this is an error.
2476      */
2477     if (line == Py_None || line == NULL)
2478     {
2479 	buf_T *savebuf = curbuf;
2480 
2481 	PyErr_Clear();
2482 	curbuf = buf;
2483 
2484 	if (u_savedel((linenr_T)n, 1L) == FAIL)
2485 	    PyErr_SetVim(_("cannot save undo information"));
2486 	else if (ml_delete((linenr_T)n, FALSE) == FAIL)
2487 	    PyErr_SetVim(_("cannot delete line"));
2488 	else
2489 	{
2490 	    deleted_lines_mark((linenr_T)n, 1L);
2491 	    if (buf == curwin->w_buffer)
2492 		py_fix_cursor((linenr_T)n, (linenr_T)n + 1, (linenr_T)-1);
2493 	}
2494 
2495 	curbuf = savebuf;
2496 
2497 	if (PyErr_Occurred() || VimErrorCheck())
2498 	    return FAIL;
2499 
2500 	if (len_change)
2501 	    *len_change = -1;
2502 
2503 	return OK;
2504     }
2505     else if (PyString_Check(line))
2506     {
2507 	char *save = StringToLine(line);
2508 	buf_T *savebuf = curbuf;
2509 
2510 	if (save == NULL)
2511 	    return FAIL;
2512 
2513 	/* We do not need to free "save" if ml_replace() consumes it. */
2514 	PyErr_Clear();
2515 	curbuf = buf;
2516 
2517 	if (u_savesub((linenr_T)n) == FAIL)
2518 	{
2519 	    PyErr_SetVim(_("cannot save undo information"));
2520 	    vim_free(save);
2521 	}
2522 	else if (ml_replace((linenr_T)n, (char_u *)save, FALSE) == FAIL)
2523 	{
2524 	    PyErr_SetVim(_("cannot replace line"));
2525 	    vim_free(save);
2526 	}
2527 	else
2528 	    changed_bytes((linenr_T)n, 0);
2529 
2530 	curbuf = savebuf;
2531 
2532 	/* Check that the cursor is not beyond the end of the line now. */
2533 	if (buf == curwin->w_buffer)
2534 	    check_cursor_col();
2535 
2536 	if (PyErr_Occurred() || VimErrorCheck())
2537 	    return FAIL;
2538 
2539 	if (len_change)
2540 	    *len_change = 0;
2541 
2542 	return OK;
2543     }
2544     else
2545     {
2546 	PyErr_BadArgument();
2547 	return FAIL;
2548     }
2549 }
2550 
2551 /* Replace a range of lines in the specified buffer. The line numbers are in
2552  * Vim format (1-based). The range is from lo up to, but not including, hi.
2553  * The replacement lines are given as a Python list of string objects. The
2554  * list is checked for validity and correct format. Errors are returned as a
2555  * value of FAIL.  The return value is OK on success.
2556  * If OK is returned and len_change is not NULL, *len_change
2557  * is set to the change in the buffer length.
2558  */
2559     static int
2560 SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, PyInt *len_change)
2561 {
2562     /* First of all, we check the thpe of the supplied Python object.
2563      * There are three cases:
2564      *	  1. NULL, or None - this is a deletion.
2565      *	  2. A list	   - this is a replacement.
2566      *	  3. Anything else - this is an error.
2567      */
2568     if (list == Py_None || list == NULL)
2569     {
2570 	PyInt	i;
2571 	PyInt	n = (int)(hi - lo);
2572 	buf_T	*savebuf = curbuf;
2573 
2574 	PyErr_Clear();
2575 	curbuf = buf;
2576 
2577 	if (u_savedel((linenr_T)lo, (long)n) == FAIL)
2578 	    PyErr_SetVim(_("cannot save undo information"));
2579 	else
2580 	{
2581 	    for (i = 0; i < n; ++i)
2582 	    {
2583 		if (ml_delete((linenr_T)lo, FALSE) == FAIL)
2584 		{
2585 		    PyErr_SetVim(_("cannot delete line"));
2586 		    break;
2587 		}
2588 	    }
2589 	    deleted_lines_mark((linenr_T)lo, (long)i);
2590 
2591 	    if (buf == curwin->w_buffer)
2592 		py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n);
2593 	}
2594 
2595 	curbuf = savebuf;
2596 
2597 	if (PyErr_Occurred() || VimErrorCheck())
2598 	    return FAIL;
2599 
2600 	if (len_change)
2601 	    *len_change = -n;
2602 
2603 	return OK;
2604     }
2605     else if (PyList_Check(list))
2606     {
2607 	PyInt	i;
2608 	PyInt	new_len = PyList_Size(list);
2609 	PyInt	old_len = hi - lo;
2610 	PyInt	extra = 0;	/* lines added to text, can be negative */
2611 	char	**array;
2612 	buf_T	*savebuf;
2613 
2614 	if (new_len == 0)	/* avoid allocating zero bytes */
2615 	    array = NULL;
2616 	else
2617 	{
2618 	    array = (char **)alloc((unsigned)(new_len * sizeof(char *)));
2619 	    if (array == NULL)
2620 	    {
2621 		PyErr_NoMemory();
2622 		return FAIL;
2623 	    }
2624 	}
2625 
2626 	for (i = 0; i < new_len; ++i)
2627 	{
2628 	    PyObject *line = PyList_GetItem(list, i);
2629 
2630 	    array[i] = StringToLine(line);
2631 	    if (array[i] == NULL)
2632 	    {
2633 		while (i)
2634 		    vim_free(array[--i]);
2635 		vim_free(array);
2636 		return FAIL;
2637 	    }
2638 	}
2639 
2640 	savebuf = curbuf;
2641 
2642 	PyErr_Clear();
2643 	curbuf = buf;
2644 
2645 	if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL)
2646 	    PyErr_SetVim(_("cannot save undo information"));
2647 
2648 	/* If the size of the range is reducing (ie, new_len < old_len) we
2649 	 * need to delete some old_len. We do this at the start, by
2650 	 * repeatedly deleting line "lo".
2651 	 */
2652 	if (!PyErr_Occurred())
2653 	{
2654 	    for (i = 0; i < old_len - new_len; ++i)
2655 		if (ml_delete((linenr_T)lo, FALSE) == FAIL)
2656 		{
2657 		    PyErr_SetVim(_("cannot delete line"));
2658 		    break;
2659 		}
2660 	    extra -= i;
2661 	}
2662 
2663 	/* For as long as possible, replace the existing old_len with the
2664 	 * new old_len. This is a more efficient operation, as it requires
2665 	 * less memory allocation and freeing.
2666 	 */
2667 	if (!PyErr_Occurred())
2668 	{
2669 	    for (i = 0; i < old_len && i < new_len; ++i)
2670 		if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], FALSE)
2671 								      == FAIL)
2672 		{
2673 		    PyErr_SetVim(_("cannot replace line"));
2674 		    break;
2675 		}
2676 	}
2677 	else
2678 	    i = 0;
2679 
2680 	/* Now we may need to insert the remaining new old_len. If we do, we
2681 	 * must free the strings as we finish with them (we can't pass the
2682 	 * responsibility to vim in this case).
2683 	 */
2684 	if (!PyErr_Occurred())
2685 	{
2686 	    while (i < new_len)
2687 	    {
2688 		if (ml_append((linenr_T)(lo + i - 1),
2689 					(char_u *)array[i], 0, FALSE) == FAIL)
2690 		{
2691 		    PyErr_SetVim(_("cannot insert line"));
2692 		    break;
2693 		}
2694 		vim_free(array[i]);
2695 		++i;
2696 		++extra;
2697 	    }
2698 	}
2699 
2700 	/* Free any left-over old_len, as a result of an error */
2701 	while (i < new_len)
2702 	{
2703 	    vim_free(array[i]);
2704 	    ++i;
2705 	}
2706 
2707 	/* Free the array of old_len. All of its contents have now
2708 	 * been dealt with (either freed, or the responsibility passed
2709 	 * to vim.
2710 	 */
2711 	vim_free(array);
2712 
2713 	/* Adjust marks. Invalidate any which lie in the
2714 	 * changed range, and move any in the remainder of the buffer.
2715 	 */
2716 	mark_adjust((linenr_T)lo, (linenr_T)(hi - 1),
2717 						  (long)MAXLNUM, (long)extra);
2718 	changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
2719 
2720 	if (buf == curwin->w_buffer)
2721 	    py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)extra);
2722 
2723 	curbuf = savebuf;
2724 
2725 	if (PyErr_Occurred() || VimErrorCheck())
2726 	    return FAIL;
2727 
2728 	if (len_change)
2729 	    *len_change = new_len - old_len;
2730 
2731 	return OK;
2732     }
2733     else
2734     {
2735 	PyErr_BadArgument();
2736 	return FAIL;
2737     }
2738 }
2739 
2740 /* Insert a number of lines into the specified buffer after the specifed line.
2741  * The line number is in Vim format (1-based). The lines to be inserted are
2742  * given as a Python list of string objects or as a single string. The lines
2743  * to be added are checked for validity and correct format. Errors are
2744  * returned as a value of FAIL.  The return value is OK on success.
2745  * If OK is returned and len_change is not NULL, *len_change
2746  * is set to the change in the buffer length.
2747  */
2748     static int
2749 InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
2750 {
2751     /* First of all, we check the type of the supplied Python object.
2752      * It must be a string or a list, or the call is in error.
2753      */
2754     if (PyString_Check(lines))
2755     {
2756 	char	*str = StringToLine(lines);
2757 	buf_T	*savebuf;
2758 
2759 	if (str == NULL)
2760 	    return FAIL;
2761 
2762 	savebuf = curbuf;
2763 
2764 	PyErr_Clear();
2765 	curbuf = buf;
2766 
2767 	if (u_save((linenr_T)n, (linenr_T)(n+1)) == FAIL)
2768 	    PyErr_SetVim(_("cannot save undo information"));
2769 	else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL)
2770 	    PyErr_SetVim(_("cannot insert line"));
2771 	else
2772 	    appended_lines_mark((linenr_T)n, 1L);
2773 
2774 	vim_free(str);
2775 	curbuf = savebuf;
2776 	update_screen(VALID);
2777 
2778 	if (PyErr_Occurred() || VimErrorCheck())
2779 	    return FAIL;
2780 
2781 	if (len_change)
2782 	    *len_change = 1;
2783 
2784 	return OK;
2785     }
2786     else if (PyList_Check(lines))
2787     {
2788 	PyInt	i;
2789 	PyInt	size = PyList_Size(lines);
2790 	char	**array;
2791 	buf_T	*savebuf;
2792 
2793 	array = (char **)alloc((unsigned)(size * sizeof(char *)));
2794 	if (array == NULL)
2795 	{
2796 	    PyErr_NoMemory();
2797 	    return FAIL;
2798 	}
2799 
2800 	for (i = 0; i < size; ++i)
2801 	{
2802 	    PyObject *line = PyList_GetItem(lines, i);
2803 	    array[i] = StringToLine(line);
2804 
2805 	    if (array[i] == NULL)
2806 	    {
2807 		while (i)
2808 		    vim_free(array[--i]);
2809 		vim_free(array);
2810 		return FAIL;
2811 	    }
2812 	}
2813 
2814 	savebuf = curbuf;
2815 
2816 	PyErr_Clear();
2817 	curbuf = buf;
2818 
2819 	if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL)
2820 	    PyErr_SetVim(_("cannot save undo information"));
2821 	else
2822 	{
2823 	    for (i = 0; i < size; ++i)
2824 	    {
2825 		if (ml_append((linenr_T)(n + i),
2826 					(char_u *)array[i], 0, FALSE) == FAIL)
2827 		{
2828 		    PyErr_SetVim(_("cannot insert line"));
2829 
2830 		    /* Free the rest of the lines */
2831 		    while (i < size)
2832 			vim_free(array[i++]);
2833 
2834 		    break;
2835 		}
2836 		vim_free(array[i]);
2837 	    }
2838 	    if (i > 0)
2839 		appended_lines_mark((linenr_T)n, (long)i);
2840 	}
2841 
2842 	/* Free the array of lines. All of its contents have now
2843 	 * been freed.
2844 	 */
2845 	vim_free(array);
2846 
2847 	curbuf = savebuf;
2848 	update_screen(VALID);
2849 
2850 	if (PyErr_Occurred() || VimErrorCheck())
2851 	    return FAIL;
2852 
2853 	if (len_change)
2854 	    *len_change = size;
2855 
2856 	return OK;
2857     }
2858     else
2859     {
2860 	PyErr_BadArgument();
2861 	return FAIL;
2862     }
2863 }
2864 
2865 /* Convert a Vim line into a Python string.
2866  * All internal newlines are replaced by null characters.
2867  *
2868  * On errors, the Python exception data is set, and NULL is returned.
2869  */
2870     static PyObject *
2871 LineToString(const char *str)
2872 {
2873     PyObject *result;
2874     PyInt len = strlen(str);
2875     char *p;
2876 
2877     /* Allocate an Python string object, with uninitialised contents. We
2878      * must do it this way, so that we can modify the string in place
2879      * later. See the Python source, Objects/stringobject.c for details.
2880      */
2881     result = PyString_FromStringAndSize(NULL, len);
2882     if (result == NULL)
2883 	return NULL;
2884 
2885     p = PyString_AsString(result);
2886 
2887     while (*str)
2888     {
2889 	if (*str == '\n')
2890 	    *p = '\0';
2891 	else
2892 	    *p = *str;
2893 
2894 	++p;
2895 	++str;
2896     }
2897 
2898     return result;
2899 }
2900 
2901 /* Convert a Python string into a Vim line.
2902  *
2903  * The result is in allocated memory. All internal nulls are replaced by
2904  * newline characters. It is an error for the string to contain newline
2905  * characters.
2906  *
2907  * On errors, the Python exception data is set, and NULL is returned.
2908  */
2909     static char *
2910 StringToLine(PyObject *obj)
2911 {
2912     const char *str;
2913     char *save;
2914     PyInt len;
2915     PyInt i;
2916     char *p;
2917 
2918     if (obj == NULL || !PyString_Check(obj))
2919     {
2920 	PyErr_BadArgument();
2921 	return NULL;
2922     }
2923 
2924     str = PyString_AsString(obj);
2925     len = PyString_Size(obj);
2926 
2927     /*
2928      * Error checking: String must not contain newlines, as we
2929      * are replacing a single line, and we must replace it with
2930      * a single line.
2931      * A trailing newline is removed, so that append(f.readlines()) works.
2932      */
2933     p = memchr(str, '\n', len);
2934     if (p != NULL)
2935     {
2936 	if (p == str + len - 1)
2937 	    --len;
2938 	else
2939 	{
2940 	    PyErr_SetVim(_("string cannot contain newlines"));
2941 	    return NULL;
2942 	}
2943     }
2944 
2945     /* Create a copy of the string, with internal nulls replaced by
2946      * newline characters, as is the vim convention.
2947      */
2948     save = (char *)alloc((unsigned)(len+1));
2949     if (save == NULL)
2950     {
2951 	PyErr_NoMemory();
2952 	return NULL;
2953     }
2954 
2955     for (i = 0; i < len; ++i)
2956     {
2957 	if (str[i] == '\0')
2958 	    save[i] = '\n';
2959 	else
2960 	    save[i] = str[i];
2961     }
2962 
2963     save[i] = '\0';
2964 
2965     return save;
2966 }
2967 
2968 /* Check to see whether a Vim error has been reported, or a keyboard
2969  * interrupt has been detected.
2970  */
2971     static int
2972 VimErrorCheck(void)
2973 {
2974     if (got_int)
2975     {
2976 	PyErr_SetNone(PyExc_KeyboardInterrupt);
2977 	return 1;
2978     }
2979     else if (did_emsg && !PyErr_Occurred())
2980     {
2981 	PyErr_SetNone(VimError);
2982 	return 1;
2983     }
2984 
2985     return 0;
2986 }
2987 
2988 
2989 /* Don't generate a prototype for the next function, it generates an error on
2990  * newer Python versions. */
2991 #if PYTHON_API_VERSION < 1007 /* Python 1.4 */ && !defined(PROTO)
2992 
2993     char *
2994 Py_GetProgramName(void)
2995 {
2996     return "vim";
2997 }
2998 #endif /* Python 1.4 */
2999