Mercurial > vim
annotate src/if_py_both.h @ 8177:0e3185eea369
Added tag v7.4.1381 for changeset 477c1d8556985c3c92915ffc3a1199372cf4262e
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 21 Feb 2016 19:45:04 +0100 |
parents | 3f7382858d4d |
children | 2f57bbe870ea |
rev | line source |
---|---|
3618 | 1 /* vi:set ts=8 sts=4 sw=4 noet: |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
2 * |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
3 * VIM - Vi IMproved by Bram Moolenaar |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
4 * |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
5 * Do ":help uganda" in Vim to read copying and usage conditions. |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
6 * Do ":help credits" in Vim to see a list of people who contributed. |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
7 * See README.txt for an overview of the Vim source code. |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
8 */ |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
9 /* |
4385 | 10 * Python extensions by Paul Moore, David Leonard, Roland Puntaier, Nikolay |
11 * Pavlov. | |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
12 * |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
13 * Common code for if_python.c and if_python3.c. |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
14 */ |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
15 |
5588 | 16 #ifdef __BORLANDC__ |
17 /* Disable Warning W8060: Possibly incorrect assignment in function ... */ | |
18 # pragma warn -8060 | |
19 #endif | |
20 | |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
21 static char_u e_py_systemexit[] = "E880: Can't handle SystemExit of %s exception in vim"; |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
22 |
3734 | 23 #if PY_VERSION_HEX < 0x02050000 |
24 typedef int Py_ssize_t; /* Python 2.4 and earlier don't have this type. */ | |
25 #endif | |
26 | |
2919 | 27 #ifdef FEAT_MBYTE |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
28 # define ENC_OPT ((char *)p_enc) |
2919 | 29 #else |
30 # define ENC_OPT "latin1" | |
31 #endif | |
4435 | 32 #define DOPY_FUNC "_vim_pydo" |
2919 | 33 |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
34 static const char *vim_special_path = "_vim_path_"; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
35 |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
36 #define PyErr_SET_STRING(exc, str) PyErr_SetString(exc, _(str)) |
4385 | 37 #define PyErr_SetVim(str) PyErr_SetString(VimError, str) |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
38 #define PyErr_SET_VIM(str) PyErr_SET_STRING(VimError, str) |
5608 | 39 #define PyErr_FORMAT(exc, str, arg) PyErr_Format(exc, _(str), arg) |
40 #define PyErr_FORMAT2(exc, str, arg1, arg2) PyErr_Format(exc, _(str), arg1,arg2) | |
41 #define PyErr_VIM_FORMAT(str, arg) PyErr_FORMAT(VimError, str, arg) | |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
42 |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
43 #define Py_TYPE_NAME(obj) (obj->ob_type->tp_name == NULL \ |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
44 ? "(NULL)" \ |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
45 : obj->ob_type->tp_name) |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
46 |
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
47 #define RAISE_NO_EMPTY_KEYS PyErr_SET_STRING(PyExc_ValueError, \ |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
48 N_("empty keys are not allowed")) |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
49 #define RAISE_LOCKED_DICTIONARY PyErr_SET_VIM(N_("dictionary is locked")) |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
50 #define RAISE_LOCKED_LIST PyErr_SET_VIM(N_("list is locked")) |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
51 #define RAISE_UNDO_FAIL PyErr_SET_VIM(N_("cannot save undo information")) |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
52 #define RAISE_DELETE_LINE_FAIL PyErr_SET_VIM(N_("cannot delete line")) |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
53 #define RAISE_INSERT_LINE_FAIL PyErr_SET_VIM(N_("cannot insert line")) |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
54 #define RAISE_REPLACE_LINE_FAIL PyErr_SET_VIM(N_("cannot replace line")) |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
55 #define RAISE_KEY_ADD_FAIL(key) \ |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
56 PyErr_VIM_FORMAT(N_("failed to add key '%s' to dictionary"), key) |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
57 #define RAISE_INVALID_INDEX_TYPE(idx) \ |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
58 PyErr_FORMAT(PyExc_TypeError, N_("index must be int or slice, not %s"), \ |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
59 Py_TYPE_NAME(idx)); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
60 |
4385 | 61 #define INVALID_BUFFER_VALUE ((buf_T *)(-1)) |
62 #define INVALID_WINDOW_VALUE ((win_T *)(-1)) | |
4401 | 63 #define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1)) |
4385 | 64 |
4486 | 65 typedef void (*rangeinitializer)(void *); |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
66 typedef void (*runner)(const char *, void * |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
67 #ifdef PY_CAN_RECURSE |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
68 , PyGILState_STATE * |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
69 #endif |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
70 ); |
4486 | 71 |
4385 | 72 static int ConvertFromPyObject(PyObject *, typval_T *); |
73 static int _ConvertFromPyObject(PyObject *, typval_T *, PyObject *); | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
74 static int ConvertFromPyMapping(PyObject *, typval_T *); |
4431 | 75 static PyObject *WindowNew(win_T *, tabpage_T *); |
76 static PyObject *BufferNew (buf_T *); | |
77 static PyObject *LineToString(const char *); | |
4385 | 78 |
79 static PyInt RangeStart; | |
80 static PyInt RangeEnd; | |
81 | |
4486 | 82 static PyObject *globals; |
83 | |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
84 static PyObject *py_chdir; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
85 static PyObject *py_fchdir; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
86 static PyObject *py_getcwd; |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
87 static PyObject *vim_module; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
88 static PyObject *vim_special_path_object; |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
89 |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
90 static PyObject *py_find_module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
91 static PyObject *py_load_module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
92 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
93 static PyObject *VimError; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
94 |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
95 /* |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
96 * obtain a lock on the Vim data structures |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
97 */ |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
98 static void |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
99 Python_Lock_Vim(void) |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
100 { |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
101 } |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
102 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
103 /* |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
104 * release a lock on the Vim data structures |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
105 */ |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
106 static void |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
107 Python_Release_Vim(void) |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
108 { |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
109 } |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
110 |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
111 /* |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
112 * The "todecref" argument holds a pointer to PyObject * that must be |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
113 * DECREF'ed after returned char_u * is no longer needed or NULL if all what |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
114 * was needed to generate returned value is object. |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
115 * |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
116 * Use Py_XDECREF to decrement reference count. |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
117 */ |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
118 static char_u * |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
119 StringToChars(PyObject *obj, PyObject **todecref) |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
120 { |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
121 char_u *str; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
122 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
123 if (PyBytes_Check(obj)) |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
124 { |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
125 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
126 if (PyBytes_AsStringAndSize(obj, (char **) &str, NULL) == -1 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
127 || str == NULL) |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
128 return NULL; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
129 |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
130 *todecref = NULL; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
131 } |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
132 else if (PyUnicode_Check(obj)) |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
133 { |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
134 PyObject *bytes; |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
135 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
136 if (!(bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL))) |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
137 return NULL; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
138 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
139 if(PyBytes_AsStringAndSize(bytes, (char **) &str, NULL) == -1 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
140 || str == NULL) |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
141 { |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
142 Py_DECREF(bytes); |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
143 return NULL; |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
144 } |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
145 |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
146 *todecref = bytes; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
147 } |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
148 else |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
149 { |
4988
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
150 #if PY_MAJOR_VERSION < 3 |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
151 PyErr_FORMAT(PyExc_TypeError, |
4988
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
152 N_("expected str() or unicode() instance, but got %s"), |
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
153 Py_TYPE_NAME(obj)); |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
154 #else |
4988
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
155 PyErr_FORMAT(PyExc_TypeError, |
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
156 N_("expected bytes() or str() instance, but got %s"), |
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
157 Py_TYPE_NAME(obj)); |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
158 #endif |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
159 return NULL; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
160 } |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
161 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
162 return (char_u *) str; |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
163 } |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
164 |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
165 #define NUMBER_LONG 1 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
166 #define NUMBER_INT 2 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
167 #define NUMBER_NATURAL 4 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
168 #define NUMBER_UNSIGNED 8 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
169 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
170 static int |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
171 NumberToLong(PyObject *obj, long *result, int flags) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
172 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
173 #if PY_MAJOR_VERSION < 3 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
174 if (PyInt_Check(obj)) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
175 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
176 *result = PyInt_AsLong(obj); |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
177 if (PyErr_Occurred()) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
178 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
179 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
180 else |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
181 #endif |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
182 if (PyLong_Check(obj)) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
183 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
184 *result = PyLong_AsLong(obj); |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
185 if (PyErr_Occurred()) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
186 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
187 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
188 else if (PyNumber_Check(obj)) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
189 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
190 PyObject *num; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
191 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
192 if (!(num = PyNumber_Long(obj))) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
193 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
194 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
195 *result = PyLong_AsLong(num); |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
196 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
197 Py_DECREF(num); |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
198 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
199 if (PyErr_Occurred()) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
200 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
201 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
202 else |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
203 { |
4988
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
204 #if PY_MAJOR_VERSION < 3 |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
205 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
206 N_("expected int(), long() or something supporting " |
4988
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
207 "coercing to long(), but got %s"), |
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
208 Py_TYPE_NAME(obj)); |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
209 #else |
4988
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
210 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
211 N_("expected int() or something supporting coercing to int(), " |
4988
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
212 "but got %s"), |
e130cc3d17af
updated for version 7.3.1239
Bram Moolenaar <bram@vim.org>
parents:
4984
diff
changeset
|
213 Py_TYPE_NAME(obj)); |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
214 #endif |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
215 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
216 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
217 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
218 if (flags & NUMBER_INT) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
219 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
220 if (*result > INT_MAX) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
221 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
222 PyErr_SET_STRING(PyExc_OverflowError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
223 N_("value is too large to fit into C int type")); |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
224 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
225 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
226 else if (*result < INT_MIN) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
227 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
228 PyErr_SET_STRING(PyExc_OverflowError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
229 N_("value is too small to fit into C int type")); |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
230 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
231 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
232 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
233 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
234 if (flags & NUMBER_NATURAL) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
235 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
236 if (*result <= 0) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
237 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
238 PyErr_SET_STRING(PyExc_ValueError, |
5695 | 239 N_("number must be greater than zero")); |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
240 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
241 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
242 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
243 else if (flags & NUMBER_UNSIGNED) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
244 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
245 if (*result < 0) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
246 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
247 PyErr_SET_STRING(PyExc_ValueError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
248 N_("number must be greater or equal to zero")); |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
249 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
250 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
251 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
252 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
253 return 0; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
254 } |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
255 |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
256 static int |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
257 add_string(PyObject *list, char *s) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
258 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
259 PyObject *string; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
260 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
261 if (!(string = PyString_FromString(s))) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
262 return -1; |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
263 |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
264 if (PyList_Append(list, string)) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
265 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
266 Py_DECREF(string); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
267 return -1; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
268 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
269 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
270 Py_DECREF(string); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
271 return 0; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
272 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
273 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
274 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
275 ObjectDir(PyObject *self, char **attributes) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
276 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
277 PyMethodDef *method; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
278 char **attr; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
279 PyObject *ret; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
280 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
281 if (!(ret = PyList_New(0))) |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
282 return NULL; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
283 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
284 if (self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
285 for (method = self->ob_type->tp_methods ; method->ml_name != NULL ; ++method) |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
286 if (add_string(ret, (char *)method->ml_name)) |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
287 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
288 Py_DECREF(ret); |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
289 return NULL; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
290 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
291 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
292 for (attr = attributes ; *attr ; ++attr) |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
293 if (add_string(ret, *attr)) |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
294 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
295 Py_DECREF(ret); |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
296 return NULL; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
297 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
298 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
299 #if PY_MAJOR_VERSION < 3 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
300 if (add_string(ret, "__members__")) |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
301 { |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
302 Py_DECREF(ret); |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
303 return NULL; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
304 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
305 #endif |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
306 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
307 return ret; |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
308 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
309 |
4385 | 310 /* Output buffer management |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
311 */ |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
312 |
2582 | 313 /* Function to write a line, points to either msg() or emsg(). */ |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
314 typedef void (*writefn)(char_u *); |
4385 | 315 |
316 static PyTypeObject OutputType; | |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
317 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
318 typedef struct |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
319 { |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
320 PyObject_HEAD |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
321 long softspace; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
322 long error; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
323 } OutputObject; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
324 |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
325 static char *OutputAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
326 "softspace", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
327 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
328 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
329 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
330 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
331 OutputDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
332 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
333 return ObjectDir(self, OutputAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
334 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
335 |
3826 | 336 static int |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
337 OutputSetattr(OutputObject *self, char *name, PyObject *valObject) |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
338 { |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
339 if (valObject == NULL) |
3826 | 340 { |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
341 PyErr_SET_STRING(PyExc_AttributeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
342 N_("can't delete OutputObject attributes")); |
3826 | 343 return -1; |
344 } | |
345 | |
346 if (strcmp(name, "softspace") == 0) | |
347 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
348 if (NumberToLong(valObject, &(self->softspace), NUMBER_UNSIGNED)) |
3826 | 349 return -1; |
350 return 0; | |
351 } | |
352 | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
353 PyErr_FORMAT(PyExc_AttributeError, N_("invalid attribute: %s"), name); |
3826 | 354 return -1; |
355 } | |
356 | |
4385 | 357 /* Buffer IO, we write one whole line at a time. */ |
358 static garray_T io_ga = {0, 0, 1, 80, NULL}; | |
359 static writefn old_fn = NULL; | |
360 | |
361 static void | |
362 PythonIO_Flush(void) | |
363 { | |
364 if (old_fn != NULL && io_ga.ga_len > 0) | |
365 { | |
366 ((char_u *)io_ga.ga_data)[io_ga.ga_len] = NUL; | |
367 old_fn((char_u *)io_ga.ga_data); | |
368 } | |
369 io_ga.ga_len = 0; | |
370 } | |
371 | |
372 static void | |
373 writer(writefn fn, char_u *str, PyInt n) | |
374 { | |
375 char_u *ptr; | |
376 | |
377 /* Flush when switching output function. */ | |
378 if (fn != old_fn) | |
379 PythonIO_Flush(); | |
380 old_fn = fn; | |
381 | |
382 /* Write each NL separated line. Text after the last NL is kept for | |
383 * writing later. */ | |
384 while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL) | |
385 { | |
386 PyInt len = ptr - str; | |
387 | |
388 if (ga_grow(&io_ga, (int)(len + 1)) == FAIL) | |
389 break; | |
390 | |
391 mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)len); | |
392 ((char *)io_ga.ga_data)[io_ga.ga_len + len] = NUL; | |
393 fn((char_u *)io_ga.ga_data); | |
394 str = ptr + 1; | |
395 n -= len + 1; | |
396 io_ga.ga_len = 0; | |
397 } | |
398 | |
399 /* Put the remaining text into io_ga for later printing. */ | |
400 if (n > 0 && ga_grow(&io_ga, (int)(n + 1)) == OK) | |
401 { | |
402 mch_memmove(((char *)io_ga.ga_data) + io_ga.ga_len, str, (size_t)n); | |
403 io_ga.ga_len += (int)n; | |
404 } | |
405 } | |
406 | |
4962
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
407 static int |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
408 write_output(OutputObject *self, PyObject *string) |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
409 { |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
410 Py_ssize_t len = 0; |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
411 char *str = NULL; |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
412 int error = self->error; |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
413 |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
414 if (!PyArg_Parse(string, "et#", ENC_OPT, &str, &len)) |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
415 return -1; |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
416 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
417 Py_BEGIN_ALLOW_THREADS |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
418 Python_Lock_Vim(); |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
419 writer((writefn)(error ? emsg : msg), (char_u *)str, len); |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
420 Python_Release_Vim(); |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
421 Py_END_ALLOW_THREADS |
2894 | 422 PyMem_Free(str); |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
423 |
4962
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
424 return 0; |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
425 } |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
426 |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
427 static PyObject * |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
428 OutputWrite(OutputObject *self, PyObject *string) |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
429 { |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
430 if (write_output(self, string)) |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
431 return NULL; |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
432 |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
433 Py_INCREF(Py_None); |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
434 return Py_None; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
435 } |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
436 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
437 static PyObject * |
4962
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
438 OutputWritelines(OutputObject *self, PyObject *seq) |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
439 { |
4619
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
440 PyObject *iterator; |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
441 PyObject *item; |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
442 |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
443 if (!(iterator = PyObject_GetIter(seq))) |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
444 return NULL; |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
445 |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
446 while ((item = PyIter_Next(iterator))) |
3618 | 447 { |
4962
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
448 if (write_output(self, item)) |
3618 | 449 { |
4619
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
450 Py_DECREF(iterator); |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
451 Py_DECREF(item); |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
452 return NULL; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
453 } |
4619
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
454 Py_DECREF(item); |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
455 } |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
456 |
4619
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
457 Py_DECREF(iterator); |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
458 |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
459 /* Iterator may have finished due to an exception */ |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
460 if (PyErr_Occurred()) |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
461 return NULL; |
90beab957ba9
updated for version 7.3.1057
Bram Moolenaar <bram@vim.org>
parents:
4617
diff
changeset
|
462 |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
463 Py_INCREF(Py_None); |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
464 return Py_None; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
465 } |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
466 |
2727 | 467 static PyObject * |
7191
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
468 AlwaysNone(PyObject *self UNUSED) |
2727 | 469 { |
470 /* do nothing */ | |
471 Py_INCREF(Py_None); | |
472 return Py_None; | |
473 } | |
474 | |
7191
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
475 static PyObject * |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
476 AlwaysFalse(PyObject *self UNUSED) |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
477 { |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
478 /* do nothing */ |
7202
de43f10a3850
commit https://github.com/vim/vim/commit/e7427f4b7e1af6a63600183be6b4c5724beb2f66
Christian Brabandt <cb@256bit.org>
parents:
7191
diff
changeset
|
479 PyObject *ret = Py_False; |
de43f10a3850
commit https://github.com/vim/vim/commit/e7427f4b7e1af6a63600183be6b4c5724beb2f66
Christian Brabandt <cb@256bit.org>
parents:
7191
diff
changeset
|
480 Py_INCREF(ret); |
de43f10a3850
commit https://github.com/vim/vim/commit/e7427f4b7e1af6a63600183be6b4c5724beb2f66
Christian Brabandt <cb@256bit.org>
parents:
7191
diff
changeset
|
481 return ret; |
7191
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
482 } |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
483 |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
484 static PyObject * |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
485 AlwaysTrue(PyObject *self UNUSED) |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
486 { |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
487 /* do nothing */ |
7202
de43f10a3850
commit https://github.com/vim/vim/commit/e7427f4b7e1af6a63600183be6b4c5724beb2f66
Christian Brabandt <cb@256bit.org>
parents:
7191
diff
changeset
|
488 PyObject *ret = Py_True; |
de43f10a3850
commit https://github.com/vim/vim/commit/e7427f4b7e1af6a63600183be6b4c5724beb2f66
Christian Brabandt <cb@256bit.org>
parents:
7191
diff
changeset
|
489 Py_INCREF(ret); |
de43f10a3850
commit https://github.com/vim/vim/commit/e7427f4b7e1af6a63600183be6b4c5724beb2f66
Christian Brabandt <cb@256bit.org>
parents:
7191
diff
changeset
|
490 return ret; |
7191
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
491 } |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
492 |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
493 /***************/ |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
494 |
4385 | 495 static struct PyMethodDef OutputMethods[] = { |
4492 | 496 /* name, function, calling, doc */ |
4962
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
497 {"write", (PyCFunction)OutputWrite, METH_O, ""}, |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
498 {"writelines", (PyCFunction)OutputWritelines, METH_O, ""}, |
7191
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
499 {"flush", (PyCFunction)AlwaysNone, METH_NOARGS, ""}, |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
500 {"close", (PyCFunction)AlwaysNone, METH_NOARGS, ""}, |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
501 {"isatty", (PyCFunction)AlwaysFalse, METH_NOARGS, ""}, |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
502 {"readable", (PyCFunction)AlwaysFalse, METH_NOARGS, ""}, |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
503 {"seekable", (PyCFunction)AlwaysFalse, METH_NOARGS, ""}, |
692dac7183de
commit https://github.com/vim/vim/commit/d424747d5821c2873e24d25d3407d08b25ea3443
Christian Brabandt <cb@256bit.org>
parents:
6598
diff
changeset
|
504 {"writable", (PyCFunction)AlwaysTrue, METH_NOARGS, ""}, |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
505 {"__dir__", (PyCFunction)OutputDir, METH_NOARGS, ""}, |
4492 | 506 { NULL, NULL, 0, NULL} |
4385 | 507 }; |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
508 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
509 static OutputObject Output = |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
510 { |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
511 PyObject_HEAD_INIT(&OutputType) |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
512 0, |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
513 0 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
514 }; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
515 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
516 static OutputObject Error = |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
517 { |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
518 PyObject_HEAD_INIT(&OutputType) |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
519 0, |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
520 1 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
521 }; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
522 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
523 static int |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
524 PythonIO_Init_io(void) |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
525 { |
4829
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
526 if (PySys_SetObject("stdout", (PyObject *)(void *)&Output)) |
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
527 return -1; |
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
528 if (PySys_SetObject("stderr", (PyObject *)(void *)&Error)) |
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
529 return -1; |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
530 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
531 if (PyErr_Occurred()) |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
532 { |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
533 EMSG(_("E264: Python: Error initialising I/O objects")); |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
534 return -1; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
535 } |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
536 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
537 return 0; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
538 } |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
539 |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
540 typedef struct |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
541 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
542 PyObject_HEAD |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
543 PyObject *module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
544 } LoaderObject; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
545 static PyTypeObject LoaderType; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
546 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
547 static void |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
548 LoaderDestructor(LoaderObject *self) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
549 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
550 Py_DECREF(self->module); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
551 DESTRUCTOR_FINISH(self); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
552 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
553 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
554 static PyObject * |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
555 LoaderLoadModule(LoaderObject *self, PyObject *args UNUSED) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
556 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
557 PyObject *ret = self->module; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
558 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
559 Py_INCREF(ret); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
560 return ret; |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
561 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
562 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
563 static struct PyMethodDef LoaderMethods[] = { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
564 /* name, function, calling, doc */ |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
565 {"load_module", (PyCFunction)LoaderLoadModule, METH_VARARGS, ""}, |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
566 { NULL, NULL, 0, NULL} |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
567 }; |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
568 |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
569 /* Check to see whether a Vim error has been reported, or a keyboard |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
570 * interrupt has been detected. |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
571 */ |
4498 | 572 |
573 static void | |
574 VimTryStart(void) | |
575 { | |
576 ++trylevel; | |
577 } | |
578 | |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
579 static int |
4498 | 580 VimTryEnd(void) |
581 { | |
582 --trylevel; | |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
583 /* Without this it stops processing all subsequent VimL commands and |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
584 * generates strange error messages if I e.g. try calling Test() in a |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
585 * cycle */ |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
586 did_emsg = FALSE; |
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
587 /* Keyboard interrupt should be preferred over anything else */ |
4498 | 588 if (got_int) |
589 { | |
5629 | 590 if (did_throw) |
5469 | 591 discard_current_exception(); |
592 got_int = FALSE; | |
4498 | 593 PyErr_SetNone(PyExc_KeyboardInterrupt); |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
594 return -1; |
4498 | 595 } |
5517 | 596 else if (msg_list != NULL && *msg_list != NULL) |
597 { | |
598 int should_free; | |
599 char_u *msg; | |
600 | |
601 msg = get_exception_string(*msg_list, ET_ERROR, NULL, &should_free); | |
602 | |
603 if (msg == NULL) | |
604 { | |
605 PyErr_NoMemory(); | |
606 return -1; | |
607 } | |
608 | |
609 PyErr_SetVim((char *) msg); | |
610 | |
611 free_global_msglist(); | |
612 | |
613 if (should_free) | |
614 vim_free(msg); | |
615 | |
616 return -1; | |
617 } | |
4498 | 618 else if (!did_throw) |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
619 return (PyErr_Occurred() ? -1 : 0); |
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
620 /* Python exception is preferred over vim one; unlikely to occur though */ |
4498 | 621 else if (PyErr_Occurred()) |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
622 { |
5629 | 623 discard_current_exception(); |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
624 return -1; |
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
625 } |
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
626 /* Finally transform VimL exception to python one */ |
4498 | 627 else |
628 { | |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
629 PyErr_SetVim((char *)current_exception->value); |
4498 | 630 discard_current_exception(); |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
631 return -1; |
4498 | 632 } |
633 } | |
634 | |
635 static int | |
636 VimCheckInterrupt(void) | |
2399
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
637 { |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
638 if (got_int) |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
639 { |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
640 PyErr_SetNone(PyExc_KeyboardInterrupt); |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
641 return 1; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
642 } |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
643 return 0; |
76f0c4918f5c
Move some common code from if_python.c and if_python3.c to if_py_both.h.
Bram Moolenaar <bram@vim.org>
parents:
diff
changeset
|
644 } |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
645 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
646 /* Vim module - Implementation |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
647 */ |
4385 | 648 |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
649 static PyObject * |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
650 VimCommand(PyObject *self UNUSED, PyObject *string) |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
651 { |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
652 char_u *cmd; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
653 PyObject *ret; |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
654 PyObject *todecref; |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
655 |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
656 if (!(cmd = StringToChars(string, &todecref))) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
657 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
658 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
659 Py_BEGIN_ALLOW_THREADS |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
660 Python_Lock_Vim(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
661 |
4498 | 662 VimTryStart(); |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
663 do_cmdline_cmd(cmd); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
664 update_screen(VALID); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
665 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
666 Python_Release_Vim(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
667 Py_END_ALLOW_THREADS |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
668 |
4498 | 669 if (VimTryEnd()) |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
670 ret = NULL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
671 else |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
672 ret = Py_None; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
673 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
674 Py_XINCREF(ret); |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
675 Py_XDECREF(todecref); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
676 return ret; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
677 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
678 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
679 /* |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
680 * Function to translate a typval_T into a PyObject; this will recursively |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
681 * translate lists/dictionaries into their Python equivalents. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
682 * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
683 * The depth parameter is to avoid infinite recursion, set it to 1 when |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
684 * you call VimToPython. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
685 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
686 static PyObject * |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
687 VimToPython(typval_T *our_tv, int depth, PyObject *lookup_dict) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
688 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
689 PyObject *ret; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
690 PyObject *newObj; |
3618 | 691 char ptrBuf[sizeof(void *) * 2 + 3]; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
692 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
693 /* Avoid infinite recursion */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
694 if (depth > 100) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
695 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
696 Py_INCREF(Py_None); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
697 ret = Py_None; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
698 return ret; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
699 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
700 |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
701 /* Check if we run into a recursive loop. The item must be in lookup_dict |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
702 * then and we can use it again. */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
703 if ((our_tv->v_type == VAR_LIST && our_tv->vval.v_list != NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
704 || (our_tv->v_type == VAR_DICT && our_tv->vval.v_dict != NULL)) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
705 { |
3618 | 706 sprintf(ptrBuf, "%p", |
707 our_tv->v_type == VAR_LIST ? (void *)our_tv->vval.v_list | |
708 : (void *)our_tv->vval.v_dict); | |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
709 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
710 if ((ret = PyDict_GetItemString(lookup_dict, ptrBuf))) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
711 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
712 Py_INCREF(ret); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
713 return ret; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
714 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
715 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
716 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
717 if (our_tv->v_type == VAR_STRING) |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
718 ret = PyString_FromString(our_tv->vval.v_string == NULL |
3852 | 719 ? "" : (char *)our_tv->vval.v_string); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
720 else if (our_tv->v_type == VAR_NUMBER) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
721 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
722 char buf[NUMBUFLEN]; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
723 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
724 /* For backwards compatibility numbers are stored as strings. */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
725 sprintf(buf, "%ld", (long)our_tv->vval.v_number); |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
726 ret = PyString_FromString((char *)buf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
727 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
728 # ifdef FEAT_FLOAT |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
729 else if (our_tv->v_type == VAR_FLOAT) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
730 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
731 char buf[NUMBUFLEN]; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
732 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
733 sprintf(buf, "%f", our_tv->vval.v_float); |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
734 ret = PyString_FromString((char *)buf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
735 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
736 # endif |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
737 else if (our_tv->v_type == VAR_LIST) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
738 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
739 list_T *list = our_tv->vval.v_list; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
740 listitem_T *curr; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
741 |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
742 if (list == NULL) |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
743 return NULL; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
744 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
745 if (!(ret = PyList_New(0))) |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
746 return NULL; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
747 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
748 if (PyDict_SetItemString(lookup_dict, ptrBuf, ret)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
749 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
750 Py_DECREF(ret); |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
751 return NULL; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
752 } |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
753 |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
754 for (curr = list->lv_first; curr != NULL; curr = curr->li_next) |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
755 { |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
756 if (!(newObj = VimToPython(&curr->li_tv, depth + 1, lookup_dict))) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
757 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
758 Py_DECREF(ret); |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
759 return NULL; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
760 } |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
761 if (PyList_Append(ret, newObj)) |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
762 { |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
763 Py_DECREF(newObj); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
764 Py_DECREF(ret); |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
765 return NULL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
766 } |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
767 Py_DECREF(newObj); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
768 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
769 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
770 else if (our_tv->v_type == VAR_DICT) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
771 { |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
772 |
6598 | 773 hashtab_T *ht; |
774 long_u todo; | |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
775 hashitem_T *hi; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
776 dictitem_T *di; |
6598 | 777 |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
778 if (our_tv->vval.v_dict == NULL) |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
779 return NULL; |
6598 | 780 ht = &our_tv->vval.v_dict->dv_hashtab; |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
781 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
782 if (!(ret = PyDict_New())) |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
783 return NULL; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
784 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
785 if (PyDict_SetItemString(lookup_dict, ptrBuf, ret)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
786 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
787 Py_DECREF(ret); |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
788 return NULL; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
789 } |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
790 |
6598 | 791 todo = ht->ht_used; |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
792 for (hi = ht->ht_array; todo > 0; ++hi) |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
793 { |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
794 if (!HASHITEM_EMPTY(hi)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
795 { |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
796 --todo; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
797 |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
798 di = dict_lookup(hi); |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
799 if (!(newObj = VimToPython(&di->di_tv, depth + 1, lookup_dict))) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
800 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
801 Py_DECREF(ret); |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
802 return NULL; |
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
803 } |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
804 if (PyDict_SetItemString(ret, (char *)hi->hi_key, newObj)) |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
805 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
806 Py_DECREF(ret); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
807 Py_DECREF(newObj); |
4595
29b2be2bba0d
updated for version 7.3.1045
Bram Moolenaar <bram@vim.org>
parents:
4593
diff
changeset
|
808 return NULL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
809 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
810 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
811 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
812 } |
7712
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
813 else if (our_tv->v_type == VAR_SPECIAL) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
814 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
815 if (our_tv->vval.v_number == VVAL_FALSE) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
816 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
817 ret = Py_False; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
818 Py_INCREF(ret); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
819 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
820 else if (our_tv->vval.v_number == VVAL_TRUE) |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
821 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
822 ret = Py_True; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
823 Py_INCREF(ret); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
824 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
825 else |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
826 { |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
827 Py_INCREF(Py_None); |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
828 ret = Py_None; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
829 } |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
830 return ret; |
bce3b5ddb393
commit https://github.com/vim/vim/commit/520e1e41f35b063ede63b41738c82d6636e78c34
Christian Brabandt <cb@256bit.org>
parents:
7660
diff
changeset
|
831 } |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
832 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
833 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
834 Py_INCREF(Py_None); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
835 ret = Py_None; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
836 } |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
837 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
838 return ret; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
839 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
840 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
841 static PyObject * |
4500 | 842 VimEval(PyObject *self UNUSED, PyObject *args) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
843 { |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
844 char_u *expr; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
845 typval_T *our_tv; |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
846 PyObject *string; |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
847 PyObject *todecref; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
848 PyObject *ret; |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
849 PyObject *lookup_dict; |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
850 |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
851 if (!PyArg_ParseTuple(args, "O", &string)) |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
852 return NULL; |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
853 |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
854 if (!(expr = StringToChars(string, &todecref))) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
855 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
856 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
857 Py_BEGIN_ALLOW_THREADS |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
858 Python_Lock_Vim(); |
4498 | 859 VimTryStart(); |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
860 our_tv = eval_expr(expr, NULL); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
861 Python_Release_Vim(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
862 Py_END_ALLOW_THREADS |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
863 |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
864 Py_XDECREF(todecref); |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
865 |
4498 | 866 if (VimTryEnd()) |
867 return NULL; | |
868 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
869 if (our_tv == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
870 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
871 PyErr_SET_VIM(N_("invalid expression")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
872 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
873 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
874 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
875 /* Convert the Vim type into a Python type. Create a dictionary that's |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
876 * used to check for recursive loops. */ |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
877 if (!(lookup_dict = PyDict_New())) |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
878 ret = NULL; |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
879 else |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
880 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
881 ret = VimToPython(our_tv, 1, lookup_dict); |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
882 Py_DECREF(lookup_dict); |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
883 } |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
884 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
885 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
886 Py_BEGIN_ALLOW_THREADS |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
887 Python_Lock_Vim(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
888 free_tv(our_tv); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
889 Python_Release_Vim(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
890 Py_END_ALLOW_THREADS |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
891 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
892 return ret; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
893 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
894 |
3618 | 895 static PyObject *ConvertToPyObject(typval_T *); |
896 | |
897 static PyObject * | |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
898 VimEvalPy(PyObject *self UNUSED, PyObject *string) |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
899 { |
3618 | 900 typval_T *our_tv; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
901 PyObject *ret; |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
902 char_u *expr; |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
903 PyObject *todecref; |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
904 |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
905 if (!(expr = StringToChars(string, &todecref))) |
3618 | 906 return NULL; |
907 | |
908 Py_BEGIN_ALLOW_THREADS | |
909 Python_Lock_Vim(); | |
4498 | 910 VimTryStart(); |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
911 our_tv = eval_expr(expr, NULL); |
3618 | 912 Python_Release_Vim(); |
913 Py_END_ALLOW_THREADS | |
914 | |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
915 Py_XDECREF(todecref); |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
916 |
4498 | 917 if (VimTryEnd()) |
918 return NULL; | |
919 | |
3618 | 920 if (our_tv == NULL) |
921 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
922 PyErr_SET_VIM(N_("invalid expression")); |
3618 | 923 return NULL; |
924 } | |
925 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
926 ret = ConvertToPyObject(our_tv); |
3618 | 927 Py_BEGIN_ALLOW_THREADS |
928 Python_Lock_Vim(); | |
929 free_tv(our_tv); | |
930 Python_Release_Vim(); | |
931 Py_END_ALLOW_THREADS | |
932 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
933 return ret; |
3618 | 934 } |
935 | |
936 static PyObject * | |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
937 VimStrwidth(PyObject *self UNUSED, PyObject *string) |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
938 { |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
939 char_u *str; |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
940 PyObject *todecref; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
941 int len; |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
942 |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
943 if (!(str = StringToChars(string, &todecref))) |
3618 | 944 return NULL; |
945 | |
3988 | 946 #ifdef FEAT_MBYTE |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
947 len = mb_string2cells(str, (int)STRLEN(str)); |
3988 | 948 #else |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
949 len = STRLEN(str); |
3988 | 950 #endif |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
951 |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
952 Py_XDECREF(todecref); |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
953 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
954 return PyLong_FromLong(len); |
3618 | 955 } |
956 | |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
957 static PyObject * |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
958 _VimChdir(PyObject *_chdir, PyObject *args, PyObject *kwargs) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
959 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
960 PyObject *ret; |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
961 PyObject *newwd; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
962 PyObject *todecref; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
963 char_u *new_dir; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
964 |
4754
be1e4acb30ca
updated for version 7.3.1124
Bram Moolenaar <bram@vim.org>
parents:
4722
diff
changeset
|
965 if (_chdir == NULL) |
be1e4acb30ca
updated for version 7.3.1124
Bram Moolenaar <bram@vim.org>
parents:
4722
diff
changeset
|
966 return NULL; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
967 if (!(ret = PyObject_Call(_chdir, args, kwargs))) |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
968 return NULL; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
969 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
970 if (!(newwd = PyObject_CallFunctionObjArgs(py_getcwd, NULL))) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
971 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
972 Py_DECREF(ret); |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
973 return NULL; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
974 } |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
975 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
976 if (!(new_dir = StringToChars(newwd, &todecref))) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
977 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
978 Py_DECREF(ret); |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
979 Py_DECREF(newwd); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
980 return NULL; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
981 } |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
982 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
983 VimTryStart(); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
984 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
985 if (vim_chdir(new_dir)) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
986 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
987 Py_DECREF(ret); |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
988 Py_DECREF(newwd); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
989 Py_XDECREF(todecref); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
990 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
991 if (VimTryEnd()) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
992 return NULL; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
993 |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
994 PyErr_SET_VIM(N_("failed to change directory")); |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
995 return NULL; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
996 } |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
997 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
998 Py_DECREF(newwd); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
999 Py_XDECREF(todecref); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1000 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1001 post_chdir(FALSE); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1002 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1003 if (VimTryEnd()) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1004 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1005 Py_DECREF(ret); |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1006 return NULL; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1007 } |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1008 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1009 return ret; |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1010 } |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1011 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1012 static PyObject * |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1013 VimChdir(PyObject *self UNUSED, PyObject *args, PyObject *kwargs) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1014 { |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1015 return _VimChdir(py_chdir, args, kwargs); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1016 } |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1017 |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1018 static PyObject * |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1019 VimFchdir(PyObject *self UNUSED, PyObject *args, PyObject *kwargs) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1020 { |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1021 return _VimChdir(py_fchdir, args, kwargs); |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1022 } |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
1023 |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1024 typedef struct { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1025 PyObject *callable; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1026 PyObject *result; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1027 } map_rtp_data; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1028 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1029 static void |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1030 map_rtp_callback(char_u *path, void *_data) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1031 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1032 void **data = (void **) _data; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1033 PyObject *pathObject; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1034 map_rtp_data *mr_data = *((map_rtp_data **) data); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1035 |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
1036 if (!(pathObject = PyString_FromString((char *)path))) |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1037 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1038 *data = NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1039 return; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1040 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1041 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1042 mr_data->result = PyObject_CallFunctionObjArgs(mr_data->callable, |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1043 pathObject, NULL); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1044 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1045 Py_DECREF(pathObject); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1046 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1047 if (!mr_data->result || mr_data->result != Py_None) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1048 *data = NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1049 else |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1050 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1051 Py_DECREF(mr_data->result); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1052 mr_data->result = NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1053 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1054 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1055 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1056 static PyObject * |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
1057 VimForeachRTP(PyObject *self UNUSED, PyObject *callable) |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1058 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1059 map_rtp_data data; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1060 |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
1061 data.callable = callable; |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1062 data.result = NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1063 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1064 do_in_runtimepath(NULL, FALSE, &map_rtp_callback, &data); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1065 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1066 if (data.result == NULL) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1067 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1068 if (PyErr_Occurred()) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1069 return NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1070 else |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1071 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1072 Py_INCREF(Py_None); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1073 return Py_None; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1074 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1075 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1076 return data.result; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1077 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1078 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1079 /* |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1080 * _vim_runtimepath_ special path implementation. |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1081 */ |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1082 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1083 static void |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1084 map_finder_callback(char_u *path, void *_data) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1085 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1086 void **data = (void **) _data; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1087 PyObject *list = *((PyObject **) data); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1088 PyObject *pathObject1, *pathObject2; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1089 char *pathbuf; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1090 size_t pathlen; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1091 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1092 pathlen = STRLEN(path); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1093 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1094 #if PY_MAJOR_VERSION < 3 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1095 # define PY_MAIN_DIR_STRING "python2" |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1096 #else |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1097 # define PY_MAIN_DIR_STRING "python3" |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1098 #endif |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1099 #define PY_ALTERNATE_DIR_STRING "pythonx" |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1100 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1101 #define PYTHONX_STRING_LENGTH 7 /* STRLEN("pythonx") */ |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1102 if (!(pathbuf = PyMem_New(char, |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1103 pathlen + STRLEN(PATHSEPSTR) + PYTHONX_STRING_LENGTH + 1))) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1104 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1105 PyErr_NoMemory(); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1106 *data = NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1107 return; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1108 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1109 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1110 mch_memmove(pathbuf, path, pathlen + 1); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1111 add_pathsep((char_u *) pathbuf); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1112 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1113 pathlen = STRLEN(pathbuf); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1114 mch_memmove(pathbuf + pathlen, PY_MAIN_DIR_STRING, |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1115 PYTHONX_STRING_LENGTH + 1); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1116 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1117 if (!(pathObject1 = PyString_FromString(pathbuf))) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1118 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1119 *data = NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1120 PyMem_Free(pathbuf); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1121 return; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1122 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1123 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1124 mch_memmove(pathbuf + pathlen, PY_ALTERNATE_DIR_STRING, |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1125 PYTHONX_STRING_LENGTH + 1); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1126 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1127 if (!(pathObject2 = PyString_FromString(pathbuf))) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1128 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1129 Py_DECREF(pathObject1); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1130 PyMem_Free(pathbuf); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1131 *data = NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1132 return; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1133 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1134 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1135 PyMem_Free(pathbuf); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1136 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1137 if (PyList_Append(list, pathObject1) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1138 || PyList_Append(list, pathObject2)) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1139 *data = NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1140 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1141 Py_DECREF(pathObject1); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1142 Py_DECREF(pathObject2); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1143 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1144 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1145 static PyObject * |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1146 Vim_GetPaths(PyObject *self UNUSED) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1147 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1148 PyObject *ret; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1149 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1150 if (!(ret = PyList_New(0))) |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1151 return NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1152 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1153 do_in_runtimepath(NULL, FALSE, &map_finder_callback, ret); |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1154 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1155 if (PyErr_Occurred()) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1156 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1157 Py_DECREF(ret); |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1158 return NULL; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1159 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1160 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1161 return ret; |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1162 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1163 |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1164 static PyObject * |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1165 call_load_module(char *name, int len, PyObject *find_module_result) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1166 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1167 PyObject *fd, *pathname, *description; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1168 |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1169 if (!PyTuple_Check(find_module_result)) |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1170 { |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1171 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1172 N_("expected 3-tuple as imp.find_module() result, but got %s"), |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1173 Py_TYPE_NAME(find_module_result)); |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1174 return NULL; |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1175 } |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1176 if (PyTuple_GET_SIZE(find_module_result) != 3) |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1177 { |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1178 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1179 N_("expected 3-tuple as imp.find_module() result, but got " |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1180 "tuple of size %d"), |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1181 (int) PyTuple_GET_SIZE(find_module_result)); |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1182 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1183 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1184 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1185 if (!(fd = PyTuple_GET_ITEM(find_module_result, 0)) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1186 || !(pathname = PyTuple_GET_ITEM(find_module_result, 1)) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1187 || !(description = PyTuple_GET_ITEM(find_module_result, 2))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1188 { |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
1189 PyErr_SET_STRING(PyExc_RuntimeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1190 N_("internal error: imp.find_module returned tuple with NULL")); |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1191 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1192 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1193 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1194 return PyObject_CallFunction(py_load_module, |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1195 "s#OOO", name, len, fd, pathname, description); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1196 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1197 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1198 static PyObject * |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1199 find_module(char *fullname, char *tail, PyObject *new_path) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1200 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1201 PyObject *find_module_result; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1202 PyObject *module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1203 char *dot; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1204 |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
1205 if ((dot = (char *)vim_strchr((char_u *) tail, '.'))) |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1206 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1207 /* |
4859
e48cabe98453
updated for version 7.3.1176
Bram Moolenaar <bram@vim.org>
parents:
4855
diff
changeset
|
1208 * There is a dot in the name: call find_module recursively without the |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1209 * first component |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1210 */ |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1211 PyObject *newest_path; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1212 int partlen = (int) (dot - 1 - tail); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1213 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1214 if (!(find_module_result = PyObject_CallFunction(py_find_module, |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1215 "s#O", tail, partlen, new_path))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1216 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1217 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1218 if (!(module = call_load_module( |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1219 fullname, |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1220 ((int) (tail - fullname)) + partlen, |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1221 find_module_result))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1222 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1223 Py_DECREF(find_module_result); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1224 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1225 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1226 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1227 Py_DECREF(find_module_result); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1228 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1229 if (!(newest_path = PyObject_GetAttrString(module, "__path__"))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1230 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1231 Py_DECREF(module); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1232 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1233 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1234 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1235 Py_DECREF(module); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1236 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1237 module = find_module(fullname, dot + 1, newest_path); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1238 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1239 Py_DECREF(newest_path); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1240 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1241 return module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1242 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1243 else |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1244 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1245 if (!(find_module_result = PyObject_CallFunction(py_find_module, |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1246 "sO", tail, new_path))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1247 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1248 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1249 if (!(module = call_load_module( |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1250 fullname, |
4859
e48cabe98453
updated for version 7.3.1176
Bram Moolenaar <bram@vim.org>
parents:
4855
diff
changeset
|
1251 (int)STRLEN(fullname), |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1252 find_module_result))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1253 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1254 Py_DECREF(find_module_result); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1255 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1256 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1257 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1258 Py_DECREF(find_module_result); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1259 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1260 return module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1261 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1262 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1263 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1264 static PyObject * |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1265 FinderFindModule(PyObject *self, PyObject *args) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1266 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1267 char *fullname; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1268 PyObject *module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1269 PyObject *new_path; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1270 LoaderObject *loader; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1271 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1272 if (!PyArg_ParseTuple(args, "s", &fullname)) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1273 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1274 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1275 if (!(new_path = Vim_GetPaths(self))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1276 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1277 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1278 module = find_module(fullname, fullname, new_path); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1279 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1280 Py_DECREF(new_path); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1281 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1282 if (!module) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1283 { |
4984
5b2c8f3b3906
updated for version 7.3.1237
Bram Moolenaar <bram@vim.org>
parents:
4982
diff
changeset
|
1284 if (PyErr_Occurred()) |
5b2c8f3b3906
updated for version 7.3.1237
Bram Moolenaar <bram@vim.org>
parents:
4982
diff
changeset
|
1285 { |
5b2c8f3b3906
updated for version 7.3.1237
Bram Moolenaar <bram@vim.org>
parents:
4982
diff
changeset
|
1286 if (PyErr_ExceptionMatches(PyExc_ImportError)) |
5b2c8f3b3906
updated for version 7.3.1237
Bram Moolenaar <bram@vim.org>
parents:
4982
diff
changeset
|
1287 PyErr_Clear(); |
5b2c8f3b3906
updated for version 7.3.1237
Bram Moolenaar <bram@vim.org>
parents:
4982
diff
changeset
|
1288 else |
5b2c8f3b3906
updated for version 7.3.1237
Bram Moolenaar <bram@vim.org>
parents:
4982
diff
changeset
|
1289 return NULL; |
5b2c8f3b3906
updated for version 7.3.1237
Bram Moolenaar <bram@vim.org>
parents:
4982
diff
changeset
|
1290 } |
5b2c8f3b3906
updated for version 7.3.1237
Bram Moolenaar <bram@vim.org>
parents:
4982
diff
changeset
|
1291 |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1292 Py_INCREF(Py_None); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1293 return Py_None; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1294 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1295 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1296 if (!(loader = PyObject_NEW(LoaderObject, &LoaderType))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1297 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1298 Py_DECREF(module); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1299 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1300 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1301 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1302 loader->module = module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1303 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1304 return (PyObject *) loader; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1305 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1306 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1307 static PyObject * |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1308 VimPathHook(PyObject *self UNUSED, PyObject *args) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1309 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1310 char *path; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1311 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1312 if (PyArg_ParseTuple(args, "s", &path) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1313 && STRCMP(path, vim_special_path) == 0) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1314 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1315 Py_INCREF(vim_module); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1316 return vim_module; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1317 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1318 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1319 PyErr_Clear(); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1320 PyErr_SetNone(PyExc_ImportError); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1321 return NULL; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1322 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
1323 |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1324 /* |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1325 * Vim module - Definitions |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1326 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1327 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1328 static struct PyMethodDef VimMethods[] = { |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1329 /* name, function, calling, documentation */ |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
1330 {"command", VimCommand, METH_O, "Execute a Vim ex-mode command" }, |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1331 {"eval", VimEval, METH_VARARGS, "Evaluate an expression using Vim evaluator" }, |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
1332 {"bindeval", VimEvalPy, METH_O, "Like eval(), but returns objects attached to vim ones"}, |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
1333 {"strwidth", VimStrwidth, METH_O, "Screen string width, counts <Tab> as having width 1"}, |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1334 {"chdir", (PyCFunction)VimChdir, METH_VARARGS|METH_KEYWORDS, "Change directory"}, |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1335 {"fchdir", (PyCFunction)VimFchdir, METH_VARARGS|METH_KEYWORDS, "Change directory"}, |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
1336 {"foreach_rtp", VimForeachRTP, METH_O, "Call given callable for each path in &rtp"}, |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1337 {"find_module", FinderFindModule, METH_VARARGS, "Internal use only, returns loader object for any input it receives"}, |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1338 {"path_hook", VimPathHook, METH_VARARGS, "Hook function to install in sys.path_hooks"}, |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1339 {"_get_paths", (PyCFunction)Vim_GetPaths, METH_NOARGS, "Get &rtp-based additions to sys.path"}, |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
1340 { NULL, NULL, 0, NULL} |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1341 }; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1342 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1343 /* |
4397 | 1344 * Generic iterator object |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1345 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1346 |
4397 | 1347 static PyTypeObject IterType; |
1348 | |
1349 typedef PyObject *(*nextfun)(void **); | |
1350 typedef void (*destructorfun)(void *); | |
4433 | 1351 typedef int (*traversefun)(void *, visitproc, void *); |
1352 typedef int (*clearfun)(void **); | |
4397 | 1353 |
4438 | 1354 /* Main purpose of this object is removing the need for do python |
1355 * initialization (i.e. PyType_Ready and setting type attributes) for a big | |
1356 * bunch of objects. */ | |
4385 | 1357 |
4319 | 1358 typedef struct |
1359 { | |
1360 PyObject_HEAD | |
4397 | 1361 void *cur; |
1362 nextfun next; | |
1363 destructorfun destruct; | |
4433 | 1364 traversefun traverse; |
1365 clearfun clear; | |
4397 | 1366 } IterObject; |
1367 | |
1368 static PyObject * | |
4433 | 1369 IterNew(void *start, destructorfun destruct, nextfun next, traversefun traverse, |
1370 clearfun clear) | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1371 { |
4397 | 1372 IterObject *self; |
1373 | |
4500 | 1374 self = PyObject_GC_New(IterObject, &IterType); |
4397 | 1375 self->cur = start; |
1376 self->next = next; | |
1377 self->destruct = destruct; | |
4433 | 1378 self->traverse = traverse; |
1379 self->clear = clear; | |
4397 | 1380 |
1381 return (PyObject *)(self); | |
1382 } | |
1383 | |
1384 static void | |
4488 | 1385 IterDestructor(IterObject *self) |
4397 | 1386 { |
4500 | 1387 PyObject_GC_UnTrack((void *)(self)); |
4488 | 1388 self->destruct(self->cur); |
4500 | 1389 PyObject_GC_Del((void *)(self)); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1390 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1391 |
4433 | 1392 static int |
4488 | 1393 IterTraverse(IterObject *self, visitproc visit, void *arg) |
4433 | 1394 { |
4488 | 1395 if (self->traverse != NULL) |
1396 return self->traverse(self->cur, visit, arg); | |
4433 | 1397 else |
1398 return 0; | |
1399 } | |
1400 | |
4438 | 1401 /* Mac OSX defines clear() somewhere. */ |
1402 #ifdef clear | |
1403 # undef clear | |
1404 #endif | |
1405 | |
4433 | 1406 static int |
4488 | 1407 IterClear(IterObject *self) |
4433 | 1408 { |
4488 | 1409 if (self->clear != NULL) |
1410 return self->clear(&self->cur); | |
4433 | 1411 else |
1412 return 0; | |
1413 } | |
1414 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1415 static PyObject * |
4488 | 1416 IterNext(IterObject *self) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1417 { |
4488 | 1418 return self->next(&self->cur); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1419 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
1420 |
4397 | 1421 static PyObject * |
1422 IterIter(PyObject *self) | |
1423 { | |
4609
12421d8a45d5
updated for version 7.3.1052
Bram Moolenaar <bram@vim.org>
parents:
4607
diff
changeset
|
1424 Py_INCREF(self); |
4397 | 1425 return self; |
1426 } | |
4393 | 1427 |
3618 | 1428 typedef struct pylinkedlist_S { |
1429 struct pylinkedlist_S *pll_next; | |
1430 struct pylinkedlist_S *pll_prev; | |
1431 PyObject *pll_obj; | |
1432 } pylinkedlist_T; | |
1433 | |
1434 static pylinkedlist_T *lastdict = NULL; | |
1435 static pylinkedlist_T *lastlist = NULL; | |
1436 | |
1437 static void | |
1438 pyll_remove(pylinkedlist_T *ref, pylinkedlist_T **last) | |
1439 { | |
1440 if (ref->pll_prev == NULL) | |
1441 { | |
1442 if (ref->pll_next == NULL) | |
1443 { | |
1444 *last = NULL; | |
1445 return; | |
1446 } | |
1447 } | |
1448 else | |
1449 ref->pll_prev->pll_next = ref->pll_next; | |
1450 | |
1451 if (ref->pll_next == NULL) | |
1452 *last = ref->pll_prev; | |
1453 else | |
1454 ref->pll_next->pll_prev = ref->pll_prev; | |
1455 } | |
1456 | |
1457 static void | |
1458 pyll_add(PyObject *self, pylinkedlist_T *ref, pylinkedlist_T **last) | |
1459 { | |
1460 if (*last == NULL) | |
1461 ref->pll_prev = NULL; | |
1462 else | |
1463 { | |
1464 (*last)->pll_next = ref; | |
1465 ref->pll_prev = *last; | |
1466 } | |
1467 ref->pll_next = NULL; | |
1468 ref->pll_obj = self; | |
1469 *last = ref; | |
1470 } | |
1471 | |
1472 static PyTypeObject DictionaryType; | |
1473 | |
1474 typedef struct | |
1475 { | |
1476 PyObject_HEAD | |
1477 dict_T *dict; | |
1478 pylinkedlist_T ref; | |
1479 } DictionaryObject; | |
1480 | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1481 static PyObject *DictionaryUpdate(DictionaryObject *, PyObject *, PyObject *); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1482 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1483 #define NEW_DICTIONARY(dict) DictionaryNew(&DictionaryType, dict) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1484 |
3618 | 1485 static PyObject * |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1486 DictionaryNew(PyTypeObject *subtype, dict_T *dict) |
3618 | 1487 { |
1488 DictionaryObject *self; | |
1489 | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1490 self = (DictionaryObject *) subtype->tp_alloc(subtype, 0); |
3618 | 1491 if (self == NULL) |
1492 return NULL; | |
1493 self->dict = dict; | |
1494 ++dict->dv_refcount; | |
1495 | |
1496 pyll_add((PyObject *)(self), &self->ref, &lastdict); | |
1497 | |
1498 return (PyObject *)(self); | |
1499 } | |
1500 | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1501 static dict_T * |
4922
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
1502 py_dict_alloc(void) |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1503 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1504 dict_T *ret; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1505 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1506 if (!(ret = dict_alloc())) |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1507 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1508 PyErr_NoMemory(); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1509 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1510 } |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1511 ++ret->dv_refcount; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1512 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1513 return ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1514 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1515 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1516 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1517 DictionaryConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1518 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1519 DictionaryObject *self; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1520 dict_T *dict; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1521 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1522 if (!(dict = py_dict_alloc())) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1523 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1524 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1525 self = (DictionaryObject *) DictionaryNew(subtype, dict); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1526 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1527 --dict->dv_refcount; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1528 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1529 if (kwargs || PyTuple_Size(args)) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1530 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1531 PyObject *tmp; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1532 if (!(tmp = DictionaryUpdate(self, args, kwargs))) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1533 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1534 Py_DECREF(self); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1535 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1536 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1537 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1538 Py_DECREF(tmp); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1539 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1540 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1541 return (PyObject *)(self); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1542 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1543 |
4319 | 1544 static void |
4488 | 1545 DictionaryDestructor(DictionaryObject *self) |
4319 | 1546 { |
4488 | 1547 pyll_remove(&self->ref, &lastdict); |
1548 dict_unref(self->dict); | |
4319 | 1549 |
1550 DESTRUCTOR_FINISH(self); | |
1551 } | |
1552 | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1553 static char *DictionaryAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1554 "locked", "scope", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1555 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1556 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1557 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1558 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1559 DictionaryDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1560 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1561 return ObjectDir(self, DictionaryAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1562 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
1563 |
3618 | 1564 static int |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1565 DictionarySetattr(DictionaryObject *self, char *name, PyObject *valObject) |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1566 { |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1567 if (valObject == NULL) |
3828 | 1568 { |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
1569 PyErr_SET_STRING(PyExc_AttributeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1570 N_("cannot delete vim.Dictionary attributes")); |
3828 | 1571 return -1; |
1572 } | |
1573 | |
1574 if (strcmp(name, "locked") == 0) | |
1575 { | |
4488 | 1576 if (self->dict->dv_lock == VAR_FIXED) |
3828 | 1577 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1578 PyErr_SET_STRING(PyExc_TypeError, |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1579 N_("cannot modify fixed dictionary")); |
3828 | 1580 return -1; |
1581 } | |
1582 else | |
1583 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1584 int istrue = PyObject_IsTrue(valObject); |
4411 | 1585 if (istrue == -1) |
1586 return -1; | |
1587 else if (istrue) | |
4488 | 1588 self->dict->dv_lock = VAR_LOCKED; |
3828 | 1589 else |
4488 | 1590 self->dict->dv_lock = 0; |
3828 | 1591 } |
1592 return 0; | |
1593 } | |
1594 else | |
1595 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1596 PyErr_FORMAT(PyExc_AttributeError, N_("cannot set attribute %s"), name); |
3828 | 1597 return -1; |
1598 } | |
1599 } | |
1600 | |
1601 static PyInt | |
4488 | 1602 DictionaryLength(DictionaryObject *self) |
3618 | 1603 { |
4488 | 1604 return ((PyInt) (self->dict->dv_hashtab.ht_used)); |
3618 | 1605 } |
1606 | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1607 #define DICT_FLAG_HAS_DEFAULT 0x01 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1608 #define DICT_FLAG_POP 0x02 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1609 #define DICT_FLAG_NONE_DEFAULT 0x04 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1610 #define DICT_FLAG_RETURN_BOOL 0x08 /* Incompatible with DICT_FLAG_POP */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1611 #define DICT_FLAG_RETURN_PAIR 0x10 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1612 |
3618 | 1613 static PyObject * |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1614 _DictionaryItem(DictionaryObject *self, PyObject *args, int flags) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1615 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1616 PyObject *keyObject; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1617 PyObject *defObject = ((flags & DICT_FLAG_NONE_DEFAULT)? Py_None : NULL); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1618 PyObject *ret; |
3618 | 1619 char_u *key; |
3792 | 1620 dictitem_T *di; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1621 dict_T *dict = self->dict; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1622 hashitem_T *hi; |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1623 PyObject *todecref; |
3618 | 1624 |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1625 if (flags & DICT_FLAG_HAS_DEFAULT) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1626 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1627 if (!PyArg_ParseTuple(args, "O|O", &keyObject, &defObject)) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1628 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1629 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1630 else |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1631 keyObject = args; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1632 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1633 if (flags & DICT_FLAG_RETURN_BOOL) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1634 defObject = Py_False; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1635 |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1636 if (!(key = StringToChars(keyObject, &todecref))) |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1637 return NULL; |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1638 |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1639 if (*key == NUL) |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1640 { |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1641 RAISE_NO_EMPTY_KEYS; |
4702
26f2dbea7443
updated for version 7.3.1098
Bram Moolenaar <bram@vim.org>
parents:
4698
diff
changeset
|
1642 Py_XDECREF(todecref); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1643 return NULL; |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1644 } |
3792 | 1645 |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1646 hi = hash_find(&dict->dv_hashtab, key); |
3792 | 1647 |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1648 Py_XDECREF(todecref); |
3824 | 1649 |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1650 if (HASHITEM_EMPTY(hi)) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1651 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1652 if (defObject) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1653 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1654 Py_INCREF(defObject); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1655 return defObject; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1656 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1657 else |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1658 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1659 PyErr_SetObject(PyExc_KeyError, keyObject); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1660 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1661 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1662 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1663 else if (flags & DICT_FLAG_RETURN_BOOL) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1664 { |
5666 | 1665 ret = Py_True; |
1666 Py_INCREF(ret); | |
1667 return ret; | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1668 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1669 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1670 di = dict_lookup(hi); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1671 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1672 if (!(ret = ConvertToPyObject(&di->di_tv))) |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1673 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1674 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1675 if (flags & DICT_FLAG_POP) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1676 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1677 if (dict->dv_lock) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1678 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1679 RAISE_LOCKED_DICTIONARY; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1680 Py_DECREF(ret); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1681 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1682 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1683 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1684 hash_remove(&dict->dv_hashtab, hi); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1685 dictitem_free(di); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1686 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1687 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1688 return ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1689 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1690 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1691 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1692 DictionaryItem(DictionaryObject *self, PyObject *keyObject) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1693 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1694 return _DictionaryItem(self, keyObject, 0); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1695 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1696 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1697 static int |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1698 DictionaryContains(DictionaryObject *self, PyObject *keyObject) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1699 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1700 PyObject *rObj = _DictionaryItem(self, keyObject, DICT_FLAG_RETURN_BOOL); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1701 int ret; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1702 |
5426 | 1703 if (rObj == NULL) |
1704 return -1; | |
1705 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1706 ret = (rObj == Py_True); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1707 |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
1708 Py_DECREF(rObj); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1709 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1710 return ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1711 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1712 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1713 typedef struct |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1714 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1715 hashitem_T *ht_array; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1716 long_u ht_used; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1717 hashtab_T *ht; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1718 hashitem_T *hi; |
4667
9e7ef781d494
updated for version 7.3.1081
Bram Moolenaar <bram@vim.org>
parents:
4659
diff
changeset
|
1719 long_u todo; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1720 } dictiterinfo_T; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1721 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1722 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1723 DictionaryIterNext(dictiterinfo_T **dii) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1724 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1725 PyObject *ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1726 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1727 if (!(*dii)->todo) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1728 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1729 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1730 if ((*dii)->ht->ht_array != (*dii)->ht_array || |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1731 (*dii)->ht->ht_used != (*dii)->ht_used) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1732 { |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
1733 PyErr_SET_STRING(PyExc_RuntimeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
1734 N_("hashtab changed during iteration")); |
3792 | 1735 return NULL; |
1736 } | |
3618 | 1737 |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1738 while (((*dii)->todo) && HASHITEM_EMPTY((*dii)->hi)) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1739 ++((*dii)->hi); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1740 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1741 --((*dii)->todo); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1742 |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
1743 if (!(ret = PyBytes_FromString((char *)(*dii)->hi->hi_key))) |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1744 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1745 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1746 return ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1747 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1748 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1749 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1750 DictionaryIter(DictionaryObject *self) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1751 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1752 dictiterinfo_T *dii; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1753 hashtab_T *ht; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1754 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1755 if (!(dii = PyMem_New(dictiterinfo_T, 1))) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1756 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1757 PyErr_NoMemory(); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1758 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1759 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1760 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1761 ht = &self->dict->dv_hashtab; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1762 dii->ht_array = ht->ht_array; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1763 dii->ht_used = ht->ht_used; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1764 dii->ht = ht; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1765 dii->hi = dii->ht_array; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1766 dii->todo = dii->ht_used; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1767 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1768 return IterNew(dii, |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1769 (destructorfun) PyMem_Free, (nextfun) DictionaryIterNext, |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1770 NULL, NULL); |
3618 | 1771 } |
1772 | |
1773 static PyInt | |
4922
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
1774 DictionaryAssItem( |
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
1775 DictionaryObject *self, PyObject *keyObject, PyObject *valObject) |
3618 | 1776 { |
1777 char_u *key; | |
1778 typval_T tv; | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
1779 dict_T *dict = self->dict; |
3618 | 1780 dictitem_T *di; |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1781 PyObject *todecref; |
3618 | 1782 |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
1783 if (dict->dv_lock) |
3618 | 1784 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1785 RAISE_LOCKED_DICTIONARY; |
3618 | 1786 return -1; |
1787 } | |
1788 | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1789 if (!(key = StringToChars(keyObject, &todecref))) |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1790 return -1; |
4702
26f2dbea7443
updated for version 7.3.1098
Bram Moolenaar <bram@vim.org>
parents:
4698
diff
changeset
|
1791 |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1792 if (*key == NUL) |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1793 { |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1794 RAISE_NO_EMPTY_KEYS; |
4706
bf917ee1fad2
updated for version 7.3.1100
Bram Moolenaar <bram@vim.org>
parents:
4704
diff
changeset
|
1795 Py_XDECREF(todecref); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1796 return -1; |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1797 } |
3618 | 1798 |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
1799 di = dict_find(dict, key, -1); |
3618 | 1800 |
1801 if (valObject == NULL) | |
1802 { | |
3636 | 1803 hashitem_T *hi; |
1804 | |
3618 | 1805 if (di == NULL) |
1806 { | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1807 Py_XDECREF(todecref); |
4403 | 1808 PyErr_SetObject(PyExc_KeyError, keyObject); |
3618 | 1809 return -1; |
1810 } | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
1811 hi = hash_find(&dict->dv_hashtab, di->di_key); |
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
1812 hash_remove(&dict->dv_hashtab, hi); |
3618 | 1813 dictitem_free(di); |
4706
bf917ee1fad2
updated for version 7.3.1100
Bram Moolenaar <bram@vim.org>
parents:
4704
diff
changeset
|
1814 Py_XDECREF(todecref); |
3618 | 1815 return 0; |
1816 } | |
1817 | |
1818 if (ConvertFromPyObject(valObject, &tv) == -1) | |
4706
bf917ee1fad2
updated for version 7.3.1100
Bram Moolenaar <bram@vim.org>
parents:
4704
diff
changeset
|
1819 { |
bf917ee1fad2
updated for version 7.3.1100
Bram Moolenaar <bram@vim.org>
parents:
4704
diff
changeset
|
1820 Py_XDECREF(todecref); |
3618 | 1821 return -1; |
4706
bf917ee1fad2
updated for version 7.3.1100
Bram Moolenaar <bram@vim.org>
parents:
4704
diff
changeset
|
1822 } |
3618 | 1823 |
1824 if (di == NULL) | |
1825 { | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1826 if (!(di = dictitem_alloc(key))) |
3618 | 1827 { |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1828 Py_XDECREF(todecref); |
3618 | 1829 PyErr_NoMemory(); |
1830 return -1; | |
1831 } | |
1832 di->di_tv.v_lock = 0; | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1833 di->di_tv.v_type = VAR_UNKNOWN; |
3618 | 1834 |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
1835 if (dict_add(dict, di) == FAIL) |
3618 | 1836 { |
1837 vim_free(di); | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1838 dictitem_free(di); |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1839 RAISE_KEY_ADD_FAIL(key); |
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1840 Py_XDECREF(todecref); |
3618 | 1841 return -1; |
1842 } | |
1843 } | |
1844 else | |
1845 clear_tv(&di->di_tv); | |
1846 | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
1847 Py_XDECREF(todecref); |
3618 | 1848 |
1849 copy_tv(&tv, &di->di_tv); | |
4509
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
1850 clear_tv(&tv); |
3618 | 1851 return 0; |
1852 } | |
1853 | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1854 typedef PyObject *(*hi_to_py)(hashitem_T *); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1855 |
3618 | 1856 static PyObject * |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1857 DictionaryListObjects(DictionaryObject *self, hi_to_py hiconvert) |
3618 | 1858 { |
4488 | 1859 dict_T *dict = self->dict; |
3618 | 1860 long_u todo = dict->dv_hashtab.ht_used; |
1861 Py_ssize_t i = 0; | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1862 PyObject *ret; |
3618 | 1863 hashitem_T *hi; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1864 PyObject *newObj; |
3618 | 1865 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1866 ret = PyList_New(todo); |
3618 | 1867 for (hi = dict->dv_hashtab.ht_array; todo > 0; ++hi) |
1868 { | |
1869 if (!HASHITEM_EMPTY(hi)) | |
1870 { | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1871 if (!(newObj = hiconvert(hi))) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1872 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1873 Py_DECREF(ret); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1874 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1875 } |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1876 PyList_SET_ITEM(ret, i, newObj); |
3618 | 1877 --todo; |
1878 ++i; | |
1879 } | |
1880 } | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1881 return ret; |
3618 | 1882 } |
1883 | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1884 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1885 dict_key(hashitem_T *hi) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1886 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1887 return PyBytes_FromString((char *)(hi->hi_key)); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1888 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1889 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1890 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1891 DictionaryListKeys(DictionaryObject *self) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1892 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1893 return DictionaryListObjects(self, dict_key); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1894 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1895 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1896 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1897 dict_val(hashitem_T *hi) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1898 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1899 dictitem_T *di; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1900 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1901 di = dict_lookup(hi); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1902 return ConvertToPyObject(&di->di_tv); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1903 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1904 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1905 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1906 DictionaryListValues(DictionaryObject *self) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1907 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1908 return DictionaryListObjects(self, dict_val); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1909 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1910 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1911 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1912 dict_item(hashitem_T *hi) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1913 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1914 PyObject *keyObject; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1915 PyObject *valObject; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1916 PyObject *ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1917 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1918 if (!(keyObject = dict_key(hi))) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1919 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1920 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1921 if (!(valObject = dict_val(hi))) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1922 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1923 Py_DECREF(keyObject); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1924 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1925 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1926 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1927 ret = Py_BuildValue("(OO)", keyObject, valObject); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1928 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1929 Py_DECREF(keyObject); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1930 Py_DECREF(valObject); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1931 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1932 return ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1933 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1934 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1935 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1936 DictionaryListItems(DictionaryObject *self) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1937 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1938 return DictionaryListObjects(self, dict_item); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1939 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1940 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1941 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1942 DictionaryUpdate(DictionaryObject *self, PyObject *args, PyObject *kwargs) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1943 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1944 dict_T *dict = self->dict; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1945 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1946 if (dict->dv_lock) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1947 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
1948 RAISE_LOCKED_DICTIONARY; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1949 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1950 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1951 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1952 if (kwargs) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1953 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1954 typval_T tv; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1955 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1956 if (ConvertFromPyMapping(kwargs, &tv) == -1) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1957 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1958 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1959 VimTryStart(); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1960 dict_extend(self->dict, tv.vval.v_dict, (char_u *) "force"); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1961 clear_tv(&tv); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1962 if (VimTryEnd()) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1963 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1964 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1965 else |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1966 { |
5659 | 1967 PyObject *obj = NULL; |
1968 | |
1969 if (!PyArg_ParseTuple(args, "|O", &obj)) | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1970 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1971 |
5659 | 1972 if (obj == NULL) |
1973 { | |
1974 Py_INCREF(Py_None); | |
1975 return Py_None; | |
1976 } | |
1977 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1978 if (PyObject_HasAttrString(obj, "keys")) |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1979 return DictionaryUpdate(self, NULL, obj); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1980 else |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1981 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1982 PyObject *iterator; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1983 PyObject *item; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1984 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
1985 if (!(iterator = PyObject_GetIter(obj))) |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1986 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1987 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1988 while ((item = PyIter_Next(iterator))) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1989 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1990 PyObject *fast; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1991 PyObject *keyObject; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1992 PyObject *valObject; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1993 PyObject *todecref; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1994 char_u *key; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1995 dictitem_T *di; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1996 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1997 if (!(fast = PySequence_Fast(item, ""))) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1998 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
1999 Py_DECREF(iterator); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2000 Py_DECREF(item); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2001 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2002 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2003 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2004 Py_DECREF(item); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2005 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2006 if (PySequence_Fast_GET_SIZE(fast) != 2) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2007 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2008 Py_DECREF(iterator); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2009 Py_DECREF(fast); |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
2010 PyErr_FORMAT(PyExc_ValueError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2011 N_("expected sequence element of size 2, " |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2012 "but got sequence of size %d"), |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
2013 (int) PySequence_Fast_GET_SIZE(fast)); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2014 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2015 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2016 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2017 keyObject = PySequence_Fast_GET_ITEM(fast, 0); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2018 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2019 if (!(key = StringToChars(keyObject, &todecref))) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2020 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2021 Py_DECREF(iterator); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2022 Py_DECREF(fast); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2023 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2024 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2025 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2026 di = dictitem_alloc(key); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2027 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2028 Py_XDECREF(todecref); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2029 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2030 if (di == NULL) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2031 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2032 Py_DECREF(fast); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2033 Py_DECREF(iterator); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2034 PyErr_NoMemory(); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2035 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2036 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2037 di->di_tv.v_lock = 0; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2038 di->di_tv.v_type = VAR_UNKNOWN; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2039 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2040 valObject = PySequence_Fast_GET_ITEM(fast, 1); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2041 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2042 if (ConvertFromPyObject(valObject, &di->di_tv) == -1) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2043 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2044 Py_DECREF(iterator); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2045 Py_DECREF(fast); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2046 dictitem_free(di); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2047 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2048 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2049 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2050 Py_DECREF(fast); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2051 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2052 if (dict_add(dict, di) == FAIL) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2053 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
2054 RAISE_KEY_ADD_FAIL(di->di_key); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2055 Py_DECREF(iterator); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2056 dictitem_free(di); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2057 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2058 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2059 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2060 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2061 Py_DECREF(iterator); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2062 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2063 /* Iterator may have finished due to an exception */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2064 if (PyErr_Occurred()) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2065 return NULL; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2066 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2067 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2068 Py_INCREF(Py_None); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2069 return Py_None; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2070 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2071 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2072 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2073 DictionaryGet(DictionaryObject *self, PyObject *args) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2074 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2075 return _DictionaryItem(self, args, |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2076 DICT_FLAG_HAS_DEFAULT|DICT_FLAG_NONE_DEFAULT); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2077 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2078 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2079 static PyObject * |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2080 DictionaryPop(DictionaryObject *self, PyObject *args) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2081 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2082 return _DictionaryItem(self, args, DICT_FLAG_HAS_DEFAULT|DICT_FLAG_POP); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2083 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2084 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2085 static PyObject * |
4698
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2086 DictionaryPopItem(DictionaryObject *self) |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2087 { |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2088 hashitem_T *hi; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2089 PyObject *ret; |
4698
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2090 PyObject *valObject; |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2091 dictitem_T *di; |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2092 |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2093 if (self->dict->dv_hashtab.ht_used == 0) |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2094 { |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2095 PyErr_SetNone(PyExc_KeyError); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2096 return NULL; |
4698
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2097 } |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2098 |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2099 hi = self->dict->dv_hashtab.ht_array; |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2100 while (HASHITEM_EMPTY(hi)) |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2101 ++hi; |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2102 |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2103 di = dict_lookup(hi); |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2104 |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2105 if (!(valObject = ConvertToPyObject(&di->di_tv))) |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2106 return NULL; |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2107 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2108 if (!(ret = Py_BuildValue("(" Py_bytes_fmt "O)", hi->hi_key, valObject))) |
4698
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2109 { |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2110 Py_DECREF(valObject); |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2111 return NULL; |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2112 } |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2113 |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2114 hash_remove(&self->dict->dv_hashtab, hi); |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2115 dictitem_free(di); |
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2116 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2117 return ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2118 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2119 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2120 static PyObject * |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
2121 DictionaryHasKey(DictionaryObject *self, PyObject *keyObject) |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
2122 { |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2123 return _DictionaryItem(self, keyObject, DICT_FLAG_RETURN_BOOL); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2124 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2125 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2126 static PySequenceMethods DictionaryAsSeq = { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2127 0, /* sq_length */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2128 0, /* sq_concat */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2129 0, /* sq_repeat */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2130 0, /* sq_item */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2131 0, /* sq_slice */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2132 0, /* sq_ass_item */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2133 0, /* sq_ass_slice */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2134 (objobjproc) DictionaryContains, /* sq_contains */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2135 0, /* sq_inplace_concat */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2136 0, /* sq_inplace_repeat */ |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2137 }; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2138 |
4385 | 2139 static PyMappingMethods DictionaryAsMapping = { |
2140 (lenfunc) DictionaryLength, | |
2141 (binaryfunc) DictionaryItem, | |
2142 (objobjargproc) DictionaryAssItem, | |
2143 }; | |
2144 | |
3618 | 2145 static struct PyMethodDef DictionaryMethods[] = { |
4492 | 2146 {"keys", (PyCFunction)DictionaryListKeys, METH_NOARGS, ""}, |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2147 {"values", (PyCFunction)DictionaryListValues, METH_NOARGS, ""}, |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2148 {"items", (PyCFunction)DictionaryListItems, METH_NOARGS, ""}, |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2149 {"update", (PyCFunction)DictionaryUpdate, METH_VARARGS|METH_KEYWORDS, ""}, |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2150 {"get", (PyCFunction)DictionaryGet, METH_VARARGS, ""}, |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2151 {"pop", (PyCFunction)DictionaryPop, METH_VARARGS, ""}, |
4698
2db005052371
updated for version 7.3.1096
Bram Moolenaar <bram@vim.org>
parents:
4667
diff
changeset
|
2152 {"popitem", (PyCFunction)DictionaryPopItem, METH_NOARGS, ""}, |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
2153 {"has_key", (PyCFunction)DictionaryHasKey, METH_O, ""}, |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2154 {"__dir__", (PyCFunction)DictionaryDir, METH_NOARGS, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2155 { NULL, NULL, 0, NULL} |
3618 | 2156 }; |
2157 | |
2158 static PyTypeObject ListType; | |
2159 | |
2160 typedef struct | |
2161 { | |
2162 PyObject_HEAD | |
2163 list_T *list; | |
2164 pylinkedlist_T ref; | |
2165 } ListObject; | |
2166 | |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2167 #define NEW_LIST(list) ListNew(&ListType, list) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2168 |
3618 | 2169 static PyObject * |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2170 ListNew(PyTypeObject *subtype, list_T *list) |
3618 | 2171 { |
2172 ListObject *self; | |
2173 | |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2174 self = (ListObject *) subtype->tp_alloc(subtype, 0); |
3618 | 2175 if (self == NULL) |
2176 return NULL; | |
2177 self->list = list; | |
2178 ++list->lv_refcount; | |
2179 | |
2180 pyll_add((PyObject *)(self), &self->ref, &lastlist); | |
2181 | |
2182 return (PyObject *)(self); | |
2183 } | |
2184 | |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2185 static list_T * |
5166
467efeee8f9e
updated for version 7.4a.009
Bram Moolenaar <bram@vim.org>
parents:
5139
diff
changeset
|
2186 py_list_alloc(void) |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2187 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2188 list_T *ret; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2189 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2190 if (!(ret = list_alloc())) |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2191 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2192 PyErr_NoMemory(); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2193 return NULL; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2194 } |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2195 ++ret->lv_refcount; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2196 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2197 return ret; |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2198 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2199 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2200 static int |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2201 list_py_concat(list_T *l, PyObject *obj, PyObject *lookup_dict) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2202 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2203 PyObject *iterator; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2204 PyObject *item; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2205 listitem_T *li; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2206 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2207 if (!(iterator = PyObject_GetIter(obj))) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2208 return -1; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2209 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2210 while ((item = PyIter_Next(iterator))) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2211 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2212 if (!(li = listitem_alloc())) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2213 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2214 PyErr_NoMemory(); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2215 Py_DECREF(item); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2216 Py_DECREF(iterator); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2217 return -1; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2218 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2219 li->li_tv.v_lock = 0; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2220 li->li_tv.v_type = VAR_UNKNOWN; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2221 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2222 if (_ConvertFromPyObject(item, &li->li_tv, lookup_dict) == -1) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2223 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2224 Py_DECREF(item); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2225 Py_DECREF(iterator); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2226 listitem_free(li); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2227 return -1; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2228 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2229 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2230 Py_DECREF(item); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2231 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2232 list_append(l, li); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2233 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2234 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2235 Py_DECREF(iterator); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2236 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2237 /* Iterator may have finished due to an exception */ |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2238 if (PyErr_Occurred()) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2239 return -1; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2240 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2241 return 0; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2242 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2243 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2244 static PyObject * |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2245 ListConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2246 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2247 list_T *list; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2248 PyObject *obj = NULL; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2249 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2250 if (kwargs) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2251 { |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
2252 PyErr_SET_STRING(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2253 N_("list constructor does not accept keyword arguments")); |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2254 return NULL; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2255 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2256 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2257 if (!PyArg_ParseTuple(args, "|O", &obj)) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2258 return NULL; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2259 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2260 if (!(list = py_list_alloc())) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2261 return NULL; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2262 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2263 if (obj) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2264 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2265 PyObject *lookup_dict; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2266 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2267 if (!(lookup_dict = PyDict_New())) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2268 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2269 list_unref(list); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2270 return NULL; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2271 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2272 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2273 if (list_py_concat(list, obj, lookup_dict) == -1) |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2274 { |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2275 Py_DECREF(lookup_dict); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2276 list_unref(list); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2277 return NULL; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2278 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2279 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2280 Py_DECREF(lookup_dict); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2281 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2282 |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2283 return ListNew(subtype, list); |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2284 } |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
2285 |
4319 | 2286 static void |
4488 | 2287 ListDestructor(ListObject *self) |
4319 | 2288 { |
4488 | 2289 pyll_remove(&self->ref, &lastlist); |
2290 list_unref(self->list); | |
4319 | 2291 |
2292 DESTRUCTOR_FINISH(self); | |
2293 } | |
2294 | |
3618 | 2295 static PyInt |
4488 | 2296 ListLength(ListObject *self) |
3618 | 2297 { |
4488 | 2298 return ((PyInt) (self->list->lv_len)); |
3618 | 2299 } |
2300 | |
2301 static PyObject * | |
5608 | 2302 ListIndex(ListObject *self, Py_ssize_t index) |
3618 | 2303 { |
2304 listitem_T *li; | |
2305 | |
4488 | 2306 if (index >= ListLength(self)) |
3618 | 2307 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2308 PyErr_SET_STRING(PyExc_IndexError, N_("list index out of range")); |
3618 | 2309 return NULL; |
2310 } | |
4488 | 2311 li = list_find(self->list, (long) index); |
3618 | 2312 if (li == NULL) |
2313 { | |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
2314 /* No more suitable format specifications in python-2.3 */ |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2315 PyErr_VIM_FORMAT(N_("internal error: failed to get vim list item %d"), |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
2316 (int) index); |
3618 | 2317 return NULL; |
2318 } | |
2319 return ConvertToPyObject(&li->li_tv); | |
2320 } | |
2321 | |
2322 static PyObject * | |
5608 | 2323 ListSlice(ListObject *self, Py_ssize_t first, Py_ssize_t step, |
2324 Py_ssize_t slicelen) | |
3618 | 2325 { |
2326 PyInt i; | |
2327 PyObject *list; | |
5608 | 2328 |
2329 if (step == 0) | |
2330 { | |
2331 PyErr_SET_STRING(PyExc_ValueError, N_("slice step cannot be zero")); | |
2332 return NULL; | |
2333 } | |
2334 | |
2335 list = PyList_New(slicelen); | |
3618 | 2336 if (list == NULL) |
2337 return NULL; | |
2338 | |
5608 | 2339 for (i = 0; i < slicelen; ++i) |
2340 { | |
2341 PyObject *item; | |
2342 | |
2343 item = ListIndex(self, first + i*step); | |
3618 | 2344 if (item == NULL) |
2345 { | |
2346 Py_DECREF(list); | |
2347 return NULL; | |
2348 } | |
2349 | |
5608 | 2350 PyList_SET_ITEM(list, i, item); |
3618 | 2351 } |
2352 | |
2353 return list; | |
2354 } | |
2355 | |
5608 | 2356 static PyObject * |
2357 ListItem(ListObject *self, PyObject* idx) | |
2358 { | |
2359 #if PY_MAJOR_VERSION < 3 | |
2360 if (PyInt_Check(idx)) | |
2361 { | |
2362 long _idx = PyInt_AsLong(idx); | |
2363 return ListIndex(self, _idx); | |
2364 } | |
2365 else | |
2366 #endif | |
2367 if (PyLong_Check(idx)) | |
2368 { | |
2369 long _idx = PyLong_AsLong(idx); | |
2370 return ListIndex(self, _idx); | |
2371 } | |
2372 else if (PySlice_Check(idx)) | |
2373 { | |
2374 Py_ssize_t start, stop, step, slicelen; | |
2375 | |
5768 | 2376 if (PySlice_GetIndicesEx((PySliceObject_T *)idx, ListLength(self), |
5608 | 2377 &start, &stop, &step, &slicelen) < 0) |
2378 return NULL; | |
2379 return ListSlice(self, start, step, slicelen); | |
2380 } | |
2381 else | |
2382 { | |
2383 RAISE_INVALID_INDEX_TYPE(idx); | |
2384 return NULL; | |
2385 } | |
2386 } | |
2387 | |
2388 static void | |
2389 list_restore(Py_ssize_t numadded, Py_ssize_t numreplaced, Py_ssize_t slicelen, | |
2390 list_T *l, listitem_T **lis, listitem_T *lastaddedli) | |
2391 { | |
2392 while (numreplaced--) | |
2393 { | |
2394 list_insert(l, lis[numreplaced], lis[slicelen + numreplaced]); | |
2395 listitem_remove(l, lis[slicelen + numreplaced]); | |
2396 } | |
2397 while (numadded--) | |
2398 { | |
2399 listitem_T *next; | |
2400 | |
2401 next = lastaddedli->li_prev; | |
2402 listitem_remove(l, lastaddedli); | |
2403 lastaddedli = next; | |
2404 } | |
2405 } | |
2406 | |
2407 static int | |
2408 ListAssSlice(ListObject *self, Py_ssize_t first, | |
2409 Py_ssize_t step, Py_ssize_t slicelen, PyObject *obj) | |
2410 { | |
2411 PyObject *iterator; | |
2412 PyObject *item; | |
2413 listitem_T *li; | |
2414 listitem_T *lastaddedli = NULL; | |
2415 listitem_T *next; | |
2416 typval_T v; | |
2417 list_T *l = self->list; | |
2418 PyInt i; | |
2419 PyInt j; | |
2420 PyInt numreplaced = 0; | |
2421 PyInt numadded = 0; | |
2422 PyInt size; | |
5655 | 2423 listitem_T **lis = NULL; |
5608 | 2424 |
2425 size = ListLength(self); | |
2426 | |
2427 if (l->lv_lock) | |
2428 { | |
2429 RAISE_LOCKED_LIST; | |
2430 return -1; | |
2431 } | |
2432 | |
2433 if (step == 0) | |
2434 { | |
2435 PyErr_SET_STRING(PyExc_ValueError, N_("slice step cannot be zero")); | |
2436 return -1; | |
2437 } | |
2438 | |
2439 if (step != 1 && slicelen == 0) | |
2440 { | |
2441 /* Nothing to do. Only error out if obj has some items. */ | |
2442 int ret = 0; | |
2443 | |
2444 if (obj == NULL) | |
2445 return 0; | |
2446 | |
2447 if (!(iterator = PyObject_GetIter(obj))) | |
2448 return -1; | |
2449 | |
2450 if ((item = PyIter_Next(iterator))) | |
2451 { | |
2452 PyErr_FORMAT(PyExc_ValueError, | |
5695 | 2453 N_("attempt to assign sequence of size greater than %d " |
5608 | 2454 "to extended slice"), 0); |
2455 Py_DECREF(item); | |
2456 ret = -1; | |
2457 } | |
2458 Py_DECREF(iterator); | |
2459 return ret; | |
2460 } | |
2461 | |
2462 if (obj != NULL) | |
2463 /* XXX May allocate zero bytes. */ | |
2464 if (!(lis = PyMem_New(listitem_T *, slicelen * 2))) | |
2465 { | |
2466 PyErr_NoMemory(); | |
2467 return -1; | |
2468 } | |
2469 | |
2470 if (first == size) | |
2471 li = NULL; | |
2472 else | |
2473 { | |
2474 li = list_find(l, (long) first); | |
2475 if (li == NULL) | |
2476 { | |
2477 PyErr_VIM_FORMAT(N_("internal error: no vim list item %d"), | |
2478 (int)first); | |
2479 if (obj != NULL) | |
2480 PyMem_Free(lis); | |
2481 return -1; | |
2482 } | |
2483 i = slicelen; | |
2484 while (i-- && li != NULL) | |
2485 { | |
2486 j = step; | |
2487 next = li; | |
2488 if (step > 0) | |
2489 while (next != NULL && ((next = next->li_next) != NULL) && --j); | |
2490 else | |
2491 while (next != NULL && ((next = next->li_prev) != NULL) && ++j); | |
2492 | |
2493 if (obj == NULL) | |
2494 listitem_remove(l, li); | |
2495 else | |
2496 lis[slicelen - i - 1] = li; | |
2497 | |
2498 li = next; | |
2499 } | |
2500 if (li == NULL && i != -1) | |
2501 { | |
2502 PyErr_SET_VIM(N_("internal error: not enough list items")); | |
2503 if (obj != NULL) | |
2504 PyMem_Free(lis); | |
2505 return -1; | |
2506 } | |
2507 } | |
2508 | |
2509 if (obj == NULL) | |
2510 return 0; | |
2511 | |
2512 if (!(iterator = PyObject_GetIter(obj))) | |
2513 { | |
2514 PyMem_Free(lis); | |
2515 return -1; | |
2516 } | |
2517 | |
2518 i = 0; | |
2519 while ((item = PyIter_Next(iterator))) | |
2520 { | |
2521 if (ConvertFromPyObject(item, &v) == -1) | |
2522 { | |
2523 Py_DECREF(iterator); | |
2524 Py_DECREF(item); | |
2525 PyMem_Free(lis); | |
2526 return -1; | |
2527 } | |
2528 Py_DECREF(item); | |
2529 if (list_insert_tv(l, &v, numreplaced < slicelen | |
2530 ? lis[numreplaced] | |
2531 : li) == FAIL) | |
2532 { | |
2533 clear_tv(&v); | |
2534 PyErr_SET_VIM(N_("internal error: failed to add item to list")); | |
2535 list_restore(numadded, numreplaced, slicelen, l, lis, lastaddedli); | |
2536 PyMem_Free(lis); | |
2537 return -1; | |
2538 } | |
2539 if (numreplaced < slicelen) | |
2540 { | |
2541 lis[slicelen + numreplaced] = lis[numreplaced]->li_prev; | |
5871 | 2542 vimlist_remove(l, lis[numreplaced], lis[numreplaced]); |
5608 | 2543 numreplaced++; |
2544 } | |
2545 else | |
2546 { | |
2547 if (li) | |
2548 lastaddedli = li->li_prev; | |
2549 else | |
2550 lastaddedli = l->lv_last; | |
2551 numadded++; | |
2552 } | |
2553 clear_tv(&v); | |
2554 if (step != 1 && i >= slicelen) | |
2555 { | |
2556 Py_DECREF(iterator); | |
2557 PyErr_FORMAT(PyExc_ValueError, | |
5695 | 2558 N_("attempt to assign sequence of size greater than %d " |
5668 | 2559 "to extended slice"), (int) slicelen); |
5608 | 2560 list_restore(numadded, numreplaced, slicelen, l, lis, lastaddedli); |
2561 PyMem_Free(lis); | |
2562 return -1; | |
2563 } | |
2564 ++i; | |
2565 } | |
2566 Py_DECREF(iterator); | |
2567 | |
2568 if (step != 1 && i != slicelen) | |
2569 { | |
2570 PyErr_FORMAT2(PyExc_ValueError, | |
5668 | 2571 N_("attempt to assign sequence of size %d to extended slice " |
2572 "of size %d"), (int) i, (int) slicelen); | |
5608 | 2573 list_restore(numadded, numreplaced, slicelen, l, lis, lastaddedli); |
2574 PyMem_Free(lis); | |
2575 return -1; | |
2576 } | |
2577 | |
2578 if (PyErr_Occurred()) | |
2579 { | |
2580 list_restore(numadded, numreplaced, slicelen, l, lis, lastaddedli); | |
2581 PyMem_Free(lis); | |
2582 return -1; | |
2583 } | |
2584 | |
2585 for (i = 0; i < numreplaced; i++) | |
2586 listitem_free(lis[i]); | |
2587 if (step == 1) | |
2588 for (i = numreplaced; i < slicelen; i++) | |
2589 listitem_remove(l, lis[i]); | |
2590 | |
2591 PyMem_Free(lis); | |
2592 | |
2593 return 0; | |
2594 } | |
2595 | |
2596 static int | |
2597 ListAssIndex(ListObject *self, Py_ssize_t index, PyObject *obj) | |
2598 { | |
2599 typval_T tv; | |
2600 list_T *l = self->list; | |
2601 listitem_T *li; | |
2602 Py_ssize_t length = ListLength(self); | |
2603 | |
2604 if (l->lv_lock) | |
2605 { | |
2606 RAISE_LOCKED_LIST; | |
2607 return -1; | |
2608 } | |
2609 if (index > length || (index == length && obj == NULL)) | |
2610 { | |
2611 PyErr_SET_STRING(PyExc_IndexError, N_("list index out of range")); | |
2612 return -1; | |
2613 } | |
2614 | |
2615 if (obj == NULL) | |
2616 { | |
2617 li = list_find(l, (long) index); | |
5871 | 2618 vimlist_remove(l, li, li); |
5608 | 2619 clear_tv(&li->li_tv); |
2620 vim_free(li); | |
2621 return 0; | |
2622 } | |
2623 | |
2624 if (ConvertFromPyObject(obj, &tv) == -1) | |
2625 return -1; | |
2626 | |
2627 if (index == length) | |
2628 { | |
2629 if (list_append_tv(l, &tv) == FAIL) | |
2630 { | |
2631 clear_tv(&tv); | |
2632 PyErr_SET_VIM(N_("failed to add item to list")); | |
2633 return -1; | |
2634 } | |
2635 } | |
2636 else | |
2637 { | |
2638 li = list_find(l, (long) index); | |
2639 clear_tv(&li->li_tv); | |
2640 copy_tv(&tv, &li->li_tv); | |
2641 clear_tv(&tv); | |
2642 } | |
2643 return 0; | |
2644 } | |
2645 | |
2646 static Py_ssize_t | |
2647 ListAssItem(ListObject *self, PyObject *idx, PyObject *obj) | |
2648 { | |
2649 #if PY_MAJOR_VERSION < 3 | |
2650 if (PyInt_Check(idx)) | |
2651 { | |
2652 long _idx = PyInt_AsLong(idx); | |
2653 return ListAssIndex(self, _idx, obj); | |
2654 } | |
2655 else | |
2656 #endif | |
2657 if (PyLong_Check(idx)) | |
2658 { | |
2659 long _idx = PyLong_AsLong(idx); | |
2660 return ListAssIndex(self, _idx, obj); | |
2661 } | |
2662 else if (PySlice_Check(idx)) | |
2663 { | |
2664 Py_ssize_t start, stop, step, slicelen; | |
2665 | |
5768 | 2666 if (PySlice_GetIndicesEx((PySliceObject_T *)idx, ListLength(self), |
5608 | 2667 &start, &stop, &step, &slicelen) < 0) |
2668 return -1; | |
2669 return ListAssSlice(self, start, step, slicelen, | |
2670 obj); | |
2671 } | |
2672 else | |
2673 { | |
2674 RAISE_INVALID_INDEX_TYPE(idx); | |
2675 return -1; | |
2676 } | |
2677 } | |
2678 | |
2679 static PyObject * | |
2680 ListConcatInPlace(ListObject *self, PyObject *obj) | |
2681 { | |
2682 list_T *l = self->list; | |
2683 PyObject *lookup_dict; | |
2684 | |
2685 if (l->lv_lock) | |
2686 { | |
2687 RAISE_LOCKED_LIST; | |
2688 return NULL; | |
2689 } | |
2690 | |
2691 if (!(lookup_dict = PyDict_New())) | |
2692 return NULL; | |
2693 | |
2694 if (list_py_concat(l, obj, lookup_dict) == -1) | |
2695 { | |
2696 Py_DECREF(lookup_dict); | |
2697 return NULL; | |
2698 } | |
2699 Py_DECREF(lookup_dict); | |
2700 | |
2701 Py_INCREF(self); | |
2702 return (PyObject *)(self); | |
2703 } | |
2704 | |
4397 | 2705 typedef struct |
2706 { | |
2707 listwatch_T lw; | |
2708 list_T *list; | |
2709 } listiterinfo_T; | |
2710 | |
2711 static void | |
2712 ListIterDestruct(listiterinfo_T *lii) | |
2713 { | |
2714 list_rem_watch(lii->list, &lii->lw); | |
2715 PyMem_Free(lii); | |
2716 } | |
2717 | |
2718 static PyObject * | |
2719 ListIterNext(listiterinfo_T **lii) | |
2720 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2721 PyObject *ret; |
4397 | 2722 |
2723 if (!((*lii)->lw.lw_item)) | |
2724 return NULL; | |
2725 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2726 if (!(ret = ConvertToPyObject(&((*lii)->lw.lw_item->li_tv)))) |
4397 | 2727 return NULL; |
2728 | |
2729 (*lii)->lw.lw_item = (*lii)->lw.lw_item->li_next; | |
2730 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2731 return ret; |
4397 | 2732 } |
2733 | |
2734 static PyObject * | |
4488 | 2735 ListIter(ListObject *self) |
4397 | 2736 { |
2737 listiterinfo_T *lii; | |
4488 | 2738 list_T *l = self->list; |
4397 | 2739 |
2740 if (!(lii = PyMem_New(listiterinfo_T, 1))) | |
2741 { | |
2742 PyErr_NoMemory(); | |
2743 return NULL; | |
2744 } | |
2745 | |
2746 list_add_watch(l, &lii->lw); | |
2747 lii->lw.lw_item = l->lv_first; | |
2748 lii->list = l; | |
2749 | |
2750 return IterNew(lii, | |
4433 | 2751 (destructorfun) ListIterDestruct, (nextfun) ListIterNext, |
2752 NULL, NULL); | |
4397 | 2753 } |
2754 | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2755 static char *ListAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2756 "locked", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2757 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2758 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2759 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2760 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2761 ListDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2762 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2763 return ObjectDir(self, ListAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2764 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2765 |
3828 | 2766 static int |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2767 ListSetattr(ListObject *self, char *name, PyObject *valObject) |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2768 { |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2769 if (valObject == NULL) |
3828 | 2770 { |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
2771 PyErr_SET_STRING(PyExc_AttributeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2772 N_("cannot delete vim.List attributes")); |
3828 | 2773 return -1; |
2774 } | |
2775 | |
2776 if (strcmp(name, "locked") == 0) | |
2777 { | |
4488 | 2778 if (self->list->lv_lock == VAR_FIXED) |
3828 | 2779 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2780 PyErr_SET_STRING(PyExc_TypeError, N_("cannot modify fixed list")); |
3828 | 2781 return -1; |
2782 } | |
2783 else | |
2784 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2785 int istrue = PyObject_IsTrue(valObject); |
4411 | 2786 if (istrue == -1) |
2787 return -1; | |
2788 else if (istrue) | |
4488 | 2789 self->list->lv_lock = VAR_LOCKED; |
3828 | 2790 else |
4488 | 2791 self->list->lv_lock = 0; |
3828 | 2792 } |
2793 return 0; | |
2794 } | |
2795 else | |
2796 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2797 PyErr_FORMAT(PyExc_AttributeError, N_("cannot set attribute %s"), name); |
3828 | 2798 return -1; |
2799 } | |
2800 } | |
2801 | |
5608 | 2802 static PySequenceMethods ListAsSeq = { |
2803 (lenfunc) ListLength, /* sq_length, len(x) */ | |
2804 (binaryfunc) 0, /* RangeConcat, sq_concat, x+y */ | |
2805 0, /* RangeRepeat, sq_repeat, x*n */ | |
2806 (PyIntArgFunc) ListIndex, /* sq_item, x[i] */ | |
2807 0, /* was_sq_slice, x[i:j] */ | |
2808 (PyIntObjArgProc) ListAssIndex, /* sq_as_item, x[i]=v */ | |
2809 0, /* was_sq_ass_slice, x[i:j]=v */ | |
2810 0, /* sq_contains */ | |
2811 (binaryfunc) ListConcatInPlace,/* sq_inplace_concat */ | |
2812 0, /* sq_inplace_repeat */ | |
2813 }; | |
2814 | |
2815 static PyMappingMethods ListAsMapping = { | |
2816 /* mp_length */ (lenfunc) ListLength, | |
2817 /* mp_subscript */ (binaryfunc) ListItem, | |
2818 /* mp_ass_subscript */ (objobjargproc) ListAssItem, | |
2819 }; | |
2820 | |
3618 | 2821 static struct PyMethodDef ListMethods[] = { |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2822 {"extend", (PyCFunction)ListConcatInPlace, METH_O, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2823 {"__dir__", (PyCFunction)ListDir, METH_NOARGS, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2824 { NULL, NULL, 0, NULL} |
3618 | 2825 }; |
2826 | |
2827 typedef struct | |
2828 { | |
2829 PyObject_HEAD | |
2830 char_u *name; | |
2831 } FunctionObject; | |
2832 | |
2833 static PyTypeObject FunctionType; | |
2834 | |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2835 #define NEW_FUNCTION(name) FunctionNew(&FunctionType, name) |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2836 |
3618 | 2837 static PyObject * |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2838 FunctionNew(PyTypeObject *subtype, char_u *name) |
3618 | 2839 { |
2840 FunctionObject *self; | |
2841 | |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2842 self = (FunctionObject *) subtype->tp_alloc(subtype, 0); |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2843 |
3618 | 2844 if (self == NULL) |
2845 return NULL; | |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2846 |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2847 if (isdigit(*name)) |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2848 { |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2849 if (!translated_function_exists(name)) |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2850 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
2851 PyErr_FORMAT(PyExc_ValueError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2852 N_("unnamed function %s does not exist"), name); |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2853 return NULL; |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2854 } |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2855 self->name = vim_strsave(name); |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2856 func_ref(self->name); |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2857 } |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2858 else |
4641
59e6c2bd68e3
updated for version 7.3.1068
Bram Moolenaar <bram@vim.org>
parents:
4635
diff
changeset
|
2859 if ((self->name = get_expanded_name(name, |
59e6c2bd68e3
updated for version 7.3.1068
Bram Moolenaar <bram@vim.org>
parents:
4635
diff
changeset
|
2860 vim_strchr(name, AUTOLOAD_CHAR) == NULL)) |
59e6c2bd68e3
updated for version 7.3.1068
Bram Moolenaar <bram@vim.org>
parents:
4635
diff
changeset
|
2861 == NULL) |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2862 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2863 PyErr_FORMAT(PyExc_ValueError, |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2864 N_("function %s does not exist"), name); |
4641
59e6c2bd68e3
updated for version 7.3.1068
Bram Moolenaar <bram@vim.org>
parents:
4635
diff
changeset
|
2865 return NULL; |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2866 } |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2867 |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2868 return (PyObject *)(self); |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2869 } |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2870 |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2871 static PyObject * |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2872 FunctionConstructor(PyTypeObject *subtype, PyObject *args, PyObject *kwargs) |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2873 { |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2874 PyObject *self; |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2875 char_u *name; |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2876 |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2877 if (kwargs) |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2878 { |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
2879 PyErr_SET_STRING(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2880 N_("function constructor does not accept keyword arguments")); |
3618 | 2881 return NULL; |
2882 } | |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2883 |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
2884 if (!PyArg_ParseTuple(args, "et", "ascii", &name)) |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2885 return NULL; |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2886 |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2887 self = FunctionNew(subtype, name); |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2888 |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
2889 PyMem_Free(name); |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
2890 |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2891 return self; |
3618 | 2892 } |
2893 | |
4319 | 2894 static void |
4488 | 2895 FunctionDestructor(FunctionObject *self) |
4319 | 2896 { |
4488 | 2897 func_unref(self->name); |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
2898 vim_free(self->name); |
4319 | 2899 |
2900 DESTRUCTOR_FINISH(self); | |
2901 } | |
2902 | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2903 static char *FunctionAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2904 "softspace", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2905 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2906 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2907 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2908 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2909 FunctionDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2910 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2911 return ObjectDir(self, FunctionAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2912 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2913 |
3618 | 2914 static PyObject * |
4488 | 2915 FunctionCall(FunctionObject *self, PyObject *argsObject, PyObject *kwargs) |
3618 | 2916 { |
4488 | 2917 char_u *name = self->name; |
3618 | 2918 typval_T args; |
2919 typval_T selfdicttv; | |
2920 typval_T rettv; | |
2921 dict_T *selfdict = NULL; | |
2922 PyObject *selfdictObject; | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2923 PyObject *ret; |
3618 | 2924 int error; |
2925 | |
2926 if (ConvertFromPyObject(argsObject, &args) == -1) | |
2927 return NULL; | |
2928 | |
2929 if (kwargs != NULL) | |
2930 { | |
2931 selfdictObject = PyDict_GetItemString(kwargs, "self"); | |
2932 if (selfdictObject != NULL) | |
2933 { | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
2934 if (ConvertFromPyMapping(selfdictObject, &selfdicttv) == -1) |
4509
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
2935 { |
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
2936 clear_tv(&args); |
3618 | 2937 return NULL; |
4509
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
2938 } |
3618 | 2939 selfdict = selfdicttv.vval.v_dict; |
2940 } | |
2941 } | |
2942 | |
4415 | 2943 Py_BEGIN_ALLOW_THREADS |
2944 Python_Lock_Vim(); | |
2945 | |
4498 | 2946 VimTryStart(); |
3618 | 2947 error = func_call(name, &args, selfdict, &rettv); |
4415 | 2948 |
2949 Python_Release_Vim(); | |
2950 Py_END_ALLOW_THREADS | |
2951 | |
4498 | 2952 if (VimTryEnd()) |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2953 ret = NULL; |
4498 | 2954 else if (error != OK) |
3618 | 2955 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2956 ret = NULL; |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
2957 PyErr_VIM_FORMAT(N_("failed to run function %s"), (char *)name); |
3618 | 2958 } |
2959 else | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2960 ret = ConvertToPyObject(&rettv); |
3618 | 2961 |
2962 clear_tv(&args); | |
2963 clear_tv(&rettv); | |
4509
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
2964 if (selfdict != NULL) |
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
2965 clear_tv(&selfdicttv); |
3618 | 2966 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
2967 return ret; |
3618 | 2968 } |
2969 | |
4625
cb5c1e37ad4d
updated for version 7.3.1060
Bram Moolenaar <bram@vim.org>
parents:
4623
diff
changeset
|
2970 static PyObject * |
cb5c1e37ad4d
updated for version 7.3.1060
Bram Moolenaar <bram@vim.org>
parents:
4623
diff
changeset
|
2971 FunctionRepr(FunctionObject *self) |
cb5c1e37ad4d
updated for version 7.3.1060
Bram Moolenaar <bram@vim.org>
parents:
4623
diff
changeset
|
2972 { |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
2973 #ifdef Py_TRACE_REFS |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
2974 /* For unknown reason self->name may be NULL after calling |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
2975 * Finalize */ |
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
2976 return PyString_FromFormat("<vim.Function '%s'>", |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
2977 (self->name == NULL ? "<NULL>" : (char *)self->name)); |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
2978 #else |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
2979 return PyString_FromFormat("<vim.Function '%s'>", (char *)self->name); |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
2980 #endif |
4625
cb5c1e37ad4d
updated for version 7.3.1060
Bram Moolenaar <bram@vim.org>
parents:
4623
diff
changeset
|
2981 } |
cb5c1e37ad4d
updated for version 7.3.1060
Bram Moolenaar <bram@vim.org>
parents:
4623
diff
changeset
|
2982 |
3618 | 2983 static struct PyMethodDef FunctionMethods[] = { |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2984 {"__dir__", (PyCFunction)FunctionDir, METH_NOARGS, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
2985 { NULL, NULL, 0, NULL} |
3618 | 2986 }; |
2987 | |
4350 | 2988 /* |
2989 * Options object | |
2990 */ | |
2991 | |
2992 static PyTypeObject OptionsType; | |
2993 | |
2994 typedef int (*checkfun)(void *); | |
2995 | |
2996 typedef struct | |
2997 { | |
2998 PyObject_HEAD | |
5610 | 2999 int opt_type; |
3000 void *from; | |
3001 checkfun Check; | |
3002 PyObject *fromObj; | |
4350 | 3003 } OptionsObject; |
3004 | |
4433 | 3005 static int |
3006 dummy_check(void *arg UNUSED) | |
3007 { | |
3008 return 0; | |
3009 } | |
3010 | |
3011 static PyObject * | |
3012 OptionsNew(int opt_type, void *from, checkfun Check, PyObject *fromObj) | |
3013 { | |
3014 OptionsObject *self; | |
3015 | |
4500 | 3016 self = PyObject_GC_New(OptionsObject, &OptionsType); |
4433 | 3017 if (self == NULL) |
3018 return NULL; | |
3019 | |
3020 self->opt_type = opt_type; | |
3021 self->from = from; | |
3022 self->Check = Check; | |
3023 self->fromObj = fromObj; | |
3024 if (fromObj) | |
3025 Py_INCREF(fromObj); | |
3026 | |
3027 return (PyObject *)(self); | |
3028 } | |
3029 | |
3030 static void | |
4488 | 3031 OptionsDestructor(OptionsObject *self) |
4433 | 3032 { |
4500 | 3033 PyObject_GC_UnTrack((void *)(self)); |
3034 Py_XDECREF(self->fromObj); | |
3035 PyObject_GC_Del((void *)(self)); | |
4433 | 3036 } |
3037 | |
3038 static int | |
4488 | 3039 OptionsTraverse(OptionsObject *self, visitproc visit, void *arg) |
4433 | 3040 { |
4488 | 3041 Py_VISIT(self->fromObj); |
4433 | 3042 return 0; |
3043 } | |
3044 | |
3045 static int | |
4488 | 3046 OptionsClear(OptionsObject *self) |
4433 | 3047 { |
4488 | 3048 Py_CLEAR(self->fromObj); |
4433 | 3049 return 0; |
3050 } | |
3051 | |
4350 | 3052 static PyObject * |
4488 | 3053 OptionsItem(OptionsObject *self, PyObject *keyObject) |
4350 | 3054 { |
3055 char_u *key; | |
3056 int flags; | |
3057 long numval; | |
3058 char_u *stringval; | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3059 PyObject *todecref; |
4350 | 3060 |
4488 | 3061 if (self->Check(self->from)) |
4350 | 3062 return NULL; |
3063 | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3064 if (!(key = StringToChars(keyObject, &todecref))) |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3065 return NULL; |
4702
26f2dbea7443
updated for version 7.3.1098
Bram Moolenaar <bram@vim.org>
parents:
4698
diff
changeset
|
3066 |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3067 if (*key == NUL) |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3068 { |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3069 RAISE_NO_EMPTY_KEYS; |
4702
26f2dbea7443
updated for version 7.3.1098
Bram Moolenaar <bram@vim.org>
parents:
4698
diff
changeset
|
3070 Py_XDECREF(todecref); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3071 return NULL; |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3072 } |
4350 | 3073 |
3074 flags = get_option_value_strict(key, &numval, &stringval, | |
4488 | 3075 self->opt_type, self->from); |
4350 | 3076 |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3077 Py_XDECREF(todecref); |
4350 | 3078 |
3079 if (flags == 0) | |
3080 { | |
4403 | 3081 PyErr_SetObject(PyExc_KeyError, keyObject); |
4350 | 3082 return NULL; |
3083 } | |
3084 | |
3085 if (flags & SOPT_UNSET) | |
3086 { | |
3087 Py_INCREF(Py_None); | |
3088 return Py_None; | |
3089 } | |
3090 else if (flags & SOPT_BOOL) | |
3091 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3092 PyObject *ret; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3093 ret = numval ? Py_True : Py_False; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3094 Py_INCREF(ret); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3095 return ret; |
4350 | 3096 } |
3097 else if (flags & SOPT_NUM) | |
3098 return PyInt_FromLong(numval); | |
3099 else if (flags & SOPT_STRING) | |
3100 { | |
3101 if (stringval) | |
4509
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
3102 { |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
3103 PyObject *ret = PyBytes_FromString((char *)stringval); |
4509
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
3104 vim_free(stringval); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3105 return ret; |
4509
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
3106 } |
4350 | 3107 else |
3108 { | |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
3109 PyErr_SET_STRING(PyExc_RuntimeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3110 N_("unable to get option value")); |
4350 | 3111 return NULL; |
3112 } | |
3113 } | |
3114 else | |
3115 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3116 PyErr_SET_VIM(N_("internal error: unknown option type")); |
4350 | 3117 return NULL; |
3118 } | |
3119 } | |
3120 | |
3121 static int | |
5610 | 3122 OptionsContains(OptionsObject *self, PyObject *keyObject) |
3123 { | |
3124 char_u *key; | |
3125 PyObject *todecref; | |
3126 | |
3127 if (!(key = StringToChars(keyObject, &todecref))) | |
3128 return -1; | |
3129 | |
3130 if (*key == NUL) | |
3131 { | |
3132 Py_XDECREF(todecref); | |
3133 return 0; | |
3134 } | |
3135 | |
3136 if (get_option_value_strict(key, NULL, NULL, self->opt_type, NULL)) | |
3137 { | |
3138 Py_XDECREF(todecref); | |
3139 return 1; | |
3140 } | |
3141 else | |
3142 { | |
3143 Py_XDECREF(todecref); | |
3144 return 0; | |
3145 } | |
3146 } | |
3147 | |
3148 typedef struct | |
3149 { | |
3150 void *lastoption; | |
3151 int opt_type; | |
3152 } optiterinfo_T; | |
3153 | |
3154 static PyObject * | |
3155 OptionsIterNext(optiterinfo_T **oii) | |
3156 { | |
3157 char_u *name; | |
3158 | |
3159 if ((name = option_iter_next(&((*oii)->lastoption), (*oii)->opt_type))) | |
3160 return PyString_FromString((char *)name); | |
3161 | |
3162 return NULL; | |
3163 } | |
3164 | |
3165 static PyObject * | |
3166 OptionsIter(OptionsObject *self) | |
3167 { | |
3168 optiterinfo_T *oii; | |
3169 | |
3170 if (!(oii = PyMem_New(optiterinfo_T, 1))) | |
3171 { | |
3172 PyErr_NoMemory(); | |
3173 return NULL; | |
3174 } | |
3175 | |
3176 oii->opt_type = self->opt_type; | |
3177 oii->lastoption = NULL; | |
3178 | |
3179 return IterNew(oii, | |
3180 (destructorfun) PyMem_Free, (nextfun) OptionsIterNext, | |
3181 NULL, NULL); | |
3182 } | |
3183 | |
3184 static int | |
4922
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
3185 set_option_value_err(char_u *key, int numval, char_u *stringval, int opt_flags) |
4513
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3186 { |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3187 char_u *errmsg; |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3188 |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3189 if ((errmsg = set_option_value(key, numval, stringval, opt_flags))) |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3190 { |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3191 if (VimTryEnd()) |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3192 return FAIL; |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3193 PyErr_SetVim((char *)errmsg); |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3194 return FAIL; |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3195 } |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3196 return OK; |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3197 } |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3198 |
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3199 static int |
4922
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
3200 set_option_value_for( |
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
3201 char_u *key, |
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
3202 int numval, |
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
3203 char_u *stringval, |
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
3204 int opt_flags, |
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
3205 int opt_type, |
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
3206 void *from) |
4350 | 3207 { |
4509
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
3208 win_T *save_curwin = NULL; |
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
3209 tabpage_T *save_curtab = NULL; |
b498224f5b41
updated for version 7.3.1002
Bram Moolenaar <bram@vim.org>
parents:
4500
diff
changeset
|
3210 buf_T *save_curbuf = NULL; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3211 int set_ret = 0; |
4498 | 3212 |
3213 VimTryStart(); | |
4350 | 3214 switch (opt_type) |
3215 { | |
3216 case SREQ_WIN: | |
4429 | 3217 if (switch_win(&save_curwin, &save_curtab, (win_T *)from, |
4918
0792cc5133ce
updated for version 7.3.1204
Bram Moolenaar <bram@vim.org>
parents:
4859
diff
changeset
|
3218 win_find_tabpage((win_T *)from), FALSE) == FAIL) |
4350 | 3219 { |
6454 | 3220 restore_win(save_curwin, save_curtab, TRUE); |
4498 | 3221 if (VimTryEnd()) |
3222 return -1; | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3223 PyErr_SET_VIM(N_("problem while switching windows")); |
4350 | 3224 return -1; |
3225 } | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3226 set_ret = set_option_value_err(key, numval, stringval, opt_flags); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3227 restore_win(save_curwin, save_curtab, TRUE); |
4350 | 3228 break; |
3229 case SREQ_BUF: | |
4429 | 3230 switch_buffer(&save_curbuf, (buf_T *)from); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3231 set_ret = set_option_value_err(key, numval, stringval, opt_flags); |
4429 | 3232 restore_buffer(save_curbuf); |
4350 | 3233 break; |
3234 case SREQ_GLOBAL: | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3235 set_ret = set_option_value_err(key, numval, stringval, opt_flags); |
4350 | 3236 break; |
3237 } | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3238 if (set_ret == FAIL) |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3239 return -1; |
4498 | 3240 return VimTryEnd(); |
4350 | 3241 } |
3242 | |
3243 static int | |
4488 | 3244 OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject) |
4350 | 3245 { |
3246 char_u *key; | |
3247 int flags; | |
3248 int opt_flags; | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3249 int ret = 0; |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3250 PyObject *todecref; |
4350 | 3251 |
4488 | 3252 if (self->Check(self->from)) |
4350 | 3253 return -1; |
3254 | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3255 if (!(key = StringToChars(keyObject, &todecref))) |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3256 return -1; |
4702
26f2dbea7443
updated for version 7.3.1098
Bram Moolenaar <bram@vim.org>
parents:
4698
diff
changeset
|
3257 |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3258 if (*key == NUL) |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3259 { |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3260 RAISE_NO_EMPTY_KEYS; |
4702
26f2dbea7443
updated for version 7.3.1098
Bram Moolenaar <bram@vim.org>
parents:
4698
diff
changeset
|
3261 Py_XDECREF(todecref); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3262 return -1; |
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3263 } |
4350 | 3264 |
3265 flags = get_option_value_strict(key, NULL, NULL, | |
4488 | 3266 self->opt_type, self->from); |
4350 | 3267 |
3268 if (flags == 0) | |
3269 { | |
4403 | 3270 PyErr_SetObject(PyExc_KeyError, keyObject); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3271 Py_XDECREF(todecref); |
4350 | 3272 return -1; |
3273 } | |
3274 | |
3275 if (valObject == NULL) | |
3276 { | |
4488 | 3277 if (self->opt_type == SREQ_GLOBAL) |
4350 | 3278 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
3279 PyErr_FORMAT(PyExc_ValueError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3280 N_("unable to unset global option %s"), key); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3281 Py_XDECREF(todecref); |
4350 | 3282 return -1; |
3283 } | |
3284 else if (!(flags & SOPT_GLOBAL)) | |
3285 { | |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
3286 PyErr_FORMAT(PyExc_ValueError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3287 N_("unable to unset option %s " |
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3288 "which does not have global value"), key); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3289 Py_XDECREF(todecref); |
4350 | 3290 return -1; |
3291 } | |
3292 else | |
3293 { | |
4488 | 3294 unset_global_local_option(key, self->from); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3295 Py_XDECREF(todecref); |
4350 | 3296 return 0; |
3297 } | |
3298 } | |
3299 | |
4488 | 3300 opt_flags = (self->opt_type ? OPT_LOCAL : OPT_GLOBAL); |
4350 | 3301 |
3302 if (flags & SOPT_BOOL) | |
3303 { | |
4411 | 3304 int istrue = PyObject_IsTrue(valObject); |
4513
cadb57fbb781
updated for version 7.3.1004
Bram Moolenaar <bram@vim.org>
parents:
4511
diff
changeset
|
3305 |
4411 | 3306 if (istrue == -1) |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3307 ret = -1; |
4587
63c9b681c3db
updated for version 7.3.1041
Bram Moolenaar <bram@vim.org>
parents:
4575
diff
changeset
|
3308 else |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3309 ret = set_option_value_for(key, istrue, NULL, |
4587
63c9b681c3db
updated for version 7.3.1041
Bram Moolenaar <bram@vim.org>
parents:
4575
diff
changeset
|
3310 opt_flags, self->opt_type, self->from); |
4350 | 3311 } |
3312 else if (flags & SOPT_NUM) | |
3313 { | |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
3314 long val; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
3315 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
3316 if (NumberToLong(valObject, &val, NUMBER_INT)) |
4350 | 3317 { |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3318 Py_XDECREF(todecref); |
4350 | 3319 return -1; |
3320 } | |
3321 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3322 ret = set_option_value_for(key, (int) val, NULL, opt_flags, |
4488 | 3323 self->opt_type, self->from); |
4350 | 3324 } |
3325 else | |
3326 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3327 char_u *val; |
5525 | 3328 PyObject *todecref2; |
3329 | |
3330 if ((val = StringToChars(valObject, &todecref2))) | |
3331 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3332 ret = set_option_value_for(key, 0, val, opt_flags, |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
3333 self->opt_type, self->from); |
5525 | 3334 Py_XDECREF(todecref2); |
3335 } | |
4350 | 3336 else |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3337 ret = -1; |
4350 | 3338 } |
3339 | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
3340 Py_XDECREF(todecref); |
4587
63c9b681c3db
updated for version 7.3.1041
Bram Moolenaar <bram@vim.org>
parents:
4575
diff
changeset
|
3341 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3342 return ret; |
4350 | 3343 } |
3344 | |
5610 | 3345 static PySequenceMethods OptionsAsSeq = { |
3346 0, /* sq_length */ | |
3347 0, /* sq_concat */ | |
3348 0, /* sq_repeat */ | |
3349 0, /* sq_item */ | |
3350 0, /* sq_slice */ | |
3351 0, /* sq_ass_item */ | |
3352 0, /* sq_ass_slice */ | |
3353 (objobjproc) OptionsContains, /* sq_contains */ | |
3354 0, /* sq_inplace_concat */ | |
3355 0, /* sq_inplace_repeat */ | |
3356 }; | |
3357 | |
4350 | 3358 static PyMappingMethods OptionsAsMapping = { |
3359 (lenfunc) NULL, | |
3360 (binaryfunc) OptionsItem, | |
3361 (objobjargproc) OptionsAssItem, | |
3362 }; | |
3363 | |
4401 | 3364 /* Tabpage object |
3365 */ | |
3366 | |
3367 typedef struct | |
3368 { | |
3369 PyObject_HEAD | |
3370 tabpage_T *tab; | |
3371 } TabPageObject; | |
3372 | |
3373 static PyObject *WinListNew(TabPageObject *tabObject); | |
3374 | |
3375 static PyTypeObject TabPageType; | |
3376 | |
3377 static int | |
4488 | 3378 CheckTabPage(TabPageObject *self) |
4401 | 3379 { |
4488 | 3380 if (self->tab == INVALID_TABPAGE_VALUE) |
4401 | 3381 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3382 PyErr_SET_VIM(N_("attempt to refer to deleted tab page")); |
4401 | 3383 return -1; |
3384 } | |
3385 | |
3386 return 0; | |
3387 } | |
3388 | |
3389 static PyObject * | |
3390 TabPageNew(tabpage_T *tab) | |
3391 { | |
3392 TabPageObject *self; | |
3393 | |
3394 if (TAB_PYTHON_REF(tab)) | |
3395 { | |
3396 self = TAB_PYTHON_REF(tab); | |
3397 Py_INCREF(self); | |
3398 } | |
3399 else | |
3400 { | |
3401 self = PyObject_NEW(TabPageObject, &TabPageType); | |
3402 if (self == NULL) | |
3403 return NULL; | |
3404 self->tab = tab; | |
3405 TAB_PYTHON_REF(tab) = self; | |
3406 } | |
3407 | |
3408 return (PyObject *)(self); | |
3409 } | |
3410 | |
3411 static void | |
4488 | 3412 TabPageDestructor(TabPageObject *self) |
4401 | 3413 { |
4488 | 3414 if (self->tab && self->tab != INVALID_TABPAGE_VALUE) |
3415 TAB_PYTHON_REF(self->tab) = NULL; | |
4401 | 3416 |
3417 DESTRUCTOR_FINISH(self); | |
3418 } | |
3419 | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3420 static char *TabPageAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3421 "windows", "number", "vars", "window", "valid", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3422 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3423 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3424 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3425 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3426 TabPageDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3427 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3428 return ObjectDir(self, TabPageAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3429 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3430 |
4401 | 3431 static PyObject * |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3432 TabPageAttrValid(TabPageObject *self, char *name) |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3433 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3434 PyObject *ret; |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3435 |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3436 if (strcmp(name, "valid") != 0) |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3437 return NULL; |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3438 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3439 ret = ((self->tab == INVALID_TABPAGE_VALUE) ? Py_False : Py_True); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3440 Py_INCREF(ret); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3441 return ret; |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3442 } |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3443 |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3444 static PyObject * |
4488 | 3445 TabPageAttr(TabPageObject *self, char *name) |
4401 | 3446 { |
3447 if (strcmp(name, "windows") == 0) | |
4488 | 3448 return WinListNew(self); |
4401 | 3449 else if (strcmp(name, "number") == 0) |
4488 | 3450 return PyLong_FromLong((long) get_tab_number(self->tab)); |
4401 | 3451 else if (strcmp(name, "vars") == 0) |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
3452 return NEW_DICTIONARY(self->tab->tp_vars); |
4401 | 3453 else if (strcmp(name, "window") == 0) |
3454 { | |
3455 /* For current tab window.c does not bother to set or update tp_curwin | |
3456 */ | |
4488 | 3457 if (self->tab == curtab) |
4431 | 3458 return WindowNew(curwin, curtab); |
4401 | 3459 else |
4488 | 3460 return WindowNew(self->tab->tp_curwin, self->tab); |
4401 | 3461 } |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3462 else if (strcmp(name, "__members__") == 0) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3463 return ObjectDir(NULL, TabPageAttrs); |
4401 | 3464 return NULL; |
3465 } | |
3466 | |
3467 static PyObject * | |
4488 | 3468 TabPageRepr(TabPageObject *self) |
4401 | 3469 { |
4488 | 3470 if (self->tab == INVALID_TABPAGE_VALUE) |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
3471 return PyString_FromFormat("<tabpage object (deleted) at %p>", (self)); |
4401 | 3472 else |
3473 { | |
4488 | 3474 int t = get_tab_number(self->tab); |
4401 | 3475 |
3476 if (t == 0) | |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
3477 return PyString_FromFormat("<tabpage object (unknown) at %p>", |
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
3478 (self)); |
4401 | 3479 else |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
3480 return PyString_FromFormat("<tabpage %d>", t - 1); |
4401 | 3481 } |
3482 } | |
3483 | |
3484 static struct PyMethodDef TabPageMethods[] = { | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3485 /* name, function, calling, documentation */ |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3486 {"__dir__", (PyCFunction)TabPageDir, METH_NOARGS, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3487 { NULL, NULL, 0, NULL} |
4401 | 3488 }; |
3489 | |
3490 /* | |
3491 * Window list object | |
3492 */ | |
3493 | |
3494 static PyTypeObject TabListType; | |
3495 static PySequenceMethods TabListAsSeq; | |
3496 | |
3497 typedef struct | |
3498 { | |
3499 PyObject_HEAD | |
3500 } TabListObject; | |
3501 | |
3502 static PyInt | |
3503 TabListLength(PyObject *self UNUSED) | |
3504 { | |
3505 tabpage_T *tp = first_tabpage; | |
3506 PyInt n = 0; | |
3507 | |
3508 while (tp != NULL) | |
3509 { | |
3510 ++n; | |
3511 tp = tp->tp_next; | |
3512 } | |
3513 | |
3514 return n; | |
3515 } | |
3516 | |
3517 static PyObject * | |
3518 TabListItem(PyObject *self UNUSED, PyInt n) | |
3519 { | |
3520 tabpage_T *tp; | |
3521 | |
3522 for (tp = first_tabpage; tp != NULL; tp = tp->tp_next, --n) | |
3523 if (n == 0) | |
3524 return TabPageNew(tp); | |
3525 | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3526 PyErr_SET_STRING(PyExc_IndexError, N_("no such tab page")); |
4401 | 3527 return NULL; |
3528 } | |
3529 | |
4962
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
3530 /* |
b34d719b13cd
updated for version 7.3.1226
Bram Moolenaar <bram@vim.org>
parents:
4922
diff
changeset
|
3531 * Window object |
4385 | 3532 */ |
3533 | |
3534 typedef struct | |
3535 { | |
3536 PyObject_HEAD | |
3537 win_T *win; | |
4431 | 3538 TabPageObject *tabObject; |
4385 | 3539 } WindowObject; |
3540 | |
3541 static PyTypeObject WindowType; | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3542 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3543 static int |
4488 | 3544 CheckWindow(WindowObject *self) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3545 { |
4488 | 3546 if (self->win == INVALID_WINDOW_VALUE) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3547 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3548 PyErr_SET_VIM(N_("attempt to refer to deleted window")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3549 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3550 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3551 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3552 return 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3553 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3554 |
4319 | 3555 static PyObject * |
4431 | 3556 WindowNew(win_T *win, tabpage_T *tab) |
4377 | 3557 { |
3558 /* We need to handle deletion of windows underneath us. | |
3559 * If we add a "w_python*_ref" field to the win_T structure, | |
3560 * then we can get at it in win_free() in vim. We then | |
3561 * need to create only ONE Python object per window - if | |
3562 * we try to create a second, just INCREF the existing one | |
3563 * and return it. The (single) Python object referring to | |
3564 * the window is stored in "w_python*_ref". | |
3565 * On a win_free() we set the Python object's win_T* field | |
3566 * to an invalid value. We trap all uses of a window | |
3567 * object, and reject them if the win_T* field is invalid. | |
3568 * | |
4385 | 3569 * Python2 and Python3 get different fields and different objects: |
4377 | 3570 * w_python_ref and w_python3_ref fields respectively. |
3571 */ | |
3572 | |
3573 WindowObject *self; | |
3574 | |
3575 if (WIN_PYTHON_REF(win)) | |
3576 { | |
3577 self = WIN_PYTHON_REF(win); | |
3578 Py_INCREF(self); | |
3579 } | |
3580 else | |
3581 { | |
4500 | 3582 self = PyObject_GC_New(WindowObject, &WindowType); |
4377 | 3583 if (self == NULL) |
3584 return NULL; | |
3585 self->win = win; | |
3586 WIN_PYTHON_REF(win) = self; | |
3587 } | |
3588 | |
4431 | 3589 self->tabObject = ((TabPageObject *)(TabPageNew(tab))); |
3590 | |
4377 | 3591 return (PyObject *)(self); |
3592 } | |
3593 | |
4385 | 3594 static void |
4488 | 3595 WindowDestructor(WindowObject *self) |
4385 | 3596 { |
4500 | 3597 PyObject_GC_UnTrack((void *)(self)); |
4488 | 3598 if (self->win && self->win != INVALID_WINDOW_VALUE) |
3599 WIN_PYTHON_REF(self->win) = NULL; | |
4500 | 3600 Py_XDECREF(((PyObject *)(self->tabObject))); |
3601 PyObject_GC_Del((void *)(self)); | |
3602 } | |
3603 | |
3604 static int | |
3605 WindowTraverse(WindowObject *self, visitproc visit, void *arg) | |
3606 { | |
3607 Py_VISIT(((PyObject *)(self->tabObject))); | |
3608 return 0; | |
3609 } | |
3610 | |
3611 static int | |
3612 WindowClear(WindowObject *self) | |
3613 { | |
3614 Py_CLEAR(self->tabObject); | |
3615 return 0; | |
4385 | 3616 } |
3617 | |
4431 | 3618 static win_T * |
3619 get_firstwin(TabPageObject *tabObject) | |
3620 { | |
3621 if (tabObject) | |
3622 { | |
3623 if (CheckTabPage(tabObject)) | |
3624 return NULL; | |
3625 /* For current tab window.c does not bother to set or update tp_firstwin | |
3626 */ | |
3627 else if (tabObject->tab == curtab) | |
3628 return firstwin; | |
3629 else | |
3630 return tabObject->tab->tp_firstwin; | |
3631 } | |
3632 else | |
3633 return firstwin; | |
3634 } | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3635 static char *WindowAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3636 "buffer", "cursor", "height", "vars", "options", "number", "row", "col", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3637 "tabpage", "valid", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3638 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3639 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3640 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3641 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3642 WindowDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3643 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3644 return ObjectDir(self, WindowAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3645 } |
4431 | 3646 |
4377 | 3647 static PyObject * |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3648 WindowAttrValid(WindowObject *self, char *name) |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3649 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3650 PyObject *ret; |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3651 |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3652 if (strcmp(name, "valid") != 0) |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3653 return NULL; |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3654 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3655 ret = ((self->win == INVALID_WINDOW_VALUE) ? Py_False : Py_True); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3656 Py_INCREF(ret); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3657 return ret; |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3658 } |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3659 |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
3660 static PyObject * |
4488 | 3661 WindowAttr(WindowObject *self, char *name) |
4319 | 3662 { |
3663 if (strcmp(name, "buffer") == 0) | |
4488 | 3664 return (PyObject *)BufferNew(self->win->w_buffer); |
4319 | 3665 else if (strcmp(name, "cursor") == 0) |
3666 { | |
4488 | 3667 pos_T *pos = &self->win->w_cursor; |
4319 | 3668 |
3669 return Py_BuildValue("(ll)", (long)(pos->lnum), (long)(pos->col)); | |
3670 } | |
3671 else if (strcmp(name, "height") == 0) | |
4488 | 3672 return PyLong_FromLong((long)(self->win->w_height)); |
4383 | 3673 #ifdef FEAT_WINDOWS |
3674 else if (strcmp(name, "row") == 0) | |
4488 | 3675 return PyLong_FromLong((long)(self->win->w_winrow)); |
4383 | 3676 #endif |
4319 | 3677 #ifdef FEAT_VERTSPLIT |
3678 else if (strcmp(name, "width") == 0) | |
4488 | 3679 return PyLong_FromLong((long)(W_WIDTH(self->win))); |
4383 | 3680 else if (strcmp(name, "col") == 0) |
4488 | 3681 return PyLong_FromLong((long)(W_WINCOL(self->win))); |
4319 | 3682 #endif |
4323 | 3683 else if (strcmp(name, "vars") == 0) |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
3684 return NEW_DICTIONARY(self->win->w_vars); |
4350 | 3685 else if (strcmp(name, "options") == 0) |
4488 | 3686 return OptionsNew(SREQ_WIN, self->win, (checkfun) CheckWindow, |
3687 (PyObject *) self); | |
4379 | 3688 else if (strcmp(name, "number") == 0) |
4431 | 3689 { |
4488 | 3690 if (CheckTabPage(self->tabObject)) |
4431 | 3691 return NULL; |
3692 return PyLong_FromLong((long) | |
4488 | 3693 get_win_number(self->win, get_firstwin(self->tabObject))); |
4431 | 3694 } |
3695 else if (strcmp(name, "tabpage") == 0) | |
3696 { | |
4488 | 3697 Py_INCREF(self->tabObject); |
3698 return (PyObject *)(self->tabObject); | |
4431 | 3699 } |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3700 else if (strcmp(name, "__members__") == 0) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3701 return ObjectDir(NULL, WindowAttrs); |
4319 | 3702 else |
3703 return NULL; | |
3704 } | |
3705 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3706 static int |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3707 WindowSetattr(WindowObject *self, char *name, PyObject *valObject) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3708 { |
4488 | 3709 if (CheckWindow(self)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3710 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3711 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3712 if (strcmp(name, "buffer") == 0) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3713 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3714 PyErr_SET_STRING(PyExc_TypeError, N_("readonly attribute: buffer")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3715 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3716 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3717 else if (strcmp(name, "cursor") == 0) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3718 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3719 long lnum; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3720 long col; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3721 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
3722 if (!PyArg_Parse(valObject, "(ll)", &lnum, &col)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3723 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3724 |
4488 | 3725 if (lnum <= 0 || lnum > self->win->w_buffer->b_ml.ml_line_count) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3726 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3727 PyErr_SET_VIM(N_("cursor position outside buffer")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3728 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3729 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3730 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3731 /* Check for keyboard interrupts */ |
4498 | 3732 if (VimCheckInterrupt()) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3733 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3734 |
4488 | 3735 self->win->w_cursor.lnum = lnum; |
3736 self->win->w_cursor.col = col; | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3737 #ifdef FEAT_VIRTUALEDIT |
4488 | 3738 self->win->w_cursor.coladd = 0; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3739 #endif |
2933 | 3740 /* When column is out of range silently correct it. */ |
4488 | 3741 check_cursor_col_win(self->win); |
2933 | 3742 |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3743 update_screen(VALID); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3744 return 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3745 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3746 else if (strcmp(name, "height") == 0) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3747 { |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
3748 long height; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3749 win_T *savewin; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3750 |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
3751 if (NumberToLong(valObject, &height, NUMBER_INT|NUMBER_UNSIGNED)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3752 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3753 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3754 #ifdef FEAT_GUI |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3755 need_mouse_correct = TRUE; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3756 #endif |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3757 savewin = curwin; |
4488 | 3758 curwin = self->win; |
4498 | 3759 |
3760 VimTryStart(); | |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
3761 win_setheight((int) height); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3762 curwin = savewin; |
4498 | 3763 if (VimTryEnd()) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3764 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3765 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3766 return 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3767 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3768 #ifdef FEAT_VERTSPLIT |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3769 else if (strcmp(name, "width") == 0) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3770 { |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
3771 long width; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3772 win_T *savewin; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3773 |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
3774 if (NumberToLong(valObject, &width, NUMBER_INT|NUMBER_UNSIGNED)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3775 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3776 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3777 #ifdef FEAT_GUI |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3778 need_mouse_correct = TRUE; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3779 #endif |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3780 savewin = curwin; |
4488 | 3781 curwin = self->win; |
4498 | 3782 |
3783 VimTryStart(); | |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
3784 win_setwidth((int) width); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3785 curwin = savewin; |
4498 | 3786 if (VimTryEnd()) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3787 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3788 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3789 return 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3790 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3791 #endif |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3792 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3793 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3794 PyErr_SetString(PyExc_AttributeError, name); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3795 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3796 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3797 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3798 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3799 static PyObject * |
4488 | 3800 WindowRepr(WindowObject *self) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3801 { |
4488 | 3802 if (self->win == INVALID_WINDOW_VALUE) |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
3803 return PyString_FromFormat("<window object (deleted) at %p>", (self)); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3804 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3805 { |
4488 | 3806 int w = get_win_number(self->win, firstwin); |
4379 | 3807 |
3808 if (w == 0) | |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
3809 return PyString_FromFormat("<window object (unknown) at %p>", |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3810 (self)); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3811 else |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
3812 return PyString_FromFormat("<window %d>", w - 1); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3813 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3814 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3815 |
4385 | 3816 static struct PyMethodDef WindowMethods[] = { |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3817 /* name, function, calling, documentation */ |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3818 {"__dir__", (PyCFunction)WindowDir, METH_NOARGS, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
3819 { NULL, NULL, 0, NULL} |
4385 | 3820 }; |
3821 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3822 /* |
4385 | 3823 * Window list object |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3824 */ |
4319 | 3825 |
4385 | 3826 static PyTypeObject WinListType; |
3827 static PySequenceMethods WinListAsSeq; | |
3828 | |
4319 | 3829 typedef struct |
3830 { | |
3831 PyObject_HEAD | |
4401 | 3832 TabPageObject *tabObject; |
4319 | 3833 } WinListObject; |
3834 | |
4401 | 3835 static PyObject * |
3836 WinListNew(TabPageObject *tabObject) | |
3837 { | |
3838 WinListObject *self; | |
3839 | |
3840 self = PyObject_NEW(WinListObject, &WinListType); | |
3841 self->tabObject = tabObject; | |
3842 Py_INCREF(tabObject); | |
3843 | |
3844 return (PyObject *)(self); | |
3845 } | |
3846 | |
3847 static void | |
4488 | 3848 WinListDestructor(WinListObject *self) |
4401 | 3849 { |
4488 | 3850 TabPageObject *tabObject = self->tabObject; |
4401 | 3851 |
3852 if (tabObject) | |
4523
57393dc4b811
updated for version 7.3.1009
Bram Moolenaar <bram@vim.org>
parents:
4513
diff
changeset
|
3853 { |
4401 | 3854 Py_DECREF((PyObject *)(tabObject)); |
4523
57393dc4b811
updated for version 7.3.1009
Bram Moolenaar <bram@vim.org>
parents:
4513
diff
changeset
|
3855 } |
4401 | 3856 |
3857 DESTRUCTOR_FINISH(self); | |
3858 } | |
3859 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3860 static PyInt |
4488 | 3861 WinListLength(WinListObject *self) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3862 { |
4401 | 3863 win_T *w; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3864 PyInt n = 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3865 |
4488 | 3866 if (!(w = get_firstwin(self->tabObject))) |
4401 | 3867 return -1; |
3868 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3869 while (w != NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3870 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3871 ++n; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3872 w = W_NEXT(w); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3873 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3874 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3875 return n; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3876 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3877 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3878 static PyObject * |
4488 | 3879 WinListItem(WinListObject *self, PyInt n) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3880 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3881 win_T *w; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3882 |
4488 | 3883 if (!(w = get_firstwin(self->tabObject))) |
4401 | 3884 return NULL; |
3885 | |
3886 for (; w != NULL; w = W_NEXT(w), --n) | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3887 if (n == 0) |
4488 | 3888 return WindowNew(w, self->tabObject? self->tabObject->tab: curtab); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3889 |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3890 PyErr_SET_STRING(PyExc_IndexError, N_("no such window")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3891 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3892 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3893 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3894 /* Convert a Python string into a Vim line. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3895 * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3896 * The result is in allocated memory. All internal nulls are replaced by |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3897 * newline characters. It is an error for the string to contain newline |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3898 * characters. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3899 * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3900 * On errors, the Python exception data is set, and NULL is returned. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3901 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3902 static char * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3903 StringToLine(PyObject *obj) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3904 { |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3905 char *str; |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3906 char *save; |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3907 PyObject *bytes = NULL; |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
3908 Py_ssize_t len = 0; |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3909 PyInt i; |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3910 char *p; |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3911 |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3912 if (PyBytes_Check(obj)) |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3913 { |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3914 if (PyBytes_AsStringAndSize(obj, &str, &len) == -1 |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3915 || str == NULL) |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3916 return NULL; |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3917 } |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3918 else if (PyUnicode_Check(obj)) |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3919 { |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3920 if (!(bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL))) |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3921 return NULL; |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3922 |
4995
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3923 if (PyBytes_AsStringAndSize(bytes, &str, &len) == -1 |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3924 || str == NULL) |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3925 { |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3926 Py_DECREF(bytes); |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3927 return NULL; |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3928 } |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3929 } |
4995
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3930 else |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3931 { |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3932 #if PY_MAJOR_VERSION < 3 |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3933 PyErr_FORMAT(PyExc_TypeError, |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3934 N_("expected str() or unicode() instance, but got %s"), |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3935 Py_TYPE_NAME(obj)); |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3936 #else |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3937 PyErr_FORMAT(PyExc_TypeError, |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3938 N_("expected bytes() or str() instance, but got %s"), |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3939 Py_TYPE_NAME(obj)); |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3940 #endif |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3941 return NULL; |
b4a2eaf28b51
updated for version 7.3.1242
Bram Moolenaar <bram@vim.org>
parents:
4988
diff
changeset
|
3942 } |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3943 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3944 /* |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3945 * Error checking: String must not contain newlines, as we |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3946 * are replacing a single line, and we must replace it with |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3947 * a single line. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3948 * A trailing newline is removed, so that append(f.readlines()) works. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3949 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3950 p = memchr(str, '\n', len); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3951 if (p != NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3952 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3953 if (p == str + len - 1) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3954 --len; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3955 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3956 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
3957 PyErr_SET_VIM(N_("string cannot contain newlines")); |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
3958 Py_XDECREF(bytes); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3959 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3960 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3961 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3962 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3963 /* Create a copy of the string, with internal nulls replaced by |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3964 * newline characters, as is the vim convention. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3965 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3966 save = (char *)alloc((unsigned)(len+1)); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3967 if (save == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3968 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3969 PyErr_NoMemory(); |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
3970 Py_XDECREF(bytes); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3971 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3972 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3973 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3974 for (i = 0; i < len; ++i) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3975 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3976 if (str[i] == '\0') |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3977 save[i] = '\n'; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3978 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3979 save[i] = str[i]; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3980 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3981 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3982 save[i] = '\0'; |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
3983 Py_XDECREF(bytes); /* Python 2 does nothing here */ |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3984 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3985 return save; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3986 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3987 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3988 /* Get a line from the specified buffer. The line number is |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3989 * in Vim format (1-based). The line is returned as a Python |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3990 * string object. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3991 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3992 static PyObject * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3993 GetBufferLine(buf_T *buf, PyInt n) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3994 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3995 return LineToString((char *)ml_get_buf(buf, (linenr_T)n, FALSE)); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3996 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3997 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3998 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
3999 /* Get a list of lines from the specified buffer. The line numbers |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4000 * are in Vim format (1-based). The range is from lo up to, but not |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4001 * including, hi. The list is returned as a Python list of string objects. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4002 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4003 static PyObject * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4004 GetBufferLineList(buf_T *buf, PyInt lo, PyInt hi) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4005 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4006 PyInt i; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4007 PyInt n = hi - lo; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4008 PyObject *list = PyList_New(n); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4009 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4010 if (list == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4011 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4012 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4013 for (i = 0; i < n; ++i) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4014 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4015 PyObject *string = LineToString( |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4016 (char *)ml_get_buf(buf, (linenr_T)(lo+i), FALSE)); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4017 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4018 /* Error check - was the Python string creation OK? */ |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4019 if (string == NULL) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4020 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4021 Py_DECREF(list); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4022 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4023 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4024 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4025 PyList_SET_ITEM(list, i, string); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4026 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4027 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4028 /* The ownership of the Python list is passed to the caller (ie, |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4029 * the caller should Py_DECREF() the object when it is finished |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4030 * with it). |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4031 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4032 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4033 return list; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4034 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4035 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4036 /* |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4037 * Check if deleting lines made the cursor position invalid. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4038 * Changed the lines from "lo" to "hi" and added "extra" lines (negative if |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4039 * deleted). |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4040 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4041 static void |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4042 py_fix_cursor(linenr_T lo, linenr_T hi, linenr_T extra) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4043 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4044 if (curwin->w_cursor.lnum >= lo) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4045 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4046 /* Adjust the cursor position if it's in/after the changed |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4047 * lines. */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4048 if (curwin->w_cursor.lnum >= hi) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4049 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4050 curwin->w_cursor.lnum += extra; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4051 check_cursor_col(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4052 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4053 else if (extra < 0) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4054 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4055 curwin->w_cursor.lnum = lo; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4056 check_cursor(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4057 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4058 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4059 check_cursor_col(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4060 changed_cline_bef_curs(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4061 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4062 invalidate_botline(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4063 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4064 |
2894 | 4065 /* |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4066 * Find a window that contains "buf" and switch to it. |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4067 * If there is no such window, use the current window and change "curbuf". |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4068 * Caller must initialize save_curbuf to NULL. |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4069 * restore_win_for_buf() MUST be called later! |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4070 */ |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4071 static void |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4072 switch_to_win_for_buf( |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4073 buf_T *buf, |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4074 win_T **save_curwinp, |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4075 tabpage_T **save_curtabp, |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4076 buf_T **save_curbufp) |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4077 { |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4078 win_T *wp; |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4079 tabpage_T *tp; |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4080 |
6454 | 4081 if (find_win_for_buf(buf, &wp, &tp) == FAIL) |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4082 switch_buffer(save_curbufp, buf); |
6454 | 4083 else if (switch_win(save_curwinp, save_curtabp, wp, tp, TRUE) == FAIL) |
4084 { | |
4085 restore_win(*save_curwinp, *save_curtabp, TRUE); | |
4086 switch_buffer(save_curbufp, buf); | |
4087 } | |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4088 } |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4089 |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4090 static void |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4091 restore_win_for_buf( |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4092 win_T *save_curwin, |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4093 tabpage_T *save_curtab, |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4094 buf_T *save_curbuf) |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4095 { |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4096 if (save_curbuf == NULL) |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4097 restore_win(save_curwin, save_curtab, TRUE); |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4098 else |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4099 restore_buffer(save_curbuf); |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4100 } |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4101 |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4102 /* |
2894 | 4103 * Replace a line in the specified buffer. The line number is |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4104 * in Vim format (1-based). The replacement line is given as |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4105 * a Python string object. The object is checked for validity |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4106 * and correct format. Errors are returned as a value of FAIL. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4107 * The return value is OK on success. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4108 * If OK is returned and len_change is not NULL, *len_change |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4109 * is set to the change in the buffer length. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4110 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4111 static int |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4112 SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4113 { |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4114 buf_T *save_curbuf = NULL; |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4115 win_T *save_curwin = NULL; |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4116 tabpage_T *save_curtab = NULL; |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4117 |
4352 | 4118 /* First of all, we check the type of the supplied Python object. |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4119 * There are three cases: |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4120 * 1. NULL, or None - this is a deletion. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4121 * 2. A string - this is a replacement. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4122 * 3. Anything else - this is an error. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4123 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4124 if (line == Py_None || line == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4125 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4126 PyErr_Clear(); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4127 switch_to_win_for_buf(buf, &save_curwin, &save_curtab, &save_curbuf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4128 |
4498 | 4129 VimTryStart(); |
4130 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4131 if (u_savedel((linenr_T)n, 1L) == FAIL) |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
4132 RAISE_UNDO_FAIL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4133 else if (ml_delete((linenr_T)n, FALSE) == FAIL) |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4134 RAISE_DELETE_LINE_FAIL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4135 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4136 { |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4137 if (buf == curbuf) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4138 py_fix_cursor((linenr_T)n, (linenr_T)n + 1, (linenr_T)-1); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4139 if (save_curbuf == NULL) |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4140 /* Only adjust marks if we managed to switch to a window that |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4141 * holds the buffer, otherwise line numbers will be invalid. */ |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4142 deleted_lines_mark((linenr_T)n, 1L); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4143 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4144 |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4145 restore_win_for_buf(save_curwin, save_curtab, save_curbuf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4146 |
4498 | 4147 if (VimTryEnd()) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4148 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4149 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4150 if (len_change) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4151 *len_change = -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4152 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4153 return OK; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4154 } |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
4155 else if (PyBytes_Check(line) || PyUnicode_Check(line)) |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
4156 { |
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
4157 char *save = StringToLine(line); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4158 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4159 if (save == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4160 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4161 |
4498 | 4162 VimTryStart(); |
4163 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4164 /* We do not need to free "save" if ml_replace() consumes it. */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4165 PyErr_Clear(); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4166 switch_to_win_for_buf(buf, &save_curwin, &save_curtab, &save_curbuf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4167 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4168 if (u_savesub((linenr_T)n) == FAIL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4169 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
4170 RAISE_UNDO_FAIL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4171 vim_free(save); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4172 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4173 else if (ml_replace((linenr_T)n, (char_u *)save, FALSE) == FAIL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4174 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4175 RAISE_REPLACE_LINE_FAIL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4176 vim_free(save); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4177 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4178 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4179 changed_bytes((linenr_T)n, 0); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4180 |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4181 restore_win_for_buf(save_curwin, save_curtab, save_curbuf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4182 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4183 /* Check that the cursor is not beyond the end of the line now. */ |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4184 if (buf == curbuf) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4185 check_cursor_col(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4186 |
4498 | 4187 if (VimTryEnd()) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4188 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4189 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4190 if (len_change) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4191 *len_change = 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4192 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4193 return OK; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4194 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4195 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4196 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4197 PyErr_BadArgument(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4198 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4199 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4200 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4201 |
2894 | 4202 /* Replace a range of lines in the specified buffer. The line numbers are in |
4203 * Vim format (1-based). The range is from lo up to, but not including, hi. | |
4204 * The replacement lines are given as a Python list of string objects. The | |
4205 * list is checked for validity and correct format. Errors are returned as a | |
4206 * value of FAIL. The return value is OK on success. | |
4207 * If OK is returned and len_change is not NULL, *len_change | |
4208 * is set to the change in the buffer length. | |
4209 */ | |
4210 static int | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4211 SetBufferLineList( |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4212 buf_T *buf, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4213 PyInt lo, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4214 PyInt hi, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4215 PyObject *list, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4216 PyInt *len_change) |
2894 | 4217 { |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4218 buf_T *save_curbuf = NULL; |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4219 win_T *save_curwin = NULL; |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4220 tabpage_T *save_curtab = NULL; |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4221 |
4352 | 4222 /* First of all, we check the type of the supplied Python object. |
2894 | 4223 * There are three cases: |
4224 * 1. NULL, or None - this is a deletion. | |
4225 * 2. A list - this is a replacement. | |
4226 * 3. Anything else - this is an error. | |
4227 */ | |
4228 if (list == Py_None || list == NULL) | |
4229 { | |
4230 PyInt i; | |
4231 PyInt n = (int)(hi - lo); | |
4232 | |
4233 PyErr_Clear(); | |
4498 | 4234 VimTryStart(); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4235 switch_to_win_for_buf(buf, &save_curwin, &save_curtab, &save_curbuf); |
2894 | 4236 |
4237 if (u_savedel((linenr_T)lo, (long)n) == FAIL) | |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
4238 RAISE_UNDO_FAIL; |
2894 | 4239 else |
4240 { | |
4241 for (i = 0; i < n; ++i) | |
4242 { | |
4243 if (ml_delete((linenr_T)lo, FALSE) == FAIL) | |
4244 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4245 RAISE_DELETE_LINE_FAIL; |
2894 | 4246 break; |
4247 } | |
4248 } | |
6176 | 4249 if (buf == curbuf && (save_curwin != NULL || save_curbuf == NULL)) |
4250 /* Using an existing window for the buffer, adjust the cursor | |
4251 * position. */ | |
2894 | 4252 py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4253 if (save_curbuf == NULL) |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4254 /* Only adjust marks if we managed to switch to a window that |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4255 * holds the buffer, otherwise line numbers will be invalid. */ |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4256 deleted_lines_mark((linenr_T)lo, (long)i); |
2894 | 4257 } |
4258 | |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4259 restore_win_for_buf(save_curwin, save_curtab, save_curbuf); |
2894 | 4260 |
4498 | 4261 if (VimTryEnd()) |
2894 | 4262 return FAIL; |
4263 | |
4264 if (len_change) | |
4265 *len_change = -n; | |
4266 | |
4267 return OK; | |
4268 } | |
4269 else if (PyList_Check(list)) | |
4270 { | |
4271 PyInt i; | |
4272 PyInt new_len = PyList_Size(list); | |
4273 PyInt old_len = hi - lo; | |
4274 PyInt extra = 0; /* lines added to text, can be negative */ | |
4275 char **array; | |
4276 | |
4277 if (new_len == 0) /* avoid allocating zero bytes */ | |
4278 array = NULL; | |
4279 else | |
4280 { | |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4281 array = PyMem_New(char *, new_len); |
2894 | 4282 if (array == NULL) |
4283 { | |
4284 PyErr_NoMemory(); | |
4285 return FAIL; | |
4286 } | |
4287 } | |
4288 | |
4289 for (i = 0; i < new_len; ++i) | |
4290 { | |
4633
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4291 PyObject *line; |
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4292 |
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4293 if (!(line = PyList_GetItem(list, i)) || |
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4294 !(array[i] = StringToLine(line))) |
2894 | 4295 { |
4296 while (i) | |
4297 vim_free(array[--i]); | |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4298 PyMem_Free(array); |
2894 | 4299 return FAIL; |
4300 } | |
4301 } | |
4302 | |
4498 | 4303 VimTryStart(); |
2894 | 4304 PyErr_Clear(); |
4429 | 4305 |
4633
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4306 /* START of region without "return". Must call restore_buffer()! */ |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4307 switch_to_win_for_buf(buf, &save_curwin, &save_curtab, &save_curbuf); |
2894 | 4308 |
4309 if (u_save((linenr_T)(lo-1), (linenr_T)hi) == FAIL) | |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
4310 RAISE_UNDO_FAIL; |
2894 | 4311 |
4312 /* If the size of the range is reducing (ie, new_len < old_len) we | |
4313 * need to delete some old_len. We do this at the start, by | |
4314 * repeatedly deleting line "lo". | |
4315 */ | |
4316 if (!PyErr_Occurred()) | |
4317 { | |
4318 for (i = 0; i < old_len - new_len; ++i) | |
4319 if (ml_delete((linenr_T)lo, FALSE) == FAIL) | |
4320 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4321 RAISE_DELETE_LINE_FAIL; |
2894 | 4322 break; |
4323 } | |
4324 extra -= i; | |
4325 } | |
4326 | |
4327 /* For as long as possible, replace the existing old_len with the | |
4328 * new old_len. This is a more efficient operation, as it requires | |
4329 * less memory allocation and freeing. | |
4330 */ | |
4331 if (!PyErr_Occurred()) | |
4332 { | |
4333 for (i = 0; i < old_len && i < new_len; ++i) | |
4334 if (ml_replace((linenr_T)(lo+i), (char_u *)array[i], FALSE) | |
4335 == FAIL) | |
4336 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4337 RAISE_REPLACE_LINE_FAIL; |
2894 | 4338 break; |
4339 } | |
4340 } | |
4341 else | |
4342 i = 0; | |
4343 | |
4344 /* Now we may need to insert the remaining new old_len. If we do, we | |
4345 * must free the strings as we finish with them (we can't pass the | |
4346 * responsibility to vim in this case). | |
4347 */ | |
4348 if (!PyErr_Occurred()) | |
4349 { | |
4350 while (i < new_len) | |
4351 { | |
4352 if (ml_append((linenr_T)(lo + i - 1), | |
4353 (char_u *)array[i], 0, FALSE) == FAIL) | |
4354 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4355 RAISE_INSERT_LINE_FAIL; |
2894 | 4356 break; |
4357 } | |
4358 vim_free(array[i]); | |
4359 ++i; | |
4360 ++extra; | |
4361 } | |
4362 } | |
4363 | |
4364 /* Free any left-over old_len, as a result of an error */ | |
4365 while (i < new_len) | |
4366 { | |
4367 vim_free(array[i]); | |
4368 ++i; | |
4369 } | |
4370 | |
4371 /* Free the array of old_len. All of its contents have now | |
4372 * been dealt with (either freed, or the responsibility passed | |
4373 * to vim. | |
4374 */ | |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4375 PyMem_Free(array); |
2894 | 4376 |
4377 /* Adjust marks. Invalidate any which lie in the | |
4378 * changed range, and move any in the remainder of the buffer. | |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4379 * Only adjust marks if we managed to switch to a window that holds |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4380 * the buffer, otherwise line numbers will be invalid. */ |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4381 if (save_curbuf == NULL) |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4382 mark_adjust((linenr_T)lo, (linenr_T)(hi - 1), |
2894 | 4383 (long)MAXLNUM, (long)extra); |
4384 changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra); | |
4385 | |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4386 if (buf == curbuf) |
2894 | 4387 py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)extra); |
4388 | |
4633
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4389 /* END of region without "return". */ |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4390 restore_win_for_buf(save_curwin, save_curtab, save_curbuf); |
2894 | 4391 |
4498 | 4392 if (VimTryEnd()) |
2894 | 4393 return FAIL; |
4394 | |
4395 if (len_change) | |
4396 *len_change = new_len - old_len; | |
4397 | |
4398 return OK; | |
4399 } | |
4400 else | |
4401 { | |
4402 PyErr_BadArgument(); | |
4403 return FAIL; | |
4404 } | |
4405 } | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4406 |
4352 | 4407 /* Insert a number of lines into the specified buffer after the specified line. |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4408 * The line number is in Vim format (1-based). The lines to be inserted are |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4409 * given as a Python list of string objects or as a single string. The lines |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4410 * to be added are checked for validity and correct format. Errors are |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4411 * returned as a value of FAIL. The return value is OK on success. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4412 * If OK is returned and len_change is not NULL, *len_change |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4413 * is set to the change in the buffer length. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4414 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4415 static int |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4416 InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4417 { |
5202
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4418 buf_T *save_curbuf = NULL; |
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4419 win_T *save_curwin = NULL; |
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4420 tabpage_T *save_curtab = NULL; |
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4421 |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4422 /* First of all, we check the type of the supplied Python object. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4423 * It must be a string or a list, or the call is in error. |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4424 */ |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
4425 if (PyBytes_Check(lines) || PyUnicode_Check(lines)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4426 { |
5202
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4427 char *str = StringToLine(lines); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4428 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4429 if (str == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4430 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4431 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4432 PyErr_Clear(); |
4498 | 4433 VimTryStart(); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4434 switch_to_win_for_buf(buf, &save_curwin, &save_curtab, &save_curbuf); |
5202
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4435 |
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4436 if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL) |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
4437 RAISE_UNDO_FAIL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4438 else if (ml_append((linenr_T)n, (char_u *)str, 0, FALSE) == FAIL) |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4439 RAISE_INSERT_LINE_FAIL; |
5202
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4440 else if (save_curbuf == NULL) |
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4441 /* Only adjust marks if we managed to switch to a window that |
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4442 * holds the buffer, otherwise line numbers will be invalid. */ |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4443 appended_lines_mark((linenr_T)n, 1L); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4444 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4445 vim_free(str); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4446 restore_win_for_buf(save_curwin, save_curtab, save_curbuf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4447 update_screen(VALID); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4448 |
4498 | 4449 if (VimTryEnd()) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4450 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4451 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4452 if (len_change) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4453 *len_change = 1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4454 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4455 return OK; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4456 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4457 else if (PyList_Check(lines)) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4458 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4459 PyInt i; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4460 PyInt size = PyList_Size(lines); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4461 char **array; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4462 |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4463 array = PyMem_New(char *, size); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4464 if (array == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4465 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4466 PyErr_NoMemory(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4467 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4468 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4469 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4470 for (i = 0; i < size; ++i) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4471 { |
4633
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4472 PyObject *line; |
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4473 |
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4474 if (!(line = PyList_GetItem(lines, i)) || |
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
4475 !(array[i] = StringToLine(line))) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4476 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4477 while (i) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4478 vim_free(array[--i]); |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4479 PyMem_Free(array); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4480 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4481 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4482 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4483 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4484 PyErr_Clear(); |
4498 | 4485 VimTryStart(); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4486 switch_to_win_for_buf(buf, &save_curwin, &save_curtab, &save_curbuf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4487 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4488 if (u_save((linenr_T)n, (linenr_T)(n + 1)) == FAIL) |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
4489 RAISE_UNDO_FAIL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4490 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4491 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4492 for (i = 0; i < size; ++i) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4493 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4494 if (ml_append((linenr_T)(n + i), |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4495 (char_u *)array[i], 0, FALSE) == FAIL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4496 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4497 RAISE_INSERT_LINE_FAIL; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4498 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4499 /* Free the rest of the lines */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4500 while (i < size) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4501 vim_free(array[i++]); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4502 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4503 break; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4504 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4505 vim_free(array[i]); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4506 } |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4507 if (i > 0 && save_curbuf == NULL) |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4508 /* Only adjust marks if we managed to switch to a window that |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4509 * holds the buffer, otherwise line numbers will be invalid. */ |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4510 appended_lines_mark((linenr_T)n, (long)i); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4511 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4512 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4513 /* Free the array of lines. All of its contents have now |
5202
8edba3805d78
updated for version 7.4a.027
Bram Moolenaar <bram@vim.org>
parents:
5166
diff
changeset
|
4514 * been freed. */ |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4515 PyMem_Free(array); |
5235
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4516 restore_win_for_buf(save_curwin, save_curtab, save_curbuf); |
6fa64615c8d3
updated for version 7.4a.043
Bram Moolenaar <bram@vim.org>
parents:
5202
diff
changeset
|
4517 |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4518 update_screen(VALID); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4519 |
4498 | 4520 if (VimTryEnd()) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4521 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4522 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4523 if (len_change) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4524 *len_change = size; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4525 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4526 return OK; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4527 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4528 else |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4529 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4530 PyErr_BadArgument(); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4531 return FAIL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4532 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4533 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4534 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4535 /* |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4536 * Common routines for buffers and line ranges |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4537 * ------------------------------------------- |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4538 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4539 |
4385 | 4540 typedef struct |
4541 { | |
4542 PyObject_HEAD | |
4543 buf_T *buf; | |
4544 } BufferObject; | |
4545 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4546 static int |
4488 | 4547 CheckBuffer(BufferObject *self) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4548 { |
4488 | 4549 if (self->buf == INVALID_BUFFER_VALUE) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4550 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4551 PyErr_SET_VIM(N_("attempt to refer to deleted buffer")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4552 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4553 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4554 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4555 return 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4556 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4557 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4558 static PyObject * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4559 RBItem(BufferObject *self, PyInt n, PyInt start, PyInt end) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4560 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4561 if (CheckBuffer(self)) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4562 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4563 |
4387 | 4564 if (end == -1) |
4565 end = self->buf->b_ml.ml_line_count; | |
4566 | |
4389 | 4567 if (n < 0) |
4568 n += end - start + 1; | |
4569 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4570 if (n < 0 || n > end - start) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4571 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4572 PyErr_SET_STRING(PyExc_IndexError, N_("line number out of range")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4573 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4574 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4575 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4576 return GetBufferLine(self->buf, n+start); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4577 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4578 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4579 static PyObject * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4580 RBSlice(BufferObject *self, PyInt lo, PyInt hi, PyInt start, PyInt end) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4581 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4582 PyInt size; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4583 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4584 if (CheckBuffer(self)) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4585 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4586 |
4387 | 4587 if (end == -1) |
4588 end = self->buf->b_ml.ml_line_count; | |
4589 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4590 size = end - start + 1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4591 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4592 if (lo < 0) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4593 lo = 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4594 else if (lo > size) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4595 lo = size; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4596 if (hi < 0) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4597 hi = 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4598 if (hi < lo) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4599 hi = lo; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4600 else if (hi > size) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4601 hi = size; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4602 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4603 return GetBufferLineList(self->buf, lo+start, hi+start); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4604 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4605 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4606 static PyInt |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4607 RBAsItem( |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4608 BufferObject *self, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4609 PyInt n, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4610 PyObject *valObject, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4611 PyInt start, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4612 PyInt end, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4613 PyInt *new_end) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4614 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4615 PyInt len_change; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4616 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4617 if (CheckBuffer(self)) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4618 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4619 |
4387 | 4620 if (end == -1) |
4621 end = self->buf->b_ml.ml_line_count; | |
4622 | |
4389 | 4623 if (n < 0) |
4624 n += end - start + 1; | |
4625 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4626 if (n < 0 || n > end - start) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4627 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4628 PyErr_SET_STRING(PyExc_IndexError, N_("line number out of range")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4629 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4630 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4631 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4632 if (SetBufferLine(self->buf, n+start, valObject, &len_change) == FAIL) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4633 return -1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4634 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4635 if (new_end) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4636 *new_end = end + len_change; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4637 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4638 return 0; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4639 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4640 |
2894 | 4641 static PyInt |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4642 RBAsSlice( |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4643 BufferObject *self, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4644 PyInt lo, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4645 PyInt hi, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4646 PyObject *valObject, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4647 PyInt start, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4648 PyInt end, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4649 PyInt *new_end) |
2894 | 4650 { |
4651 PyInt size; | |
4652 PyInt len_change; | |
4653 | |
4654 /* Self must be a valid buffer */ | |
4655 if (CheckBuffer(self)) | |
4656 return -1; | |
4657 | |
4387 | 4658 if (end == -1) |
4659 end = self->buf->b_ml.ml_line_count; | |
4660 | |
2894 | 4661 /* Sort out the slice range */ |
4662 size = end - start + 1; | |
4663 | |
4664 if (lo < 0) | |
4665 lo = 0; | |
4666 else if (lo > size) | |
4667 lo = size; | |
4668 if (hi < 0) | |
4669 hi = 0; | |
4670 if (hi < lo) | |
4671 hi = lo; | |
4672 else if (hi > size) | |
4673 hi = size; | |
4674 | |
4675 if (SetBufferLineList(self->buf, lo + start, hi + start, | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4676 valObject, &len_change) == FAIL) |
2894 | 4677 return -1; |
4678 | |
4679 if (new_end) | |
4680 *new_end = end + len_change; | |
4681 | |
4682 return 0; | |
4683 } | |
4684 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4685 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4686 static PyObject * |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4687 RBAppend( |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4688 BufferObject *self, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4689 PyObject *args, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4690 PyInt start, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4691 PyInt end, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4692 PyInt *new_end) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4693 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4694 PyObject *lines; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4695 PyInt len_change; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4696 PyInt max; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4697 PyInt n; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4698 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4699 if (CheckBuffer(self)) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4700 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4701 |
4387 | 4702 if (end == -1) |
4703 end = self->buf->b_ml.ml_line_count; | |
4704 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4705 max = n = end - start + 1; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4706 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4707 if (!PyArg_ParseTuple(args, "O|n", &lines, &n)) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4708 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4709 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4710 if (n < 0 || n > max) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4711 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4712 PyErr_SET_STRING(PyExc_IndexError, N_("line number out of range")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4713 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4714 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4715 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4716 if (InsertBufferLines(self->buf, n + start - 1, lines, &len_change) == FAIL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4717 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4718 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4719 if (new_end) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4720 *new_end = end + len_change; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4721 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4722 Py_INCREF(Py_None); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4723 return Py_None; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4724 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4725 |
4385 | 4726 /* Range object |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4727 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4728 |
4319 | 4729 static PyTypeObject RangeType; |
4385 | 4730 static PySequenceMethods RangeAsSeq; |
4731 static PyMappingMethods RangeAsMapping; | |
4319 | 4732 |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4733 typedef struct |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4734 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4735 PyObject_HEAD |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4736 BufferObject *buf; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4737 PyInt start; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4738 PyInt end; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4739 } RangeObject; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4740 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4741 static PyObject * |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4742 RangeNew(buf_T *buf, PyInt start, PyInt end) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4743 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4744 BufferObject *bufr; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4745 RangeObject *self; |
4500 | 4746 self = PyObject_GC_New(RangeObject, &RangeType); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4747 if (self == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4748 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4749 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4750 bufr = (BufferObject *)BufferNew(buf); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4751 if (bufr == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4752 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4753 Py_DECREF(self); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4754 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4755 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4756 Py_INCREF(bufr); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4757 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4758 self->buf = bufr; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4759 self->start = start; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4760 self->end = end; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4761 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4762 return (PyObject *)(self); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4763 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4764 |
4319 | 4765 static void |
4488 | 4766 RangeDestructor(RangeObject *self) |
4319 | 4767 { |
4500 | 4768 PyObject_GC_UnTrack((void *)(self)); |
4498 | 4769 Py_XDECREF(self->buf); |
4500 | 4770 PyObject_GC_Del((void *)(self)); |
4771 } | |
4772 | |
4773 static int | |
4774 RangeTraverse(RangeObject *self, visitproc visit, void *arg) | |
4775 { | |
4776 Py_VISIT(((PyObject *)(self->buf))); | |
4777 return 0; | |
4778 } | |
4779 | |
4780 static int | |
4781 RangeClear(RangeObject *self) | |
4782 { | |
4783 Py_CLEAR(self->buf); | |
4784 return 0; | |
4319 | 4785 } |
4786 | |
4385 | 4787 static PyInt |
4488 | 4788 RangeLength(RangeObject *self) |
4385 | 4789 { |
4790 /* HOW DO WE SIGNAL AN ERROR FROM THIS FUNCTION? */ | |
4488 | 4791 if (CheckBuffer(self->buf)) |
4385 | 4792 return -1; /* ??? */ |
4793 | |
4488 | 4794 return (self->end - self->start + 1); |
4385 | 4795 } |
4796 | |
4797 static PyObject * | |
4488 | 4798 RangeItem(RangeObject *self, PyInt n) |
4385 | 4799 { |
4488 | 4800 return RBItem(self->buf, n, self->start, self->end); |
4385 | 4801 } |
4802 | |
4803 static PyObject * | |
4488 | 4804 RangeSlice(RangeObject *self, PyInt lo, PyInt hi) |
4385 | 4805 { |
4488 | 4806 return RBSlice(self->buf, lo, hi, self->start, self->end); |
4385 | 4807 } |
4808 | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4809 static char *RangeAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4810 "start", "end", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4811 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4812 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4813 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4814 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4815 RangeDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4816 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4817 return ObjectDir(self, RangeAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4818 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4819 |
4385 | 4820 static PyObject * |
4488 | 4821 RangeAppend(RangeObject *self, PyObject *args) |
4385 | 4822 { |
4488 | 4823 return RBAppend(self->buf, args, self->start, self->end, &self->end); |
4385 | 4824 } |
4825 | |
4826 static PyObject * | |
4488 | 4827 RangeRepr(RangeObject *self) |
4385 | 4828 { |
4488 | 4829 if (self->buf->buf == INVALID_BUFFER_VALUE) |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
4830 return PyString_FromFormat("<range object (for deleted buffer) at %p>", |
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
4831 (self)); |
4385 | 4832 else |
4833 { | |
4488 | 4834 char *name = (char *)self->buf->buf->b_fname; |
4385 | 4835 |
4836 if (name == NULL) | |
4837 name = ""; | |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
4838 |
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
4839 return PyString_FromFormat("<range %s (%d:%d)>", |
4653
b943fd24c351
updated for version 7.3.1074
Bram Moolenaar <bram@vim.org>
parents:
4645
diff
changeset
|
4840 name, (int)self->start, (int)self->end); |
4385 | 4841 } |
4842 } | |
4843 | |
4844 static struct PyMethodDef RangeMethods[] = { | |
4492 | 4845 /* name, function, calling, documentation */ |
4846 {"append", (PyCFunction)RangeAppend, METH_VARARGS, "Append data to the Vim range" }, | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4847 {"__dir__", (PyCFunction)RangeDir, METH_NOARGS, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4848 { NULL, NULL, 0, NULL} |
4385 | 4849 }; |
4850 | |
4319 | 4851 static PyTypeObject BufferType; |
4852 static PySequenceMethods BufferAsSeq; | |
4853 static PyMappingMethods BufferAsMapping; | |
4854 | |
4855 static PyObject * | |
4377 | 4856 BufferNew(buf_T *buf) |
4857 { | |
4858 /* We need to handle deletion of buffers underneath us. | |
4859 * If we add a "b_python*_ref" field to the buf_T structure, | |
4860 * then we can get at it in buf_freeall() in vim. We then | |
4861 * need to create only ONE Python object per buffer - if | |
4862 * we try to create a second, just INCREF the existing one | |
4863 * and return it. The (single) Python object referring to | |
4864 * the buffer is stored in "b_python*_ref". | |
4865 * Question: what to do on a buf_freeall(). We'll probably | |
4866 * have to either delete the Python object (DECREF it to | |
4867 * zero - a bad idea, as it leaves dangling refs!) or | |
4868 * set the buf_T * value to an invalid value (-1?), which | |
4869 * means we need checks in all access functions... Bah. | |
4870 * | |
4385 | 4871 * Python2 and Python3 get different fields and different objects: |
4377 | 4872 * b_python_ref and b_python3_ref fields respectively. |
4873 */ | |
4874 | |
4875 BufferObject *self; | |
4876 | |
4877 if (BUF_PYTHON_REF(buf) != NULL) | |
4878 { | |
4879 self = BUF_PYTHON_REF(buf); | |
4880 Py_INCREF(self); | |
4881 } | |
4882 else | |
4883 { | |
4884 self = PyObject_NEW(BufferObject, &BufferType); | |
4885 if (self == NULL) | |
4886 return NULL; | |
4887 self->buf = buf; | |
4888 BUF_PYTHON_REF(buf) = self; | |
4889 } | |
4890 | |
4891 return (PyObject *)(self); | |
4892 } | |
4893 | |
4385 | 4894 static void |
4488 | 4895 BufferDestructor(BufferObject *self) |
4319 | 4896 { |
4488 | 4897 if (self->buf && self->buf != INVALID_BUFFER_VALUE) |
4898 BUF_PYTHON_REF(self->buf) = NULL; | |
4385 | 4899 |
4900 DESTRUCTOR_FINISH(self); | |
4319 | 4901 } |
4902 | |
4377 | 4903 static PyInt |
4488 | 4904 BufferLength(BufferObject *self) |
4377 | 4905 { |
4906 /* HOW DO WE SIGNAL AN ERROR FROM THIS FUNCTION? */ | |
4488 | 4907 if (CheckBuffer(self)) |
4377 | 4908 return -1; /* ??? */ |
4909 | |
4488 | 4910 return (PyInt)(self->buf->b_ml.ml_line_count); |
4377 | 4911 } |
4912 | |
4913 static PyObject * | |
4488 | 4914 BufferItem(BufferObject *self, PyInt n) |
4377 | 4915 { |
4488 | 4916 return RBItem(self, n, 1, -1); |
4377 | 4917 } |
4918 | |
4919 static PyObject * | |
4488 | 4920 BufferSlice(BufferObject *self, PyInt lo, PyInt hi) |
4377 | 4921 { |
4488 | 4922 return RBSlice(self, lo, hi, 1, -1); |
4377 | 4923 } |
4924 | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4925 static char *BufferAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4926 "name", "number", "vars", "options", "valid", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4927 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4928 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4929 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4930 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4931 BufferDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4932 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4933 return ObjectDir(self, BufferAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4934 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4935 |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
4936 static PyObject * |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4937 BufferAttrValid(BufferObject *self, char *name) |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4938 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4939 PyObject *ret; |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4940 |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4941 if (strcmp(name, "valid") != 0) |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4942 return NULL; |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4943 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4944 ret = ((self->buf == INVALID_BUFFER_VALUE) ? Py_False : Py_True); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4945 Py_INCREF(ret); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4946 return ret; |
4593
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4947 } |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4948 |
0cf552b325b5
updated for version 7.3.1044
Bram Moolenaar <bram@vim.org>
parents:
4589
diff
changeset
|
4949 static PyObject * |
4488 | 4950 BufferAttr(BufferObject *self, char *name) |
4385 | 4951 { |
4952 if (strcmp(name, "name") == 0) | |
4597
00eecb2f8e3e
updated for version 7.3.1046
Bram Moolenaar <bram@vim.org>
parents:
4595
diff
changeset
|
4953 return PyString_FromString((self->buf->b_ffname == NULL |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
4954 ? "" : (char *)self->buf->b_ffname)); |
4385 | 4955 else if (strcmp(name, "number") == 0) |
4488 | 4956 return Py_BuildValue(Py_ssize_t_fmt, self->buf->b_fnum); |
4385 | 4957 else if (strcmp(name, "vars") == 0) |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
4958 return NEW_DICTIONARY(self->buf->b_vars); |
4385 | 4959 else if (strcmp(name, "options") == 0) |
4488 | 4960 return OptionsNew(SREQ_BUF, self->buf, (checkfun) CheckBuffer, |
4961 (PyObject *) self); | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4962 else if (strcmp(name, "__members__") == 0) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
4963 return ObjectDir(NULL, BufferAttrs); |
4385 | 4964 else |
4965 return NULL; | |
4966 } | |
4967 | |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4968 static int |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4969 BufferSetattr(BufferObject *self, char *name, PyObject *valObject) |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4970 { |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4971 if (CheckBuffer(self)) |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4972 return -1; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4973 |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4974 if (strcmp(name, "name") == 0) |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4975 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4976 char_u *val; |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4977 aco_save_T aco; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4978 int ren_ret; |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4979 PyObject *todecref; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4980 |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4981 if (!(val = StringToChars(valObject, &todecref))) |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4982 return -1; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4983 |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4984 VimTryStart(); |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4985 /* Using aucmd_*: autocommands will be executed by rename_buffer */ |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4986 aucmd_prepbuf(&aco, self->buf); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4987 ren_ret = rename_buffer(val); |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4988 aucmd_restbuf(&aco); |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4989 Py_XDECREF(todecref); |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4990 if (VimTryEnd()) |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4991 return -1; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4992 |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
4993 if (ren_ret == FAIL) |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4994 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
4995 PyErr_SET_VIM(N_("failed to rename buffer")); |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4996 return -1; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4997 } |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4998 return 0; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
4999 } |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
5000 else |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
5001 { |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
5002 PyErr_SetString(PyExc_AttributeError, name); |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
5003 return -1; |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
5004 } |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
5005 } |
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
5006 |
4385 | 5007 static PyObject * |
4488 | 5008 BufferAppend(BufferObject *self, PyObject *args) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5009 { |
4488 | 5010 return RBAppend(self, args, 1, -1, NULL); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5011 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5012 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5013 static PyObject * |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5014 BufferMark(BufferObject *self, PyObject *pmarkObject) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5015 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5016 pos_T *posp; |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5017 char_u *pmark; |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5018 char_u mark; |
4429 | 5019 buf_T *savebuf; |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5020 PyObject *todecref; |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5021 |
4488 | 5022 if (CheckBuffer(self)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5023 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5024 |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5025 if (!(pmark = StringToChars(pmarkObject, &todecref))) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5026 return NULL; |
4633
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
5027 |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5028 if (pmark[0] == '\0' || pmark[1] != '\0') |
4633
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
5029 { |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
5030 PyErr_SET_STRING(PyExc_ValueError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5031 N_("mark name must be a single character")); |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
5032 Py_XDECREF(todecref); |
4633
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
5033 return NULL; |
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
5034 } |
3857d399ab41
updated for version 7.3.1064
Bram Moolenaar <bram@vim.org>
parents:
4631
diff
changeset
|
5035 |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5036 mark = *pmark; |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5037 |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5038 Py_XDECREF(todecref); |
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5039 |
4498 | 5040 VimTryStart(); |
4488 | 5041 switch_buffer(&savebuf, self->buf); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5042 posp = getmark(mark, FALSE); |
4429 | 5043 restore_buffer(savebuf); |
4498 | 5044 if (VimTryEnd()) |
5045 return NULL; | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5046 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5047 if (posp == NULL) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5048 { |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5049 PyErr_SET_VIM(N_("invalid mark name")); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5050 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5051 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5052 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5053 if (posp->lnum <= 0) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5054 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5055 /* Or raise an error? */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5056 Py_INCREF(Py_None); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5057 return Py_None; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5058 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5059 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5060 return Py_BuildValue("(ll)", (long)(posp->lnum), (long)(posp->col)); |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5061 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5062 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5063 static PyObject * |
4488 | 5064 BufferRange(BufferObject *self, PyObject *args) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5065 { |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5066 PyInt start; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5067 PyInt end; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5068 |
4488 | 5069 if (CheckBuffer(self)) |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5070 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5071 |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5072 if (!PyArg_ParseTuple(args, "nn", &start, &end)) |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5073 return NULL; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5074 |
4488 | 5075 return RangeNew(self->buf, start, end); |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5076 } |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5077 |
4319 | 5078 static PyObject * |
4488 | 5079 BufferRepr(BufferObject *self) |
4319 | 5080 { |
4488 | 5081 if (self->buf == INVALID_BUFFER_VALUE) |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
5082 return PyString_FromFormat("<buffer object (deleted) at %p>", self); |
4319 | 5083 else |
5084 { | |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
5085 char *name = (char *)self->buf->b_fname; |
4319 | 5086 |
5087 if (name == NULL) | |
5088 name = ""; | |
4623
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
5089 |
548b889fe3cf
updated for version 7.3.1059
Bram Moolenaar <bram@vim.org>
parents:
4619
diff
changeset
|
5090 return PyString_FromFormat("<buffer %s>", name); |
4319 | 5091 } |
5092 } | |
5093 | |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5094 static struct PyMethodDef BufferMethods[] = { |
4492 | 5095 /* name, function, calling, documentation */ |
5096 {"append", (PyCFunction)BufferAppend, METH_VARARGS, "Append data to Vim buffer" }, | |
4964
5cee875f3096
updated for version 7.3.1227
Bram Moolenaar <bram@vim.org>
parents:
4962
diff
changeset
|
5097 {"mark", (PyCFunction)BufferMark, METH_O, "Return (row,col) representing position of named mark" }, |
4492 | 5098 {"range", (PyCFunction)BufferRange, METH_VARARGS, "Return a range object which represents the part of the given buffer between line numbers s and e" }, |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5099 {"__dir__", (PyCFunction)BufferDir, METH_NOARGS, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5100 { NULL, NULL, 0, NULL} |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5101 }; |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5102 |
4397 | 5103 /* |
5104 * Buffer list object - Implementation | |
5105 */ | |
5106 | |
5107 static PyTypeObject BufMapType; | |
5108 | |
5109 typedef struct | |
5110 { | |
5111 PyObject_HEAD | |
5112 } BufMapObject; | |
5113 | |
5114 static PyInt | |
5115 BufMapLength(PyObject *self UNUSED) | |
5116 { | |
5117 buf_T *b = firstbuf; | |
5118 PyInt n = 0; | |
5119 | |
5120 while (b) | |
5121 { | |
5122 ++n; | |
5123 b = b->b_next; | |
5124 } | |
5125 | |
5126 return n; | |
5127 } | |
5128 | |
5129 static PyObject * | |
5130 BufMapItem(PyObject *self UNUSED, PyObject *keyObject) | |
5131 { | |
5132 buf_T *b; | |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5133 long bnr; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5134 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5135 if (NumberToLong(keyObject, &bnr, NUMBER_INT|NUMBER_NATURAL)) |
4397 | 5136 return NULL; |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5137 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5138 b = buflist_findnr((int) bnr); |
4397 | 5139 |
5140 if (b) | |
5141 return BufferNew(b); | |
5142 else | |
5143 { | |
4403 | 5144 PyErr_SetObject(PyExc_KeyError, keyObject); |
4397 | 5145 return NULL; |
5146 } | |
5147 } | |
5148 | |
5149 static void | |
5150 BufMapIterDestruct(PyObject *buffer) | |
5151 { | |
5152 /* Iteration was stopped before all buffers were processed */ | |
5153 if (buffer) | |
5154 { | |
5155 Py_DECREF(buffer); | |
5156 } | |
5157 } | |
5158 | |
4433 | 5159 static int |
5160 BufMapIterTraverse(PyObject *buffer, visitproc visit, void *arg) | |
5161 { | |
4500 | 5162 if (buffer) |
5163 Py_VISIT(buffer); | |
4433 | 5164 return 0; |
5165 } | |
5166 | |
5167 static int | |
5168 BufMapIterClear(PyObject **buffer) | |
5169 { | |
4500 | 5170 if (*buffer) |
5171 Py_CLEAR(*buffer); | |
4433 | 5172 return 0; |
5173 } | |
5174 | |
4397 | 5175 static PyObject * |
5176 BufMapIterNext(PyObject **buffer) | |
5177 { | |
5178 PyObject *next; | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5179 PyObject *ret; |
4397 | 5180 |
5181 if (!*buffer) | |
5182 return NULL; | |
5183 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5184 ret = *buffer; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5185 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5186 if (CheckBuffer((BufferObject *)(ret))) |
4397 | 5187 { |
5188 *buffer = NULL; | |
5189 return NULL; | |
5190 } | |
5191 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5192 if (!((BufferObject *)(ret))->buf->b_next) |
4397 | 5193 next = NULL; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5194 else if (!(next = BufferNew(((BufferObject *)(ret))->buf->b_next))) |
4397 | 5195 return NULL; |
5196 *buffer = next; | |
4438 | 5197 /* Do not increment reference: we no longer hold it (decref), but whoever |
5198 * on other side will hold (incref). Decref+incref = nothing. */ | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5199 return ret; |
4397 | 5200 } |
5201 | |
5202 static PyObject * | |
5203 BufMapIter(PyObject *self UNUSED) | |
5204 { | |
5205 PyObject *buffer; | |
5206 | |
5207 buffer = BufferNew(firstbuf); | |
5208 return IterNew(buffer, | |
4433 | 5209 (destructorfun) BufMapIterDestruct, (nextfun) BufMapIterNext, |
5210 (traversefun) BufMapIterTraverse, (clearfun) BufMapIterClear); | |
4397 | 5211 } |
5212 | |
5213 static PyMappingMethods BufMapAsMapping = { | |
5214 (lenfunc) BufMapLength, | |
5215 (binaryfunc) BufMapItem, | |
5216 (objobjargproc) 0, | |
5217 }; | |
5218 | |
4385 | 5219 /* Current items object |
2447
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5220 */ |
84d353762845
Move many more common Python items to if_py_both.c.
Bram Moolenaar <bram@vim.org>
parents:
2399
diff
changeset
|
5221 |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5222 static char *CurrentAttrs[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5223 "buffer", "window", "line", "range", "tabpage", |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5224 NULL |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5225 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5226 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5227 static PyObject * |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5228 CurrentDir(PyObject *self) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5229 { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5230 return ObjectDir(self, CurrentAttrs); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5231 } |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5232 |
4319 | 5233 static PyObject * |
5234 CurrentGetattr(PyObject *self UNUSED, char *name) | |
5235 { | |
5236 if (strcmp(name, "buffer") == 0) | |
5237 return (PyObject *)BufferNew(curbuf); | |
5238 else if (strcmp(name, "window") == 0) | |
4431 | 5239 return (PyObject *)WindowNew(curwin, curtab); |
4401 | 5240 else if (strcmp(name, "tabpage") == 0) |
5241 return (PyObject *)TabPageNew(curtab); | |
4319 | 5242 else if (strcmp(name, "line") == 0) |
5243 return GetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum); | |
5244 else if (strcmp(name, "range") == 0) | |
5245 return RangeNew(curbuf, RangeStart, RangeEnd); | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5246 else if (strcmp(name, "__members__") == 0) |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5247 return ObjectDir(NULL, CurrentAttrs); |
4319 | 5248 else |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5249 #if PY_MAJOR_VERSION < 3 |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5250 return Py_FindMethod(WindowMethods, self, name); |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5251 #else |
4319 | 5252 return NULL; |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5253 #endif |
4319 | 5254 } |
5255 | |
5256 static int | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5257 CurrentSetattr(PyObject *self UNUSED, char *name, PyObject *valObject) |
4319 | 5258 { |
5259 if (strcmp(name, "line") == 0) | |
5260 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5261 if (SetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum, valObject, |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5262 NULL) == FAIL) |
4319 | 5263 return -1; |
5264 | |
5265 return 0; | |
5266 } | |
4407 | 5267 else if (strcmp(name, "buffer") == 0) |
5268 { | |
5269 int count; | |
5270 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5271 if (valObject->ob_type != &BufferType) |
4407 | 5272 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
5273 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5274 N_("expected vim.Buffer object, but got %s"), |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5275 Py_TYPE_NAME(valObject)); |
4407 | 5276 return -1; |
5277 } | |
5278 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5279 if (CheckBuffer((BufferObject *)(valObject))) |
4407 | 5280 return -1; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5281 count = ((BufferObject *)(valObject))->buf->b_fnum; |
4407 | 5282 |
4498 | 5283 VimTryStart(); |
4407 | 5284 if (do_buffer(DOBUF_GOTO, DOBUF_FIRST, FORWARD, count, 0) == FAIL) |
5285 { | |
4498 | 5286 if (VimTryEnd()) |
5287 return -1; | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5288 PyErr_VIM_FORMAT(N_("failed to switch to buffer %d"), count); |
4407 | 5289 return -1; |
5290 } | |
5291 | |
4498 | 5292 return VimTryEnd(); |
4407 | 5293 } |
5294 else if (strcmp(name, "window") == 0) | |
5295 { | |
5296 int count; | |
5297 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5298 if (valObject->ob_type != &WindowType) |
4407 | 5299 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
5300 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5301 N_("expected vim.Window object, but got %s"), |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5302 Py_TYPE_NAME(valObject)); |
4407 | 5303 return -1; |
5304 } | |
5305 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5306 if (CheckWindow((WindowObject *)(valObject))) |
4407 | 5307 return -1; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5308 count = get_win_number(((WindowObject *)(valObject))->win, firstwin); |
4407 | 5309 |
5310 if (!count) | |
5311 { | |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
5312 PyErr_SET_STRING(PyExc_ValueError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5313 N_("failed to find window in the current tab page")); |
4407 | 5314 return -1; |
5315 } | |
5316 | |
4498 | 5317 VimTryStart(); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5318 win_goto(((WindowObject *)(valObject))->win); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5319 if (((WindowObject *)(valObject))->win != curwin) |
4407 | 5320 { |
4498 | 5321 if (VimTryEnd()) |
5322 return -1; | |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
5323 PyErr_SET_STRING(PyExc_RuntimeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5324 N_("did not switch to the specified window")); |
4407 | 5325 return -1; |
5326 } | |
5327 | |
4498 | 5328 return VimTryEnd(); |
4407 | 5329 } |
5330 else if (strcmp(name, "tabpage") == 0) | |
5331 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5332 if (valObject->ob_type != &TabPageType) |
4407 | 5333 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
5334 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5335 N_("expected vim.TabPage object, but got %s"), |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5336 Py_TYPE_NAME(valObject)); |
4407 | 5337 return -1; |
5338 } | |
5339 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5340 if (CheckTabPage((TabPageObject *)(valObject))) |
4407 | 5341 return -1; |
5342 | |
4498 | 5343 VimTryStart(); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5344 goto_tabpage_tp(((TabPageObject *)(valObject))->tab, TRUE, TRUE); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5345 if (((TabPageObject *)(valObject))->tab != curtab) |
4407 | 5346 { |
4498 | 5347 if (VimTryEnd()) |
5348 return -1; | |
4968
b6e693e1f946
updated for version 7.3.1229
Bram Moolenaar <bram@vim.org>
parents:
4966
diff
changeset
|
5349 PyErr_SET_STRING(PyExc_RuntimeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5350 N_("did not switch to the specified tab page")); |
4407 | 5351 return -1; |
5352 } | |
5353 | |
4498 | 5354 return VimTryEnd(); |
4407 | 5355 } |
4319 | 5356 else |
5357 { | |
5358 PyErr_SetString(PyExc_AttributeError, name); | |
5359 return -1; | |
5360 } | |
5361 } | |
5362 | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5363 static struct PyMethodDef CurrentMethods[] = { |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5364 /* name, function, calling, documentation */ |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5365 {"__dir__", (PyCFunction)CurrentDir, METH_NOARGS, ""}, |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5366 { NULL, NULL, 0, NULL} |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5367 }; |
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
5368 |
3618 | 5369 static void |
4486 | 5370 init_range_cmd(exarg_T *eap) |
5371 { | |
5372 RangeStart = eap->line1; | |
5373 RangeEnd = eap->line2; | |
5374 } | |
5375 | |
5376 static void | |
5377 init_range_eval(typval_T *rettv UNUSED) | |
5378 { | |
5379 RangeStart = (PyInt) curwin->w_cursor.lnum; | |
5380 RangeEnd = RangeStart; | |
5381 } | |
5382 | |
5383 static void | |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5384 run_cmd(const char *cmd, void *arg UNUSED |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5385 #ifdef PY_CAN_RECURSE |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5386 , PyGILState_STATE *pygilstate UNUSED |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5387 #endif |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5388 ) |
4486 | 5389 { |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5390 PyObject *run_ret; |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5391 run_ret = PyRun_String((char *)cmd, Py_file_input, globals, globals); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5392 if (run_ret != NULL) |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5393 { |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5394 Py_DECREF(run_ret); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5395 } |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5396 else if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5397 { |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5398 EMSG2(_(e_py_systemexit), "python"); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5399 PyErr_Clear(); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5400 } |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5401 else |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5402 PyErr_PrintEx(1); |
4486 | 5403 } |
5404 | |
5405 static const char *code_hdr = "def " DOPY_FUNC "(line, linenr):\n "; | |
5406 static int code_hdr_len = 30; | |
5407 | |
5408 static void | |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5409 run_do(const char *cmd, void *arg UNUSED |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5410 #ifdef PY_CAN_RECURSE |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5411 , PyGILState_STATE *pygilstate |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5412 #endif |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5413 ) |
4486 | 5414 { |
5415 PyInt lnum; | |
5416 size_t len; | |
5417 char *code; | |
5418 int status; | |
5419 PyObject *pyfunc, *pymain; | |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5420 PyObject *run_ret; |
4486 | 5421 |
4575
626e9ccb7c48
updated for version 7.3.1035
Bram Moolenaar <bram@vim.org>
parents:
4523
diff
changeset
|
5422 if (u_save((linenr_T)RangeStart - 1, (linenr_T)RangeEnd + 1) != OK) |
4486 | 5423 { |
5424 EMSG(_("cannot save undo information")); | |
5425 return; | |
5426 } | |
5427 | |
5428 len = code_hdr_len + STRLEN(cmd); | |
5429 code = PyMem_New(char, len + 1); | |
5430 memcpy(code, code_hdr, code_hdr_len); | |
5431 STRCPY(code + code_hdr_len, cmd); | |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5432 run_ret = PyRun_String(code, Py_file_input, globals, globals); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5433 status = -1; |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5434 if (run_ret != NULL) |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5435 { |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5436 status = 0; |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5437 Py_DECREF(run_ret); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5438 } |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5439 else if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5440 { |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5441 PyMem_Free(code); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5442 EMSG2(_(e_py_systemexit), "python"); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5443 PyErr_Clear(); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5444 return; |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5445 } |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5446 else |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5447 PyErr_PrintEx(1); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5448 |
4486 | 5449 PyMem_Free(code); |
5450 | |
5451 if (status) | |
5452 { | |
5453 EMSG(_("failed to run the code")); | |
5454 return; | |
5455 } | |
5456 | |
5457 status = 0; | |
5458 pymain = PyImport_AddModule("__main__"); | |
5459 pyfunc = PyObject_GetAttrString(pymain, DOPY_FUNC); | |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5460 #ifdef PY_CAN_RECURSE |
4486 | 5461 PyGILState_Release(*pygilstate); |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5462 #endif |
4486 | 5463 |
5464 for (lnum = RangeStart; lnum <= RangeEnd; ++lnum) | |
5465 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5466 PyObject *line; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5467 PyObject *linenr; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5468 PyObject *ret; |
4486 | 5469 |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5470 #ifdef PY_CAN_RECURSE |
4486 | 5471 *pygilstate = PyGILState_Ensure(); |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5472 #endif |
4486 | 5473 if (!(line = GetBufferLine(curbuf, lnum))) |
5474 goto err; | |
5475 if (!(linenr = PyInt_FromLong((long) lnum))) | |
5476 { | |
5477 Py_DECREF(line); | |
5478 goto err; | |
5479 } | |
5480 ret = PyObject_CallFunctionObjArgs(pyfunc, line, linenr, NULL); | |
5481 Py_DECREF(line); | |
5482 Py_DECREF(linenr); | |
5483 if (!ret) | |
5484 goto err; | |
5485 | |
5486 if (ret != Py_None) | |
5487 if (SetBufferLine(curbuf, lnum, ret, NULL) == FAIL) | |
5488 goto err; | |
5489 | |
5490 Py_XDECREF(ret); | |
5491 PythonIO_Flush(); | |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5492 #ifdef PY_CAN_RECURSE |
4486 | 5493 PyGILState_Release(*pygilstate); |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5494 #endif |
4486 | 5495 } |
5496 goto out; | |
5497 err: | |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5498 #ifdef PY_CAN_RECURSE |
4486 | 5499 *pygilstate = PyGILState_Ensure(); |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5500 #endif |
4486 | 5501 PyErr_PrintEx(0); |
5502 PythonIO_Flush(); | |
5503 status = 1; | |
5504 out: | |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5505 #ifdef PY_CAN_RECURSE |
4486 | 5506 if (!status) |
5507 *pygilstate = PyGILState_Ensure(); | |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5508 #endif |
4486 | 5509 Py_DECREF(pyfunc); |
5510 PyObject_SetAttrString(pymain, DOPY_FUNC, NULL); | |
5511 if (status) | |
5512 return; | |
5513 check_cursor(); | |
5514 update_curbuf(NOT_VALID); | |
5515 } | |
5516 | |
5517 static void | |
4511
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5518 run_eval(const char *cmd, typval_T *rettv |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5519 #ifdef PY_CAN_RECURSE |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5520 , PyGILState_STATE *pygilstate UNUSED |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5521 #endif |
ce94a870b59b
updated for version 7.3.1003
Bram Moolenaar <bram@vim.org>
parents:
4509
diff
changeset
|
5522 ) |
4486 | 5523 { |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5524 PyObject *run_ret; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5525 |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5526 run_ret = PyRun_String((char *)cmd, Py_eval_input, globals, globals); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5527 if (run_ret == NULL) |
4486 | 5528 { |
5139
80bab8b1a30d
updated for version 7.3.1312
Bram Moolenaar <bram@vim.org>
parents:
5088
diff
changeset
|
5529 if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) |
5088
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5530 { |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5531 EMSG2(_(e_py_systemexit), "python"); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5532 PyErr_Clear(); |
34c629c3b4ba
updated for version 7.3.1287
Bram Moolenaar <bram@vim.org>
parents:
4995
diff
changeset
|
5533 } |
5139
80bab8b1a30d
updated for version 7.3.1312
Bram Moolenaar <bram@vim.org>
parents:
5088
diff
changeset
|
5534 else |
80bab8b1a30d
updated for version 7.3.1312
Bram Moolenaar <bram@vim.org>
parents:
5088
diff
changeset
|
5535 { |
80bab8b1a30d
updated for version 7.3.1312
Bram Moolenaar <bram@vim.org>
parents:
5088
diff
changeset
|
5536 if (PyErr_Occurred() && !msg_silent) |
80bab8b1a30d
updated for version 7.3.1312
Bram Moolenaar <bram@vim.org>
parents:
5088
diff
changeset
|
5537 PyErr_PrintEx(0); |
80bab8b1a30d
updated for version 7.3.1312
Bram Moolenaar <bram@vim.org>
parents:
5088
diff
changeset
|
5538 EMSG(_("E858: Eval did not return a valid python object")); |
80bab8b1a30d
updated for version 7.3.1312
Bram Moolenaar <bram@vim.org>
parents:
5088
diff
changeset
|
5539 } |
4486 | 5540 } |
5541 else | |
5542 { | |
7660
066ef357ea91
commit https://github.com/vim/vim/commit/77324fc9d3206a12f5ae39da1574be3ee1273591
Christian Brabandt <cb@256bit.org>
parents:
7202
diff
changeset
|
5543 if (run_ret != Py_None && ConvertFromPyObject(run_ret, rettv) == -1) |
4486 | 5544 EMSG(_("E859: Failed to convert returned python object to vim value")); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5545 Py_DECREF(run_ret); |
4486 | 5546 } |
5547 PyErr_Clear(); | |
5548 } | |
5549 | |
6565 | 5550 static int |
3618 | 5551 set_ref_in_py(const int copyID) |
5552 { | |
5553 pylinkedlist_T *cur; | |
5554 dict_T *dd; | |
5555 list_T *ll; | |
6565 | 5556 int abort = FALSE; |
3618 | 5557 |
5558 if (lastdict != NULL) | |
6565 | 5559 { |
5560 for(cur = lastdict ; !abort && cur != NULL ; cur = cur->pll_prev) | |
3618 | 5561 { |
5562 dd = ((DictionaryObject *) (cur->pll_obj))->dict; | |
5563 if (dd->dv_copyID != copyID) | |
5564 { | |
5565 dd->dv_copyID = copyID; | |
6565 | 5566 abort = abort || set_ref_in_ht(&dd->dv_hashtab, copyID, NULL); |
3618 | 5567 } |
5568 } | |
6565 | 5569 } |
3618 | 5570 |
5571 if (lastlist != NULL) | |
6565 | 5572 { |
5573 for(cur = lastlist ; !abort && cur != NULL ; cur = cur->pll_prev) | |
3618 | 5574 { |
5575 ll = ((ListObject *) (cur->pll_obj))->list; | |
5576 if (ll->lv_copyID != copyID) | |
5577 { | |
5578 ll->lv_copyID = copyID; | |
6565 | 5579 abort = abort || set_ref_in_list(ll, copyID, NULL); |
3618 | 5580 } |
5581 } | |
6565 | 5582 } |
5583 | |
5584 return abort; | |
3618 | 5585 } |
5586 | |
5587 static int | |
5588 set_string_copy(char_u *str, typval_T *tv) | |
5589 { | |
5590 tv->vval.v_string = vim_strsave(str); | |
5591 if (tv->vval.v_string == NULL) | |
5592 { | |
5593 PyErr_NoMemory(); | |
5594 return -1; | |
5595 } | |
5596 return 0; | |
5597 } | |
5598 | |
4385 | 5599 static int |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5600 pydict_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict) |
4385 | 5601 { |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5602 dict_T *dict; |
4385 | 5603 char_u *key; |
5604 dictitem_T *di; | |
5605 PyObject *keyObject; | |
5606 PyObject *valObject; | |
5607 Py_ssize_t iter = 0; | |
5608 | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
5609 if (!(dict = py_dict_alloc())) |
4385 | 5610 return -1; |
5611 | |
5612 tv->v_type = VAR_DICT; | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5613 tv->vval.v_dict = dict; |
4385 | 5614 |
5615 while (PyDict_Next(obj, &iter, &keyObject, &valObject)) | |
5616 { | |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5617 PyObject *todecref = NULL; |
4385 | 5618 |
4607
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5619 if (keyObject == NULL || valObject == NULL) |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5620 { |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5621 dict_unref(dict); |
4385 | 5622 return -1; |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5623 } |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5624 |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5625 if (!(key = StringToChars(keyObject, &todecref))) |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5626 { |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5627 dict_unref(dict); |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5628 return -1; |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5629 } |
4702
26f2dbea7443
updated for version 7.3.1098
Bram Moolenaar <bram@vim.org>
parents:
4698
diff
changeset
|
5630 |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5631 if (*key == NUL) |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5632 { |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5633 dict_unref(dict); |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5634 Py_XDECREF(todecref); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
5635 RAISE_NO_EMPTY_KEYS; |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5636 return -1; |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5637 } |
4385 | 5638 |
5639 di = dictitem_alloc(key); | |
5640 | |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5641 Py_XDECREF(todecref); |
4385 | 5642 |
5643 if (di == NULL) | |
5644 { | |
5645 PyErr_NoMemory(); | |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5646 dict_unref(dict); |
4385 | 5647 return -1; |
5648 } | |
5649 di->di_tv.v_lock = 0; | |
5650 | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5651 if (_ConvertFromPyObject(valObject, &di->di_tv, lookup_dict) == -1) |
4385 | 5652 { |
5653 vim_free(di); | |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5654 dict_unref(dict); |
4385 | 5655 return -1; |
5656 } | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5657 |
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5658 if (dict_add(dict, di) == FAIL) |
4385 | 5659 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
5660 RAISE_KEY_ADD_FAIL(di->di_key); |
4607
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5661 clear_tv(&di->di_tv); |
4385 | 5662 vim_free(di); |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5663 dict_unref(dict); |
4385 | 5664 return -1; |
5665 } | |
5666 } | |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5667 |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5668 --dict->dv_refcount; |
4385 | 5669 return 0; |
5670 } | |
5671 | |
5672 static int | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5673 pymap_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict) |
4385 | 5674 { |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5675 dict_T *dict; |
4385 | 5676 char_u *key; |
5677 dictitem_T *di; | |
5678 PyObject *list; | |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5679 PyObject *iterator; |
4385 | 5680 PyObject *keyObject; |
5681 PyObject *valObject; | |
5682 | |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
5683 if (!(dict = py_dict_alloc())) |
4385 | 5684 return -1; |
5685 | |
5686 tv->v_type = VAR_DICT; | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5687 tv->vval.v_dict = dict; |
4385 | 5688 |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5689 if (!(list = PyMapping_Keys(obj))) |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5690 { |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5691 dict_unref(dict); |
4385 | 5692 return -1; |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5693 } |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5694 |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5695 if (!(iterator = PyObject_GetIter(list))) |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5696 { |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5697 dict_unref(dict); |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5698 Py_DECREF(list); |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5699 return -1; |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5700 } |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5701 Py_DECREF(list); |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5702 |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5703 while ((keyObject = PyIter_Next(iterator))) |
4385 | 5704 { |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5705 PyObject *todecref; |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5706 |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5707 if (!(key = StringToChars(keyObject, &todecref))) |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5708 { |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5709 Py_DECREF(keyObject); |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5710 Py_DECREF(iterator); |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5711 dict_unref(dict); |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5712 return -1; |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5713 } |
4702
26f2dbea7443
updated for version 7.3.1098
Bram Moolenaar <bram@vim.org>
parents:
4698
diff
changeset
|
5714 |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5715 if (*key == NUL) |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5716 { |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5717 Py_DECREF(keyObject); |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5718 Py_DECREF(iterator); |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5719 Py_XDECREF(todecref); |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5720 dict_unref(dict); |
4659
80b0081824fa
updated for version 7.3.1077
Bram Moolenaar <bram@vim.org>
parents:
4653
diff
changeset
|
5721 RAISE_NO_EMPTY_KEYS; |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5722 return -1; |
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5723 } |
4607
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5724 |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5725 if (!(valObject = PyObject_GetItem(obj, keyObject))) |
4385 | 5726 { |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5727 Py_DECREF(keyObject); |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5728 Py_DECREF(iterator); |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5729 Py_XDECREF(todecref); |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5730 dict_unref(dict); |
4385 | 5731 return -1; |
5732 } | |
5733 | |
5734 di = dictitem_alloc(key); | |
5735 | |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5736 Py_DECREF(keyObject); |
4643
6ec3dada4ad3
updated for version 7.3.1069
Bram Moolenaar <bram@vim.org>
parents:
4641
diff
changeset
|
5737 Py_XDECREF(todecref); |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5738 |
4385 | 5739 if (di == NULL) |
5740 { | |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5741 Py_DECREF(iterator); |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5742 Py_DECREF(valObject); |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5743 dict_unref(dict); |
4385 | 5744 PyErr_NoMemory(); |
5745 return -1; | |
5746 } | |
5747 di->di_tv.v_lock = 0; | |
5748 | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5749 if (_ConvertFromPyObject(valObject, &di->di_tv, lookup_dict) == -1) |
4385 | 5750 { |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5751 Py_DECREF(iterator); |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5752 Py_DECREF(valObject); |
4385 | 5753 vim_free(di); |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5754 dict_unref(dict); |
4385 | 5755 return -1; |
5756 } | |
4607
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5757 |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5758 Py_DECREF(valObject); |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5759 |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5760 if (dict_add(dict, di) == FAIL) |
4385 | 5761 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
5762 RAISE_KEY_ADD_FAIL(di->di_key); |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5763 Py_DECREF(iterator); |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5764 dictitem_free(di); |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5765 dict_unref(dict); |
4385 | 5766 return -1; |
5767 } | |
5768 } | |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5769 Py_DECREF(iterator); |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5770 --dict->dv_refcount; |
4385 | 5771 return 0; |
5772 } | |
5773 | |
5774 static int | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5775 pyseq_to_tv(PyObject *obj, typval_T *tv, PyObject *lookup_dict) |
4385 | 5776 { |
5777 list_T *l; | |
5778 | |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5779 if (!(l = py_list_alloc())) |
4385 | 5780 return -1; |
5781 | |
5782 tv->v_type = VAR_LIST; | |
5783 tv->vval.v_list = l; | |
5784 | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5785 if (list_py_concat(l, obj, lookup_dict) == -1) |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5786 { |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5787 list_unref(l); |
4385 | 5788 return -1; |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5789 } |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5790 |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5791 --l->lv_refcount; |
4385 | 5792 return 0; |
5793 } | |
5794 | |
3618 | 5795 typedef int (*pytotvfunc)(PyObject *, typval_T *, PyObject *); |
5796 | |
5797 static int | |
5798 convert_dl(PyObject *obj, typval_T *tv, | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5799 pytotvfunc py_to_tv, PyObject *lookup_dict) |
3618 | 5800 { |
5801 PyObject *capsule; | |
5802 char hexBuf[sizeof(void *) * 2 + 3]; | |
5803 | |
5804 sprintf(hexBuf, "%p", obj); | |
5805 | |
3638 | 5806 # ifdef PY_USE_CAPSULE |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5807 capsule = PyDict_GetItemString(lookup_dict, hexBuf); |
3648 | 5808 # else |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5809 capsule = (PyObject *)PyDict_GetItemString(lookup_dict, hexBuf); |
3648 | 5810 # endif |
3618 | 5811 if (capsule == NULL) |
5812 { | |
3638 | 5813 # ifdef PY_USE_CAPSULE |
3618 | 5814 capsule = PyCapsule_New(tv, NULL, NULL); |
3648 | 5815 # else |
5816 capsule = PyCObject_FromVoidPtr(tv, NULL); | |
5817 # endif | |
4607
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5818 if (PyDict_SetItemString(lookup_dict, hexBuf, capsule)) |
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5819 { |
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5820 Py_DECREF(capsule); |
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5821 tv->v_type = VAR_UNKNOWN; |
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5822 return -1; |
70600448f9e7
updated for version 7.3.1051
Bram Moolenaar <bram@vim.org>
parents:
4605
diff
changeset
|
5823 } |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
5824 |
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
5825 Py_DECREF(capsule); |
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
5826 |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5827 if (py_to_tv(obj, tv, lookup_dict) == -1) |
3618 | 5828 { |
5829 tv->v_type = VAR_UNKNOWN; | |
5830 return -1; | |
5831 } | |
5832 /* As we are not using copy_tv which increments reference count we must | |
5833 * do it ourself. */ | |
7949
3f7382858d4d
commit https://github.com/vim/vim/commit/81e7a9c3fb37cad46c8f04a5ce871fb06819a371
Christian Brabandt <cb@256bit.org>
parents:
7712
diff
changeset
|
5834 if (tv->v_type == VAR_DICT) |
3f7382858d4d
commit https://github.com/vim/vim/commit/81e7a9c3fb37cad46c8f04a5ce871fb06819a371
Christian Brabandt <cb@256bit.org>
parents:
7712
diff
changeset
|
5835 ++tv->vval.v_dict->dv_refcount; |
3f7382858d4d
commit https://github.com/vim/vim/commit/81e7a9c3fb37cad46c8f04a5ce871fb06819a371
Christian Brabandt <cb@256bit.org>
parents:
7712
diff
changeset
|
5836 else if (tv->v_type == VAR_LIST) |
3f7382858d4d
commit https://github.com/vim/vim/commit/81e7a9c3fb37cad46c8f04a5ce871fb06819a371
Christian Brabandt <cb@256bit.org>
parents:
7712
diff
changeset
|
5837 ++tv->vval.v_list->lv_refcount; |
3618 | 5838 } |
5839 else | |
5840 { | |
3638 | 5841 typval_T *v; |
5842 | |
5843 # ifdef PY_USE_CAPSULE | |
5844 v = PyCapsule_GetPointer(capsule, NULL); | |
5845 # else | |
3648 | 5846 v = PyCObject_AsVoidPtr(capsule); |
3638 | 5847 # endif |
3618 | 5848 copy_tv(v, tv); |
5849 } | |
5850 return 0; | |
5851 } | |
5852 | |
5853 static int | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5854 ConvertFromPyMapping(PyObject *obj, typval_T *tv) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5855 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5856 PyObject *lookup_dict; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5857 int ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5858 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5859 if (!(lookup_dict = PyDict_New())) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5860 return -1; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5861 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5862 if (PyType_IsSubtype(obj->ob_type, &DictionaryType)) |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5863 { |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5864 tv->v_type = VAR_DICT; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5865 tv->vval.v_dict = (((DictionaryObject *)(obj))->dict); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5866 ++tv->vval.v_dict->dv_refcount; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5867 ret = 0; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5868 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5869 else if (PyDict_Check(obj)) |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5870 ret = convert_dl(obj, tv, pydict_to_tv, lookup_dict); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5871 else if (PyMapping_Check(obj)) |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5872 ret = convert_dl(obj, tv, pymap_to_tv, lookup_dict); |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5873 else |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5874 { |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
5875 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
5876 N_("unable to convert %s to vim dictionary"), |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
5877 Py_TYPE_NAME(obj)); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5878 ret = -1; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5879 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5880 Py_DECREF(lookup_dict); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5881 return ret; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5882 } |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5883 |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5884 static int |
3618 | 5885 ConvertFromPyObject(PyObject *obj, typval_T *tv) |
5886 { | |
5887 PyObject *lookup_dict; | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5888 int ret; |
3618 | 5889 |
4617
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5890 if (!(lookup_dict = PyDict_New())) |
21a99611149b
updated for version 7.3.1056
Bram Moolenaar <bram@vim.org>
parents:
4611
diff
changeset
|
5891 return -1; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5892 ret = _ConvertFromPyObject(obj, tv, lookup_dict); |
3618 | 5893 Py_DECREF(lookup_dict); |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5894 return ret; |
3618 | 5895 } |
5896 | |
5897 static int | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5898 _ConvertFromPyObject(PyObject *obj, typval_T *tv, PyObject *lookup_dict) |
3618 | 5899 { |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
5900 if (PyType_IsSubtype(obj->ob_type, &DictionaryType)) |
3618 | 5901 { |
5902 tv->v_type = VAR_DICT; | |
5903 tv->vval.v_dict = (((DictionaryObject *)(obj))->dict); | |
5904 ++tv->vval.v_dict->dv_refcount; | |
5905 } | |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
5906 else if (PyType_IsSubtype(obj->ob_type, &ListType)) |
3618 | 5907 { |
5908 tv->v_type = VAR_LIST; | |
5909 tv->vval.v_list = (((ListObject *)(obj))->list); | |
5910 ++tv->vval.v_list->lv_refcount; | |
5911 } | |
4976
4ed713442c51
updated for version 7.3.1233
Bram Moolenaar <bram@vim.org>
parents:
4974
diff
changeset
|
5912 else if (PyType_IsSubtype(obj->ob_type, &FunctionType)) |
3618 | 5913 { |
5914 if (set_string_copy(((FunctionObject *) (obj))->name, tv) == -1) | |
5915 return -1; | |
5916 | |
5917 tv->v_type = VAR_FUNC; | |
5918 func_ref(tv->vval.v_string); | |
5919 } | |
5920 else if (PyBytes_Check(obj)) | |
5921 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5922 char_u *str; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5923 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5924 if (PyBytes_AsStringAndSize(obj, (char **) &str, NULL) == -1) |
3800 | 5925 return -1; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5926 if (str == NULL) |
3618 | 5927 return -1; |
5928 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5929 if (set_string_copy(str, tv) == -1) |
3618 | 5930 return -1; |
5931 | |
5932 tv->v_type = VAR_STRING; | |
5933 } | |
5934 else if (PyUnicode_Check(obj)) | |
5935 { | |
5936 PyObject *bytes; | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5937 char_u *str; |
3618 | 5938 |
4966
620d9b59d4ed
updated for version 7.3.1228
Bram Moolenaar <bram@vim.org>
parents:
4964
diff
changeset
|
5939 bytes = PyUnicode_AsEncodedString(obj, ENC_OPT, NULL); |
3618 | 5940 if (bytes == NULL) |
5941 return -1; | |
5942 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5943 if(PyBytes_AsStringAndSize(bytes, (char **) &str, NULL) == -1) |
3800 | 5944 return -1; |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5945 if (str == NULL) |
3618 | 5946 return -1; |
5947 | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
5948 if (set_string_copy(str, tv)) |
3618 | 5949 { |
5950 Py_XDECREF(bytes); | |
5951 return -1; | |
5952 } | |
5953 Py_XDECREF(bytes); | |
5954 | |
5955 tv->v_type = VAR_STRING; | |
5956 } | |
4321 | 5957 #if PY_MAJOR_VERSION < 3 |
3618 | 5958 else if (PyInt_Check(obj)) |
5959 { | |
5960 tv->v_type = VAR_NUMBER; | |
5961 tv->vval.v_number = (varnumber_T) PyInt_AsLong(obj); | |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5962 if (PyErr_Occurred()) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5963 return -1; |
3618 | 5964 } |
5965 #endif | |
5966 else if (PyLong_Check(obj)) | |
5967 { | |
5968 tv->v_type = VAR_NUMBER; | |
5969 tv->vval.v_number = (varnumber_T) PyLong_AsLong(obj); | |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5970 if (PyErr_Occurred()) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5971 return -1; |
3618 | 5972 } |
5973 else if (PyDict_Check(obj)) | |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5974 return convert_dl(obj, tv, pydict_to_tv, lookup_dict); |
3618 | 5975 #ifdef FEAT_FLOAT |
5976 else if (PyFloat_Check(obj)) | |
5977 { | |
5978 tv->v_type = VAR_FLOAT; | |
5979 tv->vval.v_float = (float_T) PyFloat_AsDouble(obj); | |
5980 } | |
5981 #endif | |
4635
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5982 else if (PyObject_HasAttrString(obj, "keys")) |
07c534fe9b6c
updated for version 7.3.1065
Bram Moolenaar <bram@vim.org>
parents:
4633
diff
changeset
|
5983 return convert_dl(obj, tv, pymap_to_tv, lookup_dict); |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
5984 /* PyObject_GetIter can create built-in iterator for any sequence object */ |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
5985 else if (PyIter_Check(obj) || PySequence_Check(obj)) |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5986 return convert_dl(obj, tv, pyseq_to_tv, lookup_dict); |
3618 | 5987 else if (PyMapping_Check(obj)) |
4601
19d406a8509d
updated for version 7.3.1048
Bram Moolenaar <bram@vim.org>
parents:
4599
diff
changeset
|
5988 return convert_dl(obj, tv, pymap_to_tv, lookup_dict); |
4972
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5989 else if (PyNumber_Check(obj)) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5990 { |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5991 PyObject *num; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5992 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5993 if (!(num = PyNumber_Long(obj))) |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5994 return -1; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5995 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5996 tv->v_type = VAR_NUMBER; |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5997 tv->vval.v_number = (varnumber_T) PyLong_AsLong(num); |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5998 |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
5999 Py_DECREF(num); |
537bbfff0c5c
updated for version 7.3.1231
Bram Moolenaar <bram@vim.org>
parents:
4970
diff
changeset
|
6000 } |
3618 | 6001 else |
6002 { | |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
6003 PyErr_FORMAT(PyExc_TypeError, |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
6004 N_("unable to convert %s to vim structure"), |
4970
f5c822e5a0eb
updated for version 7.3.1230
Bram Moolenaar <bram@vim.org>
parents:
4968
diff
changeset
|
6005 Py_TYPE_NAME(obj)); |
3618 | 6006 return -1; |
6007 } | |
6008 return 0; | |
6009 } | |
6010 | |
6011 static PyObject * | |
6012 ConvertToPyObject(typval_T *tv) | |
6013 { | |
6014 if (tv == NULL) | |
6015 { | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
6016 PyErr_SET_VIM(N_("internal error: NULL reference passed")); |
3618 | 6017 return NULL; |
6018 } | |
6019 switch (tv->v_type) | |
6020 { | |
6021 case VAR_STRING: | |
3852 | 6022 return PyBytes_FromString(tv->vval.v_string == NULL |
6023 ? "" : (char *)tv->vval.v_string); | |
3618 | 6024 case VAR_NUMBER: |
6025 return PyLong_FromLong((long) tv->vval.v_number); | |
6026 #ifdef FEAT_FLOAT | |
6027 case VAR_FLOAT: | |
6028 return PyFloat_FromDouble((double) tv->vval.v_float); | |
6029 #endif | |
6030 case VAR_LIST: | |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
6031 return NEW_LIST(tv->vval.v_list); |
3618 | 6032 case VAR_DICT: |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
6033 return NEW_DICTIONARY(tv->vval.v_dict); |
3618 | 6034 case VAR_FUNC: |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
6035 return NEW_FUNCTION(tv->vval.v_string == NULL |
3852 | 6036 ? (char_u *)"" : tv->vval.v_string); |
3618 | 6037 case VAR_UNKNOWN: |
6038 Py_INCREF(Py_None); | |
6039 return Py_None; | |
6040 default: | |
4978
f4969f8f66e9
updated for version 7.3.1234
Bram Moolenaar <bram@vim.org>
parents:
4976
diff
changeset
|
6041 PyErr_SET_VIM(N_("internal error: invalid value type")); |
3618 | 6042 return NULL; |
6043 } | |
6044 } | |
4319 | 6045 |
6046 typedef struct | |
6047 { | |
6048 PyObject_HEAD | |
6049 } CurrentObject; | |
6050 static PyTypeObject CurrentType; | |
6051 | |
6052 static void | |
6053 init_structs(void) | |
6054 { | |
6055 vim_memset(&OutputType, 0, sizeof(OutputType)); | |
6056 OutputType.tp_name = "vim.message"; | |
6057 OutputType.tp_basicsize = sizeof(OutputObject); | |
6058 OutputType.tp_flags = Py_TPFLAGS_DEFAULT; | |
6059 OutputType.tp_doc = "vim message object"; | |
6060 OutputType.tp_methods = OutputMethods; | |
6061 #if PY_MAJOR_VERSION >= 3 | |
4488 | 6062 OutputType.tp_getattro = (getattrofunc)OutputGetattro; |
6063 OutputType.tp_setattro = (setattrofunc)OutputSetattro; | |
4319 | 6064 OutputType.tp_alloc = call_PyType_GenericAlloc; |
6065 OutputType.tp_new = call_PyType_GenericNew; | |
6066 OutputType.tp_free = call_PyObject_Free; | |
6067 #else | |
4488 | 6068 OutputType.tp_getattr = (getattrfunc)OutputGetattr; |
6069 OutputType.tp_setattr = (setattrfunc)OutputSetattr; | |
4319 | 6070 #endif |
6071 | |
4397 | 6072 vim_memset(&IterType, 0, sizeof(IterType)); |
6073 IterType.tp_name = "vim.iter"; | |
6074 IterType.tp_basicsize = sizeof(IterObject); | |
4611
49f0fcd9762c
updated for version 7.3.1053
Bram Moolenaar <bram@vim.org>
parents:
4609
diff
changeset
|
6075 IterType.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC; |
4397 | 6076 IterType.tp_doc = "generic iterator object"; |
4488 | 6077 IterType.tp_iter = (getiterfunc)IterIter; |
6078 IterType.tp_iternext = (iternextfunc)IterNext; | |
6079 IterType.tp_dealloc = (destructor)IterDestructor; | |
6080 IterType.tp_traverse = (traverseproc)IterTraverse; | |
6081 IterType.tp_clear = (inquiry)IterClear; | |
4397 | 6082 |
4319 | 6083 vim_memset(&BufferType, 0, sizeof(BufferType)); |
6084 BufferType.tp_name = "vim.buffer"; | |
6085 BufferType.tp_basicsize = sizeof(BufferType); | |
4488 | 6086 BufferType.tp_dealloc = (destructor)BufferDestructor; |
6087 BufferType.tp_repr = (reprfunc)BufferRepr; | |
4319 | 6088 BufferType.tp_as_sequence = &BufferAsSeq; |
6089 BufferType.tp_as_mapping = &BufferAsMapping; | |
6090 BufferType.tp_flags = Py_TPFLAGS_DEFAULT; | |
6091 BufferType.tp_doc = "vim buffer object"; | |
6092 BufferType.tp_methods = BufferMethods; | |
6093 #if PY_MAJOR_VERSION >= 3 | |
4488 | 6094 BufferType.tp_getattro = (getattrofunc)BufferGetattro; |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
6095 BufferType.tp_setattro = (setattrofunc)BufferSetattro; |
4319 | 6096 BufferType.tp_alloc = call_PyType_GenericAlloc; |
6097 BufferType.tp_new = call_PyType_GenericNew; | |
6098 BufferType.tp_free = call_PyObject_Free; | |
6099 #else | |
4488 | 6100 BufferType.tp_getattr = (getattrfunc)BufferGetattr; |
4589
fa39483a1363
updated for version 7.3.1042
Bram Moolenaar <bram@vim.org>
parents:
4587
diff
changeset
|
6101 BufferType.tp_setattr = (setattrfunc)BufferSetattr; |
4319 | 6102 #endif |
6103 | |
6104 vim_memset(&WindowType, 0, sizeof(WindowType)); | |
6105 WindowType.tp_name = "vim.window"; | |
6106 WindowType.tp_basicsize = sizeof(WindowObject); | |
4488 | 6107 WindowType.tp_dealloc = (destructor)WindowDestructor; |
6108 WindowType.tp_repr = (reprfunc)WindowRepr; | |
4611
49f0fcd9762c
updated for version 7.3.1053
Bram Moolenaar <bram@vim.org>
parents:
4609
diff
changeset
|
6109 WindowType.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC; |
4319 | 6110 WindowType.tp_doc = "vim Window object"; |
6111 WindowType.tp_methods = WindowMethods; | |
4488 | 6112 WindowType.tp_traverse = (traverseproc)WindowTraverse; |
6113 WindowType.tp_clear = (inquiry)WindowClear; | |
4319 | 6114 #if PY_MAJOR_VERSION >= 3 |
4488 | 6115 WindowType.tp_getattro = (getattrofunc)WindowGetattro; |
6116 WindowType.tp_setattro = (setattrofunc)WindowSetattro; | |
4319 | 6117 WindowType.tp_alloc = call_PyType_GenericAlloc; |
6118 WindowType.tp_new = call_PyType_GenericNew; | |
6119 WindowType.tp_free = call_PyObject_Free; | |
6120 #else | |
4488 | 6121 WindowType.tp_getattr = (getattrfunc)WindowGetattr; |
6122 WindowType.tp_setattr = (setattrfunc)WindowSetattr; | |
4319 | 6123 #endif |
6124 | |
4401 | 6125 vim_memset(&TabPageType, 0, sizeof(TabPageType)); |
6126 TabPageType.tp_name = "vim.tabpage"; | |
6127 TabPageType.tp_basicsize = sizeof(TabPageObject); | |
4488 | 6128 TabPageType.tp_dealloc = (destructor)TabPageDestructor; |
6129 TabPageType.tp_repr = (reprfunc)TabPageRepr; | |
4401 | 6130 TabPageType.tp_flags = Py_TPFLAGS_DEFAULT; |
6131 TabPageType.tp_doc = "vim tab page object"; | |
6132 TabPageType.tp_methods = TabPageMethods; | |
6133 #if PY_MAJOR_VERSION >= 3 | |
4488 | 6134 TabPageType.tp_getattro = (getattrofunc)TabPageGetattro; |
4401 | 6135 TabPageType.tp_alloc = call_PyType_GenericAlloc; |
6136 TabPageType.tp_new = call_PyType_GenericNew; | |
6137 TabPageType.tp_free = call_PyObject_Free; | |
6138 #else | |
4488 | 6139 TabPageType.tp_getattr = (getattrfunc)TabPageGetattr; |
4401 | 6140 #endif |
6141 | |
4393 | 6142 vim_memset(&BufMapType, 0, sizeof(BufMapType)); |
6143 BufMapType.tp_name = "vim.bufferlist"; | |
6144 BufMapType.tp_basicsize = sizeof(BufMapObject); | |
6145 BufMapType.tp_as_mapping = &BufMapAsMapping; | |
6146 BufMapType.tp_flags = Py_TPFLAGS_DEFAULT; | |
4397 | 6147 BufMapType.tp_iter = BufMapIter; |
4319 | 6148 BufferType.tp_doc = "vim buffer list"; |
6149 | |
6150 vim_memset(&WinListType, 0, sizeof(WinListType)); | |
6151 WinListType.tp_name = "vim.windowlist"; | |
6152 WinListType.tp_basicsize = sizeof(WinListType); | |
6153 WinListType.tp_as_sequence = &WinListAsSeq; | |
6154 WinListType.tp_flags = Py_TPFLAGS_DEFAULT; | |
6155 WinListType.tp_doc = "vim window list"; | |
4488 | 6156 WinListType.tp_dealloc = (destructor)WinListDestructor; |
4401 | 6157 |
6158 vim_memset(&TabListType, 0, sizeof(TabListType)); | |
6159 TabListType.tp_name = "vim.tabpagelist"; | |
6160 TabListType.tp_basicsize = sizeof(TabListType); | |
6161 TabListType.tp_as_sequence = &TabListAsSeq; | |
6162 TabListType.tp_flags = Py_TPFLAGS_DEFAULT; | |
6163 TabListType.tp_doc = "vim tab page list"; | |
4319 | 6164 |
6165 vim_memset(&RangeType, 0, sizeof(RangeType)); | |
6166 RangeType.tp_name = "vim.range"; | |
6167 RangeType.tp_basicsize = sizeof(RangeObject); | |
4488 | 6168 RangeType.tp_dealloc = (destructor)RangeDestructor; |
6169 RangeType.tp_repr = (reprfunc)RangeRepr; | |
4319 | 6170 RangeType.tp_as_sequence = &RangeAsSeq; |
6171 RangeType.tp_as_mapping = &RangeAsMapping; | |
4611
49f0fcd9762c
updated for version 7.3.1053
Bram Moolenaar <bram@vim.org>
parents:
4609
diff
changeset
|
6172 RangeType.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC; |
4319 | 6173 RangeType.tp_doc = "vim Range object"; |
6174 RangeType.tp_methods = RangeMethods; | |
4500 | 6175 RangeType.tp_traverse = (traverseproc)RangeTraverse; |
6176 RangeType.tp_clear = (inquiry)RangeClear; | |
4319 | 6177 #if PY_MAJOR_VERSION >= 3 |
4488 | 6178 RangeType.tp_getattro = (getattrofunc)RangeGetattro; |
4319 | 6179 RangeType.tp_alloc = call_PyType_GenericAlloc; |
6180 RangeType.tp_new = call_PyType_GenericNew; | |
6181 RangeType.tp_free = call_PyObject_Free; | |
6182 #else | |
4488 | 6183 RangeType.tp_getattr = (getattrfunc)RangeGetattr; |
4319 | 6184 #endif |
6185 | |
6186 vim_memset(&CurrentType, 0, sizeof(CurrentType)); | |
6187 CurrentType.tp_name = "vim.currentdata"; | |
6188 CurrentType.tp_basicsize = sizeof(CurrentObject); | |
6189 CurrentType.tp_flags = Py_TPFLAGS_DEFAULT; | |
6190 CurrentType.tp_doc = "vim current object"; | |
4599
89bec74fd793
updated for version 7.3.1047
Bram Moolenaar <bram@vim.org>
parents:
4597
diff
changeset
|
6191 CurrentType.tp_methods = CurrentMethods; |
4319 | 6192 #if PY_MAJOR_VERSION >= 3 |
4488 | 6193 CurrentType.tp_getattro = (getattrofunc)CurrentGetattro; |
6194 CurrentType.tp_setattro = (setattrofunc)CurrentSetattro; | |
4319 | 6195 #else |
4488 | 6196 CurrentType.tp_getattr = (getattrfunc)CurrentGetattr; |
6197 CurrentType.tp_setattr = (setattrfunc)CurrentSetattr; | |
4319 | 6198 #endif |
6199 | |
6200 vim_memset(&DictionaryType, 0, sizeof(DictionaryType)); | |
6201 DictionaryType.tp_name = "vim.dictionary"; | |
6202 DictionaryType.tp_basicsize = sizeof(DictionaryObject); | |
4488 | 6203 DictionaryType.tp_dealloc = (destructor)DictionaryDestructor; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
6204 DictionaryType.tp_as_sequence = &DictionaryAsSeq; |
4319 | 6205 DictionaryType.tp_as_mapping = &DictionaryAsMapping; |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
6206 DictionaryType.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE; |
4319 | 6207 DictionaryType.tp_doc = "dictionary pushing modifications to vim structure"; |
6208 DictionaryType.tp_methods = DictionaryMethods; | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
6209 DictionaryType.tp_iter = (getiterfunc)DictionaryIter; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
6210 DictionaryType.tp_new = (newfunc)DictionaryConstructor; |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
6211 DictionaryType.tp_alloc = (allocfunc)PyType_GenericAlloc; |
4319 | 6212 #if PY_MAJOR_VERSION >= 3 |
4488 | 6213 DictionaryType.tp_getattro = (getattrofunc)DictionaryGetattro; |
6214 DictionaryType.tp_setattro = (setattrofunc)DictionarySetattro; | |
4319 | 6215 #else |
4488 | 6216 DictionaryType.tp_getattr = (getattrfunc)DictionaryGetattr; |
6217 DictionaryType.tp_setattr = (setattrfunc)DictionarySetattr; | |
4319 | 6218 #endif |
6219 | |
6220 vim_memset(&ListType, 0, sizeof(ListType)); | |
6221 ListType.tp_name = "vim.list"; | |
4488 | 6222 ListType.tp_dealloc = (destructor)ListDestructor; |
4319 | 6223 ListType.tp_basicsize = sizeof(ListObject); |
6224 ListType.tp_as_sequence = &ListAsSeq; | |
6225 ListType.tp_as_mapping = &ListAsMapping; | |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
6226 ListType.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE; |
4319 | 6227 ListType.tp_doc = "list pushing modifications to vim structure"; |
6228 ListType.tp_methods = ListMethods; | |
4488 | 6229 ListType.tp_iter = (getiterfunc)ListIter; |
4629
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
6230 ListType.tp_new = (newfunc)ListConstructor; |
e4e48d4ee040
updated for version 7.3.1062
Bram Moolenaar <bram@vim.org>
parents:
4627
diff
changeset
|
6231 ListType.tp_alloc = (allocfunc)PyType_GenericAlloc; |
4319 | 6232 #if PY_MAJOR_VERSION >= 3 |
4488 | 6233 ListType.tp_getattro = (getattrofunc)ListGetattro; |
6234 ListType.tp_setattro = (setattrofunc)ListSetattro; | |
4319 | 6235 #else |
4488 | 6236 ListType.tp_getattr = (getattrfunc)ListGetattr; |
6237 ListType.tp_setattr = (setattrfunc)ListSetattr; | |
4319 | 6238 #endif |
6239 | |
6240 vim_memset(&FunctionType, 0, sizeof(FunctionType)); | |
4397 | 6241 FunctionType.tp_name = "vim.function"; |
4319 | 6242 FunctionType.tp_basicsize = sizeof(FunctionObject); |
4488 | 6243 FunctionType.tp_dealloc = (destructor)FunctionDestructor; |
6244 FunctionType.tp_call = (ternaryfunc)FunctionCall; | |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
6245 FunctionType.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE; |
4319 | 6246 FunctionType.tp_doc = "object that calls vim function"; |
6247 FunctionType.tp_methods = FunctionMethods; | |
4625
cb5c1e37ad4d
updated for version 7.3.1060
Bram Moolenaar <bram@vim.org>
parents:
4623
diff
changeset
|
6248 FunctionType.tp_repr = (reprfunc)FunctionRepr; |
4631
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
6249 FunctionType.tp_new = (newfunc)FunctionConstructor; |
4157fef7b950
updated for version 7.3.1063
Bram Moolenaar <bram@vim.org>
parents:
4629
diff
changeset
|
6250 FunctionType.tp_alloc = (allocfunc)PyType_GenericAlloc; |
4319 | 6251 #if PY_MAJOR_VERSION >= 3 |
4488 | 6252 FunctionType.tp_getattro = (getattrofunc)FunctionGetattro; |
4319 | 6253 #else |
4488 | 6254 FunctionType.tp_getattr = (getattrfunc)FunctionGetattr; |
4319 | 6255 #endif |
6256 | |
4350 | 6257 vim_memset(&OptionsType, 0, sizeof(OptionsType)); |
6258 OptionsType.tp_name = "vim.options"; | |
6259 OptionsType.tp_basicsize = sizeof(OptionsObject); | |
5610 | 6260 OptionsType.tp_as_sequence = &OptionsAsSeq; |
4611
49f0fcd9762c
updated for version 7.3.1053
Bram Moolenaar <bram@vim.org>
parents:
4609
diff
changeset
|
6261 OptionsType.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC; |
4350 | 6262 OptionsType.tp_doc = "object for manipulating options"; |
5610 | 6263 OptionsType.tp_iter = (getiterfunc)OptionsIter; |
4350 | 6264 OptionsType.tp_as_mapping = &OptionsAsMapping; |
4488 | 6265 OptionsType.tp_dealloc = (destructor)OptionsDestructor; |
6266 OptionsType.tp_traverse = (traverseproc)OptionsTraverse; | |
6267 OptionsType.tp_clear = (inquiry)OptionsClear; | |
4350 | 6268 |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6269 vim_memset(&LoaderType, 0, sizeof(LoaderType)); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6270 LoaderType.tp_name = "vim.Loader"; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6271 LoaderType.tp_basicsize = sizeof(LoaderObject); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6272 LoaderType.tp_flags = Py_TPFLAGS_DEFAULT; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6273 LoaderType.tp_doc = "vim message object"; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6274 LoaderType.tp_methods = LoaderMethods; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6275 LoaderType.tp_dealloc = (destructor)LoaderDestructor; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6276 |
4319 | 6277 #if PY_MAJOR_VERSION >= 3 |
6278 vim_memset(&vimmodule, 0, sizeof(vimmodule)); | |
6279 vimmodule.m_name = "vim"; | |
6280 vimmodule.m_doc = "Vim Python interface\n"; | |
6281 vimmodule.m_size = -1; | |
6282 vimmodule.m_methods = VimMethods; | |
6283 #endif | |
6284 } | |
4494 | 6285 |
6286 #define PYTYPE_READY(type) \ | |
6287 if (PyType_Ready(&type)) \ | |
6288 return -1; | |
6289 | |
6290 static int | |
5166
467efeee8f9e
updated for version 7.4a.009
Bram Moolenaar <bram@vim.org>
parents:
5139
diff
changeset
|
6291 init_types(void) |
4494 | 6292 { |
6293 PYTYPE_READY(IterType); | |
6294 PYTYPE_READY(BufferType); | |
6295 PYTYPE_READY(RangeType); | |
6296 PYTYPE_READY(WindowType); | |
6297 PYTYPE_READY(TabPageType); | |
6298 PYTYPE_READY(BufMapType); | |
6299 PYTYPE_READY(WinListType); | |
6300 PYTYPE_READY(TabListType); | |
6301 PYTYPE_READY(CurrentType); | |
6302 PYTYPE_READY(DictionaryType); | |
6303 PYTYPE_READY(ListType); | |
6304 PYTYPE_READY(FunctionType); | |
6305 PYTYPE_READY(OptionsType); | |
6306 PYTYPE_READY(OutputType); | |
4851
96e154e825a7
updated for version 7.3.1172
Bram Moolenaar <bram@vim.org>
parents:
4833
diff
changeset
|
6307 PYTYPE_READY(LoaderType); |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6308 return 0; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6309 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6310 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6311 static int |
4922
8dd2769ab75c
updated for version 7.3.1206
Bram Moolenaar <bram@vim.org>
parents:
4918
diff
changeset
|
6312 init_sys_path(void) |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6313 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6314 PyObject *path; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6315 PyObject *path_hook; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6316 PyObject *path_hooks; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6317 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6318 if (!(path_hook = PyObject_GetAttrString(vim_module, "path_hook"))) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6319 return -1; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6320 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6321 if (!(path_hooks = PySys_GetObject("path_hooks"))) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6322 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6323 PyErr_Clear(); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6324 path_hooks = PyList_New(1); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6325 PyList_SET_ITEM(path_hooks, 0, path_hook); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6326 if (PySys_SetObject("path_hooks", path_hooks)) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6327 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6328 Py_DECREF(path_hooks); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6329 return -1; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6330 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6331 Py_DECREF(path_hooks); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6332 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6333 else if (PyList_Check(path_hooks)) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6334 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6335 if (PyList_Append(path_hooks, path_hook)) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6336 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6337 Py_DECREF(path_hook); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6338 return -1; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6339 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6340 Py_DECREF(path_hook); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6341 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6342 else |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6343 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6344 VimTryStart(); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6345 EMSG(_("Failed to set path hook: sys.path_hooks is not a list\n" |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6346 "You should now do the following:\n" |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6347 "- append vim.path_hook to sys.path_hooks\n" |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6348 "- append vim.VIM_SPECIAL_PATH to sys.path\n")); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6349 VimTryEnd(); /* Discard the error */ |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6350 Py_DECREF(path_hook); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6351 return 0; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6352 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6353 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6354 if (!(path = PySys_GetObject("path"))) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6355 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6356 PyErr_Clear(); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6357 path = PyList_New(1); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6358 Py_INCREF(vim_special_path_object); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6359 PyList_SET_ITEM(path, 0, vim_special_path_object); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6360 if (PySys_SetObject("path", path)) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6361 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6362 Py_DECREF(path); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6363 return -1; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6364 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6365 Py_DECREF(path); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6366 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6367 else if (PyList_Check(path)) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6368 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6369 if (PyList_Append(path, vim_special_path_object)) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6370 return -1; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6371 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6372 else |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6373 { |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6374 VimTryStart(); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6375 EMSG(_("Failed to set path: sys.path is not a list\n" |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6376 "You should now append vim.VIM_SPECIAL_PATH to sys.path")); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6377 VimTryEnd(); /* Discard the error */ |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6378 } |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6379 |
4494 | 6380 return 0; |
6381 } | |
6382 | |
6383 static BufMapObject TheBufferMap = | |
6384 { | |
6385 PyObject_HEAD_INIT(&BufMapType) | |
6386 }; | |
6387 | |
6388 static WinListObject TheWindowList = | |
6389 { | |
6390 PyObject_HEAD_INIT(&WinListType) | |
6391 NULL | |
6392 }; | |
6393 | |
6394 static CurrentObject TheCurrent = | |
6395 { | |
6396 PyObject_HEAD_INIT(&CurrentType) | |
6397 }; | |
6398 | |
6399 static TabListObject TheTabPageList = | |
6400 { | |
6401 PyObject_HEAD_INIT(&TabListType) | |
6402 }; | |
6403 | |
6404 static struct numeric_constant { | |
6405 char *name; | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6406 int val; |
4494 | 6407 } numeric_constants[] = { |
6408 {"VAR_LOCKED", VAR_LOCKED}, | |
6409 {"VAR_FIXED", VAR_FIXED}, | |
6410 {"VAR_SCOPE", VAR_SCOPE}, | |
6411 {"VAR_DEF_SCOPE", VAR_DEF_SCOPE}, | |
6412 }; | |
6413 | |
6414 static struct object_constant { | |
6415 char *name; | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6416 PyObject *valObject; |
4494 | 6417 } object_constants[] = { |
6418 {"buffers", (PyObject *)(void *)&TheBufferMap}, | |
6419 {"windows", (PyObject *)(void *)&TheWindowList}, | |
6420 {"tabpages", (PyObject *)(void *)&TheTabPageList}, | |
6421 {"current", (PyObject *)(void *)&TheCurrent}, | |
4496 | 6422 |
6423 {"Buffer", (PyObject *)&BufferType}, | |
6424 {"Range", (PyObject *)&RangeType}, | |
6425 {"Window", (PyObject *)&WindowType}, | |
6426 {"TabPage", (PyObject *)&TabPageType}, | |
6427 {"Dictionary", (PyObject *)&DictionaryType}, | |
6428 {"List", (PyObject *)&ListType}, | |
6429 {"Function", (PyObject *)&FunctionType}, | |
6430 {"Options", (PyObject *)&OptionsType}, | |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6431 {"_Loader", (PyObject *)&LoaderType}, |
4494 | 6432 }; |
6433 | |
6434 #define ADD_OBJECT(m, name, obj) \ | |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
6435 if (PyModule_AddObject(m, name, obj)) \ |
4494 | 6436 return -1; |
6437 | |
6438 #define ADD_CHECKED_OBJECT(m, name, obj) \ | |
6439 { \ | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6440 PyObject *valObject = obj; \ |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6441 if (!valObject) \ |
4494 | 6442 return -1; \ |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6443 ADD_OBJECT(m, name, valObject); \ |
4494 | 6444 } |
6445 | |
6446 static int | |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
6447 populate_module(PyObject *m) |
4494 | 6448 { |
4829
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
6449 int i; |
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
6450 PyObject *other_module; |
4831
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6451 PyObject *attr; |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6452 PyObject *imp; |
4494 | 6453 |
6454 for (i = 0; i < (int)(sizeof(numeric_constants) | |
6455 / sizeof(struct numeric_constant)); | |
6456 ++i) | |
6457 ADD_CHECKED_OBJECT(m, numeric_constants[i].name, | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6458 PyInt_FromLong(numeric_constants[i].val)); |
4494 | 6459 |
6460 for (i = 0; i < (int)(sizeof(object_constants) | |
6461 / sizeof(struct object_constant)); | |
6462 ++i) | |
6463 { | |
4974
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6464 PyObject *valObject; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6465 |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6466 valObject = object_constants[i].valObject; |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6467 Py_INCREF(valObject); |
a594ce86b5ea
updated for version 7.3.1232
Bram Moolenaar <bram@vim.org>
parents:
4972
diff
changeset
|
6468 ADD_OBJECT(m, object_constants[i].name, valObject); |
4494 | 6469 } |
6470 | |
6471 if (!(VimError = PyErr_NewException("vim.error", NULL, NULL))) | |
6472 return -1; | |
6473 ADD_OBJECT(m, "error", VimError); | |
6474 | |
4627
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
6475 ADD_CHECKED_OBJECT(m, "vars", NEW_DICTIONARY(&globvardict)); |
18ba89e06fab
updated for version 7.3.1061
Bram Moolenaar <bram@vim.org>
parents:
4625
diff
changeset
|
6476 ADD_CHECKED_OBJECT(m, "vvars", NEW_DICTIONARY(&vimvardict)); |
4494 | 6477 ADD_CHECKED_OBJECT(m, "options", |
6478 OptionsNew(SREQ_GLOBAL, NULL, dummy_check, NULL)); | |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6479 |
4829
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
6480 if (!(other_module = PyImport_ImportModule("os"))) |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6481 return -1; |
4829
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
6482 ADD_OBJECT(m, "os", other_module); |
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
6483 |
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
6484 if (!(py_getcwd = PyObject_GetAttrString(other_module, "getcwd"))) |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6485 return -1; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6486 ADD_OBJECT(m, "_getcwd", py_getcwd) |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6487 |
4829
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
6488 if (!(py_chdir = PyObject_GetAttrString(other_module, "chdir"))) |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6489 return -1; |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6490 ADD_OBJECT(m, "_chdir", py_chdir); |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
6491 if (!(attr = PyObject_GetAttrString(m, "chdir"))) |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6492 return -1; |
4831
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6493 if (PyObject_SetAttrString(other_module, "chdir", attr)) |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6494 { |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6495 Py_DECREF(attr); |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6496 return -1; |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6497 } |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6498 Py_DECREF(attr); |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6499 |
4829
ff3935926449
updated for version 7.3.1161
Bram Moolenaar <bram@vim.org>
parents:
4754
diff
changeset
|
6500 if ((py_fchdir = PyObject_GetAttrString(other_module, "fchdir"))) |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6501 { |
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6502 ADD_OBJECT(m, "_fchdir", py_fchdir); |
4982
39980afcf54a
updated for version 7.3.1236
Bram Moolenaar <bram@vim.org>
parents:
4978
diff
changeset
|
6503 if (!(attr = PyObject_GetAttrString(m, "fchdir"))) |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6504 return -1; |
4831
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6505 if (PyObject_SetAttrString(other_module, "fchdir", attr)) |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6506 { |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6507 Py_DECREF(attr); |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6508 return -1; |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6509 } |
b8eabb6a9687
updated for version 7.3.1162
Bram Moolenaar <bram@vim.org>
parents:
4829
diff
changeset
|
6510 Py_DECREF(attr); |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6511 } |
4722
3534e9b4fa42
updated for version 7.3.1108
Bram Moolenaar <bram@vim.org>
parents:
4706
diff
changeset
|
6512 else |
3534e9b4fa42
updated for version 7.3.1108
Bram Moolenaar <bram@vim.org>
parents:
4706
diff
changeset
|
6513 PyErr_Clear(); |
4704
542af01979be
updated for version 7.3.1099
Bram Moolenaar <bram@vim.org>
parents:
4702
diff
changeset
|
6514 |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6515 if (!(vim_special_path_object = PyString_FromString(vim_special_path))) |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6516 return -1; |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6517 |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6518 ADD_OBJECT(m, "VIM_SPECIAL_PATH", vim_special_path_object); |
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6519 |
4855
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6520 if (!(imp = PyImport_ImportModule("imp"))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6521 return -1; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6522 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6523 if (!(py_find_module = PyObject_GetAttrString(imp, "find_module"))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6524 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6525 Py_DECREF(imp); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6526 return -1; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6527 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6528 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6529 if (!(py_load_module = PyObject_GetAttrString(imp, "load_module"))) |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6530 { |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6531 Py_DECREF(py_find_module); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6532 Py_DECREF(imp); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6533 return -1; |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6534 } |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6535 |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6536 Py_DECREF(imp); |
52850ef928f8
updated for version 7.3.1174
Bram Moolenaar <bram@vim.org>
parents:
4851
diff
changeset
|
6537 |
4851
96e154e825a7
updated for version 7.3.1172
Bram Moolenaar <bram@vim.org>
parents:
4833
diff
changeset
|
6538 ADD_OBJECT(m, "_find_module", py_find_module); |
96e154e825a7
updated for version 7.3.1172
Bram Moolenaar <bram@vim.org>
parents:
4833
diff
changeset
|
6539 ADD_OBJECT(m, "_load_module", py_load_module); |
4833
70b1178dec79
updated for version 7.3.1163
Bram Moolenaar <bram@vim.org>
parents:
4831
diff
changeset
|
6540 |
4494 | 6541 return 0; |
6542 } |