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