annotate src/tag.c @ 8863:e1b84109506a v7.4.1719

commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Apr 8 17:07:19 2016 +0200 patch 7.4.1719 Problem: Leaking memory when there is a cycle involving a job and a partial. Solution: Add a copyID to job and channel. Set references in items referred by them. Go through all jobs and channels to find unreferenced items. Also, decrement reference counts when garbage collecting.
author Christian Brabandt <cb@256bit.org>
date Fri, 08 Apr 2016 17:15:06 +0200
parents 2f57bbe870ea
children a2aca019ba48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 * Code to handle tags and the tag stack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 * Structure to hold pointers to various items in a tag line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19 typedef struct tag_pointers
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 /* filled in by parse_tag_line(): */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 char_u *tagname; /* start of tag name (skip "file:") */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23 char_u *tagname_end; /* char after tag name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 char_u *fname; /* first char of file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 char_u *fname_end; /* char after file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 char_u *command; /* first char of command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 /* filled in by parse_match(): */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 char_u *command_end; /* first char after command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 char_u *tag_fname; /* file name of the tags file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31 int is_etag; /* TRUE for emacs tag */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 char_u *tagkind; /* "kind:" value */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 char_u *tagkind_end; /* end of tagkind */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 } tagptrs_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
37 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 * The matching tags are first stored in ga_match[]. In which one depends on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 * the priority of the match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
40 * At the end, the matches from ga_match[] are concatenated, to make a list
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41 * sorted on priority.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
43 #define MT_ST_CUR 0 /* static match in current file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
44 #define MT_GL_CUR 1 /* global match in current file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
45 #define MT_GL_OTH 2 /* global match in other file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
46 #define MT_ST_OTH 3 /* static match in other file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 #define MT_IC_ST_CUR 4 /* icase static match in current file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48 #define MT_IC_GL_CUR 5 /* icase global match in current file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 #define MT_IC_GL_OTH 6 /* icase global match in other file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 #define MT_IC_ST_OTH 7 /* icase static match in other file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51 #define MT_IC_OFF 4 /* add for icase match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
52 #define MT_RE_OFF 8 /* add for regexp match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
53 #define MT_MASK 7 /* mask for printing priority */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
54 #define MT_COUNT 16
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
55
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 static char *mt_names[MT_COUNT/2] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 {"FSC", "F C", "F ", "FS ", " SC", " C", " ", " S "};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 #define NOTAGFILE 99 /* return value for jumpto_tag */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 static char_u *nofile_fname = NULL; /* fname for NOTAGFILE error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
62 static void taglen_advance(int l);
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
63
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
64 static int jumpto_tag(char_u *lbuf, int forceit, int keep_help);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 #ifdef FEAT_EMACS_TAGS
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
66 static int parse_tag_line(char_u *lbuf, int is_etag, tagptrs_T *tagp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 #else
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
68 static int parse_tag_line(char_u *lbuf, tagptrs_T *tagp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 #endif
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
70 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
71 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
72 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
73 static char_u *expand_tag_fname(char_u *fname, char_u *tag_fname, int expand);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 #ifdef FEAT_EMACS_TAGS
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
75 static int test_for_current(int, char_u *, char_u *, char_u *, char_u *);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 #else
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
77 static int test_for_current(char_u *, char_u *, char_u *, char_u *);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 #endif
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
79 static int find_extra(char_u **pp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 static char_u *bottommsg = (char_u *)N_("E555: at bottom of tag stack");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 static char_u *topmsg = (char_u *)N_("E556: at top of tag stack");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 static char_u *tagmatchname = NULL; /* name of last used tag */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 * We use ftello() here, if available. It returns off_t instead of long,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 * which helps if long is 32 bit and off_t is 64 bit.
2087
3112fcc89238 updated for version 7.2.371
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
89 * We assume that when fseeko() is available then ftello() is too.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 */
2087
3112fcc89238 updated for version 7.2.371
Bram Moolenaar <bram@zimbu.org>
parents: 1883
diff changeset
91 #ifdef HAVE_FSEEKO
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 # define ftell ftello
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 * Tag for preview window is remembered separately, to avoid messing up the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 * normal tagstack.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 */
1883
c8f343a465a2 updated for version 7.2-180
vimboss
parents: 1877
diff changeset
100 static taggy_T ptag_entry = {NULL, {INIT_POS_T(0, 0, 0), 0}, 0, 0};
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 * Jump to tag; handling of tag commands and tag stack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 * *tag != NUL: ":tag {tag}", jump to new tag, add to tag stack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 * type == DT_TAG: ":tag [tag]", jump to newer position or same tag again
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 * type == DT_HELP: like DT_TAG, but don't use regexp.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 * type == DT_POP: ":pop" or CTRL-T, jump to old position
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111 * type == DT_NEXT: jump to next match of same tag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 * type == DT_PREV: jump to previous match of same tag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 * type == DT_FIRST: jump to first match of same tag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 * type == DT_LAST: jump to last match of same tag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 * type == DT_SELECT: ":tselect [tag]", select tag from a list of all matches
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 * type == DT_JUMP: ":tjump [tag]", jump to tag or select tag from a list
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
117 * type == DT_CSCOPE: use cscope to find the tag
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
118 * type == DT_LTAG: use location list for displaying tag matches
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
119 * type == DT_FREE: free cached matches
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 * for cscope, returns TRUE if we jumped to tag or aborted, FALSE otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
123 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
124 do_tag(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
125 char_u *tag, /* tag (pattern) to jump to */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
126 int type,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
127 int count,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
128 int forceit, /* :ta with ! */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
129 int verbose) /* print "tag not found" message */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 taggy_T *tagstack = curwin->w_tagstack;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 int tagstackidx = curwin->w_tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 int tagstacklen = curwin->w_tagstacklen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
134 int cur_match = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
135 int cur_fnum = curbuf->b_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 int oldtagstackidx = tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 int prevtagstackidx = tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 int prev_num_matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 int new_tag = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140 int other_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141 int i, j, k;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143 int ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
144 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
145 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 int no_regexp = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
147 int error_cur_match = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 char_u *command_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 int save_pos = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 fmark_T saved_fmark;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 int taglen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 int jumped_to_tag = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 tagptrs_T tagp, tagp2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 int new_num_matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 char_u **new_matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 int attr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
159 int use_tagstack;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 int skip_msg = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 char_u *buf_ffname = curbuf->b_ffname; /* name to use for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162 priority computation */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 /* remember the matches for the last used tag */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 static int num_matches = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 static int max_num_matches = 0; /* limit used for match search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 static char_u **matches = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 static int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
170 #ifdef EXITFREE
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
171 if (type == DT_FREE)
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
172 {
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
173 /* remove the list of matches */
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
174 FreeWild(num_matches, matches);
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
175 # ifdef FEAT_CSCOPE
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
176 cs_free_tags();
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
177 # endif
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
178 num_matches = 0;
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
179 return FALSE;
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
180 }
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
181 #endif
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
182
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 if (type == DT_HELP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 type = DT_TAG;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 no_regexp = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 prev_num_matches = num_matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 free_string_option(nofile_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 nofile_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192
698
e402b0af6083 updated for version 7.0211
vimboss
parents: 692
diff changeset
193 clearpos(&saved_fmark.mark); /* shutup gcc 4.0 */
e402b0af6083 updated for version 7.0211
vimboss
parents: 692
diff changeset
194 saved_fmark.fnum = 0;
e402b0af6083 updated for version 7.0211
vimboss
parents: 692
diff changeset
195
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 * Don't add a tag to the tagstack if 'tagstack' has been reset.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 if ((!p_tgst && *tag != NUL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 use_tagstack = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 new_tag = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
207 if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 use_tagstack = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 use_tagstack = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 /* new pattern, add to the tag stack */
845
0fe7765dcb8e updated for version 7.0f03
vimboss
parents: 838
diff changeset
214 if (*tag != NUL
0fe7765dcb8e updated for version 7.0f03
vimboss
parents: 838
diff changeset
215 && (type == DT_TAG || type == DT_SELECT || type == DT_JUMP
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
216 #ifdef FEAT_QUICKFIX
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
217 || type == DT_LTAG
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
218 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 || type == DT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 ))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
225 if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 if (ptag_entry.tagname != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 && STRCMP(ptag_entry.tagname, tag) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 /* Jumping to same tag: keep the current match, so that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 * the CursorHold autocommand example works. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 cur_match = ptag_entry.cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 cur_fnum = ptag_entry.cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 vim_free(ptag_entry.tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 if ((ptag_entry.tagname = vim_strsave(tag)) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 goto end_do_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 * If the last used entry is not at the top, delete all tag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 * stack entries above it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 while (tagstackidx < tagstacklen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 vim_free(tagstack[--tagstacklen].tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 /* if the tagstack is full: remove oldest entry */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 if (++tagstacklen > TAGSTACKSIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
255 tagstacklen = TAGSTACKSIZE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 vim_free(tagstack[0].tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 for (i = 1; i < tagstacklen; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 tagstack[i - 1] = tagstack[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 --tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 * put the tag name in the tag stack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 if ((tagstack[tagstackidx].tagname = vim_strsave(tag)) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 curwin->w_tagstacklen = tagstacklen - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 goto end_do_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 curwin->w_tagstacklen = tagstacklen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 save_pos = TRUE; /* save the cursor position below */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 new_tag = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 if (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
281 g_do_tagpreview != 0 ? ptag_entry.tagname == NULL :
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 tagstacklen == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 /* empty stack */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 EMSG(_(e_tagstack));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 goto end_do_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 if (type == DT_POP) /* go to older position */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 int old_KeyTyped = KeyTyped;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 if ((tagstackidx -= count) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 EMSG(_(bottommsg));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 if (tagstackidx + count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 /* We did [num]^T from the bottom of the stack */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 tagstackidx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 goto end_do_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 /* We weren't at the bottom of the stack, so jump all the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 * way to the bottom now.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 tagstackidx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 else if (tagstackidx >= tagstacklen) /* count == 0? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 EMSG(_(topmsg));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 goto end_do_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 /* Make a copy of the fmark, autocommands may invalidate the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 * tagstack before it's used. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 saved_fmark = tagstack[tagstackidx].fmark;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 if (saved_fmark.fnum != curbuf->b_fnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
320 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
321 * Jump to other file. If this fails (e.g. because the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
322 * file was changed) keep original position in tag stack.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 if (buflist_getfile(saved_fmark.fnum, saved_fmark.mark.lnum,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 GETF_SETMARK, forceit) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 tagstackidx = oldtagstackidx; /* back to old posn */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 goto end_do_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 /* An BufReadPost autocommand may jump to the '" mark, but
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 * we don't what that here. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 curwin->w_cursor.lnum = saved_fmark.mark.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 setpcmark();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 curwin->w_cursor.lnum = saved_fmark.mark.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 curwin->w_cursor.col = saved_fmark.mark.col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 check_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343 if ((fdo_flags & FDO_TAG) && old_KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
344 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
347 /* remove the old list of matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
348 FreeWild(num_matches, matches);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350 cs_free_tags();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
351 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
352 num_matches = 0;
845
0fe7765dcb8e updated for version 7.0f03
vimboss
parents: 838
diff changeset
353 tag_freematch();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
354 goto end_do_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
355 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
356
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
357 if (type == DT_TAG
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
358 #if defined(FEAT_QUICKFIX)
845
0fe7765dcb8e updated for version 7.0f03
vimboss
parents: 838
diff changeset
359 || type == DT_LTAG
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
360 #endif
845
0fe7765dcb8e updated for version 7.0f03
vimboss
parents: 838
diff changeset
361 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
364 if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 cur_match = ptag_entry.cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 cur_fnum = ptag_entry.cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 /* ":tag" (no argument): go to newer pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 save_pos = TRUE; /* save the cursor position below */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 if ((tagstackidx += count - 1) >= tagstacklen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 * Beyond the last one, just give an error message and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 * go to the last one. Don't store the cursor
1204
a3c21128b246 updated for version 7.1b
vimboss
parents: 1146
diff changeset
379 * position.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 tagstackidx = tagstacklen - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 EMSG(_(topmsg));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 save_pos = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 else if (tagstackidx < 0) /* must have been count == 0 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 EMSG(_(bottommsg));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 tagstackidx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 goto end_do_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 cur_match = tagstack[tagstackidx].cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 cur_fnum = tagstack[tagstackidx].cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 new_tag = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 else /* go to other matching tag */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 /* Save index for when selection is cancelled. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 prevtagstackidx = tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
402 if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 cur_match = ptag_entry.cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 cur_fnum = ptag_entry.cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 if (--tagstackidx < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411 tagstackidx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 cur_match = tagstack[tagstackidx].cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 cur_fnum = tagstack[tagstackidx].cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 switch (type)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 case DT_FIRST: cur_match = count - 1; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 case DT_SELECT:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 case DT_JUMP:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
420 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
421 case DT_CSCOPE:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
422 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
423 case DT_LAST: cur_match = MAXCOL - 1; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
424 case DT_NEXT: cur_match += count; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
425 case DT_PREV: cur_match -= count; break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
426 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
427 if (cur_match >= MAXCOL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 cur_match = MAXCOL - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429 else if (cur_match < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 EMSG(_("E425: Cannot go before first matching tag"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 skip_msg = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 cur_match = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 cur_fnum = curbuf->b_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
440 if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 if (type != DT_SELECT && type != DT_JUMP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 ptag_entry.cur_match = cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 ptag_entry.cur_fnum = cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
447 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
448 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 * For ":tag [arg]" or ":tselect" remember position before the jump.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 saved_fmark = tagstack[tagstackidx].fmark;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 if (save_pos)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 tagstack[tagstackidx].fmark.mark = curwin->w_cursor;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 tagstack[tagstackidx].fmark.fnum = curbuf->b_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
459 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 /* Curwin will change in the call to jumpto_tag() if ":stag" was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 * used or an autocommand jumps to another window; store value of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 * tagstackidx now. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
464 curwin->w_tagstackidx = tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 if (type != DT_SELECT && type != DT_JUMP)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
466 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
467 curwin->w_tagstack[tagstackidx].cur_match = cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
468 curwin->w_tagstack[tagstackidx].cur_fnum = cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
469 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
470 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
471 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
472
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
473 /* When not using the current buffer get the name of buffer "cur_fnum".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
474 * Makes sure that the tag order doesn't change when using a remembered
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
475 * position for "cur_match". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476 if (cur_fnum != curbuf->b_fnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
477 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478 buf_T *buf = buflist_findnr(cur_fnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 if (buf != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 buf_ffname = buf->b_ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 * Repeat searching for tags, when a file has not been found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 * When desired match not found yet, try to find it (and others).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 if (use_tagstack)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493 name = tagstack[tagstackidx].tagname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
495 else if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 name = ptag_entry.tagname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 name = tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 other_name = (tagmatchname == NULL || STRCMP(tagmatchname, name) != 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 if (new_tag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 || (cur_match >= num_matches && max_num_matches != MAXCOL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 || other_name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 if (other_name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 vim_free(tagmatchname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 tagmatchname = vim_strsave(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510
6851
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
511 if (type == DT_TAG || type == DT_SELECT || type == DT_JUMP
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
512 #if defined(FEAT_QUICKFIX)
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
513 || type == DT_LTAG
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
514 #endif
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
515 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 cur_match = MAXCOL - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 max_num_matches = cur_match + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 /* when the argument starts with '/', use it as a regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 if (!no_regexp && *name == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 flags = TAG_REGEXP;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 ++name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 flags = TAG_NOIC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 if (type == DT_CSCOPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 flags = TAG_CSCOPE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 if (verbose)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 flags |= TAG_VERBOSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 if (find_tags(name, &new_num_matches, &new_matches, flags,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 max_num_matches, buf_ffname) == OK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 && new_num_matches < max_num_matches)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 max_num_matches = MAXCOL; /* If less than max_num_matches
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 found: all matches found. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540 /* If there already were some matches for the same name, move them
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 * to the start. Avoids that the order changes when using
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 * ":tnext" and jumping to another file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 if (!new_tag && !other_name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 /* Find the position of each old match in the new list. Need
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 * to use parse_match() to find the tag line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 idx = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 for (j = 0; j < num_matches; ++j)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 parse_match(matches[j], &tagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 for (i = idx; i < new_num_matches; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 parse_match(new_matches[i], &tagp2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 if (STRCMP(tagp.tagname, tagp2.tagname) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 p = new_matches[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 for (k = i; k > idx; --k)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 new_matches[k] = new_matches[k - 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 new_matches[idx++] = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 FreeWild(num_matches, matches);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 num_matches = new_num_matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 matches = new_matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 if (num_matches <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 if (verbose)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 EMSG2(_("E426: tag not found: %s"), name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 g_do_tagpreview = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 int ask_for_selection = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 if (type == DT_CSCOPE && num_matches > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 cs_print_tags();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 ask_for_selection = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 #endif
6851
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
590 if (type == DT_TAG)
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
591 /*
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
592 * If a count is supplied to the ":tag <name>" command, then
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
593 * jump to count'th matching tag.
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
594 */
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
595 cur_match = count > 0 ? count - 1 : 0;
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
596 else if (type == DT_SELECT || (type == DT_JUMP && num_matches > 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 * List all the matching tags.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 * Assume that the first match indicates how long the tags can
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 * be, and align the file names to that.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 parse_match(matches[0], &tagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 taglen = (int)(tagp.tagname_end - tagp.tagname + 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 if (taglen < 18)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 taglen = 18;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 if (taglen > Columns - 25)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 taglen = MAXCOL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 if (msg_col == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 msg_didout = FALSE; /* overwrite previous message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 msg_start();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 MSG_PUTS_ATTR(_(" # pri kind tag"), hl_attr(HLF_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 msg_clr_eos();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
614 taglen_advance(taglen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 MSG_PUTS_ATTR(_("file\n"), hl_attr(HLF_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
616
1826
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
617 for (i = 0; i < num_matches && !got_int; ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 parse_match(matches[i], &tagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 if (!new_tag && (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
622 (g_do_tagpreview != 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 && i == ptag_entry.cur_match) ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 (use_tagstack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 && i == tagstack[tagstackidx].cur_match)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 *IObuff = '>';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 *IObuff = ' ';
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
630 vim_snprintf((char *)IObuff + 1, IOSIZE - 1,
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
631 "%2d %s ", i + 1,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 mt_names[matches[i][0] & MT_MASK]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
633 msg_puts(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 if (tagp.tagkind != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 msg_outtrans_len(tagp.tagkind,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 (int)(tagp.tagkind_end - tagp.tagkind));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 msg_advance(13);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 msg_outtrans_len_attr(tagp.tagname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 (int)(tagp.tagname_end - tagp.tagname),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
640 hl_attr(HLF_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
641 msg_putchar(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
642 taglen_advance(taglen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 /* Find out the actual file name. If it is long, truncate
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 * it and put "..." in the middle */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 p = tag_full_fname(&tagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 msg_puts_long_attr(p, hl_attr(HLF_D));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 if (msg_col > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 msg_putchar('\n');
1826
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
654 if (got_int)
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
655 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 msg_advance(15);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 /* print any extra fields */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 command_end = tagp.command_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 if (command_end != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 p = command_end + 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
663 while (*p && *p != '\r' && *p != '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665 while (*p == TAB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 /* skip "file:" without a value (static tag) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 if (STRNCMP(p, "file:", 5) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 && vim_isspace(p[5]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 p += 5;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 /* skip "kind:<kind>" and "<kind>" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 if (p == tagp.tagkind
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 || (p + 5 == tagp.tagkind
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 && STRNCMP(p, "kind:", 5) == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 p = tagp.tagkind_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
683 /* print all other extra fields */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
684 attr = hl_attr(HLF_CM);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
685 while (*p && *p != '\r' && *p != '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
686 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
687 if (msg_col + ptr2cells(p) >= Columns)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
688 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
689 msg_putchar('\n');
1826
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
690 if (got_int)
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
691 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 msg_advance(15);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 p = msg_outtrans_one(p, attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 if (*p == TAB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 msg_puts_attr((char_u *)" ", attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 if (*p == ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 attr = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
704 if (msg_col > 15)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
706 msg_putchar('\n');
1826
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
707 if (got_int)
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
708 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
709 msg_advance(15);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
710 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
711 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
712 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 for (p = tagp.command;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 *p && *p != '\r' && *p != '\n'; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 command_end = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 * Put the info (in several lines) at column 15.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 * Don't display "/^" and "?^".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 p = tagp.command;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 if (*p == '/' || *p == '?')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 if (*p == '^')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 /* Remove leading whitespace from pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732 while (p != command_end && vim_isspace(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 while (p != command_end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 if (msg_col + (*p == TAB ? 1 : ptr2cells(p)) > Columns)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 msg_putchar('\n');
1826
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
739 if (got_int)
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
740 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
741 msg_advance(15);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742
5792
8d1ba0a23588 updated for version 7.4.240
Bram Moolenaar <bram@vim.org>
parents: 5513
diff changeset
743 /* skip backslash used for escaping a command char or
8d1ba0a23588 updated for version 7.4.240
Bram Moolenaar <bram@vim.org>
parents: 5513
diff changeset
744 * a backslash */
8d1ba0a23588 updated for version 7.4.240
Bram Moolenaar <bram@vim.org>
parents: 5513
diff changeset
745 if (*p == '\\' && (*(p + 1) == *tagp.command
8d1ba0a23588 updated for version 7.4.240
Bram Moolenaar <bram@vim.org>
parents: 5513
diff changeset
746 || *(p + 1) == '\\'))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 if (*p == TAB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 msg_putchar(' ');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755 p = msg_outtrans_one(p, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
757 /* don't display the "$/;\"" and "$?;\"" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
758 if (p == command_end - 2 && *p == '$'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 && *(p + 1) == *tagp.command)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761 /* don't display matching '/' or '?' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762 if (p == command_end - 1 && *p == *tagp.command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763 && (*p == '/' || *p == '?'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 if (msg_col)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 }
1826
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
770 if (got_int)
b9202c4cf847 updated for version 7.2-124
vimboss
parents: 1818
diff changeset
771 got_int = FALSE; /* only stop the listing */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 ask_for_selection = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 }
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
774 #if defined(FEAT_QUICKFIX) && defined(FEAT_EVAL)
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
775 else if (type == DT_LTAG)
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
776 {
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
777 list_T *list;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
778 char_u tag_name[128 + 1];
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
779 char_u *fname;
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
780 char_u *cmd;
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
781
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
782 /*
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
783 * Add the matching tags to the location list for the current
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
784 * window.
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
785 */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
786
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
787 fname = alloc(MAXPATHL + 1);
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
788 cmd = alloc(CMDBUFFSIZE + 1);
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
789 list = list_alloc();
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
790 if (list == NULL || fname == NULL || cmd == NULL)
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
791 {
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
792 vim_free(cmd);
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
793 vim_free(fname);
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
794 if (list != NULL)
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
795 list_free(list);
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
796 goto end_do_tag;
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
797 }
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
798
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
799 for (i = 0; i < num_matches; ++i)
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
800 {
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
801 int len, cmd_len;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
802 long lnum;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
803 dict_T *dict;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
804
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
805 parse_match(matches[i], &tagp);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
806
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
807 /* Save the tag name */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 816
diff changeset
808 len = (int)(tagp.tagname_end - tagp.tagname);
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
809 if (len > 128)
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
810 len = 128;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
811 vim_strncpy(tag_name, tagp.tagname, len);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
812 tag_name[len] = NUL;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
813
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
814 /* Save the tag file name */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
815 p = tag_full_fname(&tagp);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
816 if (p == NULL)
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
817 continue;
2768
c5e47b752f07 updated for version 7.3.160
Bram Moolenaar <bram@vim.org>
parents: 2713
diff changeset
818 vim_strncpy(fname, p, MAXPATHL);
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
819 vim_free(p);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
820
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
821 /*
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
822 * Get the line number or the search pattern used to locate
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
823 * the tag.
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
824 */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
825 lnum = 0;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
826 if (isdigit(*tagp.command))
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
827 /* Line number is used to locate the tag */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
828 lnum = atol((char *)tagp.command);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
829 else
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
830 {
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
831 char_u *cmd_start, *cmd_end;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
832
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
833 /* Search pattern is used to locate the tag */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
834
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
835 /* Locate the end of the command */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
836 cmd_start = tagp.command;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
837 cmd_end = tagp.command_end;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
838 if (cmd_end == NULL)
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
839 {
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
840 for (p = tagp.command;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
841 *p && *p != '\r' && *p != '\n'; ++p)
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
842 ;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
843 cmd_end = p;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
844 }
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
845
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
846 /*
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
847 * Now, cmd_end points to the character after the
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
848 * command. Adjust it to point to the last
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
849 * character of the command.
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
850 */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
851 cmd_end--;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
852
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
853 /*
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
854 * Skip the '/' and '?' characters at the
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
855 * beginning and end of the search pattern.
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
856 */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
857 if (*cmd_start == '/' || *cmd_start == '?')
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
858 cmd_start++;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
859
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
860 if (*cmd_end == '/' || *cmd_end == '?')
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
861 cmd_end--;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
862
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
863 len = 0;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
864 cmd[0] = NUL;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
865
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
866 /*
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
867 * If "^" is present in the tag search pattern, then
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
868 * copy it first.
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
869 */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
870 if (*cmd_start == '^')
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
871 {
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
872 STRCPY(cmd, "^");
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
873 cmd_start++;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
874 len++;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
875 }
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
876
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
877 /*
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
878 * Precede the tag pattern with \V to make it very
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
879 * nomagic.
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
880 */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
881 STRCAT(cmd, "\\V");
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
882 len += 2;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
883
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 816
diff changeset
884 cmd_len = (int)(cmd_end - cmd_start + 1);
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
885 if (cmd_len > (CMDBUFFSIZE - 5))
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
886 cmd_len = CMDBUFFSIZE - 5;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
887 STRNCAT(cmd, cmd_start, cmd_len);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
888 len += cmd_len;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
889
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
890 if (cmd[len - 1] == '$')
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
891 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
892 /*
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
893 * Replace '$' at the end of the search pattern
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
894 * with '\$'
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
895 */
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
896 cmd[len - 1] = '\\';
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
897 cmd[len] = '$';
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
898 len++;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
899 }
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
900
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
901 cmd[len] = NUL;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
902 }
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
903
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
904 if ((dict = dict_alloc()) == NULL)
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
905 continue;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
906 if (list_append_dict(list, dict) == FAIL)
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
907 {
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
908 vim_free(dict);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
909 continue;
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
910 }
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
911
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
912 dict_add_nr_str(dict, "text", 0L, tag_name);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
913 dict_add_nr_str(dict, "filename", 0L, fname);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
914 dict_add_nr_str(dict, "lnum", lnum, NULL);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
915 if (lnum == 0)
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
916 dict_add_nr_str(dict, "pattern", 0L, cmd);
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
917 }
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
918
2533
364f1cd9a3dc Fix compiler warning.
Bram Moolenaar <bram@vim.org>
parents: 2530
diff changeset
919 vim_snprintf((char *)IObuff, IOSIZE, "ltag %s", tag);
2530
9fe4164cb586 Fix: :ltag command did not set w:quickfix_title. (Lech Lorens)
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
920 set_errorlist(curwin, list, ' ', IObuff);
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
921
8863
e1b84109506a commit https://github.com/vim/vim/commit/107e1eef1df3b786ad3ad49fbdb9e058649303b5
Christian Brabandt <cb@256bit.org>
parents: 8524
diff changeset
922 list_free(list);
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
923 vim_free(fname);
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
924 vim_free(cmd);
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
925
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
926 cur_match = 0; /* Jump to the first tag */
649
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
927 }
8157079cea85 updated for version 7.0191
vimboss
parents: 602
diff changeset
928 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 if (ask_for_selection == TRUE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 * Ask to select a tag from the list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 */
373
a0e3c8a6d200 updated for version 7.0096
vimboss
parents: 359
diff changeset
935 i = prompt_for_number(NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 if (i <= 0 || i > num_matches || got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938 /* no valid choice: don't change anything */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 if (use_tagstack)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 tagstack[tagstackidx].fmark = saved_fmark;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 tagstackidx = prevtagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 cs_free_tags();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
946 jumped_to_tag = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950 cur_match = i - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 if (cur_match >= num_matches)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955 /* Avoid giving this error when a file wasn't found and we're
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956 * looking for a match in another file, which wasn't found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 * There will be an EMSG("file doesn't exist") below then. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958 if ((type == DT_NEXT || type == DT_FIRST)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 && nofile_fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 if (num_matches == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 EMSG(_("E427: There is only one matching tag"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964 EMSG(_("E428: Cannot go beyond last matching tag"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 skip_msg = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 cur_match = num_matches - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 if (use_tagstack)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 tagstack[tagstackidx].cur_match = cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 tagstack[tagstackidx].cur_fnum = cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 ++tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
976 else if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 ptag_entry.cur_match = cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 ptag_entry.cur_fnum = cur_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 * Only when going to try the next match, report that the previous
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 * file didn't exist. Otherwise an EMSG() is given below.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 if (nofile_fname != NULL && error_cur_match != cur_match)
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
988 smsg((char_u *)_("File \"%s\" does not exist"), nofile_fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
989
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
990
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 ic = (matches[cur_match][0] & MT_IC_OFF);
6851
b782813c73a6 patch 7.4.746
Bram Moolenaar <bram@vim.org>
parents: 5792
diff changeset
992 if (type != DT_TAG && type != DT_SELECT && type != DT_JUMP
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
993 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
994 && type != DT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 && (num_matches > 1 || ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 && !skip_msg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
999 /* Give an indication of the number of matching tags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000 sprintf((char *)IObuff, _("tag %d of %d%s"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001 cur_match + 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 num_matches,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 max_num_matches != MAXCOL ? _(" or more") : "");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004 if (ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 STRCAT(IObuff, _(" Using tag with different case!"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006 if ((num_matches > prev_num_matches || new_tag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 && num_matches > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 if (ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010 msg_attr(IObuff, hl_attr(HLF_W));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 msg(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 msg_scroll = TRUE; /* don't overwrite this message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 give_warning(IObuff, ic);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 if (ic && !msg_scrolled && msg_silent == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 ui_delay(1000L, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1024 #ifdef FEAT_AUTOCMD
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1025 /* Let the SwapExists event know what tag we are jumping to. */
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1026 vim_snprintf((char *)IObuff, IOSIZE, ":ta %s\r", name);
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1027 set_vim_var_string(VV_SWAPCOMMAND, IObuff, -1);
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1028 #endif
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1029
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 * Jump to the desired match.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 */
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1033 i = jumpto_tag(matches[cur_match], forceit, type != DT_CSCOPE);
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1034
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1035 #ifdef FEAT_AUTOCMD
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1036 set_vim_var_string(VV_SWAPCOMMAND, NULL, -1);
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1037 #endif
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1038
bc49ed25543d updated for version 7.0167
vimboss
parents: 514
diff changeset
1039 if (i == NOTAGFILE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1040 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041 /* File not found: try again with another matching tag */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 if ((type == DT_PREV && cur_match > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043 || ((type == DT_TAG || type == DT_NEXT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1044 || type == DT_FIRST)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 && (max_num_matches != MAXCOL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046 || cur_match < num_matches - 1)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048 error_cur_match = cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 if (use_tagstack)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050 --tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051 if (type == DT_PREV)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 --cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1054 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1055 type = DT_NEXT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1056 ++cur_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1057 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1058 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 EMSG2(_("E429: File \"%s\" does not exist"), nofile_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1061 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064 /* We may have jumped to another window, check that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1065 * tagstackidx is still valid. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 if (use_tagstack && tagstackidx > curwin->w_tagstacklen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 tagstackidx = curwin->w_tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 jumped_to_tag = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1074 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 end_do_tag:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 /* Only store the new index when using the tagstack and it's valid. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078 if (use_tagstack && tagstackidx <= curwin->w_tagstacklen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1079 curwin->w_tagstackidx = tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081 postponed_split = 0; /* don't split next time */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1082 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1083
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1084 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085 return jumped_to_tag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 * Free cached tags.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1095 tag_freematch(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 vim_free(tagmatchname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 tagmatchname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1102 taglen_advance(int l)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 if (l == MAXCOL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107 msg_advance(24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 msg_advance(13 + l);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 * Print the tag stack
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1117 do_tags(exarg_T *eap UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1118 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 taggy_T *tagstack = curwin->w_tagstack;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 int tagstackidx = curwin->w_tagstackidx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 int tagstacklen = curwin->w_tagstacklen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 /* Highlight title */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 MSG_PUTS_TITLE(_("\n # TO tag FROM line in file/text"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 for (i = 0; i < tagstacklen; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 if (tagstack[i].tagname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 name = fm_getname(&(tagstack[i].fmark), 30);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 if (name == NULL) /* file name not available */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 sprintf((char *)IObuff, "%c%2d %2d %-15s %5ld ",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 i == tagstackidx ? '>' : ' ',
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 i + 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 tagstack[i].cur_match + 1,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 tagstack[i].tagname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 tagstack[i].fmark.mark.lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 msg_outtrans(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 msg_outtrans_attr(name, tagstack[i].fmark.fnum == curbuf->b_fnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144 ? hl_attr(HLF_D) : 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1145 vim_free(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1146 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 out_flush(); /* show one line at a time */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 if (tagstackidx == tagstacklen) /* idx at top of stack */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 MSG_PUTS("\n>");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153 /* When not using a CR for line separator, use vim_fgets() to read tag lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 * For the Mac use tag_fgets(). It can handle any line separator, but is much
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155 * slower than vim_fgets().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157 #ifndef USE_CR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1158 # define tag_fgets vim_fgets
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1160
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1161 #ifdef FEAT_TAG_BINS
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
1162 static int tag_strnicmp(char_u *s1, char_u *s2, size_t len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1165 * Compare two strings, for length "len", ignoring case the ASCII way.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1166 * return 0 for match, < 0 for smaller, > 0 for bigger
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1167 * Make sure case is folded to uppercase in comparison (like for 'sort -f')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1168 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1170 tag_strnicmp(char_u *s1, char_u *s2, size_t len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1172 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1173
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174 while (len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1175 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176 i = (int)TOUPPER_ASC(*s1) - (int)TOUPPER_ASC(*s2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1177 if (i != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1178 return i; /* this character different */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1179 if (*s1 == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1180 break; /* strings match until NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181 ++s1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1182 ++s2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1183 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1184 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1185 return 0; /* strings match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1186 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1187 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1189 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1190 * Structure to hold info about the tag pattern being used.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1191 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 typedef struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194 char_u *pat; /* the pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195 int len; /* length of pat[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1196 char_u *head; /* start of pattern head */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1197 int headlen; /* length of head[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1198 regmatch_T regmatch; /* regexp program, may be NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 } pat_T;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1200
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
1201 static void prepare_pats(pat_T *pats, int has_re);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1202
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1203 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1204 * Extract info from the tag search pattern "pats->pat".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1207 prepare_pats(pat_T *pats, int has_re)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1208 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 pats->head = pats->pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1210 pats->headlen = pats->len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1211 if (has_re)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213 /* When the pattern starts with '^' or "\\<", binary searching can be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 * used (much faster). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 if (pats->pat[0] == '^')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216 pats->head = pats->pat + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 else if (pats->pat[0] == '\\' && pats->pat[1] == '<')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 pats->head = pats->pat + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1219 if (pats->head == pats->pat)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1220 pats->headlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1222 for (pats->headlen = 0; pats->head[pats->headlen] != NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223 ++pats->headlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1224 if (vim_strchr((char_u *)(p_magic ? ".[~*\\$" : "\\$"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225 pats->head[pats->headlen]) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227 if (p_tl != 0 && pats->headlen > p_tl) /* adjust for 'taglength' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228 pats->headlen = p_tl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1229 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 if (has_re)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232 pats->regmatch.regprog = vim_regcomp(pats->pat, p_magic ? RE_MAGIC : 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 pats->regmatch.regprog = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 * find_tags() - search for tags in tags files
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1239 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 * Return FAIL if search completely failed (*num_matches will be 0, *matchesp
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 * will be NULL), OK otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 * There is a priority in which type of tag is recognized.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 * 6. A static or global tag with a full matching tag for the current file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 * 5. A global tag with a full matching tag for another file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 * 4. A static tag with a full matching tag for another file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 * 3. A static or global tag with an ignore-case matching tag for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 * current file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 * 2. A global tag with an ignore-case matching tag for another file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 * 1. A static tag with an ignore-case matching tag for another file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253 * Tags in an emacs-style tags file are always global.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 * flags:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 * TAG_HELP only search for help tags
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 * TAG_NAMES only return name of tag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 * TAG_REGEXP use "pat" as a regexp
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 * TAG_NOIC don't always ignore case
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 * TAG_KEEP_LANG keep language
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1263 find_tags(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1264 char_u *pat, /* pattern to search for */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1265 int *num_matches, /* return: number of matches found */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1266 char_u ***matchesp, /* return: array of matches found */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1267 int flags,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1268 int mincount, /* MAXCOL: find all matches
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 other: minimal number of matches */
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
1270 char_u *buf_ffname) /* name of buffer for priority */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 FILE *fp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 char_u *lbuf; /* line buffer */
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1274 int lbuf_size = LSIZE; /* length of lbuf */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 char_u *tag_fname; /* name of tag file */
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
1276 tagname_T tn; /* info for get_tagfname() */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 int first_file; /* trying first tag file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 tagptrs_T tagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 int did_open = FALSE; /* did open a tag file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 int stop_searching = FALSE; /* stop when match found or error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 int retval = FAIL; /* return value */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 int is_static; /* current tag line is static */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 int is_current; /* file name matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 int eof = FALSE; /* found end-of-file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 #ifdef FEAT_TAG_BINS
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1289 int tag_file_sorted = NUL; /* !_TAG_FILE_SORTED value */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 struct tag_search_info /* Binary search file offsets */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 off_t low_offset; /* offset for first char of first line that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 could match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 off_t high_offset; /* offset of char after last line that could
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 off_t curr_offset; /* Current file offset in search range */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 off_t curr_offset_used; /* curr_offset used when skipping back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 off_t match_offset; /* Where the binary search found a tag */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 int low_char; /* first char at low_offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 int high_char; /* first char at high_offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 } search_info;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 off_t filesize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 int tagcmp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 off_t offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 int round;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307 enum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 TS_START, /* at start of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 TS_LINEAR /* linear searching forward, till EOF */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 #ifdef FEAT_TAG_BINS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 , TS_BINARY, /* binary searching */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313 TS_SKIP_BACK, /* skipping backwards */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 TS_STEP_FORWARD /* stepping forwards */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 } state; /* Current search state */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 int cmplen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 int match; /* matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 int match_no_ic = 0;/* matches with rm_ic == FALSE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 int match_re; /* match with regexp */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322 int matchoff = 0;
5513
eed95874f30e updated for version 7.4.105
Bram Moolenaar <bram@vim.org>
parents: 5458
diff changeset
1323 int save_emsg_off;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 * Stack for included emacs-tags file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 * It has a fixed size, to truncate cyclic includes. jw
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 # define INCSTACK_SIZE 42
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 FILE *fp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 char_u *etag_fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 } incstack[INCSTACK_SIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 int incstack_idx = 0; /* index in incstack */
1204
a3c21128b246 updated for version 7.1b
vimboss
parents: 1146
diff changeset
1338 char_u *ebuf; /* additional buffer for etag fname */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339 int is_etag; /* current file is emaces style */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 struct match_found
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 int len; /* nr of chars of match[] to be compared */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 char_u match[1]; /* actually longer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 } *mfp, *mfp2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 garray_T ga_match[MT_COUNT];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 int match_count = 0; /* number of matches found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 char_u **matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 int mtt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 int help_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 int help_pri = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 char_u *help_lang_find = NULL; /* lang to be found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 char_u help_lang[3]; /* lang of current tags file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 char_u *saved_pat = NULL; /* copy of pat[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 pat_T orgpat; /* holds unconverted pattern info */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 vimconv_T vimconv;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 #ifdef FEAT_TAG_BINS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 int findall = (mincount == MAXCOL || mincount == TAG_MANY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366 /* find all matching tags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 int sort_error = FALSE; /* tags file not sorted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 int linear; /* do a linear search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 int sortic = FALSE; /* tag file sorted in nocase */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 int line_error = FALSE; /* syntax error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 int has_re = (flags & TAG_REGEXP); /* regexp used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1373 int help_only = (flags & TAG_HELP);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1374 int name_only = (flags & TAG_NAMES);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1375 int noic = (flags & TAG_NOIC);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1376 int get_it_again = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1377 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1378 int use_cscope = (flags & TAG_CSCOPE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1379 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1380 int verbose = (flags & TAG_VERBOSE);
7266
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1381 int save_p_ic = p_ic;
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1382
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1383 /*
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1384 * 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
1385 * duration of this function.
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1386 */
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1387 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
1388 {
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1389 case TC_FOLLOWIC: break;
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1390 case TC_IGNORE: p_ic = TRUE; break;
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1391 case TC_MATCH: p_ic = FALSE; break;
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
1392 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1393
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1394 help_save = curbuf->b_help;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1395 orgpat.pat = pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1396 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1397 vimconv.vc_type = CONV_NONE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1398 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1399
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1400 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1401 * Allocate memory for the buffers that are used
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1402 */
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1403 lbuf = alloc(lbuf_size);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1404 tag_fname = alloc(MAXPATHL + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1405 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1406 ebuf = alloc(LSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1407 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1408 for (mtt = 0; mtt < MT_COUNT; ++mtt)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1409 ga_init2(&ga_match[mtt], (int)sizeof(struct match_found *), 100);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1410
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1411 /* check for out of memory situation */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1412 if (lbuf == NULL || tag_fname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1413 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1414 || ebuf == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1415 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1416 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1417 goto findtag_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1418
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1419 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1420 STRCPY(tag_fname, "from cscope"); /* for error messages */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1421 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1422
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1423 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1424 * Initialize a few variables
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1425 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1426 if (help_only) /* want tags from help file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 curbuf->b_help = TRUE; /* will be restored later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1429 orgpat.len = (int)STRLEN(pat);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 if (curbuf->b_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 /* When "@ab" is specified use only the "ab" language, otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 * search all languages. */
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1435 if (orgpat.len > 3 && pat[orgpat.len - 3] == '@'
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1436 && ASCII_ISALPHA(pat[orgpat.len - 2])
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1437 && ASCII_ISALPHA(pat[orgpat.len - 1]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1439 saved_pat = vim_strnsave(pat, orgpat.len - 3);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 if (saved_pat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1442 help_lang_find = &pat[orgpat.len - 2];
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1443 orgpat.pat = saved_pat;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1444 orgpat.len -= 3;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 #endif
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1449 if (p_tl != 0 && orgpat.len > p_tl) /* adjust for 'taglength' */
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1450 orgpat.len = p_tl;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1451
5513
eed95874f30e updated for version 7.4.105
Bram Moolenaar <bram@vim.org>
parents: 5458
diff changeset
1452 save_emsg_off = emsg_off;
eed95874f30e updated for version 7.4.105
Bram Moolenaar <bram@vim.org>
parents: 5458
diff changeset
1453 emsg_off = TRUE; /* don't want error for invalid RE here */
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1454 prepare_pats(&orgpat, has_re);
5513
eed95874f30e updated for version 7.4.105
Bram Moolenaar <bram@vim.org>
parents: 5458
diff changeset
1455 emsg_off = save_emsg_off;
3784
a638ae0f1b0c updated for version 7.3.650
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
1456 if (has_re && orgpat.regmatch.regprog == NULL)
a638ae0f1b0c updated for version 7.3.650
Bram Moolenaar <bram@vim.org>
parents: 3263
diff changeset
1457 goto findtag_end;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1459 #ifdef FEAT_TAG_BINS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 /* This is only to avoid a compiler warning for using search_info
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 * uninitialised. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 vim_memset(&search_info, 0, (size_t)1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464
413
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1465 /*
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1466 * When finding a specified number of matches, first try with matching
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1467 * case, so binary search can be used, and try ignore-case matches in a
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1468 * second loop.
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1469 * When finding all matches, 'tagbsearch' is off, or there is no fixed
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1470 * string to look for, ignore case right away to avoid going though the
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1471 * tags files twice.
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1472 * When the tag file is case-fold sorted, it is either one or the other.
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1473 * Only ignore case when TAG_NOIC not used or 'ignorecase' set.
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
1474 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1475 #ifdef FEAT_TAG_BINS
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1476 orgpat.regmatch.rm_ic = ((p_ic || !noic)
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1477 && (findall || orgpat.headlen == 0 || !p_tbs));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 for (round = 1; round <= 2; ++round)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1480 linear = (orgpat.headlen == 0 || !p_tbs || round == 2);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 #else
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1482 orgpat.regmatch.rm_ic = (p_ic || !noic);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1483 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1485 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1486 * Try tag file names from tags option one by one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488 for (first_file = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 use_cscope ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491 #endif
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
1492 get_tagfname(&tn, first_file, tag_fname) == OK;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
1493 first_file = FALSE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 * A file that doesn't exist is silently ignored. Only when not a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 * single file is found, an error message is given (further on).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 if (use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 fp = NULL; /* avoid GCC warning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 if (curbuf->b_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 /* Prefer help tags according to 'helplang'. Put the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1509 * two-letter language name in help_lang[]. */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 816
diff changeset
1510 i = (int)STRLEN(tag_fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511 if (i > 3 && tag_fname[i - 3] == '-')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 STRCPY(help_lang, tag_fname + i - 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 STRCPY(help_lang, "en");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 /* When searching for a specific language skip tags files
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 * for other languages. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 if (help_lang_find != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 && STRICMP(help_lang, help_lang_find) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 /* For CTRL-] in a help file prefer a match with the same
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 * language. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 if ((flags & TAG_KEEP_LANG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 && help_lang_find == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 && curbuf->b_fname != NULL
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 816
diff changeset
1527 && (i = (int)STRLEN(curbuf->b_fname)) > 4
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 && curbuf->b_fname[i - 1] == 'x'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 && curbuf->b_fname[i - 4] == '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 && STRNICMP(curbuf->b_fname + i - 3, help_lang, 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 help_pri = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 help_pri = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 for (s = p_hlg; *s != NUL; ++s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 if (STRNICMP(s, help_lang, 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539 ++help_pri;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540 if ((s = vim_strchr(s, ',')) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 if (s == NULL || *s == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545 /* Language not in 'helplang': use last, prefer English,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 * unless found already. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 ++help_pri;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 if (STRICMP(help_lang, "en") != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 ++help_pri;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1554
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1555 if ((fp = mch_fopen((char *)tag_fname, "r")) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1558 if (p_verbose >= 5)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1559 {
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1560 verbose_enter();
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
1561 smsg((char_u *)_("Searching tags file %s"), tag_fname);
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1562 verbose_leave();
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
1563 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 did_open = TRUE; /* remember that we found at least one file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1566
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 state = TS_START; /* we're at the start of the file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1568 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 is_etag = 0; /* default is: not emacs style */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 * Read and parse the lines in the file one by one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 line_breakcheck(); /* check for CTRL-C typed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 #ifdef FEAT_INS_EXPAND
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579 if ((flags & TAG_INS_COMP)) /* Double brackets for gcc */
464
3b705e71c7b0 updated for version 7.0124
vimboss
parents: 449
diff changeset
1580 ins_compl_check_keys(30);
449
3709cf52b9b5 updated for version 7.0119
vimboss
parents: 446
diff changeset
1581 if (got_int || compl_interrupted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 stop_searching = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 /* When mincount is TAG_MANY, stop when enough matches have been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590 * found (for completion). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 if (mincount == TAG_MANY && match_count >= TAG_MANY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1593 stop_searching = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1594 retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1596 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1597 if (get_it_again)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 goto line_read_in;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 #ifdef FEAT_TAG_BINS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1600 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1601 * For binary search: compute the next offset to use.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1602 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1603 if (state == TS_BINARY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1604 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1605 offset = search_info.low_offset + ((search_info.high_offset
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1606 - search_info.low_offset) / 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1607 if (offset == search_info.curr_offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 break; /* End the binary search without a match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1609 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1610 search_info.curr_offset = offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1611 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1612
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1613 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1614 * Skipping back (after a match during binary search).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1615 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1616 else if (state == TS_SKIP_BACK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1617 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1618 search_info.curr_offset -= LSIZE * 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1619 if (search_info.curr_offset < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1620 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621 search_info.curr_offset = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 rewind(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 state = TS_STEP_FORWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1625 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 * When jumping around in the file, first read a line to find the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629 * start of the next line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631 if (state == TS_BINARY || state == TS_SKIP_BACK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633 /* Adjust the search file offset to the correct position */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 search_info.curr_offset_used = search_info.curr_offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 #ifdef HAVE_FSEEKO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636 fseeko(fp, search_info.curr_offset, SEEK_SET);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 fseek(fp, (long)search_info.curr_offset, SEEK_SET);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1639 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1640 eof = tag_fgets(lbuf, LSIZE, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1641 if (!eof && search_info.curr_offset != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1642 {
1146
0e8da252bda1 updated for version 7.1a
vimboss
parents: 1009
diff changeset
1643 /* The explicit cast is to work around a bug in gcc 3.4.2
0e8da252bda1 updated for version 7.1a
vimboss
parents: 1009
diff changeset
1644 * (repeated below). */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1645 search_info.curr_offset = ftell(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1646 if (search_info.curr_offset == search_info.high_offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1647 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 /* oops, gone a bit too far; try from low offset */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649 #ifdef HAVE_FSEEKO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1650 fseeko(fp, search_info.low_offset, SEEK_SET);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1651 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1652 fseek(fp, (long)search_info.low_offset, SEEK_SET);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1653 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1654 search_info.curr_offset = search_info.low_offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1655 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1656 eof = tag_fgets(lbuf, LSIZE, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1657 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 /* skip empty and blank lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1659 while (!eof && vim_isblankline(lbuf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1660 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 search_info.curr_offset = ftell(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1662 eof = tag_fgets(lbuf, LSIZE, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1664 if (eof)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1665 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1666 /* Hit end of file. Skip backwards. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1667 state = TS_SKIP_BACK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1668 search_info.match_offset = ftell(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1669 search_info.curr_offset = search_info.curr_offset_used;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1670 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1671 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1672 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1675 * Not jumping around in the file: Read the next line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1677 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1678 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1679 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 /* skip empty and blank lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1681 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1684 if (use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 eof = cs_fgets(lbuf, LSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1686 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1687 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1688 eof = tag_fgets(lbuf, LSIZE, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1689 } while (!eof && vim_isblankline(lbuf));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1691 if (eof)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1692 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1693 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1694 if (incstack_idx) /* this was an included file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1695 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1696 --incstack_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1697 fclose(fp); /* end of this file ... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1698 fp = incstack[incstack_idx].fp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1699 STRCPY(tag_fname, incstack[incstack_idx].etag_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1700 vim_free(incstack[incstack_idx].etag_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1701 is_etag = 1; /* (only etags can include) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1702 continue; /* ... continue with parent file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1703 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1704 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1705 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1706 break; /* end of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1707 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1709 line_read_in:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1710
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1711 #ifdef FEAT_MBYTE
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1712 if (vimconv.vc_type != CONV_NONE)
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1713 {
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1714 char_u *conv_line;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1715 int len;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1716
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1717 /* Convert every line. Converting the pattern from 'enc' to
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1718 * the tags file encoding doesn't work, because characters are
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1719 * not recognized. */
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1720 conv_line = string_convert(&vimconv, lbuf, NULL);
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1721 if (conv_line != NULL)
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1722 {
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1723 /* Copy or swap lbuf and conv_line. */
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1724 len = (int)STRLEN(conv_line) + 1;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1725 if (len > lbuf_size)
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1726 {
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1727 vim_free(lbuf);
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1728 lbuf = conv_line;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1729 lbuf_size = len;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1730 }
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1731 else
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1732 {
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1733 STRCPY(lbuf, conv_line);
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1734 vim_free(conv_line);
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1735 }
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1736 }
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1737 }
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1738 #endif
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1739
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1740
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1741 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1742 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 * Emacs tags line with CTRL-L: New file name on next line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1744 * The file name is followed by a ','.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1745 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1746 if (*lbuf == Ctrl_L) /* remember etag file name in ebuf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1748 is_etag = 1; /* in case at the start */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1749 state = TS_LINEAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1750 if (!tag_fgets(ebuf, LSIZE, fp))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 for (p = ebuf; *p && *p != ','; p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1754 *p = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 * atoi(p+1) is the number of bytes before the next ^L
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 * unless it is an include statement.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1759 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 if (STRNCMP(p + 1, "include", 7) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1761 && incstack_idx < INCSTACK_SIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763 /* Save current "fp" and "tag_fname" in the stack. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764 if ((incstack[incstack_idx].etag_fname =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765 vim_strsave(tag_fname)) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1766 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767 char_u *fullpath_ebuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 incstack[incstack_idx].fp = fp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 fp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 /* Figure out "tag_fname" and "fp" to use for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 * included file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774 fullpath_ebuf = expand_tag_fname(ebuf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 tag_fname, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 if (fullpath_ebuf != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778 fp = mch_fopen((char *)fullpath_ebuf, "r");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 if (fp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 if (STRLEN(fullpath_ebuf) > LSIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782 EMSG2(_("E430: Tag file path truncated for %s\n"), ebuf);
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
1783 vim_strncpy(tag_fname, fullpath_ebuf,
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
1784 MAXPATHL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785 ++incstack_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1786 is_etag = 0; /* we can include anything */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 vim_free(fullpath_ebuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 if (fp == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1791 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1792 /* Can't open the included file, skip it and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 * restore old value of "fp". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 fp = incstack[incstack_idx].fp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1795 vim_free(incstack[incstack_idx].etag_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1796 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1799 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1800 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805 * When still at the start of the file, check for Emacs tags file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806 * format, and for "not sorted" flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 if (state == TS_START)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809 {
5328
c47c8cd5fe5c updated for version 7.4.017
Bram Moolenaar <bram@vim.org>
parents: 4914
diff changeset
1810 /* The header ends when the line sorts below "!_TAG_". When
c47c8cd5fe5c updated for version 7.4.017
Bram Moolenaar <bram@vim.org>
parents: 4914
diff changeset
1811 * case is folded lower case letters sort before "_". */
4914
1707ddb6f5ae updated for version 7.3.1202
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
1812 if (STRNCMP(lbuf, "!_TAG_", 6) <= 0
1707ddb6f5ae updated for version 7.3.1202
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
1813 || (lbuf[0] == '!' && ASCII_ISLOWER(lbuf[1])))
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1814 {
5328
c47c8cd5fe5c updated for version 7.4.017
Bram Moolenaar <bram@vim.org>
parents: 4914
diff changeset
1815 if (STRNCMP(lbuf, "!_TAG_", 6) != 0)
c47c8cd5fe5c updated for version 7.4.017
Bram Moolenaar <bram@vim.org>
parents: 4914
diff changeset
1816 /* Non-header item before the header, e.g. "!" itself.
c47c8cd5fe5c updated for version 7.4.017
Bram Moolenaar <bram@vim.org>
parents: 4914
diff changeset
1817 */
c47c8cd5fe5c updated for version 7.4.017
Bram Moolenaar <bram@vim.org>
parents: 4914
diff changeset
1818 goto parse_line;
c47c8cd5fe5c updated for version 7.4.017
Bram Moolenaar <bram@vim.org>
parents: 4914
diff changeset
1819
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1820 /*
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1821 * Read header line.
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1822 */
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1823 #ifdef FEAT_TAG_BINS
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1824 if (STRNCMP(lbuf, "!_TAG_FILE_SORTED\t", 18) == 0)
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1825 tag_file_sorted = lbuf[18];
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1826 #endif
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1827 #ifdef FEAT_MBYTE
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1828 if (STRNCMP(lbuf, "!_TAG_FILE_ENCODING\t", 20) == 0)
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1829 {
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1830 /* Prepare to convert every line from the specified
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1831 * encoding to 'encoding'. */
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1832 for (p = lbuf + 20; *p > ' ' && *p < 127; ++p)
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1833 ;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1834 *p = NUL;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1835 convert_setup(&vimconv, lbuf + 20, p_enc);
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1836 }
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1837 #endif
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1838
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1839 /* Read the next line. Unrecognized flags are ignored. */
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1840 continue;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1841 }
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1842
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1843 /* Headers ends. */
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1844
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 #ifdef FEAT_TAG_BINS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 * When there is no tag head, or ignoring case, need to do a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 * linear search.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 * When no "!_TAG_" is found, default to binary search. If
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 * the tag file isn't sorted, the second loop will find it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 * When "!_TAG_FILE_SORTED" found: start binary search if
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 * flag set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 * For cscope, it's always linear.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 # ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 if (linear || use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 if (linear)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 state = TS_LINEAR;
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1861 else if (tag_file_sorted == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 state = TS_BINARY;
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1863 else if (tag_file_sorted == '1')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 state = TS_BINARY;
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1865 else if (tag_file_sorted == '2')
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1866 {
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1867 state = TS_BINARY;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1868 sortic = TRUE;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1869 orgpat.regmatch.rm_ic = (p_ic || !noic);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 }
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1871 else
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1872 state = TS_LINEAR;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1873
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1874 if (state == TS_BINARY && orgpat.regmatch.rm_ic && !sortic)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 {
3206
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1876 /* Binary search won't work for ignoring case, use linear
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 * search. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 linear = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879 state = TS_LINEAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882 state = TS_LINEAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 #ifdef FEAT_TAG_BINS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887 * When starting a binary search, get the size of the file and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888 * compute the first offset.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 if (state == TS_BINARY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 /* Get the tag file size (don't use mch_fstat(), it's not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 * portable). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 if ((filesize = lseek(fileno(fp),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 (off_t)0L, SEEK_END)) <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 state = TS_LINEAR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 lseek(fileno(fp), (off_t)0L, SEEK_SET);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 /* Calculate the first read offset in the file. Start
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 * the search in the middle of the file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 search_info.low_offset = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 search_info.low_char = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 search_info.high_offset = filesize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 search_info.curr_offset = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907 search_info.high_char = 0xff;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913
5328
c47c8cd5fe5c updated for version 7.4.017
Bram Moolenaar <bram@vim.org>
parents: 4914
diff changeset
1914 parse_line:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1916 * Figure out where the different strings are in this line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 * For "normal" tags: Do a quick check if the tag matches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 * This speeds up tag searching a lot!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1919 */
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
1920 if (orgpat.headlen
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 && !is_etag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 tagp.tagname = lbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 tagp.tagname_end = skiptowhite(lbuf);
3192
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1929 if (*tagp.tagname_end == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 tagp.tagname_end = vim_strchr(lbuf, TAB);
3192
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1932 if (tagp.tagname_end == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 {
3192
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1935 if (vim_strchr(lbuf, NL) == NULL)
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1936 {
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1937 /* Truncated line, ignore it. Has been reported for
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1938 * Mozilla JS with extremely long names. */
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1939 if (p_verbose >= 5)
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1940 {
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1941 verbose_enter();
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1942 MSG(_("Ignoring long line in tags file"));
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1943 verbose_leave();
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1944 }
3206
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1945 #ifdef FEAT_TAG_BINS
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1946 if (state != TS_LINEAR)
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1947 {
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1948 /* Avoid getting stuck. */
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1949 linear = TRUE;
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1950 state = TS_LINEAR;
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1951 # ifdef HAVE_FSEEKO
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1952 fseeko(fp, search_info.low_offset, SEEK_SET);
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1953 # else
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1954 fseek(fp, (long)search_info.low_offset, SEEK_SET);
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1955 # endif
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1956 }
a1d2f741d45c updated for version 7.3.373
Bram Moolenaar <bram@vim.org>
parents: 3192
diff changeset
1957 #endif
3192
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1958 continue;
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1959 }
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1960
436b42f3cba1 updated for version 7.3.366
Bram Moolenaar <bram@vim.org>
parents: 3131
diff changeset
1961 /* Corrupted tag line. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 line_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 #ifdef FEAT_TAG_OLDSTATIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 * Check for old style static tag: "file:tag file .."
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 tagp.fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 for (p = lbuf; p < tagp.tagname_end; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 if (*p == ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 if (tagp.fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977 tagp.fname = skipwhite(tagp.tagname_end);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979 tagp.fname = tagp.tagname_end + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 if ( fnamencmp(lbuf, tagp.fname, p - lbuf) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 && vim_iswhite(tagp.fname[p - lbuf])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 && tagp.fname[p - lbuf] == TAB
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1987 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1988 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1989 /* found one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990 tagp.tagname = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1991 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1992 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1993 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1994 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1995 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1996
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 * Skip this line if the length of the tag is different and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 * there is no regexp, or the tag is too short.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 cmplen = (int)(tagp.tagname_end - tagp.tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 if (p_tl != 0 && cmplen > p_tl) /* adjust for 'taglength' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 cmplen = p_tl;
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2004 if (has_re && orgpat.headlen < cmplen)
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2005 cmplen = orgpat.headlen;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2006 else if (state == TS_LINEAR && orgpat.headlen != cmplen)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2007 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2008
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2009 #ifdef FEAT_TAG_BINS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2010 if (state == TS_BINARY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2012 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2013 * Simplistic check for unsorted tags file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2014 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2015 i = (int)tagp.tagname[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2016 if (sortic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2017 i = (int)TOUPPER_ASC(tagp.tagname[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2018 if (i < search_info.low_char || i > search_info.high_char)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2019 sort_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2020
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2021 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2022 * Compare the current tag with the searched tag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2023 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2024 if (sortic)
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2025 tagcmp = tag_strnicmp(tagp.tagname, orgpat.head,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2026 (size_t)cmplen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027 else
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2028 tagcmp = STRNCMP(tagp.tagname, orgpat.head, cmplen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2029
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2030 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2031 * A match with a shorter tag means to search forward.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2032 * A match with a longer tag means to search backward.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2033 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2034 if (tagcmp == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2035 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2036 if (cmplen < orgpat.headlen)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2037 tagcmp = -1;
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2038 else if (cmplen > orgpat.headlen)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2039 tagcmp = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2040 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2041
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2042 if (tagcmp == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2044 /* We've located the tag, now skip back and search
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2045 * forward until the first matching tag is found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2046 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2047 state = TS_SKIP_BACK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048 search_info.match_offset = search_info.curr_offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 if (tagcmp < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2052 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2053 search_info.curr_offset = ftell(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 if (search_info.curr_offset < search_info.high_offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2055 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2056 search_info.low_offset = search_info.curr_offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 if (sortic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2058 search_info.low_char =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2059 TOUPPER_ASC(tagp.tagname[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2060 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2061 search_info.low_char = tagp.tagname[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2062 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2063 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2065 if (tagcmp > 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2066 && search_info.curr_offset != search_info.high_offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 search_info.high_offset = search_info.curr_offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069 if (sortic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070 search_info.high_char =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 TOUPPER_ASC(tagp.tagname[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073 search_info.high_char = tagp.tagname[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 /* No match yet and are at the end of the binary search. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2078 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2080 else if (state == TS_SKIP_BACK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2082 if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 state = TS_STEP_FORWARD;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 /* Have to skip back more. Restore the curr_offset
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 * used, otherwise we get stuck at a long line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 search_info.curr_offset = search_info.curr_offset_used;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090 else if (state == TS_STEP_FORWARD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2092 if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2094 if ((off_t)ftell(fp) > search_info.match_offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 break; /* past last match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 continue; /* before first match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 /* skip this match if it can't match */
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2103 if (MB_STRNICMP(tagp.tagname, orgpat.head, cmplen) != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107 * Can be a matching tag, isolate the file name and command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 #ifdef FEAT_TAG_OLDSTATIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 if (tagp.fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113 tagp.fname = skipwhite(tagp.tagname_end);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 tagp.fname = tagp.tagname_end + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 tagp.fname_end = skiptowhite(tagp.fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 tagp.command = skipwhite(tagp.fname_end);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 if (*tagp.command == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 tagp.fname_end = vim_strchr(tagp.fname, TAB);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 tagp.command = tagp.fname_end + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 if (tagp.fname_end == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 i = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 i = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131 i = parse_tag_line(lbuf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 is_etag,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 &tagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 if (i == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 line_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 if (is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 tagp.fname = ebuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 * First try matching with the pattern literally (also when it is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 * a regexp).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 cmplen = (int)(tagp.tagname_end - tagp.tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 if (p_tl != 0 && cmplen > p_tl) /* adjust for 'taglength' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 cmplen = p_tl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 /* if tag length does not match, don't try comparing */
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2154 if (orgpat.len != cmplen)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155 match = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2158 if (orgpat.regmatch.rm_ic)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2160 match = (MB_STRNICMP(tagp.tagname, orgpat.pat, cmplen) == 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2161 if (match)
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2162 match_no_ic = (STRNCMP(tagp.tagname, orgpat.pat,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 cmplen) == 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 else
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2166 match = (STRNCMP(tagp.tagname, orgpat.pat, cmplen) == 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170 * Has a regexp: Also find tags matching regexp.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172 match_re = FALSE;
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2173 if (!match && orgpat.regmatch.regprog != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177 cc = *tagp.tagname_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 *tagp.tagname_end = NUL;
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2179 match = vim_regexec(&orgpat.regmatch, tagp.tagname, (colnr_T)0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 if (match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2182 matchoff = (int)(orgpat.regmatch.startp[0] - tagp.tagname);
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2183 if (orgpat.regmatch.rm_ic)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 {
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2185 orgpat.regmatch.rm_ic = FALSE;
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2186 match_no_ic = vim_regexec(&orgpat.regmatch, tagp.tagname,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 (colnr_T)0);
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2188 orgpat.regmatch.rm_ic = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 *tagp.tagname_end = cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192 match_re = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2195 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196 * If a match is found, add it to ga_match[].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 if (match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 if (use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 /* Don't change the ordering, always use the same table. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 mtt = MT_GL_OTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209 /* Decide in which array to store this match. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 is_current = test_for_current(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 is_etag,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 tagp.fname, tagp.fname_end, tag_fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 buf_ffname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 is_static = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 if (!is_etag) /* emacs tags are never static */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2220 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2221 #ifdef FEAT_TAG_OLDSTATIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222 if (tagp.tagname != lbuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 is_static = TRUE; /* detected static tag before */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 is_static = test_for_static(&tagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2228
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2229 /* decide in which of the sixteen tables to store this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 * match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 if (is_static)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 if (is_current)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 mtt = MT_ST_CUR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 mtt = MT_ST_OTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2240 if (is_current)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2241 mtt = MT_GL_CUR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 mtt = MT_GL_OTH;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244 }
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2245 if (orgpat.regmatch.rm_ic && !match_no_ic)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246 mtt += MT_IC_OFF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2247 if (match_re)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2248 mtt += MT_RE_OFF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2249 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2250
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2252 * Add the found match in ga_match[mtt], avoiding duplicates.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2253 * Store the info we need later, which depends on the kind of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2254 * tags we are dealing with.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2255 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2256 if (ga_grow(&ga_match[mtt], 1) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 {
3263
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3206
diff changeset
2258 int len;
320cc46d0eb0 updated for version 7.3.400
Bram Moolenaar <bram@vim.org>
parents: 3206
diff changeset
2259
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 if (help_only)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2262 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2263 # define ML_EXTRA 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265 # define ML_EXTRA 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2267 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2268 * Append the help-heuristic number after the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2269 * tagname, for sorting it later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2271 *tagp.tagname_end = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2272 len = (int)(tagp.tagname_end - tagp.tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 mfp = (struct match_found *)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 alloc((int)sizeof(struct match_found) + len
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2275 + 10 + ML_EXTRA);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2276 if (mfp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2277 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2278 /* "len" includes the language and the NUL, but
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2279 * not the priority. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2280 mfp->len = len + ML_EXTRA + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2281 #define ML_HELP_LEN 6
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2282 p = mfp->match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2283 STRCPY(p, tagp.tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2284 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2285 p[len] = '@';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2286 STRCPY(p + len + 1, help_lang);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2287 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2288 sprintf((char *)p + len + 1 + ML_EXTRA, "%06d",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2289 help_heuristic(tagp.tagname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2290 match_re ? matchoff : 0, !match_no_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2291 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2292 + help_pri
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2293 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2294 );
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2295 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 *tagp.tagname_end = TAB;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2297 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 else if (name_only)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 if (get_it_again)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 char_u *temp_end = tagp.command;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2303
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 if (*temp_end == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305 while (*temp_end && *temp_end != '\r'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2306 && *temp_end != '\n'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 && *temp_end != '$')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2308 temp_end++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2309
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310 if (tagp.command + 2 < temp_end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 len = (int)(temp_end - tagp.command - 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 mfp = (struct match_found *)alloc(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 (int)sizeof(struct match_found) + len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315 if (mfp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317 mfp->len = len + 1; /* include the NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 p = mfp->match;
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
2319 vim_strncpy(p, tagp.command + 2, len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2321 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2322 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323 mfp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2324 get_it_again = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 len = (int)(tagp.tagname_end - tagp.tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2329 mfp = (struct match_found *)alloc(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 (int)sizeof(struct match_found) + len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331 if (mfp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2332 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2333 mfp->len = len + 1; /* include the NUL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2334 p = mfp->match;
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
2335 vim_strncpy(p, tagp.tagname, len);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2338 /* if wanted, re-read line to get long form too */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339 if (State & INSERT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 get_it_again = p_sft;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2343 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2344 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345 /* Save the tag in a buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2346 * Emacs tag: <mtt><tag_fname><NUL><ebuf><NUL><lbuf>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 * other tag: <mtt><tag_fname><NUL><NUL><lbuf>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348 * without Emacs tags: <mtt><tag_fname><NUL><lbuf>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 */
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
2350 len = (int)STRLEN(tag_fname)
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2351 + (int)STRLEN(lbuf) + 3;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 if (is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354 len += (int)STRLEN(ebuf) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356 ++len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2357 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2358 mfp = (struct match_found *)alloc(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 (int)sizeof(struct match_found) + len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360 if (mfp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362 mfp->len = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363 p = mfp->match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2364 p[0] = mtt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365 STRCPY(p + 1, tag_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2366 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367 /* Ignore differences in slashes, avoid adding
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2368 * both path/file and path\file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369 slash_adjust(p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2370 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371 s = p + 1 + STRLEN(tag_fname) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2372 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 if (is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375 STRCPY(s, ebuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 s += STRLEN(ebuf) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2379 *s++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380 #endif
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2381 STRCPY(s, lbuf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2382 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2383 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 if (mfp != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388 * Don't add identical matches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389 * This can take a lot of time when finding many
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 * matches, check for CTRL-C now and then.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 * Add all cscope tags, because they are all listed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 if (use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395 i = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398 for (i = ga_match[mtt].ga_len; --i >= 0 && !got_int; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 mfp2 = ((struct match_found **)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 (ga_match[mtt].ga_data))[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 if (mfp2->len == mfp->len
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403 && vim_memcmp(mfp2->match, mfp->match,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 (size_t)mfp->len) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 line_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2408 if (i < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2409 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410 ((struct match_found **)(ga_match[mtt].ga_data))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411 [ga_match[mtt].ga_len++] = mfp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 ++match_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2413 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 vim_free(mfp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 else /* Out of memory! Just forget about the rest. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420 retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2421 stop_searching = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 if (use_cscope && eof)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2429 } /* forever */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2430
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 if (line_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 EMSG2(_("E431: Format error in tags file \"%s\""), tag_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2435 if (!use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2436 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2437 EMSGN(_("Before byte %ld"), (long)ftell(fp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2438 stop_searching = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2439 line_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2440 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2441
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2442 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2443 if (!use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2444 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 fclose(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447 while (incstack_idx)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2448 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 --incstack_idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2450 fclose(incstack[incstack_idx].fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2451 vim_free(incstack[incstack_idx].etag_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2452 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2453 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2455 if (vimconv.vc_type != CONV_NONE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2456 convert_setup(&vimconv, NULL, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 #ifdef FEAT_TAG_BINS
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2460 tag_file_sorted = NUL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461 if (sort_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 EMSG2(_("E432: Tags file not sorted: %s"), tag_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 sort_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2465 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2467
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 * Stop searching if sufficient tags have been found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2470 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2471 if (match_count >= mincount)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2472 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2473 retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 stop_searching = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2475 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 #ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478 if (stop_searching || use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480 if (stop_searching)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2481 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2482 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484 } /* end of for-each-file loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2485
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2486 #ifdef FEAT_CSCOPE
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2487 if (!use_cscope)
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2488 #endif
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2489 tagname_free(&tn);
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2490
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2491 #ifdef FEAT_TAG_BINS
413
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
2492 /* stop searching when already did a linear search, or when TAG_NOIC
3d8ab81abe04 updated for version 7.0108
vimboss
parents: 373
diff changeset
2493 * used, and 'ignorecase' not set or already did case-ignore search */
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2494 if (stop_searching || linear || (!p_ic && noic) || orgpat.regmatch.rm_ic)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2495 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 # ifdef FEAT_CSCOPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 if (use_cscope)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2498 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2499 # endif
3131
52526aec4afb updated for version 7.3.336
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
2500 orgpat.regmatch.rm_ic = TRUE; /* try another time while ignoring case */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2501 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2502 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2503
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2504 if (!stop_searching)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2505 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2506 if (!did_open && verbose) /* never opened any tags file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2507 EMSG(_("E433: No tags file"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2508 retval = OK; /* It's OK even when no tag found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2509 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2510
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2511 findtag_end:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512 vim_free(lbuf);
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 3804
diff changeset
2513 vim_regfree(orgpat.regmatch.regprog);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514 vim_free(tag_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2515 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2516 vim_free(ebuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520 * Move the matches from the ga_match[] arrays into one list of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2521 * matches. When retval == FAIL, free the matches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2522 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2523 if (retval == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 match_count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 if (match_count > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2527 matches = (char_u **)lalloc((long_u)(match_count * sizeof(char_u *)),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2528 TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2530 matches = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2531 match_count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2532 for (mtt = 0; mtt < MT_COUNT; ++mtt)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2533 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2534 for (i = 0; i < ga_match[mtt].ga_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2536 mfp = ((struct match_found **)(ga_match[mtt].ga_data))[i];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2537 if (matches == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2538 vim_free(mfp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2539 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 /* To avoid allocating memory again we turn the struct
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542 * match_found into a string. For help the priority was not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543 * included in the length. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2544 mch_memmove(mfp, mfp->match,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2545 (size_t)(mfp->len + (help_only ? ML_HELP_LEN : 0)));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 matches[match_count++] = (char_u *)mfp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 ga_clear(&ga_match[mtt]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2551
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552 *matchesp = matches;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2553 *num_matches = match_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 curbuf->b_help = help_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 #ifdef FEAT_MULTI_LANG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 vim_free(saved_pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559
7266
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
2560 p_ic = save_p_ic;
6ba7182fb7bd commit https://github.com/vim/vim/commit/0f6562e9036f889185dff49a75c7fc5ffb28b307
Christian Brabandt <cb@256bit.org>
parents: 6851
diff changeset
2561
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 static garray_T tag_fnames = GA_EMPTY;
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
2566 static void found_tagfile_cb(char_u *fname, void *cookie);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 * Callback function for finding all "tags" and "tags-??" files in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 * 'runtimepath' doc directories.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 static void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2573 found_tagfile_cb(char_u *fname, void *cookie UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2574 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 if (ga_grow(&tag_fnames, 1) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2576 ((char_u **)(tag_fnames.ga_data))[tag_fnames.ga_len++] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2577 vim_strsave(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2579
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
2580 #if defined(EXITFREE) || defined(PROTO)
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
2581 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2582 free_tag_stuff(void)
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
2583 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2584 ga_clear_strings(&tag_fnames);
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
2585 do_tag(NULL, DT_FREE, 0, 0, 0);
1818
bbf0ba46e51d updated for version 7.2-116
vimboss
parents: 1785
diff changeset
2586 tag_freematch();
bbf0ba46e51d updated for version 7.2-116
vimboss
parents: 1785
diff changeset
2587
bbf0ba46e51d updated for version 7.2-116
vimboss
parents: 1785
diff changeset
2588 # if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
bbf0ba46e51d updated for version 7.2-116
vimboss
parents: 1785
diff changeset
2589 if (ptag_entry.tagname)
bbf0ba46e51d updated for version 7.2-116
vimboss
parents: 1785
diff changeset
2590 {
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2185
diff changeset
2591 vim_free(ptag_entry.tagname);
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2185
diff changeset
2592 ptag_entry.tagname = NULL;
1818
bbf0ba46e51d updated for version 7.2-116
vimboss
parents: 1785
diff changeset
2593 }
bbf0ba46e51d updated for version 7.2-116
vimboss
parents: 1785
diff changeset
2594 # endif
359
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
2595 }
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
2596 #endif
6c62b9b939bd updated for version 7.0093
vimboss
parents: 323
diff changeset
2597
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 * Get the next name of a tag file from the tag file list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 * For help files, use "tags" file only.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 * Return FAIL if no more tag file names, OK otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 */
514
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2604 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2605 get_tagfname(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2606 tagname_T *tnp, /* holds status info */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2607 int first, /* TRUE when first file name is wanted */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2608 char_u *buf) /* pointer to buffer of MAXPATHL chars */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610 char_u *fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 char_u *r_ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2613 if (first)
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2614 vim_memset(tnp, 0, sizeof(tagname_T));
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2615
514
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2616 if (curbuf->b_help)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617 {
514
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2618 /*
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2619 * For help files it's done in a completely different way:
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2620 * Find "doc/tags" and "doc/tags-??" in all directories in
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2621 * 'runtimepath'.
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2622 */
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2623 if (first)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2624 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625 ga_clear_strings(&tag_fnames);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626 ga_init2(&tag_fnames, (int)sizeof(char_u *), 10);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 do_in_runtimepath((char_u *)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628 #ifdef FEAT_MULTI_LANG
36
125e80798a85 updated for version 7.0021
vimboss
parents: 7
diff changeset
2629 # ifdef VMS
125e80798a85 updated for version 7.0021
vimboss
parents: 7
diff changeset
2630 /* Functions decc$to_vms() and decc$translate_vms() crash
125e80798a85 updated for version 7.0021
vimboss
parents: 7
diff changeset
2631 * on some VMS systems with wildcards "??". Seems ECO
125e80798a85 updated for version 7.0021
vimboss
parents: 7
diff changeset
2632 * patches do fix the problem in C RTL, but we can't use
125e80798a85 updated for version 7.0021
vimboss
parents: 7
diff changeset
2633 * an #ifdef for that. */
125e80798a85 updated for version 7.0021
vimboss
parents: 7
diff changeset
2634 "doc/tags doc/tags-*"
125e80798a85 updated for version 7.0021
vimboss
parents: 7
diff changeset
2635 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636 "doc/tags doc/tags-??"
36
125e80798a85 updated for version 7.0021
vimboss
parents: 7
diff changeset
2637 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 "doc/tags"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 #endif
8524
2f57bbe870ea commit https://github.com/vim/vim/commit/7f8989dd8a627af2185df381195351a913f3777f
Christian Brabandt <cb@256bit.org>
parents: 7835
diff changeset
2641 , DIP_ALL, found_tagfile_cb, NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 }
602
111509d2767a updated for version 7.0171
vimboss
parents: 589
diff changeset
2643
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2644 if (tnp->tn_hf_idx >= tag_fnames.ga_len)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 /* Not found in 'runtimepath', use 'helpfile', if it exists and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 * wasn't used yet, replacing "help.txt" with "tags". */
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2648 if (tnp->tn_hf_idx > tag_fnames.ga_len || *p_hf == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649 return FAIL;
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2650 ++tnp->tn_hf_idx;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2651 STRCPY(buf, p_hf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2652 STRCPY(gettail(buf), "tags");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654 else
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2655 vim_strncpy(buf, ((char_u **)(tag_fnames.ga_data))[
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2656 tnp->tn_hf_idx++], MAXPATHL - 1);
514
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2657 return OK;
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2658 }
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2659
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2660 if (first)
5ffc9de8bb26 updated for version 7.0144
vimboss
parents: 464
diff changeset
2661 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2662 /* Init. We make a copy of 'tags', because autocommands may change
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2663 * the value without notifying us. */
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2664 tnp->tn_tags = vim_strsave((*curbuf->b_p_tags != NUL)
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2665 ? curbuf->b_p_tags : p_tags);
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2666 if (tnp->tn_tags == NULL)
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2667 return FAIL;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2668 tnp->tn_np = tnp->tn_tags;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2669 }
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2670
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2671 /*
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2672 * Loop until we have found a file name that can be used.
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2673 * There are two states:
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2674 * tnp->tn_did_filefind_init == FALSE: setup for next part in 'tags'.
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2675 * tnp->tn_did_filefind_init == TRUE: find next file in this part.
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2676 */
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2677 for (;;)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2678 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2679 if (tnp->tn_did_filefind_init)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2680 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2681 fname = vim_findfile(tnp->tn_search_ctx);
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2682 if (fname != NULL)
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2683 break;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2684
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2685 tnp->tn_did_filefind_init = FALSE;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2686 }
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2687 else
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2688 {
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2689 char_u *filename = NULL;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2690
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2691 /* Stop when used all parts of 'tags'. */
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2692 if (*tnp->tn_np == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2693 {
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2694 vim_findfile_cleanup(tnp->tn_search_ctx);
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2695 tnp->tn_search_ctx = NULL;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2696 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697 }
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2698
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2699 /*
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2700 * Copy next file name into buf.
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2701 */
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2702 buf[0] = NUL;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2703 (void)copy_option_part(&tnp->tn_np, buf, MAXPATHL - 1, " ,");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2704
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705 #ifdef FEAT_PATH_EXTRA
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2706 r_ptr = vim_findfile_stopdir(buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2707 #else
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2708 r_ptr = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 #endif
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2710 /* move the filename one char forward and truncate the
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2711 * filepath with a NUL */
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2712 filename = gettail(buf);
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1541
diff changeset
2713 STRMOVE(filename + 1, filename);
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2714 *filename++ = NUL;
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2715
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2716 tnp->tn_search_ctx = vim_findfile_init(buf, filename,
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2717 r_ptr, 100,
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2185
diff changeset
2718 FALSE, /* don't free visited list */
1541
0d0bf7598dcb updated for version 7.1-256
vimboss
parents: 1521
diff changeset
2719 FINDFILE_FILE, /* we search for a file */
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2720 tnp->tn_search_ctx, TRUE, curbuf->b_ffname);
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2721 if (tnp->tn_search_ctx != NULL)
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2722 tnp->tn_did_filefind_init = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2725
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2726 STRCPY(buf, fname);
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2727 vim_free(fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2730
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731 /*
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2732 * Free the contents of a tagname_T that was filled by get_tagfname().
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2733 */
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2734 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2735 tagname_free(tagname_T *tnp)
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2736 {
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2737 vim_free(tnp->tn_tags);
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2738 vim_findfile_cleanup(tnp->tn_search_ctx);
1541
0d0bf7598dcb updated for version 7.1-256
vimboss
parents: 1521
diff changeset
2739 tnp->tn_search_ctx = NULL;
692
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2740 ga_clear_strings(&tag_fnames);
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2741 }
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2742
a28f83d37113 updated for version 7.0208
vimboss
parents: 685
diff changeset
2743 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2744 * Parse one line from the tags file. Find start/end of tag name, start/end of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2745 * file name and start of search pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2746 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2747 * If is_etag is TRUE, tagp->fname and tagp->fname_end are not set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2749 * Return FAIL if there is a format error in this line, OK otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2750 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2752 parse_tag_line(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2753 char_u *lbuf, /* line to be parsed */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 #ifdef FEAT_EMACS_TAGS
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2755 int is_etag,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 #endif
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2757 tagptrs_T *tagp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2759 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2761 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2762 char_u *p_7f;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764 if (is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2765 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 * There are two formats for an emacs tag line:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 * 1: struct EnvBase ^?EnvBase^A139,4627
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 * 2: #define ARPB_WILD_WORLD ^?153,5194
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 p_7f = vim_strchr(lbuf, 0x7f);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772 if (p_7f == NULL)
1770
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2773 {
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2774 etag_fail:
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2775 if (vim_strchr(lbuf, '\n') == NULL)
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2776 {
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2777 /* Truncated line. Ignore it. */
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2778 if (p_verbose >= 5)
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2779 {
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2780 verbose_enter();
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2781 MSG(_("Ignoring long line in tags file"));
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2782 verbose_leave();
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2783 }
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2784 tagp->command = lbuf;
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2785 tagp->tagname = lbuf;
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2786 tagp->tagname_end = lbuf;
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2787 return OK;
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2788 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789 return FAIL;
1770
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2790 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2792 /* Find ^A. If not found the line number is after the 0x7f */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2793 p = vim_strchr(p_7f, Ctrl_A);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2794 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2795 p = p_7f + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2798
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2799 if (!VIM_ISDIGIT(*p)) /* check for start of line number */
1770
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2800 goto etag_fail;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2801 tagp->command = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 if (p[-1] == Ctrl_A) /* first format: explicit tagname given */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2806 tagp->tagname = p_7f + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2807 tagp->tagname_end = p - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2809 else /* second format: isolate tagname */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 /* find end of tagname */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2812 for (p = p_7f - 1; !vim_iswordc(*p); --p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813 if (p == lbuf)
1770
6aea606c9e91 updated for version 7.2-068
vimboss
parents: 1674
diff changeset
2814 goto etag_fail;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815 tagp->tagname_end = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816 while (p >= lbuf && vim_iswordc(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2818 tagp->tagname = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2820 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821 else /* not an Emacs tag */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2824 /* Isolate the tagname, from lbuf up to the first white */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2825 tagp->tagname = lbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2826 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2827 p = skiptowhite(lbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2828 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2829 p = vim_strchr(lbuf, TAB);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2830 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2831 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2832 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2833 tagp->tagname_end = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2834
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2835 /* Isolate file name, from first to second white space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2836 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2837 p = skipwhite(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2838 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2839 if (*p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2840 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2841 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2842 tagp->fname = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2843 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2844 p = skiptowhite(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2845 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2846 p = vim_strchr(p, TAB);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2847 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2848 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2849 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2850 tagp->fname_end = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2851
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 /* find start of search command, after second white space */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2853 #ifdef FEAT_TAG_ANYWHITE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2854 p = skipwhite(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2855 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2856 if (*p != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2857 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2858 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2859 if (*p == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2860 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2861 tagp->command = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2862 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2867 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2868
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2869 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 * Check if tagname is a static tag
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 * Static tags produced by the older ctags program have the format:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2873 * 'file:tag file /pattern'.
1204
a3c21128b246 updated for version 7.1b
vimboss
parents: 1146
diff changeset
2874 * This is only recognized when both occurrence of 'file' are the same, to
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 * avoid recognizing "string::string" or ":exit".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877 * Static tags produced by the new ctags program have the format:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2878 * 'tag file /pattern/;"<Tab>file:' "
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2879 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2880 * Return TRUE if it is a static tag and adjust *tagname to the real tag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 * Return FALSE if it is not a static tag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2884 test_for_static(tagptrs_T *tagp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 #ifdef FEAT_TAG_OLDSTATIC
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2892 * Check for old style static tag: "file:tag file .."
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2893 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894 len = (int)(tagp->fname_end - tagp->fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2895 p = tagp->tagname + len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2896 if ( p < tagp->tagname_end
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2897 && *p == ':'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 && fnamencmp(tagp->tagname, tagp->fname, len) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900 tagp->tagname = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2901 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2902 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2904
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 * Check for new style static tag ":...<Tab>file:[<Tab>...]"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908 p = tagp->command;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2909 while ((p = vim_strchr(p, '\t')) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2910 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 if (STRNCMP(p, "file:", 5) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2916 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 * Parse a line from a matching tag. Does not change the line itself.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 * The line that we get looks like this:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923 * Emacs tag: <mtt><tag_fname><NUL><ebuf><NUL><lbuf>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 * other tag: <mtt><tag_fname><NUL><NUL><lbuf>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 * without Emacs tags: <mtt><tag_fname><NUL><lbuf>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 * Return OK or FAIL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2930 parse_match(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2931 char_u *lbuf, /* input: matching line */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
2932 tagptrs_T *tagp) /* output: pointers into the line */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2934 int retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2936 char_u *pc, *pt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2938 tagp->tag_fname = lbuf + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2939 lbuf += STRLEN(tagp->tag_fname) + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941 if (*lbuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2943 tagp->is_etag = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2944 tagp->fname = lbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 lbuf += STRLEN(lbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946 tagp->fname_end = lbuf++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2947 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2949 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2950 tagp->is_etag = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 ++lbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2953 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 /* Find search pattern and the file name for non-etags. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2956 retval = parse_tag_line(lbuf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2957 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2958 tagp->is_etag,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2959 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2960 tagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2961
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2962 tagp->tagkind = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2963 tagp->command_end = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2965 if (retval == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2967 /* Try to find a kind field: "kind:<kind>" or just "<kind>"*/
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 p = tagp->command;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969 if (find_extra(&p) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 tagp->command_end = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972 p += 2; /* skip ";\"" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2973 if (*p++ == TAB)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2974 while (ASCII_ISALPHA(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2975 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2976 if (STRNCMP(p, "kind:", 5) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2977 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2978 tagp->tagkind = p + 5;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2979 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2980 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2981 pc = vim_strchr(p, ':');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2982 pt = vim_strchr(p, '\t');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2983 if (pc == NULL || (pt != NULL && pc > pt))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2984 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2985 tagp->tagkind = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2986 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2987 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2988 if (pt == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2989 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2990 p = pt + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2991 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2992 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2993 if (tagp->tagkind != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2995 for (p = tagp->tagkind;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2996 *p && *p != '\t' && *p != '\r' && *p != '\n'; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2997 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2998 tagp->tagkind_end = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2999 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3000 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3001 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3002 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3003
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3004 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3005 * Find out the actual file name of a tag. Concatenate the tags file name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3006 * with the matching tag file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3007 * Returns an allocated string or NULL (out of memory).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3008 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009 static char_u *
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3010 tag_full_fname(tagptrs_T *tagp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3011 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3012 char_u *fullname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3013 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3014
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3015 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3016 if (tagp->is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3017 c = 0; /* to shut up GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3018 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3019 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3020 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3021 c = *tagp->fname_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3022 *tagp->fname_end = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3023 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3024 fullname = expand_tag_fname(tagp->fname, tagp->tag_fname, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3025
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3026 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3027 if (!tagp->is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3028 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3029 *tagp->fname_end = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3030
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3031 return fullname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3032 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3033
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3034 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3035 * Jump to a tag that has been found in one of the tag files
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3036 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 * returns OK for success, NOTAGFILE when file not found, FAIL otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3040 jumpto_tag(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3041 char_u *lbuf, /* line from the tags file for this tag */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3042 int forceit, /* :ta with ! */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3043 int keep_help) /* keep help flag (FALSE for cscope) */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 int save_secure;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046 int save_magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3047 int save_p_ws, save_p_scs, save_p_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3048 linenr_T save_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3049 int csave = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 char_u *str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3051 char_u *pbuf; /* search pattern buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3052 char_u *pbuf_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3053 char_u *tofree_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3054 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3055 tagptrs_T tagp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 int retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057 int getfile_result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058 int search_options;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3059 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3060 int save_no_hlsearch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3061 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063 win_T *curwin_save = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065 char_u *full_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067 int old_KeyTyped = KeyTyped; /* getting the file may reset it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070 pbuf = alloc(LSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3071
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3072 /* parse the match line into the tagp structure */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 if (pbuf == NULL || parse_match(lbuf, &tagp) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3074 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075 tagp.fname_end = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 goto erret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3077 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3078
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3079 /* truncate the file name, so it can be used as a string */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3080 csave = *tagp.fname_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3081 *tagp.fname_end = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3082 fname = tagp.fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3083
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3084 /* copy the command to pbuf[], remove trailing CR/NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3085 str = tagp.command;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3086 for (pbuf_end = pbuf; *str && *str != '\n' && *str != '\r'; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3087 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3088 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3089 if (tagp.is_etag && *str == ',')/* stop at ',' after line number */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3090 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3091 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3092 *pbuf_end++ = *str++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3093 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3094 *pbuf_end = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3095
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3096 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3097 if (!tagp.is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3098 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3099 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3100 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3101 * Remove the "<Tab>fieldname:value" stuff; we don't need it here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3102 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3103 str = pbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3104 if (find_extra(&str) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3105 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3106 pbuf_end = str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3107 *pbuf_end = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3108 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3109 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3110
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3111 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3112 * Expand file name, when needed (for environment variables).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113 * If 'tagrelative' option set, may change file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 fname = expand_tag_fname(fname, tagp.tag_fname, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3116 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3117 goto erret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3118 tofree_fname = fname; /* free() it later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3119
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3120 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3121 * Check if the file with the tag exists before abandoning the current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3122 * file. Also accept a file name for which there is a matching BufReadCmd
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3123 * autocommand event (e.g., http://sys/file).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3124 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3125 if (mch_getperm(fname) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3126 #ifdef FEAT_AUTOCMD
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
3127 && !has_autocmd(EVENT_BUFREADCMD, fname, NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3128 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3129 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3130 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3131 retval = NOTAGFILE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3132 vim_free(nofile_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3133 nofile_fname = vim_strsave(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3134 if (nofile_fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135 nofile_fname = empty_option;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3136 goto erret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3137 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3138
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3139 ++RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142 need_mouse_correct = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
3146 if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 {
728
8939e7f598dc updated for version 7.0221
vimboss
parents: 714
diff changeset
3148 postponed_split = 0; /* don't split again below */
8939e7f598dc updated for version 7.0221
vimboss
parents: 714
diff changeset
3149 curwin_save = curwin; /* Save current window */
8939e7f598dc updated for version 7.0221
vimboss
parents: 714
diff changeset
3150
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3152 * If we are reusing a window, we may change dir when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 * entering it (autocommands) so turn the tag filename
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3154 * into a fullpath
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 if (!curwin->w_p_pvw)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 full_fname = FullName_save(fname, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159 fname = full_fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 * Make the preview window the current window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 * Open a preview window when needed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 */
816
4a79d6d376f0 updated for version 7.0c02
vimboss
parents: 799
diff changeset
3165 prepare_tagpreview(TRUE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3167 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168
682
f1b013312711 updated for version 7.0205
vimboss
parents: 649
diff changeset
3169 /* If it was a CTRL-W CTRL-] command split window now. For ":tab tag"
f1b013312711 updated for version 7.0205
vimboss
parents: 649
diff changeset
3170 * open a new tab page. */
f1b013312711 updated for version 7.0205
vimboss
parents: 649
diff changeset
3171 if (postponed_split || cmdmod.tab != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173 win_split(postponed_split > 0 ? postponed_split : 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 postponed_split_flags);
2583
7c2e6ba1d702 updated for version 7.3.008
Bram Moolenaar <bram@vim.org>
parents: 2533
diff changeset
3175 RESET_BINDING(curwin);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179 if (keep_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 /* A :ta from a help file will keep the b_help flag set. For ":ptag"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 * we need to use the flag from the window where we came from. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
3184 if (g_do_tagpreview != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3185 keep_help_flag = curwin_save->w_buffer->b_help;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3186 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3187 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188 keep_help_flag = curbuf->b_help;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3190 getfile_result = getfile(0, fname, NULL, TRUE, (linenr_T)0, forceit);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3191 keep_help_flag = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3192
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3193 if (getfile_result <= 0) /* got to the right file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3194 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3195 curwin->w_set_curswant = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3196 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3197 postponed_split = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3198 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3199
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3200 save_secure = secure;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3201 secure = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3202 #ifdef HAVE_SANDBOX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3203 ++sandbox;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3204 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3205 save_magic = p_magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3206 p_magic = FALSE; /* always execute with 'nomagic' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3207 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3208 /* Save value of no_hlsearch, jumping to a tag is not a real search */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3209 save_no_hlsearch = no_hlsearch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3210 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3211
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3212 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3213 * If 'cpoptions' contains 't', store the search pattern for the "n"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3214 * command. If 'cpoptions' does not contain 't', the search pattern
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3215 * is not stored.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3216 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3217 if (vim_strchr(p_cpo, CPO_TAGPAT) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3218 search_options = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3219 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3220 search_options = SEARCH_KEEP;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3221
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3222 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3223 * If the command is a search, try here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3224 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3225 * Reset 'smartcase' for the search, since the search pattern was not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3226 * typed by the user.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3227 * Only use do_search() when there is a full search command, without
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3228 * anything following.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3229 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3230 str = pbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3231 if (pbuf[0] == '/' || pbuf[0] == '?')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3232 str = skip_regexp(pbuf + 1, pbuf[0], FALSE, NULL) + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3233 if (str > pbuf_end - 1) /* search command with nothing following */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3234 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3235 save_p_ws = p_ws;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3236 save_p_ic = p_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3237 save_p_scs = p_scs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3238 p_ws = TRUE; /* need 'wrapscan' for backward searches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3239 p_ic = FALSE; /* don't ignore case now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3240 p_scs = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3241 #if 0 /* disabled for now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3242 #ifdef FEAT_CMDHIST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3243 /* put pattern in search history */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3244 add_to_history(HIST_SEARCH, pbuf + 1, TRUE, pbuf[0]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3245 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3246 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3247 save_lnum = curwin->w_cursor.lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3248 curwin->w_cursor.lnum = 0; /* start search before first line */
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1204
diff changeset
3249 if (do_search(NULL, pbuf[0], pbuf + 1, (long)1,
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1204
diff changeset
3250 search_options, NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3251 retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3252 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3253 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3254 int found = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3255 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3256
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3257 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3258 * try again, ignore case now
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3259 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3260 p_ic = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3261 if (!do_search(NULL, pbuf[0], pbuf + 1, (long)1,
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1204
diff changeset
3262 search_options, NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3263 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3264 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3265 * Failed to find pattern, take a guess: "^func ("
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3266 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3267 found = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3268 (void)test_for_static(&tagp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3269 cc = *tagp.tagname_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3270 *tagp.tagname_end = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3271 sprintf((char *)pbuf, "^%s\\s\\*(", tagp.tagname);
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1204
diff changeset
3272 if (!do_search(NULL, '/', pbuf, (long)1,
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1204
diff changeset
3273 search_options, NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3274 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3275 /* Guess again: "^char * \<func (" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3276 sprintf((char *)pbuf, "^\\[#a-zA-Z_]\\.\\*\\<%s\\s\\*(",
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3277 tagp.tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3278 if (!do_search(NULL, '/', pbuf, (long)1,
1521
cc4fe241baa3 updated for version 7.1-236
vimboss
parents: 1204
diff changeset
3279 search_options, NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3280 found = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3281 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3282 *tagp.tagname_end = cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3283 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3284 if (found == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3285 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3286 EMSG(_("E434: Can't find tag pattern"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3287 curwin->w_cursor.lnum = save_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3288 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3289 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3290 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3291 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3292 * Only give a message when really guessed, not when 'ic'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3293 * is set and match found while ignoring case.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3294 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3295 if (found == 2 || !save_p_ic)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3296 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3297 MSG(_("E435: Couldn't find tag, just guessing!"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3298 if (!msg_scrolled && msg_silent == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3299 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3300 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3301 ui_delay(1000L, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3302 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3303 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3304 retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3305 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3307 p_ws = save_p_ws;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3308 p_ic = save_p_ic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3309 p_scs = save_p_scs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3311 /* A search command may have positioned the cursor beyond the end
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3312 * of the line. May need to correct that here. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3313 check_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3314 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3315 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3316 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3317 curwin->w_cursor.lnum = 1; /* start command in line 1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3318 do_cmdline_cmd(pbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3319 retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3320 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3321
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3322 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3323 * When the command has done something that is not allowed make sure
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3324 * the error message can be seen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3325 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3326 if (secure == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3327 wait_return(TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3328 secure = save_secure;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3329 p_magic = save_magic;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3330 #ifdef HAVE_SANDBOX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3331 --sandbox;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3332 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3333 #ifdef FEAT_SEARCH_EXTRA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3334 /* restore no_hlsearch when keeping the old search pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3335 if (search_options)
5458
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5328
diff changeset
3336 {
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5328
diff changeset
3337 SET_NO_HLSEARCH(save_no_hlsearch);
6ae816249627 updated for version 7.4.079
Bram Moolenaar <bram@vim.org>
parents: 5328
diff changeset
3338 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3339 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3340
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3341 /* Return OK if jumped to another file (at least we found the file!). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3342 if (getfile_result == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3343 retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3344
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3345 if (retval == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3346 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3347 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3348 * For a help buffer: Put the cursor line at the top of the window,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3349 * the help subject will be below it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3350 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3351 if (curbuf->b_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3352 set_topline(curwin, curwin->w_cursor.lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3353 #ifdef FEAT_FOLDING
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3354 if ((fdo_flags & FDO_TAG) && old_KeyTyped)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3355 foldOpenCursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3356 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3357 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3358
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3359 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
2713
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
3360 if (g_do_tagpreview != 0
d20d37ef86c8 updated for version 7.3.129
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
3361 && curwin != curwin_save && win_valid(curwin_save))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3362 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3363 /* Return cursor to where we were */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3364 validate_cursor();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3365 redraw_later(VALID);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3366 win_enter(curwin_save, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3367 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3368 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3370 --RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3371 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3372 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3373 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3374 --RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3375 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3376 if (postponed_split) /* close the window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3377 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3378 win_close(curwin, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3379 postponed_split = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3380 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3381 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3382 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3383
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3384 erret:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3385 #if defined(FEAT_WINDOWS) && defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3386 g_do_tagpreview = 0; /* For next time */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3387 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3388 if (tagp.fname_end != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3389 *tagp.fname_end = csave;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3390 vim_free(pbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3391 vim_free(tofree_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3392 vim_free(full_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3393
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3394 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3395 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3396
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3397 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3398 * If "expand" is TRUE, expand wildcards in fname.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3399 * If 'tagrelative' option set, change fname (name of file containing tag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3400 * according to tag_fname (name of tag file containing fname).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3401 * Returns a pointer to allocated memory (or NULL when out of memory).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3402 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3403 static char_u *
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3404 expand_tag_fname(char_u *fname, char_u *tag_fname, int expand)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3405 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3406 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3407 char_u *retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3408 char_u *expanded_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3409 expand_T xpc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3410
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3411 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3412 * Expand file name (for environment variables) when needed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3413 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3414 if (expand && mch_has_wildcard(fname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3415 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3416 ExpandInit(&xpc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3417 xpc.xp_context = EXPAND_FILES;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3418 expanded_fname = ExpandOne(&xpc, (char_u *)fname, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3419 WILD_LIST_NOTFOUND|WILD_SILENT, WILD_EXPAND_FREE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3420 if (expanded_fname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3421 fname = expanded_fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3422 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3423
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3424 if ((p_tr || curbuf->b_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3425 && !vim_isAbsName(fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3426 && (p = gettail(tag_fname)) != tag_fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3427 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3428 retval = alloc(MAXPATHL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3429 if (retval != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3430 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3431 STRCPY(retval, tag_fname);
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
3432 vim_strncpy(retval + (p - tag_fname), fname,
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
3433 MAXPATHL - (p - tag_fname) - 1);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3434 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3435 * Translate names like "src/a/../b/file.c" into "src/b/file.c".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3436 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3437 simplify_filename(retval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3438 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3439 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3440 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3441 retval = vim_strsave(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3442
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3443 vim_free(expanded_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3444
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3445 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3446 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3447
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3448 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3449 * Converts a file name into a canonical form. It simplifies a file name into
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3450 * its simplest form by stripping out unneeded components, if any. The
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3451 * resulting file name is simplified in place and will either be the same
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3452 * length as that supplied, or shorter.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3453 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3454 void
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3455 simplify_filename(char_u *filename)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3456 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3457 #ifndef AMIGA /* Amiga doesn't have "..", it uses "/" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3458 int components = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3459 char_u *p, *tail, *start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3460 int stripping_disabled = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3461 int relative = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3462
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3463 p = filename;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3464 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3465 if (p[1] == ':') /* skip "x:" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3466 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3467 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3468
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3469 if (vim_ispathsep(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3470 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3471 relative = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3472 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3473 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3474 while (vim_ispathsep(*p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3475 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3476 start = p; /* remember start after "c:/" or "/" or "///" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3477
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3478 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3479 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3480 /* At this point "p" is pointing to the char following a single "/"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3481 * or "p" is at the "start" of the (absolute or relative) path name. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3482 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3483 /* VMS allows device:[path] - don't strip the [ in directory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3484 if ((*p == '[' || *p == '<') && p > filename && p[-1] == ':')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3485 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3486 /* :[ or :< composition: vms directory component */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3487 ++components;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3488 p = getnextcomp(p + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3489 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3490 /* allow remote calls as host"user passwd"::device:[path] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3491 else if (p[0] == ':' && p[1] == ':' && p > filename && p[-1] == '"' )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3492 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3493 /* ":: composition: vms host/passwd component */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3494 ++components;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3495 p = getnextcomp(p + 2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3496 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3497 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3498 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3499 if (vim_ispathsep(*p))
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1541
diff changeset
3500 STRMOVE(p, p + 1); /* remove duplicate "/" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3501 else if (p[0] == '.' && (vim_ispathsep(p[1]) || p[1] == NUL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3502 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3503 if (p == start && relative)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3504 p += 1 + (p[1] != NUL); /* keep single "." or leading "./" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3505 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3506 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3507 /* Strip "./" or ".///". If we are at the end of the file name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3508 * and there is no trailing path separator, either strip "/." if
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3509 * we are after "start", or strip "." if we are at the beginning
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3510 * of an absolute path name . */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3511 tail = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3512 if (p[1] != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3513 while (vim_ispathsep(*tail))
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
3514 mb_ptr_adv(tail);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3515 else if (p > start)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3516 --p; /* strip preceding path separator */
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1541
diff changeset
3517 STRMOVE(p, tail);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3518 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3519 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3520 else if (p[0] == '.' && p[1] == '.' &&
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3521 (vim_ispathsep(p[2]) || p[2] == NUL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3522 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3523 /* Skip to after ".." or "../" or "..///". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3524 tail = p + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3525 while (vim_ispathsep(*tail))
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
3526 mb_ptr_adv(tail);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3527
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3528 if (components > 0) /* strip one preceding component */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3529 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3530 int do_strip = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3531 char_u saved_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3532 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3533
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3534 /* Don't strip for an erroneous file name. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3535 if (!stripping_disabled)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3536 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3537 /* If the preceding component does not exist in the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3538 * system, we strip it. On Unix, we don't accept a symbolic
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3539 * link that refers to a non-existent file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3540 saved_char = p[-1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3541 p[-1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3542 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3543 if (mch_lstat((char *)filename, &st) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3544 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3545 if (mch_stat((char *)filename, &st) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3546 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3547 do_strip = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3548 p[-1] = saved_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3549
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3550 --p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3551 /* Skip back to after previous '/'. */
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
3552 while (p > start && !after_pathsep(start, p))
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
3553 mb_ptr_back(start, p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3554
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3555 if (!do_strip)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3556 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3557 /* If the component exists in the file system, check
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3558 * that stripping it won't change the meaning of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3559 * file name. First get information about the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3560 * unstripped file name. This may fail if the component
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3561 * to strip is not a searchable directory (but a regular
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3562 * file, for instance), since the trailing "/.." cannot
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3563 * be applied then. We don't strip it then since we
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3564 * don't want to replace an erroneous file name by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3565 * a valid one, and we disable stripping of later
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3566 * components. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3567 saved_char = *tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3568 *tail = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3569 if (mch_stat((char *)filename, &st) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3570 do_strip = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3571 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3572 stripping_disabled = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3573 *tail = saved_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3574 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3575 if (do_strip)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3576 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3577 struct stat new_st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3578
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3579 /* On Unix, the check for the unstripped file name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3580 * above works also for a symbolic link pointing to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3581 * a searchable directory. But then the parent of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3582 * the directory pointed to by the link must be the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3583 * same as the stripped file name. (The latter
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3584 * exists in the file system since it is the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3585 * component's parent directory.) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3586 if (p == start && relative)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3587 (void)mch_stat(".", &new_st);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3588 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3589 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3590 saved_char = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3591 *p = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3592 (void)mch_stat((char *)filename, &new_st);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3593 *p = saved_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3594 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3595
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3596 if (new_st.st_ino != st.st_ino ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3597 new_st.st_dev != st.st_dev)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3598 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3599 do_strip = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3600 /* We don't disable stripping of later
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3601 * components since the unstripped path name is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3602 * still valid. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3603 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3604 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3605 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3606 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3607 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3608
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3609 if (!do_strip)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3610 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3611 /* Skip the ".." or "../" and reset the counter for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3612 * components that might be stripped later on. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3613 p = tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3614 components = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3615 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3616 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3617 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3618 /* Strip previous component. If the result would get empty
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3619 * and there is no trailing path separator, leave a single
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3620 * "." instead. If we are at the end of the file name and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3621 * there is no trailing path separator and a preceding
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3622 * component is left after stripping, strip its trailing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3623 * path separator as well. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3624 if (p == start && relative && tail[-1] == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3625 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3626 *p++ = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3627 *p = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3628 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3629 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3630 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3631 if (p > start && tail[-1] == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3632 --p;
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1541
diff changeset
3633 STRMOVE(p, tail); /* strip previous component */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3634 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3635
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3636 --components;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3637 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3638 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3639 else if (p == start && !relative) /* leading "/.." or "/../" */
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1541
diff changeset
3640 STRMOVE(p, tail); /* strip ".." or "../" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3641 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3642 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3643 if (p == start + 2 && p[-2] == '.') /* leading "./../" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3644 {
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1541
diff changeset
3645 STRMOVE(p - 2, p); /* strip leading "./" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3646 tail -= 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3648 p = tail; /* skip to char after ".." or "../" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3649 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3650 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3651 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3652 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3653 ++components; /* simple path component */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3654 p = getnextcomp(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3655 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3656 } while (*p != NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3657 #endif /* !AMIGA */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3658 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3659
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3660 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3661 * Check if we have a tag for the buffer with name "buf_ffname".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3662 * This is a bit slow, because of the full path compare in fullpathcmp().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3663 * Return TRUE if tag for file "fname" if tag file "tag_fname" is for current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3664 * file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3665 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3666 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3667 test_for_current(
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3668 #ifdef FEAT_EMACS_TAGS
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3669 int is_etag,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3670 #endif
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3671 char_u *fname,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3672 char_u *fname_end,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3673 char_u *tag_fname,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3674 char_u *buf_ffname)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3675 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3676 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3677 int retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3678 char_u *fullname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3679
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3680 if (buf_ffname != NULL) /* if the buffer has a name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3681 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3682 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3683 if (is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3684 c = 0; /* to shut up GCC */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3685 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3686 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3687 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3688 c = *fname_end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3689 *fname_end = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3690 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3691 fullname = expand_tag_fname(fname, tag_fname, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3692 if (fullname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3693 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3694 retval = (fullpathcmp(fullname, buf_ffname, TRUE) & FPC_SAME);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3695 vim_free(fullname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3696 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3697 #ifdef FEAT_EMACS_TAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3698 if (!is_etag)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3699 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3700 *fname_end = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3701 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3702
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3703 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3704 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3705
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3706 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3707 * Find the end of the tagaddress.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3708 * Return OK if ";\"" is following, FAIL otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3709 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3710 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3711 find_extra(char_u **pp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3712 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3713 char_u *str = *pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3714
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3715 /* Repeat for addresses separated with ';' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3716 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3717 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3718 if (VIM_ISDIGIT(*str))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3719 str = skipdigits(str);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3720 else if (*str == '/' || *str == '?')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3721 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3722 str = skip_regexp(str + 1, *str, FALSE, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3723 if (*str != **pp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3724 str = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3725 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3726 ++str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3727 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3728 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3729 str = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3730 if (str == NULL || *str != ';'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3731 || !(VIM_ISDIGIT(str[1]) || str[1] == '/' || str[1] == '?'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3732 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3733 ++str; /* skip ';' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3734 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3735
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3736 if (str != NULL && STRNCMP(str, ";\"", 2) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3737 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3738 *pp = str;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3739 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3740 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3741 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3742 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3743
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3744 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3745 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3746 expand_tags(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3747 int tagnames, /* expand tag names */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3748 char_u *pat,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3749 int *num_file,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3750 char_u ***file)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3751 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3752 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3753 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3754 int tagnmflag;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3755 char_u tagnm[100];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3756 tagptrs_T t_p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3757 int ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3758
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3759 if (tagnames)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3760 tagnmflag = TAG_NAMES;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3761 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3762 tagnmflag = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3763 if (pat[0] == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3764 ret = find_tags(pat + 1, num_file, file,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3765 TAG_REGEXP | tagnmflag | TAG_VERBOSE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3766 TAG_MANY, curbuf->b_ffname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3767 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3768 ret = find_tags(pat, num_file, file,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3769 TAG_REGEXP | tagnmflag | TAG_VERBOSE | TAG_NOIC,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3770 TAG_MANY, curbuf->b_ffname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3771 if (ret == OK && !tagnames)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3772 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3773 /* Reorganize the tags for display and matching as strings of:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3774 * "<tagname>\0<kind>\0<filename>\0"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3775 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3776 for (i = 0; i < *num_file; i++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3777 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3778 parse_match((*file)[i], &t_p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3779 c = (int)(t_p.tagname_end - t_p.tagname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3780 mch_memmove(tagnm, t_p.tagname, (size_t)c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3781 tagnm[c++] = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3782 tagnm[c++] = (t_p.tagkind != NULL && *t_p.tagkind)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3783 ? *t_p.tagkind : 'f';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3784 tagnm[c++] = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3785 mch_memmove((*file)[i] + c, t_p.fname, t_p.fname_end - t_p.fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3786 (*file)[i][c + (t_p.fname_end - t_p.fname)] = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3787 mch_memmove((*file)[i], tagnm, (size_t)c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3788 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3789 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3790 return ret;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3791 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3792 #endif
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3793
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3794 #if defined(FEAT_EVAL) || defined(PROTO)
7805
0b6c37dd858d commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents: 7266
diff changeset
3795 static int add_tag_field(dict_T *dict, char *field_name, char_u *start, char_u *end);
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3796
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3797 /*
2185
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3798 * Add a tag field to the dictionary "dict".
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3799 * Return OK or FAIL.
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3800 */
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3801 static int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3802 add_tag_field(
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3803 dict_T *dict,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3804 char *field_name,
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3805 char_u *start, /* start of the value */
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3806 char_u *end) /* after the value; can be NULL */
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3807 {
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3808 char_u *buf;
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3809 int len = 0;
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3810 int retval;
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3811
2185
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3812 /* check that the field name doesn't exist yet */
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3813 if (dict_find(dict, (char_u *)field_name, -1) != NULL)
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3814 {
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3815 if (p_verbose > 0)
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3816 {
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3817 verbose_enter();
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3818 smsg((char_u *)_("Duplicate field name: %s"), field_name);
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3819 verbose_leave();
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3820 }
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3821 return FAIL;
0c1e413c32f1 updated for version 7.2.443
Bram Moolenaar <bram@vim.org>
parents: 2087
diff changeset
3822 }
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3823 buf = alloc(MAXPATHL);
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3824 if (buf == NULL)
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3825 return FAIL;
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3826 if (start != NULL)
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3827 {
211
79c3648993c3 updated for version 7.0060
vimboss
parents: 188
diff changeset
3828 if (end == NULL)
79c3648993c3 updated for version 7.0060
vimboss
parents: 188
diff changeset
3829 {
79c3648993c3 updated for version 7.0060
vimboss
parents: 188
diff changeset
3830 end = start + STRLEN(start);
79c3648993c3 updated for version 7.0060
vimboss
parents: 188
diff changeset
3831 while (end > start && (end[-1] == '\r' || end[-1] == '\n'))
79c3648993c3 updated for version 7.0060
vimboss
parents: 188
diff changeset
3832 --end;
79c3648993c3 updated for version 7.0060
vimboss
parents: 188
diff changeset
3833 }
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 816
diff changeset
3834 len = (int)(end - start);
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3835 if (len > MAXPATHL - 1)
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3836 len = MAXPATHL - 1;
418
84825cc6f049 updated for version 7.0109
vimboss
parents: 413
diff changeset
3837 vim_strncpy(buf, start, len);
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3838 }
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3839 buf[len] = NUL;
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3840 retval = dict_add_nr_str(dict, field_name, 0L, buf);
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3841 vim_free(buf);
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2768
diff changeset
3842 return retval;
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3843 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3844
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3845 /*
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3846 * Add the tags matching the specified pattern to the list "list"
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3847 * as a dictionary
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3848 */
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3849 int
7835
4d7ce6c03fda commit https://github.com/vim/vim/commit/764b23c8fd3369cb05ae9122abf3ca16fec539d7
Christian Brabandt <cb@256bit.org>
parents: 7805
diff changeset
3850 get_tags(list_T *list, char_u *pat)
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3851 {
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3852 int num_matches, i, ret;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3853 char_u **matches, *p;
970
c5cafb21c45b updated for version 7.0-096
vimboss
parents: 845
diff changeset
3854 char_u *full_fname;
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3855 dict_T *dict;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3856 tagptrs_T tp;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3857 long is_static;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3858
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3859 ret = find_tags(pat, &num_matches, &matches,
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3860 TAG_REGEXP | TAG_NOIC, (int)MAXCOL, NULL);
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3861 if (ret == OK && num_matches > 0)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3862 {
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3863 for (i = 0; i < num_matches; ++i)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3864 {
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3865 parse_match(matches[i], &tp);
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3866 is_static = test_for_static(&tp);
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3867
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3868 /* Skip pseudo-tag lines. */
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3869 if (STRNCMP(tp.tagname, "!_TAG_", 6) == 0)
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3870 continue;
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3871
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3872 if ((dict = dict_alloc()) == NULL)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3873 ret = FAIL;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3874 if (list_append_dict(list, dict) == FAIL)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3875 ret = FAIL;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3876
970
c5cafb21c45b updated for version 7.0-096
vimboss
parents: 845
diff changeset
3877 full_fname = tag_full_fname(&tp);
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3878 if (add_tag_field(dict, "name", tp.tagname, tp.tagname_end) == FAIL
970
c5cafb21c45b updated for version 7.0-096
vimboss
parents: 845
diff changeset
3879 || add_tag_field(dict, "filename", full_fname,
c5cafb21c45b updated for version 7.0-096
vimboss
parents: 845
diff changeset
3880 NULL) == FAIL
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3881 || add_tag_field(dict, "cmd", tp.command,
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3882 tp.command_end) == FAIL
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3883 || add_tag_field(dict, "kind", tp.tagkind,
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3884 tp.tagkind_end) == FAIL
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3885 || dict_add_nr_str(dict, "static", is_static, NULL) == FAIL)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3886 ret = FAIL;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3887
970
c5cafb21c45b updated for version 7.0-096
vimboss
parents: 845
diff changeset
3888 vim_free(full_fname);
c5cafb21c45b updated for version 7.0-096
vimboss
parents: 845
diff changeset
3889
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3890 if (tp.command_end != NULL)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3891 {
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3892 for (p = tp.command_end + 3;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3893 *p != NUL && *p != '\n' && *p != '\r'; ++p)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3894 {
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3895 if (p == tp.tagkind || (p + 5 == tp.tagkind
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3896 && STRNCMP(p, "kind:", 5) == 0))
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3897 /* skip "kind:<kind>" and "<kind>" */
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3898 p = tp.tagkind_end - 1;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3899 else if (STRNCMP(p, "file:", 5) == 0)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3900 /* skip "file:" (static tag) */
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3901 p += 4;
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3902 else if (!vim_iswhite(*p))
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3903 {
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3904 char_u *s, *n;
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3905 int len;
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3906
799
6beb2c667935 updated for version 7.0b
vimboss
parents: 728
diff changeset
3907 /* Add extra field as a dict entry. Fields are
6beb2c667935 updated for version 7.0b
vimboss
parents: 728
diff changeset
3908 * separated by Tabs. */
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3909 n = p;
799
6beb2c667935 updated for version 7.0b
vimboss
parents: 728
diff changeset
3910 while (*p != NUL && *p >= ' ' && *p < 127 && *p != ':')
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3911 ++p;
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 816
diff changeset
3912 len = (int)(p - n);
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3913 if (*p == ':' && len > 0)
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3914 {
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3915 s = ++p;
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3916 while (*p != NUL && *p >= ' ')
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3917 ++p;
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3918 n[len] = NUL;
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3919 if (add_tag_field(dict, (char *)n, s, p) == FAIL)
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3920 ret = FAIL;
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3921 n[len] = ':';
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
3922 }
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3923 else
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3924 /* Skip field without colon. */
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3925 while (*p != NUL && *p >= ' ')
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
3926 ++p;
1674
1d7f46148bf4 updated for version 7.2b-006
vimboss
parents: 1668
diff changeset
3927 if (*p == NUL)
1d7f46148bf4 updated for version 7.2b-006
vimboss
parents: 1668
diff changeset
3928 break;
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3929 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3930 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3931 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3932
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3933 vim_free(matches[i]);
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3934 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3935 vim_free(matches);
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3936 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3937 return ret;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3938 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 41
diff changeset
3939 #endif