annotate src/findfile.c @ 34686:83875247fbc0 v9.1.0224

patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text Commit: https://github.com/vim/vim/commit/515f734e687f28f7199b2a8042197624d9f3ec15 Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com> Date: Thu Mar 28 12:01:14 2024 +0100 patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text Problem: If a line has "right" & "below" virtual text properties, where the "below" property may be stored first due to lack of ordering between them, then the line height is calculated to be 1 more and causes the cursor to far over the line. Solution: Remove some unnecessary setting of a `next_right_goes_below = TRUE` flag for "below" and "above" text properties. (Dylan Thacker-Smith) I modified a regression test I recently added to cover this case, leveraging the fact that "after", "right" & "below" text properties are being stored in the reverse of the order they are added in. The previous version of this regression test was crafted to workaround this issue so it can be addressed by this separate patch. closes: #14317 Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Thu, 28 Mar 2024 12:15:03 +0100
parents 1629cc65d78d
children 2807910c5550
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * findfile.c: Search for files in directories listed in 'path'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #include "vim.h"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17 * File searching functions for 'path', 'tags' and 'cdpath' options.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18 * External visible functions:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 * vim_findfile_init() creates/initialises the search context
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 * vim_findfile_free_visited() free list of visited files/dirs of search
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 * context
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 * vim_findfile() find a file in the search context
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
23 * vim_findfile_cleanup() cleanup/free search context created by
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
24 * vim_findfile_init()
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
25 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26 * All static functions and variables start with 'ff_'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 * In general it works like this:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29 * First you create yourself a search context by calling vim_findfile_init().
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 * It is possible to give a search context from a previous call to
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31 * vim_findfile_init(), so it can be reused. After this you call vim_findfile()
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32 * until you are satisfied with the result or it returns NULL. On every call it
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33 * returns the next file which matches the conditions given to
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 * vim_findfile_init(). If it doesn't find a next file it returns NULL.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36 * It is possible to call vim_findfile_init() again to reinitialise your search
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 * with some new parameters. Don't forget to pass your old search context to
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38 * it, so it can reuse it and especially reuse the list of already visited
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 * directories. If you want to delete the list of already visited directories
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40 * simply call vim_findfile_free_visited().
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 * When you are done call vim_findfile_cleanup() to free the search context.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44 * The function vim_findfile_init() has a long comment, which describes the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 * needed parameters.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
48 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 * ATTENTION:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 * ==========
33223
def9fc5c92d1 patch 9.0.1886: Various Typos
Christian Brabandt <cb@256bit.org>
parents: 32138
diff changeset
51 * Also we use an allocated search context here, these functions are NOT
def9fc5c92d1 patch 9.0.1886: Various Typos
Christian Brabandt <cb@256bit.org>
parents: 32138
diff changeset
52 * thread-safe!
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54 * To minimize parameter passing (or because I'm to lazy), only the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 * external visible functions get a search context as a parameter. This is
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
56 * then assigned to a static global, which is used throughout the local
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 * functions.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
60 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61 * type for the directory search stack
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63 typedef struct ff_stack
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65 struct ff_stack *ffs_prev;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67 // the fix part (no wildcards) and the part containing the wildcards
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68 // of the search path
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
69 char_u *ffs_fix_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
70 char_u *ffs_wc_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72 // files/dirs found in the above directory, matched by the first wildcard
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
73 // of wc_part
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
74 char_u **ffs_filearray;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
75 int ffs_filearray_size;
29570
bc47aeacc8d8 patch 9.0.0126: expanding file names fails in dir with more than 255 entries
Bram Moolenaar <Bram@vim.org>
parents: 27490
diff changeset
76 int ffs_filearray_cur; // needed for partly handled dirs
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
77
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
78 // to store status of partly handled directories
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
79 // 0: we work on this directory for the first time
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
80 // 1: this directory was partly searched in an earlier step
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
81 int ffs_stage;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
82
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
83 // How deep are we in the directory tree?
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
84 // Counts backward from value of level parameter to vim_findfile_init
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
85 int ffs_level;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
86
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
87 // Did we already expand '**' to an empty string?
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
88 int ffs_star_star_empty;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
89 } ff_stack_T;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
90
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
91 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
92 * type for already visited directories or files.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
93 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
94 typedef struct ff_visited
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
95 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
96 struct ff_visited *ffv_next;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
97
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
98 // Visited directories are different if the wildcard string are
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
99 // different. So we have to save it.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
100 char_u *ffv_wc_path;
29863
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
101
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
102 // for unix use inode etc for comparison (needed because of links), else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
103 // use filename.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
104 #ifdef UNIX
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
105 int ffv_dev_valid; // ffv_dev and ffv_ino were set
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
106 dev_t ffv_dev; // device number
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
107 ino_t ffv_ino; // inode number
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
108 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
109 // The memory for this struct is allocated according to the length of
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
110 // ffv_fname.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
111 char_u ffv_fname[1]; // actually longer
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
112 } ff_visited_T;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
113
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
114 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
115 * We might have to manage several visited lists during a search.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
116 * This is especially needed for the tags option. If tags is set to:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
117 * "./++/tags,./++/TAGS,++/tags" (replace + with *)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
118 * So we have to do 3 searches:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
119 * 1) search from the current files directory downward for the file "tags"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
120 * 2) search from the current files directory downward for the file "TAGS"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
121 * 3) search from Vims current directory downwards for the file "tags"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
122 * As you can see, the first and the third search are for the same file, so for
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
123 * the third search we can use the visited list of the first search. For the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
124 * second search we must start from a empty visited list.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
125 * The struct ff_visited_list_hdr is used to manage a linked list of already
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
126 * visited lists.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
127 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
128 typedef struct ff_visited_list_hdr
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
129 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
130 struct ff_visited_list_hdr *ffvl_next;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
131
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
132 // the filename the attached visited list is for
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
133 char_u *ffvl_filename;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
134
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
135 ff_visited_T *ffvl_visited_list;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
136
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
137 } ff_visited_list_hdr_T;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
138
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
139
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
140 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
141 * '**' can be expanded to several directory levels.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
142 * Set the default maximum depth.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
143 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
144 #define FF_MAX_STAR_STAR_EXPAND ((char_u)30)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
145
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
146 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
147 * The search context:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
148 * ffsc_stack_ptr: the stack for the dirs to search
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
149 * ffsc_visited_list: the currently active visited list
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
150 * ffsc_dir_visited_list: the currently active visited list for search dirs
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
151 * ffsc_visited_lists_list: the list of all visited lists
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
152 * ffsc_dir_visited_lists_list: the list of all visited lists for search dirs
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
153 * ffsc_file_to_search: the file to search for
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
154 * ffsc_start_dir: the starting directory, if search path was relative
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
155 * ffsc_fix_path: the fix part of the given path (without wildcards)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
156 * Needed for upward search.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
157 * ffsc_wc_path: the part of the given path containing wildcards
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
158 * ffsc_level: how many levels of dirs to search downwards
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
159 * ffsc_stopdirs_v: array of stop directories for upward search
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
160 * ffsc_find_what: FINDFILE_BOTH, FINDFILE_DIR or FINDFILE_FILE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
161 * ffsc_tagfile: searching for tags file, don't use 'suffixesadd'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
162 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
163 typedef struct ff_search_ctx_T
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
164 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
165 ff_stack_T *ffsc_stack_ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
166 ff_visited_list_hdr_T *ffsc_visited_list;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
167 ff_visited_list_hdr_T *ffsc_dir_visited_list;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
168 ff_visited_list_hdr_T *ffsc_visited_lists_list;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
169 ff_visited_list_hdr_T *ffsc_dir_visited_lists_list;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
170 char_u *ffsc_file_to_search;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
171 char_u *ffsc_start_dir;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
172 char_u *ffsc_fix_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
173 char_u *ffsc_wc_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
174 int ffsc_level;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
175 char_u **ffsc_stopdirs_v;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
176 int ffsc_find_what;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
177 int ffsc_tagfile;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
178 } ff_search_ctx_T;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
179
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 // locally needed functions
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 static int ff_check_visited(ff_visited_T **, char_u *, char_u *);
17789
0f7ae8010787 patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
182 static void vim_findfile_free_visited(void *search_ctx_arg);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183 static void vim_findfile_free_visited_list(ff_visited_list_hdr_T **list_headp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184 static void ff_free_visited_list(ff_visited_T *vl);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 static ff_visited_list_hdr_T* ff_get_visited_list(char_u *, ff_visited_list_hdr_T **list_headp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187 static void ff_push(ff_search_ctx_T *search_ctx, ff_stack_T *stack_ptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
188 static ff_stack_T *ff_pop(ff_search_ctx_T *search_ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
189 static void ff_clear(ff_search_ctx_T *search_ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
190 static void ff_free_stack_element(ff_stack_T *stack_ptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 static ff_stack_T *ff_create_stack_element(char_u *, char_u *, int, int);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 static int ff_path_in_stoplist(char_u *, int, char_u **);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
194 static char_u *ff_expand_buffer = NULL; // used for expanding filenames
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
195
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 #if 0
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 * if someone likes findfirst/findnext, here are the functions
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
199 * NOT TESTED!!
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 static void *ff_fn_search_context = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
204 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 vim_findfirst(char_u *path, char_u *filename, int level)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 ff_fn_search_context =
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208 vim_findfile_init(path, filename, NULL, level, TRUE, FALSE,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 ff_fn_search_context, rel_fname);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210 if (NULL == ff_fn_search_context)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 return vim_findnext()
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
214 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
215
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
217 vim_findnext(void)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
219 char_u *ret = vim_findfile(ff_fn_search_context);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
220
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
221 if (NULL == ret)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
222 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
223 vim_findfile_cleanup(ff_fn_search_context);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
224 ff_fn_search_context = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226 return ret;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
227 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
228 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
229
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231 * Initialization routine for vim_findfile().
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
232 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
233 * Returns the newly allocated search context or NULL if an error occurred.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
234 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
235 * Don't forget to clean up by calling vim_findfile_cleanup() if you are done
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236 * with the search context.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
237 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
238 * Find the file 'filename' in the directory 'path'.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
239 * The parameter 'path' may contain wildcards. If so only search 'level'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
240 * directories deep. The parameter 'level' is the absolute maximum and is
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
241 * not related to restricts given to the '**' wildcard. If 'level' is 100
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
242 * and you use '**200' vim_findfile() will stop after 100 levels.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
244 * 'filename' cannot contain wildcards! It is used as-is, no backslashes to
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
245 * escape special characters.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
246 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
247 * If 'stopdirs' is not NULL and nothing is found downward, the search is
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
248 * restarted on the next higher directory level. This is repeated until the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
249 * start-directory of a search is contained in 'stopdirs'. 'stopdirs' has the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
250 * format ";*<dirname>*\(;<dirname>\)*;\=$".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
251 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
252 * If the 'path' is relative, the starting dir for the search is either VIM's
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
253 * current dir or if the path starts with "./" the current files dir.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
254 * If the 'path' is absolute, the starting dir is that part of the path before
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
255 * the first wildcard.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
256 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257 * Upward search is only done on the starting dir.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
258 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
259 * If 'free_visited' is TRUE the list of already visited files/directories is
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
260 * cleared. Set this to FALSE if you just want to search from another
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
261 * directory, but want to be sure that no directory from a previous search is
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
262 * searched again. This is useful if you search for a file at different places.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
263 * The list of visited files/dirs can also be cleared with the function
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
264 * vim_findfile_free_visited().
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
265 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
266 * Set the parameter 'find_what' to FINDFILE_DIR if you want to search for
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
267 * directories only, FINDFILE_FILE for files only, FINDFILE_BOTH for both.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
268 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
269 * A search context returned by a previous call to vim_findfile_init() can be
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
270 * passed in the parameter "search_ctx_arg". This context is reused and
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
271 * reinitialized with the new parameters. The list of already visited
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
272 * directories from this context is only deleted if the parameter
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
273 * "free_visited" is true. Be aware that the passed "search_ctx_arg" is freed
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
274 * if the reinitialization fails.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
275 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
276 * If you don't have a search context from a previous call "search_ctx_arg"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
277 * must be NULL.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
278 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
279 * This function silently ignores a few errors, vim_findfile() will have
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
280 * limited functionality then.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
281 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
282 void *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
283 vim_findfile_init(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
284 char_u *path,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
285 char_u *filename,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
286 char_u *stopdirs UNUSED,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
287 int level,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
288 int free_visited,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
289 int find_what,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
290 void *search_ctx_arg,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
291 int tagfile, // expanding names of tags files
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
292 char_u *rel_fname) // file name to use for "."
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
293 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
294 char_u *wc_part;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
295 ff_stack_T *sptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
296 ff_search_ctx_T *search_ctx;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
297
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
298 // If a search context is given by the caller, reuse it, else allocate a
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
299 // new one.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
300 if (search_ctx_arg != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
301 search_ctx = search_ctx_arg;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
302 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
303 {
20007
aadd1cae2ff5 patch 8.2.0559: clearing a struct is verbose
Bram Moolenaar <Bram@vim.org>
parents: 18939
diff changeset
304 search_ctx = ALLOC_CLEAR_ONE(ff_search_ctx_T);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
305 if (search_ctx == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
306 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
307 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
308 search_ctx->ffsc_find_what = find_what;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
309 search_ctx->ffsc_tagfile = tagfile;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
310
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
311 // clear the search context, but NOT the visited lists
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
312 ff_clear(search_ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
313
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
314 // clear visited list if wanted
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
315 if (free_visited == TRUE)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
316 vim_findfile_free_visited(search_ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
317 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
318 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
319 // Reuse old visited lists. Get the visited list for the given
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
320 // filename. If no list for the current filename exists, creates a new
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
321 // one.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
322 search_ctx->ffsc_visited_list = ff_get_visited_list(filename,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
323 &search_ctx->ffsc_visited_lists_list);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
324 if (search_ctx->ffsc_visited_list == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
325 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
326 search_ctx->ffsc_dir_visited_list = ff_get_visited_list(filename,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
327 &search_ctx->ffsc_dir_visited_lists_list);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
328 if (search_ctx->ffsc_dir_visited_list == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
329 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
330 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
331
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
332 if (ff_expand_buffer == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
333 {
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16782
diff changeset
334 ff_expand_buffer = alloc(MAXPATHL);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
335 if (ff_expand_buffer == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
336 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
337 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
338
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
339 // Store information on starting dir now if path is relative.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
340 // If path is absolute, we do that later.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
341 if (path[0] == '.'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
342 && (vim_ispathsep(path[1]) || path[1] == NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
343 && (!tagfile || vim_strchr(p_cpo, CPO_DOTTAG) == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
344 && rel_fname != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
345 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
346 int len = (int)(gettail(rel_fname) - rel_fname);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
347
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
348 if (!vim_isAbsName(rel_fname) && len + 1 < MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
349 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
350 // Make the start dir an absolute path name.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
351 vim_strncpy(ff_expand_buffer, rel_fname, len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
352 search_ctx->ffsc_start_dir = FullName_save(ff_expand_buffer, FALSE);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
353 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
354 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
355 search_ctx->ffsc_start_dir = vim_strnsave(rel_fname, len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
356 if (search_ctx->ffsc_start_dir == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
357 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
358 if (*++path != NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
359 ++path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
360 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
361 else if (*path == NUL || !vim_isAbsName(path))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
362 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
363 #ifdef BACKSLASH_IN_FILENAME
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
364 // "c:dir" needs "c:" to be expanded, otherwise use current dir
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
365 if (*path != NUL && path[1] == ':')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
366 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 char_u drive[3];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
368
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
369 drive[0] = path[0];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
370 drive[1] = ':';
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
371 drive[2] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
372 if (vim_FullName(drive, ff_expand_buffer, MAXPATHL, TRUE) == FAIL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
373 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
374 path += 2;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
375 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
376 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
377 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
378 if (mch_dirname(ff_expand_buffer, MAXPATHL) == FAIL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
379 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
380
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
381 search_ctx->ffsc_start_dir = vim_strsave(ff_expand_buffer);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
382 if (search_ctx->ffsc_start_dir == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
383 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
384
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
385 #ifdef BACKSLASH_IN_FILENAME
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
386 // A path that starts with "/dir" is relative to the drive, not to the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
387 // directory (but not for "//machine/dir"). Only use the drive name.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
388 if ((*path == '/' || *path == '\\')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
389 && path[1] != path[0]
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
390 && search_ctx->ffsc_start_dir[1] == ':')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
391 search_ctx->ffsc_start_dir[2] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
392 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
393 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
395 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
396 * If stopdirs are given, split them into an array of pointers.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397 * If this fails (mem allocation), there is no upward search at all or a
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 * stop directory is not recognized -> continue silently.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
399 * If stopdirs just contains a ";" or is empty,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 * search_ctx->ffsc_stopdirs_v will only contain a NULL pointer. This
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
401 * is handled as unlimited upward search. See function
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402 * ff_path_in_stoplist() for details.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
403 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
404 if (stopdirs != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406 char_u *walker = stopdirs;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
407 int dircount;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
408
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
409 while (*walker == ';')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
410 walker++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
411
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
412 dircount = 1;
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16782
diff changeset
413 search_ctx->ffsc_stopdirs_v = ALLOC_ONE(char_u *);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
414
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
415 if (search_ctx->ffsc_stopdirs_v != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
416 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
417 do
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
419 char_u *helper;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
420 void *ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
421
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422 helper = walker;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 ptr = vim_realloc(search_ctx->ffsc_stopdirs_v,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
424 (dircount + 1) * sizeof(char_u *));
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 if (ptr)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 search_ctx->ffsc_stopdirs_v = ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
427 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
428 // ignore, keep what we have and continue
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
430 walker = vim_strchr(walker, ';');
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 if (walker)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
432 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
433 search_ctx->ffsc_stopdirs_v[dircount-1] =
20830
9064044fd4f6 patch 8.2.0967: unnecessary type casts for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents: 20007
diff changeset
434 vim_strnsave(helper, walker - helper);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
435 walker++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438 // this might be "", which means ascent till top
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
439 // of directory tree.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
440 search_ctx->ffsc_stopdirs_v[dircount-1] =
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
441 vim_strsave(helper);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
442
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
443 dircount++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
445 } while (walker != NULL);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446 search_ctx->ffsc_stopdirs_v[dircount-1] = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
447 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 search_ctx->ffsc_level = level;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
452 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453 * split into:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
454 * -fix path
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
455 * -wildcard_stuff (might be NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
456 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
457 wc_part = vim_strchr(path, '*');
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 if (wc_part != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
459 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
460 int llevel;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 int len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462 char *errpt;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
463
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
464 // save the fix part of the path
20830
9064044fd4f6 patch 8.2.0967: unnecessary type casts for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents: 20007
diff changeset
465 search_ctx->ffsc_fix_path = vim_strnsave(path, wc_part - path);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
466
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
467 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
468 * copy wc_path and add restricts to the '**' wildcard.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 * The octet after a '**' is used as a (binary) counter.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
470 * So '**3' is transposed to '**^C' ('^C' is ASCII value 3)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
471 * or '**76' is transposed to '**N'( 'N' is ASCII value 76).
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
472 * If no restrict is given after '**' the default is used.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
473 * Due to this technique the path looks awful if you print it as a
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
474 * string.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
476 len = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
477 while (*wc_part != NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
478 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
479 if (len + 5 >= MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
480 {
26962
85866e069c24 patch 8.2.4010: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26913
diff changeset
481 emsg(_(e_path_too_long_for_completion));
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
484 if (STRNCMP(wc_part, "**", 2) == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
485 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 ff_expand_buffer[len++] = *wc_part++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487 ff_expand_buffer[len++] = *wc_part++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
488
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
489 llevel = strtol((char *)wc_part, &errpt, 10);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
490 if ((char_u *)errpt != wc_part && llevel > 0 && llevel < 255)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491 ff_expand_buffer[len++] = llevel;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
492 else if ((char_u *)errpt != wc_part && llevel == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
493 // restrict is 0 -> remove already added '**'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 len -= 2;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
496 ff_expand_buffer[len++] = FF_MAX_STAR_STAR_EXPAND;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497 wc_part = (char_u *)errpt;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
498 if (*wc_part != NUL && !vim_ispathsep(*wc_part))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
499 {
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
500 semsg(_(e_invalid_path_number_must_be_at_end_of_path_or_be_followed_by_str), PATHSEPSTR);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
501 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
502 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
503 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
504 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
505 ff_expand_buffer[len++] = *wc_part++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
506 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
507 ff_expand_buffer[len] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
508 search_ctx->ffsc_wc_path = vim_strsave(ff_expand_buffer);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
509
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510 if (search_ctx->ffsc_wc_path == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
511 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
512 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
513 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
514 search_ctx->ffsc_fix_path = vim_strsave(path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 if (search_ctx->ffsc_start_dir == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
517 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
518 // store the fix part as startdir.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 // This is needed if the parameter path is fully qualified.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 search_ctx->ffsc_start_dir = vim_strsave(search_ctx->ffsc_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521 if (search_ctx->ffsc_start_dir == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
523 search_ctx->ffsc_fix_path[0] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
524 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
526 // create an absolute path
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
527 if (STRLEN(search_ctx->ffsc_start_dir)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 + STRLEN(search_ctx->ffsc_fix_path) + 3 >= MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529 {
26962
85866e069c24 patch 8.2.4010: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26913
diff changeset
530 emsg(_(e_path_too_long_for_completion));
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
533 STRCPY(ff_expand_buffer, search_ctx->ffsc_start_dir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
534 add_pathsep(ff_expand_buffer);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
535 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
536 int eb_len = (int)STRLEN(ff_expand_buffer);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
537 char_u *buf = alloc(eb_len
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
538 + (int)STRLEN(search_ctx->ffsc_fix_path) + 1);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
539
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
540 STRCPY(buf, ff_expand_buffer);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541 STRCPY(buf + eb_len, search_ctx->ffsc_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542 if (mch_isdir(buf))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
543 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544 STRCAT(ff_expand_buffer, search_ctx->ffsc_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
545 add_pathsep(ff_expand_buffer);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
546 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
547 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
548 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
549 char_u *p = gettail(search_ctx->ffsc_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 char_u *wc_path = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 char_u *temp = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
552 int len = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
554 if (p > search_ctx->ffsc_fix_path)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
555 {
25364
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
556 // do not add '..' to the path and start upwards searching
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
557 len = (int)(p - search_ctx->ffsc_fix_path) - 1;
25364
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
558 if ((len >= 2
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
559 && STRNCMP(search_ctx->ffsc_fix_path, "..", 2) == 0)
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
560 && (len == 2
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
561 || search_ctx->ffsc_fix_path[2] == PATHSEP))
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
562 {
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
563 vim_free(buf);
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
564 goto error_return;
af5c4fabcf40 patch 8.2.3219: :find searches non-existing directories
Bram Moolenaar <Bram@vim.org>
parents: 24822
diff changeset
565 }
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566 STRNCAT(ff_expand_buffer, search_ctx->ffsc_fix_path, len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
567 add_pathsep(ff_expand_buffer);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
568 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570 len = (int)STRLEN(search_ctx->ffsc_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
572 if (search_ctx->ffsc_wc_path != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
574 wc_path = vim_strsave(search_ctx->ffsc_wc_path);
16782
fc58fee685e2 patch 8.1.1393: unnecessary type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
575 temp = alloc(STRLEN(search_ctx->ffsc_wc_path)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 + STRLEN(search_ctx->ffsc_fix_path + len)
16782
fc58fee685e2 patch 8.1.1393: unnecessary type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
577 + 1);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 if (temp == NULL || wc_path == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
579 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580 vim_free(buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
581 vim_free(temp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
582 vim_free(wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
586 STRCPY(temp, search_ctx->ffsc_fix_path + len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
587 STRCAT(temp, search_ctx->ffsc_wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 vim_free(search_ctx->ffsc_wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589 vim_free(wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590 search_ctx->ffsc_wc_path = temp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
591 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
592 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
593 vim_free(buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
594 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
595
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
596 sptr = ff_create_stack_element(ff_expand_buffer,
29863
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
597 search_ctx->ffsc_wc_path, level, 0);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
598
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
599 if (sptr == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
601
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
602 ff_push(search_ctx, sptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
604 search_ctx->ffsc_file_to_search = vim_strsave(filename);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
605 if (search_ctx->ffsc_file_to_search == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606 goto error_return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608 return search_ctx;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
609
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
610 error_return:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
611 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612 * We clear the search context now!
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
613 * Even when the caller gave us a (perhaps valid) context we free it here,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614 * as we might have already destroyed it.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 vim_findfile_cleanup(search_ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
617 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
619
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
620 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
621 * Get the stopdir string. Check that ';' is not escaped.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
622 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
623 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
624 vim_findfile_stopdir(char_u *buf)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
625 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 char_u *r_ptr = buf;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
627
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
628 while (*r_ptr != NUL && *r_ptr != ';')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
629 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630 if (r_ptr[0] == '\\' && r_ptr[1] == ';')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 // Overwrite the escape char,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
633 // use STRLEN(r_ptr) to move the trailing '\0'.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
634 STRMOVE(r_ptr, r_ptr + 1);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635 r_ptr++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
636 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 r_ptr++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
638 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
639 if (*r_ptr == ';')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
641 *r_ptr = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642 r_ptr++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644 else if (*r_ptr == NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 r_ptr = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
646 return r_ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
648
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
650 * Clean up the given search context. Can handle a NULL pointer.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
652 void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
653 vim_findfile_cleanup(void *ctx)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
654 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655 if (ctx == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
656 return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 vim_findfile_free_visited(ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659 ff_clear(ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
660 vim_free(ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 * Find a file in a search context.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 * The search context was created with vim_findfile_init() above.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
666 * Return a pointer to an allocated file name or NULL if nothing found.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
667 * To get all matching files call this function until you get NULL.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
668 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
669 * If the passed search_context is NULL, NULL is returned.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 * The search algorithm is depth first. To change this replace the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 * stack with a list (don't forget to leave partly searched directories on the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
673 * top of the list).
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
674 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
675 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676 vim_findfile(void *search_ctx_arg)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
678 char_u *file_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 char_u *rest_of_wildcards;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680 char_u *path_end = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681 ff_stack_T *stackp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682 int len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 int i;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
684 char_u *p;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
685 char_u *suf;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 ff_search_ctx_T *search_ctx;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688 if (search_ctx_arg == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
689 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
690
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691 search_ctx = (ff_search_ctx_T *)search_ctx_arg;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 * filepath is used as buffer for various actions and as the storage to
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695 * return a found filename.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 */
16782
fc58fee685e2 patch 8.1.1393: unnecessary type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
697 if ((file_path = alloc(MAXPATHL)) == NULL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700 // store the end of the start dir -- needed for upward search
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701 if (search_ctx->ffsc_start_dir != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702 path_end = &search_ctx->ffsc_start_dir[
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
703 STRLEN(search_ctx->ffsc_start_dir)];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
705 // upward search loop
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 for (;;)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
707 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
708 // downward search loop
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
709 for (;;)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
710 {
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26589
diff changeset
711 // check if user wants to stop the search
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712 ui_breakcheck();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
713 if (got_int)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716 // get directory to work on from stack
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
717 stackp = ff_pop(search_ctx);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718 if (stackp == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 * TODO: decide if we leave this test in
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
724 * GOOD: don't search a directory(-tree) twice.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725 * BAD: - check linked list for every new directory entered.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
726 * - check for double files also done below
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
727 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
728 * Here we check if we already searched this directory.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 * We already searched a directory if:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730 * 1) The directory is the same.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731 * 2) We would use the same wildcard string.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733 * Good if you have links on same directory via several ways
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
734 * or you have selfreferences in directories (e.g. SuSE Linux 6.3:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 * /etc/rc.d/init.d is linked to /etc/rc.d -> endless loop)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737 * This check is only needed for directories we work on for the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
738 * first time (hence stackp->ff_filearray == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 if (stackp->ffs_filearray == NULL
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 && ff_check_visited(&search_ctx->ffsc_dir_visited_list
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
742 ->ffvl_visited_list,
29863
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
743 stackp->ffs_fix_path, stackp->ffs_wc_path) == FAIL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
744 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
745 #ifdef FF_VERBOSE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 if (p_verbose >= 5)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
747 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
748 verbose_enter_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
749 smsg("Already Searched: %s (%s)",
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750 stackp->ffs_fix_path, stackp->ffs_wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
751 // don't overwrite this either
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
752 msg_puts("\n");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
753 verbose_leave_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
755 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
756 ff_free_stack_element(stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
757 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
758 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
759 #ifdef FF_VERBOSE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
760 else if (p_verbose >= 5)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762 verbose_enter_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 smsg("Searching: %s (%s)",
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
764 stackp->ffs_fix_path, stackp->ffs_wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
765 // don't overwrite this either
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
766 msg_puts("\n");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
767 verbose_leave_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
768 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
769 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
770
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
771 // check depth
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
772 if (stackp->ffs_level <= 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
773 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
774 ff_free_stack_element(stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
775 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
776 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
777
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778 file_path[0] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781 * If no filearray till now expand wildcards
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
782 * The function expand_wildcards() can handle an array of paths
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 * and all possible expands are returned in one array. We use this
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 * to handle the expansion of '**' into an empty string.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
786 if (stackp->ffs_filearray == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
788 char_u *dirptrs[2];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 // we use filepath to build the path expand_wildcards() should
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
791 // expand.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
792 dirptrs[0] = file_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
793 dirptrs[1] = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
794
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 // if we have a start dir copy it in
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
796 if (!vim_isAbsName(stackp->ffs_fix_path)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 && search_ctx->ffsc_start_dir)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799 if (STRLEN(search_ctx->ffsc_start_dir) + 1 < MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 STRCPY(file_path, search_ctx->ffsc_start_dir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802 add_pathsep(file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
806 ff_free_stack_element(stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 goto fail;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
809 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
810
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 // append the fix part of the search path
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 if (STRLEN(file_path) + STRLEN(stackp->ffs_fix_path) + 1
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
813 < MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
814 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815 STRCAT(file_path, stackp->ffs_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816 add_pathsep(file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
819 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820 ff_free_stack_element(stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 goto fail;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
822 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
824 rest_of_wildcards = stackp->ffs_wc_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
825 if (*rest_of_wildcards != NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
826 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 len = (int)STRLEN(file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
828 if (STRNCMP(rest_of_wildcards, "**", 2) == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
830 // pointer to the restrict byte
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
831 // The restrict byte is not a character!
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 p = rest_of_wildcards + 2;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
833
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
834 if (*p > 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
835 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 (*p)--;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
837 if (len + 1 < MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838 file_path[len++] = '*';
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 ff_free_stack_element(stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
842 goto fail;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
843 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
844 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
845
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 if (*p == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848 // remove '**<numb> from wildcards
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 STRMOVE(rest_of_wildcards, rest_of_wildcards + 3);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
850 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
852 rest_of_wildcards += 3;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854 if (stackp->ffs_star_star_empty == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 // if not done before, expand '**' to empty
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
857 stackp->ffs_star_star_empty = 1;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
858 dirptrs[1] = stackp->ffs_fix_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
859 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
860 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
861
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
862 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
863 * Here we copy until the next path separator or the end of
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
864 * the path. If we stop at a path separator, there is
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
865 * still something else left. This is handled below by
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
866 * pushing every directory returned from expand_wildcards()
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
867 * on the stack again for further search.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
868 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
869 while (*rest_of_wildcards
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
870 && !vim_ispathsep(*rest_of_wildcards))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 if (len + 1 < MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
872 file_path[len++] = *rest_of_wildcards++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
873 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
874 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
875 ff_free_stack_element(stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876 goto fail;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 file_path[len] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
880 if (vim_ispathsep(*rest_of_wildcards))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 rest_of_wildcards++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 * Expand wildcards like "*" and "$VAR".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886 * If the path is a URL don't try this.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
888 if (path_with_url(dirptrs[0]))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
889 {
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16782
diff changeset
890 stackp->ffs_filearray = ALLOC_ONE(char_u *);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 if (stackp->ffs_filearray != NULL
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
892 && (stackp->ffs_filearray[0]
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
893 = vim_strsave(dirptrs[0])) != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
894 stackp->ffs_filearray_size = 1;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
895 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
896 stackp->ffs_filearray_size = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
897 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899 // Add EW_NOTWILD because the expanded path may contain
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
900 // wildcard characters that are to be taken literally.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
901 // This is a bit of a hack.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 expand_wildcards((dirptrs[1] == NULL) ? 1 : 2, dirptrs,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 &stackp->ffs_filearray_size,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 &stackp->ffs_filearray,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905 EW_DIR|EW_ADDSLASH|EW_SILENT|EW_NOTWILD);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
906
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907 stackp->ffs_filearray_cur = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
908 stackp->ffs_stage = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
909 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
910 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911 rest_of_wildcards = &stackp->ffs_wc_path[
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
912 STRLEN(stackp->ffs_wc_path)];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
914 if (stackp->ffs_stage == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
915 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 // this is the first time we work on this directory
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
917 if (*rest_of_wildcards == NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
919 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
920 * We don't have further wildcards to expand, so we have to
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
921 * check for the final file now.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
922 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
923 for (i = stackp->ffs_filearray_cur;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
924 i < stackp->ffs_filearray_size; ++i)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
925 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
926 if (!path_with_url(stackp->ffs_filearray[i])
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
927 && !mch_isdir(stackp->ffs_filearray[i]))
18779
8f05b3cf8557 patch 8.1.2379: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
928 continue; // not a directory
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930 // prepare the filename to be checked for existence
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 // below
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932 if (STRLEN(stackp->ffs_filearray[i]) + 1
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933 + STRLEN(search_ctx->ffsc_file_to_search)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934 < MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
935 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 STRCPY(file_path, stackp->ffs_filearray[i]);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937 add_pathsep(file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
938 STRCAT(file_path, search_ctx->ffsc_file_to_search);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
940 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
942 ff_free_stack_element(stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
943 goto fail;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
946 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
947 * Try without extra suffix and then with suffixes
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 * from 'suffixesadd'.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
949 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
950 len = (int)STRLEN(file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
951 if (search_ctx->ffsc_tagfile)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952 suf = (char_u *)"";
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
953 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 suf = curbuf->b_p_sua;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
955 for (;;)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
956 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
957 // if file exists and we didn't already find it
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958 if ((path_with_url(file_path)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
959 || (mch_getperm(file_path) >= 0
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960 && (search_ctx->ffsc_find_what
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961 == FINDFILE_BOTH
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 || ((search_ctx->ffsc_find_what
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963 == FINDFILE_DIR)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 == mch_isdir(file_path)))))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 #ifndef FF_VERBOSE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 && (ff_check_visited(
29863
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
967 &search_ctx->ffsc_visited_list
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
968 ->ffvl_visited_list,
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
969 file_path, (char_u *)"") == OK)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
970 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971 )
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973 #ifdef FF_VERBOSE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974 if (ff_check_visited(
29863
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
975 &search_ctx->ffsc_visited_list
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
976 ->ffvl_visited_list,
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
977 file_path, (char_u *)"") == FAIL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 if (p_verbose >= 5)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 verbose_enter_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 smsg("Already: %s",
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983 file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 // don't overwrite this either
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985 msg_puts("\n");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 verbose_leave_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
992 // push dir to examine rest of subdirs later
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 stackp->ffs_filearray_cur = i + 1;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 ff_push(search_ctx, stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 if (!path_with_url(file_path))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997 simplify_filename(file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 if (mch_dirname(ff_expand_buffer, MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 == OK)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1001 p = shorten_fname(file_path,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 ff_expand_buffer);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 if (p != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 STRMOVE(file_path, p);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006 #ifdef FF_VERBOSE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1007 if (p_verbose >= 5)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 verbose_enter_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 smsg("HIT: %s", file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 // don't overwrite this either
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012 msg_puts("\n");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 verbose_leave_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 return file_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 // Not found or found already, try next suffix.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1020 if (*suf == NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 copy_option_part(&suf, file_path + len,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1023 MAXPATHL - len, ",");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1029 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030 * still wildcards left, push the directories for further
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 * search
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033 for (i = stackp->ffs_filearray_cur;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1034 i < stackp->ffs_filearray_size; ++i)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1036 if (!mch_isdir(stackp->ffs_filearray[i]))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 continue; // not a directory
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1038
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1039 ff_push(search_ctx,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1040 ff_create_stack_element(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 stackp->ffs_filearray[i],
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1042 rest_of_wildcards,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 stackp->ffs_level - 1, 0));
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1044 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046 stackp->ffs_filearray_cur = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 stackp->ffs_stage = 1;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1051 * if wildcards contains '**' we have to descent till we reach the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 * leaves of the directory tree.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 if (STRNCMP(stackp->ffs_wc_path, "**", 2) == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056 for (i = stackp->ffs_filearray_cur;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057 i < stackp->ffs_filearray_size; ++i)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1058 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1059 if (fnamecmp(stackp->ffs_filearray[i],
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1060 stackp->ffs_fix_path) == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1061 continue; // don't repush same directory
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1062 if (!mch_isdir(stackp->ffs_filearray[i]))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1063 continue; // not a directory
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1064 ff_push(search_ctx,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1065 ff_create_stack_element(stackp->ffs_filearray[i],
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1066 stackp->ffs_wc_path, stackp->ffs_level - 1, 1));
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1067 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1068 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1069
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1070 // we are done with the current directory
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1071 ff_free_stack_element(stackp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1072
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1073 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1074
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1075 // If we reached this, we didn't find anything downwards.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1076 // Let's check if we should do an upward search.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1077 if (search_ctx->ffsc_start_dir
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1078 && search_ctx->ffsc_stopdirs_v != NULL && !got_int)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1079 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1080 ff_stack_T *sptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1081
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1082 // is the last starting directory in the stop list?
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1083 if (ff_path_in_stoplist(search_ctx->ffsc_start_dir,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1084 (int)(path_end - search_ctx->ffsc_start_dir),
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1085 search_ctx->ffsc_stopdirs_v) == TRUE)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1086 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1087
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1088 // cut of last dir
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1089 while (path_end > search_ctx->ffsc_start_dir
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1090 && vim_ispathsep(*path_end))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1091 path_end--;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1092 while (path_end > search_ctx->ffsc_start_dir
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1093 && !vim_ispathsep(path_end[-1]))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1094 path_end--;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1095 *path_end = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1096 path_end--;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1097
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1098 if (*search_ctx->ffsc_start_dir == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1099 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1100
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1101 if (STRLEN(search_ctx->ffsc_start_dir) + 1
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1102 + STRLEN(search_ctx->ffsc_fix_path) < MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1103 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104 STRCPY(file_path, search_ctx->ffsc_start_dir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1105 add_pathsep(file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1106 STRCAT(file_path, search_ctx->ffsc_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1107 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1109 goto fail;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1110
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1111 // create a new stack entry
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1112 sptr = ff_create_stack_element(file_path,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1113 search_ctx->ffsc_wc_path, search_ctx->ffsc_level, 0);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1114 if (sptr == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1115 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1116 ff_push(search_ctx, sptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1117 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1118 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1119 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1120 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1121
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1122 fail:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1123 vim_free(file_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1124 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1127 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1128 * Free the list of lists of visited files and directories
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1129 * Can handle it if the passed search_context is NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1130 */
17789
0f7ae8010787 patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents: 16825
diff changeset
1131 static void
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 vim_findfile_free_visited(void *search_ctx_arg)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134 ff_search_ctx_T *search_ctx;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1135
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136 if (search_ctx_arg == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1139 search_ctx = (ff_search_ctx_T *)search_ctx_arg;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140 vim_findfile_free_visited_list(&search_ctx->ffsc_visited_lists_list);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1141 vim_findfile_free_visited_list(&search_ctx->ffsc_dir_visited_lists_list);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1142 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1143
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1144 static void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 vim_findfile_free_visited_list(ff_visited_list_hdr_T **list_headp)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1147 ff_visited_list_hdr_T *vp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 while (*list_headp != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1150 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151 vp = (*list_headp)->ffvl_next;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 ff_free_visited_list((*list_headp)->ffvl_visited_list);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1153
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1154 vim_free((*list_headp)->ffvl_filename);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1155 vim_free(*list_headp);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156 *list_headp = vp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1157 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1158 *list_headp = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1159 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1160
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1161 static void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1162 ff_free_visited_list(ff_visited_T *vl)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1163 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1164 ff_visited_T *vp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1165
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1166 while (vl != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1167 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1168 vp = vl->ffv_next;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1169 vim_free(vl->ffv_wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1170 vim_free(vl);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1171 vl = vp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1172 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1173 vl = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1174 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1177 * Returns the already visited list for the given filename. If none is found it
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1178 * allocates a new one.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1179 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180 static ff_visited_list_hdr_T*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1181 ff_get_visited_list(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182 char_u *filename,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 ff_visited_list_hdr_T **list_headp)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 ff_visited_list_hdr_T *retptr = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187 // check if a visited list for the given filename exists
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 if (*list_headp != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1189 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1190 retptr = *list_headp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191 while (retptr != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 if (fnamecmp(filename, retptr->ffvl_filename) == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 #ifdef FF_VERBOSE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 if (p_verbose >= 5)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1197 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 verbose_enter_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 smsg("ff_get_visited_list: FOUND list for %s",
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 filename);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201 // don't overwrite this either
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 msg_puts("\n");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203 verbose_leave_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 return retptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1207 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 retptr = retptr->ffvl_next;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1211
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212 #ifdef FF_VERBOSE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1213 if (p_verbose >= 5)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1214 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1215 verbose_enter_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216 smsg("ff_get_visited_list: new list for %s", filename);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1217 // don't overwrite this either
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218 msg_puts("\n");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 verbose_leave_scroll();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1220 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1222
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1223 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1224 * if we reach this we didn't find a list and we have to allocate new list
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1225 */
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16782
diff changeset
1226 retptr = ALLOC_ONE(ff_visited_list_hdr_T);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1227 if (retptr == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1228 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1229
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1230 retptr->ffvl_visited_list = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1231 retptr->ffvl_filename = vim_strsave(filename);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232 if (retptr->ffvl_filename == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1233 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 vim_free(retptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1235 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1237 retptr->ffvl_next = *list_headp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238 *list_headp = retptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1239
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1240 return retptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1241 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1242
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1243 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244 * check if two wildcard paths are equal. Returns TRUE or FALSE.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1245 * They are equal if:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246 * - both paths are NULL
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247 * - they have the same length
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1248 * - char by char comparison is OK
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1249 * - the only differences are in the counters behind a '**', so
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1250 * '**\20' is equal to '**\24'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1251 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1252 static int
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253 ff_wc_equal(char_u *s1, char_u *s2)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1254 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255 int i, j;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1256 int c1 = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1257 int c2 = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1258 int prev1 = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1259 int prev2 = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1260
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1261 if (s1 == s2)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1262 return TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1263
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1264 if (s1 == NULL || s2 == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265 return FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1266
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1267 for (i = 0, j = 0; s1[i] != NUL && s2[j] != NUL;)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1268 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269 c1 = PTR2CHAR(s1 + i);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1270 c2 = PTR2CHAR(s2 + j);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1271
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1272 if ((p_fic ? MB_TOLOWER(c1) != MB_TOLOWER(c2) : c1 != c2)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1273 && (prev1 != '*' || prev2 != '*'))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1274 return FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1275 prev2 = prev1;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1276 prev1 = c1;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1277
18251
c8a53c0daeed patch 8.1.2120: some MB_ macros are more complicated than necessary
Bram Moolenaar <Bram@vim.org>
parents: 17966
diff changeset
1278 i += mb_ptr2len(s1 + i);
c8a53c0daeed patch 8.1.2120: some MB_ macros are more complicated than necessary
Bram Moolenaar <Bram@vim.org>
parents: 17966
diff changeset
1279 j += mb_ptr2len(s2 + j);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1280 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 return s1[i] == s2[j];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1283
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1285 * maintains the list of already visited files and dirs
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1286 * returns FAIL if the given file/dir is already in the list
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1287 * returns OK if it is newly added
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1288 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1289 * TODO: What to do on memory allocation problems?
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1290 * -> return TRUE - Better the file is found several times instead of
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1291 * never.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1292 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1293 static int
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1294 ff_check_visited(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1295 ff_visited_T **visited_list,
29863
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
1296 char_u *fname,
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
1297 char_u *wc_path)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1298 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1299 ff_visited_T *vp;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1300 #ifdef UNIX
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1301 stat_T st;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1302 int url = FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1303 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1304
26771
fc859aea8cec patch 8.2.3914: various spelling mistakes in comments
Bram Moolenaar <Bram@vim.org>
parents: 26589
diff changeset
1305 // For a URL we only compare the name, otherwise we compare the
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1306 // device/inode (unix) or the full path name (not Unix).
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1307 if (path_with_url(fname))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1308 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 vim_strncpy(ff_expand_buffer, fname, MAXPATHL - 1);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1310 #ifdef UNIX
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1311 url = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1312 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1313 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1314 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1315 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1316 ff_expand_buffer[0] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1317 #ifdef UNIX
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1318 if (mch_stat((char *)fname, &st) < 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1319 #else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1320 if (vim_FullName(fname, ff_expand_buffer, MAXPATHL, TRUE) == FAIL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1321 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1322 return FAIL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1323 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1324
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1325 // check against list of already visited files
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1326 for (vp = *visited_list; vp != NULL; vp = vp->ffv_next)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1327 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1328 if (
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329 #ifdef UNIX
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1330 !url ? (vp->ffv_dev_valid && vp->ffv_dev == st.st_dev
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1331 && vp->ffv_ino == st.st_ino)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1332 :
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1333 #endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1334 fnamecmp(vp->ffv_fname, ff_expand_buffer) == 0
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1335 )
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1336 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1337 // are the wildcard parts equal
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1338 if (ff_wc_equal(vp->ffv_wc_path, wc_path) == TRUE)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1339 // already visited
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1340 return FAIL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1341 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1342 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1343
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1344 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1345 * New file/dir. Add it to the list of visited files/dirs.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1346 */
31877
9f28cca2410a patch 9.0.1271: using sizeof() and subtract array size is tricky
Bram Moolenaar <Bram@vim.org>
parents: 31798
diff changeset
1347 vp = alloc(
9f28cca2410a patch 9.0.1271: using sizeof() and subtract array size is tricky
Bram Moolenaar <Bram@vim.org>
parents: 31798
diff changeset
1348 offsetof(ff_visited_T, ffv_fname) + STRLEN(ff_expand_buffer) + 1);
31667
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1349 if (vp == NULL)
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1350 return OK;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1351
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1352 #ifdef UNIX
31667
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1353 if (!url)
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1354 {
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1355 vp->ffv_dev_valid = TRUE;
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1356 vp->ffv_ino = st.st_ino;
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1357 vp->ffv_dev = st.st_dev;
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1358 vp->ffv_fname[0] = NUL;
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1359 }
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1360 else
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1361 {
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1362 vp->ffv_dev_valid = FALSE;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1363 #endif
31667
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1364 STRCPY(vp->ffv_fname, ff_expand_buffer);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1365 #ifdef UNIX
31667
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1366 }
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1367 #endif
31667
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1368 if (wc_path != NULL)
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1369 vp->ffv_wc_path = vim_strsave(wc_path);
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1370 else
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1371 vp->ffv_wc_path = NULL;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1372
31667
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1373 vp->ffv_next = *visited_list;
b89cfd86e18e patch 9.0.1166: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 31651
diff changeset
1374 *visited_list = vp;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1375
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1376 return OK;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1377 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1378
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1379 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1380 * create stack element from given path pieces
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1381 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1382 static ff_stack_T *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1383 ff_create_stack_element(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1384 char_u *fix_part,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1385 char_u *wc_part,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1386 int level,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1387 int star_star_empty)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1388 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1389 ff_stack_T *new;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1390
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16782
diff changeset
1391 new = ALLOC_ONE(ff_stack_T);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1392 if (new == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1393 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1394
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1395 new->ffs_prev = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1396 new->ffs_filearray = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1397 new->ffs_filearray_size = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1398 new->ffs_filearray_cur = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1399 new->ffs_stage = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1400 new->ffs_level = level;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1401 new->ffs_star_star_empty = star_star_empty;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1402
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1403 // the following saves NULL pointer checks in vim_findfile
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1404 if (fix_part == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1405 fix_part = (char_u *)"";
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1406 new->ffs_fix_path = vim_strsave(fix_part);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1407
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1408 if (wc_part == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1409 wc_part = (char_u *)"";
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1410 new->ffs_wc_path = vim_strsave(wc_part);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1411
29863
62350f19d4ed patch 9.0.0270: some values of 'path' and 'tags' invalid in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 29853
diff changeset
1412 if (new->ffs_fix_path == NULL || new->ffs_wc_path == NULL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1413 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1414 ff_free_stack_element(new);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1415 new = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1416 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1417
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1418 return new;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1419 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1420
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1421 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1422 * Push a dir on the directory stack.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1423 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1424 static void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1425 ff_push(ff_search_ctx_T *search_ctx, ff_stack_T *stack_ptr)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1426 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1427 // check for NULL pointer, not to return an error to the user, but
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1428 // to prevent a crash
31651
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30598
diff changeset
1429 if (stack_ptr == NULL)
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30598
diff changeset
1430 return;
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30598
diff changeset
1431
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30598
diff changeset
1432 stack_ptr->ffs_prev = search_ctx->ffsc_stack_ptr;
e5ee2ffd826a patch 9.0.1158: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents: 30598
diff changeset
1433 search_ctx->ffsc_stack_ptr = stack_ptr;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1434 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1435
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1436 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1437 * Pop a dir from the directory stack.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1438 * Returns NULL if stack is empty.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1439 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1440 static ff_stack_T *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1441 ff_pop(ff_search_ctx_T *search_ctx)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1442 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1443 ff_stack_T *sptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1444
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1445 sptr = search_ctx->ffsc_stack_ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1446 if (search_ctx->ffsc_stack_ptr != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1447 search_ctx->ffsc_stack_ptr = search_ctx->ffsc_stack_ptr->ffs_prev;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1448
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1449 return sptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1450 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1451
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1452 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1453 * free the given stack element
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1454 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1455 static void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1456 ff_free_stack_element(ff_stack_T *stack_ptr)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1457 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1458 // vim_free handles possible NULL pointers
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1459 vim_free(stack_ptr->ffs_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1460 vim_free(stack_ptr->ffs_wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1461
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1462 if (stack_ptr->ffs_filearray != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1463 FreeWild(stack_ptr->ffs_filearray_size, stack_ptr->ffs_filearray);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1464
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1465 vim_free(stack_ptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1466 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1467
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1468 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1469 * Clear the search context, but NOT the visited list.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1470 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1471 static void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1472 ff_clear(ff_search_ctx_T *search_ctx)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1473 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1474 ff_stack_T *sptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1475
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1476 // clear up stack
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1477 while ((sptr = ff_pop(search_ctx)) != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1478 ff_free_stack_element(sptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1479
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1480 vim_free(search_ctx->ffsc_file_to_search);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1481 vim_free(search_ctx->ffsc_start_dir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1482 vim_free(search_ctx->ffsc_fix_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1483 vim_free(search_ctx->ffsc_wc_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1484
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1485 if (search_ctx->ffsc_stopdirs_v != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1486 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1487 int i = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1488
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1489 while (search_ctx->ffsc_stopdirs_v[i] != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1490 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1491 vim_free(search_ctx->ffsc_stopdirs_v[i]);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1492 i++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1493 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1494 vim_free(search_ctx->ffsc_stopdirs_v);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1495 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1496 search_ctx->ffsc_stopdirs_v = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1497
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1498 // reset everything
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1499 search_ctx->ffsc_file_to_search = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1500 search_ctx->ffsc_start_dir = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1501 search_ctx->ffsc_fix_path = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1502 search_ctx->ffsc_wc_path = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1503 search_ctx->ffsc_level = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1504 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1505
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1506 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1507 * check if the given path is in the stopdirs
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1508 * returns TRUE if yes else FALSE
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1509 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1510 static int
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1511 ff_path_in_stoplist(char_u *path, int path_len, char_u **stopdirs_v)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1512 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1513 int i = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1514
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1515 // eat up trailing path separators, except the first
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1516 while (path_len > 1 && vim_ispathsep(path[path_len - 1]))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1517 path_len--;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1518
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1519 // if no path consider it as match
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1520 if (path_len == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1521 return TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1522
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1523 for (i = 0; stopdirs_v[i] != NULL; i++)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1524 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1525 if ((int)STRLEN(stopdirs_v[i]) > path_len)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1526 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1527 // match for parent directory. So '/home' also matches
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1528 // '/home/rks'. Check for PATHSEP in stopdirs_v[i], else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1529 // '/home/r' would also match '/home/rks'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1530 if (fnamencmp(stopdirs_v[i], path, path_len) == 0
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1531 && vim_ispathsep(stopdirs_v[i][path_len]))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1532 return TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1533 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1534 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1535 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1536 if (fnamecmp(stopdirs_v[i], path) == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1537 return TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1538 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1539 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1540 return FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1541 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1542
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1543 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1544 * Find the file name "ptr[len]" in the path. Also finds directory names.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1545 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1546 * On the first call set the parameter 'first' to TRUE to initialize
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1547 * the search. For repeating calls to FALSE.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1548 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1549 * Repeating calls will return other files called 'ptr[len]' from the path.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1550 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1551 * Only on the first call 'ptr' and 'len' are used. For repeating calls they
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1552 * don't need valid values.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1553 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1554 * If nothing found on the first call the option FNAME_MESS will issue the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1555 * message:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1556 * 'Can't find file "<file>" in path'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1557 * On repeating calls:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1558 * 'No more file "<file>" found in path'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1559 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1560 * options:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1561 * FNAME_MESS give error message when not found
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1562 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1563 * Uses NameBuff[]!
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1564 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1565 * Returns an allocated string for the file name. NULL for error.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1566 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1567 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1568 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1569 find_file_in_path(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1570 char_u *ptr, // file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1571 int len, // length of file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1572 int options,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1573 int first, // use count'th matching file name
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1574 char_u *rel_fname, // file name searching relative to
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1575 char_u **file_to_find, // in/out: modified copy of file name
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1576 char **search_ctx) // in/out: state of the search
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1577 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1578 return find_file_in_path_option(ptr, len, options, first,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1579 *curbuf->b_p_path == NUL ? p_path : curbuf->b_p_path,
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1580 FINDFILE_BOTH, rel_fname, curbuf->b_p_sua,
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1581 file_to_find, search_ctx);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1582 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1583
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1584 # if defined(EXITFREE) || defined(PROTO)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1585 void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1586 free_findfile(void)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1587 {
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1588 VIM_CLEAR(ff_expand_buffer);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1589 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1590 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1591
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1592 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1593 * Find the directory name "ptr[len]" in the path.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1594 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1595 * options:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1596 * FNAME_MESS give error message when not found
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1597 * FNAME_UNESC unescape backslashes.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1598 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1599 * Uses NameBuff[]!
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1600 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1601 * Returns an allocated string for the file name. NULL for error.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1602 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1603 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1604 find_directory_in_path(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1605 char_u *ptr, // file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1606 int len, // length of file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1607 int options,
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1608 char_u *rel_fname, // file name searching relative to
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1609 char_u **file_to_find, // in/out: modified copy of file name
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1610 char **search_ctx) // in/out: state of the search
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1611 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1612 return find_file_in_path_option(ptr, len, options, TRUE, p_cdpath,
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1613 FINDFILE_DIR, rel_fname, (char_u *)"",
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1614 file_to_find, search_ctx);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1615 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1616
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1617 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1618 find_file_in_path_option(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1619 char_u *ptr, // file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1620 int len, // length of file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1621 int options,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1622 int first, // use count'th matching file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1623 char_u *path_option, // p_path or p_cdpath
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1624 int find_what, // FINDFILE_FILE, _DIR or _BOTH
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1625 char_u *rel_fname, // file name we are looking relative to.
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1626 char_u *suffixes, // list of suffixes, 'suffixesadd' option
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1627 char_u **file_to_find, // in/out: modified copy of file name
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1628 char **search_ctx_arg) // in/out: state of the search
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1629 {
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1630 ff_search_ctx_T **search_ctx = (ff_search_ctx_T **)search_ctx_arg;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1631 static char_u *dir;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1632 static int did_findfile_init = FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1633 char_u save_char;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1634 char_u *file_name = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1635 char_u *buf = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1636 int rel_to_curdir;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1637 # ifdef AMIGA
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1638 struct Process *proc = (struct Process *)FindTask(0L);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1639 APTR save_winptr = proc->pr_WindowPtr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1640
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1641 // Avoid a requester here for a volume that doesn't exist.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1642 proc->pr_WindowPtr = (APTR)-1L;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1643 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1644
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1645 if (first == TRUE)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1646 {
26163
97b7db88e094 patch 8.2.3613: :find test fails
Bram Moolenaar <Bram@vim.org>
parents: 26159
diff changeset
1647 if (len == 0)
97b7db88e094 patch 8.2.3613: :find test fails
Bram Moolenaar <Bram@vim.org>
parents: 26159
diff changeset
1648 return NULL;
97b7db88e094 patch 8.2.3613: :find test fails
Bram Moolenaar <Bram@vim.org>
parents: 26159
diff changeset
1649
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1650 // copy file name into NameBuff, expanding environment variables
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1651 save_char = ptr[len];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1652 ptr[len] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1653 expand_env_esc(ptr, NameBuff, MAXPATHL, FALSE, TRUE, NULL);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1654 ptr[len] = save_char;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1655
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1656 vim_free(*file_to_find);
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1657 *file_to_find = vim_strsave(NameBuff);
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1658 if (*file_to_find == NULL) // out of memory
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1659 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1660 file_name = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1661 goto theend;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1662 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1663 if (options & FNAME_UNESC)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1664 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1665 // Change all "\ " to " ".
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1666 for (ptr = *file_to_find; *ptr != NUL; ++ptr)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1667 if (ptr[0] == '\\' && ptr[1] == ' ')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1668 mch_memmove(ptr, ptr + 1, STRLEN(ptr));
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1669 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1670 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1671
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1672 rel_to_curdir = ((*file_to_find)[0] == '.'
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1673 && ((*file_to_find)[1] == NUL
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1674 || vim_ispathsep((*file_to_find)[1])
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1675 || ((*file_to_find)[1] == '.'
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1676 && ((*file_to_find)[2] == NUL
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1677 || vim_ispathsep((*file_to_find)[2])))));
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1678 if (vim_isAbsName(*file_to_find)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1679 // "..", "../path", "." and "./path": don't use the path_option
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1680 || rel_to_curdir
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1681 # if defined(MSWIN)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1682 // handle "\tmp" as absolute path
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1683 || vim_ispathsep((*file_to_find)[0])
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1684 // handle "c:name" as absolute path
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1685 || ((*file_to_find)[0] != NUL && (*file_to_find)[1] == ':')
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1686 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1687 # ifdef AMIGA
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1688 // handle ":tmp" as absolute path
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1689 || (*file_to_find)[0] == ':'
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1690 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1691 )
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1692 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1693 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1694 * Absolute path, no need to use "path_option".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1695 * If this is not a first call, return NULL. We already returned a
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1696 * filename on the first call.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1697 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1698 if (first == TRUE)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1699 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1700 int l;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1701 int run;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1702
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1703 if (path_with_url(*file_to_find))
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1704 {
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1705 file_name = vim_strsave(*file_to_find);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1706 goto theend;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1707 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1708
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1709 // When FNAME_REL flag given first use the directory of the file.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1710 // Otherwise or when this fails use the current directory.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1711 for (run = 1; run <= 2; ++run)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1712 {
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1713 l = (int)STRLEN(*file_to_find);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1714 if (run == 1
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1715 && rel_to_curdir
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1716 && (options & FNAME_REL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1717 && rel_fname != NULL
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1718 && STRLEN(rel_fname) + l < MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1719 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1720 STRCPY(NameBuff, rel_fname);
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1721 STRCPY(gettail(NameBuff), *file_to_find);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1722 l = (int)STRLEN(NameBuff);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1723 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1724 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1725 {
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1726 STRCPY(NameBuff, *file_to_find);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1727 run = 2;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1728 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1729
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1730 // When the file doesn't exist, try adding parts of
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1731 // 'suffixesadd'.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1732 buf = suffixes;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1733 for (;;)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1734 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1735 if (mch_getperm(NameBuff) >= 0
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1736 && (find_what == FINDFILE_BOTH
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1737 || ((find_what == FINDFILE_DIR)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1738 == mch_isdir(NameBuff))))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1739 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1740 file_name = vim_strsave(NameBuff);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1741 goto theend;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1742 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1743 if (*buf == NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1744 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1745 copy_option_part(&buf, NameBuff + l, MAXPATHL - l, ",");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1746 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1747 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1748 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1749 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1750 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1751 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1752 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1753 * Loop over all paths in the 'path' or 'cdpath' option.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1754 * When "first" is set, first setup to the start of the option.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1755 * Otherwise continue to find the next match.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1756 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1757 if (first == TRUE)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1758 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1759 // vim_findfile_free_visited can handle a possible NULL pointer
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1760 vim_findfile_free_visited(*search_ctx);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1761 dir = path_option;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1762 did_findfile_init = FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1763 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1764
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1765 for (;;)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1766 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1767 if (did_findfile_init)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1768 {
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1769 file_name = vim_findfile(*search_ctx);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1770 if (file_name != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1771 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1772
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1773 did_findfile_init = FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1774 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1775 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1776 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1777 char_u *r_ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1778
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1779 if (dir == NULL || *dir == NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1780 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1781 // We searched all paths of the option, now we can
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1782 // free the search context.
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1783 vim_findfile_cleanup(*search_ctx);
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1784 *search_ctx = NULL;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1785 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1786 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1787
16782
fc58fee685e2 patch 8.1.1393: unnecessary type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
1788 if ((buf = alloc(MAXPATHL)) == NULL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1789 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1790
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1791 // copy next path
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1792 buf[0] = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1793 copy_option_part(&dir, buf, MAXPATHL, " ,");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1794
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1795 // get the stopdir string
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1796 r_ptr = vim_findfile_stopdir(buf);
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1797 *search_ctx = vim_findfile_init(buf, *file_to_find,
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1798 r_ptr, 100, FALSE, find_what,
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1799 *search_ctx, FALSE, rel_fname);
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1800 if (*search_ctx != NULL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1801 did_findfile_init = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1802 vim_free(buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1803 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1804 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1805 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1806 if (file_name == NULL && (options & FNAME_MESS))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1807 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1808 if (first == TRUE)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1809 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1810 if (find_what == FINDFILE_DIR)
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1811 semsg(_(e_cant_find_directory_str_in_cdpath), *file_to_find);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1812 else
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1813 semsg(_(e_cant_find_file_str_in_path), *file_to_find);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1814 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1815 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1816 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1817 if (find_what == FINDFILE_DIR)
26909
aa65d1808bd0 patch 8.2.3983: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26771
diff changeset
1818 semsg(_(e_no_more_directory_str_found_in_cdpath),
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1819 *file_to_find);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1820 else
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
1821 semsg(_(e_no_more_file_str_found_in_path), *file_to_find);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1822 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1823 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1824
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1825 theend:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1826 # ifdef AMIGA
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1827 proc->pr_WindowPtr = save_winptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1828 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1829 return file_name;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1830 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1831
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1832 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1833 * Get the file name at the cursor.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1834 * If Visual mode is active, use the selected text if it's in one line.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1835 * Returns the name in allocated memory, NULL for failure.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1836 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1837 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1838 grab_file_name(long count, linenr_T *file_lnum)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1839 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1840 int options = FNAME_MESS|FNAME_EXP|FNAME_REL|FNAME_UNESC;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1841
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1842 if (VIsual_active)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1843 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1844 int len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1845 char_u *ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1846
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1847 if (get_visual_text(NULL, &ptr, &len) == FAIL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1848 return NULL;
22270
d37e4a856246 patch 8.2.1684: "gF" does not use line number after file in Visual mode
Bram Moolenaar <Bram@vim.org>
parents: 20996
diff changeset
1849 // Only recognize ":123" here
34074
1629cc65d78d patch 9.1.0006: is*() and to*() function may be unsafe
Christian Brabandt <cb@256bit.org>
parents: 33223
diff changeset
1850 if (file_lnum != NULL && ptr[len] == ':' && SAFE_isdigit(ptr[len + 1]))
22270
d37e4a856246 patch 8.2.1684: "gF" does not use line number after file in Visual mode
Bram Moolenaar <Bram@vim.org>
parents: 20996
diff changeset
1851 {
d37e4a856246 patch 8.2.1684: "gF" does not use line number after file in Visual mode
Bram Moolenaar <Bram@vim.org>
parents: 20996
diff changeset
1852 char_u *p = ptr + len + 1;
d37e4a856246 patch 8.2.1684: "gF" does not use line number after file in Visual mode
Bram Moolenaar <Bram@vim.org>
parents: 20996
diff changeset
1853
d37e4a856246 patch 8.2.1684: "gF" does not use line number after file in Visual mode
Bram Moolenaar <Bram@vim.org>
parents: 20996
diff changeset
1854 *file_lnum = getdigits(&p);
d37e4a856246 patch 8.2.1684: "gF" does not use line number after file in Visual mode
Bram Moolenaar <Bram@vim.org>
parents: 20996
diff changeset
1855 }
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1856 return find_file_name_in_path(ptr, len, options,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1857 count, curbuf->b_ffname);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1858 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1859 return file_name_at_cursor(options | FNAME_HYP, count, file_lnum);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1860 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1861
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1862 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1863 * Return the file name under or after the cursor.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1864 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1865 * The 'path' option is searched if the file name is not absolute.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1866 * The string returned has been alloc'ed and should be freed by the caller.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1867 * NULL is returned if the file name or file is not found.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1868 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1869 * options:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1870 * FNAME_MESS give error messages
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1871 * FNAME_EXP expand to path
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1872 * FNAME_HYP check for hypertext link
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1873 * FNAME_INCL apply "includeexpr"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1874 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1875 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1876 file_name_at_cursor(int options, long count, linenr_T *file_lnum)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1877 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1878 return file_name_in_line(ml_get_curline(),
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1879 curwin->w_cursor.col, options, count, curbuf->b_ffname,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1880 file_lnum);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1881 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1882
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1883 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1884 * Return the name of the file under or after ptr[col].
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1885 * Otherwise like file_name_at_cursor().
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1886 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1887 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1888 file_name_in_line(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1889 char_u *line,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1890 int col,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1891 int options,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1892 long count,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1893 char_u *rel_fname, // file we are searching relative to
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1894 linenr_T *file_lnum) // line number after the file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1895 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1896 char_u *ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1897 int len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1898 int in_type = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1899 int is_url = FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1900
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1901 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1902 * search forward for what could be the start of a file name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1903 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1904 ptr = line + col;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1905 while (*ptr != NUL && !vim_isfilec(*ptr))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1906 MB_PTR_ADV(ptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1907 if (*ptr == NUL) // nothing found
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1908 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1909 if (options & FNAME_MESS)
26913
d4e61d61afd9 patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26909
diff changeset
1910 emsg(_(e_no_file_name_under_cursor));
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1911 return NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1912 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1913
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1914 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1915 * Search backward for first char of the file name.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1916 * Go one char back to ":" before "//" even when ':' is not in 'isfname'.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1917 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1918 while (ptr > line)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1919 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1920 if (has_mbyte && (len = (*mb_head_off)(line, ptr - 1)) > 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1921 ptr -= len + 1;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1922 else if (vim_isfilec(ptr[-1])
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1923 || ((options & FNAME_HYP) && path_is_url(ptr - 1)))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1924 --ptr;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1925 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1926 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1927 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1928
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1929 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1930 * Search forward for the last char of the file name.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1931 * Also allow "://" when ':' is not in 'isfname'.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1932 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1933 len = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1934 while (vim_isfilec(ptr[len]) || (ptr[len] == '\\' && ptr[len + 1] == ' ')
30325
58fb880f3607 patch 9.0.0498: various small issues
Bram Moolenaar <Bram@vim.org>
parents: 29863
diff changeset
1935 || ((options & FNAME_HYP) && path_is_url(ptr + len))
58fb880f3607 patch 9.0.0498: various small issues
Bram Moolenaar <Bram@vim.org>
parents: 29863
diff changeset
1936 || (is_url && vim_strchr((char_u *)":?&=", ptr[len]) != NULL))
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1937 {
30325
58fb880f3607 patch 9.0.0498: various small issues
Bram Moolenaar <Bram@vim.org>
parents: 29863
diff changeset
1938 // After type:// we also include :, ?, & and = as valid characters, so
58fb880f3607 patch 9.0.0498: various small issues
Bram Moolenaar <Bram@vim.org>
parents: 29863
diff changeset
1939 // that http://google.com:8080?q=this&that=ok works.
58fb880f3607 patch 9.0.0498: various small issues
Bram Moolenaar <Bram@vim.org>
parents: 29863
diff changeset
1940 if ((ptr[len] >= 'A' && ptr[len] <= 'Z')
58fb880f3607 patch 9.0.0498: various small issues
Bram Moolenaar <Bram@vim.org>
parents: 29863
diff changeset
1941 || (ptr[len] >= 'a' && ptr[len] <= 'z'))
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1942 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1943 if (in_type && path_is_url(ptr + len + 1))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1944 is_url = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1945 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1946 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1947 in_type = FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1948
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1949 if (ptr[len] == '\\')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1950 // Skip over the "\" in "\ ".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1951 ++len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1952 if (has_mbyte)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1953 len += (*mb_ptr2len)(ptr + len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1954 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1955 ++len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1956 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1957
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1958 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1959 * If there is trailing punctuation, remove it.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1960 * But don't remove "..", could be a directory name.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1961 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1962 if (len > 2 && vim_strchr((char_u *)".,:;!", ptr[len - 1]) != NULL
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1963 && ptr[len - 2] != '.')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1964 --len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1965
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1966 if (file_lnum != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1967 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1968 char_u *p;
18939
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1969 char *line_english = " line ";
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1970 char *line_transl = _(line_msg);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1971
18939
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1972 // Get the number after the file name and a separator character.
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1973 // Also accept " line 999" with and without the same translation as
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1974 // used in last_set_msg().
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1975 p = ptr + len;
18939
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1976 if (STRNCMP(p, line_english, STRLEN(line_english)) == 0)
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1977 p += STRLEN(line_english);
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1978 else if (STRNCMP(p, line_transl, STRLEN(line_transl)) == 0)
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1979 p += STRLEN(line_transl);
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1980 else
25ebc35e104f patch 8.2.0030: "gF" does not work on output of "verbose command"
Bram Moolenaar <Bram@vim.org>
parents: 18779
diff changeset
1981 p = skipwhite(p);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1982 if (*p != NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1983 {
34074
1629cc65d78d patch 9.1.0006: is*() and to*() function may be unsafe
Christian Brabandt <cb@256bit.org>
parents: 33223
diff changeset
1984 if (!SAFE_isdigit(*p))
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1985 ++p; // skip the separator
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1986 p = skipwhite(p);
34074
1629cc65d78d patch 9.1.0006: is*() and to*() function may be unsafe
Christian Brabandt <cb@256bit.org>
parents: 33223
diff changeset
1987 if (SAFE_isdigit(*p))
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1988 *file_lnum = (int)getdigits(&p);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1989 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1990 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1991
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1992 return find_file_name_in_path(ptr, len, options, count, rel_fname);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1993 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1994
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1995 # if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1996 static char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1997 eval_includeexpr(char_u *ptr, int len)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1998 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1999 char_u *res;
27311
b3ef31c6a922 patch 8.2.4184: cannot use an import in 'includeexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27301
diff changeset
2000 sctx_T save_sctx = current_sctx;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2001
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2002 set_vim_var_string(VV_FNAME, ptr, len);
27311
b3ef31c6a922 patch 8.2.4184: cannot use an import in 'includeexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27301
diff changeset
2003 current_sctx = curbuf->b_p_script_ctx[BV_INEX];
b3ef31c6a922 patch 8.2.4184: cannot use an import in 'includeexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27301
diff changeset
2004
20996
3af71cbcfdbe patch 8.2.1049: Vim9: leaking memory when using continuation line
Bram Moolenaar <Bram@vim.org>
parents: 20867
diff changeset
2005 res = eval_to_string_safe(curbuf->b_p_inex,
30598
37aa9fd2ed72 patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
2006 was_set_insecurely((char_u *)"includeexpr", OPT_LOCAL),
37aa9fd2ed72 patch 9.0.0634: evaluating "expr" options has more overhead than needed
Bram Moolenaar <Bram@vim.org>
parents: 30325
diff changeset
2007 TRUE, TRUE);
27311
b3ef31c6a922 patch 8.2.4184: cannot use an import in 'includeexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27301
diff changeset
2008
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2009 set_vim_var_string(VV_FNAME, NULL, 0);
27311
b3ef31c6a922 patch 8.2.4184: cannot use an import in 'includeexpr'
Bram Moolenaar <Bram@vim.org>
parents: 27301
diff changeset
2010 current_sctx = save_sctx;
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2011 return res;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2012 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2013 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2014
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2015 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2016 * Return the name of the file ptr[len] in 'path'.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2017 * Otherwise like file_name_at_cursor().
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2018 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2019 char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2020 find_file_name_in_path(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2021 char_u *ptr,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2022 int len,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2023 int options,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2024 long count,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2025 char_u *rel_fname) // file we are searching relative to
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2026 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2027 char_u *file_name;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2028 int c;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2029 # if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2030 char_u *tofree = NULL;
26159
34606aec52b3 patch 8.2.3611: crash when using CTRL-W f without finding a file name
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2031 # endif
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2032
26159
34606aec52b3 patch 8.2.3611: crash when using CTRL-W f without finding a file name
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2033 if (len == 0)
34606aec52b3 patch 8.2.3611: crash when using CTRL-W f without finding a file name
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2034 return NULL;
34606aec52b3 patch 8.2.3611: crash when using CTRL-W f without finding a file name
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2035
34606aec52b3 patch 8.2.3611: crash when using CTRL-W f without finding a file name
Bram Moolenaar <Bram@vim.org>
parents: 25384
diff changeset
2036 # if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2037 if ((options & FNAME_INCL) && *curbuf->b_p_inex != NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2038 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2039 tofree = eval_includeexpr(ptr, len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2040 if (tofree != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2041 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2042 ptr = tofree;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2043 len = (int)STRLEN(ptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2044 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2045 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2046 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2047
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2048 if (options & FNAME_EXP)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2049 {
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2050 char_u *file_to_find = NULL;
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2051 char *search_ctx = NULL;
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2052
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2053 file_name = find_file_in_path(ptr, len, options & ~FNAME_MESS,
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2054 TRUE, rel_fname, &file_to_find, &search_ctx);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2055
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2056 # if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2057 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2058 * If the file could not be found in a normal way, try applying
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2059 * 'includeexpr' (unless done already).
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2060 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2061 if (file_name == NULL
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2062 && !(options & FNAME_INCL) && *curbuf->b_p_inex != NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2063 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2064 tofree = eval_includeexpr(ptr, len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2065 if (tofree != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2066 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2067 ptr = tofree;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2068 len = (int)STRLEN(ptr);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2069 file_name = find_file_in_path(ptr, len, options & ~FNAME_MESS,
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2070 TRUE, rel_fname, &file_to_find, &search_ctx);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2071 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2072 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2073 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2074 if (file_name == NULL && (options & FNAME_MESS))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2075 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2076 c = ptr[len];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2077 ptr[len] = NUL;
26913
d4e61d61afd9 patch 8.2.3985: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26909
diff changeset
2078 semsg(_(e_cant_find_file_str_in_path_2), ptr);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2079 ptr[len] = c;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2080 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2081
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2082 // Repeat finding the file "count" times. This matters when it
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2083 // appears several times in the path.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2084 while (file_name != NULL && --count > 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2085 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2086 vim_free(file_name);
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2087 file_name = find_file_in_path(ptr, len, options, FALSE, rel_fname,
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2088 &file_to_find, &search_ctx);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2089 }
32138
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2090
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2091 vim_free(file_to_find);
2c09e40ce3da patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents: 31877
diff changeset
2092 vim_findfile_cleanup(search_ctx);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2093 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2094 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2095 file_name = vim_strnsave(ptr, len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2096
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2097 # if defined(FEAT_FIND_ID) && defined(FEAT_EVAL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2098 vim_free(tofree);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2099 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2100
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2101 return file_name;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2102 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2103
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2104 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2105 * Return the end of the directory name, on the first path
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2106 * separator:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2107 * "/path/file", "/path/dir/", "/path//dir", "/file"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2108 * ^ ^ ^ ^
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2109 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2110 static char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2111 gettail_dir(char_u *fname)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2112 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2113 char_u *dir_end = fname;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2114 char_u *next_dir_end = fname;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2115 int look_for_sep = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2116 char_u *p;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2117
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2118 for (p = fname; *p != NUL; )
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2119 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2120 if (vim_ispathsep(*p))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2121 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2122 if (look_for_sep)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2123 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2124 next_dir_end = p;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2125 look_for_sep = FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2126 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2127 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2128 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2129 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2130 if (!look_for_sep)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2131 dir_end = next_dir_end;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2132 look_for_sep = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2133 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2134 MB_PTR_ADV(p);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2135 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2136 return dir_end;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2137 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2138
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2139 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2140 * return TRUE if 'c' is a path list separator.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2141 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2142 int
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2143 vim_ispathlistsep(int c)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2144 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2145 # ifdef UNIX
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2146 return (c == ':');
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2147 # else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2148 return (c == ';'); // might not be right for every system...
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2149 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2150 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2151
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2152 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2153 * Moves "*psep" back to the previous path separator in "path".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2154 * Returns FAIL is "*psep" ends up at the beginning of "path".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2155 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2156 static int
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2157 find_previous_pathsep(char_u *path, char_u **psep)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2158 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2159 // skip the current separator
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2160 if (*psep > path && vim_ispathsep(**psep))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2161 --*psep;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2162
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2163 // find the previous separator
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2164 while (*psep > path)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2165 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2166 if (vim_ispathsep(**psep))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2167 return OK;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2168 MB_PTR_BACK(path, *psep);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2169 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2170
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2171 return FAIL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2172 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2173
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2174 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2175 * Returns TRUE if "maybe_unique" is unique wrt other_paths in "gap".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2176 * "maybe_unique" is the end portion of "((char_u **)gap->ga_data)[i]".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2177 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2178 static int
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2179 is_unique(char_u *maybe_unique, garray_T *gap, int i)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2180 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2181 int j;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2182 int candidate_len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2183 int other_path_len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2184 char_u **other_paths = (char_u **)gap->ga_data;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2185 char_u *rival;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2186
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2187 for (j = 0; j < gap->ga_len; j++)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2188 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2189 if (j == i)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2190 continue; // don't compare it with itself
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2191
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2192 candidate_len = (int)STRLEN(maybe_unique);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2193 other_path_len = (int)STRLEN(other_paths[j]);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2194 if (other_path_len < candidate_len)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2195 continue; // it's different when it's shorter
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2196
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2197 rival = other_paths[j] + other_path_len - candidate_len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2198 if (fnamecmp(maybe_unique, rival) == 0
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2199 && (rival == other_paths[j] || vim_ispathsep(*(rival - 1))))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2200 return FALSE; // match
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2201 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2202
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2203 return TRUE; // no match found
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2204 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2205
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2206 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2207 * Split the 'path' option into an array of strings in garray_T. Relative
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2208 * paths are expanded to their equivalent fullpath. This includes the "."
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2209 * (relative to current buffer directory) and empty path (relative to current
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2210 * directory) notations.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2211 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2212 * TODO: handle upward search (;) and path limiter (**N) notations by
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2213 * expanding each into their equivalent path(s).
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2214 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2215 static void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2216 expand_path_option(char_u *curdir, garray_T *gap)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2217 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2218 char_u *path_option = *curbuf->b_p_path == NUL
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2219 ? p_path : curbuf->b_p_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2220 char_u *buf;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2221 char_u *p;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2222 int len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2223
16782
fc58fee685e2 patch 8.1.1393: unnecessary type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
2224 if ((buf = alloc(MAXPATHL)) == NULL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2225 return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2226
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2227 while (*path_option != NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2228 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2229 copy_option_part(&path_option, buf, MAXPATHL, " ,");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2230
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2231 if (buf[0] == '.' && (buf[1] == NUL || vim_ispathsep(buf[1])))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2232 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2233 // Relative to current buffer:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2234 // "/path/file" + "." -> "/path/"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2235 // "/path/file" + "./subdir" -> "/path/subdir"
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2236 if (curbuf->b_ffname == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2237 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2238 p = gettail(curbuf->b_ffname);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2239 len = (int)(p - curbuf->b_ffname);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2240 if (len + (int)STRLEN(buf) >= MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2241 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2242 if (buf[1] == NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2243 buf[len] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2244 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2245 STRMOVE(buf + len, buf + 2);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2246 mch_memmove(buf, curbuf->b_ffname, len);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2247 simplify_filename(buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2248 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2249 else if (buf[0] == NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2250 // relative to current directory
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2251 STRCPY(buf, curdir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2252 else if (path_with_url(buf))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2253 // URL can't be used here
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2254 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2255 else if (!mch_isFullName(buf))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2256 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2257 // Expand relative path to their full path equivalent
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2258 len = (int)STRLEN(curdir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2259 if (len + (int)STRLEN(buf) + 3 > MAXPATHL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2260 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2261 STRMOVE(buf + len + 1, buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2262 STRCPY(buf, curdir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2263 buf[len] = PATHSEP;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2264 simplify_filename(buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2265 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2266
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2267 if (ga_grow(gap, 1) == FAIL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2268 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2269
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2270 # if defined(MSWIN)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2271 // Avoid the path ending in a backslash, it fails when a comma is
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2272 // appended.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2273 len = (int)STRLEN(buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2274 if (buf[len - 1] == '\\')
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2275 buf[len - 1] = '/';
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2276 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2277
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2278 p = vim_strsave(buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2279 if (p == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2280 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2281 ((char_u **)gap->ga_data)[gap->ga_len++] = p;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2282 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2283
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2284 vim_free(buf);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2285 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2286
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2287 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2288 * Returns a pointer to the file or directory name in "fname" that matches the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2289 * longest path in "ga"p, or NULL if there is no match. For example:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2290 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2291 * path: /foo/bar/baz
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2292 * fname: /foo/bar/baz/quux.txt
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2293 * returns: ^this
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2294 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2295 static char_u *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2296 get_path_cutoff(char_u *fname, garray_T *gap)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2297 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2298 int i;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2299 int maxlen = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2300 char_u **path_part = (char_u **)gap->ga_data;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2301 char_u *cutoff = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2302
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2303 for (i = 0; i < gap->ga_len; i++)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2304 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2305 int j = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2306
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2307 while ((fname[j] == path_part[i][j]
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2308 # if defined(MSWIN)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2309 || (vim_ispathsep(fname[j]) && vim_ispathsep(path_part[i][j]))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2310 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2311 ) && fname[j] != NUL && path_part[i][j] != NUL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2312 j++;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2313 if (j > maxlen)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2314 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2315 maxlen = j;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2316 cutoff = &fname[j];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2317 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2318 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2319
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2320 // skip to the file or directory name
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2321 if (cutoff != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2322 while (vim_ispathsep(*cutoff))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2323 MB_PTR_ADV(cutoff);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2324
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2325 return cutoff;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2326 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2327
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2328 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2329 * Sorts, removes duplicates and modifies all the fullpath names in "gap" so
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2330 * that they are unique with respect to each other while conserving the part
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2331 * that matches the pattern. Beware, this is at least O(n^2) wrt "gap->ga_len".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2332 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2333 void
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2334 uniquefy_paths(garray_T *gap, char_u *pattern)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2335 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2336 int i;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2337 int len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2338 char_u **fnames = (char_u **)gap->ga_data;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2339 int sort_again = FALSE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2340 char_u *pat;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2341 char_u *file_pattern;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2342 char_u *curdir;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2343 regmatch_T regmatch;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2344 garray_T path_ga;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2345 char_u **in_curdir = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2346 char_u *short_name;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2347
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2348 remove_duplicates(gap);
27028
c9474ae175f4 patch 8.2.4043: using int for second argument of ga_init2()
Bram Moolenaar <Bram@vim.org>
parents: 26962
diff changeset
2349 ga_init2(&path_ga, sizeof(char_u *), 1);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2350
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2351 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2352 * We need to prepend a '*' at the beginning of file_pattern so that the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2353 * regex matches anywhere in the path. FIXME: is this valid for all
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2354 * possible patterns?
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2355 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2356 len = (int)STRLEN(pattern);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2357 file_pattern = alloc(len + 2);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2358 if (file_pattern == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2359 return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2360 file_pattern[0] = '*';
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2361 file_pattern[1] = NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2362 STRCAT(file_pattern, pattern);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2363 pat = file_pat_to_reg_pat(file_pattern, NULL, NULL, TRUE);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2364 vim_free(file_pattern);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2365 if (pat == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2366 return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2367
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2368 regmatch.rm_ic = TRUE; // always ignore case
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2369 regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2370 vim_free(pat);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2371 if (regmatch.regprog == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2372 return;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2373
16782
fc58fee685e2 patch 8.1.1393: unnecessary type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
2374 if ((curdir = alloc(MAXPATHL)) == NULL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2375 goto theend;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2376 mch_dirname(curdir, MAXPATHL);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2377 expand_path_option(curdir, &path_ga);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2378
16825
ce04ebdf26b8 patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents: 16782
diff changeset
2379 in_curdir = ALLOC_CLEAR_MULT(char_u *, gap->ga_len);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2380 if (in_curdir == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2381 goto theend;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2382
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2383 for (i = 0; i < gap->ga_len && !got_int; i++)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2384 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2385 char_u *path = fnames[i];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2386 int is_in_curdir;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2387 char_u *dir_end = gettail_dir(path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2388 char_u *pathsep_p;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2389 char_u *path_cutoff;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2390
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2391 len = (int)STRLEN(path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2392 is_in_curdir = fnamencmp(curdir, path, dir_end - path) == 0
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2393 && curdir[dir_end - path] == NUL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2394 if (is_in_curdir)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2395 in_curdir[i] = vim_strsave(path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2396
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2397 // Shorten the filename while maintaining its uniqueness
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2398 path_cutoff = get_path_cutoff(path, &path_ga);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2399
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2400 // Don't assume all files can be reached without path when search
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2401 // pattern starts with star star slash, so only remove path_cutoff
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2402 // when possible.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2403 if (pattern[0] == '*' && pattern[1] == '*'
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2404 && vim_ispathsep_nocolon(pattern[2])
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2405 && path_cutoff != NULL
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2406 && vim_regexec(&regmatch, path_cutoff, (colnr_T)0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2407 && is_unique(path_cutoff, gap, i))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2408 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2409 sort_again = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2410 mch_memmove(path, path_cutoff, STRLEN(path_cutoff) + 1);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2411 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2412 else
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2413 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2414 // Here all files can be reached without path, so get shortest
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2415 // unique path. We start at the end of the path.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2416 pathsep_p = path + len - 1;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2417
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2418 while (find_previous_pathsep(path, &pathsep_p))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2419 if (vim_regexec(&regmatch, pathsep_p + 1, (colnr_T)0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2420 && is_unique(pathsep_p + 1, gap, i)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2421 && path_cutoff != NULL && pathsep_p + 1 >= path_cutoff)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2422 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2423 sort_again = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2424 mch_memmove(path, pathsep_p + 1, STRLEN(pathsep_p));
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2425 break;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2426 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2427 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2428
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2429 if (mch_isFullName(path))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2430 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2431 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2432 * Last resort: shorten relative to curdir if possible.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2433 * 'possible' means:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2434 * 1. It is under the current directory.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2435 * 2. The result is actually shorter than the original.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2436 *
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2437 * Before curdir After
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2438 * /foo/bar/file.txt /foo/bar ./file.txt
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2439 * c:\foo\bar\file.txt c:\foo\bar .\file.txt
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2440 * /file.txt / /file.txt
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2441 * c:\file.txt c:\ .\file.txt
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2442 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2443 short_name = shorten_fname(path, curdir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2444 if (short_name != NULL && short_name > path + 1
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2445 # if defined(MSWIN)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2446 // On windows,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2447 // shorten_fname("c:\a\a.txt", "c:\a\b")
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2448 // returns "\a\a.txt", which is not really the short
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2449 // name, hence:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2450 && !vim_ispathsep(*short_name)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2451 # endif
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2452 )
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2453 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2454 STRCPY(path, ".");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2455 add_pathsep(path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2456 STRMOVE(path + STRLEN(path), short_name);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2457 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2458 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2459 ui_breakcheck();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2460 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2461
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2462 // Shorten filenames in /in/current/directory/{filename}
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2463 for (i = 0; i < gap->ga_len && !got_int; i++)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2464 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2465 char_u *rel_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2466 char_u *path = in_curdir[i];
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2467
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2468 if (path == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2469 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2470
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2471 // If the {filename} is not unique, change it to ./{filename}.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2472 // Else reduce it to {filename}
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2473 short_name = shorten_fname(path, curdir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2474 if (short_name == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2475 short_name = path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2476 if (is_unique(short_name, gap, i))
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2477 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2478 STRCPY(fnames[i], short_name);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2479 continue;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2480 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2481
16782
fc58fee685e2 patch 8.1.1393: unnecessary type casts
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
2482 rel_path = alloc(STRLEN(short_name) + STRLEN(PATHSEPSTR) + 2);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2483 if (rel_path == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2484 goto theend;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2485 STRCPY(rel_path, ".");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2486 add_pathsep(rel_path);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2487 STRCAT(rel_path, short_name);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2488
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2489 vim_free(fnames[i]);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2490 fnames[i] = rel_path;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2491 sort_again = TRUE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2492 ui_breakcheck();
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2493 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2494
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2495 theend:
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2496 vim_free(curdir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2497 if (in_curdir != NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2498 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2499 for (i = 0; i < gap->ga_len; i++)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2500 vim_free(in_curdir[i]);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2501 vim_free(in_curdir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2502 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2503 ga_clear_strings(&path_ga);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2504 vim_regfree(regmatch.regprog);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2505
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2506 if (sort_again)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2507 remove_duplicates(gap);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2508 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2509
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2510 /*
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2511 * Calls globpath() with 'path' values for the given pattern and stores the
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2512 * result in "gap".
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2513 * Returns the total number of matches.
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2514 */
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2515 int
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2516 expand_in_path(
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2517 garray_T *gap,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2518 char_u *pattern,
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2519 int flags) // EW_* flags
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2520 {
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2521 char_u *curdir;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2522 garray_T path_ga;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2523 char_u *paths = NULL;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2524 int glob_flags = 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2525
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16188
diff changeset
2526 if ((curdir = alloc(MAXPATHL)) == NULL)
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2527 return 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2528 mch_dirname(curdir, MAXPATHL);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2529
27028
c9474ae175f4 patch 8.2.4043: using int for second argument of ga_init2()
Bram Moolenaar <Bram@vim.org>
parents: 26962
diff changeset
2530 ga_init2(&path_ga, sizeof(char_u *), 1);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2531 expand_path_option(curdir, &path_ga);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2532 vim_free(curdir);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2533 if (path_ga.ga_len == 0)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2534 return 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2535
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2536 paths = ga_concat_strings(&path_ga, ",");
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2537 ga_clear_strings(&path_ga);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2538 if (paths == NULL)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2539 return 0;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2540
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2541 if (flags & EW_ICASE)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2542 glob_flags |= WILD_ICASE;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2543 if (flags & EW_ADDSLASH)
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2544 glob_flags |= WILD_ADD_SLASH;
31798
5948cc887603 patch 9.0.1231: completion of :runtime does not handle {where} argument
Bram Moolenaar <Bram@vim.org>
parents: 31667
diff changeset
2545 globpath(paths, pattern, gap, glob_flags, FALSE);
15814
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2546 vim_free(paths);
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2547
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2548 return gap->ga_len;
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2549 }
99ebf78686a9 patch 8.1.0914: code related to findfile() is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2550
16188
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2551
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2552 /*
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2553 * Converts a file name into a canonical form. It simplifies a file name into
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2554 * its simplest form by stripping out unneeded components, if any. The
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2555 * resulting file name is simplified in place and will either be the same
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2556 * length as that supplied, or shorter.
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2557 */
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2558 void
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2559 simplify_filename(char_u *filename)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2560 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2561 #ifndef AMIGA // Amiga doesn't have "..", it uses "/"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2562 int components = 0;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2563 char_u *p, *tail, *start;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2564 int stripping_disabled = FALSE;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2565 int relative = TRUE;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2566
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2567 p = filename;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2568 # ifdef BACKSLASH_IN_FILENAME
26589
22896e358a90 patch 8.2.3824: no ASAN support for MSVC
Bram Moolenaar <Bram@vim.org>
parents: 26163
diff changeset
2569 if (p[0] != NUL && p[1] == ':') // skip "x:"
16188
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2570 p += 2;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2571 # endif
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2572
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2573 if (vim_ispathsep(*p))
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2574 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2575 relative = FALSE;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2576 do
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2577 ++p;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2578 while (vim_ispathsep(*p));
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2579 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2580 start = p; // remember start after "c:/" or "/" or "///"
20867
9c24319b4cb2 patch 8.2.0985: simplify() does not remove slashes from "///path"
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
2581 #ifdef UNIX
9c24319b4cb2 patch 8.2.0985: simplify() does not remove slashes from "///path"
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
2582 // Posix says that "//path" is unchanged but "///path" is "/path".
9c24319b4cb2 patch 8.2.0985: simplify() does not remove slashes from "///path"
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
2583 if (start > filename + 2)
9c24319b4cb2 patch 8.2.0985: simplify() does not remove slashes from "///path"
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
2584 {
9c24319b4cb2 patch 8.2.0985: simplify() does not remove slashes from "///path"
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
2585 STRMOVE(filename + 1, p);
9c24319b4cb2 patch 8.2.0985: simplify() does not remove slashes from "///path"
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
2586 start = p = filename + 1;
9c24319b4cb2 patch 8.2.0985: simplify() does not remove slashes from "///path"
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
2587 }
9c24319b4cb2 patch 8.2.0985: simplify() does not remove slashes from "///path"
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
2588 #endif
16188
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2589
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2590 do
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2591 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2592 // At this point "p" is pointing to the char following a single "/"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2593 // or "p" is at the "start" of the (absolute or relative) path name.
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2594 # ifdef VMS
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2595 // VMS allows device:[path] - don't strip the [ in directory
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2596 if ((*p == '[' || *p == '<') && p > filename && p[-1] == ':')
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2597 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2598 // :[ or :< composition: vms directory component
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2599 ++components;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2600 p = getnextcomp(p + 1);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2601 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2602 // allow remote calls as host"user passwd"::device:[path]
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2603 else if (p[0] == ':' && p[1] == ':' && p > filename && p[-1] == '"' )
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2604 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2605 // ":: composition: vms host/passwd component
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2606 ++components;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2607 p = getnextcomp(p + 2);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2608 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2609 else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2610 # endif
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2611 if (vim_ispathsep(*p))
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2612 STRMOVE(p, p + 1); // remove duplicate "/"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2613 else if (p[0] == '.' && (vim_ispathsep(p[1]) || p[1] == NUL))
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2614 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2615 if (p == start && relative)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2616 p += 1 + (p[1] != NUL); // keep single "." or leading "./"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2617 else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2618 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2619 // Strip "./" or ".///". If we are at the end of the file name
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2620 // and there is no trailing path separator, either strip "/." if
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2621 // we are after "start", or strip "." if we are at the beginning
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2622 // of an absolute path name .
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2623 tail = p + 1;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2624 if (p[1] != NUL)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2625 while (vim_ispathsep(*tail))
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2626 MB_PTR_ADV(tail);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2627 else if (p > start)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2628 --p; // strip preceding path separator
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2629 STRMOVE(p, tail);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2630 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2631 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2632 else if (p[0] == '.' && p[1] == '.' &&
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2633 (vim_ispathsep(p[2]) || p[2] == NUL))
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2634 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2635 // Skip to after ".." or "../" or "..///".
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2636 tail = p + 2;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2637 while (vim_ispathsep(*tail))
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2638 MB_PTR_ADV(tail);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2639
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2640 if (components > 0) // strip one preceding component
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2641 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2642 int do_strip = FALSE;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2643 char_u saved_char;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2644 stat_T st;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2645
18779
8f05b3cf8557 patch 8.1.2379: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2646 // Don't strip for an erroneous file name.
16188
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2647 if (!stripping_disabled)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2648 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2649 // If the preceding component does not exist in the file
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2650 // system, we strip it. On Unix, we don't accept a symbolic
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2651 // link that refers to a non-existent file.
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2652 saved_char = p[-1];
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2653 p[-1] = NUL;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2654 # ifdef UNIX
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2655 if (mch_lstat((char *)filename, &st) < 0)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2656 # else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2657 if (mch_stat((char *)filename, &st) < 0)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2658 # endif
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2659 do_strip = TRUE;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2660 p[-1] = saved_char;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2661
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2662 --p;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2663 // Skip back to after previous '/'.
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2664 while (p > start && !after_pathsep(start, p))
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2665 MB_PTR_BACK(start, p);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2666
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2667 if (!do_strip)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2668 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2669 // If the component exists in the file system, check
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2670 // that stripping it won't change the meaning of the
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2671 // file name. First get information about the
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2672 // unstripped file name. This may fail if the component
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2673 // to strip is not a searchable directory (but a regular
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2674 // file, for instance), since the trailing "/.." cannot
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2675 // be applied then. We don't strip it then since we
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2676 // don't want to replace an erroneous file name by
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2677 // a valid one, and we disable stripping of later
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2678 // components.
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2679 saved_char = *tail;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2680 *tail = NUL;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2681 if (mch_stat((char *)filename, &st) >= 0)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2682 do_strip = TRUE;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2683 else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2684 stripping_disabled = TRUE;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2685 *tail = saved_char;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2686 # ifdef UNIX
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2687 if (do_strip)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2688 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2689 stat_T new_st;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2690
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2691 // On Unix, the check for the unstripped file name
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2692 // above works also for a symbolic link pointing to
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2693 // a searchable directory. But then the parent of
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2694 // the directory pointed to by the link must be the
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2695 // same as the stripped file name. (The latter
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2696 // exists in the file system since it is the
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2697 // component's parent directory.)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2698 if (p == start && relative)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2699 (void)mch_stat(".", &new_st);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2700 else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2701 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2702 saved_char = *p;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2703 *p = NUL;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2704 (void)mch_stat((char *)filename, &new_st);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2705 *p = saved_char;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2706 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2707
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2708 if (new_st.st_ino != st.st_ino ||
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2709 new_st.st_dev != st.st_dev)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2710 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2711 do_strip = FALSE;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2712 // We don't disable stripping of later
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2713 // components since the unstripped path name is
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2714 // still valid.
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2715 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2716 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2717 # endif
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2718 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2719 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2720
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2721 if (!do_strip)
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2722 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2723 // Skip the ".." or "../" and reset the counter for the
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2724 // components that might be stripped later on.
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2725 p = tail;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2726 components = 0;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2727 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2728 else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2729 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2730 // Strip previous component. If the result would get empty
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2731 // and there is no trailing path separator, leave a single
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2732 // "." instead. If we are at the end of the file name and
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2733 // there is no trailing path separator and a preceding
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2734 // component is left after stripping, strip its trailing
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2735 // path separator as well.
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2736 if (p == start && relative && tail[-1] == '.')
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2737 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2738 *p++ = '.';
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2739 *p = NUL;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2740 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2741 else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2742 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2743 if (p > start && tail[-1] == '.')
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2744 --p;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2745 STRMOVE(p, tail); // strip previous component
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2746 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2747
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2748 --components;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2749 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2750 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2751 else if (p == start && !relative) // leading "/.." or "/../"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2752 STRMOVE(p, tail); // strip ".." or "../"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2753 else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2754 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2755 if (p == start + 2 && p[-2] == '.') // leading "./../"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2756 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2757 STRMOVE(p - 2, p); // strip leading "./"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2758 tail -= 2;
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2759 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2760 p = tail; // skip to char after ".." or "../"
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2761 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2762 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2763 else
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2764 {
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2765 ++components; // simple path component
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2766 p = getnextcomp(p);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2767 }
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2768 } while (*p != NUL);
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2769 #endif // !AMIGA
848d4c6e391e patch 8.1.1099: the do_tag() function is too long
Bram Moolenaar <Bram@vim.org>
parents: 15993
diff changeset
2770 }
17966
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2771
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2772 #if defined(FEAT_EVAL) || defined(PROTO)
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2773 /*
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2774 * "simplify()" function
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2775 */
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2776 void
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2777 f_simplify(typval_T *argvars, typval_T *rettv)
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2778 {
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2779 char_u *p;
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2780
25384
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 25364
diff changeset
2781 if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL)
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 25364
diff changeset
2782 return;
e8e2c4d33b9b patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents: 25364
diff changeset
2783
24822
5f8dd7b3ae41 patch 8.2.2949: tests failing because no error for float to string conversion
Bram Moolenaar <Bram@vim.org>
parents: 22270
diff changeset
2784 p = tv_get_string_strict(&argvars[0]);
17966
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2785 rettv->vval.v_string = vim_strsave(p);
18779
8f05b3cf8557 patch 8.1.2379: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18251
diff changeset
2786 simplify_filename(rettv->vval.v_string); // simplify in place
17966
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2787 rettv->v_type = VAR_STRING;
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2788 }
46f95606b9ec patch 8.1.1979: code for handling file names is spread out
Bram Moolenaar <Bram@vim.org>
parents: 17789
diff changeset
2789 #endif // FEAT_EVAL