Mercurial > vim
annotate src/tag.c @ 28031:4aa79224acd2 v8.2.4540
patch 8.2.4540: line number for error is off by one
Commit: https://github.com/vim/vim/commit/1b1df95f1a84cbc362e32f676f1e135aa2e7fc3c
Author: Bram Moolenaar <Bram@vim.org>
Date: Thu Mar 10 20:01:50 2022 +0000
patch 8.2.4540: line number for error is off by one
Problem: Line number for error is off by one.
Solution: Remember the line number of the comparison. (closes https://github.com/vim/vim/issues/9923)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 10 Mar 2022 21:15:04 +0100 |
parents | d59552ad3f36 |
children | 12a256140887 |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9949
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 | |
10 /* | |
11 * Code to handle tags and the tag stack | |
12 */ | |
13 | |
14 #include "vim.h" | |
15 | |
16 /* | |
17 * Structure to hold pointers to various items in a tag line. | |
18 */ | |
19 typedef struct tag_pointers | |
20 { | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
21 // filled in by parse_tag_line(): |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
22 char_u *tagname; // start of tag name (skip "file:") |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
23 char_u *tagname_end; // char after tag name |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
24 char_u *fname; // first char of file name |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
25 char_u *fname_end; // char after file name |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
26 char_u *command; // first char of command |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
27 // filled in by parse_match(): |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
28 char_u *command_end; // first char after command |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
29 char_u *tag_fname; // file name of the tags file. This is used |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
30 // when 'tr' is set. |
7 | 31 #ifdef FEAT_EMACS_TAGS |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
32 int is_etag; // TRUE for emacs tag |
7 | 33 #endif |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
34 char_u *tagkind; // "kind:" value |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
35 char_u *tagkind_end; // end of tagkind |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
36 char_u *user_data; // user_data string |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
37 char_u *user_data_end; // end of user_data |
18640
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
38 linenr_T tagline; // "line:" value |
7 | 39 } tagptrs_T; |
40 | |
41 /* | |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
42 * Return values used when reading lines from a tags file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
43 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
44 typedef enum |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
45 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
46 TAGS_READ_SUCCESS = 1, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
47 TAGS_READ_EOF, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
48 TAGS_READ_IGNORE, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
49 } tags_read_status_T; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
50 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
51 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
52 * States used during a tags search |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
53 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
54 typedef enum |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
55 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
56 TS_START, // at start of file |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
57 TS_LINEAR, // linear searching forward, till EOF |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
58 TS_BINARY, // binary searching |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
59 TS_SKIP_BACK, // skipping backwards |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
60 TS_STEP_FORWARD // stepping forwards |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
61 } tagsearch_state_T; // Current search state |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
62 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
63 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
64 * Binary search file offsets in a tags file |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
65 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
66 typedef struct |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
67 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
68 off_T low_offset; // offset for first char of first line that |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
69 // could match |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
70 off_T high_offset; // offset of char after last line that could |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
71 // match |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
72 off_T curr_offset; // Current file offset in search range |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
73 off_T curr_offset_used; // curr_offset used when skipping back |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
74 off_T match_offset; // Where the binary search found a tag |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
75 int low_char; // first char at low_offset |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
76 int high_char; // first char at high_offset |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
77 } tagsearch_info_T; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
78 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
79 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
80 * Return values used when matching tags against a pattern. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
81 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
82 typedef enum |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
83 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
84 TAG_MATCH_SUCCESS = 1, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
85 TAG_MATCH_FAIL, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
86 TAG_MATCH_STOP, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
87 TAG_MATCH_NEXT |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
88 } tagmatch_status_T; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
89 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
90 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
91 * Arguments used for matching tags read from a tags file against a pattern. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
92 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
93 typedef struct |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
94 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
95 int matchoff; // tag match offset |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
96 int match_re; // TRUE if the tag matches a regexp |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
97 int match_no_ic; // TRUE if the tag matches with case |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
98 int has_re; // regular expression used |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
99 int sortic; // tags file sorted ignoring case (foldcase) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
100 int sort_error; // tags file not sorted |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
101 } findtags_match_args_T; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
102 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
103 /* |
11008
0ecd07cd2e43
patch 8.0.0393: order of duplicate tags is not preserved
Christian Brabandt <cb@256bit.org>
parents:
10666
diff
changeset
|
104 * The matching tags are first stored in one of the hash tables. In |
10601
1b09db809d3f
patch 8.0.0190: finding duplicate tags uses a slow linear search
Christian Brabandt <cb@256bit.org>
parents:
10444
diff
changeset
|
105 * which one depends on the priority of the match. |
11008
0ecd07cd2e43
patch 8.0.0393: order of duplicate tags is not preserved
Christian Brabandt <cb@256bit.org>
parents:
10666
diff
changeset
|
106 * ht_match[] is used to find duplicates, ga_match[] to keep them in sequence. |
0ecd07cd2e43
patch 8.0.0393: order of duplicate tags is not preserved
Christian Brabandt <cb@256bit.org>
parents:
10666
diff
changeset
|
107 * At the end, all the matches from ga_match[] are concatenated, to make a list |
7 | 108 * sorted on priority. |
109 */ | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
110 #define MT_ST_CUR 0 // static match in current file |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
111 #define MT_GL_CUR 1 // global match in current file |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
112 #define MT_GL_OTH 2 // global match in other file |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
113 #define MT_ST_OTH 3 // static match in other file |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
114 #define MT_IC_OFF 4 // add for icase match |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
115 #define MT_RE_OFF 8 // add for regexp match |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
116 #define MT_MASK 7 // mask for printing priority |
7 | 117 #define MT_COUNT 16 |
118 | |
119 static char *mt_names[MT_COUNT/2] = | |
120 {"FSC", "F C", "F ", "FS ", " SC", " C", " ", " S "}; | |
121 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
122 #define NOTAGFILE 99 // return value for jumpto_tag |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
123 static char_u *nofile_fname = NULL; // fname for NOTAGFILE error |
7 | 124 |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
125 static void taglen_advance(int l); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
126 |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
127 static int jumpto_tag(char_u *lbuf, int forceit, int keep_help); |
7 | 128 #ifdef FEAT_EMACS_TAGS |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
129 static int parse_tag_line(char_u *lbuf, int is_etag, tagptrs_T *tagp); |
7 | 130 #else |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
131 static int parse_tag_line(char_u *lbuf, tagptrs_T *tagp); |
7 | 132 #endif |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
133 static int test_for_static(tagptrs_T *); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
134 static int parse_match(char_u *lbuf, tagptrs_T *tagp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
135 static char_u *tag_full_fname(tagptrs_T *tagp); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
136 static char_u *expand_tag_fname(char_u *fname, char_u *tag_fname, int expand); |
7 | 137 #ifdef FEAT_EMACS_TAGS |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
138 static int test_for_current(int, char_u *, char_u *, char_u *, char_u *); |
7 | 139 #else |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
140 static int test_for_current(char_u *, char_u *, char_u *, char_u *); |
7 | 141 #endif |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
7266
diff
changeset
|
142 static int find_extra(char_u **pp); |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
143 static void print_tag_list(int new_tag, int use_tagstack, int num_matches, char_u **matches); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
144 #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
145 static int add_llist_tags(char_u *tag, int num_matches, char_u **matches); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
146 #endif |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
147 static void tagstack_clear_entry(taggy_T *item); |
7 | 148 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
149 static char_u *tagmatchname = NULL; // name of last used tag |
7 | 150 |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
151 #if defined(FEAT_QUICKFIX) |
7 | 152 /* |
153 * Tag for preview window is remembered separately, to avoid messing up the | |
154 * normal tagstack. | |
155 */ | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
156 static taggy_T ptag_entry = {NULL, {{0, 0, 0}, 0}, 0, 0, NULL}; |
7 | 157 #endif |
158 | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
159 #ifdef FEAT_EVAL |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
160 static int tfu_in_use = FALSE; // disallow recursive call of tagfunc |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
161 static callback_T tfu_cb; // 'tagfunc' callback function |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
162 #endif |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
163 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
164 // Used instead of NUL to separate tag fields in the growarrays. |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
165 #define TAG_SEP 0x02 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
166 |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
167 #if defined(FEAT_EVAL) || defined(PROTO) |
7 | 168 /* |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
169 * Reads the 'tagfunc' option value and convert that to a callback value. |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
170 * Invoked when the 'tagfunc' option is set. The option value can be a name of |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
171 * a function (string), or function(<name>) or funcref(<name>) or a lambda. |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
172 */ |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
173 int |
26388
8aba638e91eb
patch 8.2.3725: cannot use a lambda for 'completefunc' and 'omnifunc'
Bram Moolenaar <Bram@vim.org>
parents:
26268
diff
changeset
|
174 set_tagfunc_option(void) |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
175 { |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
176 #ifdef FEAT_EVAL |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
177 free_callback(&tfu_cb); |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
178 free_callback(&curbuf->b_tfu_cb); |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
179 |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
180 if (*curbuf->b_p_tfu == NUL) |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
181 return OK; |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
182 |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
183 if (option_set_callback_func(curbuf->b_p_tfu, &tfu_cb) == FAIL) |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
184 return FAIL; |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
185 |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
186 copy_callback(&curbuf->b_tfu_cb, &tfu_cb); |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
187 #endif |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
188 |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
189 return OK; |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
190 } |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
191 #endif |
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
192 |
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
193 # if defined(EXITFREE) || defined(PROTO) |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
194 void |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
195 free_tagfunc_option(void) |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
196 { |
26518
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
197 # ifdef FEAT_EVAL |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
198 free_callback(&tfu_cb); |
26518
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
199 # endif |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
200 } |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
201 # endif |
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
202 |
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
203 #if defined(FEAT_EVAL) || defined(PROTO) |
26518
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
204 /* |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
205 * Mark the global 'tagfunc' callback with 'copyID' so that it is not garbage |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
206 * collected. |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
207 */ |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
208 int |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
209 set_ref_in_tagfunc(int copyID UNUSED) |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
210 { |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
211 int abort = FALSE; |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
212 |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
213 abort = set_ref_in_callback(&tfu_cb, copyID); |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
214 |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
215 return abort; |
13ba00ef7687
patch 8.2.3788: lambda for option that is a function may be freed
Bram Moolenaar <Bram@vim.org>
parents:
26492
diff
changeset
|
216 } |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
217 |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
218 /* |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
219 * Copy the global 'tagfunc' callback function to the buffer-local 'tagfunc' |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
220 * callback for 'buf'. |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
221 */ |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
222 void |
26388
8aba638e91eb
patch 8.2.3725: cannot use a lambda for 'completefunc' and 'omnifunc'
Bram Moolenaar <Bram@vim.org>
parents:
26268
diff
changeset
|
223 set_buflocal_tfu_callback(buf_T *buf UNUSED) |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
224 { |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
225 free_callback(&buf->b_tfu_cb); |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
226 if (tfu_cb.cb_name != NULL && *tfu_cb.cb_name != NUL) |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
227 copy_callback(&buf->b_tfu_cb, &tfu_cb); |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26966
diff
changeset
|
228 } |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
229 #endif |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
230 |
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
231 /* |
7 | 232 * Jump to tag; handling of tag commands and tag stack |
233 * | |
234 * *tag != NUL: ":tag {tag}", jump to new tag, add to tag stack | |
235 * | |
236 * type == DT_TAG: ":tag [tag]", jump to newer position or same tag again | |
237 * type == DT_HELP: like DT_TAG, but don't use regexp. | |
238 * type == DT_POP: ":pop" or CTRL-T, jump to old position | |
239 * type == DT_NEXT: jump to next match of same tag | |
240 * type == DT_PREV: jump to previous match of same tag | |
241 * type == DT_FIRST: jump to first match of same tag | |
242 * type == DT_LAST: jump to last match of same tag | |
243 * type == DT_SELECT: ":tselect [tag]", select tag from a list of all matches | |
244 * type == DT_JUMP: ":tjump [tag]", jump to tag or select tag from a list | |
359 | 245 * type == DT_CSCOPE: use cscope to find the tag |
649 | 246 * type == DT_LTAG: use location list for displaying tag matches |
359 | 247 * type == DT_FREE: free cached matches |
7 | 248 * |
249 * for cscope, returns TRUE if we jumped to tag or aborted, FALSE otherwise | |
250 */ | |
251 int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
252 do_tag( |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
253 char_u *tag, // tag (pattern) to jump to |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
254 int type, |
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
255 int count, |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
256 int forceit, // :ta with ! |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
257 int verbose) // print "tag not found" message |
7 | 258 { |
259 taggy_T *tagstack = curwin->w_tagstack; | |
260 int tagstackidx = curwin->w_tagstackidx; | |
261 int tagstacklen = curwin->w_tagstacklen; | |
262 int cur_match = 0; | |
263 int cur_fnum = curbuf->b_fnum; | |
264 int oldtagstackidx = tagstackidx; | |
265 int prevtagstackidx = tagstackidx; | |
266 int prev_num_matches; | |
267 int new_tag = FALSE; | |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
268 int i; |
7 | 269 int ic; |
270 int no_regexp = FALSE; | |
271 int error_cur_match = 0; | |
272 int save_pos = FALSE; | |
273 fmark_T saved_fmark; | |
274 #ifdef FEAT_CSCOPE | |
275 int jumped_to_tag = FALSE; | |
276 #endif | |
277 int new_num_matches; | |
278 char_u **new_matches; | |
279 int use_tagstack; | |
280 int skip_msg = FALSE; | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
281 char_u *buf_ffname = curbuf->b_ffname; // name to use for |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
282 // priority computation |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
283 int use_tfu = 1; |
7 | 284 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
285 // remember the matches for the last used tag |
7 | 286 static int num_matches = 0; |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
287 static int max_num_matches = 0; // limit used for match search |
7 | 288 static char_u **matches = NULL; |
289 static int flags; | |
290 | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
291 #ifdef FEAT_EVAL |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
292 if (tfu_in_use) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
293 { |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
294 emsg(_(e_cannot_modify_tag_stack_within_tagfunc)); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
295 return FALSE; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
296 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
297 #endif |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
298 |
359 | 299 #ifdef EXITFREE |
300 if (type == DT_FREE) | |
301 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
302 // remove the list of matches |
359 | 303 FreeWild(num_matches, matches); |
304 # ifdef FEAT_CSCOPE | |
305 cs_free_tags(); | |
306 # endif | |
307 num_matches = 0; | |
308 return FALSE; | |
309 } | |
310 #endif | |
311 | |
7 | 312 if (type == DT_HELP) |
313 { | |
314 type = DT_TAG; | |
315 no_regexp = TRUE; | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
316 use_tfu = 0; |
7 | 317 } |
318 | |
319 prev_num_matches = num_matches; | |
320 free_string_option(nofile_fname); | |
321 nofile_fname = NULL; | |
322 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
323 CLEAR_POS(&saved_fmark.mark); // shutup gcc 4.0 |
698 | 324 saved_fmark.fnum = 0; |
325 | |
7 | 326 /* |
327 * Don't add a tag to the tagstack if 'tagstack' has been reset. | |
328 */ | |
329 if ((!p_tgst && *tag != NUL)) | |
330 { | |
331 use_tagstack = FALSE; | |
332 new_tag = TRUE; | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
333 #if defined(FEAT_QUICKFIX) |
8930
a2aca019ba48
commit https://github.com/vim/vim/commit/def5abe0a2727041ecee69afdccfca405333bd24
Christian Brabandt <cb@256bit.org>
parents:
8863
diff
changeset
|
334 if (g_do_tagpreview != 0) |
a2aca019ba48
commit https://github.com/vim/vim/commit/def5abe0a2727041ecee69afdccfca405333bd24
Christian Brabandt <cb@256bit.org>
parents:
8863
diff
changeset
|
335 { |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
336 tagstack_clear_entry(&ptag_entry); |
8930
a2aca019ba48
commit https://github.com/vim/vim/commit/def5abe0a2727041ecee69afdccfca405333bd24
Christian Brabandt <cb@256bit.org>
parents:
8863
diff
changeset
|
337 if ((ptag_entry.tagname = vim_strsave(tag)) == NULL) |
a2aca019ba48
commit https://github.com/vim/vim/commit/def5abe0a2727041ecee69afdccfca405333bd24
Christian Brabandt <cb@256bit.org>
parents:
8863
diff
changeset
|
338 goto end_do_tag; |
a2aca019ba48
commit https://github.com/vim/vim/commit/def5abe0a2727041ecee69afdccfca405333bd24
Christian Brabandt <cb@256bit.org>
parents:
8863
diff
changeset
|
339 } |
a2aca019ba48
commit https://github.com/vim/vim/commit/def5abe0a2727041ecee69afdccfca405333bd24
Christian Brabandt <cb@256bit.org>
parents:
8863
diff
changeset
|
340 #endif |
7 | 341 } |
342 else | |
343 { | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
344 #if defined(FEAT_QUICKFIX) |
2713 | 345 if (g_do_tagpreview != 0) |
7 | 346 use_tagstack = FALSE; |
347 else | |
348 #endif | |
349 use_tagstack = TRUE; | |
350 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
351 // new pattern, add to the tag stack |
845 | 352 if (*tag != NUL |
353 && (type == DT_TAG || type == DT_SELECT || type == DT_JUMP | |
649 | 354 #ifdef FEAT_QUICKFIX |
355 || type == DT_LTAG | |
356 #endif | |
7 | 357 #ifdef FEAT_CSCOPE |
358 || type == DT_CSCOPE | |
359 #endif | |
360 )) | |
361 { | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
362 #if defined(FEAT_QUICKFIX) |
2713 | 363 if (g_do_tagpreview != 0) |
7 | 364 { |
365 if (ptag_entry.tagname != NULL | |
366 && STRCMP(ptag_entry.tagname, tag) == 0) | |
367 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
368 // Jumping to same tag: keep the current match, so that |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
369 // the CursorHold autocommand example works. |
7 | 370 cur_match = ptag_entry.cur_match; |
371 cur_fnum = ptag_entry.cur_fnum; | |
372 } | |
373 else | |
374 { | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
375 tagstack_clear_entry(&ptag_entry); |
7 | 376 if ((ptag_entry.tagname = vim_strsave(tag)) == NULL) |
377 goto end_do_tag; | |
378 } | |
379 } | |
380 else | |
381 #endif | |
382 { | |
383 /* | |
384 * If the last used entry is not at the top, delete all tag | |
385 * stack entries above it. | |
386 */ | |
387 while (tagstackidx < tagstacklen) | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
388 tagstack_clear_entry(&tagstack[--tagstacklen]); |
7 | 389 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
390 // if the tagstack is full: remove oldest entry |
7 | 391 if (++tagstacklen > TAGSTACKSIZE) |
392 { | |
393 tagstacklen = TAGSTACKSIZE; | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
394 tagstack_clear_entry(&tagstack[0]); |
7 | 395 for (i = 1; i < tagstacklen; ++i) |
396 tagstack[i - 1] = tagstack[i]; | |
397 --tagstackidx; | |
398 } | |
399 | |
400 /* | |
401 * put the tag name in the tag stack | |
402 */ | |
403 if ((tagstack[tagstackidx].tagname = vim_strsave(tag)) == NULL) | |
404 { | |
405 curwin->w_tagstacklen = tagstacklen - 1; | |
406 goto end_do_tag; | |
407 } | |
408 curwin->w_tagstacklen = tagstacklen; | |
409 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
410 save_pos = TRUE; // save the cursor position below |
7 | 411 } |
412 | |
413 new_tag = TRUE; | |
414 } | |
415 else | |
416 { | |
417 if ( | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
418 #if defined(FEAT_QUICKFIX) |
2713 | 419 g_do_tagpreview != 0 ? ptag_entry.tagname == NULL : |
7 | 420 #endif |
421 tagstacklen == 0) | |
422 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
423 // empty stack |
26436
ef0c07cbf53f
patch 8.2.3749: error messages are everywhere
Bram Moolenaar <Bram@vim.org>
parents:
26388
diff
changeset
|
424 emsg(_(e_tag_stack_empty)); |
7 | 425 goto end_do_tag; |
426 } | |
427 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
428 if (type == DT_POP) // go to older position |
7 | 429 { |
430 #ifdef FEAT_FOLDING | |
431 int old_KeyTyped = KeyTyped; | |
432 #endif | |
433 if ((tagstackidx -= count) < 0) | |
434 { | |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
435 emsg(_(e_at_bottom_of_tag_stack)); |
7 | 436 if (tagstackidx + count == 0) |
437 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
438 // We did [num]^T from the bottom of the stack |
7 | 439 tagstackidx = 0; |
440 goto end_do_tag; | |
441 } | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
442 // We weren't at the bottom of the stack, so jump all the |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
443 // way to the bottom now. |
7 | 444 tagstackidx = 0; |
445 } | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
446 else if (tagstackidx >= tagstacklen) // count == 0? |
7 | 447 { |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
448 emsg(_(e_at_top_of_tag_stack)); |
7 | 449 goto end_do_tag; |
450 } | |
451 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
452 // Make a copy of the fmark, autocommands may invalidate the |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
453 // tagstack before it's used. |
7 | 454 saved_fmark = tagstack[tagstackidx].fmark; |
455 if (saved_fmark.fnum != curbuf->b_fnum) | |
456 { | |
457 /* | |
458 * Jump to other file. If this fails (e.g. because the | |
459 * file was changed) keep original position in tag stack. | |
460 */ | |
461 if (buflist_getfile(saved_fmark.fnum, saved_fmark.mark.lnum, | |
462 GETF_SETMARK, forceit) == FAIL) | |
463 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
464 tagstackidx = oldtagstackidx; // back to old posn |
7 | 465 goto end_do_tag; |
466 } | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
467 // An BufReadPost autocommand may jump to the '" mark, but |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
468 // we don't what that here. |
7 | 469 curwin->w_cursor.lnum = saved_fmark.mark.lnum; |
470 } | |
471 else | |
472 { | |
473 setpcmark(); | |
474 curwin->w_cursor.lnum = saved_fmark.mark.lnum; | |
475 } | |
476 curwin->w_cursor.col = saved_fmark.mark.col; | |
477 curwin->w_set_curswant = TRUE; | |
478 check_cursor(); | |
479 #ifdef FEAT_FOLDING | |
480 if ((fdo_flags & FDO_TAG) && old_KeyTyped) | |
481 foldOpenCursor(); | |
482 #endif | |
483 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
484 // remove the old list of matches |
7 | 485 FreeWild(num_matches, matches); |
486 #ifdef FEAT_CSCOPE | |
487 cs_free_tags(); | |
488 #endif | |
489 num_matches = 0; | |
845 | 490 tag_freematch(); |
7 | 491 goto end_do_tag; |
492 } | |
493 | |
692 | 494 if (type == DT_TAG |
495 #if defined(FEAT_QUICKFIX) | |
845 | 496 || type == DT_LTAG |
692 | 497 #endif |
845 | 498 ) |
7 | 499 { |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
500 #if defined(FEAT_QUICKFIX) |
2713 | 501 if (g_do_tagpreview != 0) |
7 | 502 { |
503 cur_match = ptag_entry.cur_match; | |
504 cur_fnum = ptag_entry.cur_fnum; | |
505 } | |
506 else | |
507 #endif | |
508 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
509 // ":tag" (no argument): go to newer pattern |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
510 save_pos = TRUE; // save the cursor position below |
7 | 511 if ((tagstackidx += count - 1) >= tagstacklen) |
512 { | |
513 /* | |
514 * Beyond the last one, just give an error message and | |
515 * go to the last one. Don't store the cursor | |
1204 | 516 * position. |
7 | 517 */ |
518 tagstackidx = tagstacklen - 1; | |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
519 emsg(_(e_at_top_of_tag_stack)); |
7 | 520 save_pos = FALSE; |
521 } | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
522 else if (tagstackidx < 0) // must have been count == 0 |
7 | 523 { |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26913
diff
changeset
|
524 emsg(_(e_at_bottom_of_tag_stack)); |
7 | 525 tagstackidx = 0; |
526 goto end_do_tag; | |
527 } | |
528 cur_match = tagstack[tagstackidx].cur_match; | |
529 cur_fnum = tagstack[tagstackidx].cur_fnum; | |
530 } | |
531 new_tag = TRUE; | |
532 } | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
533 else // go to other matching tag |
7 | 534 { |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
535 // Save index for when selection is cancelled. |
7 | 536 prevtagstackidx = tagstackidx; |
537 | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
538 #if defined(FEAT_QUICKFIX) |
2713 | 539 if (g_do_tagpreview != 0) |
7 | 540 { |
541 cur_match = ptag_entry.cur_match; | |
542 cur_fnum = ptag_entry.cur_fnum; | |
543 } | |
544 else | |
545 #endif | |
546 { | |
547 if (--tagstackidx < 0) | |
548 tagstackidx = 0; | |
549 cur_match = tagstack[tagstackidx].cur_match; | |
550 cur_fnum = tagstack[tagstackidx].cur_fnum; | |
551 } | |
552 switch (type) | |
553 { | |
554 case DT_FIRST: cur_match = count - 1; break; | |
555 case DT_SELECT: | |
556 case DT_JUMP: | |
557 #ifdef FEAT_CSCOPE | |
558 case DT_CSCOPE: | |
559 #endif | |
560 case DT_LAST: cur_match = MAXCOL - 1; break; | |
561 case DT_NEXT: cur_match += count; break; | |
562 case DT_PREV: cur_match -= count; break; | |
563 } | |
564 if (cur_match >= MAXCOL) | |
565 cur_match = MAXCOL - 1; | |
566 else if (cur_match < 0) | |
567 { | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
568 emsg(_(e_cannot_go_before_first_matching_tag)); |
7 | 569 skip_msg = TRUE; |
570 cur_match = 0; | |
571 cur_fnum = curbuf->b_fnum; | |
572 } | |
573 } | |
574 } | |
575 | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
576 #if defined(FEAT_QUICKFIX) |
2713 | 577 if (g_do_tagpreview != 0) |
7 | 578 { |
579 if (type != DT_SELECT && type != DT_JUMP) | |
580 { | |
581 ptag_entry.cur_match = cur_match; | |
582 ptag_entry.cur_fnum = cur_fnum; | |
583 } | |
584 } | |
585 else | |
586 #endif | |
587 { | |
588 /* | |
589 * For ":tag [arg]" or ":tselect" remember position before the jump. | |
590 */ | |
591 saved_fmark = tagstack[tagstackidx].fmark; | |
592 if (save_pos) | |
593 { | |
594 tagstack[tagstackidx].fmark.mark = curwin->w_cursor; | |
595 tagstack[tagstackidx].fmark.fnum = curbuf->b_fnum; | |
596 } | |
597 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
598 // Curwin will change in the call to jumpto_tag() if ":stag" was |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
599 // used or an autocommand jumps to another window; store value of |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
600 // tagstackidx now. |
7 | 601 curwin->w_tagstackidx = tagstackidx; |
602 if (type != DT_SELECT && type != DT_JUMP) | |
603 { | |
604 curwin->w_tagstack[tagstackidx].cur_match = cur_match; | |
605 curwin->w_tagstack[tagstackidx].cur_fnum = cur_fnum; | |
606 } | |
607 } | |
608 } | |
609 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
610 // When not using the current buffer get the name of buffer "cur_fnum". |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
611 // Makes sure that the tag order doesn't change when using a remembered |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
612 // position for "cur_match". |
7 | 613 if (cur_fnum != curbuf->b_fnum) |
614 { | |
615 buf_T *buf = buflist_findnr(cur_fnum); | |
616 | |
617 if (buf != NULL) | |
618 buf_ffname = buf->b_ffname; | |
619 } | |
620 | |
621 /* | |
622 * Repeat searching for tags, when a file has not been found. | |
623 */ | |
624 for (;;) | |
625 { | |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
626 int other_name; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
627 char_u *name; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
628 |
7 | 629 /* |
630 * When desired match not found yet, try to find it (and others). | |
631 */ | |
632 if (use_tagstack) | |
633 name = tagstack[tagstackidx].tagname; | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
634 #if defined(FEAT_QUICKFIX) |
2713 | 635 else if (g_do_tagpreview != 0) |
7 | 636 name = ptag_entry.tagname; |
637 #endif | |
638 else | |
639 name = tag; | |
640 other_name = (tagmatchname == NULL || STRCMP(tagmatchname, name) != 0); | |
641 if (new_tag | |
642 || (cur_match >= num_matches && max_num_matches != MAXCOL) | |
643 || other_name) | |
644 { | |
645 if (other_name) | |
646 { | |
647 vim_free(tagmatchname); | |
648 tagmatchname = vim_strsave(name); | |
649 } | |
650 | |
16164
213b88f89597
patch 8.1.1087: tag stack is incorrect after CTRL-T and then :tag
Bram Moolenaar <Bram@vim.org>
parents:
16142
diff
changeset
|
651 if (type == DT_SELECT || type == DT_JUMP |
692 | 652 #if defined(FEAT_QUICKFIX) |
653 || type == DT_LTAG | |
654 #endif | |
655 ) | |
7 | 656 cur_match = MAXCOL - 1; |
16164
213b88f89597
patch 8.1.1087: tag stack is incorrect after CTRL-T and then :tag
Bram Moolenaar <Bram@vim.org>
parents:
16142
diff
changeset
|
657 if (type == DT_TAG) |
213b88f89597
patch 8.1.1087: tag stack is incorrect after CTRL-T and then :tag
Bram Moolenaar <Bram@vim.org>
parents:
16142
diff
changeset
|
658 max_num_matches = MAXCOL; |
213b88f89597
patch 8.1.1087: tag stack is incorrect after CTRL-T and then :tag
Bram Moolenaar <Bram@vim.org>
parents:
16142
diff
changeset
|
659 else |
213b88f89597
patch 8.1.1087: tag stack is incorrect after CTRL-T and then :tag
Bram Moolenaar <Bram@vim.org>
parents:
16142
diff
changeset
|
660 max_num_matches = cur_match + 1; |
7 | 661 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
662 // when the argument starts with '/', use it as a regexp |
7 | 663 if (!no_regexp && *name == '/') |
664 { | |
665 flags = TAG_REGEXP; | |
666 ++name; | |
667 } | |
668 else | |
669 flags = TAG_NOIC; | |
670 | |
671 #ifdef FEAT_CSCOPE | |
672 if (type == DT_CSCOPE) | |
673 flags = TAG_CSCOPE; | |
674 #endif | |
675 if (verbose) | |
676 flags |= TAG_VERBOSE; | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
677 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
678 if (!use_tfu) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
679 flags |= TAG_NO_TAGFUNC; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
680 |
7 | 681 if (find_tags(name, &new_num_matches, &new_matches, flags, |
682 max_num_matches, buf_ffname) == OK | |
683 && new_num_matches < max_num_matches) | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
684 max_num_matches = MAXCOL; // If less than max_num_matches |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
685 // found: all matches found. |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
686 |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
687 // If there already were some matches for the same name, move them |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
688 // to the start. Avoids that the order changes when using |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
689 // ":tnext" and jumping to another file. |
7 | 690 if (!new_tag && !other_name) |
691 { | |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
692 int j, k; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
693 int idx = 0; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
694 tagptrs_T tagp, tagp2; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
695 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
696 // Find the position of each old match in the new list. Need |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
697 // to use parse_match() to find the tag line. |
7 | 698 for (j = 0; j < num_matches; ++j) |
699 { | |
700 parse_match(matches[j], &tagp); | |
701 for (i = idx; i < new_num_matches; ++i) | |
702 { | |
703 parse_match(new_matches[i], &tagp2); | |
704 if (STRCMP(tagp.tagname, tagp2.tagname) == 0) | |
705 { | |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
706 char_u *p = new_matches[i]; |
7 | 707 for (k = i; k > idx; --k) |
708 new_matches[k] = new_matches[k - 1]; | |
709 new_matches[idx++] = p; | |
710 break; | |
711 } | |
712 } | |
713 } | |
714 } | |
715 FreeWild(num_matches, matches); | |
716 num_matches = new_num_matches; | |
717 matches = new_matches; | |
718 } | |
719 | |
720 if (num_matches <= 0) | |
721 { | |
722 if (verbose) | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
723 semsg(_(e_tag_not_found_str), name); |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
724 #if defined(FEAT_QUICKFIX) |
7 | 725 g_do_tagpreview = 0; |
726 #endif | |
727 } | |
728 else | |
729 { | |
730 int ask_for_selection = FALSE; | |
731 | |
732 #ifdef FEAT_CSCOPE | |
733 if (type == DT_CSCOPE && num_matches > 1) | |
734 { | |
735 cs_print_tags(); | |
736 ask_for_selection = TRUE; | |
737 } | |
738 else | |
739 #endif | |
16164
213b88f89597
patch 8.1.1087: tag stack is incorrect after CTRL-T and then :tag
Bram Moolenaar <Bram@vim.org>
parents:
16142
diff
changeset
|
740 if (type == DT_TAG && *tag != NUL) |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
741 // If a count is supplied to the ":tag <name>" command, then |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
742 // jump to count'th matching tag. |
6851 | 743 cur_match = count > 0 ? count - 1 : 0; |
744 else if (type == DT_SELECT || (type == DT_JUMP && num_matches > 1)) | |
7 | 745 { |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
746 print_tag_list(new_tag, use_tagstack, num_matches, matches); |
7 | 747 ask_for_selection = TRUE; |
748 } | |
649 | 749 #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL) |
692 | 750 else if (type == DT_LTAG) |
649 | 751 { |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
752 if (add_llist_tags(tag, num_matches, matches) == FAIL) |
649 | 753 goto end_do_tag; |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
754 cur_match = 0; // Jump to the first tag |
649 | 755 } |
756 #endif | |
7 | 757 |
758 if (ask_for_selection == TRUE) | |
759 { | |
760 /* | |
761 * Ask to select a tag from the list. | |
762 */ | |
373 | 763 i = prompt_for_number(NULL); |
7 | 764 if (i <= 0 || i > num_matches || got_int) |
765 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
766 // no valid choice: don't change anything |
7 | 767 if (use_tagstack) |
768 { | |
769 tagstack[tagstackidx].fmark = saved_fmark; | |
770 tagstackidx = prevtagstackidx; | |
771 } | |
772 #ifdef FEAT_CSCOPE | |
773 cs_free_tags(); | |
774 jumped_to_tag = TRUE; | |
775 #endif | |
776 break; | |
777 } | |
778 cur_match = i - 1; | |
779 } | |
780 | |
781 if (cur_match >= num_matches) | |
782 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
783 // Avoid giving this error when a file wasn't found and we're |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
784 // looking for a match in another file, which wasn't found. |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
785 // There will be an emsg("file doesn't exist") below then. |
7 | 786 if ((type == DT_NEXT || type == DT_FIRST) |
787 && nofile_fname == NULL) | |
788 { | |
789 if (num_matches == 1) | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
790 emsg(_(e_there_is_only_one_matching_tag)); |
7 | 791 else |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
792 emsg(_(e_cannot_go_beyond_last_matching_tag)); |
7 | 793 skip_msg = TRUE; |
794 } | |
795 cur_match = num_matches - 1; | |
796 } | |
797 if (use_tagstack) | |
798 { | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
799 tagptrs_T tagp; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
800 |
7 | 801 tagstack[tagstackidx].cur_match = cur_match; |
802 tagstack[tagstackidx].cur_fnum = cur_fnum; | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
803 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
804 // store user-provided data originating from tagfunc |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
805 if (use_tfu && parse_match(matches[cur_match], &tagp) == OK |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
806 && tagp.user_data) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
807 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
808 VIM_CLEAR(tagstack[tagstackidx].user_data); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
809 tagstack[tagstackidx].user_data = vim_strnsave( |
21996
808edde1e97d
patch 8.2.1547: various comment problems
Bram Moolenaar <Bram@vim.org>
parents:
20384
diff
changeset
|
810 tagp.user_data, tagp.user_data_end - tagp.user_data); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
811 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
812 |
7 | 813 ++tagstackidx; |
814 } | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
815 #if defined(FEAT_QUICKFIX) |
2713 | 816 else if (g_do_tagpreview != 0) |
7 | 817 { |
818 ptag_entry.cur_match = cur_match; | |
819 ptag_entry.cur_fnum = cur_fnum; | |
820 } | |
821 #endif | |
822 | |
823 /* | |
824 * Only when going to try the next match, report that the previous | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
825 * file didn't exist. Otherwise an emsg() is given below. |
7 | 826 */ |
827 if (nofile_fname != NULL && error_cur_match != cur_match) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
828 smsg(_("File \"%s\" does not exist"), nofile_fname); |
7 | 829 |
830 | |
831 ic = (matches[cur_match][0] & MT_IC_OFF); | |
6851 | 832 if (type != DT_TAG && type != DT_SELECT && type != DT_JUMP |
7 | 833 #ifdef FEAT_CSCOPE |
834 && type != DT_CSCOPE | |
835 #endif | |
836 && (num_matches > 1 || ic) | |
837 && !skip_msg) | |
838 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
839 // Give an indication of the number of matching tags |
7 | 840 sprintf((char *)IObuff, _("tag %d of %d%s"), |
841 cur_match + 1, | |
842 num_matches, | |
843 max_num_matches != MAXCOL ? _(" or more") : ""); | |
844 if (ic) | |
845 STRCAT(IObuff, _(" Using tag with different case!")); | |
846 if ((num_matches > prev_num_matches || new_tag) | |
847 && num_matches > 1) | |
848 { | |
849 if (ic) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
850 msg_attr((char *)IObuff, HL_ATTR(HLF_W)); |
7 | 851 else |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
852 msg((char *)IObuff); |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
853 msg_scroll = TRUE; // don't overwrite this message |
7 | 854 } |
855 else | |
856 give_warning(IObuff, ic); | |
857 if (ic && !msg_scrolled && msg_silent == 0) | |
858 { | |
859 out_flush(); | |
18642
bbea1f108187
patch 8.1.2313: debugging where a delay comes from is not easy
Bram Moolenaar <Bram@vim.org>
parents:
18640
diff
changeset
|
860 ui_delay(1007L, TRUE); |
7 | 861 } |
862 } | |
863 | |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
864 #if defined(FEAT_EVAL) |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
865 // Let the SwapExists event know what tag we are jumping to. |
589 | 866 vim_snprintf((char *)IObuff, IOSIZE, ":ta %s\r", name); |
867 set_vim_var_string(VV_SWAPCOMMAND, IObuff, -1); | |
868 #endif | |
869 | |
7 | 870 /* |
871 * Jump to the desired match. | |
872 */ | |
589 | 873 i = jumpto_tag(matches[cur_match], forceit, type != DT_CSCOPE); |
874 | |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
875 #if defined(FEAT_EVAL) |
589 | 876 set_vim_var_string(VV_SWAPCOMMAND, NULL, -1); |
877 #endif | |
878 | |
879 if (i == NOTAGFILE) | |
7 | 880 { |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
881 // File not found: try again with another matching tag |
7 | 882 if ((type == DT_PREV && cur_match > 0) |
883 || ((type == DT_TAG || type == DT_NEXT | |
884 || type == DT_FIRST) | |
885 && (max_num_matches != MAXCOL | |
886 || cur_match < num_matches - 1))) | |
887 { | |
888 error_cur_match = cur_match; | |
889 if (use_tagstack) | |
890 --tagstackidx; | |
891 if (type == DT_PREV) | |
892 --cur_match; | |
893 else | |
894 { | |
895 type = DT_NEXT; | |
896 ++cur_match; | |
897 } | |
898 continue; | |
899 } | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
900 semsg(_(e_file_str_does_not_exist), nofile_fname); |
7 | 901 } |
902 else | |
903 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
904 // We may have jumped to another window, check that |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
905 // tagstackidx is still valid. |
7 | 906 if (use_tagstack && tagstackidx > curwin->w_tagstacklen) |
907 tagstackidx = curwin->w_tagstackidx; | |
908 #ifdef FEAT_CSCOPE | |
909 jumped_to_tag = TRUE; | |
910 #endif | |
911 } | |
912 } | |
913 break; | |
914 } | |
915 | |
916 end_do_tag: | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
917 // Only store the new index when using the tagstack and it's valid. |
7 | 918 if (use_tagstack && tagstackidx <= curwin->w_tagstacklen) |
919 curwin->w_tagstackidx = tagstackidx; | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
920 postponed_split = 0; // don't split next time |
9949
30be4b26a37e
commit https://github.com/vim/vim/commit/358308dd99abdd56c6540339e505585d8db7bdfe
Christian Brabandt <cb@256bit.org>
parents:
9913
diff
changeset
|
921 # ifdef FEAT_QUICKFIX |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
922 g_do_tagpreview = 0; // don't do tag preview next time |
9949
30be4b26a37e
commit https://github.com/vim/vim/commit/358308dd99abdd56c6540339e505585d8db7bdfe
Christian Brabandt <cb@256bit.org>
parents:
9913
diff
changeset
|
923 # endif |
7 | 924 |
925 #ifdef FEAT_CSCOPE | |
926 return jumped_to_tag; | |
927 #else | |
928 return FALSE; | |
929 #endif | |
930 } | |
931 | |
932 /* | |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
933 * List all the matching tags. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
934 */ |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
935 static void |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
936 print_tag_list( |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
937 int new_tag, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
938 int use_tagstack, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
939 int num_matches, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
940 char_u **matches) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
941 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
942 taggy_T *tagstack = curwin->w_tagstack; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
943 int tagstackidx = curwin->w_tagstackidx; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
944 int i; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
945 char_u *p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
946 char_u *command_end; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
947 tagptrs_T tagp; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
948 int taglen; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
949 int attr; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
950 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
951 /* |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
952 * Assume that the first match indicates how long the tags can |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
953 * be, and align the file names to that. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
954 */ |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
955 parse_match(matches[0], &tagp); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
956 taglen = (int)(tagp.tagname_end - tagp.tagname + 2); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
957 if (taglen < 18) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
958 taglen = 18; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
959 if (taglen > Columns - 25) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
960 taglen = MAXCOL; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
961 if (msg_col == 0) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
962 msg_didout = FALSE; // overwrite previous message |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
963 msg_start(); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
964 msg_puts_attr(_(" # pri kind tag"), HL_ATTR(HLF_T)); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
965 msg_clr_eos(); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
966 taglen_advance(taglen); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
967 msg_puts_attr(_("file\n"), HL_ATTR(HLF_T)); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
968 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
969 for (i = 0; i < num_matches && !got_int; ++i) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
970 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
971 parse_match(matches[i], &tagp); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
972 if (!new_tag && ( |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
973 #if defined(FEAT_QUICKFIX) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
974 (g_do_tagpreview != 0 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
975 && i == ptag_entry.cur_match) || |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
976 #endif |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
977 (use_tagstack |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
978 && i == tagstack[tagstackidx].cur_match))) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
979 *IObuff = '>'; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
980 else |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
981 *IObuff = ' '; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
982 vim_snprintf((char *)IObuff + 1, IOSIZE - 1, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
983 "%2d %s ", i + 1, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
984 mt_names[matches[i][0] & MT_MASK]); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
985 msg_puts((char *)IObuff); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
986 if (tagp.tagkind != NULL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
987 msg_outtrans_len(tagp.tagkind, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
988 (int)(tagp.tagkind_end - tagp.tagkind)); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
989 msg_advance(13); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
990 msg_outtrans_len_attr(tagp.tagname, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
991 (int)(tagp.tagname_end - tagp.tagname), |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
992 HL_ATTR(HLF_T)); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
993 msg_putchar(' '); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
994 taglen_advance(taglen); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
995 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
996 // Find out the actual file name. If it is long, truncate |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
997 // it and put "..." in the middle |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
998 p = tag_full_fname(&tagp); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
999 if (p != NULL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1000 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1001 msg_outtrans_long_attr(p, HL_ATTR(HLF_D)); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1002 vim_free(p); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1003 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1004 if (msg_col > 0) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1005 msg_putchar('\n'); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1006 if (got_int) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1007 break; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1008 msg_advance(15); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1009 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1010 // print any extra fields |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1011 command_end = tagp.command_end; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1012 if (command_end != NULL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1013 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1014 p = command_end + 3; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1015 while (*p && *p != '\r' && *p != '\n') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1016 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1017 while (*p == TAB) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1018 ++p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1019 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1020 // skip "file:" without a value (static tag) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1021 if (STRNCMP(p, "file:", 5) == 0 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1022 && vim_isspace(p[5])) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1023 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1024 p += 5; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1025 continue; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1026 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1027 // skip "kind:<kind>" and "<kind>" |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1028 if (p == tagp.tagkind |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1029 || (p + 5 == tagp.tagkind |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1030 && STRNCMP(p, "kind:", 5) == 0)) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1031 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1032 p = tagp.tagkind_end; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1033 continue; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1034 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1035 // print all other extra fields |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1036 attr = HL_ATTR(HLF_CM); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1037 while (*p && *p != '\r' && *p != '\n') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1038 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1039 if (msg_col + ptr2cells(p) >= Columns) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1040 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1041 msg_putchar('\n'); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1042 if (got_int) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1043 break; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1044 msg_advance(15); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1045 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1046 p = msg_outtrans_one(p, attr); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1047 if (*p == TAB) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1048 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1049 msg_puts_attr(" ", attr); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1050 break; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1051 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1052 if (*p == ':') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1053 attr = 0; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1054 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1055 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1056 if (msg_col > 15) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1057 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1058 msg_putchar('\n'); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1059 if (got_int) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1060 break; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1061 msg_advance(15); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1062 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1063 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1064 else |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1065 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1066 for (p = tagp.command; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1067 *p && *p != '\r' && *p != '\n'; ++p) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1068 ; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1069 command_end = p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1070 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1071 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1072 // Put the info (in several lines) at column 15. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1073 // Don't display "/^" and "?^". |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1074 p = tagp.command; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1075 if (*p == '/' || *p == '?') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1076 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1077 ++p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1078 if (*p == '^') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1079 ++p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1080 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1081 // Remove leading whitespace from pattern |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1082 while (p != command_end && vim_isspace(*p)) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1083 ++p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1084 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1085 while (p != command_end) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1086 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1087 if (msg_col + (*p == TAB ? 1 : ptr2cells(p)) > Columns) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1088 msg_putchar('\n'); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1089 if (got_int) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1090 break; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1091 msg_advance(15); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1092 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1093 // skip backslash used for escaping a command char or |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1094 // a backslash |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1095 if (*p == '\\' && (*(p + 1) == *tagp.command |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1096 || *(p + 1) == '\\')) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1097 ++p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1098 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1099 if (*p == TAB) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1100 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1101 msg_putchar(' '); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1102 ++p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1103 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1104 else |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1105 p = msg_outtrans_one(p, 0); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1106 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1107 // don't display the "$/;\"" and "$?;\"" |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1108 if (p == command_end - 2 && *p == '$' |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1109 && *(p + 1) == *tagp.command) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1110 break; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1111 // don't display matching '/' or '?' |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1112 if (p == command_end - 1 && *p == *tagp.command |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1113 && (*p == '/' || *p == '?')) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1114 break; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1115 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1116 if (msg_col) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1117 msg_putchar('\n'); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1118 ui_breakcheck(); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1119 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1120 if (got_int) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1121 got_int = FALSE; // only stop the listing |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1122 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1123 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1124 #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1125 /* |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1126 * Add the matching tags to the location list for the current |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1127 * window. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1128 */ |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1129 static int |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1130 add_llist_tags( |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1131 char_u *tag, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1132 int num_matches, |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1133 char_u **matches) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1134 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1135 list_T *list; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1136 char_u tag_name[128 + 1]; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1137 char_u *fname; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1138 char_u *cmd; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1139 int i; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1140 char_u *p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1141 tagptrs_T tagp; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1142 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1143 fname = alloc(MAXPATHL + 1); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1144 cmd = alloc(CMDBUFFSIZE + 1); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1145 list = list_alloc(); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1146 if (list == NULL || fname == NULL || cmd == NULL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1147 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1148 vim_free(cmd); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1149 vim_free(fname); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1150 if (list != NULL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1151 list_free(list); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1152 return FAIL; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1153 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1154 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1155 for (i = 0; i < num_matches; ++i) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1156 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1157 int len, cmd_len; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1158 long lnum; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1159 dict_T *dict; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1160 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1161 parse_match(matches[i], &tagp); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1162 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1163 // Save the tag name |
16188
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1164 len = (int)(tagp.tagname_end - tagp.tagname); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1165 if (len > 128) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1166 len = 128; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1167 vim_strncpy(tag_name, tagp.tagname, len); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1168 tag_name[len] = NUL; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1169 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1170 // Save the tag file name |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1171 p = tag_full_fname(&tagp); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1172 if (p == NULL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1173 continue; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1174 vim_strncpy(fname, p, MAXPATHL); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1175 vim_free(p); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1176 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1177 // Get the line number or the search pattern used to locate |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1178 // the tag. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1179 lnum = 0; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1180 if (isdigit(*tagp.command)) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1181 // Line number is used to locate the tag |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1182 lnum = atol((char *)tagp.command); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1183 else |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1184 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1185 char_u *cmd_start, *cmd_end; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1186 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1187 // Search pattern is used to locate the tag |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1188 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1189 // Locate the end of the command |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1190 cmd_start = tagp.command; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1191 cmd_end = tagp.command_end; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1192 if (cmd_end == NULL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1193 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1194 for (p = tagp.command; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1195 *p && *p != '\r' && *p != '\n'; ++p) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1196 ; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1197 cmd_end = p; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1198 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1199 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1200 // Now, cmd_end points to the character after the |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1201 // command. Adjust it to point to the last |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1202 // character of the command. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1203 cmd_end--; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1204 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1205 // Skip the '/' and '?' characters at the |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1206 // beginning and end of the search pattern. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1207 if (*cmd_start == '/' || *cmd_start == '?') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1208 cmd_start++; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1209 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1210 if (*cmd_end == '/' || *cmd_end == '?') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1211 cmd_end--; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1212 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1213 len = 0; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1214 cmd[0] = NUL; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1215 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1216 // If "^" is present in the tag search pattern, then |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1217 // copy it first. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1218 if (*cmd_start == '^') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1219 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1220 STRCPY(cmd, "^"); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1221 cmd_start++; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1222 len++; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1223 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1224 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1225 // Precede the tag pattern with \V to make it very |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1226 // nomagic. |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1227 STRCAT(cmd, "\\V"); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1228 len += 2; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1229 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1230 cmd_len = (int)(cmd_end - cmd_start + 1); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1231 if (cmd_len > (CMDBUFFSIZE - 5)) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1232 cmd_len = CMDBUFFSIZE - 5; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1233 STRNCAT(cmd, cmd_start, cmd_len); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1234 len += cmd_len; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1235 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1236 if (cmd[len - 1] == '$') |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1237 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1238 // Replace '$' at the end of the search pattern |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1239 // with '\$' |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1240 cmd[len - 1] = '\\'; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1241 cmd[len] = '$'; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1242 len++; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1243 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1244 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1245 cmd[len] = NUL; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1246 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1247 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1248 if ((dict = dict_alloc()) == NULL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1249 continue; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1250 if (list_append_dict(list, dict) == FAIL) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1251 { |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1252 vim_free(dict); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1253 continue; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1254 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1255 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1256 dict_add_string(dict, "text", tag_name); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1257 dict_add_string(dict, "filename", fname); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1258 dict_add_number(dict, "lnum", lnum); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1259 if (lnum == 0) |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1260 dict_add_string(dict, "pattern", cmd); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1261 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1262 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1263 vim_snprintf((char *)IObuff, IOSIZE, "ltag %s", tag); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1264 set_errorlist(curwin, list, ' ', IObuff, NULL); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1265 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1266 list_free(list); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1267 vim_free(fname); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1268 vim_free(cmd); |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1269 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1270 return OK; |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1271 } |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1272 #endif |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1273 |
848d4c6e391e
patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
16178
diff
changeset
|
1274 /* |
7 | 1275 * Free cached tags. |
1276 */ | |
1277 void | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1278 tag_freematch(void) |
7 | 1279 { |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13227
diff
changeset
|
1280 VIM_CLEAR(tagmatchname); |
7 | 1281 } |
1282 | |
1283 static void | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1284 taglen_advance(int l) |
7 | 1285 { |
1286 if (l == MAXCOL) | |
1287 { | |
1288 msg_putchar('\n'); | |
1289 msg_advance(24); | |
1290 } | |
1291 else | |
1292 msg_advance(13 + l); | |
1293 } | |
1294 | |
1295 /* | |
1296 * Print the tag stack | |
1297 */ | |
1298 void | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1299 do_tags(exarg_T *eap UNUSED) |
7 | 1300 { |
1301 int i; | |
1302 char_u *name; | |
1303 taggy_T *tagstack = curwin->w_tagstack; | |
1304 int tagstackidx = curwin->w_tagstackidx; | |
1305 int tagstacklen = curwin->w_tagstacklen; | |
1306 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1307 // Highlight title |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1308 msg_puts_title(_("\n # TO tag FROM line in file/text")); |
7 | 1309 for (i = 0; i < tagstacklen; ++i) |
1310 { | |
1311 if (tagstack[i].tagname != NULL) | |
1312 { | |
1313 name = fm_getname(&(tagstack[i].fmark), 30); | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1314 if (name == NULL) // file name not available |
7 | 1315 continue; |
1316 | |
1317 msg_putchar('\n'); | |
13068
63fdea6e9c6c
patch 8.0.1409: buffer overflow in :tags command
Christian Brabandt <cb@256bit.org>
parents:
12680
diff
changeset
|
1318 vim_snprintf((char *)IObuff, IOSIZE, "%c%2d %2d %-15s %5ld ", |
7 | 1319 i == tagstackidx ? '>' : ' ', |
1320 i + 1, | |
1321 tagstack[i].cur_match + 1, | |
1322 tagstack[i].tagname, | |
1323 tagstack[i].fmark.mark.lnum); | |
1324 msg_outtrans(IObuff); | |
1325 msg_outtrans_attr(name, tagstack[i].fmark.fnum == curbuf->b_fnum | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1326 ? HL_ATTR(HLF_D) : 0); |
7 | 1327 vim_free(name); |
1328 } | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1329 out_flush(); // show one line at a time |
7 | 1330 } |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1331 if (tagstackidx == tagstacklen) // idx at top of stack |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1332 msg_puts("\n>"); |
7 | 1333 } |
1334 | |
1335 /* | |
1336 * Compare two strings, for length "len", ignoring case the ASCII way. | |
1337 * return 0 for match, < 0 for smaller, > 0 for bigger | |
1338 * Make sure case is folded to uppercase in comparison (like for 'sort -f') | |
1339 */ | |
1340 static int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1341 tag_strnicmp(char_u *s1, char_u *s2, size_t len) |
7 | 1342 { |
1343 int i; | |
1344 | |
1345 while (len > 0) | |
1346 { | |
1347 i = (int)TOUPPER_ASC(*s1) - (int)TOUPPER_ASC(*s2); | |
1348 if (i != 0) | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1349 return i; // this character different |
7 | 1350 if (*s1 == NUL) |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1351 break; // strings match until NUL |
7 | 1352 ++s1; |
1353 ++s2; | |
1354 --len; | |
1355 } | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1356 return 0; // strings match |
7 | 1357 } |
1358 | |
1359 /* | |
1360 * Structure to hold info about the tag pattern being used. | |
1361 */ | |
1362 typedef struct | |
1363 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1364 char_u *pat; // the pattern |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1365 int len; // length of pat[] |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1366 char_u *head; // start of pattern head |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1367 int headlen; // length of head[] |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1368 regmatch_T regmatch; // regexp program, may be NULL |
7 | 1369 } pat_T; |
1370 | |
1371 /* | |
1372 * Extract info from the tag search pattern "pats->pat". | |
1373 */ | |
1374 static void | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1375 prepare_pats(pat_T *pats, int has_re) |
7 | 1376 { |
1377 pats->head = pats->pat; | |
1378 pats->headlen = pats->len; | |
1379 if (has_re) | |
1380 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1381 // When the pattern starts with '^' or "\\<", binary searching can be |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1382 // used (much faster). |
7 | 1383 if (pats->pat[0] == '^') |
1384 pats->head = pats->pat + 1; | |
1385 else if (pats->pat[0] == '\\' && pats->pat[1] == '<') | |
1386 pats->head = pats->pat + 2; | |
1387 if (pats->head == pats->pat) | |
1388 pats->headlen = 0; | |
1389 else | |
1390 for (pats->headlen = 0; pats->head[pats->headlen] != NUL; | |
1391 ++pats->headlen) | |
23272
a84e7abb0c92
patch 8.2.2182: Vim9: value of 'magic' is still relevant
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
1392 if (vim_strchr((char_u *)(magic_isset() ? ".[~*\\$" : "\\$"), |
7 | 1393 pats->head[pats->headlen]) != NULL) |
1394 break; | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
1395 if (p_tl != 0 && pats->headlen > p_tl) // adjust for 'taglength' |
7 | 1396 pats->headlen = p_tl; |
1397 } | |
1398 | |
1399 if (has_re) | |
23272
a84e7abb0c92
patch 8.2.2182: Vim9: value of 'magic' is still relevant
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
1400 pats->regmatch.regprog = vim_regcomp(pats->pat, |
a84e7abb0c92
patch 8.2.2182: Vim9: value of 'magic' is still relevant
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
1401 magic_isset() ? RE_MAGIC : 0); |
7 | 1402 else |
1403 pats->regmatch.regprog = NULL; | |
1404 } | |
1405 | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1406 #ifdef FEAT_EVAL |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1407 /* |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1408 * Call the user-defined function to generate a list of tags used by |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1409 * find_tags(). |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1410 * |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1411 * Return OK if at least 1 tag has been successfully found, |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1412 * NOTDONE if the function returns v:null, and FAIL otherwise. |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1413 */ |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1414 static int |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1415 find_tagfunc_tags( |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1416 char_u *pat, // pattern supplied to the user-defined function |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1417 garray_T *ga, // the tags will be placed here |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1418 int *match_count, // here the number of tags found will be placed |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1419 int flags, // flags from find_tags (TAG_*) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1420 char_u *buf_ffname) // name of buffer for priority |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1421 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1422 pos_T save_pos; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1423 list_T *taglist; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1424 listitem_T *item; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1425 int ntags = 0; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1426 int result = FAIL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1427 typval_T args[4]; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1428 typval_T rettv; |
24186
4902263c302e
patch 8.2.2634: 'tagfunc' does not indicate using a pattern
Bram Moolenaar <Bram@vim.org>
parents:
24053
diff
changeset
|
1429 char_u flagString[4]; |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1430 dict_T *d; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1431 taggy_T *tag = &curwin->w_tagstack[curwin->w_tagstackidx]; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1432 |
26452
65b4109a4297
patch 8.2.3756: might crash when callback is not valid
Bram Moolenaar <Bram@vim.org>
parents:
26436
diff
changeset
|
1433 if (*curbuf->b_p_tfu == NUL || curbuf->b_tfu_cb.cb_name == NULL |
65b4109a4297
patch 8.2.3756: might crash when callback is not valid
Bram Moolenaar <Bram@vim.org>
parents:
26436
diff
changeset
|
1434 || *curbuf->b_tfu_cb.cb_name == NUL) |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1435 return FAIL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1436 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1437 args[0].v_type = VAR_STRING; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1438 args[0].vval.v_string = pat; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1439 args[1].v_type = VAR_STRING; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1440 args[1].vval.v_string = flagString; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1441 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1442 // create 'info' dict argument |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1443 if ((d = dict_alloc_lock(VAR_FIXED)) == NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1444 return FAIL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1445 if (tag->user_data != NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1446 dict_add_string(d, "user_data", tag->user_data); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1447 if (buf_ffname != NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1448 dict_add_string(d, "buf_ffname", buf_ffname); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1449 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1450 ++d->dv_refcount; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1451 args[2].v_type = VAR_DICT; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1452 args[2].vval.v_dict = d; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1453 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1454 args[3].v_type = VAR_UNKNOWN; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1455 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1456 vim_snprintf((char *)flagString, sizeof(flagString), |
24186
4902263c302e
patch 8.2.2634: 'tagfunc' does not indicate using a pattern
Bram Moolenaar <Bram@vim.org>
parents:
24053
diff
changeset
|
1457 "%s%s%s", |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1458 g_tag_at_cursor ? "c": "", |
24186
4902263c302e
patch 8.2.2634: 'tagfunc' does not indicate using a pattern
Bram Moolenaar <Bram@vim.org>
parents:
24053
diff
changeset
|
1459 flags & TAG_INS_COMP ? "i": "", |
4902263c302e
patch 8.2.2634: 'tagfunc' does not indicate using a pattern
Bram Moolenaar <Bram@vim.org>
parents:
24053
diff
changeset
|
1460 flags & TAG_REGEXP ? "r": ""); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1461 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1462 save_pos = curwin->w_cursor; |
26268
3aa48d4e3dc8
patch 8.2.3665: cannot use a lambda for 'tagfunc'
Bram Moolenaar <Bram@vim.org>
parents:
25852
diff
changeset
|
1463 result = call_callback(&curbuf->b_tfu_cb, 0, &rettv, 3, args); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1464 curwin->w_cursor = save_pos; // restore the cursor position |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1465 --d->dv_refcount; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1466 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1467 if (result == FAIL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1468 return FAIL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1469 if (rettv.v_type == VAR_SPECIAL && rettv.vval.v_number == VVAL_NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1470 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1471 clear_tv(&rettv); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1472 return NOTDONE; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1473 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1474 if (rettv.v_type != VAR_LIST || !rettv.vval.v_list) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1475 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1476 clear_tv(&rettv); |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1477 emsg(_(e_invalid_return_value_from_tagfunc)); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1478 return FAIL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1479 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1480 taglist = rettv.vval.v_list; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1481 |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19617
diff
changeset
|
1482 FOR_ALL_LIST_ITEMS(taglist, item) |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1483 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1484 char_u *mfp; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1485 char_u *res_name, *res_fname, *res_cmd, *res_kind; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1486 int len; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1487 dict_iterator_T iter; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1488 char_u *dict_key; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1489 typval_T *tv; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1490 int has_extra = 0; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1491 int name_only = flags & TAG_NAMES; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1492 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1493 if (item->li_tv.v_type != VAR_DICT) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1494 { |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1495 emsg(_(e_invalid_return_value_from_tagfunc)); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1496 break; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1497 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1498 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1499 #ifdef FEAT_EMACS_TAGS |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1500 len = 3; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1501 #else |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1502 len = 2; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1503 #endif |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1504 res_name = NULL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1505 res_fname = NULL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1506 res_cmd = NULL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1507 res_kind = NULL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1508 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1509 dict_iterate_start(&item->li_tv, &iter); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1510 while (NULL != (dict_key = dict_iterate_next(&iter, &tv))) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1511 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1512 if (tv->v_type != VAR_STRING || tv->vval.v_string == NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1513 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1514 |
16461
826ad48af5e3
patch 8.1.1235: compiler warnings for using STRLEN() value
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
1515 len += (int)STRLEN(tv->vval.v_string) + 1; // Space for "\tVALUE" |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1516 if (!STRCMP(dict_key, "name")) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1517 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1518 res_name = tv->vval.v_string; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1519 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1520 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1521 if (!STRCMP(dict_key, "filename")) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1522 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1523 res_fname = tv->vval.v_string; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1524 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1525 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1526 if (!STRCMP(dict_key, "cmd")) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1527 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1528 res_cmd = tv->vval.v_string; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1529 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1530 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1531 has_extra = 1; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1532 if (!STRCMP(dict_key, "kind")) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1533 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1534 res_kind = tv->vval.v_string; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1535 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1536 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1537 // Other elements will be stored as "\tKEY:VALUE" |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1538 // Allocate space for the key and the colon |
16461
826ad48af5e3
patch 8.1.1235: compiler warnings for using STRLEN() value
Bram Moolenaar <Bram@vim.org>
parents:
16447
diff
changeset
|
1539 len += (int)STRLEN(dict_key) + 1; |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1540 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1541 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1542 if (has_extra) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1543 len += 2; // need space for ;" |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1544 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1545 if (!res_name || !res_fname || !res_cmd) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1546 { |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
1547 emsg(_(e_invalid_return_value_from_tagfunc)); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1548 break; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1549 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1550 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1551 if (name_only) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1552 mfp = vim_strsave(res_name); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1553 else |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
1554 mfp = alloc(sizeof(char_u) + len + 1); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1555 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1556 if (mfp == NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1557 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1558 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1559 if (!name_only) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1560 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1561 char_u *p = mfp; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1562 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1563 *p++ = MT_GL_OTH + 1; // mtt |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1564 *p++ = TAG_SEP; // no tag file name |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1565 #ifdef FEAT_EMACS_TAGS |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1566 *p++ = TAG_SEP; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1567 #endif |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1568 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1569 STRCPY(p, res_name); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1570 p += STRLEN(p); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1571 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1572 *p++ = TAB; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1573 STRCPY(p, res_fname); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1574 p += STRLEN(p); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1575 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1576 *p++ = TAB; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1577 STRCPY(p, res_cmd); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1578 p += STRLEN(p); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1579 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1580 if (has_extra) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1581 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1582 STRCPY(p, ";\""); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1583 p += STRLEN(p); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1584 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1585 if (res_kind) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1586 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1587 *p++ = TAB; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1588 STRCPY(p, res_kind); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1589 p += STRLEN(p); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1590 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1591 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1592 dict_iterate_start(&item->li_tv, &iter); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1593 while (NULL != (dict_key = dict_iterate_next(&iter, &tv))) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1594 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1595 if (tv->v_type != VAR_STRING || tv->vval.v_string == NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1596 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1597 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1598 if (!STRCMP(dict_key, "name")) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1599 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1600 if (!STRCMP(dict_key, "filename")) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1601 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1602 if (!STRCMP(dict_key, "cmd")) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1603 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1604 if (!STRCMP(dict_key, "kind")) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1605 continue; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1606 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1607 *p++ = TAB; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1608 STRCPY(p, dict_key); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1609 p += STRLEN(p); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1610 STRCPY(p, ":"); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1611 p += STRLEN(p); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1612 STRCPY(p, tv->vval.v_string); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1613 p += STRLEN(p); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1614 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1615 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1616 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1617 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1618 // Add all matches because tagfunc should do filtering. |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1619 if (ga_grow(ga, 1) == OK) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1620 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1621 ((char_u **)(ga->ga_data))[ga->ga_len++] = mfp; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1622 ++ntags; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1623 result = OK; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1624 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1625 else |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1626 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1627 vim_free(mfp); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1628 break; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1629 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1630 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1631 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1632 clear_tv(&rettv); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1633 |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1634 *match_count = ntags; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1635 return result; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1636 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1637 #endif |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
1638 |
7 | 1639 /* |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1640 * State information used during a tag search |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1641 */ |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1642 typedef struct |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1643 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1644 tagsearch_state_T state; // tag search state |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1645 char_u *tag_fname; // name of the tag file |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1646 FILE *fp; // current tags file pointer |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1647 pat_T orgpat; // holds unconverted pattern info |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1648 int flags; // flags used for tag search |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1649 int tag_file_sorted; // !_TAG_FILE_SORTED value |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1650 int get_searchpat; // used for 'showfulltag' |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1651 int help_only; // only search for help tags |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1652 vimconv_T vimconv; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1653 #ifdef FEAT_MULTI_LANG |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1654 char_u help_lang[3]; // lang of current tags file |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1655 int help_pri; // help language priority |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1656 char_u *help_lang_find; // lang to be found |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1657 int is_txt; // flag of file extension |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1658 #endif |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1659 int did_open; // did open a tag file |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1660 int mincount; // MAXCOL: find all matches |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1661 // other: minimal number of matches |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1662 int linear; // do a linear search |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1663 char_u *lbuf; // line buffer |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1664 int lbuf_size; // length of lbuf |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1665 #ifdef FEAT_EMACS_TAGS |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1666 int is_etag; // current file is emaces style |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1667 char_u *ebuf; // additional buffer for etag fname |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1668 #endif |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1669 int match_count; // number of matches found |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1670 garray_T ga_match[MT_COUNT]; // stores matches in sequence |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1671 hashtab_T ht_match[MT_COUNT]; // stores matches by key |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1672 int stop_searching; // stop when match found or error |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1673 } findtags_state_T; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1674 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1675 /* |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1676 * Initialize the state used by find_tags() |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1677 */ |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1678 static int |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1679 findtags_state_init( |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1680 findtags_state_T *st, |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1681 char_u *pat, |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1682 int flags, |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1683 int mincount) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1684 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1685 int mtt; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1686 |
27942
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
1687 st->tag_fname = alloc(MAXPATHL + 1); |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1688 st->fp = NULL; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1689 st->orgpat.pat = pat; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1690 st->orgpat.len = (int)STRLEN(pat); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1691 st->orgpat.regmatch.regprog = NULL; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1692 st->flags = flags; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1693 st->tag_file_sorted = NUL; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1694 st->help_only = (flags & TAG_HELP); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1695 st->get_searchpat = FALSE; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1696 #ifdef FEAT_MULTI_LANG |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1697 st->help_lang[0] = NUL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1698 st->help_pri = 0; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1699 st->help_lang_find = NULL; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1700 st->is_txt = FALSE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1701 #endif |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1702 st->did_open = FALSE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1703 st->mincount = mincount; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1704 st->lbuf_size = LSIZE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1705 st->lbuf = alloc(st->lbuf_size); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1706 #ifdef FEAT_EMACS_TAGS |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1707 st->ebuf = alloc(LSIZE); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1708 #endif |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1709 st->match_count = 0; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1710 st->stop_searching = FALSE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1711 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1712 for (mtt = 0; mtt < MT_COUNT; ++mtt) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1713 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1714 ga_init2(&st->ga_match[mtt], sizeof(char_u *), 100); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1715 hash_init(&st->ht_match[mtt]); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1716 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1717 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1718 // check for out of memory situation |
27942
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
1719 if (st->tag_fname == NULL |
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
1720 || st->lbuf == NULL |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1721 #ifdef FEAT_EMACS_TAGS |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1722 || st->ebuf == NULL |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1723 #endif |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1724 ) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1725 return FAIL; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1726 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1727 return OK; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1728 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1729 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
1730 /* |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1731 * Free the state used by find_tags() |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1732 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1733 static void |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1734 findtags_state_free(findtags_state_T *st) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1735 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1736 vim_free(st->tag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1737 vim_free(st->lbuf); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1738 vim_regfree(st->orgpat.regmatch.regprog); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1739 #ifdef FEAT_EMACS_TAGS |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1740 vim_free(st->ebuf); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1741 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1742 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1743 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1744 #ifdef FEAT_MULTI_LANG |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1745 /* |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1746 * Initialize the language and priority used for searching tags in a Vim help |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1747 * file. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1748 * Returns TRUE to process the help file and FALSE to skip the file. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1749 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1750 static int |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1751 findtags_in_help_init(findtags_state_T *st) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1752 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1753 int i; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1754 char_u *s; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1755 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1756 // Keep 'en' as the language if the file extension is '.txt' |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1757 if (st->is_txt) |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1758 STRCPY(st->help_lang, "en"); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1759 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1760 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1761 // Prefer help tags according to 'helplang'. Put the two-letter |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1762 // language name in help_lang[]. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1763 i = (int)STRLEN(st->tag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1764 if (i > 3 && st->tag_fname[i - 3] == '-') |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1765 STRCPY(st->help_lang, st->tag_fname + i - 2); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1766 else |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1767 STRCPY(st->help_lang, "en"); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1768 } |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1769 // When searching for a specific language skip tags files for other |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1770 // languages. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1771 if (st->help_lang_find != NULL |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1772 && STRICMP(st->help_lang, st->help_lang_find) != 0) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1773 return FALSE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1774 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1775 // For CTRL-] in a help file prefer a match with the same language. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1776 if ((st->flags & TAG_KEEP_LANG) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1777 && st->help_lang_find == NULL |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1778 && curbuf->b_fname != NULL |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1779 && (i = (int)STRLEN(curbuf->b_fname)) > 4 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1780 && curbuf->b_fname[i - 1] == 'x' |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1781 && curbuf->b_fname[i - 4] == '.' |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1782 && STRNICMP(curbuf->b_fname + i - 3, st->help_lang, 2) == 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1783 st->help_pri = 0; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1784 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1785 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1786 // search for the language in 'helplang' |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1787 st->help_pri = 1; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1788 for (s = p_hlg; *s != NUL; ++s) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1789 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1790 if (STRNICMP(s, st->help_lang, 2) == 0) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1791 break; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1792 ++st->help_pri; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1793 if ((s = vim_strchr(s, ',')) == NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1794 break; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1795 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1796 if (s == NULL || *s == NUL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1797 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1798 // Language not in 'helplang': use last, prefer English, unless |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1799 // found already. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1800 ++st->help_pri; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1801 if (STRICMP(st->help_lang, "en") != 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1802 ++st->help_pri; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1803 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1804 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1805 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1806 return TRUE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1807 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1808 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1809 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1810 #ifdef FEAT_EVAL |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1811 /* |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1812 * Use the function set in 'tagfunc' (if configured and enabled) to get the |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1813 * tags. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1814 * Return OK if at least 1 tag has been successfully found, NOTDONE if the |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1815 * 'tagfunc' is not used or the 'tagfunc' returns v:null and FAIL otherwise. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1816 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1817 static int |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1818 findtags_apply_tfu(findtags_state_T *st, char_u *pat, char_u *buf_ffname) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1819 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1820 int use_tfu = ((st->flags & TAG_NO_TAGFUNC) == 0); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1821 int retval; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1822 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1823 if (!use_tfu || tfu_in_use || *curbuf->b_p_tfu == NUL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1824 return NOTDONE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1825 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1826 tfu_in_use = TRUE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1827 retval = find_tagfunc_tags(pat, st->ga_match, &st->match_count, |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1828 st->flags, buf_ffname); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1829 tfu_in_use = FALSE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1830 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1831 return retval; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1832 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1833 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1834 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1835 #ifdef FEAT_EMACS_TAGS |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1836 /* |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1837 * Stack for included emacs-tags file. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1838 * It has a fixed size, to truncate cyclic includes. jw |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1839 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1840 # define INCSTACK_SIZE 42 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1841 static struct |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1842 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1843 FILE *fp; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1844 char_u *etag_fname; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1845 } incstack[INCSTACK_SIZE]; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1846 static int incstack_idx = 0; // index in incstack |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1847 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1848 /* |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1849 * Free the include tags file stack. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1850 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1851 static void |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1852 emacs_tags_incstack_free(void) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1853 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1854 while (incstack_idx) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1855 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1856 --incstack_idx; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1857 fclose(incstack[incstack_idx].fp); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1858 incstack[incstack_idx].fp = NULL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1859 VIM_CLEAR(incstack[incstack_idx].etag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1860 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1861 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1862 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1863 /* |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1864 * Emacs tags line with CTRL-L: New file name on next line. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1865 * The file name is followed by a ','. Remember etag file name in ebuf. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1866 * Returns a FILE pointer to the tags file. If another tags file is included, |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1867 * then returns a pointer to the new tags file. The old file pointer is saved |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1868 * in incstack. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1869 */ |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1870 static void |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1871 emacs_tags_new_filename(findtags_state_T *st) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1872 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1873 char_u *p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1874 char_u *fullpath_ebuf; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1875 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1876 if (vim_fgets(st->ebuf, LSIZE, st->fp)) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1877 return; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1878 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1879 for (p = st->ebuf; *p && *p != ','; p++) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1880 ; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1881 *p = NUL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1882 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1883 // check for an included tags file. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1884 // atoi(p+1) is the number of bytes before the next ^L unless it is an |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1885 // include statement. Skip the included tags file if it exceeds the |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1886 // maximum. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1887 if (STRNCMP(p + 1, "include", 7) != 0 || incstack_idx >= INCSTACK_SIZE) |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1888 return; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1889 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1890 // Save current "fp" and "tag_fname" in the stack. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1891 incstack[incstack_idx].etag_fname = vim_strsave(st->tag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1892 if (incstack[incstack_idx].etag_fname == NULL) |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1893 return; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1894 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1895 incstack[incstack_idx].fp = st->fp; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1896 st->fp = NULL; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1897 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1898 // Figure out "tag_fname" and "fp" to use for |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1899 // included file. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1900 fullpath_ebuf = expand_tag_fname(st->ebuf, st->tag_fname, FALSE); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1901 if (fullpath_ebuf != NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1902 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1903 st->fp = mch_fopen((char *)fullpath_ebuf, "r"); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1904 if (st->fp != NULL) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1905 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1906 if (STRLEN(fullpath_ebuf) > LSIZE) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1907 semsg(_(e_tag_file_path_truncated_for_str), st->ebuf); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1908 vim_strncpy(st->tag_fname, fullpath_ebuf, MAXPATHL); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1909 ++incstack_idx; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1910 st->is_etag = FALSE; // we can include anything |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1911 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1912 vim_free(fullpath_ebuf); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1913 } |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1914 if (st->fp == NULL) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1915 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1916 // Can't open the included file, skip it and |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1917 // restore old value of "fp". |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1918 st->fp = incstack[incstack_idx].fp; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1919 vim_free(incstack[incstack_idx].etag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1920 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1921 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1922 return; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1923 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1924 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1925 /* |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1926 * Reached the end of an emacs-style tags file. If this is an included tags |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1927 * file, then pop it from the incstack and continue processing the parent tags |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1928 * file. Otherwise, processed all the tags. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1929 * Returns TRUE if an included tags file is popped and processing should |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1930 * continue with the parent tags file. Otherwise returns FALSE. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1931 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1932 static int |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1933 emacs_tags_file_eof(findtags_state_T *st) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1934 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1935 if (!incstack_idx) // reached end of file. stop processing. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1936 return FALSE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1937 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1938 // reached the end of an included tags file. pop it. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1939 --incstack_idx; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1940 fclose(st->fp); // end of this file ... |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
1941 st->fp = incstack[incstack_idx].fp; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1942 STRCPY(st->tag_fname, incstack[incstack_idx].etag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1943 vim_free(incstack[incstack_idx].etag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1944 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1945 return TRUE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1946 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1947 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1948 /* |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1949 * Parse a line from an emacs-style tags file. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1950 * Returns OK is the line is parsed successfully, otherwise FALSE. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1951 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1952 static int |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1953 emacs_tags_parse_line(char_u *lbuf, tagptrs_T *tagp) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1954 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1955 char_u *p_7f; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1956 char_u *p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1957 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1958 // There are two formats for an emacs tag line: |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1959 // 1: struct EnvBase ^?EnvBase^A139,4627 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1960 // 2: #define ARPB_WILD_WORLD ^?153,5194 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1961 p_7f = vim_strchr(lbuf, 0x7f); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1962 if (p_7f == NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1963 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1964 etag_fail: |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1965 if (vim_strchr(lbuf, '\n') != NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1966 return FAIL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1967 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1968 // Truncated line. Ignore it. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1969 if (p_verbose >= 5) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1970 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1971 verbose_enter(); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1972 msg(_("Ignoring long line in tags file")); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1973 verbose_leave(); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1974 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1975 tagp->command = lbuf; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1976 tagp->tagname = lbuf; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1977 tagp->tagname_end = lbuf; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1978 return OK; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1979 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1980 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1981 // Find ^A. If not found the line number is after the 0x7f |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1982 p = vim_strchr(p_7f, Ctrl_A); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1983 if (p == NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1984 p = p_7f + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1985 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1986 ++p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1987 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1988 if (!VIM_ISDIGIT(*p)) // check for start of line number |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1989 goto etag_fail; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1990 tagp->command = p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1991 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1992 if (p[-1] == Ctrl_A) // first format: explicit tagname given |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1993 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1994 tagp->tagname = p_7f + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1995 tagp->tagname_end = p - 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1996 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1997 else // second format: isolate tagname |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1998 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
1999 // find end of tagname |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2000 for (p = p_7f - 1; !vim_iswordc(*p); --p) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2001 if (p == lbuf) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2002 goto etag_fail; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2003 tagp->tagname_end = p + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2004 while (p >= lbuf && vim_iswordc(*p)) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2005 --p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2006 tagp->tagname = p + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2007 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2008 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2009 return OK; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2010 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2011 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2012 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2013 /* |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2014 * Read the next line from a tags file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2015 * Returns TAGS_READ_SUCCESS if a tags line is successfully read and should be |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2016 * processed. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2017 * Returns TAGS_READ_EOF if the end of file is reached. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2018 * Returns TAGS_READ_IGNORE if the current line should be ignored (used when |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2019 * reached end of a emacs included tags file) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2020 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2021 static tags_read_status_T |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2022 findtags_get_next_line(findtags_state_T *st, tagsearch_info_T *sinfo_p) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2023 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2024 int eof; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2025 off_T offset; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2026 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2027 // For binary search: compute the next offset to use. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2028 if (st->state == TS_BINARY) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2029 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2030 offset = sinfo_p->low_offset + ((sinfo_p->high_offset |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2031 - sinfo_p->low_offset) / 2); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2032 if (offset == sinfo_p->curr_offset) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2033 return TAGS_READ_EOF; // End the binary search without a match. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2034 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2035 sinfo_p->curr_offset = offset; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2036 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2037 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2038 // Skipping back (after a match during binary search). |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2039 else if (st->state == TS_SKIP_BACK) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2040 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2041 sinfo_p->curr_offset -= st->lbuf_size * 2; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2042 if (sinfo_p->curr_offset < 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2043 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2044 sinfo_p->curr_offset = 0; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2045 rewind(st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2046 st->state = TS_STEP_FORWARD; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2047 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2048 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2049 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2050 // When jumping around in the file, first read a line to find the |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2051 // start of the next line. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2052 if (st->state == TS_BINARY || st->state == TS_SKIP_BACK) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2053 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2054 // Adjust the search file offset to the correct position |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2055 sinfo_p->curr_offset_used = sinfo_p->curr_offset; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2056 vim_fseek(st->fp, sinfo_p->curr_offset, SEEK_SET); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2057 eof = vim_fgets(st->lbuf, st->lbuf_size, st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2058 if (!eof && sinfo_p->curr_offset != 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2059 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2060 sinfo_p->curr_offset = vim_ftell(st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2061 if (sinfo_p->curr_offset == sinfo_p->high_offset) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2062 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2063 // oops, gone a bit too far; try from low offset |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2064 vim_fseek(st->fp, sinfo_p->low_offset, SEEK_SET); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2065 sinfo_p->curr_offset = sinfo_p->low_offset; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2066 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2067 eof = vim_fgets(st->lbuf, st->lbuf_size, st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2068 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2069 // skip empty and blank lines |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2070 while (!eof && vim_isblankline(st->lbuf)) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2071 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2072 sinfo_p->curr_offset = vim_ftell(st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2073 eof = vim_fgets(st->lbuf, st->lbuf_size, st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2074 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2075 if (eof) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2076 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2077 // Hit end of file. Skip backwards. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2078 st->state = TS_SKIP_BACK; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2079 sinfo_p->match_offset = vim_ftell(st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2080 sinfo_p->curr_offset = sinfo_p->curr_offset_used; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2081 return TAGS_READ_IGNORE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2082 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2083 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2084 // Not jumping around in the file: Read the next line. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2085 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2086 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2087 // skip empty and blank lines |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2088 do |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2089 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2090 #ifdef FEAT_CSCOPE |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2091 if (st->flags & TAG_CSCOPE) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2092 eof = cs_fgets(st->lbuf, st->lbuf_size); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2093 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2094 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2095 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2096 sinfo_p->curr_offset = vim_ftell(st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2097 eof = vim_fgets(st->lbuf, st->lbuf_size, st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2098 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2099 } while (!eof && vim_isblankline(st->lbuf)); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2100 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2101 if (eof) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2102 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2103 #ifdef FEAT_EMACS_TAGS |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2104 if (emacs_tags_file_eof(st) == TRUE) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2105 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2106 // an included tags file. Continue processing the parent |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2107 // tags file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2108 st->is_etag = TRUE; // (only etags can include) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2109 return TAGS_READ_IGNORE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2110 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2111 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2112 return TAGS_READ_EOF; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2113 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2114 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2115 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2116 return TAGS_READ_SUCCESS; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2117 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2118 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2119 /* |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2120 * Parse a tags file header line in 'st->lbuf'. |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2121 * Returns TRUE if the current line in st->lbuf is not a tags header line and |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2122 * should be parsed as a regular tag line. Returns FALSE if the line is a |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2123 * header line and the next header line should be read. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2124 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2125 static int |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2126 findtags_hdr_parse(findtags_state_T *st) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2127 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2128 char_u *p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2129 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2130 // Header lines in a tags file start with "!_TAG_" |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2131 if (STRNCMP(st->lbuf, "!_TAG_", 6) != 0) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2132 // Non-header item before the header, e.g. "!" itself. |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2133 return TRUE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2134 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2135 // Process the header line. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2136 if (STRNCMP(st->lbuf, "!_TAG_FILE_SORTED\t", 18) == 0) |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2137 st->tag_file_sorted = st->lbuf[18]; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2138 if (STRNCMP(st->lbuf, "!_TAG_FILE_ENCODING\t", 20) == 0) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2139 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2140 // Prepare to convert every line from the specified encoding to |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2141 // 'encoding'. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2142 for (p = st->lbuf + 20; *p > ' ' && *p < 127; ++p) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2143 ; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2144 *p = NUL; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2145 convert_setup(&st->vimconv, st->lbuf + 20, p_enc); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2146 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2147 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2148 // Read the next line. Unrecognized flags are ignored. |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2149 return FALSE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2150 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2151 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2152 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2153 * Handler to initialize the state when starting to process a new tags file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2154 * Called in the TS_START state when finding tags from a tags file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2155 * Returns TRUE if the line read from the tags file should be parsed and |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2156 * FALSE if the line should be ignored. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2157 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2158 static int |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2159 findtags_start_state_handler( |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2160 findtags_state_T *st, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2161 int *sortic, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2162 tagsearch_info_T *sinfo_p) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2163 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2164 #ifdef FEAT_CSCOPE |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2165 int use_cscope = (st->flags & TAG_CSCOPE); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2166 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2167 int noic = (st->flags & TAG_NOIC); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2168 off_T filesize; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2169 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2170 // The header ends when the line sorts below "!_TAG_". When |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2171 // case is folded lower case letters sort before "_". |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2172 if (STRNCMP(st->lbuf, "!_TAG_", 6) <= 0 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2173 || (st->lbuf[0] == '!' && ASCII_ISLOWER(st->lbuf[1]))) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2174 return findtags_hdr_parse(st); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2175 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2176 // Headers ends. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2177 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2178 // When there is no tag head, or ignoring case, need to do a |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2179 // linear search. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2180 // When no "!_TAG_" is found, default to binary search. If |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2181 // the tag file isn't sorted, the second loop will find it. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2182 // When "!_TAG_FILE_SORTED" found: start binary search if |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2183 // flag set. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2184 // For cscope, it's always linear. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2185 # ifdef FEAT_CSCOPE |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2186 if (st->linear || use_cscope) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2187 # else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2188 if (st->linear) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2189 # endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2190 st->state = TS_LINEAR; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2191 else if (st->tag_file_sorted == NUL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2192 st->state = TS_BINARY; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2193 else if (st->tag_file_sorted == '1') |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2194 st->state = TS_BINARY; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2195 else if (st->tag_file_sorted == '2') |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2196 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2197 st->state = TS_BINARY; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2198 *sortic = TRUE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2199 st->orgpat.regmatch.rm_ic = (p_ic || !noic); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2200 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2201 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2202 st->state = TS_LINEAR; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2203 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2204 if (st->state == TS_BINARY && st->orgpat.regmatch.rm_ic && !*sortic) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2205 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2206 // Binary search won't work for ignoring case, use linear |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2207 // search. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2208 st->linear = TRUE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2209 st->state = TS_LINEAR; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2210 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2211 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2212 // When starting a binary search, get the size of the file and |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2213 // compute the first offset. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2214 if (st->state == TS_BINARY) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2215 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2216 if (vim_fseek(st->fp, 0L, SEEK_END) != 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2217 // can't seek, don't use binary search |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2218 st->state = TS_LINEAR; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2219 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2220 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2221 // Get the tag file size (don't use mch_fstat(), it's |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2222 // not portable). Don't use lseek(), it doesn't work |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2223 // properly on MacOS Catalina. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2224 filesize = vim_ftell(st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2225 vim_fseek(st->fp, 0L, SEEK_SET); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2226 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2227 // Calculate the first read offset in the file. Start |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2228 // the search in the middle of the file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2229 sinfo_p->low_offset = 0; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2230 sinfo_p->low_char = 0; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2231 sinfo_p->high_offset = filesize; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2232 sinfo_p->curr_offset = 0; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2233 sinfo_p->high_char = 0xff; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2234 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2235 return FALSE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2236 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2237 |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2238 return TRUE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2239 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2240 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2241 /* |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2242 * Parse a tag line read from a tags file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2243 * Returns OK if a tags line is successfully parsed. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2244 * Returns FAIL if an error is encountered. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2245 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2246 static int |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2247 findtags_parse_line(findtags_state_T *st, tagptrs_T *tagpp) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2248 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2249 int status; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2250 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2251 // Figure out where the different strings are in this line. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2252 // For "normal" tags: Do a quick check if the tag matches. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2253 // This speeds up tag searching a lot! |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2254 if (st->orgpat.headlen |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2255 #ifdef FEAT_EMACS_TAGS |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2256 && !st->is_etag |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2257 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2258 ) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2259 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2260 CLEAR_FIELD(*tagpp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2261 tagpp->tagname = st->lbuf; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2262 tagpp->tagname_end = vim_strchr(st->lbuf, TAB); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2263 if (tagpp->tagname_end == NULL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2264 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2265 // Corrupted tag line. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2266 return FAIL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2267 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2268 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2269 // Can be a matching tag, isolate the file name and command. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2270 tagpp->fname = tagpp->tagname_end + 1; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2271 tagpp->fname_end = vim_strchr(tagpp->fname, TAB); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2272 if (tagpp->fname_end == NULL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2273 status = FAIL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2274 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2275 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2276 tagpp->command = tagpp->fname_end + 1; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2277 status = OK; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2278 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2279 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2280 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2281 status = parse_tag_line(st->lbuf, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2282 #ifdef FEAT_EMACS_TAGS |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2283 st->is_etag, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2284 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2285 tagpp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2286 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2287 if (status == FAIL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2288 return FAIL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2289 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2290 #ifdef FEAT_EMACS_TAGS |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2291 if (st->is_etag) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2292 tagpp->fname = st->ebuf; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2293 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2294 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2295 return OK; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2296 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2297 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2298 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2299 * Initialize the structure used for tag matching. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2300 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2301 static void |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2302 findtags_matchargs_init(findtags_match_args_T *margs, int flags) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2303 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2304 margs->matchoff = 0; // match offset |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2305 margs->match_re = FALSE; // match with regexp |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2306 margs->match_no_ic = FALSE; // matches with case |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2307 margs->has_re = (flags & TAG_REGEXP); // regexp used |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2308 margs->sortic = FALSE; // tag file sorted in nocase |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2309 margs->sort_error = FALSE; // tags file not sorted |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2310 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2311 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2312 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2313 * Compares the tag name in 'tagpp->tagname' with a search pattern in |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2314 * 'st->orgpat.head'. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2315 * Returns TAG_MATCH_SUCCESS if the tag matches, TAG_MATCH_FAIL if the tag |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2316 * doesn't match, TAG_MATCH_NEXT to look for the next matching tag (used in a |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2317 * binary search) and TAG_MATCH_STOP if all the tags are processed without a |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2318 * match. Uses the values in 'margs' for doing the comparison. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2319 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2320 static tagmatch_status_T |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2321 findtags_match_tag( |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2322 findtags_state_T *st, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2323 tagptrs_T *tagpp, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2324 findtags_match_args_T *margs, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2325 tagsearch_info_T *sinfo_p) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2326 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2327 int match = FALSE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2328 int cmplen; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2329 int i; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2330 int tagcmp; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2331 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2332 // Skip this line if the length of the tag is different and |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2333 // there is no regexp, or the tag is too short. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2334 if (st->orgpat.headlen |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2335 #ifdef FEAT_EMACS_TAGS |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2336 && !st->is_etag |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2337 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2338 ) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2339 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2340 cmplen = (int)(tagpp->tagname_end - tagpp->tagname); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2341 if (p_tl != 0 && cmplen > p_tl) // adjust for 'taglength' |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2342 cmplen = p_tl; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2343 if (margs->has_re && st->orgpat.headlen < cmplen) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2344 cmplen = st->orgpat.headlen; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2345 else if (st->state == TS_LINEAR && st->orgpat.headlen != cmplen) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2346 return TAG_MATCH_FAIL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2347 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2348 if (st->state == TS_BINARY) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2349 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2350 // Simplistic check for unsorted tags file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2351 i = (int)tagpp->tagname[0]; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2352 if (margs->sortic) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2353 i = (int)TOUPPER_ASC(tagpp->tagname[0]); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2354 if (i < sinfo_p->low_char || i > sinfo_p->high_char) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2355 margs->sort_error = TRUE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2356 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2357 // Compare the current tag with the searched tag. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2358 if (margs->sortic) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2359 tagcmp = tag_strnicmp(tagpp->tagname, st->orgpat.head, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2360 (size_t)cmplen); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2361 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2362 tagcmp = STRNCMP(tagpp->tagname, st->orgpat.head, cmplen); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2363 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2364 // A match with a shorter tag means to search forward. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2365 // A match with a longer tag means to search backward. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2366 if (tagcmp == 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2367 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2368 if (cmplen < st->orgpat.headlen) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2369 tagcmp = -1; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2370 else if (cmplen > st->orgpat.headlen) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2371 tagcmp = 1; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2372 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2373 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2374 if (tagcmp == 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2375 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2376 // We've located the tag, now skip back and search |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2377 // forward until the first matching tag is found. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2378 st->state = TS_SKIP_BACK; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2379 sinfo_p->match_offset = sinfo_p->curr_offset; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2380 return TAG_MATCH_NEXT; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2381 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2382 if (tagcmp < 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2383 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2384 sinfo_p->curr_offset = vim_ftell(st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2385 if (sinfo_p->curr_offset < sinfo_p->high_offset) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2386 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2387 sinfo_p->low_offset = sinfo_p->curr_offset; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2388 if (margs->sortic) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2389 sinfo_p->low_char = TOUPPER_ASC(tagpp->tagname[0]); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2390 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2391 sinfo_p->low_char = tagpp->tagname[0]; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2392 return TAG_MATCH_NEXT; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2393 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2394 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2395 if (tagcmp > 0 && sinfo_p->curr_offset != sinfo_p->high_offset) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2396 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2397 sinfo_p->high_offset = sinfo_p->curr_offset; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2398 if (margs->sortic) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2399 sinfo_p->high_char = TOUPPER_ASC(tagpp->tagname[0]); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2400 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2401 sinfo_p->high_char = tagpp->tagname[0]; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2402 return TAG_MATCH_NEXT; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2403 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2404 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2405 // No match yet and are at the end of the binary search. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2406 return TAG_MATCH_STOP; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2407 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2408 else if (st->state == TS_SKIP_BACK) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2409 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2410 if (MB_STRNICMP(tagpp->tagname, st->orgpat.head, cmplen) != 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2411 st->state = TS_STEP_FORWARD; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2412 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2413 // Have to skip back more. Restore the curr_offset |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2414 // used, otherwise we get stuck at a long line. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2415 sinfo_p->curr_offset = sinfo_p->curr_offset_used; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2416 return TAG_MATCH_NEXT; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2417 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2418 else if (st->state == TS_STEP_FORWARD) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2419 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2420 if (MB_STRNICMP(tagpp->tagname, st->orgpat.head, cmplen) != 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2421 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2422 if ((off_T)vim_ftell(st->fp) > sinfo_p->match_offset) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2423 return TAG_MATCH_STOP; // past last match |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2424 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2425 return TAG_MATCH_NEXT; // before first match |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2426 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2427 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2428 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2429 // skip this match if it can't match |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2430 if (MB_STRNICMP(tagpp->tagname, st->orgpat.head, cmplen) != 0) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2431 return TAG_MATCH_FAIL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2432 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2433 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2434 // First try matching with the pattern literally (also when it is |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2435 // a regexp). |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2436 cmplen = (int)(tagpp->tagname_end - tagpp->tagname); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2437 if (p_tl != 0 && cmplen > p_tl) // adjust for 'taglength' |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2438 cmplen = p_tl; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2439 // if tag length does not match, don't try comparing |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2440 if (st->orgpat.len != cmplen) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2441 match = FALSE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2442 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2443 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2444 if (st->orgpat.regmatch.rm_ic) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2445 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2446 match = |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2447 (MB_STRNICMP(tagpp->tagname, st->orgpat.pat, cmplen) == 0); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2448 if (match) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2449 margs->match_no_ic = |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2450 (STRNCMP(tagpp->tagname, st->orgpat.pat, cmplen) == 0); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2451 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2452 else |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2453 match = (STRNCMP(tagpp->tagname, st->orgpat.pat, cmplen) == 0); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2454 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2455 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2456 // Has a regexp: Also find tags matching regexp. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2457 margs->match_re = FALSE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2458 if (!match && st->orgpat.regmatch.regprog != NULL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2459 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2460 int cc; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2461 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2462 cc = *tagpp->tagname_end; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2463 *tagpp->tagname_end = NUL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2464 match = vim_regexec(&st->orgpat.regmatch, tagpp->tagname, (colnr_T)0); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2465 if (match) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2466 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2467 margs->matchoff = (int)(st->orgpat.regmatch.startp[0] - |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2468 tagpp->tagname); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2469 if (st->orgpat.regmatch.rm_ic) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2470 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2471 st->orgpat.regmatch.rm_ic = FALSE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2472 margs->match_no_ic = vim_regexec(&st->orgpat.regmatch, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2473 tagpp->tagname, (colnr_T)0); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2474 st->orgpat.regmatch.rm_ic = TRUE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2475 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2476 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2477 *tagpp->tagname_end = cc; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2478 margs->match_re = TRUE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2479 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2480 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2481 return match ? TAG_MATCH_SUCCESS : TAG_MATCH_FAIL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2482 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2483 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2484 /* |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2485 * Convert the encoding of a line read from a tags file in 'st->lbuf'. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2486 * Converting the pattern from 'enc' to the tags file encoding doesn't work, |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2487 * because characters are not recognized. The converted line is saved in |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2488 * st->lbuf. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2489 */ |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2490 static void |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2491 findtags_string_convert(findtags_state_T *st) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2492 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2493 char_u *conv_line; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2494 int len; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2495 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2496 conv_line = string_convert(&st->vimconv, st->lbuf, NULL); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2497 if (conv_line == NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2498 return; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2499 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2500 // Copy or swap lbuf and conv_line. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2501 len = (int)STRLEN(conv_line) + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2502 if (len > st->lbuf_size) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2503 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2504 vim_free(st->lbuf); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2505 st->lbuf = conv_line; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2506 st->lbuf_size = len; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2507 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2508 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2509 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2510 STRCPY(st->lbuf, conv_line); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2511 vim_free(conv_line); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2512 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2513 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2514 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2515 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2516 * Add a matching tag found in a tags file to st->ht_match and st->ga_match. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2517 * Returns OK if successfully added the match and FAIL on memory allocation |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2518 * failure. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2519 */ |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2520 static int |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2521 findtags_add_match( |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2522 findtags_state_T *st, |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2523 tagptrs_T *tagpp, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2524 findtags_match_args_T *margs, |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2525 char_u *buf_ffname, |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2526 hash_T *hash) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2527 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2528 #ifdef FEAT_CSCOPE |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2529 int use_cscope = (st->flags & TAG_CSCOPE); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2530 #endif |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2531 int name_only = (st->flags & TAG_NAMES); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2532 int mtt; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2533 int len = 0; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2534 int is_current; // file name matches |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2535 int is_static; // current tag line is static |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2536 char_u *mfp; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2537 char_u *p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2538 char_u *s; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2539 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2540 #ifdef FEAT_CSCOPE |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2541 if (use_cscope) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2542 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2543 // Don't change the ordering, always use the same table. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2544 mtt = MT_GL_OTH; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2545 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2546 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2547 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2548 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2549 // Decide in which array to store this match. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2550 is_current = test_for_current( |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2551 #ifdef FEAT_EMACS_TAGS |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2552 st->is_etag, |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2553 #endif |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2554 tagpp->fname, tagpp->fname_end, st->tag_fname, buf_ffname); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2555 #ifdef FEAT_EMACS_TAGS |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2556 is_static = FALSE; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2557 if (!st->is_etag) // emacs tags are never static |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2558 #endif |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2559 is_static = test_for_static(tagpp); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2560 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2561 // decide in which of the sixteen tables to store this |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2562 // match |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2563 if (is_static) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2564 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2565 if (is_current) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2566 mtt = MT_ST_CUR; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2567 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2568 mtt = MT_ST_OTH; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2569 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2570 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2571 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2572 if (is_current) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2573 mtt = MT_GL_CUR; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2574 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2575 mtt = MT_GL_OTH; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2576 } |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2577 if (st->orgpat.regmatch.rm_ic && !margs->match_no_ic) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2578 mtt += MT_IC_OFF; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2579 if (margs->match_re) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2580 mtt += MT_RE_OFF; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2581 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2582 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2583 // Add the found match in ht_match[mtt] and ga_match[mtt]. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2584 // Store the info we need later, which depends on the kind of |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2585 // tags we are dealing with. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2586 if (st->help_only) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2587 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2588 #ifdef FEAT_MULTI_LANG |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2589 # define ML_EXTRA 3 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2590 #else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2591 # define ML_EXTRA 0 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2592 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2593 // Append the help-heuristic number after the tagname, for |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2594 // sorting it later. The heuristic is ignored for |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2595 // detecting duplicates. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2596 // The format is {tagname}@{lang}NUL{heuristic}NUL |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2597 *tagpp->tagname_end = NUL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2598 len = (int)(tagpp->tagname_end - tagpp->tagname); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2599 mfp = alloc(sizeof(char_u) + len + 10 + ML_EXTRA + 1); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2600 if (mfp != NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2601 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2602 int heuristic; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2603 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2604 p = mfp; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2605 STRCPY(p, tagpp->tagname); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2606 #ifdef FEAT_MULTI_LANG |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2607 p[len] = '@'; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2608 STRCPY(p + len + 1, st->help_lang); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2609 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2610 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2611 heuristic = help_heuristic(tagpp->tagname, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2612 margs->match_re ? margs->matchoff : 0, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2613 !margs->match_no_ic); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2614 #ifdef FEAT_MULTI_LANG |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2615 heuristic += st->help_pri; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2616 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2617 sprintf((char *)p + len + 1 + ML_EXTRA, "%06d", |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2618 heuristic); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2619 } |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2620 *tagpp->tagname_end = TAB; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2621 } |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2622 else if (name_only) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2623 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2624 if (st->get_searchpat) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2625 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2626 char_u *temp_end = tagpp->command; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2627 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2628 if (*temp_end == '/') |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2629 while (*temp_end && *temp_end != '\r' |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2630 && *temp_end != '\n' |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2631 && *temp_end != '$') |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2632 temp_end++; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2633 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2634 if (tagpp->command + 2 < temp_end) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2635 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2636 len = (int)(temp_end - tagpp->command - 2); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2637 mfp = alloc(len + 2); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2638 if (mfp != NULL) |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2639 vim_strncpy(mfp, tagpp->command + 2, len); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2640 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2641 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2642 mfp = NULL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2643 st->get_searchpat = FALSE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2644 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2645 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2646 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2647 len = (int)(tagpp->tagname_end - tagpp->tagname); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2648 mfp = alloc(sizeof(char_u) + len + 1); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2649 if (mfp != NULL) |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2650 vim_strncpy(mfp, tagpp->tagname, len); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2651 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2652 // if wanted, re-read line to get long form too |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2653 if (State & INSERT) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2654 st->get_searchpat = p_sft; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2655 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2656 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2657 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2658 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2659 size_t tag_fname_len = STRLEN(st->tag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2660 #ifdef FEAT_EMACS_TAGS |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2661 size_t ebuf_len = 0; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2662 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2663 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2664 // Save the tag in a buffer. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2665 // Use 0x02 to separate fields (Can't use NUL because the |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2666 // hash key is terminated by NUL, or Ctrl_A because that is |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2667 // part of some Emacs tag files -- see parse_tag_line). |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2668 // Emacs tag: <mtt><tag_fname><0x02><ebuf><0x02><lbuf><NUL> |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2669 // other tag: <mtt><tag_fname><0x02><0x02><lbuf><NUL> |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2670 // without Emacs tags: <mtt><tag_fname><0x02><lbuf><NUL> |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2671 // Here <mtt> is the "mtt" value plus 1 to avoid NUL. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2672 len = (int)tag_fname_len + (int)STRLEN(st->lbuf) + 3; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2673 #ifdef FEAT_EMACS_TAGS |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2674 if (st->is_etag) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2675 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2676 ebuf_len = STRLEN(st->ebuf); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2677 len += (int)ebuf_len + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2678 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2679 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2680 ++len; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2681 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2682 mfp = alloc(sizeof(char_u) + len + 1); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2683 if (mfp != NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2684 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2685 p = mfp; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2686 p[0] = mtt + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2687 STRCPY(p + 1, st->tag_fname); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2688 #ifdef BACKSLASH_IN_FILENAME |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2689 // Ignore differences in slashes, avoid adding |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2690 // both path/file and path\file. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2691 slash_adjust(p + 1); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2692 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2693 p[tag_fname_len + 1] = TAG_SEP; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2694 s = p + 1 + tag_fname_len + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2695 #ifdef FEAT_EMACS_TAGS |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2696 if (st->is_etag) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2697 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2698 STRCPY(s, st->ebuf); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2699 s[ebuf_len] = TAG_SEP; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2700 s += ebuf_len + 1; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2701 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2702 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2703 *s++ = TAG_SEP; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2704 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2705 STRCPY(s, st->lbuf); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2706 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2707 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2708 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2709 if (mfp != NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2710 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2711 hashitem_T *hi; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2712 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2713 // Don't add identical matches. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2714 // Add all cscope tags, because they are all listed. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2715 // "mfp" is used as a hash key, there is a NUL byte to end |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2716 // the part that matters for comparing, more bytes may |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2717 // follow after it. E.g. help tags store the priority |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2718 // after the NUL. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2719 #ifdef FEAT_CSCOPE |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2720 if (use_cscope) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2721 ++*hash; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2722 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2723 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2724 *hash = hash_hash(mfp); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2725 hi = hash_lookup(&st->ht_match[mtt], mfp, *hash); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2726 if (HASHITEM_EMPTY(hi)) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2727 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2728 if (hash_add_item(&st->ht_match[mtt], hi, mfp, *hash) == FAIL |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2729 || ga_grow(&st->ga_match[mtt], 1) != OK) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2730 { |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2731 // Out of memory! Just forget about the rest. |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2732 st->stop_searching = TRUE; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2733 return FAIL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2734 } |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2735 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2736 ((char_u **)(st->ga_match[mtt].ga_data)) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2737 [st->ga_match[mtt].ga_len++] = mfp; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2738 st->match_count++; |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2739 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2740 else |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2741 // duplicate tag, drop it |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2742 vim_free(mfp); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2743 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2744 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2745 return OK; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2746 } |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2747 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2748 /* |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2749 * Read and get all the tags from file st->tag_fname. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2750 * Returns OK if all the tags are processed successfully and FAIL is a tag |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2751 * format error is encountered. |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2752 */ |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2753 static int |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2754 findtags_get_all_tags( |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2755 findtags_state_T *st, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2756 findtags_match_args_T *margs, |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2757 char_u *buf_ffname) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2758 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2759 tagptrs_T tagp; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2760 tagsearch_info_T search_info; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2761 int retval; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2762 #ifdef FEAT_CSCOPE |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2763 int use_cscope = (st->flags & TAG_CSCOPE); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2764 #endif |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2765 hash_T hash = 0; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2766 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2767 // This is only to avoid a compiler warning for using search_info |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2768 // uninitialised. |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2769 CLEAR_FIELD(search_info); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2770 |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2771 // Read and parse the lines in the file one by one |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2772 for (;;) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2773 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2774 // check for CTRL-C typed, more often when jumping around |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2775 if (st->state == TS_BINARY || st->state == TS_SKIP_BACK) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2776 line_breakcheck(); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2777 else |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2778 fast_breakcheck(); |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2779 if ((st->flags & TAG_INS_COMP)) // Double brackets for gcc |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2780 ins_compl_check_keys(30, FALSE); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2781 if (got_int || ins_compl_interrupted()) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2782 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2783 st->stop_searching = TRUE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2784 break; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2785 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2786 // When mincount is TAG_MANY, stop when enough matches have been |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2787 // found (for completion). |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2788 if (st->mincount == TAG_MANY && st->match_count >= TAG_MANY) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2789 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2790 st->stop_searching = TRUE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2791 break; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2792 } |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2793 if (st->get_searchpat) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2794 goto line_read_in; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2795 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2796 retval = findtags_get_next_line(st, &search_info); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2797 if (retval == TAGS_READ_IGNORE) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2798 continue; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2799 if (retval == TAGS_READ_EOF) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2800 break; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2801 |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2802 line_read_in: |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2803 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2804 if (st->vimconv.vc_type != CONV_NONE) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2805 findtags_string_convert(st); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2806 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2807 #ifdef FEAT_EMACS_TAGS |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2808 // Emacs tags line with CTRL-L: New file name on next line. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2809 // The file name is followed by a ','. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2810 // Remember etag file name in ebuf. |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2811 if (*st->lbuf == Ctrl_L |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2812 # ifdef FEAT_CSCOPE |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2813 && !use_cscope |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2814 # endif |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2815 ) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2816 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2817 st->is_etag = TRUE; // in case at the start |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2818 st->state = TS_LINEAR; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2819 emacs_tags_new_filename(st); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2820 continue; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2821 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2822 #endif |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2823 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2824 // When still at the start of the file, check for Emacs tags file |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2825 // format, and for "not sorted" flag. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2826 if (st->state == TS_START) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2827 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2828 if (findtags_start_state_handler(st, &margs->sortic, &search_info) == FALSE) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2829 continue; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2830 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2831 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2832 // When the line is too long the NUL will not be in the |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2833 // last-but-one byte (see vim_fgets()). |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2834 // Has been reported for Mozilla JS with extremely long names. |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2835 // In that case we need to increase lbuf_size. |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2836 if (st->lbuf[st->lbuf_size - 2] != NUL |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2837 #ifdef FEAT_CSCOPE |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2838 && !use_cscope |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2839 #endif |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2840 ) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2841 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2842 st->lbuf_size *= 2; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2843 vim_free(st->lbuf); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2844 st->lbuf = alloc(st->lbuf_size); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2845 if (st->lbuf == NULL) |
27942
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
2846 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2847 if (st->fp != NULL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2848 fclose(st->fp); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2849 break; |
27942
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
2850 } |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2851 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2852 if (st->state == TS_STEP_FORWARD) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2853 // Seek to the same position to read the same line again |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2854 vim_fseek(st->fp, search_info.curr_offset, SEEK_SET); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2855 // this will try the same thing again, make sure the offset is |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2856 // different |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2857 search_info.curr_offset = 0; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2858 continue; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2859 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2860 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2861 if (findtags_parse_line(st, &tagp) == FAIL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2862 return FAIL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2863 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2864 retval = findtags_match_tag(st, &tagp, margs, &search_info); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2865 if (retval == TAG_MATCH_NEXT) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2866 continue; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2867 if (retval == TAG_MATCH_STOP) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2868 break; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2869 |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2870 // If a match is found, add it to ht_match[] and ga_match[]. |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2871 if (retval == TAG_MATCH_SUCCESS) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2872 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2873 if (findtags_add_match(st, &tagp, margs, buf_ffname, &hash) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2874 == FAIL) |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2875 break; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2876 } |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2877 } // forever |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2878 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2879 return OK; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2880 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2881 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2882 /* |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2883 * Search for tags matching 'st->orgpat.pat' in the 'st->tag_fname' tags file. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2884 * Information needed to search for the tags is in the 'st' state structure. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2885 * The matching tags are returned in 'st'. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2886 * Returns OK if successfully processed the file and FAIL on memory allocation |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2887 * failure. |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2888 */ |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2889 static int |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2890 findtags_in_file(findtags_state_T *st, char_u *buf_ffname) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2891 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2892 findtags_match_args_T margs; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2893 int line_error = FALSE; // syntax error |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2894 #ifdef FEAT_CSCOPE |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2895 int use_cscope = FALSE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2896 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2897 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2898 st->vimconv.vc_type = CONV_NONE; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2899 st->tag_file_sorted = NUL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2900 st->fp = NULL; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2901 findtags_matchargs_init(&margs, st->flags); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2902 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2903 // A file that doesn't exist is silently ignored. Only when not a |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2904 // single file is found, an error message is given (further on). |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2905 #ifdef FEAT_CSCOPE |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2906 use_cscope = (st->flags & TAG_CSCOPE); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2907 if (use_cscope) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2908 st->fp = NULL; // avoid GCC warning |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2909 else |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2910 #endif |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2911 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2912 #ifdef FEAT_MULTI_LANG |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2913 if (curbuf->b_help) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2914 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2915 if (!findtags_in_help_init(st)) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2916 return OK; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2917 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2918 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2919 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2920 st->fp = mch_fopen((char *)st->tag_fname, "r"); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2921 if (st->fp == NULL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2922 return OK; |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2923 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2924 if (p_verbose >= 5) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2925 { |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2926 verbose_enter(); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2927 smsg(_("Searching tags file %s"), st->tag_fname); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2928 verbose_leave(); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2929 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2930 } |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2931 st->did_open = TRUE; // remember that we found at least one file |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2932 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2933 st->state = TS_START; // we're at the start of the file |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2934 #ifdef FEAT_EMACS_TAGS |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2935 st->is_etag = FALSE; // default is: not emacs style |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2936 #endif |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2937 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2938 // Read and parse the lines in the file one by one |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2939 if (findtags_get_all_tags(st, &margs, buf_ffname) == FAIL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2940 line_error = TRUE; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2941 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2942 if (line_error) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2943 { |
27942
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
2944 semsg(_(e_format_error_in_tags_file_str), st->tag_fname); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2945 #ifdef FEAT_CSCOPE |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2946 if (!use_cscope) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2947 #endif |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2948 semsg(_("Before byte %ld"), (long)vim_ftell(st->fp)); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2949 st->stop_searching = TRUE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2950 line_error = FALSE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2951 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2952 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2953 if (st->fp != NULL) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2954 fclose(st->fp); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2955 #ifdef FEAT_EMACS_TAGS |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
2956 emacs_tags_incstack_free(); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2957 #endif |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2958 if (st->vimconv.vc_type != CONV_NONE) |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2959 convert_setup(&st->vimconv, NULL, NULL); |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2960 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2961 if (margs.sort_error) |
27942
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
2962 semsg(_(e_tags_file_not_sorted_str), st->tag_fname); |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2963 |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2964 // Stop searching if sufficient tags have been found. |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2965 if (st->match_count >= st->mincount) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2966 st->stop_searching = TRUE; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2967 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2968 return OK; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2969 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2970 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2971 /* |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2972 * Copy the tags found by find_tags() to 'matchesp'. |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2973 * Returns the number of matches copied. |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2974 */ |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2975 static int |
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2976 findtags_copy_matches(findtags_state_T *st, char_u ***matchesp) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2977 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2978 int name_only = (st->flags & TAG_NAMES); |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2979 char_u **matches; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2980 int mtt; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2981 int i; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2982 char_u *mfp; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2983 char_u *p; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2984 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2985 if (st->match_count > 0) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2986 matches = ALLOC_MULT(char_u *, st->match_count); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2987 else |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2988 matches = NULL; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2989 st->match_count = 0; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2990 for (mtt = 0; mtt < MT_COUNT; ++mtt) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2991 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2992 for (i = 0; i < st->ga_match[mtt].ga_len; ++i) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2993 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2994 mfp = ((char_u **)(st->ga_match[mtt].ga_data))[i]; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2995 if (matches == NULL) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2996 vim_free(mfp); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2997 else |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
2998 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
2999 if (!name_only) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3000 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3001 // Change mtt back to zero-based. |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3002 *mfp = *mfp - 1; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3003 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3004 // change the TAG_SEP back to NUL |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3005 for (p = mfp + 1; *p != NUL; ++p) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3006 if (*p == TAG_SEP) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3007 *p = NUL; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3008 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3009 matches[st->match_count++] = mfp; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3010 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3011 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3012 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3013 ga_clear(&st->ga_match[mtt]); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3014 hash_clear(&st->ht_match[mtt]); |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3015 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3016 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3017 *matchesp = matches; |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
3018 return st->match_count; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3019 } |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3020 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3021 /* |
7 | 3022 * find_tags() - search for tags in tags files |
3023 * | |
3024 * Return FAIL if search completely failed (*num_matches will be 0, *matchesp | |
3025 * will be NULL), OK otherwise. | |
3026 * | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3027 * Priority depending on which type of tag is recognized: |
7 | 3028 * 6. A static or global tag with a full matching tag for the current file. |
3029 * 5. A global tag with a full matching tag for another file. | |
3030 * 4. A static tag with a full matching tag for another file. | |
3031 * 3. A static or global tag with an ignore-case matching tag for the | |
3032 * current file. | |
3033 * 2. A global tag with an ignore-case matching tag for another file. | |
3034 * 1. A static tag with an ignore-case matching tag for another file. | |
3035 * | |
3036 * Tags in an emacs-style tags file are always global. | |
3037 * | |
3038 * flags: | |
3039 * TAG_HELP only search for help tags | |
3040 * TAG_NAMES only return name of tag | |
3041 * TAG_REGEXP use "pat" as a regexp | |
3042 * TAG_NOIC don't always ignore case | |
3043 * TAG_KEEP_LANG keep language | |
10666
ed6f03535745
patch 8.0.0223: Coverity warns for an uninitialized variable
Christian Brabandt <cb@256bit.org>
parents:
10654
diff
changeset
|
3044 * TAG_CSCOPE use cscope results for tags |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3045 * TAG_NO_TAGFUNC do not call the 'tagfunc' function |
7 | 3046 */ |
3047 int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3048 find_tags( |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3049 char_u *pat, // pattern to search for |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3050 int *num_matches, // return: number of matches found |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3051 char_u ***matchesp, // return: array of matches found |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3052 int flags, |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
3053 int mincount, // MAXCOL: find all matches |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3054 // other: minimal number of matches |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3055 char_u *buf_ffname) // name of buffer for priority |
7 | 3056 { |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3057 findtags_state_T st; |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3058 tagname_T tn; // info for get_tagfname() |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3059 int first_file; // trying first tag file |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3060 int retval = FAIL; // return value |
7 | 3061 int round; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3062 |
5513 | 3063 int save_emsg_off; |
7 | 3064 |
3065 int help_save; | |
3066 #ifdef FEAT_MULTI_LANG | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3067 int i; |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3068 char_u *saved_pat = NULL; // copy of pat[] |
7 | 3069 #endif |
3070 | |
3071 int findall = (mincount == MAXCOL || mincount == TAG_MANY); | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3072 // find all matching tags |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3073 int has_re = (flags & TAG_REGEXP); // regexp used |
7 | 3074 int noic = (flags & TAG_NOIC); |
3075 #ifdef FEAT_CSCOPE | |
3076 int use_cscope = (flags & TAG_CSCOPE); | |
3077 #endif | |
3078 int verbose = (flags & TAG_VERBOSE); | |
7266
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3079 int save_p_ic = p_ic; |
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3080 |
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3081 /* |
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3082 * Change the value of 'ignorecase' according to 'tagcase' for the |
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3083 * duration of this function. |
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3084 */ |
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3085 switch (curbuf->b_tc_flags ? curbuf->b_tc_flags : tc_flags) |
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3086 { |
10444
2edda415c28a
commit https://github.com/vim/vim/commit/6dbf66aa3e2197ce41f2b1cc7602bb9c15840548
Christian Brabandt <cb@256bit.org>
parents:
10430
diff
changeset
|
3087 case TC_FOLLOWIC: break; |
9913
bb00c661b3a4
commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents:
9850
diff
changeset
|
3088 case TC_IGNORE: p_ic = TRUE; break; |
bb00c661b3a4
commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents:
9850
diff
changeset
|
3089 case TC_MATCH: p_ic = FALSE; break; |
bb00c661b3a4
commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents:
9850
diff
changeset
|
3090 case TC_FOLLOWSCS: p_ic = ignorecase(pat); break; |
bb00c661b3a4
commit https://github.com/vim/vim/commit/66e29d7112e437b2b50efe1f82c7e892736d23e4
Christian Brabandt <cb@256bit.org>
parents:
9850
diff
changeset
|
3091 case TC_SMART: p_ic = ignorecase_opt(pat, TRUE, TRUE); break; |
7266
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3092 } |
7 | 3093 |
3094 help_save = curbuf->b_help; | |
3095 | |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3096 if (findtags_state_init(&st, pat, flags, mincount) == FAIL) |
7 | 3097 goto findtag_end; |
3098 | |
3099 #ifdef FEAT_CSCOPE | |
27942
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
3100 STRCPY(st.tag_fname, "from cscope"); // for error messages |
7 | 3101 #endif |
3102 | |
3103 /* | |
3104 * Initialize a few variables | |
3105 */ | |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3106 if (st.help_only) // want tags from help file |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3107 curbuf->b_help = TRUE; // will be restored later |
10666
ed6f03535745
patch 8.0.0223: Coverity warns for an uninitialized variable
Christian Brabandt <cb@256bit.org>
parents:
10654
diff
changeset
|
3108 #ifdef FEAT_CSCOPE |
ed6f03535745
patch 8.0.0223: Coverity warns for an uninitialized variable
Christian Brabandt <cb@256bit.org>
parents:
10654
diff
changeset
|
3109 else if (use_cscope) |
ed6f03535745
patch 8.0.0223: Coverity warns for an uninitialized variable
Christian Brabandt <cb@256bit.org>
parents:
10654
diff
changeset
|
3110 { |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3111 // Make sure we don't mix help and cscope, confuses Coverity. |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3112 st.help_only = FALSE; |
10666
ed6f03535745
patch 8.0.0223: Coverity warns for an uninitialized variable
Christian Brabandt <cb@256bit.org>
parents:
10654
diff
changeset
|
3113 curbuf->b_help = FALSE; |
ed6f03535745
patch 8.0.0223: Coverity warns for an uninitialized variable
Christian Brabandt <cb@256bit.org>
parents:
10654
diff
changeset
|
3114 } |
ed6f03535745
patch 8.0.0223: Coverity warns for an uninitialized variable
Christian Brabandt <cb@256bit.org>
parents:
10654
diff
changeset
|
3115 #endif |
7 | 3116 |
3117 #ifdef FEAT_MULTI_LANG | |
3118 if (curbuf->b_help) | |
3119 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3120 // When "@ab" is specified use only the "ab" language, otherwise |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3121 // search all languages. |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3122 if (st.orgpat.len > 3 && pat[st.orgpat.len - 3] == '@' |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3123 && ASCII_ISALPHA(pat[st.orgpat.len - 2]) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3124 && ASCII_ISALPHA(pat[st.orgpat.len - 1])) |
7 | 3125 { |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3126 saved_pat = vim_strnsave(pat, st.orgpat.len - 3); |
7 | 3127 if (saved_pat != NULL) |
3128 { | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3129 st.help_lang_find = &pat[st.orgpat.len - 2]; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3130 st.orgpat.pat = saved_pat; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3131 st.orgpat.len -= 3; |
7 | 3132 } |
3133 } | |
3134 } | |
3135 #endif | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3136 if (p_tl != 0 && st.orgpat.len > p_tl) // adjust for 'taglength' |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3137 st.orgpat.len = p_tl; |
3131 | 3138 |
5513 | 3139 save_emsg_off = emsg_off; |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3140 emsg_off = TRUE; // don't want error for invalid RE here |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3141 prepare_pats(&st.orgpat, has_re); |
5513 | 3142 emsg_off = save_emsg_off; |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3143 if (has_re && st.orgpat.regmatch.regprog == NULL) |
3784 | 3144 goto findtag_end; |
7 | 3145 |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3146 #ifdef FEAT_EVAL |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
3147 retval = findtags_apply_tfu(&st, pat, buf_ffname); |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3148 if (retval != NOTDONE) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3149 goto findtag_end; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3150 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3151 // re-initialize the default return value |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3152 retval = FAIL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3153 #endif |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3154 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3155 #ifdef FEAT_MULTI_LANG |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3156 // Set a flag if the file extension is .txt |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3157 if ((flags & TAG_KEEP_LANG) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3158 && st.help_lang_find == NULL |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3159 && curbuf->b_fname != NULL |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3160 && (i = (int)STRLEN(curbuf->b_fname)) > 4 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3161 && STRICMP(curbuf->b_fname + i - 4, ".txt") == 0) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3162 st.is_txt = TRUE; |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3163 #endif |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3164 |
413 | 3165 /* |
3166 * When finding a specified number of matches, first try with matching | |
3167 * case, so binary search can be used, and try ignore-case matches in a | |
3168 * second loop. | |
3169 * When finding all matches, 'tagbsearch' is off, or there is no fixed | |
3170 * string to look for, ignore case right away to avoid going though the | |
3171 * tags files twice. | |
3172 * When the tag file is case-fold sorted, it is either one or the other. | |
3173 * Only ignore case when TAG_NOIC not used or 'ignorecase' set. | |
3174 */ | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3175 st.orgpat.regmatch.rm_ic = ((p_ic || !noic) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3176 && (findall || st.orgpat.headlen == 0 || !p_tbs)); |
7 | 3177 for (round = 1; round <= 2; ++round) |
3178 { | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3179 st.linear = (st.orgpat.headlen == 0 || !p_tbs || round == 2); |
7 | 3180 |
3181 /* | |
3182 * Try tag file names from tags option one by one. | |
3183 */ | |
3184 for (first_file = TRUE; | |
3185 #ifdef FEAT_CSCOPE | |
3186 use_cscope || | |
3187 #endif | |
27942
4a76119d6372
patch 8.2.4496: Coverity gives warnings after tags code refactoring
Bram Moolenaar <Bram@vim.org>
parents:
27938
diff
changeset
|
3188 get_tagfname(&tn, first_file, st.tag_fname) == OK; |
692 | 3189 first_file = FALSE) |
7 | 3190 { |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
3191 if (findtags_in_file(&st, buf_ffname) == FAIL) |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3192 goto findtag_end; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3193 if (st.stop_searching |
7 | 3194 #ifdef FEAT_CSCOPE |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3195 || use_cscope |
7 | 3196 #endif |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3197 ) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3198 { |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3199 retval = OK; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3200 break; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3201 } |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3202 } // end of for-each-file loop |
7 | 3203 |
692 | 3204 #ifdef FEAT_CSCOPE |
3205 if (!use_cscope) | |
3206 #endif | |
3207 tagname_free(&tn); | |
3208 | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3209 // stop searching when already did a linear search, or when TAG_NOIC |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3210 // used, and 'ignorecase' not set or already did case-ignore search |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3211 if (st.stop_searching || st.linear || (!p_ic && noic) || |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3212 st.orgpat.regmatch.rm_ic) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3213 break; |
7 | 3214 # ifdef FEAT_CSCOPE |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3215 if (use_cscope) |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3216 break; |
7 | 3217 # endif |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3218 |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3219 // try another time while ignoring case |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3220 st.orgpat.regmatch.rm_ic = TRUE; |
7 | 3221 } |
3222 | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3223 if (!st.stop_searching) |
7 | 3224 { |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3225 if (!st.did_open && verbose) // never opened any tags file |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
3226 emsg(_(e_no_tags_file)); |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3227 retval = OK; // It's OK even when no tag found |
7 | 3228 } |
3229 | |
3230 findtag_end: | |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3231 findtags_state_free(&st); |
7 | 3232 |
3233 /* | |
11008
0ecd07cd2e43
patch 8.0.0393: order of duplicate tags is not preserved
Christian Brabandt <cb@256bit.org>
parents:
10666
diff
changeset
|
3234 * Move the matches from the ga_match[] arrays into one list of |
7 | 3235 * matches. When retval == FAIL, free the matches. |
3236 */ | |
3237 if (retval == FAIL) | |
27938
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3238 st.match_count = 0; |
b65a50d2fa4f
patch 8.2.4494: the find_tags() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27426
diff
changeset
|
3239 |
28027
d59552ad3f36
patch 8.2.4538: the find_tags_in_file() function is too long
Bram Moolenaar <Bram@vim.org>
parents:
27986
diff
changeset
|
3240 *num_matches = findtags_copy_matches(&st, matchesp); |
7 | 3241 |
3242 curbuf->b_help = help_save; | |
3243 #ifdef FEAT_MULTI_LANG | |
3244 vim_free(saved_pat); | |
3245 #endif | |
3246 | |
7266
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3247 p_ic = save_p_ic; |
6ba7182fb7bd
commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents:
6851
diff
changeset
|
3248 |
7 | 3249 return retval; |
3250 } | |
3251 | |
3252 static garray_T tag_fnames = GA_EMPTY; | |
3253 | |
3254 /* | |
3255 * Callback function for finding all "tags" and "tags-??" files in | |
3256 * 'runtimepath' doc directories. | |
3257 */ | |
3258 static void | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3259 found_tagfile_cb(char_u *fname, void *cookie UNUSED) |
7 | 3260 { |
3261 if (ga_grow(&tag_fnames, 1) == OK) | |
14232
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3262 { |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3263 char_u *tag_fname = vim_strsave(fname); |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3264 |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3265 #ifdef BACKSLASH_IN_FILENAME |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3266 slash_adjust(tag_fname); |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3267 #endif |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3268 simplify_filename(tag_fname); |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3269 ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] = tag_fname; |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3270 } |
7 | 3271 } |
3272 | |
359 | 3273 #if defined(EXITFREE) || defined(PROTO) |
3274 void | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3275 free_tag_stuff(void) |
359 | 3276 { |
692 | 3277 ga_clear_strings(&tag_fnames); |
16511
4182f74e2965
patch 8.1.1259: crash when exiting early
Bram Moolenaar <Bram@vim.org>
parents:
16461
diff
changeset
|
3278 if (curwin != NULL) |
4182f74e2965
patch 8.1.1259: crash when exiting early
Bram Moolenaar <Bram@vim.org>
parents:
16461
diff
changeset
|
3279 do_tag(NULL, DT_FREE, 0, 0, 0); |
1818 | 3280 tag_freematch(); |
3281 | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
3282 # if defined(FEAT_QUICKFIX) |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3283 tagstack_clear_entry(&ptag_entry); |
1818 | 3284 # endif |
359 | 3285 } |
3286 #endif | |
3287 | |
7 | 3288 /* |
3289 * Get the next name of a tag file from the tag file list. | |
3290 * For help files, use "tags" file only. | |
3291 * | |
3292 * Return FAIL if no more tag file names, OK otherwise. | |
3293 */ | |
514 | 3294 int |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3295 get_tagfname( |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3296 tagname_T *tnp, // holds status info |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3297 int first, // TRUE when first file name is wanted |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3298 char_u *buf) // pointer to buffer of MAXPATHL chars |
7 | 3299 { |
3300 char_u *fname = NULL; | |
3301 char_u *r_ptr; | |
14232
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3302 int i; |
7 | 3303 |
692 | 3304 if (first) |
20007
aadd1cae2ff5
patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents:
19892
diff
changeset
|
3305 CLEAR_POINTER(tnp); |
692 | 3306 |
514 | 3307 if (curbuf->b_help) |
7 | 3308 { |
514 | 3309 /* |
3310 * For help files it's done in a completely different way: | |
3311 * Find "doc/tags" and "doc/tags-??" in all directories in | |
3312 * 'runtimepath'. | |
3313 */ | |
3314 if (first) | |
7 | 3315 { |
3316 ga_clear_strings(&tag_fnames); | |
27028
c9474ae175f4
patch 8.2.4043: using int for second argument of ga_init2()
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
3317 ga_init2(&tag_fnames, sizeof(char_u *), 10); |
7 | 3318 do_in_runtimepath((char_u *) |
3319 #ifdef FEAT_MULTI_LANG | |
36 | 3320 # ifdef VMS |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3321 // Functions decc$to_vms() and decc$translate_vms() crash |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3322 // on some VMS systems with wildcards "??". Seems ECO |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3323 // patches do fix the problem in C RTL, but we can't use |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3324 // an #ifdef for that. |
36 | 3325 "doc/tags doc/tags-*" |
3326 # else | |
7 | 3327 "doc/tags doc/tags-??" |
36 | 3328 # endif |
7 | 3329 #else |
3330 "doc/tags" | |
3331 #endif | |
8524
2f57bbe870ea
commit https://github.com/vim/vim/commit/7f8989dd8a627af2185df381195351a913f3777f
Christian Brabandt <cb@256bit.org>
parents:
7835
diff
changeset
|
3332 , DIP_ALL, found_tagfile_cb, NULL); |
7 | 3333 } |
602 | 3334 |
692 | 3335 if (tnp->tn_hf_idx >= tag_fnames.ga_len) |
7 | 3336 { |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3337 // Not found in 'runtimepath', use 'helpfile', if it exists and |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3338 // wasn't used yet, replacing "help.txt" with "tags". |
692 | 3339 if (tnp->tn_hf_idx > tag_fnames.ga_len || *p_hf == NUL) |
7 | 3340 return FAIL; |
692 | 3341 ++tnp->tn_hf_idx; |
7 | 3342 STRCPY(buf, p_hf); |
3343 STRCPY(gettail(buf), "tags"); | |
14232
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3344 #ifdef BACKSLASH_IN_FILENAME |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3345 slash_adjust(buf); |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3346 #endif |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3347 simplify_filename(buf); |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3348 |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3349 for (i = 0; i < tag_fnames.ga_len; ++i) |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3350 if (STRCMP(buf, ((char_u **)(tag_fnames.ga_data))[i]) == 0) |
4afe2386aae8
patch 8.1.0133: tagfiles() can have duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13792
diff
changeset
|
3351 return FAIL; // avoid duplicate file names |
7 | 3352 } |
3353 else | |
692 | 3354 vim_strncpy(buf, ((char_u **)(tag_fnames.ga_data))[ |
3355 tnp->tn_hf_idx++], MAXPATHL - 1); | |
514 | 3356 return OK; |
3357 } | |
3358 | |
3359 if (first) | |
3360 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3361 // Init. We make a copy of 'tags', because autocommands may change |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3362 // the value without notifying us. |
692 | 3363 tnp->tn_tags = vim_strsave((*curbuf->b_p_tags != NUL) |
3364 ? curbuf->b_p_tags : p_tags); | |
3365 if (tnp->tn_tags == NULL) | |
3366 return FAIL; | |
3367 tnp->tn_np = tnp->tn_tags; | |
7 | 3368 } |
692 | 3369 |
3370 /* | |
3371 * Loop until we have found a file name that can be used. | |
3372 * There are two states: | |
3373 * tnp->tn_did_filefind_init == FALSE: setup for next part in 'tags'. | |
3374 * tnp->tn_did_filefind_init == TRUE: find next file in this part. | |
3375 */ | |
3376 for (;;) | |
7 | 3377 { |
692 | 3378 if (tnp->tn_did_filefind_init) |
7 | 3379 { |
692 | 3380 fname = vim_findfile(tnp->tn_search_ctx); |
3381 if (fname != NULL) | |
3382 break; | |
3383 | |
3384 tnp->tn_did_filefind_init = FALSE; | |
3385 } | |
3386 else | |
3387 { | |
3388 char_u *filename = NULL; | |
3389 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3390 // Stop when used all parts of 'tags'. |
692 | 3391 if (*tnp->tn_np == NUL) |
7 | 3392 { |
692 | 3393 vim_findfile_cleanup(tnp->tn_search_ctx); |
3394 tnp->tn_search_ctx = NULL; | |
3395 return FAIL; | |
7 | 3396 } |
692 | 3397 |
3398 /* | |
3399 * Copy next file name into buf. | |
3400 */ | |
3401 buf[0] = NUL; | |
3402 (void)copy_option_part(&tnp->tn_np, buf, MAXPATHL - 1, " ,"); | |
7 | 3403 |
3404 #ifdef FEAT_PATH_EXTRA | |
692 | 3405 r_ptr = vim_findfile_stopdir(buf); |
7 | 3406 #else |
692 | 3407 r_ptr = NULL; |
7 | 3408 #endif |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3409 // move the filename one char forward and truncate the |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3410 // filepath with a NUL |
692 | 3411 filename = gettail(buf); |
1620 | 3412 STRMOVE(filename + 1, filename); |
692 | 3413 *filename++ = NUL; |
3414 | |
3415 tnp->tn_search_ctx = vim_findfile_init(buf, filename, | |
3416 r_ptr, 100, | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3417 FALSE, // don't free visited list |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3418 FINDFILE_FILE, // we search for a file |
692 | 3419 tnp->tn_search_ctx, TRUE, curbuf->b_ffname); |
3420 if (tnp->tn_search_ctx != NULL) | |
3421 tnp->tn_did_filefind_init = TRUE; | |
7 | 3422 } |
3423 } | |
3424 | |
692 | 3425 STRCPY(buf, fname); |
3426 vim_free(fname); | |
7 | 3427 return OK; |
3428 } | |
3429 | |
3430 /* | |
692 | 3431 * Free the contents of a tagname_T that was filled by get_tagfname(). |
3432 */ | |
3433 void | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3434 tagname_free(tagname_T *tnp) |
692 | 3435 { |
3436 vim_free(tnp->tn_tags); | |
3437 vim_findfile_cleanup(tnp->tn_search_ctx); | |
1541 | 3438 tnp->tn_search_ctx = NULL; |
692 | 3439 ga_clear_strings(&tag_fnames); |
3440 } | |
3441 | |
3442 /* | |
7 | 3443 * Parse one line from the tags file. Find start/end of tag name, start/end of |
3444 * file name and start of search pattern. | |
3445 * | |
3446 * If is_etag is TRUE, tagp->fname and tagp->fname_end are not set. | |
3447 * | |
3448 * Return FAIL if there is a format error in this line, OK otherwise. | |
3449 */ | |
3450 static int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3451 parse_tag_line( |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3452 char_u *lbuf, // line to be parsed |
7 | 3453 #ifdef FEAT_EMACS_TAGS |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3454 int is_etag, |
7 | 3455 #endif |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3456 tagptrs_T *tagp) |
7 | 3457 { |
3458 char_u *p; | |
3459 | |
3460 #ifdef FEAT_EMACS_TAGS | |
3461 if (is_etag) | |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3462 // emacs-style tag file |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3463 return emacs_tags_parse_line(lbuf, tagp); |
7 | 3464 #endif |
27974
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3465 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3466 // Isolate the tagname, from lbuf up to the first white |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3467 tagp->tagname = lbuf; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3468 p = vim_strchr(lbuf, TAB); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3469 if (p == NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3470 return FAIL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3471 tagp->tagname_end = p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3472 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3473 // Isolate file name, from first to second white space |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3474 if (*p != NUL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3475 ++p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3476 tagp->fname = p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3477 p = vim_strchr(p, TAB); |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3478 if (p == NULL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3479 return FAIL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3480 tagp->fname_end = p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3481 |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3482 // find start of search command, after second white space |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3483 if (*p != NUL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3484 ++p; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3485 if (*p == NUL) |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3486 return FAIL; |
495418c6cac8
patch 8.2.4512: the find_tags_in_file() function is much too long
Bram Moolenaar <Bram@vim.org>
parents:
27942
diff
changeset
|
3487 tagp->command = p; |
7 | 3488 |
3489 return OK; | |
3490 } | |
3491 | |
3492 /* | |
3493 * Check if tagname is a static tag | |
3494 * | |
3495 * Static tags produced by the older ctags program have the format: | |
3496 * 'file:tag file /pattern'. | |
1204 | 3497 * This is only recognized when both occurrence of 'file' are the same, to |
7 | 3498 * avoid recognizing "string::string" or ":exit". |
3499 * | |
3500 * Static tags produced by the new ctags program have the format: | |
3501 * 'tag file /pattern/;"<Tab>file:' " | |
3502 * | |
3503 * Return TRUE if it is a static tag and adjust *tagname to the real tag. | |
3504 * Return FALSE if it is not a static tag. | |
3505 */ | |
3506 static int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3507 test_for_static(tagptrs_T *tagp) |
7 | 3508 { |
3509 char_u *p; | |
3510 | |
3511 /* | |
3512 * Check for new style static tag ":...<Tab>file:[<Tab>...]" | |
3513 */ | |
3514 p = tagp->command; | |
3515 while ((p = vim_strchr(p, '\t')) != NULL) | |
3516 { | |
3517 ++p; | |
3518 if (STRNCMP(p, "file:", 5) == 0) | |
3519 return TRUE; | |
3520 } | |
3521 | |
3522 return FALSE; | |
3523 } | |
3524 | |
3525 /* | |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3526 * Returns the length of a matching tag line. |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3527 */ |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3528 static size_t |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3529 matching_line_len(char_u *lbuf) |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3530 { |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3531 char_u *p = lbuf + 1; |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3532 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3533 // does the same thing as parse_match() |
13227
b88fa651c824
patch 8.0.1488: emacs tags no longer work
Christian Brabandt <cb@256bit.org>
parents:
13068
diff
changeset
|
3534 p += STRLEN(p) + 1; |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3535 #ifdef FEAT_EMACS_TAGS |
13227
b88fa651c824
patch 8.0.1488: emacs tags no longer work
Christian Brabandt <cb@256bit.org>
parents:
13068
diff
changeset
|
3536 p += STRLEN(p) + 1; |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3537 #endif |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3538 return (p - lbuf) + STRLEN(p); |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3539 } |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3540 |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3541 /* |
7 | 3542 * Parse a line from a matching tag. Does not change the line itself. |
3543 * | |
3544 * The line that we get looks like this: | |
3545 * Emacs tag: <mtt><tag_fname><NUL><ebuf><NUL><lbuf> | |
3546 * other tag: <mtt><tag_fname><NUL><NUL><lbuf> | |
3547 * without Emacs tags: <mtt><tag_fname><NUL><lbuf> | |
3548 * | |
3549 * Return OK or FAIL. | |
3550 */ | |
3551 static int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3552 parse_match( |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3553 char_u *lbuf, // input: matching line |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3554 tagptrs_T *tagp) // output: pointers into the line |
7 | 3555 { |
3556 int retval; | |
3557 char_u *p; | |
3558 char_u *pc, *pt; | |
3559 | |
3560 tagp->tag_fname = lbuf + 1; | |
3561 lbuf += STRLEN(tagp->tag_fname) + 2; | |
3562 #ifdef FEAT_EMACS_TAGS | |
3563 if (*lbuf) | |
3564 { | |
3565 tagp->is_etag = TRUE; | |
3566 tagp->fname = lbuf; | |
3567 lbuf += STRLEN(lbuf); | |
3568 tagp->fname_end = lbuf++; | |
3569 } | |
3570 else | |
3571 { | |
3572 tagp->is_etag = FALSE; | |
3573 ++lbuf; | |
3574 } | |
3575 #endif | |
3576 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3577 // Find search pattern and the file name for non-etags. |
7 | 3578 retval = parse_tag_line(lbuf, |
3579 #ifdef FEAT_EMACS_TAGS | |
3580 tagp->is_etag, | |
3581 #endif | |
3582 tagp); | |
3583 | |
3584 tagp->tagkind = NULL; | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3585 tagp->user_data = NULL; |
18640
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3586 tagp->tagline = 0; |
7 | 3587 tagp->command_end = NULL; |
3588 | |
3589 if (retval == OK) | |
3590 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3591 // Try to find a kind field: "kind:<kind>" or just "<kind>" |
7 | 3592 p = tagp->command; |
3593 if (find_extra(&p) == OK) | |
3594 { | |
15808
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
3595 if (p > tagp->command && p[-1] == '|') |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
3596 tagp->command_end = p - 1; // drop trailing bar |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
3597 else |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
3598 tagp->command_end = p; |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3599 p += 2; // skip ";\"" |
7 | 3600 if (*p++ == TAB) |
19617
5ce724c60c4c
patch 8.2.0365: tag kind can't be a multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
19475
diff
changeset
|
3601 // Accept ASCII alphabetic kind characters and any multi-byte |
5ce724c60c4c
patch 8.2.0365: tag kind can't be a multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
19475
diff
changeset
|
3602 // character. |
5ce724c60c4c
patch 8.2.0365: tag kind can't be a multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
19475
diff
changeset
|
3603 while (ASCII_ISALPHA(*p) || mb_ptr2len(p) > 1) |
7 | 3604 { |
3605 if (STRNCMP(p, "kind:", 5) == 0) | |
3606 tagp->tagkind = p + 5; | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3607 else if (STRNCMP(p, "user_data:", 10) == 0) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3608 tagp->user_data = p + 10; |
18640
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3609 else if (STRNCMP(p, "line:", 5) == 0) |
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3610 tagp->tagline = atoi((char *)p + 5); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3611 if (tagp->tagkind != NULL && tagp->user_data != NULL) |
7 | 3612 break; |
3613 pc = vim_strchr(p, ':'); | |
3614 pt = vim_strchr(p, '\t'); | |
3615 if (pc == NULL || (pt != NULL && pc > pt)) | |
3616 tagp->tagkind = p; | |
3617 if (pt == NULL) | |
3618 break; | |
19617
5ce724c60c4c
patch 8.2.0365: tag kind can't be a multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
19475
diff
changeset
|
3619 p = pt; |
5ce724c60c4c
patch 8.2.0365: tag kind can't be a multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
19475
diff
changeset
|
3620 MB_PTR_ADV(p); |
7 | 3621 } |
3622 } | |
3623 if (tagp->tagkind != NULL) | |
3624 { | |
3625 for (p = tagp->tagkind; | |
19617
5ce724c60c4c
patch 8.2.0365: tag kind can't be a multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
19475
diff
changeset
|
3626 *p && *p != '\t' && *p != '\r' && *p != '\n'; MB_PTR_ADV(p)) |
7 | 3627 ; |
3628 tagp->tagkind_end = p; | |
3629 } | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3630 if (tagp->user_data != NULL) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3631 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3632 for (p = tagp->user_data; |
19617
5ce724c60c4c
patch 8.2.0365: tag kind can't be a multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
19475
diff
changeset
|
3633 *p && *p != '\t' && *p != '\r' && *p != '\n'; MB_PTR_ADV(p)) |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3634 ; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3635 tagp->user_data_end = p; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
3636 } |
7 | 3637 } |
3638 return retval; | |
3639 } | |
3640 | |
3641 /* | |
3642 * Find out the actual file name of a tag. Concatenate the tags file name | |
3643 * with the matching tag file name. | |
3644 * Returns an allocated string or NULL (out of memory). | |
3645 */ | |
3646 static char_u * | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3647 tag_full_fname(tagptrs_T *tagp) |
7 | 3648 { |
3649 char_u *fullname; | |
3650 int c; | |
3651 | |
3652 #ifdef FEAT_EMACS_TAGS | |
3653 if (tagp->is_etag) | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3654 c = 0; // to shut up GCC |
7 | 3655 else |
3656 #endif | |
3657 { | |
3658 c = *tagp->fname_end; | |
3659 *tagp->fname_end = NUL; | |
3660 } | |
3661 fullname = expand_tag_fname(tagp->fname, tagp->tag_fname, FALSE); | |
3662 | |
3663 #ifdef FEAT_EMACS_TAGS | |
3664 if (!tagp->is_etag) | |
3665 #endif | |
3666 *tagp->fname_end = c; | |
3667 | |
3668 return fullname; | |
3669 } | |
3670 | |
3671 /* | |
3672 * Jump to a tag that has been found in one of the tag files | |
3673 * | |
3674 * returns OK for success, NOTAGFILE when file not found, FAIL otherwise. | |
3675 */ | |
3676 static int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
3677 jumpto_tag( |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3678 char_u *lbuf_arg, // line from the tags file for this tag |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3679 int forceit, // :ta with ! |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3680 int keep_help) // keep help flag (FALSE for cscope) |
7 | 3681 { |
23505
bb29b09902d5
patch 8.2.2295: incsearch does not detect empty pattern properly
Bram Moolenaar <Bram@vim.org>
parents:
23272
diff
changeset
|
3682 optmagic_T save_magic_overruled; |
7 | 3683 int save_p_ws, save_p_scs, save_p_ic; |
3684 linenr_T save_lnum; | |
3685 char_u *str; | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3686 char_u *pbuf; // search pattern buffer |
7 | 3687 char_u *pbuf_end; |
3688 char_u *tofree_fname = NULL; | |
3689 char_u *fname; | |
3690 tagptrs_T tagp; | |
3691 int retval = FAIL; | |
11476
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3692 int getfile_result = GETFILE_UNUSED; |
7 | 3693 int search_options; |
3694 #ifdef FEAT_SEARCH_EXTRA | |
3695 int save_no_hlsearch; | |
3696 #endif | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
3697 #if defined(FEAT_QUICKFIX) |
7 | 3698 win_T *curwin_save = NULL; |
3699 #endif | |
3700 char_u *full_fname = NULL; | |
3701 #ifdef FEAT_FOLDING | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3702 int old_KeyTyped = KeyTyped; // getting the file may reset it |
7 | 3703 #endif |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3704 size_t len; |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3705 char_u *lbuf; |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3706 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3707 // Make a copy of the line, it can become invalid when an autocommand calls |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3708 // back here recursively. |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3709 len = matching_line_len(lbuf_arg) + 1; |
16782
fc58fee685e2
patch 8.1.1393: unnecessary type casts
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
3710 lbuf = alloc(len); |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3711 if (lbuf != NULL) |
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3712 mch_memmove(lbuf, lbuf_arg, len); |
7 | 3713 |
3714 pbuf = alloc(LSIZE); | |
3715 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3716 // parse the match line into the tagp structure |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3717 if (pbuf == NULL || lbuf == NULL || parse_match(lbuf, &tagp) == FAIL) |
7 | 3718 { |
3719 tagp.fname_end = NULL; | |
3720 goto erret; | |
3721 } | |
3722 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3723 // truncate the file name, so it can be used as a string |
7 | 3724 *tagp.fname_end = NUL; |
3725 fname = tagp.fname; | |
3726 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3727 // copy the command to pbuf[], remove trailing CR/NL |
7 | 3728 str = tagp.command; |
3729 for (pbuf_end = pbuf; *str && *str != '\n' && *str != '\r'; ) | |
3730 { | |
3731 #ifdef FEAT_EMACS_TAGS | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3732 if (tagp.is_etag && *str == ',')// stop at ',' after line number |
7 | 3733 break; |
3734 #endif | |
3735 *pbuf_end++ = *str++; | |
18550
90e5812af76b
patch 8.1.2269: tags file with very long line stops using binary search
Bram Moolenaar <Bram@vim.org>
parents:
18358
diff
changeset
|
3736 if (pbuf_end - pbuf + 1 >= LSIZE) |
90e5812af76b
patch 8.1.2269: tags file with very long line stops using binary search
Bram Moolenaar <Bram@vim.org>
parents:
18358
diff
changeset
|
3737 break; |
7 | 3738 } |
3739 *pbuf_end = NUL; | |
3740 | |
3741 #ifdef FEAT_EMACS_TAGS | |
3742 if (!tagp.is_etag) | |
3743 #endif | |
3744 { | |
3745 /* | |
3746 * Remove the "<Tab>fieldname:value" stuff; we don't need it here. | |
3747 */ | |
3748 str = pbuf; | |
3749 if (find_extra(&str) == OK) | |
3750 { | |
3751 pbuf_end = str; | |
3752 *pbuf_end = NUL; | |
3753 } | |
3754 } | |
3755 | |
3756 /* | |
3757 * Expand file name, when needed (for environment variables). | |
3758 * If 'tagrelative' option set, may change file name. | |
3759 */ | |
3760 fname = expand_tag_fname(fname, tagp.tag_fname, TRUE); | |
3761 if (fname == NULL) | |
3762 goto erret; | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3763 tofree_fname = fname; // free() it later |
7 | 3764 |
3765 /* | |
3766 * Check if the file with the tag exists before abandoning the current | |
3767 * file. Also accept a file name for which there is a matching BufReadCmd | |
3768 * autocommand event (e.g., http://sys/file). | |
3769 */ | |
13380
69517d67421f
patch 8.0.1564: too many #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
3770 if (mch_getperm(fname) < 0 && !has_autocmd(EVENT_BUFREADCMD, fname, NULL)) |
7 | 3771 { |
3772 retval = NOTAGFILE; | |
3773 vim_free(nofile_fname); | |
3774 nofile_fname = vim_strsave(fname); | |
3775 if (nofile_fname == NULL) | |
3776 nofile_fname = empty_option; | |
3777 goto erret; | |
3778 } | |
3779 | |
3780 ++RedrawingDisabled; | |
3781 | |
3782 #ifdef FEAT_GUI | |
3783 need_mouse_correct = TRUE; | |
3784 #endif | |
3785 | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
3786 #if defined(FEAT_QUICKFIX) |
2713 | 3787 if (g_do_tagpreview != 0) |
7 | 3788 { |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3789 postponed_split = 0; // don't split again below |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3790 curwin_save = curwin; // Save current window |
728 | 3791 |
7 | 3792 /* |
3793 * If we are reusing a window, we may change dir when | |
3794 * entering it (autocommands) so turn the tag filename | |
3795 * into a fullpath | |
3796 */ | |
3797 if (!curwin->w_p_pvw) | |
3798 { | |
3799 full_fname = FullName_save(fname, FALSE); | |
3800 fname = full_fname; | |
3801 | |
3802 /* | |
3803 * Make the preview window the current window. | |
3804 * Open a preview window when needed. | |
3805 */ | |
17767
c75da1064e33
patch 8.1.1880: cannot show extra info for completion in a popup window
Bram Moolenaar <Bram@vim.org>
parents:
17652
diff
changeset
|
3806 prepare_tagpreview(TRUE, TRUE, FALSE); |
7 | 3807 } |
3808 } | |
3809 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3810 // If it was a CTRL-W CTRL-] command split window now. For ":tab tag" |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3811 // open a new tab page. |
11476
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3812 if (postponed_split && (swb_flags & (SWB_USEOPEN | SWB_USETAB))) |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3813 { |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3814 buf_T *existing_buf = buflist_findname_exp(fname); |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3815 |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3816 if (existing_buf != NULL) |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3817 { |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3818 win_T *wp = NULL; |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3819 |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3820 if (swb_flags & SWB_USEOPEN) |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3821 wp = buf_jump_open_win(existing_buf); |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3822 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3823 // If 'switchbuf' contains "usetab": jump to first window in any tab |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3824 // page containing "existing_buf" if one exists |
11476
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3825 if (wp == NULL && (swb_flags & SWB_USETAB)) |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3826 wp = buf_jump_open_tab(existing_buf); |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3827 // We've switched to the buffer, the usual loading of the file must |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3828 // be skipped. |
11476
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3829 if (wp != NULL) |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3830 getfile_result = GETFILE_SAME_FILE; |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3831 } |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3832 } |
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3833 if (getfile_result == GETFILE_UNUSED |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
21996
diff
changeset
|
3834 && (postponed_split || cmdmod.cmod_tab != 0)) |
7 | 3835 { |
11238
5b524c2286ce
patch 8.0.0505: failed window split for :stag not handled
Christian Brabandt <cb@256bit.org>
parents:
11225
diff
changeset
|
3836 if (win_split(postponed_split > 0 ? postponed_split : 0, |
5b524c2286ce
patch 8.0.0505: failed window split for :stag not handled
Christian Brabandt <cb@256bit.org>
parents:
11225
diff
changeset
|
3837 postponed_split_flags) == FAIL) |
5b524c2286ce
patch 8.0.0505: failed window split for :stag not handled
Christian Brabandt <cb@256bit.org>
parents:
11225
diff
changeset
|
3838 { |
5b524c2286ce
patch 8.0.0505: failed window split for :stag not handled
Christian Brabandt <cb@256bit.org>
parents:
11225
diff
changeset
|
3839 --RedrawingDisabled; |
5b524c2286ce
patch 8.0.0505: failed window split for :stag not handled
Christian Brabandt <cb@256bit.org>
parents:
11225
diff
changeset
|
3840 goto erret; |
5b524c2286ce
patch 8.0.0505: failed window split for :stag not handled
Christian Brabandt <cb@256bit.org>
parents:
11225
diff
changeset
|
3841 } |
2583 | 3842 RESET_BINDING(curwin); |
7 | 3843 } |
3844 #endif | |
3845 | |
3846 if (keep_help) | |
3847 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3848 // A :ta from a help file will keep the b_help flag set. For ":ptag" |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3849 // we need to use the flag from the window where we came from. |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
3850 #if defined(FEAT_QUICKFIX) |
2713 | 3851 if (g_do_tagpreview != 0) |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
3852 keep_help_flag = bt_help(curwin_save->w_buffer); |
7 | 3853 else |
3854 #endif | |
3855 keep_help_flag = curbuf->b_help; | |
3856 } | |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
3857 |
11476
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3858 if (getfile_result == GETFILE_UNUSED) |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3859 // Careful: getfile() may trigger autocommands and call jumpto_tag() |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3860 // recursively. |
11476
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
3861 getfile_result = getfile(0, fname, NULL, TRUE, (linenr_T)0, forceit); |
7 | 3862 keep_help_flag = FALSE; |
3863 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3864 if (GETFILE_SUCCESS(getfile_result)) // got to the right file |
7 | 3865 { |
3866 curwin->w_set_curswant = TRUE; | |
3867 postponed_split = 0; | |
3868 | |
23272
a84e7abb0c92
patch 8.2.2182: Vim9: value of 'magic' is still relevant
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
3869 save_magic_overruled = magic_overruled; |
23505
bb29b09902d5
patch 8.2.2295: incsearch does not detect empty pattern properly
Bram Moolenaar <Bram@vim.org>
parents:
23272
diff
changeset
|
3870 magic_overruled = OPTION_MAGIC_OFF; // always execute with 'nomagic' |
7 | 3871 #ifdef FEAT_SEARCH_EXTRA |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3872 // Save value of no_hlsearch, jumping to a tag is not a real search |
7 | 3873 save_no_hlsearch = no_hlsearch; |
3874 #endif | |
24594
5c456a88f651
patch 8.2.2836: build failure without the +quickfix feature
Bram Moolenaar <Bram@vim.org>
parents:
24186
diff
changeset
|
3875 #if defined(FEAT_PROP_POPUP) && defined(FEAT_QUICKFIX) |
24053
bcf16185be60
patch 8.2.2568: second time a preview popup is opened highlight is not set
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
3876 // getfile() may have cleared options, apply 'previewpopup' again. |
bcf16185be60
patch 8.2.2568: second time a preview popup is opened highlight is not set
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
3877 if (g_do_tagpreview != 0 && *p_pvp != NUL) |
bcf16185be60
patch 8.2.2568: second time a preview popup is opened highlight is not set
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
3878 parse_previewpopup(curwin); |
bcf16185be60
patch 8.2.2568: second time a preview popup is opened highlight is not set
Bram Moolenaar <Bram@vim.org>
parents:
23563
diff
changeset
|
3879 #endif |
7 | 3880 |
3881 /* | |
3882 * If 'cpoptions' contains 't', store the search pattern for the "n" | |
3883 * command. If 'cpoptions' does not contain 't', the search pattern | |
3884 * is not stored. | |
3885 */ | |
3886 if (vim_strchr(p_cpo, CPO_TAGPAT) != NULL) | |
3887 search_options = 0; | |
3888 else | |
3889 search_options = SEARCH_KEEP; | |
3890 | |
3891 /* | |
3892 * If the command is a search, try here. | |
3893 * | |
3894 * Reset 'smartcase' for the search, since the search pattern was not | |
3895 * typed by the user. | |
3896 * Only use do_search() when there is a full search command, without | |
3897 * anything following. | |
3898 */ | |
3899 str = pbuf; | |
3900 if (pbuf[0] == '/' || pbuf[0] == '?') | |
19892
5feb426d2ea1
patch 8.2.0502: Vim9: some code is not tested
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
3901 str = skip_regexp(pbuf + 1, pbuf[0], FALSE) + 1; |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3902 if (str > pbuf_end - 1) // search command with nothing following |
7 | 3903 { |
3904 save_p_ws = p_ws; | |
3905 save_p_ic = p_ic; | |
3906 save_p_scs = p_scs; | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3907 p_ws = TRUE; // need 'wrapscan' for backward searches |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3908 p_ic = FALSE; // don't ignore case now |
7 | 3909 p_scs = FALSE; |
3910 save_lnum = curwin->w_cursor.lnum; | |
18640
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3911 if (tagp.tagline > 0) |
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3912 // start search before line from "line:" field |
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3913 curwin->w_cursor.lnum = tagp.tagline - 1; |
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3914 else |
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3915 // start search before first line |
b9240fe40dd4
patch 8.1.2312: "line:" field in tags file not used
Bram Moolenaar <Bram@vim.org>
parents:
18554
diff
changeset
|
3916 curwin->w_cursor.lnum = 0; |
19475
5512aa74cb62
patch 8.2.0295: highlighting for :s wrong when using different separator
Bram Moolenaar <Bram@vim.org>
parents:
19241
diff
changeset
|
3917 if (do_search(NULL, pbuf[0], pbuf[0], pbuf + 1, (long)1, |
18358
34d5cd432cac
patch 8.1.2173: searchit() has too many arguments
Bram Moolenaar <Bram@vim.org>
parents:
18315
diff
changeset
|
3918 search_options, NULL)) |
7 | 3919 retval = OK; |
3920 else | |
3921 { | |
3922 int found = 1; | |
3923 int cc; | |
3924 | |
3925 /* | |
3926 * try again, ignore case now | |
3927 */ | |
3928 p_ic = TRUE; | |
19475
5512aa74cb62
patch 8.2.0295: highlighting for :s wrong when using different separator
Bram Moolenaar <Bram@vim.org>
parents:
19241
diff
changeset
|
3929 if (!do_search(NULL, pbuf[0], pbuf[0], pbuf + 1, (long)1, |
18358
34d5cd432cac
patch 8.1.2173: searchit() has too many arguments
Bram Moolenaar <Bram@vim.org>
parents:
18315
diff
changeset
|
3930 search_options, NULL)) |
7 | 3931 { |
3932 /* | |
3933 * Failed to find pattern, take a guess: "^func (" | |
3934 */ | |
3935 found = 2; | |
3936 (void)test_for_static(&tagp); | |
3937 cc = *tagp.tagname_end; | |
3938 *tagp.tagname_end = NUL; | |
3939 sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname); | |
19475
5512aa74cb62
patch 8.2.0295: highlighting for :s wrong when using different separator
Bram Moolenaar <Bram@vim.org>
parents:
19241
diff
changeset
|
3940 if (!do_search(NULL, '/', '/', pbuf, (long)1, |
18358
34d5cd432cac
patch 8.1.2173: searchit() has too many arguments
Bram Moolenaar <Bram@vim.org>
parents:
18315
diff
changeset
|
3941 search_options, NULL)) |
7 | 3942 { |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3943 // Guess again: "^char * \<func (" |
7 | 3944 sprintf((char *)pbuf, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(", |
3945 tagp.tagname); | |
19475
5512aa74cb62
patch 8.2.0295: highlighting for :s wrong when using different separator
Bram Moolenaar <Bram@vim.org>
parents:
19241
diff
changeset
|
3946 if (!do_search(NULL, '/', '/', pbuf, (long)1, |
18358
34d5cd432cac
patch 8.1.2173: searchit() has too many arguments
Bram Moolenaar <Bram@vim.org>
parents:
18315
diff
changeset
|
3947 search_options, NULL)) |
7 | 3948 found = 0; |
3949 } | |
3950 *tagp.tagname_end = cc; | |
3951 } | |
3952 if (found == 0) | |
3953 { | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
3954 emsg(_(e_canot_find_tag_pattern)); |
7 | 3955 curwin->w_cursor.lnum = save_lnum; |
3956 } | |
3957 else | |
3958 { | |
3959 /* | |
3960 * Only give a message when really guessed, not when 'ic' | |
3961 * is set and match found while ignoring case. | |
3962 */ | |
3963 if (found == 2 || !save_p_ic) | |
3964 { | |
26913
d4e61d61afd9
patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26877
diff
changeset
|
3965 msg(_(e_couldnt_find_tag_just_guessing)); |
7 | 3966 if (!msg_scrolled && msg_silent == 0) |
3967 { | |
3968 out_flush(); | |
18642
bbea1f108187
patch 8.1.2313: debugging where a delay comes from is not easy
Bram Moolenaar <Bram@vim.org>
parents:
18640
diff
changeset
|
3969 ui_delay(1010L, TRUE); |
7 | 3970 } |
3971 } | |
3972 retval = OK; | |
3973 } | |
3974 } | |
3975 p_ws = save_p_ws; | |
3976 p_ic = save_p_ic; | |
3977 p_scs = save_p_scs; | |
3978 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3979 // A search command may have positioned the cursor beyond the end |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3980 // of the line. May need to correct that here. |
7 | 3981 check_cursor(); |
3982 } | |
3983 else | |
3984 { | |
25262
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3985 int save_secure = secure; |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3986 |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3987 // Setup the sandbox for executing the command from the tags file. |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3988 secure = 1; |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3989 #ifdef HAVE_SANDBOX |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3990 ++sandbox; |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3991 #endif |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
3992 curwin->w_cursor.lnum = 1; // start command in line 1 |
7 | 3993 do_cmdline_cmd(pbuf); |
3994 retval = OK; | |
25262
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3995 |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3996 // When the command has done something that is not allowed make |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3997 // sure the error message can be seen. |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3998 if (secure == 2) |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
3999 wait_return(TRUE); |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
4000 secure = save_secure; |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
4001 #ifdef HAVE_SANDBOX |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
4002 --sandbox; |
e9065d299e9b
patch 8.2.3167: get E12 in a job callback when searching for tags
Bram Moolenaar <Bram@vim.org>
parents:
24665
diff
changeset
|
4003 #endif |
7 | 4004 } |
4005 | |
23272
a84e7abb0c92
patch 8.2.2182: Vim9: value of 'magic' is still relevant
Bram Moolenaar <Bram@vim.org>
parents:
22699
diff
changeset
|
4006 magic_overruled = save_magic_overruled; |
7 | 4007 #ifdef FEAT_SEARCH_EXTRA |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4008 // restore no_hlsearch when keeping the old search pattern |
7 | 4009 if (search_options) |
13792
0e9b2971d7c3
patch 8.0.1768: SET_NO_HLSEARCH() used in a wrong way
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
4010 set_no_hlsearch(save_no_hlsearch); |
7 | 4011 #endif |
4012 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4013 // Return OK if jumped to another file (at least we found the file!). |
11476
c45fb081391c
patch 8.0.0621: :stag does not respect 'switchbuf'
Christian Brabandt <cb@256bit.org>
parents:
11329
diff
changeset
|
4014 if (getfile_result == GETFILE_OPEN_OTHER) |
7 | 4015 retval = OK; |
4016 | |
4017 if (retval == OK) | |
4018 { | |
4019 /* | |
4020 * For a help buffer: Put the cursor line at the top of the window, | |
4021 * the help subject will be below it. | |
4022 */ | |
4023 if (curbuf->b_help) | |
4024 set_topline(curwin, curwin->w_cursor.lnum); | |
4025 #ifdef FEAT_FOLDING | |
4026 if ((fdo_flags & FDO_TAG) && old_KeyTyped) | |
4027 foldOpenCursor(); | |
4028 #endif | |
4029 } | |
4030 | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
4031 #if defined(FEAT_QUICKFIX) |
2713 | 4032 if (g_do_tagpreview != 0 |
4033 && curwin != curwin_save && win_valid(curwin_save)) | |
7 | 4034 { |
17632
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4035 // Return cursor to where we were |
7 | 4036 validate_cursor(); |
4037 redraw_later(VALID); | |
4038 win_enter(curwin_save, TRUE); | |
4039 } | |
4040 #endif | |
4041 | |
4042 --RedrawingDisabled; | |
4043 } | |
4044 else | |
4045 { | |
4046 --RedrawingDisabled; | |
17632
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4047 got_int = FALSE; // don't want entering window to fail |
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4048 |
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4049 if (postponed_split) // close the window |
7 | 4050 { |
4051 win_close(curwin, FALSE); | |
4052 postponed_split = 0; | |
4053 } | |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18642
diff
changeset
|
4054 #if defined(FEAT_QUICKFIX) && defined(FEAT_PROP_POPUP) |
17632
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4055 else if (WIN_IS_POPUP(curwin)) |
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4056 { |
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4057 win_T *wp = curwin; |
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4058 |
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4059 if (win_valid(curwin_save)) |
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4060 win_enter(curwin_save, TRUE); |
20384
42ab4d40e78f
patch 8.2.0747: cannot forcefully close all popups
Bram Moolenaar <Bram@vim.org>
parents:
20007
diff
changeset
|
4061 popup_close(wp->w_id, FALSE); |
17632
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4062 } |
5278e5a2a4e3
patch 8.1.1813: ATTENTION prompt for a preview popup window
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
4063 #endif |
7 | 4064 } |
18763
49b78d6465e5
patch 8.1.2371: FEAT_TEXT_PROP is a confusing name
Bram Moolenaar <Bram@vim.org>
parents:
18642
diff
changeset
|
4065 #if defined(FEAT_QUICKFIX) && defined(FEAT_PROP_POPUP) |
17644
daa1dea1c1b3
patch 8.1.1819: :pedit does not work with a popup preview window
Bram Moolenaar <Bram@vim.org>
parents:
17632
diff
changeset
|
4066 if (WIN_IS_POPUP(curwin)) |
daa1dea1c1b3
patch 8.1.1819: :pedit does not work with a popup preview window
Bram Moolenaar <Bram@vim.org>
parents:
17632
diff
changeset
|
4067 // something went wrong, still in popup, but it can't have focus |
daa1dea1c1b3
patch 8.1.1819: :pedit does not work with a popup preview window
Bram Moolenaar <Bram@vim.org>
parents:
17632
diff
changeset
|
4068 win_enter(firstwin, TRUE); |
daa1dea1c1b3
patch 8.1.1819: :pedit does not work with a popup preview window
Bram Moolenaar <Bram@vim.org>
parents:
17632
diff
changeset
|
4069 #endif |
7 | 4070 |
4071 erret: | |
12477
68d7bc045dbe
patch 8.0.1118: FEAT_WINDOWS adds a lot of #ifdefs
Christian Brabandt <cb@256bit.org>
parents:
11521
diff
changeset
|
4072 #if defined(FEAT_QUICKFIX) |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4073 g_do_tagpreview = 0; // For next time |
7 | 4074 #endif |
12680
429bf1b9292f
patch 8.0.1218: writing to freed memory in autocmd
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
4075 vim_free(lbuf); |
7 | 4076 vim_free(pbuf); |
4077 vim_free(tofree_fname); | |
4078 vim_free(full_fname); | |
4079 | |
4080 return retval; | |
4081 } | |
4082 | |
4083 /* | |
4084 * If "expand" is TRUE, expand wildcards in fname. | |
4085 * If 'tagrelative' option set, change fname (name of file containing tag) | |
4086 * according to tag_fname (name of tag file containing fname). | |
4087 * Returns a pointer to allocated memory (or NULL when out of memory). | |
4088 */ | |
4089 static char_u * | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4090 expand_tag_fname(char_u *fname, char_u *tag_fname, int expand) |
7 | 4091 { |
4092 char_u *p; | |
4093 char_u *retval; | |
4094 char_u *expanded_fname = NULL; | |
4095 expand_T xpc; | |
4096 | |
4097 /* | |
4098 * Expand file name (for environment variables) when needed. | |
4099 */ | |
4100 if (expand && mch_has_wildcard(fname)) | |
4101 { | |
4102 ExpandInit(&xpc); | |
4103 xpc.xp_context = EXPAND_FILES; | |
27426
41e0dcf38521
patch 8.2.4241: some type casts are redundant
Bram Moolenaar <Bram@vim.org>
parents:
27028
diff
changeset
|
4104 expanded_fname = ExpandOne(&xpc, fname, NULL, |
7 | 4105 WILD_LIST_NOTFOUND|WILD_SILENT, WILD_EXPAND_FREE); |
4106 if (expanded_fname != NULL) | |
4107 fname = expanded_fname; | |
4108 } | |
4109 | |
4110 if ((p_tr || curbuf->b_help) | |
4111 && !vim_isAbsName(fname) | |
4112 && (p = gettail(tag_fname)) != tag_fname) | |
4113 { | |
4114 retval = alloc(MAXPATHL); | |
4115 if (retval != NULL) | |
4116 { | |
4117 STRCPY(retval, tag_fname); | |
418 | 4118 vim_strncpy(retval + (p - tag_fname), fname, |
4119 MAXPATHL - (p - tag_fname) - 1); | |
7 | 4120 /* |
4121 * Translate names like "src/a/../b/file.c" into "src/b/file.c". | |
4122 */ | |
4123 simplify_filename(retval); | |
4124 } | |
4125 } | |
4126 else | |
4127 retval = vim_strsave(fname); | |
4128 | |
4129 vim_free(expanded_fname); | |
4130 | |
4131 return retval; | |
4132 } | |
4133 | |
4134 /* | |
4135 * Check if we have a tag for the buffer with name "buf_ffname". | |
4136 * This is a bit slow, because of the full path compare in fullpathcmp(). | |
4137 * Return TRUE if tag for file "fname" if tag file "tag_fname" is for current | |
4138 * file. | |
4139 */ | |
4140 static int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4141 test_for_current( |
7 | 4142 #ifdef FEAT_EMACS_TAGS |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4143 int is_etag, |
7 | 4144 #endif |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4145 char_u *fname, |
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4146 char_u *fname_end, |
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4147 char_u *tag_fname, |
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4148 char_u *buf_ffname) |
7 | 4149 { |
4150 int c; | |
4151 int retval = FALSE; | |
4152 char_u *fullname; | |
4153 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4154 if (buf_ffname != NULL) // if the buffer has a name |
7 | 4155 { |
4156 #ifdef FEAT_EMACS_TAGS | |
4157 if (is_etag) | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4158 c = 0; // to shut up GCC |
7 | 4159 else |
4160 #endif | |
4161 { | |
4162 c = *fname_end; | |
4163 *fname_end = NUL; | |
4164 } | |
4165 fullname = expand_tag_fname(fname, tag_fname, TRUE); | |
4166 if (fullname != NULL) | |
4167 { | |
16738
b52ea9c5f1db
patch 8.1.1371: cannot recover from a swap file
Bram Moolenaar <Bram@vim.org>
parents:
16511
diff
changeset
|
4168 retval = (fullpathcmp(fullname, buf_ffname, TRUE, TRUE) & FPC_SAME); |
7 | 4169 vim_free(fullname); |
4170 } | |
4171 #ifdef FEAT_EMACS_TAGS | |
4172 if (!is_etag) | |
4173 #endif | |
4174 *fname_end = c; | |
4175 } | |
4176 | |
4177 return retval; | |
4178 } | |
4179 | |
4180 /* | |
4181 * Find the end of the tagaddress. | |
4182 * Return OK if ";\"" is following, FAIL otherwise. | |
4183 */ | |
4184 static int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4185 find_extra(char_u **pp) |
7 | 4186 { |
4187 char_u *str = *pp; | |
19055
8645b73b3645
patch 8.2.0088: insufficient tests for tags; bug in using extra tag field
Bram Moolenaar <Bram@vim.org>
parents:
19033
diff
changeset
|
4188 char_u first_char = **pp; |
7 | 4189 |
15808
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4190 // Repeat for addresses separated with ';' |
7 | 4191 for (;;) |
4192 { | |
4193 if (VIM_ISDIGIT(*str)) | |
24665
661d15592d3c
patch 8.2.2871: unnessary VIM_ISDIGIT() calls, badly indented code
Bram Moolenaar <Bram@vim.org>
parents:
24594
diff
changeset
|
4194 str = skipdigits(str + 1); |
7 | 4195 else if (*str == '/' || *str == '?') |
4196 { | |
19892
5feb426d2ea1
patch 8.2.0502: Vim9: some code is not tested
Bram Moolenaar <Bram@vim.org>
parents:
19888
diff
changeset
|
4197 str = skip_regexp(str + 1, *str, FALSE); |
19055
8645b73b3645
patch 8.2.0088: insufficient tests for tags; bug in using extra tag field
Bram Moolenaar <Bram@vim.org>
parents:
19033
diff
changeset
|
4198 if (*str != first_char) |
7 | 4199 str = NULL; |
4200 else | |
4201 ++str; | |
4202 } | |
4203 else | |
15808
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4204 { |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4205 // not a line number or search string, look for terminator. |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4206 str = (char_u *)strstr((char *)str, "|;\""); |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4207 if (str != NULL) |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4208 { |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4209 ++str; |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4210 break; |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4211 } |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4212 |
37d31fc37a5a
patch 8.1.0911: tag line with Ex command cannot have extra fields
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
4213 } |
7 | 4214 if (str == NULL || *str != ';' |
4215 || !(VIM_ISDIGIT(str[1]) || str[1] == '/' || str[1] == '?')) | |
4216 break; | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4217 ++str; // skip ';' |
19055
8645b73b3645
patch 8.2.0088: insufficient tests for tags; bug in using extra tag field
Bram Moolenaar <Bram@vim.org>
parents:
19033
diff
changeset
|
4218 first_char = *str; |
7 | 4219 } |
4220 | |
4221 if (str != NULL && STRNCMP(str, ";\"", 2) == 0) | |
4222 { | |
4223 *pp = str; | |
4224 return OK; | |
4225 } | |
4226 return FAIL; | |
4227 } | |
4228 | |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4229 /* |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4230 * Free a single entry in a tag stack |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4231 */ |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4232 static void |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4233 tagstack_clear_entry(taggy_T *item) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4234 { |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4235 VIM_CLEAR(item->tagname); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4236 VIM_CLEAR(item->user_data); |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4237 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4238 |
7 | 4239 int |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4240 expand_tags( |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4241 int tagnames, // expand tag names |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4242 char_u *pat, |
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4243 int *num_file, |
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4244 char_u ***file) |
7 | 4245 { |
4246 int i; | |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4247 int extra_flag; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4248 char_u *name_buf; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4249 size_t name_buf_size = 100; |
7 | 4250 tagptrs_T t_p; |
4251 int ret; | |
4252 | |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4253 name_buf = alloc(name_buf_size); |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4254 if (name_buf == NULL) |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4255 return FAIL; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4256 |
7 | 4257 if (tagnames) |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4258 extra_flag = TAG_NAMES; |
7 | 4259 else |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4260 extra_flag = 0; |
7 | 4261 if (pat[0] == '/') |
4262 ret = find_tags(pat + 1, num_file, file, | |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4263 TAG_REGEXP | extra_flag | TAG_VERBOSE | TAG_NO_TAGFUNC, |
7 | 4264 TAG_MANY, curbuf->b_ffname); |
4265 else | |
4266 ret = find_tags(pat, num_file, file, | |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4267 TAG_REGEXP | extra_flag | TAG_VERBOSE | TAG_NO_TAGFUNC | TAG_NOIC, |
7 | 4268 TAG_MANY, curbuf->b_ffname); |
4269 if (ret == OK && !tagnames) | |
4270 { | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4271 // Reorganize the tags for display and matching as strings of: |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4272 // "<tagname>\0<kind>\0<filename>\0" |
7 | 4273 for (i = 0; i < *num_file; i++) |
4274 { | |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4275 size_t len; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4276 |
7 | 4277 parse_match((*file)[i], &t_p); |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4278 len = t_p.tagname_end - t_p.tagname; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4279 if (len > name_buf_size - 3) |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4280 { |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4281 char_u *buf; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4282 |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4283 name_buf_size = len + 3; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4284 buf = vim_realloc(name_buf, name_buf_size); |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4285 if (buf == NULL) |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4286 { |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4287 vim_free(name_buf); |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4288 return FAIL; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4289 } |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4290 name_buf = buf; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4291 } |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4292 |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4293 mch_memmove(name_buf, t_p.tagname, len); |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4294 name_buf[len++] = 0; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4295 name_buf[len++] = (t_p.tagkind != NULL && *t_p.tagkind) |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4296 ? *t_p.tagkind : 'f'; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4297 name_buf[len++] = 0; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4298 mch_memmove((*file)[i] + len, t_p.fname, |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4299 t_p.fname_end - t_p.fname); |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4300 (*file)[i][len + (t_p.fname_end - t_p.fname)] = 0; |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4301 mch_memmove((*file)[i], name_buf, len); |
7 | 4302 } |
4303 } | |
25652
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4304 |
ca61340ac1b9
patch 8.2.3362: buffer overflow when completing long tag name
Bram Moolenaar <Bram@vim.org>
parents:
25587
diff
changeset
|
4305 vim_free(name_buf); |
7 | 4306 return ret; |
4307 } | |
179 | 4308 |
4309 #if defined(FEAT_EVAL) || defined(PROTO) | |
4310 /* | |
2185 | 4311 * Add a tag field to the dictionary "dict". |
4312 * Return OK or FAIL. | |
179 | 4313 */ |
4314 static int | |
7835
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4315 add_tag_field( |
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4316 dict_T *dict, |
4d7ce6c03fda
commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
4317 char *field_name, |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4318 char_u *start, // start of the value |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4319 char_u *end) // after the value; can be NULL |
179 | 4320 { |
2770 | 4321 char_u *buf; |
188 | 4322 int len = 0; |
2770 | 4323 int retval; |
179 | 4324 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4325 // check that the field name doesn't exist yet |
2185 | 4326 if (dict_find(dict, (char_u *)field_name, -1) != NULL) |
4327 { | |
4328 if (p_verbose > 0) | |
4329 { | |
4330 verbose_enter(); | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
4331 smsg(_("Duplicate field name: %s"), field_name); |
2185 | 4332 verbose_leave(); |
4333 } | |
4334 return FAIL; | |
4335 } | |
2770 | 4336 buf = alloc(MAXPATHL); |
4337 if (buf == NULL) | |
4338 return FAIL; | |
188 | 4339 if (start != NULL) |
4340 { | |
211 | 4341 if (end == NULL) |
4342 { | |
4343 end = start + STRLEN(start); | |
4344 while (end > start && (end[-1] == '\r' || end[-1] == '\n')) | |
4345 --end; | |
4346 } | |
835 | 4347 len = (int)(end - start); |
2770 | 4348 if (len > MAXPATHL - 1) |
4349 len = MAXPATHL - 1; | |
418 | 4350 vim_strncpy(buf, start, len); |
188 | 4351 } |
179 | 4352 buf[len] = NUL; |
14301
3c80092eb211
patch 8.1.0166: using dict_add_nr_str() is clumsy
Christian Brabandt <cb@256bit.org>
parents:
14232
diff
changeset
|
4353 retval = dict_add_string(dict, field_name, buf); |
2770 | 4354 vim_free(buf); |
4355 return retval; | |
179 | 4356 } |
4357 | |
4358 /* | |
11225
d3415ec1cdaf
patch 8.0.0499: taglist() does not prioritize tags for a buffer
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
4359 * Add the tags matching the specified pattern "pat" to the list "list" |
d3415ec1cdaf
patch 8.0.0499: taglist() does not prioritize tags for a buffer
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
4360 * as a dictionary. Use "buf_fname" for priority, unless NULL. |
179 | 4361 */ |
4362 int | |
11225
d3415ec1cdaf
patch 8.0.0499: taglist() does not prioritize tags for a buffer
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
4363 get_tags(list_T *list, char_u *pat, char_u *buf_fname) |
179 | 4364 { |
4365 int num_matches, i, ret; | |
4366 char_u **matches, *p; | |
970 | 4367 char_u *full_fname; |
179 | 4368 dict_T *dict; |
4369 tagptrs_T tp; | |
4370 long is_static; | |
4371 | |
4372 ret = find_tags(pat, &num_matches, &matches, | |
11225
d3415ec1cdaf
patch 8.0.0499: taglist() does not prioritize tags for a buffer
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
4373 TAG_REGEXP | TAG_NOIC, (int)MAXCOL, buf_fname); |
179 | 4374 if (ret == OK && num_matches > 0) |
4375 { | |
4376 for (i = 0; i < num_matches; ++i) | |
4377 { | |
188 | 4378 parse_match(matches[i], &tp); |
4379 is_static = test_for_static(&tp); | |
4380 | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4381 // Skip pseudo-tag lines. |
188 | 4382 if (STRNCMP(tp.tagname, "!_TAG_", 6) == 0) |
19237
1a3ebc75cf39
patch 8.2.0177: memory leak in get_tags()
Bram Moolenaar <Bram@vim.org>
parents:
19195
diff
changeset
|
4383 { |
1a3ebc75cf39
patch 8.2.0177: memory leak in get_tags()
Bram Moolenaar <Bram@vim.org>
parents:
19195
diff
changeset
|
4384 vim_free(matches[i]); |
188 | 4385 continue; |
19237
1a3ebc75cf39
patch 8.2.0177: memory leak in get_tags()
Bram Moolenaar <Bram@vim.org>
parents:
19195
diff
changeset
|
4386 } |
188 | 4387 |
179 | 4388 if ((dict = dict_alloc()) == NULL) |
4389 ret = FAIL; | |
4390 if (list_append_dict(list, dict) == FAIL) | |
4391 ret = FAIL; | |
4392 | |
970 | 4393 full_fname = tag_full_fname(&tp); |
179 | 4394 if (add_tag_field(dict, "name", tp.tagname, tp.tagname_end) == FAIL |
970 | 4395 || add_tag_field(dict, "filename", full_fname, |
4396 NULL) == FAIL | |
179 | 4397 || add_tag_field(dict, "cmd", tp.command, |
4398 tp.command_end) == FAIL | |
4399 || add_tag_field(dict, "kind", tp.tagkind, | |
4400 tp.tagkind_end) == FAIL | |
14301
3c80092eb211
patch 8.1.0166: using dict_add_nr_str() is clumsy
Christian Brabandt <cb@256bit.org>
parents:
14232
diff
changeset
|
4401 || dict_add_number(dict, "static", is_static) == FAIL) |
179 | 4402 ret = FAIL; |
4403 | |
970 | 4404 vim_free(full_fname); |
4405 | |
179 | 4406 if (tp.command_end != NULL) |
4407 { | |
4408 for (p = tp.command_end + 3; | |
19617
5ce724c60c4c
patch 8.2.0365: tag kind can't be a multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
19475
diff
changeset
|
4409 *p != NUL && *p != '\n' && *p != '\r'; MB_PTR_ADV(p)) |
179 | 4410 { |
4411 if (p == tp.tagkind || (p + 5 == tp.tagkind | |
4412 && STRNCMP(p, "kind:", 5) == 0)) | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4413 // skip "kind:<kind>" and "<kind>" |
179 | 4414 p = tp.tagkind_end - 1; |
4415 else if (STRNCMP(p, "file:", 5) == 0) | |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4416 // skip "file:" (static tag) |
179 | 4417 p += 4; |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
4418 else if (!VIM_ISWHITE(*p)) |
179 | 4419 { |
4420 char_u *s, *n; | |
188 | 4421 int len; |
179 | 4422 |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4423 // Add extra field as a dict entry. Fields are |
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4424 // separated by Tabs. |
179 | 4425 n = p; |
799 | 4426 while (*p != NUL && *p >= ' ' && *p < 127 && *p != ':') |
179 | 4427 ++p; |
835 | 4428 len = (int)(p - n); |
188 | 4429 if (*p == ':' && len > 0) |
4430 { | |
4431 s = ++p; | |
836 | 4432 while (*p != NUL && *p >= ' ') |
188 | 4433 ++p; |
4434 n[len] = NUL; | |
4435 if (add_tag_field(dict, (char *)n, s, p) == FAIL) | |
4436 ret = FAIL; | |
4437 n[len] = ':'; | |
4438 } | |
836 | 4439 else |
18814
7e7ec935e7c8
patch 8.1.2395: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18763
diff
changeset
|
4440 // Skip field without colon. |
836 | 4441 while (*p != NUL && *p >= ' ') |
4442 ++p; | |
1674 | 4443 if (*p == NUL) |
4444 break; | |
179 | 4445 } |
4446 } | |
4447 } | |
4448 | |
4449 vim_free(matches[i]); | |
4450 } | |
4451 vim_free(matches); | |
4452 } | |
4453 return ret; | |
4454 } | |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4455 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4456 /* |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4457 * Return information about 'tag' in dict 'retdict'. |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4458 */ |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4459 static void |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4460 get_tag_details(taggy_T *tag, dict_T *retdict) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4461 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4462 list_T *pos; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4463 fmark_T *fmark; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4464 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4465 dict_add_string(retdict, "tagname", tag->tagname); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4466 dict_add_number(retdict, "matchnr", tag->cur_match + 1); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4467 dict_add_number(retdict, "bufnr", tag->cur_fnum); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4468 if (tag->user_data) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4469 dict_add_string(retdict, "user_data", tag->user_data); |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4470 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4471 if ((pos = list_alloc_id(aid_tagstack_from)) == NULL) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4472 return; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4473 dict_add_list(retdict, "from", pos); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4474 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4475 fmark = &tag->fmark; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4476 list_append_number(pos, |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4477 (varnumber_T)(fmark->fnum != -1 ? fmark->fnum : 0)); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4478 list_append_number(pos, (varnumber_T)fmark->mark.lnum); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4479 list_append_number(pos, (varnumber_T)(fmark->mark.col == MAXCOL ? |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4480 MAXCOL : fmark->mark.col + 1)); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4481 list_append_number(pos, (varnumber_T)fmark->mark.coladd); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4482 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4483 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4484 /* |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4485 * Return the tag stack entries of the specified window 'wp' in dictionary |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4486 * 'retdict'. |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4487 */ |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4488 void |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4489 get_tagstack(win_T *wp, dict_T *retdict) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4490 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4491 list_T *l; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4492 int i; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4493 dict_T *d; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4494 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4495 dict_add_number(retdict, "length", wp->w_tagstacklen); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4496 dict_add_number(retdict, "curidx", wp->w_tagstackidx + 1); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4497 l = list_alloc_id(aid_tagstack_items); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4498 if (l == NULL) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4499 return; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4500 dict_add_list(retdict, "items", l); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4501 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4502 for (i = 0; i < wp->w_tagstacklen; i++) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4503 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4504 if ((d = dict_alloc_id(aid_tagstack_details)) == NULL) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4505 return; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4506 list_append_dict(l, d); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4507 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4508 get_tag_details(&wp->w_tagstack[i], d); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4509 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4510 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4511 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4512 /* |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4513 * Free all the entries in the tag stack of the specified window |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4514 */ |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4515 static void |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4516 tagstack_clear(win_T *wp) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4517 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4518 int i; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4519 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4520 // Free the current tag stack |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4521 for (i = 0; i < wp->w_tagstacklen; ++i) |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4522 tagstack_clear_entry(&wp->w_tagstack[i]); |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4523 wp->w_tagstacklen = 0; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4524 wp->w_tagstackidx = 0; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4525 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4526 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4527 /* |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4528 * Remove the oldest entry from the tag stack and shift the rest of |
19195
2ef19eed524a
patch 8.2.0156: various typos in source files and tests
Bram Moolenaar <Bram@vim.org>
parents:
19055
diff
changeset
|
4529 * the entries to free up the top of the stack. |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4530 */ |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4531 static void |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4532 tagstack_shift(win_T *wp) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4533 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4534 taggy_T *tagstack = wp->w_tagstack; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4535 int i; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4536 |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4537 tagstack_clear_entry(&tagstack[0]); |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4538 for (i = 1; i < wp->w_tagstacklen; ++i) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4539 tagstack[i - 1] = tagstack[i]; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4540 wp->w_tagstacklen--; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4541 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4542 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4543 /* |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4544 * Push a new item to the tag stack |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4545 */ |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4546 static void |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4547 tagstack_push_item( |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4548 win_T *wp, |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4549 char_u *tagname, |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4550 int cur_fnum, |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4551 int cur_match, |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4552 pos_T mark, |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4553 int fnum, |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4554 char_u *user_data) |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4555 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4556 taggy_T *tagstack = wp->w_tagstack; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4557 int idx = wp->w_tagstacklen; // top of the stack |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4558 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4559 // if the tagstack is full: remove the oldest entry |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4560 if (idx >= TAGSTACKSIZE) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4561 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4562 tagstack_shift(wp); |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4563 idx = TAGSTACKSIZE - 1; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4564 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4565 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4566 wp->w_tagstacklen++; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4567 tagstack[idx].tagname = tagname; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4568 tagstack[idx].cur_fnum = cur_fnum; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4569 tagstack[idx].cur_match = cur_match; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4570 if (tagstack[idx].cur_match < 0) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4571 tagstack[idx].cur_match = 0; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4572 tagstack[idx].fmark.mark = mark; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4573 tagstack[idx].fmark.fnum = fnum; |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4574 tagstack[idx].user_data = user_data; |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4575 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4576 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4577 /* |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4578 * Add a list of items to the tag stack in the specified window |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4579 */ |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4580 static void |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4581 tagstack_push_items(win_T *wp, list_T *l) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4582 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4583 listitem_T *li; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4584 dictitem_T *di; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4585 dict_T *itemdict; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4586 char_u *tagname; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4587 pos_T mark; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4588 int fnum; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4589 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4590 // Add one entry at a time to the tag stack |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19617
diff
changeset
|
4591 FOR_ALL_LIST_ITEMS(l, li) |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4592 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4593 if (li->li_tv.v_type != VAR_DICT || li->li_tv.vval.v_dict == NULL) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4594 continue; // Skip non-dict items |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4595 itemdict = li->li_tv.vval.v_dict; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4596 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4597 // parse 'from' for the cursor position before the tag jump |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4598 if ((di = dict_find(itemdict, (char_u *)"from", -1)) == NULL) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4599 continue; |
23563
87671ccc6c6b
patch 8.2.2324: not easy to get mark en cursor posotion by character count
Bram Moolenaar <Bram@vim.org>
parents:
23505
diff
changeset
|
4600 if (list2fpos(&di->di_tv, &mark, &fnum, NULL, FALSE) != OK) |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4601 continue; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4602 if ((tagname = |
15146
7903dce131d4
patch 8.1.0583: using illogical name for get_dict_number()/get_dict_string()
Bram Moolenaar <Bram@vim.org>
parents:
15016
diff
changeset
|
4603 dict_get_string(itemdict, (char_u *)"tagname", TRUE)) == NULL) |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4604 continue; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4605 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4606 if (mark.col > 0) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4607 mark.col--; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4608 tagstack_push_item(wp, tagname, |
15146
7903dce131d4
patch 8.1.0583: using illogical name for get_dict_number()/get_dict_string()
Bram Moolenaar <Bram@vim.org>
parents:
15016
diff
changeset
|
4609 (int)dict_get_number(itemdict, (char_u *)"bufnr"), |
7903dce131d4
patch 8.1.0583: using illogical name for get_dict_number()/get_dict_string()
Bram Moolenaar <Bram@vim.org>
parents:
15016
diff
changeset
|
4610 (int)dict_get_number(itemdict, (char_u *)"matchnr") - 1, |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4611 mark, fnum, |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4612 dict_get_string(itemdict, (char_u *)"user_data", TRUE)); |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4613 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4614 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4615 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4616 /* |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4617 * Set the current index in the tag stack. Valid values are between 0 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4618 * and the stack length (inclusive). |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4619 */ |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4620 static void |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4621 tagstack_set_curidx(win_T *wp, int curidx) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4622 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4623 wp->w_tagstackidx = curidx; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4624 if (wp->w_tagstackidx < 0) // sanity check |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4625 wp->w_tagstackidx = 0; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4626 if (wp->w_tagstackidx > wp->w_tagstacklen) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4627 wp->w_tagstackidx = wp->w_tagstacklen; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4628 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4629 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4630 /* |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4631 * Set the tag stack entries of the specified window. |
19033
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4632 * 'action' is set to one of: |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4633 * 'a' for append |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4634 * 'r' for replace |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4635 * 't' for truncate |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4636 */ |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4637 int |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4638 set_tagstack(win_T *wp, dict_T *d, int action) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4639 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4640 dictitem_T *di; |
19033
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4641 list_T *l = NULL; |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4642 |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4643 #ifdef FEAT_EVAL |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4644 // not allowed to alter the tag stack entries from inside tagfunc |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4645 if (tfu_in_use) |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4646 { |
26966
ac75c145f0a9
patch 8.2.4012: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
4647 emsg(_(e_cannot_modify_tag_stack_within_tagfunc)); |
16447
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4648 return FAIL; |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4649 } |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4650 #endif |
54ffc82f38a8
patch 8.1.1228: not possible to process tags with a function
Bram Moolenaar <Bram@vim.org>
parents:
16378
diff
changeset
|
4651 |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4652 if ((di = dict_find(d, (char_u *)"items", -1)) != NULL) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4653 { |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4654 if (di->di_tv.v_type != VAR_LIST) |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4655 { |
26877
06a137af96f8
patch 8.2.3967: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26518
diff
changeset
|
4656 emsg(_(e_list_required)); |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4657 return FAIL; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4658 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4659 l = di->di_tv.vval.v_list; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4660 } |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4661 |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4662 if ((di = dict_find(d, (char_u *)"curidx", -1)) != NULL) |
15211
de63593896b3
patch 8.1.0615: get_tv function names are not consistent
Bram Moolenaar <Bram@vim.org>
parents:
15146
diff
changeset
|
4663 tagstack_set_curidx(wp, (int)tv_get_number(&di->di_tv) - 1); |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4664 |
19033
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4665 if (action == 't') // truncate the stack |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4666 { |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4667 taggy_T *tagstack = wp->w_tagstack; |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4668 int tagstackidx = wp->w_tagstackidx; |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4669 int tagstacklen = wp->w_tagstacklen; |
19241
c53dbbf3229b
patch 8.2.0179: still a few places where range() does not work
Bram Moolenaar <Bram@vim.org>
parents:
19237
diff
changeset
|
4670 |
19033
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4671 // delete all the tag stack entries above the current entry |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4672 while (tagstackidx < tagstacklen) |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4673 tagstack_clear_entry(&tagstack[--tagstacklen]); |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4674 wp->w_tagstacklen = tagstacklen; |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4675 } |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4676 |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4677 if (l != NULL) |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4678 { |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4679 if (action == 'r') // replace the stack |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4680 tagstack_clear(wp); |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4681 |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4682 tagstack_push_items(wp, l); |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4683 // set the current index after the last entry |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4684 wp->w_tagstackidx = wp->w_tagstacklen; |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4685 } |
f0312cf3c792
patch 8.2.0077: settagstack() cannot truncate at current index
Bram Moolenaar <Bram@vim.org>
parents:
18814
diff
changeset
|
4686 |
15016
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4687 return OK; |
c338c91086b9
patch 8.1.0519: cannot save and restore the tag stack
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
4688 } |
179 | 4689 #endif |