annotate src/scriptfile.c @ 21898:5e70c368bea2

Added tag v8.2.1498 for changeset e0af4660dfc7d4069fee09ad9e1c8145cad98565
author Bram Moolenaar <Bram@vim.org>
date Thu, 20 Aug 2020 19:00:04 +0200
parents a427f5f26419
children a98211c3e14e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * scriptfile.c: functions for dealing with the runtime directories/files
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #include "vim.h"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
16 #if defined(FEAT_EVAL) || defined(PROTO)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
17 // The names of packages that once were loaded are remembered.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
18 static garray_T ga_loaded = {0, 0, sizeof(char_u *), 4, NULL};
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
19 #endif
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
20
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 /*
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
22 * Initialize the execution stack.
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
23 */
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
24 void
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
25 estack_init(void)
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
26 {
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
27 estack_T *entry;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
28
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
29 if (ga_grow(&exestack, 10) == FAIL)
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
30 mch_exit(0);
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
31 entry = ((estack_T *)exestack.ga_data) + exestack.ga_len;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
32 entry->es_type = ETYPE_TOP;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
33 entry->es_name = NULL;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
34 entry->es_lnum = 0;
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
35 #ifdef FEAT_EVAL
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
36 entry->es_info.ufunc = NULL;
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
37 #endif
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
38 ++exestack.ga_len;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
39 }
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
40
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
41 /*
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
42 * Add an item to the execution stack.
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
43 * Returns the new entry or NULL when out of memory.
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
44 */
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
45 estack_T *
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
46 estack_push(etype_T type, char_u *name, long lnum)
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
47 {
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
48 estack_T *entry;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
49
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
50 // If memory allocation fails then we'll pop more than we push, eventually
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
51 // at the top level it will be OK again.
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
52 if (ga_grow(&exestack, 1) == OK)
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
53 {
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
54 entry = ((estack_T *)exestack.ga_data) + exestack.ga_len;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
55 entry->es_type = type;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
56 entry->es_name = name;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
57 entry->es_lnum = lnum;
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
58 #ifdef FEAT_EVAL
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
59 entry->es_info.ufunc = NULL;
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
60 #endif
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
61 ++exestack.ga_len;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
62 return entry;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
63 }
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
64 return NULL;
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
65 }
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
66
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
67 #if defined(FEAT_EVAL) || defined(PROTO)
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
68 /*
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
69 * Add a user function to the execution stack.
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
70 */
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
71 estack_T *
20538
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
72 estack_push_ufunc(ufunc_T *ufunc, long lnum)
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
73 {
20538
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
74 estack_T *entry = estack_push(ETYPE_UFUNC,
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
75 ufunc->uf_name_exp != NULL
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
76 ? ufunc->uf_name_exp : ufunc->uf_name, lnum);
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
77 if (entry != NULL)
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
78 entry->es_info.ufunc = ufunc;
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
79 return entry;
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
80 }
20538
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
81
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
82 /*
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
83 * Return TRUE if "ufunc" with "lnum" is already at the top of the exe stack.
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
84 */
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
85 int
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
86 estack_top_is_ufunc(ufunc_T *ufunc, long lnum)
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
87 {
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
88 estack_T *entry;
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
89
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
90 if (exestack.ga_len == 0)
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
91 return FALSE;
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
92 entry = ((estack_T *)exestack.ga_data) + exestack.ga_len - 1;
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
93 return entry->es_type == ETYPE_UFUNC
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
94 && STRCMP( entry->es_name, ufunc->uf_name_exp != NULL
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
95 ? ufunc->uf_name_exp : ufunc->uf_name) == 0
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
96 && entry->es_lnum == lnum;
9f921ba86d05 patch 8.2.0823: Vim9: script reload test is disabled
Bram Moolenaar <Bram@vim.org>
parents: 20536
diff changeset
97 }
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
98 #endif
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
99
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
100 /*
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
101 * Take an item off of the execution stack and return it.
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
102 */
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
103 estack_T *
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
104 estack_pop(void)
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
105 {
21206
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
106 if (exestack.ga_len == 0)
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
107 return NULL;
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
108 --exestack.ga_len;
caab594592cc patch 8.2.1154: Vim9: crash when using imported function
Bram Moolenaar <Bram@vim.org>
parents: 20992
diff changeset
109 return ((estack_T *)exestack.ga_data) + exestack.ga_len;
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
110 }
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
111
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
112 /*
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
113 * Get the current value for <sfile> in allocated memory.
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
114 * "is_sfile" is TRUE for <sfile> itself.
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
115 */
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
116 char_u *
21495
4c1a929fde80 patch 8.2.1298: compiler warning for unused argument in small version
Bram Moolenaar <Bram@vim.org>
parents: 21493
diff changeset
117 estack_sfile(int is_sfile UNUSED)
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
118 {
18997
6b2d93436388 patch 8.2.0059: compiler warnings for unused variables in small build
Bram Moolenaar <Bram@vim.org>
parents: 18993
diff changeset
119 estack_T *entry;
6b2d93436388 patch 8.2.0059: compiler warnings for unused variables in small build
Bram Moolenaar <Bram@vim.org>
parents: 18993
diff changeset
120 #ifdef FEAT_EVAL
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
121 garray_T ga;
19061
5a62b4a0c961 patch 8.2.0091: compiler warnings for size_t / int types
Bram Moolenaar <Bram@vim.org>
parents: 18997
diff changeset
122 size_t len;
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
123 int idx;
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
124 etype_T last_type = ETYPE_SCRIPT;
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
125 char *type_name;
18997
6b2d93436388 patch 8.2.0059: compiler warnings for unused variables in small build
Bram Moolenaar <Bram@vim.org>
parents: 18993
diff changeset
126 #endif
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
127
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
128 entry = ((estack_T *)exestack.ga_data) + exestack.ga_len - 1;
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
129 #ifdef FEAT_EVAL
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
130 if (is_sfile && entry->es_type != ETYPE_UFUNC)
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
131 #endif
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
132 {
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
133 if (entry->es_name == NULL)
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
134 return NULL;
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
135 return vim_strsave(entry->es_name);
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
136 }
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
137 #ifdef FEAT_EVAL
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
138 // Give information about each stack entry up to the root.
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
139 // For a function we compose the call stack, as it was done in the past:
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
140 // "function One[123]..Two[456]..Three"
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
141 ga_init2(&ga, sizeof(char), 100);
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
142 for (idx = 0; idx < exestack.ga_len; ++idx)
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
143 {
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
144 entry = ((estack_T *)exestack.ga_data) + idx;
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
145 if (entry->es_name != NULL)
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
146 {
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
147 len = STRLEN(entry->es_name) + 15;
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
148 type_name = "";
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
149 if (entry->es_type != last_type)
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
150 {
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
151 switch (entry->es_type)
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
152 {
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
153 case ETYPE_SCRIPT: type_name = "script "; break;
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
154 case ETYPE_UFUNC: type_name = "function "; break;
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
155 default: type_name = ""; break;
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
156 }
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
157 last_type = entry->es_type;
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
158 }
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
159 len += STRLEN(type_name);
21497
766839794e09 patch 8.2.1299: compiler warning for using size_t for int and void pointer
Bram Moolenaar <Bram@vim.org>
parents: 21495
diff changeset
160 if (ga_grow(&ga, (int)len) == FAIL)
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
161 break;
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
162 if (idx == exestack.ga_len - 1 || entry->es_lnum == 0)
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
163 // For the bottom entry: do not add the line number, it is used
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
164 // in <slnum>. Also leave it out when the number is not set.
21497
766839794e09 patch 8.2.1299: compiler warning for using size_t for int and void pointer
Bram Moolenaar <Bram@vim.org>
parents: 21495
diff changeset
165 vim_snprintf((char *)ga.ga_data + ga.ga_len, len, "%s%s%s",
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
166 type_name, entry->es_name,
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
167 idx == exestack.ga_len - 1 ? "" : "..");
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
168 else
21497
766839794e09 patch 8.2.1299: compiler warning for using size_t for int and void pointer
Bram Moolenaar <Bram@vim.org>
parents: 21495
diff changeset
169 vim_snprintf((char *)ga.ga_data + ga.ga_len, len, "%s%s[%ld]..",
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
170 type_name, entry->es_name, entry->es_lnum);
21497
766839794e09 patch 8.2.1299: compiler warning for using size_t for int and void pointer
Bram Moolenaar <Bram@vim.org>
parents: 21495
diff changeset
171 ga.ga_len += (int)STRLEN((char *)ga.ga_data + ga.ga_len);
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
172 }
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
173 }
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
174
21493
7449921216bc patch 8.2.1297: when a test fails it's often not easy to see where
Bram Moolenaar <Bram@vim.org>
parents: 21389
diff changeset
175 return (char_u *)ga.ga_data;
18993
dcbc559510f6 patch 8.2.0057: cannot build with small features
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
176 #endif
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
177 }
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
178
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
179 /*
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 * ":runtime [what] {name}"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
182 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183 ex_runtime(exarg_T *eap)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 char_u *arg = eap->arg;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186 char_u *p = skiptowhite(arg);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187 int len = (int)(p - arg);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 int flags = eap->forceit ? DIP_ALL : 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190 if (STRNCMP(arg, "START", len) == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 flags += DIP_START + DIP_NORTP;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193 arg = skipwhite(arg + len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
194 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
195 else if (STRNCMP(arg, "OPT", len) == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 flags += DIP_OPT + DIP_NORTP;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 arg = skipwhite(arg + len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
199 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 else if (STRNCMP(arg, "PACK", len) == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 flags += DIP_START + DIP_OPT + DIP_NORTP;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 arg = skipwhite(arg + len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
204 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 else if (STRNCMP(arg, "ALL", len) == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 flags += DIP_START + DIP_OPT;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208 arg = skipwhite(arg + len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 source_runtime(arg, flags);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
214 static void
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
215 source_callback(char_u *fname, void *cookie)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 {
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
217 (void)do_source(fname, FALSE, DOSO_NONE, cookie);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
219
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
220 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
221 * Find the file "name" in all directories in "path" and invoke
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
222 * "callback(fname, cookie)".
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
223 * "name" can contain wildcards.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
224 * When "flags" has DIP_ALL: source all files, otherwise only the first one.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225 * When "flags" has DIP_DIR: find directories instead of files.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226 * When "flags" has DIP_ERR: give an error message if there is no match.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
227 *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
228 * return FAIL when no file could be sourced, OK otherwise.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
229 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230 int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231 do_in_path(
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
232 char_u *path,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
233 char_u *name,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
234 int flags,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
235 void (*callback)(char_u *fname, void *ck),
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236 void *cookie)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
237 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
238 char_u *rtp;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
239 char_u *np;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
240 char_u *buf;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
241 char_u *rtp_copy;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
242 char_u *tail;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243 int num_files;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
244 char_u **files;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
245 int i;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
246 int did_one = FALSE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
247 #ifdef AMIGA
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
248 struct Process *proc = (struct Process *)FindTask(0L);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
249 APTR save_winptr = proc->pr_WindowPtr;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
250
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
251 // Avoid a requester here for a volume that doesn't exist.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
252 proc->pr_WindowPtr = (APTR)-1L;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
253 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
254
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
255 // Make a copy of 'runtimepath'. Invoking the callback may change the
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
256 // value.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257 rtp_copy = vim_strsave(path);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
258 buf = alloc(MAXPATHL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
259 if (buf != NULL && rtp_copy != NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
260 {
20265
d821c03b890c patch 8.2.0688: output clobbered if setting 'verbose' to see shell commands
Bram Moolenaar <Bram@vim.org>
parents: 20189
diff changeset
261 if (p_verbose > 10 && name != NULL)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
262 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
263 verbose_enter();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
264 smsg(_("Searching for \"%s\" in \"%s\""),
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
265 (char *)name, (char *)path);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
266 verbose_leave();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
267 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
268
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
269 // Loop over all entries in 'runtimepath'.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
270 rtp = rtp_copy;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
271 while (*rtp != NUL && ((flags & DIP_ALL) || !did_one))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
272 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
273 size_t buflen;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
274
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
275 // Copy the path from 'runtimepath' to buf[].
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
276 copy_option_part(&rtp, buf, MAXPATHL, ",");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
277 buflen = STRLEN(buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
278
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
279 // Skip after or non-after directories.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
280 if (flags & (DIP_NOAFTER | DIP_AFTER))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
281 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
282 int is_after = buflen >= 5
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
283 && STRCMP(buf + buflen - 5, "after") == 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
284
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
285 if ((is_after && (flags & DIP_NOAFTER))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
286 || (!is_after && (flags & DIP_AFTER)))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
287 continue;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
288 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
289
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
290 if (name == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
291 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
292 (*callback)(buf, (void *) &cookie);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
293 if (!did_one)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
294 did_one = (cookie == NULL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
295 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
296 else if (buflen + STRLEN(name) + 2 < MAXPATHL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
297 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
298 add_pathsep(buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
299 tail = buf + STRLEN(buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
301 // Loop over all patterns in "name"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
302 np = name;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
303 while (*np != NUL && ((flags & DIP_ALL) || !did_one))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
304 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
305 // Append the pattern from "name" to buf[].
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
306 copy_option_part(&np, tail, (int)(MAXPATHL - (tail - buf)),
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
307 "\t ");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
308
20265
d821c03b890c patch 8.2.0688: output clobbered if setting 'verbose' to see shell commands
Bram Moolenaar <Bram@vim.org>
parents: 20189
diff changeset
309 if (p_verbose > 10)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
310 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
311 verbose_enter();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
312 smsg(_("Searching for \"%s\""), buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
313 verbose_leave();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
314 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
315
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
316 // Expand wildcards, invoke the callback for each match.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
317 if (gen_expand_wildcards(1, &buf, &num_files, &files,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
318 (flags & DIP_DIR) ? EW_DIR : EW_FILE) == OK)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
319 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
320 for (i = 0; i < num_files; ++i)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
321 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
322 (*callback)(files[i], cookie);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
323 did_one = TRUE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
324 if (!(flags & DIP_ALL))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
325 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
326 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
327 FreeWild(num_files, files);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
328 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
329 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
330 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
331 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
332 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
333 vim_free(buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
334 vim_free(rtp_copy);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
335 if (!did_one && name != NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
336 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
337 char *basepath = path == p_rtp ? "runtimepath" : "packpath";
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
338
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
339 if (flags & DIP_ERR)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
340 semsg(_(e_dirnotf), basepath, name);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
341 else if (p_verbose > 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
342 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
343 verbose_enter();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
344 smsg(_("not found in '%s': \"%s\""), basepath, name);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
345 verbose_leave();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
346 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
347 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
348
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
349 #ifdef AMIGA
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
350 proc->pr_WindowPtr = save_winptr;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
351 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
352
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
353 return did_one ? OK : FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
354 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
355
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
356 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
357 * Find "name" in "path". When found, invoke the callback function for
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
358 * it: callback(fname, "cookie")
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
359 * When "flags" has DIP_ALL repeat for all matches, otherwise only the first
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
360 * one is used.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
361 * Returns OK when at least one match found, FAIL otherwise.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
362 *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
363 * If "name" is NULL calls callback for each entry in "path". Cookie is
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
364 * passed by reference in this case, setting it to NULL indicates that callback
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
365 * has done its job.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
366 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 static int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
368 do_in_path_and_pp(
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
369 char_u *path,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
370 char_u *name,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
371 int flags,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372 void (*callback)(char_u *fname, void *ck),
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
373 void *cookie)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
374 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 int done = FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
376 char_u *s;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
377 int len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
378 char *start_dir = "pack/*/start/*/%s";
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
379 char *opt_dir = "pack/*/opt/*/%s";
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
380
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
381 if ((flags & DIP_NORTP) == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
382 done = do_in_path(path, name, flags, callback, cookie);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
383
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
384 if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_START))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
385 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
386 len = (int)(STRLEN(start_dir) + STRLEN(name));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
387 s = alloc(len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
388 if (s == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
389 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
390 vim_snprintf((char *)s, len, start_dir, name);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
391 done = do_in_path(p_pp, s, flags, callback, cookie);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
392 vim_free(s);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
395 if ((done == FAIL || (flags & DIP_ALL)) && (flags & DIP_OPT))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
396 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397 len = (int)(STRLEN(opt_dir) + STRLEN(name));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 s = alloc(len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
399 if (s == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
401 vim_snprintf((char *)s, len, opt_dir, name);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402 done = do_in_path(p_pp, s, flags, callback, cookie);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
403 vim_free(s);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
404 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406 return done;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
407 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
408
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
409 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
410 * Just like do_in_path_and_pp(), using 'runtimepath' for "path".
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
411 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
412 int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
413 do_in_runtimepath(
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
414 char_u *name,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
415 int flags,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
416 void (*callback)(char_u *fname, void *ck),
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
417 void *cookie)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
419 return do_in_path_and_pp(p_rtp, name, flags, callback, cookie);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
420 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
421
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 * Source the file "name" from all directories in 'runtimepath'.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
424 * "name" can contain wildcards.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 * When "flags" has DIP_ALL: source all files, otherwise only the first one.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
427 * return FAIL when no file could be sourced, OK otherwise.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
428 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429 int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
430 source_runtime(char_u *name, int flags)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 {
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
432 return source_in_path(p_rtp, name, flags, NULL);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
433 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
434
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
435 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 * Just like source_runtime(), but use "path" instead of 'runtimepath'.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438 int
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
439 source_in_path(char_u *path, char_u *name, int flags, int *ret_sid)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
440 {
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
441 return do_in_path_and_pp(path, name, flags, source_callback, ret_sid);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
442 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
443
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
445 #if defined(FEAT_EVAL) || defined(PROTO)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
447 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448 * Expand wildcards in "pat" and invoke do_source() for each match.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 static void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451 source_all_matches(char_u *pat)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
452 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453 int num_files;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
454 char_u **files;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
455 int i;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
456
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
457 if (gen_expand_wildcards(1, &pat, &num_files, &files, EW_FILE) == OK)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
459 for (i = 0; i < num_files; ++i)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
460 (void)do_source(files[i], FALSE, DOSO_NONE, NULL);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 FreeWild(num_files, files);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
463 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
464
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
465 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
466 * Add the package directory to 'runtimepath'.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
467 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
468 static int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 add_pack_dir_to_rtp(char_u *fname)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
470 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 char_u *p4, *p3, *p2, *p1, *p;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
472 char_u *entry;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
473 char_u *insp = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
474 int c;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475 char_u *new_rtp;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
476 int keep;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
477 size_t oldlen;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
478 size_t addlen;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
479 size_t new_rtp_len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
480 char_u *afterdir = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
481 size_t afterlen = 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 char_u *after_insp = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 char_u *ffname = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
484 size_t fname_len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
485 char_u *buf = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 char_u *rtp_ffname;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487 int match;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
488 int retval = FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
489
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
490 p4 = p3 = p2 = p1 = get_past_head(fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491 for (p = p1; *p; MB_PTR_ADV(p))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
492 if (vim_ispathsep_nocolon(*p))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
493 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 p4 = p3; p3 = p2; p2 = p1; p1 = p;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
496
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497 // now we have:
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
498 // rtp/pack/name/start/name
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
499 // p4 p3 p2 p1
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
500 //
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
501 // find the part up to "pack" in 'runtimepath'
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
502 c = *++p4; // append pathsep in order to expand symlink
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
503 *p4 = NUL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
504 ffname = fix_fname(fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
505 *p4 = c;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
506 if (ffname == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
507 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
508
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
509 // Find "ffname" in "p_rtp", ignoring '/' vs '\' differences.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510 // Also stop at the first "after" directory.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
511 fname_len = STRLEN(ffname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
512 buf = alloc(MAXPATHL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
513 if (buf == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
514 goto theend;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515 for (entry = p_rtp; *entry != NUL; )
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
517 char_u *cur_entry = entry;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
518
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 copy_option_part(&entry, buf, MAXPATHL, ",");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 if (insp == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522 add_pathsep(buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
523 rtp_ffname = fix_fname(buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
524 if (rtp_ffname == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525 goto theend;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
526 match = vim_fnamencmp(rtp_ffname, ffname, fname_len) == 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
527 vim_free(rtp_ffname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 if (match)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529 // Insert "ffname" after this entry (and comma).
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530 insp = entry;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
533 if ((p = (char_u *)strstr((char *)buf, "after")) != NULL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
534 && p > buf
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
535 && vim_ispathsep(p[-1])
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
536 && (vim_ispathsep(p[5]) || p[5] == NUL || p[5] == ','))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
537 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
538 if (insp == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
539 // Did not find "ffname" before the first "after" directory,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
540 // insert it before this entry.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541 insp = cur_entry;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542 after_insp = cur_entry;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
543 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
545 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
546
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
547 if (insp == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
548 // Both "fname" and "after" not found, append at the end.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
549 insp = p_rtp + STRLEN(p_rtp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 // check if rtp/pack/name/start/name/after exists
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
552 afterdir = concat_fnames(fname, (char_u *)"after", TRUE);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553 if (afterdir != NULL && mch_isdir(afterdir))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
554 afterlen = STRLEN(afterdir) + 1; // add one for comma
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
555
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
556 oldlen = STRLEN(p_rtp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
557 addlen = STRLEN(fname) + 1; // add one for comma
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
558 new_rtp = alloc(oldlen + addlen + afterlen + 1); // add one for NUL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
559 if (new_rtp == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
560 goto theend;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
561
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
562 // We now have 'rtp' parts: {keep}{keep_after}{rest}.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 // Create new_rtp, first: {keep},{fname}
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 keep = (int)(insp - p_rtp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
565 mch_memmove(new_rtp, p_rtp, keep);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 new_rtp_len = keep;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
567 if (*insp == NUL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
568 new_rtp[new_rtp_len++] = ','; // add comma before
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569 mch_memmove(new_rtp + new_rtp_len, fname, addlen - 1);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570 new_rtp_len += addlen - 1;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571 if (*insp != NUL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
572 new_rtp[new_rtp_len++] = ','; // add comma after
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
574 if (afterlen > 0 && after_insp != NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
575 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 int keep_after = (int)(after_insp - p_rtp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
577
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 // Add to new_rtp: {keep},{fname}{keep_after},{afterdir}
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
579 mch_memmove(new_rtp + new_rtp_len, p_rtp + keep,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580 keep_after - keep);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
581 new_rtp_len += keep_after - keep;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
582 mch_memmove(new_rtp + new_rtp_len, afterdir, afterlen - 1);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 new_rtp_len += afterlen - 1;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584 new_rtp[new_rtp_len++] = ',';
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585 keep = keep_after;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
586 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
587
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 if (p_rtp[keep] != NUL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589 // Append rest: {keep},{fname}{keep_after},{afterdir}{rest}
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590 mch_memmove(new_rtp + new_rtp_len, p_rtp + keep, oldlen - keep + 1);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
592 new_rtp[new_rtp_len] = NUL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
593
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
594 if (afterlen > 0 && after_insp == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
595 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
596 // Append afterdir when "after" was not found:
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
597 // {keep},{fname}{rest},{afterdir}
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
598 STRCAT(new_rtp, ",");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 STRCAT(new_rtp, afterdir);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
601
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
602 set_option_value((char_u *)"rtp", 0L, new_rtp, 0);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603 vim_free(new_rtp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
604 retval = OK;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
605
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 theend:
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607 vim_free(buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608 vim_free(ffname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
609 vim_free(afterdir);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
610 return retval;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
611 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
613 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614 * Load scripts in "plugin" and "ftdetect" directories of the package.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 static int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
617 load_pack_plugin(char_u *fname)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
619 static char *plugpat = "%s/plugin/**/*.vim";
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
620 static char *ftpat = "%s/ftdetect/*.vim";
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
621 int len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
622 char_u *ffname = fix_fname(fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
623 char_u *pat = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
624 int retval = FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
625
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 if (ffname == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
627 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
628 len = (int)STRLEN(ffname) + (int)STRLEN(ftpat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
629 pat = alloc(len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630 if (pat == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 goto theend;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 vim_snprintf((char *)pat, len, plugpat, ffname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
633 source_all_matches(pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
634
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
636 char_u *cmd = vim_strsave((char_u *)"g:did_load_filetypes");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
638 // If runtime/filetype.vim wasn't loaded yet, the scripts will be
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
639 // found when it loads.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 if (cmd != NULL && eval_to_number(cmd) > 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
641 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642 do_cmdline_cmd((char_u *)"augroup filetypedetect");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 vim_snprintf((char *)pat, len, ftpat, ffname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644 source_all_matches(pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 do_cmdline_cmd((char_u *)"augroup END");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
646 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 vim_free(cmd);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
648 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 vim_free(pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
650 retval = OK;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
652 theend:
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
653 vim_free(ffname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
654 return retval;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
656
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657 // used for "cookie" of add_pack_plugin()
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 static int APP_ADD_DIR;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659 static int APP_LOAD;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
660 static int APP_BOTH;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662 static void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663 add_pack_plugin(char_u *fname, void *cookie)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 if (cookie != &APP_LOAD)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
666 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
667 char_u *buf = alloc(MAXPATHL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
668 char_u *p;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
669 int found = FALSE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 if (buf == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 return;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
673 p = p_rtp;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
674 while (*p != NUL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
675 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676 copy_option_part(&p, buf, MAXPATHL, ",");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 if (pathcmp((char *)buf, (char *)fname, -1) == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
678 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 found = TRUE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 vim_free(buf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
684 if (!found)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
685 // directory is not yet in 'runtimepath', add it
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 if (add_pack_dir_to_rtp(fname) == FAIL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687 return;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
689
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
690 if (cookie != &APP_ADD_DIR)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691 load_pack_plugin(fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695 * Add all packages in the "start" directory to 'runtimepath'.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
697 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698 add_pack_start_dirs(void)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700 do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701 add_pack_plugin, &APP_ADD_DIR);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
703
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
705 * Load plugins from all packages in the "start" directory.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
707 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
708 load_start_packages(void)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
709 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
710 did_source_packages = TRUE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
711 do_in_path(p_pp, (char_u *)"pack/*/start/*", DIP_ALL + DIP_DIR,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712 add_pack_plugin, &APP_LOAD);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
713 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716 * ":packloadall"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
717 * Find plugins in the package directories and source them.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720 ex_packloadall(exarg_T *eap)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 if (!did_source_packages || eap->forceit)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 // First do a round to add all directories to 'runtimepath', then load
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725 // the plugins. This allows for plugins to use an autoload directory
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
726 // of another plugin.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 add_pack_start_dirs();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
728 load_start_packages();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733 * ":packadd[!] {name}"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
734 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 ex_packadd(exarg_T *eap)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
738 static char *plugpat = "pack/*/%s/%s";
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739 int len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 char *pat;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 int round;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
742 int res = OK;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
743
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
744 // Round 1: use "start", round 2: use "opt".
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
745 for (round = 1; round <= 2; ++round)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
747 // Only look under "start" when loading packages wasn't done yet.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
748 if (round == 1 && did_source_packages)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 continue;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
751 len = (int)STRLEN(plugpat) + (int)STRLEN(eap->arg) + 5;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
752 pat = alloc(len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753 if (pat == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754 return;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
755 vim_snprintf(pat, len, plugpat, round == 1 ? "start" : "opt", eap->arg);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
756 // The first round don't give a "not found" error, in the second round
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
757 // only when nothing was found in the first round.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
758 res = do_in_path(p_pp, (char_u *)pat,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
759 DIP_ALL + DIP_DIR + (round == 2 && res == FAIL ? DIP_ERR : 0),
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
760 add_pack_plugin, eap->forceit ? &APP_ADD_DIR : &APP_BOTH);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 vim_free(pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
764 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
765
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
766 /*
17978
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
767 * Sort "gap" and remove duplicate entries. "gap" is expected to contain a
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
768 * list of file names in allocated memory.
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
769 */
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
770 void
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
771 remove_duplicates(garray_T *gap)
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
772 {
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
773 int i;
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
774 int j;
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
775 char_u **fnames = (char_u **)gap->ga_data;
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
776
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
777 sort_strings(fnames, gap->ga_len);
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
778 for (i = gap->ga_len - 1; i > 0; --i)
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
779 if (fnamecmp(fnames[i - 1], fnames[i]) == 0)
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
780 {
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
781 vim_free(fnames[i]);
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
782 for (j = i + 1; j < gap->ga_len; ++j)
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
783 fnames[j - 1] = fnames[j];
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
784 --gap->ga_len;
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
785 }
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
786 }
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
787
8f4cc259ed7a patch 8.1.1985: code for dealing with paths is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17922
diff changeset
788 /*
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789 * Expand color scheme, compiler or filetype names.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 * Search from 'runtimepath':
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
791 * 'runtimepath'/{dirnames}/{pat}.vim
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 * When "flags" has DIP_START: search also from 'start' of 'packpath':
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
793 * 'packpath'/pack/ * /start/ * /{dirnames}/{pat}.vim
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
794 * When "flags" has DIP_OPT: search also from 'opt' of 'packpath':
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 * 'packpath'/pack/ * /opt/ * /{dirnames}/{pat}.vim
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796 * "dirnames" is an array with one or more directory names.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799 ExpandRTDir(
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 char_u *pat,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 int flags,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802 int *num_file,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 char_u ***file,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 char *dirnames[])
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
806 char_u *s;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 char_u *e;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 char_u *match;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
809 garray_T ga;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
810 int i;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 int pat_len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
813 *num_file = 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
814 *file = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 pat_len = (int)STRLEN(pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816 ga_init2(&ga, (int)sizeof(char *), 10);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 for (i = 0; dirnames[i] != NULL; ++i)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
819 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820 s = alloc(STRLEN(dirnames[i]) + pat_len + 7);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 if (s == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
822 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823 ga_clear_strings(&ga);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
825 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
826 sprintf((char *)s, "%s/%s*.vim", dirnames[i], pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 globpath(p_rtp, s, &ga, 0);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
828 vim_free(s);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
830
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
831 if (flags & DIP_START) {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 for (i = 0; dirnames[i] != NULL; ++i)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
833 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
834 s = alloc(STRLEN(dirnames[i]) + pat_len + 22);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
835 if (s == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 ga_clear_strings(&ga);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 sprintf((char *)s, "pack/*/start/*/%s/%s*.vim", dirnames[i], pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 globpath(p_pp, s, &ga, 0);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
842 vim_free(s);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
844 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
845
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 if (flags & DIP_OPT) {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847 for (i = 0; dirnames[i] != NULL; ++i)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 s = alloc(STRLEN(dirnames[i]) + pat_len + 20);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
850 if (s == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
852 ga_clear_strings(&ga);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855 sprintf((char *)s, "pack/*/opt/*/%s/%s*.vim", dirnames[i], pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 globpath(p_pp, s, &ga, 0);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 vim_free(s);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
858 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
859 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
860
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
861 for (i = 0; i < ga.ga_len; ++i)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
862 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
863 match = ((char_u **)ga.ga_data)[i];
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
864 s = match;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
865 e = s + STRLEN(s);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
866 if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
867 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
868 e -= 4;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
869 for (s = e; s > match; MB_PTR_BACK(match, s))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
870 if (s < match || vim_ispathsep(*s))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
872 ++s;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
873 *e = NUL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
874 mch_memmove(match, s, e - s + 1);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 if (ga.ga_len == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
880
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 // Sort and remove duplicates which can happen when specifying multiple
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 // directories in dirnames.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883 remove_duplicates(&ga);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 *file = ga.ga_data;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886 *num_file = ga.ga_len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887 return OK;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
888 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
889
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
890 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 * Expand loadplugin names:
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
892 * 'packpath'/pack/ * /opt/{pat}
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
893 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
894 int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
895 ExpandPackAddDir(
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
896 char_u *pat,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
897 int *num_file,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 char_u ***file)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900 char_u *s;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
901 char_u *e;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 char_u *match;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 garray_T ga;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 int i;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905 int pat_len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
906
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907 *num_file = 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
908 *file = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909 pat_len = (int)STRLEN(pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
910 ga_init2(&ga, (int)sizeof(char *), 10);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
912 s = alloc(pat_len + 26);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913 if (s == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
914 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 ga_clear_strings(&ga);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
917 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 sprintf((char *)s, "pack/*/opt/%s*", pat);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
919 globpath(p_pp, s, &ga, 0);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
920 vim_free(s);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
921
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
922 for (i = 0; i < ga.ga_len; ++i)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
923 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
924 match = ((char_u **)ga.ga_data)[i];
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
925 s = gettail(match);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
926 e = s + STRLEN(s);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
927 mch_memmove(match, s, e - s + 1);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
928 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930 if (ga.ga_len == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 return FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933 // Sort and remove duplicates which can happen when specifying multiple
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934 // directories in dirnames.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
935 remove_duplicates(&ga);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937 *file = ga.ga_data;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
938 *num_file = ga.ga_len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 return OK;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
940 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
942 static void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
943 cmd_source(char_u *fname, exarg_T *eap)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945 if (*fname == NUL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
946 emsg(_(e_argreq));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
947
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 else if (eap != NULL && eap->forceit)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
949 // ":source!": read Normal mode commands
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
950 // Need to execute the commands directly. This is required at least
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
951 // for:
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952 // - ":g" command busy
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 // - after ":argdo", ":windo" or ":bufdo"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 // - another command follows
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
955 // - inside a loop
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 openscript(fname, global_busy || listcmd_busy || eap->nextcmd != NULL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
957 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958 || eap->cstack->cs_idx >= 0
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
959 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960 );
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 // ":source" read ex commands
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
963 else if (do_source(fname, FALSE, DOSO_NONE, NULL) == FAIL)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 semsg(_(e_notopen), fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968 * ":source {fname}"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
969 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
970 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971 ex_source(exarg_T *eap)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 #ifdef FEAT_BROWSE
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974 if (cmdmod.browse)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
975 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
976 char_u *fname = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
977
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978 fname = do_browse(0, (char_u *)_("Source Vim script"), eap->arg,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 NULL, NULL,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 (char_u *)_(BROWSE_FILTER_MACROS), NULL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 if (fname != NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983 cmd_source(fname, eap);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 vim_free(fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989 cmd_source(eap->arg, eap);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
992 #if defined(FEAT_EVAL) || defined(PROTO)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 * ":options"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997 ex_options(
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 exarg_T *eap UNUSED)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 {
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 19822
diff changeset
1000 char_u buf[500];
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 19822
diff changeset
1001 int multi_mods = 0;
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 19822
diff changeset
1002
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 19822
diff changeset
1003 buf[0] = NUL;
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 19822
diff changeset
1004 (void)add_win_cmd_modifers(buf, &multi_mods);
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 19822
diff changeset
1005
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 19822
diff changeset
1006 vim_setenv((char_u *)"OPTWIN_CMD", buf);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1007 cmd_source((char_u *)SYS_OPTWIN_FILE, NULL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012 * ":source" and associated commands.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 * Structure used to store info for each sourced file.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 * It is shared between do_source() and getsourceline().
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 * This is required, because it needs to be handed to do_cmdline() and
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 * sourcing can be done recursively.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1020 struct source_cookie
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 FILE *fp; // opened file for sourcing
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 char_u *nextline; // if not NULL: line that was read ahead
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 linenr_T sourcing_lnum; // line number of the source file
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025 int finished; // ":finish" used
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 #ifdef USE_CRNL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 int fileformat; // EOL_UNKNOWN, EOL_UNIX or EOL_DOS
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028 int error; // TRUE if LF found after CR-LF
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1029 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 linenr_T breakpoint; // next line with breakpoint or zero
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 char_u *fname; // name of sourced file
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 int dbg_tick; // debug_tick when breakpoint was set
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1034 int level; // top nesting level of sourced file
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1036 vimconv_T conv; // type of conversion
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 };
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1040 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 * Return the address holding the next breakpoint line for a source cookie.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 linenr_T *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1044 source_breakpoint(void *cookie)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046 return &((struct source_cookie *)cookie)->breakpoint;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 * Return the address holding the debug tick for a source cookie.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 int *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 source_dbg_tick(void *cookie)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 return &((struct source_cookie *)cookie)->dbg_tick;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1059 * Return the nesting level for a source cookie.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1060 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1061 int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1062 source_level(void *cookie)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 return ((struct source_cookie *)cookie)->level;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1065 }
20992
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
1066
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
1067 /*
21865
c16af87df654 patch 8.2.1482: Vim9: crash when using a nested lambda
Bram Moolenaar <Bram@vim.org>
parents: 21821
diff changeset
1068 * Return the readahead line. Note that the pointer may become invalid when
c16af87df654 patch 8.2.1482: Vim9: crash when using a nested lambda
Bram Moolenaar <Bram@vim.org>
parents: 21821
diff changeset
1069 * getting the next line, if it's concatenated with the next one.
20992
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
1070 */
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
1071 char_u *
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
1072 source_nextline(void *cookie)
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
1073 {
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
1074 return ((struct source_cookie *)cookie)->nextline;
7ee565134d4a patch 8.2.1047: Vim9: script cannot use line continuation like :def function
Bram Moolenaar <Bram@vim.org>
parents: 20945
diff changeset
1075 }
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1076 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1077
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1078 #if (defined(MSWIN) && defined(FEAT_CSCOPE)) || defined(HAVE_FD_CLOEXEC)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1079 # define USE_FOPEN_NOINH
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1080 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1081 * Special function to open a file without handle inheritance.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1082 * When possible the handle is closed on exec().
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1083 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1084 static FILE *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1085 fopen_noinh_readbin(char *filename)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087 # ifdef MSWIN
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088 int fd_tmp = mch_open(filename, O_RDONLY | O_BINARY | O_NOINHERIT, 0);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1089 # else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1090 int fd_tmp = mch_open(filename, O_RDONLY, 0);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1091 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1092
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093 if (fd_tmp == -1)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 return NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1095
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1096 # ifdef HAVE_FD_CLOEXEC
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1097 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1098 int fdflags = fcntl(fd_tmp, F_GETFD);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099 if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100 (void)fcntl(fd_tmp, F_SETFD, fdflags | FD_CLOEXEC);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1101 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1102 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1103
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104 return fdopen(fd_tmp, READBIN);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1105 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1106 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1107
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1109 * do_source: Read the file "fname" and execute its lines as EX commands.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1110 * When "ret_sid" is not NULL and we loaded the script before, don't load it
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1111 * again.
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1112 *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1113 * This function may be called recursively!
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1114 *
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1115 * Return FAIL if file could not be opened, OK otherwise.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1116 * If a scriptitem_T was found or created "*ret_sid" is set to the SID.
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1117 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1118 int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1119 do_source(
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1120 char_u *fname,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1121 int check_other, // check for .vimrc and _vimrc
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1122 int is_vimrc, // DOSO_ value
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1123 int *ret_sid UNUSED)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1124 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125 struct source_cookie cookie;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126 char_u *p;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1127 char_u *fname_exp;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1128 char_u *firstline = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1129 int retval = FAIL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1130 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1131 sctx_T save_current_sctx;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 static scid_T last_current_SID = 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133 static int last_current_SID_seq = 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134 funccal_entry_T funccalp_entry;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1135 int save_debug_break_level = debug_break_level;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1136 int sid;
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 scriptitem_T *si = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1139 #ifdef STARTUPTIME
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140 struct timeval tv_rel;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141 struct timeval tv_start;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1142 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1143 #ifdef FEAT_PROFILE
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1144 proftime_T wait_start;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146 int trigger_source_post = FALSE;
19075
af1eca322b9e patch 8.2.0098: exe stack length can be wrong without being detected
Bram Moolenaar <Bram@vim.org>
parents: 19061
diff changeset
1147 ESTACK_CHECK_DECLARATION
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 p = expand_env_save(fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150 if (p == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151 return retval;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 fname_exp = fix_fname(p);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1153 vim_free(p);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1154 if (fname_exp == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1155 return retval;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156 if (mch_isdir(fname_exp))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1157 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1158 smsg(_("Cannot source a directory: \"%s\""), fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1159 goto theend;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1160 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1161
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1162 #ifdef FEAT_EVAL
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1163 // See if we loaded this script before.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1164 for (sid = script_items.ga_len; sid > 0; --sid)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1165 {
19185
17d878a2ddaa patch 8.2.0151: detecting a script was already sourced is unreliable
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1166 // We used to check inode here, but that doesn't work:
17d878a2ddaa patch 8.2.0151: detecting a script was already sourced is unreliable
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1167 // - If a script is edited and written, it may get a different
17d878a2ddaa patch 8.2.0151: detecting a script was already sourced is unreliable
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1168 // inode number, even though to the user it is the same script.
17d878a2ddaa patch 8.2.0151: detecting a script was already sourced is unreliable
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1169 // - If a script is deleted and another script is written, with a
17d878a2ddaa patch 8.2.0151: detecting a script was already sourced is unreliable
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1170 // different name, the inode may be re-used.
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1171 si = SCRIPT_ITEM(sid);
19185
17d878a2ddaa patch 8.2.0151: detecting a script was already sourced is unreliable
Bram Moolenaar <Bram@vim.org>
parents: 19181
diff changeset
1172 if (si->sn_name != NULL && fnamecmp(si->sn_name, fname_exp) == 0)
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1173 // Found it!
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1174 break;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1175 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1176 if (sid > 0 && ret_sid != NULL)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1177 {
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1178 // Already loaded and no need to load again, return here.
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1179 *ret_sid = sid;
19685
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19507
diff changeset
1180 retval = OK;
d64f403289db patch 8.2.0399: various memory leaks
Bram Moolenaar <Bram@vim.org>
parents: 19507
diff changeset
1181 goto theend;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1182 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1183 #endif
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1184
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 // Apply SourceCmd autocommands, they should get the file and source it.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186 if (has_autocmd(EVENT_SOURCECMD, fname_exp, NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187 && apply_autocmds(EVENT_SOURCECMD, fname_exp, fname_exp,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 FALSE, curbuf))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191 retval = aborting() ? FAIL : OK;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192 #else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 retval = OK;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 if (retval == OK)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 // Apply SourcePost autocommands.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1197 apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 FALSE, curbuf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 goto theend;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 // Apply SourcePre autocommands, they may get the file.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203 apply_autocmds(EVENT_SOURCEPRE, fname_exp, fname_exp, FALSE, curbuf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 #ifdef USE_FOPEN_NOINH
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 cookie.fp = fopen_noinh_readbin((char *)fname_exp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1207 #else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 cookie.fp = mch_fopen((char *)fname_exp, READBIN);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 if (cookie.fp == NULL && check_other)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1211 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212 // Try again, replacing file name ".vimrc" by "_vimrc" or vice versa,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1213 // and ".exrc" by "_exrc" or vice versa.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1214 p = gettail(fname_exp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1215 if ((*p == '.' || *p == '_')
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216 && (STRICMP(p + 1, "vimrc") == 0
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1217 || STRICMP(p + 1, "gvimrc") == 0
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218 || STRICMP(p + 1, "exrc") == 0))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1220 if (*p == '_')
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221 *p = '.';
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1222 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1223 *p = '_';
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1224 #ifdef USE_FOPEN_NOINH
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1225 cookie.fp = fopen_noinh_readbin((char *)fname_exp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1226 #else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1227 cookie.fp = mch_fopen((char *)fname_exp, READBIN);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1228 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1229 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1230 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 if (cookie.fp == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1233 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 if (p_verbose > 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1235 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 verbose_enter();
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1237 if (SOURCING_NAME == NULL)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238 smsg(_("could not source \"%s\""), fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1239 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1240 smsg(_("line %ld: could not source \"%s\""),
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1241 SOURCING_LNUM, fname);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1242 verbose_leave();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1243 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244 goto theend;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1245 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247 // The file exists.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1248 // - In verbose mode, give a message.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1249 // - For a vimrc file, may want to set 'compatible', call vimrc_found().
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1250 if (p_verbose > 1)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1251 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1252 verbose_enter();
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1253 if (SOURCING_NAME == NULL)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1254 smsg(_("sourcing \"%s\""), fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255 else
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1256 smsg(_("line %ld: sourcing \"%s\""), SOURCING_LNUM, fname);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1257 verbose_leave();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1258 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1259 if (is_vimrc == DOSO_VIMRC)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1260 vimrc_found(fname_exp, (char_u *)"MYVIMRC");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1261 else if (is_vimrc == DOSO_GVIMRC)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1262 vimrc_found(fname_exp, (char_u *)"MYGVIMRC");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1263
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1264 #ifdef USE_CRNL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265 // If no automatic file format: Set default to CR-NL.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1266 if (*p_ffs == NUL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1267 cookie.fileformat = EOL_DOS;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1268 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269 cookie.fileformat = EOL_UNKNOWN;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1270 cookie.error = FALSE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1271 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1272
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1273 cookie.nextline = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1274 cookie.sourcing_lnum = 0;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1275 cookie.finished = FALSE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1276
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1277 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1278 // Check if this script has a breakpoint.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1279 cookie.breakpoint = dbg_find_breakpoint(TRUE, fname_exp, (linenr_T)0);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1280 cookie.fname = fname_exp;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 cookie.dbg_tick = debug_tick;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1283 cookie.level = ex_nesting_level;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1285
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1286 // Keep the sourcing name/lnum, for recursive calls.
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1287 estack_push(ETYPE_SCRIPT, fname_exp, 0);
19075
af1eca322b9e patch 8.2.0098: exe stack length can be wrong without being detected
Bram Moolenaar <Bram@vim.org>
parents: 19061
diff changeset
1288 ESTACK_CHECK_SETUP
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1289
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1290 #ifdef STARTUPTIME
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1291 if (time_fd != NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1292 time_push(&tv_rel, &tv_start);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1293 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1294
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1295 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1296 # ifdef FEAT_PROFILE
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1297 if (do_profiling == PROF_YES)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1298 prof_child_enter(&wait_start); // entering a child now
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1299 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1300
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1301 // Don't use local function variables, if called from a function.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1302 // Also starts profiling timer for nested script.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1303 save_funccal(&funccalp_entry);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1304
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1305 save_current_sctx = current_sctx;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1306 current_sctx.sc_lnum = 0;
19108
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19075
diff changeset
1307 current_sctx.sc_version = 1; // default script version
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1308
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 // Check if this script was sourced before to finds its SID.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1310 // Always use a new sequence number.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1311 current_sctx.sc_seq = ++last_current_SID_seq;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1312 if (sid > 0)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1313 {
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1314 hashtab_T *ht;
20189
63cc54100ae4 patch 8.2.0650: Vim9: script function can be deleted
Bram Moolenaar <Bram@vim.org>
parents: 20043
diff changeset
1315 int is_vim9 = si->sn_version == SCRIPT_VERSION_VIM9;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1316
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1317 // loading the same script again
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1318 si->sn_had_command = FALSE;
19822
fc3cdc819d80 patch 8.2.0467: Vim9: some errors are not tested
Bram Moolenaar <Bram@vim.org>
parents: 19726
diff changeset
1319 si->sn_version = 1;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1320 current_sctx.sc_sid = sid;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1321
20536
8fa783f2c69c patch 8.2.0822: Vim9: code left over from discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20357
diff changeset
1322 // In Vim9 script all script-local variables are removed when reloading
8fa783f2c69c patch 8.2.0822: Vim9: code left over from discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20357
diff changeset
1323 // the same script. In legacy script they remain but "const" can be
8fa783f2c69c patch 8.2.0822: Vim9: code left over from discovery phase
Bram Moolenaar <Bram@vim.org>
parents: 20357
diff changeset
1324 // set again.
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1325 ht = &SCRIPT_VARS(sid);
20347
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1326 if (is_vim9)
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1327 hashtab_free_contents(ht);
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1328 else
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1329 {
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1330 int todo = (int)ht->ht_used;
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1331 hashitem_T *hi;
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1332 dictitem_T *di;
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1333
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1334 for (hi = ht->ht_array; todo > 0; ++hi)
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1335 if (!HASHITEM_EMPTY(hi))
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1336 {
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1337 --todo;
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1338 di = HI2DI(hi);
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1339 di->di_flags |= DI_FLAGS_RELOAD;
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1340 }
0e1dfff4f294 patch 8.2.0729: Vim9: When reloading a script variables are not cleared
Bram Moolenaar <Bram@vim.org>
parents: 20339
diff changeset
1341 }
19507
65049a682574 patch 8.2.0311: Vim9: insufficient script tests
Bram Moolenaar <Bram@vim.org>
parents: 19191
diff changeset
1342
65049a682574 patch 8.2.0311: Vim9: insufficient script tests
Bram Moolenaar <Bram@vim.org>
parents: 19191
diff changeset
1343 // old imports are no longer valid
65049a682574 patch 8.2.0311: Vim9: insufficient script tests
Bram Moolenaar <Bram@vim.org>
parents: 19191
diff changeset
1344 free_imports(sid);
20189
63cc54100ae4 patch 8.2.0650: Vim9: script function can be deleted
Bram Moolenaar <Bram@vim.org>
parents: 20043
diff changeset
1345
63cc54100ae4 patch 8.2.0650: Vim9: script function can be deleted
Bram Moolenaar <Bram@vim.org>
parents: 20043
diff changeset
1346 // in Vim9 script functions are marked deleted
63cc54100ae4 patch 8.2.0650: Vim9: script function can be deleted
Bram Moolenaar <Bram@vim.org>
parents: 20043
diff changeset
1347 if (is_vim9)
63cc54100ae4 patch 8.2.0650: Vim9: script function can be deleted
Bram Moolenaar <Bram@vim.org>
parents: 20043
diff changeset
1348 delete_script_functions(sid);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1349 }
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1350 else
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1351 {
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1352 // It's new, generate a new SID.
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1353 current_sctx.sc_sid = ++last_current_SID;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1354 if (ga_grow(&script_items,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1355 (int)(current_sctx.sc_sid - script_items.ga_len)) == FAIL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1356 goto almosttheend;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1357 while (script_items.ga_len < current_sctx.sc_sid)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1358 {
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1359 si = ALLOC_CLEAR_ONE(scriptitem_T);
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1360 if (si == NULL)
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1361 goto almosttheend;
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1362 ++script_items.ga_len;
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1363 SCRIPT_ITEM(script_items.ga_len) = si;
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1364 si->sn_name = NULL;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1365 si->sn_version = 1;
19108
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19075
diff changeset
1366
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19075
diff changeset
1367 // Allocate the local script variables to use for this script.
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19075
diff changeset
1368 new_script_vars(script_items.ga_len);
20921
187c3fb42c8f patch 8.2.1012: Vim9: cannot declare single character script variables
Bram Moolenaar <Bram@vim.org>
parents: 20538
diff changeset
1369 ga_init2(&si->sn_var_vals, sizeof(svar_T), 10);
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1370 ga_init2(&si->sn_imports, sizeof(imported_T), 10);
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1371 ga_init2(&si->sn_type_list, sizeof(type_T), 10);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1372 # ifdef FEAT_PROFILE
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1373 si->sn_prof_on = FALSE;
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1374 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1375 }
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1376 si = SCRIPT_ITEM(current_sctx.sc_sid);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1377 si->sn_name = fname_exp;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1378 fname_exp = vim_strsave(si->sn_name); // used for autocmd
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1379 if (ret_sid != NULL)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1380 *ret_sid = current_sctx.sc_sid;
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1381 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1382
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1383 # ifdef FEAT_PROFILE
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1384 if (do_profiling == PROF_YES)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1385 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1386 int forceit;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1387
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1388 // Check if we do profiling for this script.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1389 if (!si->sn_prof_on && has_profiling(TRUE, si->sn_name, &forceit))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1390 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1391 script_do_profile(si);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1392 si->sn_pr_force = forceit;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1393 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1394 if (si->sn_prof_on)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1395 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1396 ++si->sn_pr_count;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1397 profile_start(&si->sn_pr_start);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1398 profile_zero(&si->sn_pr_children);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1399 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1400 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1401 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1402 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1403
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1404 cookie.conv.vc_type = CONV_NONE; // no conversion
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1405
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1406 // Read the first line so we can check for a UTF-8 BOM.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1407 firstline = getsourceline(0, (void *)&cookie, 0, TRUE);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1408 if (firstline != NULL && STRLEN(firstline) >= 3 && firstline[0] == 0xef
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1409 && firstline[1] == 0xbb && firstline[2] == 0xbf)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1410 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1411 // Found BOM; setup conversion, skip over BOM and recode the line.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1412 convert_setup(&cookie.conv, (char_u *)"utf-8", p_enc);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1413 p = string_convert(&cookie.conv, firstline + 3, NULL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1414 if (p == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1415 p = vim_strsave(firstline + 3);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1416 if (p != NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1417 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1418 vim_free(firstline);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1419 firstline = p;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1420 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1421 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1422
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1423 // Call do_cmdline, which will call getsourceline() to get the lines.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1424 do_cmdline(firstline, getsourceline, (void *)&cookie,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1425 DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_REPEAT);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1426 retval = OK;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1427
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1428 #ifdef FEAT_PROFILE
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1429 if (do_profiling == PROF_YES)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1430 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1431 // Get "si" again, "script_items" may have been reallocated.
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1432 si = SCRIPT_ITEM(current_sctx.sc_sid);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1433 if (si->sn_prof_on)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1434 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1435 profile_end(&si->sn_pr_start);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1436 profile_sub_wait(&wait_start, &si->sn_pr_start);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1437 profile_add(&si->sn_pr_total, &si->sn_pr_start);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1438 profile_self(&si->sn_pr_self, &si->sn_pr_start,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1439 &si->sn_pr_children);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1440 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1441 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1442 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1443
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1444 if (got_int)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1445 emsg(_(e_interr));
19075
af1eca322b9e patch 8.2.0098: exe stack length can be wrong without being detected
Bram Moolenaar <Bram@vim.org>
parents: 19061
diff changeset
1446 ESTACK_CHECK_NOW
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1447 estack_pop();
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1448 if (p_verbose > 1)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1449 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1450 verbose_enter();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1451 smsg(_("finished sourcing %s"), fname);
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1452 if (SOURCING_NAME != NULL)
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1453 smsg(_("continuing in %s"), SOURCING_NAME);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1454 verbose_leave();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1455 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1456 #ifdef STARTUPTIME
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1457 if (time_fd != NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1458 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1459 vim_snprintf((char *)IObuff, IOSIZE, "sourcing %s", fname);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1460 time_msg((char *)IObuff, &tv_start);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1461 time_pop(&tv_rel);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1462 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1463 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1464
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1465 if (!got_int)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1466 trigger_source_post = TRUE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1467
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1468 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1469 // After a "finish" in debug mode, need to break at first command of next
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1470 // sourced file.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1471 if (save_debug_break_level > ex_nesting_level
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1472 && debug_break_level == ex_nesting_level)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1473 ++debug_break_level;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1474 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1475
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1476 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1477 almosttheend:
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1478 // Get "si" again, "script_items" may have been reallocated.
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1479 si = SCRIPT_ITEM(current_sctx.sc_sid);
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1480 if (si->sn_save_cpo != NULL)
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1481 {
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1482 free_string_option(p_cpo);
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1483 p_cpo = si->sn_save_cpo;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1484 si->sn_save_cpo = NULL;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1485 }
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1486
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1487 current_sctx = save_current_sctx;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1488 restore_funccal();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1489 # ifdef FEAT_PROFILE
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1490 if (do_profiling == PROF_YES)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1491 prof_child_exit(&wait_start); // leaving a child now
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1492 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1493 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1494 fclose(cookie.fp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1495 vim_free(cookie.nextline);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1496 vim_free(firstline);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1497 convert_setup(&cookie.conv, NULL, NULL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1498
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1499 if (trigger_source_post)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1500 apply_autocmds(EVENT_SOURCEPOST, fname_exp, fname_exp, FALSE, curbuf);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1501
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1502 theend:
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1503 vim_free(fname_exp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1504 return retval;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1505 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1506
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1507 #if defined(FEAT_EVAL) || defined(PROTO)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1508
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1509 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1510 * ":scriptnames"
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1511 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1512 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1513 ex_scriptnames(exarg_T *eap)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1514 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1515 int i;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1516
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1517 if (eap->addr_count > 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1518 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1519 // :script {scriptId}: edit the script
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1520 if (eap->line2 < 1 || eap->line2 > script_items.ga_len)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1521 emsg(_(e_invarg));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1522 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1523 {
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1524 eap->arg = SCRIPT_ITEM(eap->line2)->sn_name;
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1525 do_exedit(eap, NULL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1526 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1527 return;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1528 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1529
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1530 for (i = 1; i <= script_items.ga_len && !got_int; ++i)
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1531 if (SCRIPT_ITEM(i)->sn_name != NULL)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1532 {
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1533 home_replace(NULL, SCRIPT_ITEM(i)->sn_name,
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1534 NameBuff, MAXPATHL, TRUE);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1535 smsg("%3d: %s", i, NameBuff);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1536 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1537 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1538
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1539 # if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1540 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1541 * Fix slashes in the list of script names for 'shellslash'.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1542 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1543 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1544 scriptnames_slash_adjust(void)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1545 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1546 int i;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1547
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1548 for (i = 1; i <= script_items.ga_len; ++i)
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1549 if (SCRIPT_ITEM(i)->sn_name != NULL)
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1550 slash_adjust(SCRIPT_ITEM(i)->sn_name);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1551 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1552 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1553
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1554 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1555 * Get a pointer to a script name. Used for ":verbose set".
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1556 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1557 char_u *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1558 get_scriptname(scid_T id)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1559 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1560 if (id == SID_MODELINE)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1561 return (char_u *)_("modeline");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1562 if (id == SID_CMDARG)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1563 return (char_u *)_("--cmd argument");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1564 if (id == SID_CARG)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1565 return (char_u *)_("-c argument");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1566 if (id == SID_ENV)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1567 return (char_u *)_("environment variable");
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1568 if (id == SID_ERROR)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1569 return (char_u *)_("error handler");
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1570 return SCRIPT_ITEM(id)->sn_name;
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1571 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1572
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1573 # if defined(EXITFREE) || defined(PROTO)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1574 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1575 free_scriptnames(void)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1576 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1577 int i;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1578
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1579 for (i = script_items.ga_len; i > 0; --i)
18225
6c3a8312486d patch 8.1.2107: various memory leaks reported by asan
Bram Moolenaar <Bram@vim.org>
parents: 18080
diff changeset
1580 {
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1581 scriptitem_T *si = SCRIPT_ITEM(i);
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1582
19108
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19075
diff changeset
1583 // the variables themselves are cleared in evalvars_clear()
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1584 vim_free(si->sn_vars);
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1585
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1586 vim_free(si->sn_name);
19726
ad37a198a708 patch 8.2.0419: various memory leaks in Vim9 script code
Bram Moolenaar <Bram@vim.org>
parents: 19685
diff changeset
1587 free_imports(i);
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1588 free_string_option(si->sn_save_cpo);
18410
b5b2e3b824c2 patch 8.1.2199: build failure when using normal features without GUI
Bram Moolenaar <Bram@vim.org>
parents: 18225
diff changeset
1589 # ifdef FEAT_PROFILE
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1590 ga_clear(&si->sn_prl_ga);
18410
b5b2e3b824c2 patch 8.1.2199: build failure when using normal features without GUI
Bram Moolenaar <Bram@vim.org>
parents: 18225
diff changeset
1591 # endif
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1592 vim_free(si);
18225
6c3a8312486d patch 8.1.2107: various memory leaks reported by asan
Bram Moolenaar <Bram@vim.org>
parents: 18080
diff changeset
1593 }
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1594 ga_clear(&script_items);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1595 }
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1596
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1597 void
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1598 free_autoload_scriptnames(void)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1599 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1600 ga_clear_strings(&ga_loaded);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1601 }
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1602 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1603
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1604 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1605
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1606 linenr_T
21883
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1607 get_sourced_lnum(
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1608 char_u *(*fgetline)(int, void *, int, getline_opt_T),
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1609 void *cookie)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1610 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1611 return fgetline == getsourceline
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1612 ? ((struct source_cookie *)cookie)->sourcing_lnum
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1613 : SOURCING_LNUM;
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1614 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1615
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1616 static char_u *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1617 get_one_sourceline(struct source_cookie *sp)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1618 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1619 garray_T ga;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1620 int len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1621 int c;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1622 char_u *buf;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1623 #ifdef USE_CRNL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1624 int has_cr; // CR-LF found
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1625 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1626 int have_read = FALSE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1627
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1628 // use a growarray to store the sourced line
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1629 ga_init2(&ga, 1, 250);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1630
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1631 // Loop until there is a finished line (or end-of-file).
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1632 ++sp->sourcing_lnum;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1633 for (;;)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1634 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1635 // make room to read at least 120 (more) characters
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1636 if (ga_grow(&ga, 120) == FAIL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1637 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1638 buf = (char_u *)ga.ga_data;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1639
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1640 if (fgets((char *)buf + ga.ga_len, ga.ga_maxlen - ga.ga_len,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1641 sp->fp) == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1642 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1643 len = ga.ga_len + (int)STRLEN(buf + ga.ga_len);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1644 #ifdef USE_CRNL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1645 // Ignore a trailing CTRL-Z, when in Dos mode. Only recognize the
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1646 // CTRL-Z by its own, or after a NL.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1647 if ( (len == 1 || (len >= 2 && buf[len - 2] == '\n'))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1648 && sp->fileformat == EOL_DOS
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1649 && buf[len - 1] == Ctrl_Z)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1650 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1651 buf[len - 1] = NUL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1652 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1653 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1654 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1655
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1656 have_read = TRUE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1657 ga.ga_len = len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1658
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1659 // If the line was longer than the buffer, read more.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1660 if (ga.ga_maxlen - ga.ga_len == 1 && buf[len - 1] != '\n')
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1661 continue;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1662
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1663 if (len >= 1 && buf[len - 1] == '\n') // remove trailing NL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1664 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1665 #ifdef USE_CRNL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1666 has_cr = (len >= 2 && buf[len - 2] == '\r');
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1667 if (sp->fileformat == EOL_UNKNOWN)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1668 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1669 if (has_cr)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1670 sp->fileformat = EOL_DOS;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1671 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1672 sp->fileformat = EOL_UNIX;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1673 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1674
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1675 if (sp->fileformat == EOL_DOS)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1676 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1677 if (has_cr) // replace trailing CR
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1678 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1679 buf[len - 2] = '\n';
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1680 --len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1681 --ga.ga_len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1682 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1683 else // lines like ":map xx yy^M" will have failed
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1684 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1685 if (!sp->error)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1686 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1687 msg_source(HL_ATTR(HLF_W));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1688 emsg(_("W15: Warning: Wrong line separator, ^M may be missing"));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1689 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1690 sp->error = TRUE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1691 sp->fileformat = EOL_UNIX;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1692 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1693 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1694 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1695 // The '\n' is escaped if there is an odd number of ^V's just
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1696 // before it, first set "c" just before the 'V's and then check
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1697 // len&c parities (is faster than ((len-c)%2 == 0)) -- Acevedo
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1698 for (c = len - 2; c >= 0 && buf[c] == Ctrl_V; c--)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1699 ;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1700 if ((len & 1) != (c & 1)) // escaped NL, read more
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1701 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1702 ++sp->sourcing_lnum;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1703 continue;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1704 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1705
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1706 buf[len - 1] = NUL; // remove the NL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1707 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1708
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1709 // Check for ^C here now and then, so recursive :so can be broken.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1710 line_breakcheck();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1711 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1712 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1713
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1714 if (have_read)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1715 return (char_u *)ga.ga_data;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1716
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1717 vim_free(ga.ga_data);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1718 return NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1719 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1720
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1721 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1722 * Get one full line from a sourced file.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1723 * Called by do_cmdline() when it's called from do_source().
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1724 *
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1725 * Return a pointer to the line in allocated memory.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1726 * Return NULL for end-of-file or some error.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1727 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1728 char_u *
21883
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1729 getsourceline(
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1730 int c UNUSED,
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1731 void *cookie,
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1732 int indent UNUSED,
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1733 getline_opt_T options)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1734 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1735 struct source_cookie *sp = (struct source_cookie *)cookie;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1736 char_u *line;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1737 char_u *p;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1738
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1739 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1740 // If breakpoints have been added/deleted need to check for it.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1741 if (sp->dbg_tick < debug_tick)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1742 {
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1743 sp->breakpoint = dbg_find_breakpoint(TRUE, sp->fname, SOURCING_LNUM);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1744 sp->dbg_tick = debug_tick;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1745 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1746 # ifdef FEAT_PROFILE
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1747 if (do_profiling == PROF_YES)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1748 script_line_end();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1749 # endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1750 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1751
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1752 // Set the current sourcing line number.
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1753 SOURCING_LNUM = sp->sourcing_lnum + 1;
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1754
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1755 // Get current line. If there is a read-ahead line, use it, otherwise get
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1756 // one now.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1757 if (sp->finished)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1758 line = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1759 else if (sp->nextline == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1760 line = get_one_sourceline(sp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1761 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1762 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1763 line = sp->nextline;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1764 sp->nextline = NULL;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1765 ++sp->sourcing_lnum;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1766 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1767 #ifdef FEAT_PROFILE
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1768 if (line != NULL && do_profiling == PROF_YES)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1769 script_line_start();
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1770 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1771
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1772 // Only concatenate lines starting with a \ when 'cpoptions' doesn't
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1773 // contain the 'C' flag.
21883
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1774 if (line != NULL && options != GETLINE_NONE
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1775 && vim_strchr(p_cpo, CPO_CONCAT) == NULL)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1776 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1777 // compensate for the one line read-ahead
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1778 --sp->sourcing_lnum;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1779
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1780 // Get the next line and concatenate it when it starts with a
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1781 // backslash. We always need to read the next line, keep it in
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1782 // sp->nextline.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1783 /* Also check for a comment in between continuation lines: "\ */
21385
54a304e4dc57 patch 8.2.1243: Vim9: cannot have a comment line halfway a list
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
1784 // Also check for a Vim9 comment and empty line.
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1785 sp->nextline = get_one_sourceline(sp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1786 if (sp->nextline != NULL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1787 && (*(p = skipwhite(sp->nextline)) == '\\'
21385
54a304e4dc57 patch 8.2.1243: Vim9: cannot have a comment line halfway a list
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
1788 || (p[0] == '"' && p[1] == '\\' && p[2] == ' ')
21389
6f5129b51c49 patch 8.2.1245: build failure in tiny version
Bram Moolenaar <Bram@vim.org>
parents: 21385
diff changeset
1789 #ifdef FEAT_EVAL
21385
54a304e4dc57 patch 8.2.1243: Vim9: cannot have a comment line halfway a list
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
1790 || (in_vim9script()
21883
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1791 && options == GETLINE_CONCAT_ALL
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1792 && (*p == NUL || vim9_comment_start(p)))
21389
6f5129b51c49 patch 8.2.1245: build failure in tiny version
Bram Moolenaar <Bram@vim.org>
parents: 21385
diff changeset
1793 #endif
6f5129b51c49 patch 8.2.1245: build failure in tiny version
Bram Moolenaar <Bram@vim.org>
parents: 21385
diff changeset
1794 ))
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1795 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1796 garray_T ga;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1797
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1798 ga_init2(&ga, (int)sizeof(char_u), 400);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1799 ga_concat(&ga, line);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1800 if (*p == '\\')
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1801 ga_concat(&ga, p + 1);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1802 for (;;)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1803 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1804 vim_free(sp->nextline);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1805 sp->nextline = get_one_sourceline(sp);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1806 if (sp->nextline == NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1807 break;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1808 p = skipwhite(sp->nextline);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1809 if (*p == '\\')
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1810 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1811 // Adjust the growsize to the current length to speed up
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1812 // concatenating many lines.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1813 if (ga.ga_len > 400)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1814 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1815 if (ga.ga_len > 8000)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1816 ga.ga_growsize = 8000;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1817 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1818 ga.ga_growsize = ga.ga_len;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1819 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1820 ga_concat(&ga, p + 1);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1821 }
21385
54a304e4dc57 patch 8.2.1243: Vim9: cannot have a comment line halfway a list
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
1822 else if (!(p[0] == '"' && p[1] == '\\' && p[2] == ' ')
21389
6f5129b51c49 patch 8.2.1245: build failure in tiny version
Bram Moolenaar <Bram@vim.org>
parents: 21385
diff changeset
1823 #ifdef FEAT_EVAL
21385
54a304e4dc57 patch 8.2.1243: Vim9: cannot have a comment line halfway a list
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
1824 && !(in_vim9script()
21883
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1825 && options == GETLINE_CONCAT_ALL
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1826 && (*p == NUL || vim9_comment_start(p)))
21389
6f5129b51c49 patch 8.2.1245: build failure in tiny version
Bram Moolenaar <Bram@vim.org>
parents: 21385
diff changeset
1827 #endif
6f5129b51c49 patch 8.2.1245: build failure in tiny version
Bram Moolenaar <Bram@vim.org>
parents: 21385
diff changeset
1828 )
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1829 break;
21385
54a304e4dc57 patch 8.2.1243: Vim9: cannot have a comment line halfway a list
Bram Moolenaar <Bram@vim.org>
parents: 21279
diff changeset
1830 /* drop a # comment or "\ comment line */
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1831 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1832 ga_append(&ga, NUL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1833 vim_free(line);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1834 line = ga.ga_data;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1835 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1836 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1837
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1838 if (line != NULL && sp->conv.vc_type != CONV_NONE)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1839 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1840 char_u *s;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1841
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1842 // Convert the encoding of the script line.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1843 s = string_convert(&sp->conv, line, NULL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1844 if (s != NULL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1845 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1846 vim_free(line);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1847 line = s;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1848 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1849 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1850
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1851 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1852 // Did we encounter a breakpoint?
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1853 if (sp->breakpoint != 0 && sp->breakpoint <= SOURCING_LNUM)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1854 {
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1855 dbg_breakpoint(sp->fname, SOURCING_LNUM);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1856 // Find next breakpoint.
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18410
diff changeset
1857 sp->breakpoint = dbg_find_breakpoint(TRUE, sp->fname, SOURCING_LNUM);
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1858 sp->dbg_tick = debug_tick;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1859 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1860 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1862 return line;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1863 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1864
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1865 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1866 * ":scriptencoding": Set encoding conversion for a sourced script.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1867 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1868 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1869 ex_scriptencoding(exarg_T *eap)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1870 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1871 struct source_cookie *sp;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1872 char_u *name;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1873
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1874 if (!getline_equal(eap->getline, eap->cookie, getsourceline))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1875 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1876 emsg(_("E167: :scriptencoding used outside of a sourced file"));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1877 return;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1878 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1879
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1880 if (*eap->arg != NUL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1881 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1882 name = enc_canonize(eap->arg);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1883 if (name == NULL) // out of memory
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1884 return;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1885 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1886 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1887 name = eap->arg;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1888
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1889 // Setup for conversion from the specified encoding to 'encoding'.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1890 sp = (struct source_cookie *)getline_cookie(eap->getline, eap->cookie);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1891 convert_setup(&sp->conv, name, p_enc);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1892
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1893 if (name != eap->arg)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1894 vim_free(name);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1895 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1896
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1897 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1898 * ":scriptversion": Set Vim script version for a sourced script.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1899 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1900 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1901 ex_scriptversion(exarg_T *eap UNUSED)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1902 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1903 #ifdef FEAT_EVAL
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1904 int nr;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1905
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1906 if (!getline_equal(eap->getline, eap->cookie, getsourceline))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1907 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1908 emsg(_("E984: :scriptversion used outside of a sourced file"));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1909 return;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1910 }
21279
8d1d11afd8c8 patch 8.2.1190: Vim9: checking for Vim9 syntax is spread out
Bram Moolenaar <Bram@vim.org>
parents: 21206
diff changeset
1911 if (in_vim9script())
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1912 {
21821
0deb6f96a5a3 patch 8.2.1460: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 21753
diff changeset
1913 emsg(_(e_cannot_use_scriptversion_after_vim9script));
19181
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1914 return;
94eda51ba9ba patch 8.2.0149: maintaining a Vim9 branch separately is more work
Bram Moolenaar <Bram@vim.org>
parents: 19145
diff changeset
1915 }
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1916
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1917 nr = getdigits(&eap->arg);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1918 if (nr == 0 || *eap->arg != NUL)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1919 emsg(_(e_invarg));
20945
0653b9b72091 patch 8.2.1024: Vim9: no error for using "let g:var = val"
Bram Moolenaar <Bram@vim.org>
parents: 20921
diff changeset
1920 else if (nr > SCRIPT_VERSION_MAX)
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1921 semsg(_("E999: scriptversion not supported: %d"), nr);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1922 else
19108
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19075
diff changeset
1923 {
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1924 current_sctx.sc_version = nr;
19191
133ef7ba4e4e patch 8.2.0154: reallocating the list of scripts is inefficient
Bram Moolenaar <Bram@vim.org>
parents: 19185
diff changeset
1925 SCRIPT_ITEM(current_sctx.sc_sid)->sn_version = nr;
19108
44c6498535c9 patch 8.2.0114: info about sourced scripts is scattered
Bram Moolenaar <Bram@vim.org>
parents: 19075
diff changeset
1926 }
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1927 #endif
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1928 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1929
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1930 #if defined(FEAT_EVAL) || defined(PROTO)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1931 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1932 * ":finish": Mark a sourced file as finished.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1933 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1934 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1935 ex_finish(exarg_T *eap)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1936 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1937 if (getline_equal(eap->getline, eap->cookie, getsourceline))
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1938 do_finish(eap, FALSE);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1939 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1940 emsg(_("E168: :finish used outside of a sourced file"));
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1941 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1942
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1943 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1944 * Mark a sourced file as finished. Possibly makes the ":finish" pending.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1945 * Also called for a pending finish at the ":endtry" or after returning from
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1946 * an extra do_cmdline(). "reanimate" is used in the latter case.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1947 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1948 void
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1949 do_finish(exarg_T *eap, int reanimate)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1950 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1951 int idx;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1952
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1953 if (reanimate)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1954 ((struct source_cookie *)getline_cookie(eap->getline,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1955 eap->cookie))->finished = FALSE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1956
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1957 // Cleanup (and inactivate) conditionals, but stop when a try conditional
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1958 // not in its finally clause (which then is to be executed next) is found.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1959 // In this case, make the ":finish" pending for execution at the ":endtry".
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1960 // Otherwise, finish normally.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1961 idx = cleanup_conditionals(eap->cstack, 0, TRUE);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1962 if (idx >= 0)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1963 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1964 eap->cstack->cs_pending[idx] = CSTP_FINISH;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1965 report_make_pending(CSTP_FINISH, NULL);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1966 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1967 else
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1968 ((struct source_cookie *)getline_cookie(eap->getline,
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1969 eap->cookie))->finished = TRUE;
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1970 }
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1971
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1972
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1973 /*
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1974 * Return TRUE when a sourced file had the ":finish" command: Don't give error
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1975 * message for missing ":endif".
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1976 * Return FALSE when not sourcing a file.
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1977 */
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1978 int
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1979 source_finished(
21883
a427f5f26419 patch 8.2.1491: Vim9: crash when compiling heredoc lines start with comment
Bram Moolenaar <Bram@vim.org>
parents: 21865
diff changeset
1980 char_u *(*fgetline)(int, void *, int, getline_opt_T),
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1981 void *cookie)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1982 {
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1983 return (getline_equal(fgetline, cookie, getsourceline)
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1984 && ((struct source_cookie *)getline_cookie(
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1985 fgetline, cookie))->finished);
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1986 }
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1987
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1988 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1989 * Return the autoload script name for a function or variable name.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1990 * Returns NULL when out of memory.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1991 * Caller must make sure that "name" contains AUTOLOAD_CHAR.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1992 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1993 char_u *
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1994 autoload_name(char_u *name)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1995 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1996 char_u *p, *q = NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1997 char_u *scriptname;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1998
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
1999 // Get the script file name: replace '#' with '/', append ".vim".
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2000 scriptname = alloc(STRLEN(name) + 14);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2001 if (scriptname == NULL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2002 return NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2003 STRCPY(scriptname, "autoload/");
21753
9ef7ae8ab51c patch 8.2.1426: Vim9: cannot call autoload function in :def function
Bram Moolenaar <Bram@vim.org>
parents: 21697
diff changeset
2004 STRCAT(scriptname, name[0] == 'g' && name[1] == ':' ? name + 2: name);
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2005 for (p = scriptname + 9; (p = vim_strchr(p, AUTOLOAD_CHAR)) != NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2006 q = p, ++p)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2007 *p = '/';
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2008 STRCPY(q, ".vim");
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2009 return scriptname;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2010 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2011
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2012 /*
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2013 * If "name" has a package name try autoloading the script for it.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2014 * Return TRUE if a package was loaded.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2015 */
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2016 int
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2017 script_autoload(
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2018 char_u *name,
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2019 int reload) // load script again when already loaded
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2020 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2021 char_u *p;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2022 char_u *scriptname, *tofree;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2023 int ret = FALSE;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2024 int i;
21697
6c477989f9a4 patch 8.2.1398: autoload script sourced twice if sourced directly
Bram Moolenaar <Bram@vim.org>
parents: 21497
diff changeset
2025 int ret_sid;
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2026
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2027 // If there is no '#' after name[0] there is no package name.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2028 p = vim_strchr(name, AUTOLOAD_CHAR);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2029 if (p == NULL || p == name)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2030 return FALSE;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2031
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2032 tofree = scriptname = autoload_name(name);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2033 if (scriptname == NULL)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2034 return FALSE;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2035
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2036 // Find the name in the list of previously loaded package names. Skip
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2037 // "autoload/", it's always the same.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2038 for (i = 0; i < ga_loaded.ga_len; ++i)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2039 if (STRCMP(((char_u **)ga_loaded.ga_data)[i] + 9, scriptname + 9) == 0)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2040 break;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2041 if (!reload && i < ga_loaded.ga_len)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2042 ret = FALSE; // was loaded already
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2043 else
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2044 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2045 // Remember the name if it wasn't loaded already.
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2046 if (i == ga_loaded.ga_len && ga_grow(&ga_loaded, 1) == OK)
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2047 {
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2048 ((char_u **)ga_loaded.ga_data)[ga_loaded.ga_len++] = scriptname;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2049 tofree = NULL;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2050 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2051
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2052 // Try loading the package from $VIMRUNTIME/autoload/<name>.vim
21697
6c477989f9a4 patch 8.2.1398: autoload script sourced twice if sourced directly
Bram Moolenaar <Bram@vim.org>
parents: 21497
diff changeset
2053 // Use "ret_sid" to avoid loading the same script again.
6c477989f9a4 patch 8.2.1398: autoload script sourced twice if sourced directly
Bram Moolenaar <Bram@vim.org>
parents: 21497
diff changeset
2054 if (source_in_path(p_rtp, scriptname, 0, &ret_sid) == OK)
17922
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2055 ret = TRUE;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2056 }
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2057
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2058 vim_free(tofree);
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2059 return ret;
4d63d47d87ef patch 8.1.1957: more code can be moved to evalvars.c
Bram Moolenaar <Bram@vim.org>
parents: 17861
diff changeset
2060 }
17861
0a5c615cd949 patch 8.1.1927: code for dealing with script files is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2061 #endif