annotate src/fileio.c @ 11757:74abb6c84984 v8.0.0761

patch 8.0.0761: options not set properly for a terminal buffer commit https://github.com/vim/vim/commit/1f2903c43109b16594d141a730659317b15f388d Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jul 23 19:51:01 2017 +0200 patch 8.0.0761: options not set properly for a terminal buffer Problem: Options of a buffer for a terminal window are not set properly. Solution: Add "terminal" value for 'buftype'. Make 'buftype' and 'bufhidden' not depend on the quickfix feature. Also set the buffer name and show "running" or "finished" in the window title.
author Christian Brabandt <cb@256bit.org>
date Sun, 23 Jul 2017 20:00:05 +0200
parents dbce7e03bf55
children 407a475c67fd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10042
4aead6a9b7a9 commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents: 9911
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 * fileio.c: read from and write to a file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
12 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
13
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
14 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
15
2014
79b395ba0ea5 updated for version 7.2-311
vimboss
parents: 2006
diff changeset
16 #if defined(__TANDEM) || defined(__MINT__)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17 # include <limits.h> /* for SSIZE_MAX */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
19
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 #if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21 # include <utime.h> /* for struct utimbuf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
24 #define BUFSIZE 8192 /* size of normal write buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 #define SMBUFSIZE 256 /* size of emergency write buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27 /* Is there any system that doesn't have access()? */
574
25a70b1cd2da updated for version 7.0163
vimboss
parents: 570
diff changeset
28 #define USE_MCH_ACCESS
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 #ifdef FEAT_MBYTE
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
31 static char_u *next_fenc(char_u **pp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 # ifdef FEAT_EVAL
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
33 static char_u *readfile_charconvert(char_u *fname, char_u *fenc, int *fdp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
36 #ifdef FEAT_VIMINFO
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
37 static void check_marks_read(void);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
38 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 #ifdef FEAT_CRYPT
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
40 static char_u *check_for_cryptkey(char_u *cryptkey, char_u *ptr, long *sizep, off_T *filesizep, int newfile, char_u *fname, int *did_ask);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
41 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
42 #ifdef UNIX
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
43 static void set_file_time(char_u *fname, time_t atime, time_t mtime);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
44 #endif
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
45 static int set_rw_fname(char_u *fname, char_u *sfname);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
46 static int msg_add_fileformat(int eol_type);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
47 static void msg_add_eol(void);
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
48 static int check_mtime(buf_T *buf, stat_T *s);
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
49 static int time_differs(long t1, long t2);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
50 #ifdef FEAT_AUTOCMD
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
51 static int apply_autocmds_exarg(event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
52 static int au_find_group(char_u *name);
676
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
53
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
54 # define AUGROUP_DEFAULT -1 /* default autocmd group */
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
55 # define AUGROUP_ERROR -2 /* erroneous autocmd group */
676
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
56 # define AUGROUP_ALL -3 /* all autocmd groups */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 #if defined(FEAT_CRYPT) || defined(FEAT_MBYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 # define HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 # define FIO_LATIN1 0x01 /* convert Latin1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 # define FIO_UTF8 0x02 /* convert UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 # define FIO_UCS2 0x04 /* convert UCS-2 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 # define FIO_UCS4 0x08 /* convert UCS-4 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 # define FIO_UTF16 0x10 /* convert UTF-16 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
66 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
67 # define FIO_CODEPAGE 0x20 /* convert MS-Windows codepage */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
68 # define FIO_PUT_CP(x) (((x) & 0xffff) << 16) /* put codepage in top word */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 # define FIO_GET_CP(x) (((x)>>16) & 0xffff) /* get codepage from top word */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
72 # define FIO_MACROMAN 0x20 /* convert MacRoman */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 # define FIO_ENDIAN_L 0x80 /* little endian */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 # define FIO_ENCRYPTED 0x1000 /* encrypt written bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 # define FIO_NOCONVERT 0x2000 /* skip encoding conversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 # define FIO_UCSBOM 0x4000 /* check for BOM at start of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
78 # define FIO_ALL -1 /* allow all formats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
79 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
80
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
81 /* When converting, a read() or write() may leave some bytes to be converted
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
82 * for the next call. The value is guessed... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
83 #define CONV_RESTLEN 30
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85 /* We have to guess how much a sequence of bytes may expand when converting
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 * with iconv() to be able to allocate a buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 #define ICONV_MULT 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 * Structure to pass arguments from buf_write() to buf_write_bytes().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 struct bw_info
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 int bw_fd; /* file descriptor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 char_u *bw_buf; /* buffer with data to be written */
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
96 int bw_len; /* length of data */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 int bw_flags; /* FIO_ flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 #endif
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
100 #ifdef FEAT_CRYPT
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
101 buf_T *bw_buffer; /* buffer being written */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
102 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 char_u bw_rest[CONV_RESTLEN]; /* not converted bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 int bw_restlen; /* nr of bytes in bw_rest[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 int bw_first; /* first write call */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107 char_u *bw_conv_buf; /* buffer for writing converted chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 int bw_conv_buflen; /* size of bw_conv_buf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 int bw_conv_error; /* set for conversion error */
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
110 linenr_T bw_conv_error_lnum; /* first line with error or zero */
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
111 linenr_T bw_start_lnum; /* line number at start of buffer */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 iconv_t bw_iconv_fd; /* descriptor for iconv() or -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
118 static int buf_write_bytes(struct bw_info *ip);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 #ifdef FEAT_MBYTE
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
121 static linenr_T readfile_linenr(linenr_T linecnt, char_u *p, char_u *endp);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
122 static int ucs2bytes(unsigned c, char_u **pp, int flags);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
123 static int need_conversion(char_u *fenc);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
124 static int get_fio_flags(char_u *ptr);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
125 static char_u *check_for_bom(char_u *p, long size, int *lenp, int flags);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
126 static int make_bom(char_u *buf, char_u *name);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 # ifdef WIN3264
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
128 static int get_win_fio_flags(char_u *ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 # ifdef MACOS_X
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
131 static int get_mac_fio_flags(char_u *ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 #endif
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
134 static int move_lines(buf_T *frombuf, buf_T *tobuf);
2006
78e032bb3260 updated for version 7.2-303
vimboss
parents: 2003
diff changeset
135 #ifdef TEMPDIRNAMES
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
136 static void vim_settempdir(char_u *tempdir);
2006
78e032bb3260 updated for version 7.2-303
vimboss
parents: 2003
diff changeset
137 #endif
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
138 #ifdef FEAT_AUTOCMD
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
139 static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
140 #endif
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
141
8937
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
142 #ifdef FEAT_AUTOCMD
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
143 /*
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
144 * Set by the apply_autocmds_group function if the given event is equal to
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
145 * EVENT_FILETYPE. Used by the readfile function in order to determine if
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
146 * EVENT_BUFREADPOST triggered the EVENT_FILETYPE.
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
147 *
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
148 * Relying on this value requires one to reset it prior calling
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
149 * apply_autocmds_group.
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
150 */
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
151 static int au_did_filetype INIT(= FALSE);
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
152 #endif
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
153
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
155 filemess(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
156 buf_T *buf,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
157 char_u *name,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
158 char_u *s,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
159 int attr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
160 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
161 int msg_scroll_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
162
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
163 if (msg_silent != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
164 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
165 msg_add_fname(buf, name); /* put file name in IObuff with quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 /* If it's extremely long, truncate it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 if (STRLEN(IObuff) > IOSIZE - 80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 IObuff[IOSIZE - 80] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 STRCAT(IObuff, s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 * For the first message may have to start a new line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 * For further ones overwrite the previous one, reset msg_scroll before
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 * calling filemess().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 msg_scroll_save = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 if (shortmess(SHM_OVERALL) && !exiting && p_verbose == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 msg_scroll = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178 if (!msg_scroll) /* wait a bit when overwriting an error msg */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179 check_for_delay(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 msg_start();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 msg_scroll = msg_scroll_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 msg_scrolled_ign = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 /* may truncate the message to avoid a hit-return prompt */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 msg_outtrans_attr(msg_may_trunc(FALSE, IObuff), attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 msg_clr_eos();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 msg_scrolled_ign = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 * Read lines from file "fname" into the buffer after line "from".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 * 1. We allocate blocks with lalloc, as big as possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 * 2. Each block is filled with characters from the file with a single read().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 * 3. The lines are inserted in the buffer with ml_append().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 * (caller must check that fname != NULL, unless READ_STDIN is used)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 * "lines_to_skip" is the number of lines that must be skipped
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 * "lines_to_read" is the number of lines that are appended
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201 * When not recovering lines_to_skip is 0 and lines_to_read MAXLNUM.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 * flags:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 * READ_NEW starting to edit a new buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 * READ_FILTER reading filter output
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 * READ_STDIN read from stdin instead of a file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 * READ_BUFFER read from curbuf instead of a file (converting after reading
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 * stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 * READ_DUMMY read into a dummy buffer (to check if file contents changed)
2394
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
210 * READ_KEEP_UNDO don't clear undo info or read it from a file
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
211 * READ_FIFO read from fifo/socket instead of a file
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 *
10575
01a5f64a7a20 patch 8.0.0177: BufEnter autocommand not fired for a directory
Christian Brabandt <cb@256bit.org>
parents: 10221
diff changeset
213 * return FAIL for failure, NOTDONE for directory (failure), or OK
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
216 readfile(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
217 char_u *fname,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
218 char_u *sfname,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
219 linenr_T from,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
220 linenr_T lines_to_skip,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
221 linenr_T lines_to_read,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
222 exarg_T *eap, /* can be NULL! */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
223 int flags)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 int fd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 int newfile = (flags & READ_NEW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 int check_readonly;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 int filtering = (flags & READ_FILTER);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 int read_stdin = (flags & READ_STDIN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 int read_buffer = (flags & READ_BUFFER);
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
231 int read_fifo = (flags & READ_FIFO);
1486
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
232 int set_options = newfile || read_buffer
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
233 || (eap != NULL && eap->read_edit);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 linenr_T read_buf_lnum = 1; /* next line to read from curbuf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 colnr_T read_buf_col = 0; /* next char to read from this line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 char_u c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 linenr_T lnum = from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 char_u *ptr = NULL; /* pointer into read buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 char_u *buffer = NULL; /* read buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 char_u *new_buffer = NULL; /* init to shut up gcc */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
241 char_u *line_start = NULL; /* init to shut up gcc */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
242 int wasempty; /* buffer was empty before reading */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 colnr_T len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 long size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 char_u *p;
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
246 off_T filesize = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 int skip_read = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 char_u *cryptkey = NULL;
2204
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
250 int did_ask_for_key = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 #endif
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
252 #ifdef FEAT_PERSISTENT_UNDO
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
253 context_sha256_T sha_ctx;
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
254 int read_undo_file = FALSE;
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
255 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 int split = 0; /* number of split lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 #define UNKNOWN 0x0fffffff /* file size is unknown */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 linenr_T linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
259 int error = FALSE; /* errors encountered */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 int ff_error = EOL_UNKNOWN; /* file format with errors */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
261 long linerest = 0; /* remaining chars in line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
262 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
263 int perm = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
264 int swap_mode = -1; /* protection bits for swap file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 int perm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 int fileformat = 0; /* end-of-line format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 int keep_fileformat = FALSE;
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
270 stat_T st;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 int file_readonly;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 linenr_T skip_count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 linenr_T read_count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 int msg_save = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 linenr_T read_no_eol_lnum = 0; /* non-zero lnum when last line of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 * last read was missing the eol */
10668
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
277 int try_mac;
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
278 int try_dos;
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
279 int try_unix;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 int file_rewind = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 int can_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
283 linenr_T conv_error = 0; /* line nr with conversion error */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
284 linenr_T illegal_byte = 0; /* line nr with illegal byte */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 int keep_dest_enc = FALSE; /* don't retry when char doesn't fit
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 in destination encoding */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
287 int bad_char_behavior = BAD_REPLACE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
288 /* BAD_KEEP, BAD_DROP or character to
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
289 * replace with */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 char_u *tmpname = NULL; /* name of 'charconvert' output file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 int fio_flags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
292 char_u *fenc; /* fileencoding to use */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
293 int fenc_alloced; /* fenc_next is in allocated memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 char_u *fenc_next = NULL; /* next item in 'fencs' or NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 int advance_fenc = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
296 long real_size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
297 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
298 iconv_t iconv_fd = (iconv_t)-1; /* descriptor for iconv() or -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 int did_iconv = FALSE; /* TRUE when iconv() failed and trying
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 'charconvert' next */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 int converted = FALSE; /* TRUE if conversion done */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 int notconverted = FALSE; /* TRUE if conversion wanted but it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 wasn't possible */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 char_u conv_rest[CONV_RESTLEN];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 int conv_restlen = 0; /* nr of bytes in conv_rest[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 #endif
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
310 #ifdef FEAT_AUTOCMD
2563
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
311 buf_T *old_curbuf;
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
312 char_u *old_b_ffname;
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
313 char_u *old_b_fname;
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
314 int using_b_ffname;
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
315 int using_b_fname;
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
316 #endif
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
317
8937
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
318 #ifdef FEAT_AUTOCMD
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
319 au_did_filetype = FALSE; /* reset before triggering any autocommands */
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
320 #endif
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
321
2707
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
322 curbuf->b_no_eol_lnum = 0; /* in case it was set by the previous read */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
324 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
325 * If there is no file name yet, use the one for the read file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
326 * BF_NOTEDITED is set to reflect this.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
327 * Don't do this for a read from a filter.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
328 * Only do this when 'cpoptions' contains the 'f' flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
329 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
330 if (curbuf->b_ffname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
331 && !filtering
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
332 && fname != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 && vim_strchr(p_cpo, CPO_FNAMER) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334 && !(flags & READ_DUMMY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 {
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
336 if (set_rw_fname(fname, sfname) == FAIL)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
337 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339
2563
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
340 #ifdef FEAT_AUTOCMD
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
341 /* Remember the initial values of curbuf, curbuf->b_ffname and
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
342 * curbuf->b_fname to detect whether they are altered as a result of
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
343 * executing nasty autocommands. Also check if "fname" and "sfname"
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
344 * point to one of these values. */
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
345 old_curbuf = curbuf;
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
346 old_b_ffname = curbuf->b_ffname;
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
347 old_b_fname = curbuf->b_fname;
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
348 using_b_ffname = (fname == curbuf->b_ffname)
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
349 || (sfname == curbuf->b_ffname);
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
350 using_b_fname = (fname == curbuf->b_fname) || (sfname == curbuf->b_fname);
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
351 #endif
5769dc787ec5 Fix: in compatible mode, in an empty buffer, ":r file" triggered an error
Bram Moolenaar <bram@vim.org>
parents: 2523
diff changeset
352
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
353 /* After reading a file the cursor line changes but we don't want to
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
354 * display the line. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
355 ex_no_reprint = TRUE;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
356
968
994ea4e6f023 updated for version 7.0-094
vimboss
parents: 946
diff changeset
357 /* don't display the file info for another buffer now */
994ea4e6f023 updated for version 7.0-094
vimboss
parents: 946
diff changeset
358 need_fileinfo = FALSE;
994ea4e6f023 updated for version 7.0-094
vimboss
parents: 946
diff changeset
359
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 * For Unix: Use the short file name whenever possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
362 * Avoids problems with networks and when directory names are changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 * Don't do this for MS-DOS, a "cd" in a sub-shell may have moved us to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 * another directory, which we don't detect.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 if (sfname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 sfname = fname;
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9509
diff changeset
368 #if defined(UNIX)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369 fname = sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 * The BufReadCmd and FileReadCmd events intercept the reading process by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 * executing the associated commands instead.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 if (!filtering && !read_stdin && !read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 pos_T pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 pos = curbuf->b_op_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 /* Set '[ mark to the line above where the lines go (line 1 if zero). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384 curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 curbuf->b_op_start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 if (apply_autocmds_exarg(EVENT_BUFREADCMD, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 FALSE, curbuf, eap))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 return aborting() ? FAIL : OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 else if (apply_autocmds_exarg(EVENT_FILEREADCMD, sfname, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 FALSE, NULL, eap))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 return aborting() ? FAIL : OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 curbuf->b_op_start = pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 if ((shortmess(SHM_OVER) || curbuf->b_help) && p_verbose == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 msg_scroll = FALSE; /* overwrite previous file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 msg_scroll = TRUE; /* don't overwrite previous file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
414 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 * If the name ends in a path separator, we can't open it. Check here,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 * because reading the file may actually work, but then creating the swap
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 * file may destroy it! Reported on MS-DOS and Win 95.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
418 * If the name is too long we might crash further on, quit here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
419 */
23
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
420 if (fname != NULL && *fname != NUL)
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
421 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
422 p = fname + STRLEN(fname);
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
423 if (after_pathsep(fname, p) || STRLEN(fname) >= MAXPATHL)
23
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
424 {
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
425 filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0);
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
426 msg_end();
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
427 msg_scroll = msg_save;
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
428 return FAIL;
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
429 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
432 if (!read_stdin && !read_buffer && !read_fifo)
5322
9801d06e7b4c updated for version 7.4.014
Bram Moolenaar <bram@vim.org>
parents: 5312
diff changeset
433 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 #ifdef UNIX
5322
9801d06e7b4c updated for version 7.4.014
Bram Moolenaar <bram@vim.org>
parents: 5312
diff changeset
435 /*
9801d06e7b4c updated for version 7.4.014
Bram Moolenaar <bram@vim.org>
parents: 5312
diff changeset
436 * On Unix it is possible to read a directory, so we have to
9801d06e7b4c updated for version 7.4.014
Bram Moolenaar <bram@vim.org>
parents: 5312
diff changeset
437 * check for it before the mch_open().
9801d06e7b4c updated for version 7.4.014
Bram Moolenaar <bram@vim.org>
parents: 5312
diff changeset
438 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 perm = mch_getperm(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 if (perm >= 0 && !S_ISREG(perm) /* not a regular file ... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 # ifdef S_ISFIFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 && !S_ISFIFO(perm) /* ... or fifo */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 # ifdef S_ISSOCK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
445 && !S_ISSOCK(perm) /* ... or socket */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
446 # endif
1313
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
447 # ifdef OPEN_CHR_FILES
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
448 && !(S_ISCHR(perm) && is_dev_fd_file(fname))
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
449 /* ... or a character special file named /dev/fd/<n> */
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
450 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 {
10575
01a5f64a7a20 patch 8.0.0177: BufEnter autocommand not fired for a directory
Christian Brabandt <cb@256bit.org>
parents: 10221
diff changeset
453 int retval = FAIL;
01a5f64a7a20 patch 8.0.0177: BufEnter autocommand not fired for a directory
Christian Brabandt <cb@256bit.org>
parents: 10221
diff changeset
454
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 if (S_ISDIR(perm))
10575
01a5f64a7a20 patch 8.0.0177: BufEnter autocommand not fired for a directory
Christian Brabandt <cb@256bit.org>
parents: 10221
diff changeset
456 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
10575
01a5f64a7a20 patch 8.0.0177: BufEnter autocommand not fired for a directory
Christian Brabandt <cb@256bit.org>
parents: 10221
diff changeset
458 retval = NOTDONE;
01a5f64a7a20 patch 8.0.0177: BufEnter autocommand not fired for a directory
Christian Brabandt <cb@256bit.org>
parents: 10221
diff changeset
459 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
460 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
461 filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
462 msg_end();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
463 msg_scroll = msg_save;
10575
01a5f64a7a20 patch 8.0.0177: BufEnter autocommand not fired for a directory
Christian Brabandt <cb@256bit.org>
parents: 10221
diff changeset
464 return retval;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
465 }
5322
9801d06e7b4c updated for version 7.4.014
Bram Moolenaar <bram@vim.org>
parents: 5312
diff changeset
466 #endif
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
467 #if defined(MSWIN)
1006
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
468 /*
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
469 * MS-Windows allows opening a device, but we will probably get stuck
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
470 * trying to read it.
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
471 */
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
472 if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE)
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
473 {
1303
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
474 filemess(curbuf, fname, (char_u *)_("is a device (disabled with 'opendevice' option)"), 0);
1006
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
475 msg_end();
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
476 msg_scroll = msg_save;
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
477 return FAIL;
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
478 }
5322
9801d06e7b4c updated for version 7.4.014
Bram Moolenaar <bram@vim.org>
parents: 5312
diff changeset
479 #endif
9801d06e7b4c updated for version 7.4.014
Bram Moolenaar <bram@vim.org>
parents: 5312
diff changeset
480 }
1004
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
481
5231
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
482 /* Set default or forced 'fileformat' and 'binary'. */
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
483 set_file_options(set_options, eap);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 * When opening a new file we take the readonly flag from the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 * Default is r/w, can be set to r/o below.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 * Don't reset it when in readonly mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489 * Only set/reset b_p_ro when BF_CHECK_RO is set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 check_readonly = (newfile && (curbuf->b_flags & BF_CHECK_RO));
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
492 if (check_readonly && !readonlymode)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493 curbuf->b_p_ro = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
495 if (newfile && !read_stdin && !read_buffer && !read_fifo)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 {
2823
8bd38abda314 updated for version 7.3.187
Bram Moolenaar <bram@vim.org>
parents: 2793
diff changeset
497 /* Remember time of file. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 if (mch_stat((char *)fname, &st) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 buf_store_time(curbuf, &st, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
501 curbuf->b_mtime_read = curbuf->b_mtime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 * Use the protection bits of the original file for the swap file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 * This makes it possible for others to read the name of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 * edited file from the swapfile, but only if they can read the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 * edited file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 * Remove the "write" and "execute" bits for group and others
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 * (they must not write the swapfile).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 * Add the "read" and "write" bits for the user, otherwise we may
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 * not be able to write to the file ourselves.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 * Setting the bits is done below, after creating the swap file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 swap_mode = (st.st_mode & 0644) | 0600;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 #ifdef FEAT_CW_EDITOR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 /* Get the FSSpec on MacOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 * TODO: Update it properly when the buffer name changes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 (void)GetFSSpecFromPath(curbuf->b_ffname, &curbuf->b_FSSpec);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 curbuf->b_fab_rfm = st.st_fab_rfm;
22
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
524 curbuf->b_fab_rat = st.st_fab_rat;
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
525 curbuf->b_fab_mrs = st.st_fab_mrs;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 curbuf->b_mtime = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 curbuf->b_mtime_read = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 curbuf->b_orig_size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 curbuf->b_orig_mode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 /* Reset the "new file" flag. It will be set again below when the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 * file doesn't exist. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 curbuf->b_flags &= ~(BF_NEW | BF_NEW_W);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
540
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
541 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 * for UNIX: check readonly with perm and mch_access()
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
543 * for Amiga: check readonly by trying to open the file for writing
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 file_readonly = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 {
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
548 #if defined(MSWIN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 /* Force binary I/O on stdin to avoid CR-LF -> LF conversion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 setmode(0, O_BINARY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 else if (!read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 #ifdef USE_MCH_ACCESS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556 if (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 # ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 !(perm & 0222) ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 mch_access((char *)fname, W_OK))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561 file_readonly = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 if (!newfile
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 || readonlymode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 || (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 file_readonly = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 /* try to open ro */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 if (fd < 0) /* cannot open at all */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 #ifndef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 int isdir_f;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 #ifndef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 /*
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
583 * On Amiga we can't open a directory, check here.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 isdir_f = (mch_isdir(fname));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 perm = mch_getperm(fname); /* check if the file exists */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 if (isdir_f)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 filemess(curbuf, sfname, (char_u *)_("is a directory"), 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 {
2147
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
596 if (perm < 0
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
597 #ifdef ENOENT
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
598 && errno == ENOENT
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
599 #endif
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
600 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 * Set the 'new-file' flag, so that when the file has
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 * been created by someone else, a ":w" will complain.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 curbuf->b_flags |= BF_NEW;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 /* Create a swap file now, so that other Vims are warned
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 * that we are editing this file. Don't do this for a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 * "nofile" or "nowrite" buffer type. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 #ifdef FEAT_QUICKFIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 if (!bt_dontwrite(curbuf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
613 #endif
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
614 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
615 check_need_swap(newfile);
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
616 #ifdef FEAT_AUTOCMD
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
617 /* SwapExists autocommand may mess things up */
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
618 if (curbuf != old_curbuf
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
619 || (using_b_ffname
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
620 && (old_b_ffname != curbuf->b_ffname))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
621 || (using_b_fname
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
622 && (old_b_fname != curbuf->b_fname)))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
623 {
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
624 EMSG(_(e_auchangedbuf));
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
625 return FAIL;
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
626 }
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
627 #endif
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
628 }
592
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
629 if (dir_of_file_exists(fname))
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
630 filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
631 else
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
632 filemess(curbuf, sfname,
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
633 (char_u *)_("[New DIRECTORY]"), 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
634 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
635 /* Even though this is a new file, it might have been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
636 * edited before and deleted. Get the old marks. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
637 check_marks_read();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
638 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
639 #ifdef FEAT_MBYTE
5231
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
640 /* Set forced 'fileencoding'. */
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
641 if (eap != NULL)
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
642 set_forced_fenc(eap);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
643 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
644 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
645 apply_autocmds_exarg(EVENT_BUFNEWFILE, sfname, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
646 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
647 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
648 /* remember the current fileformat */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
649 save_file_ff(curbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
650
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 if (aborting()) /* autocmds may abort script processing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 return OK; /* a new file is not an error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 {
550
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
659 filemess(curbuf, sfname, (char_u *)(
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
660 # ifdef EFBIG
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
661 (errno == EFBIG) ? _("[File too big]") :
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
662 # endif
2147
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
663 # ifdef EOVERFLOW
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
664 (errno == EOVERFLOW) ? _("[File too big]") :
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
665 # endif
550
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
666 _("[Permission Denied]")), 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 * Only set the 'ro' flag for readonly files the first time they are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 * loaded. Help files always get readonly mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 if ((check_readonly && file_readonly) || curbuf->b_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 curbuf->b_p_ro = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
681 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
682 {
1486
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
683 /* Don't change 'eol' if reading from buffer as it will already be
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
684 * correctly set when reading stdin. */
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
685 if (!read_buffer)
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
686 {
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
687 curbuf->b_p_eol = TRUE;
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
688 curbuf->b_start_eol = TRUE;
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
689 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 curbuf->b_p_bomb = FALSE;
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
692 curbuf->b_start_bomb = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696 /* Create a swap file now, so that other Vims are warned that we are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 * editing this file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 * Don't do this for a "nofile" or "nowrite" buffer type. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 #ifdef FEAT_QUICKFIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 if (!bt_dontwrite(curbuf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703 check_need_swap(newfile);
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
704 #ifdef FEAT_AUTOCMD
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
705 if (!read_stdin && (curbuf != old_curbuf
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
706 || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
707 || (using_b_fname && (old_b_fname != curbuf->b_fname))))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
708 {
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
709 EMSG(_(e_auchangedbuf));
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
710 if (!read_buffer)
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
711 close(fd);
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
712 return FAIL;
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
713 }
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
714 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
715 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 /* Set swap file protection bits after creating it. */
1918
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
717 if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
718 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 (void)mch_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722
578
8eb0b93ea26c updated for version 7.0164
vimboss
parents: 574
diff changeset
723 #if defined(HAS_SWAP_EXISTS_ACTION)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 /* If "Quit" selected at ATTENTION dialog, don't load the file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 if (swap_exists_action == SEA_QUIT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
727 if (!read_buffer && !read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
728 close(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
729 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
730 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
731 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
732
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
733 ++no_wait_return; /* don't wait for return yet */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
734
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
735 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
736 * Set '[ mark to the line above where the lines go (line 1 if zero).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
737 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 curbuf->b_op_start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
740
10668
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
741 try_mac = (vim_strchr(p_ffs, 'm') != NULL);
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
742 try_dos = (vim_strchr(p_ffs, 'd') != NULL);
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
743 try_unix = (vim_strchr(p_ffs, 'x') != NULL);
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
744
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
746 if (!read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 int m = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 int n = msg_scrolled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 * The file must be closed again, the autocommands may want to change
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 * the file before reading it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755 if (!read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756 close(fd); /* ignore errors */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
757
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
758 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
759 * The output from the autocommands should not overwrite anything and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760 * should not be overwritten: Set msg_scroll, restore its value if no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761 * output was done.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763 msg_scroll = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 if (filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765 apply_autocmds_exarg(EVENT_FILTERREADPRE, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 else if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 apply_autocmds_exarg(EVENT_STDINREADPRE, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
770 else if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 apply_autocmds_exarg(EVENT_BUFREADPRE, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 apply_autocmds_exarg(EVENT_FILEREADPRE, sfname, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 FALSE, NULL, eap);
10668
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
776 /* autocommands may have changed it */
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
777 try_mac = (vim_strchr(p_ffs, 'm') != NULL);
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
778 try_dos = (vim_strchr(p_ffs, 'd') != NULL);
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
779 try_unix = (vim_strchr(p_ffs, 'x') != NULL);
6a252c6afd5b patch 8.0.0224: change to 'fileformats' from autocmd does not take effect
Christian Brabandt <cb@256bit.org>
parents: 10575
diff changeset
780
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 if (msg_scrolled == n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782 msg_scroll = m;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
784 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 if (aborting()) /* autocmds may abort script processing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
792 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794 * Don't allow the autocommands to change the current buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 * Try to re-open the file.
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
796 *
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
797 * Don't allow the autocommands to change the buffer name either
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
798 * (cd for example) if it invalidates fname or sfname.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
799 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800 if (!read_stdin && (curbuf != old_curbuf
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
801 || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
802 || (using_b_fname && (old_b_fname != curbuf->b_fname))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 || (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 if (fd < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 EMSG(_("E200: *ReadPre autocommands made the file unreadable"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
810 EMSG(_("E201: *ReadPre autocommands must not change current buffer"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
811 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
812 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
814 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
815 #endif /* FEAT_AUTOCMD */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
816
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 /* Autocommands may add lines to the file, need to check if it is empty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 wasempty = (curbuf->b_ml.ml_flags & ML_EMPTY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 if (!recoverymode && !filtering && !(flags & READ_DUMMY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 * Show the user that we are busy reading the input. Sometimes this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 * may take a while. When reading from stdin another program may
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 * still be running, don't move the cursor to the last line, unless
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 * always using the GUI.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828 if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830 #ifndef ALWAYS_USE_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 mch_msg(_("Vim: Reading from stdin...\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 /* Also write a message in the GUI window, if there is one. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835 if (gui.in_use && !gui.dying && !gui.starting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 p = (char_u *)_("Reading from stdin...");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 gui_write(p, (int)STRLEN(p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842 else if (!read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 filemess(curbuf, sfname, (char_u *)"", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 msg_scroll = FALSE; /* overwrite the file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
848 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
849 * Set linecnt now, before the "retry" caused by a wrong guess for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
850 * fileformat, and after the autocommands, which may change them.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
851 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
852 linecnt = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
853
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
854 #ifdef FEAT_MBYTE
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
855 /* "++bad=" argument. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
856 if (eap != NULL && eap->bad_char != 0)
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
857 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
858 bad_char_behavior = eap->bad_char;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
859 if (set_options)
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
860 curbuf->b_bad_char = eap->bad_char;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
861 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
862 else
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
863 curbuf->b_bad_char = 0;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
864
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 /*
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
866 * Decide which 'encoding' to use or use first.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868 if (eap != NULL && eap->force_enc != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
869 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
870 fenc = enc_canonize(eap->cmd + eap->force_enc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
871 fenc_alloced = TRUE;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
872 keep_dest_enc = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
873 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
874 else if (curbuf->b_p_bin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
875 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
876 fenc = (char_u *)""; /* binary: don't convert */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
877 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
878 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879 else if (curbuf->b_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
880 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
881 char_u firstline[80];
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
882 int fc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884 /* Help files are either utf-8 or latin1. Try utf-8 first, if this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 * fails it must be latin1.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
886 * Always do this when 'encoding' is "utf-8". Otherwise only do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 * this when needed to avoid [converted] remarks all the time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 * It is needed when the first line contains non-ASCII characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 * That is only in *.??x files. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 fenc = (char_u *)"latin1";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 c = enc_utf8;
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
892 if (!c && !read_stdin)
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
893 {
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
894 fc = fname[STRLEN(fname) - 1];
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
895 if (TOLOWER_ASC(fc) == 'x')
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
896 {
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
897 /* Read the first line (and a bit more). Immediately rewind to
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
898 * the start of the file. If the read() fails "len" is -1. */
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
899 len = read_eintr(fd, firstline, 80);
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
900 vim_lseek(fd, (off_T)0L, SEEK_SET);
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
901 for (p = firstline; p < firstline + len; ++p)
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
902 if (*p >= 0x80)
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
903 {
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
904 c = TRUE;
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
905 break;
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
906 }
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
907 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
908 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
909
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
910 if (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
911 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
912 fenc_next = fenc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
913 fenc = (char_u *)"utf-8";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
914
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
915 /* When the file is utf-8 but a character doesn't fit in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
916 * 'encoding' don't retry. In help text editing utf-8 bytes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
917 * doesn't make sense. */
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
918 if (!enc_utf8)
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
919 keep_dest_enc = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
920 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
921 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
923 else if (*p_fencs == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 fenc = curbuf->b_p_fenc; /* use format from buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
928 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 fenc_next = p_fencs; /* try items in 'fileencodings' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 fenc = next_fenc(&fenc_next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
932 fenc_alloced = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
933 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 * Jump back here to retry reading the file in different ways.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938 * Reasons to retry:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 * - encoding conversion failed: try another one from "fenc_next"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 * - BOM detected and fenc was set, need to setup conversion
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 * - "fileformat" check failed: try another
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 * Variables set for special retry actions:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944 * "file_rewind" Rewind the file to start reading it again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 * "advance_fenc" Advance "fenc" using "fenc_next".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
946 * "skip_read" Re-use already read bytes (BOM detected).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 * "did_iconv" iconv() conversion failed, try 'charconvert'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 * "keep_fileformat" Don't reset "fileformat".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950 * Other status indicators:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 * "tmpname" When != NULL did conversion with 'charconvert'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952 * Output file has to be deleted afterwards.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 * "iconv_fd" When != -1 did conversion with iconv().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955 retry:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 if (file_rewind)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 if (read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 read_buf_lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 read_buf_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 }
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
964 else if (read_stdin || vim_lseek(fd, (off_T)0L, SEEK_SET) != 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 /* Can't rewind the file, give up. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 goto failed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970 /* Delete the previously read lines. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 while (lnum > from)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 ml_delete(lnum--, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 file_rewind = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 #ifdef FEAT_MBYTE
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
975 if (set_options)
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
976 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 curbuf->b_p_bomb = FALSE;
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
978 curbuf->b_start_bomb = FALSE;
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
979 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
980 conv_error = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 * When retrying with another "fenc" and the first time "fileformat"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 * will be reset.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988 if (keep_fileformat)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
989 keep_fileformat = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
990 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
992 if (eap != NULL && eap->force_ff != 0)
1742
0e4fa55d20e0 updated for version 7.2-040
vimboss
parents: 1735
diff changeset
993 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
994 fileformat = get_fileformat_force(curbuf, eap);
1742
0e4fa55d20e0 updated for version 7.2-040
vimboss
parents: 1735
diff changeset
995 try_unix = try_dos = try_mac = FALSE;
0e4fa55d20e0 updated for version 7.2-040
vimboss
parents: 1735
diff changeset
996 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997 else if (curbuf->b_p_bin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
998 fileformat = EOL_UNIX; /* binary: use Unix format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
999 else if (*p_ffs == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1000 fileformat = get_fileformat(curbuf);/* use format from buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1001 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1002 fileformat = EOL_UNKNOWN; /* detect from file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1003 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1004
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 if (iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 /* aborted conversion with iconv(), close the descriptor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010 iconv_close(iconv_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 iconv_fd = (iconv_t)-1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1014
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015 if (advance_fenc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1016 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1017 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 * Try the next entry in 'fileencodings'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 advance_fenc = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 if (eap != NULL && eap->force_enc != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1024 /* Conversion given with "++cc=" wasn't possible, read
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025 * without conversion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 notconverted = TRUE;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1027 conv_error = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 if (fenc_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 fenc = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035 if (fenc_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 if (fenc_next != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1039 fenc = next_fenc(&fenc_next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1040 fenc_alloced = (fenc_next != NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1044 fenc = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1048 if (tmpname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050 mch_remove(tmpname); /* delete converted file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051 vim_free(tmpname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 tmpname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1054 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1055
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1056 /*
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
1057 * Conversion may be required when the encoding of the file is different
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
1058 * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 fio_flags = 0;
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
1061 converted = need_conversion(fenc);
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
1062 if (converted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1065 /* "ucs-bom" means we need to check the first bytes of the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 * for a BOM. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 if (STRCMP(fenc, ENC_UCSBOM) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 fio_flags = FIO_UCSBOM;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 * Check if UCS-2/4 or Latin1 to UTF-8 conversion needs to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 * done. This is handled below after read(). Prepare the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073 * fio_flags to avoid having to parse the string each time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1074 * Also check for Unicode to Latin1 conversion, because iconv()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075 * appears not to handle this correctly. This works just like
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076 * conversion to UTF-8 except how the resulting character is put in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 * the buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1078 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1079 else if (enc_utf8 || STRCMP(p_enc, "latin1") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 fio_flags = get_fio_flags(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1082 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1083 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1084 * Conversion from an MS-Windows codepage to UTF-8 or another codepage
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085 * is handled with MultiByteToWideChar().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087 if (fio_flags == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 fio_flags = get_win_fio_flags(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 /* Conversion from Apple MacRoman to latin1 or UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 if (fio_flags == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094 fio_flags = get_mac_fio_flags(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1095 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 * Try using iconv() if we can't convert internally.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 if (fio_flags == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 && !did_iconv
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 iconv_fd = (iconv_t)my_iconv_open(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107 enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 * Use the 'charconvert' expression when conversion is required
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113 * and we can't do it internally or with iconv().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 if (fio_flags == 0 && !read_stdin && !read_buffer && *p_ccv != NUL
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
1116 && !read_fifo
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1118 && iconv_fd == (iconv_t)-1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 did_iconv = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 /* Skip conversion when it's already done (retry for wrong
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 * "fileformat"). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 if (tmpname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 tmpname = readfile_charconvert(fname, fenc, &fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130 if (tmpname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 /* Conversion failed. Try another one. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 advance_fenc = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 if (fd < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 /* Re-opening the original file failed! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 EMSG(_("E202: Conversion made file unreadable!"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 goto failed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1145 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1146 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 if (fio_flags == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 && iconv_fd == (iconv_t)-1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 /* Conversion wanted but we can't.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155 * Try the next conversion in 'fileencodings' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156 advance_fenc = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1158 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1160 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1161
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1162 /* Set "can_retry" when it's possible to rewind the file and try with
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 * another "fenc" value. It's FALSE when no other "fenc" to try, reading
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1164 * stdin or fixed at a specific encoding. */
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
1165 can_retry = (*fenc != NUL && !read_stdin && !read_fifo && !keep_dest_enc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1166 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1167
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1168 if (!skip_read)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1170 linerest = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171 filesize = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1172 skip_count = lines_to_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1173 read_count = lines_to_read;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1175 conv_restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176 #endif
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
1177 #ifdef FEAT_PERSISTENT_UNDO
2394
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
1178 read_undo_file = (newfile && (flags & READ_KEEP_UNDO) == 0
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
1179 && curbuf->b_ffname != NULL
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
1180 && curbuf->b_p_udf
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
1181 && !filtering
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
1182 && !read_fifo
2394
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
1183 && !read_stdin
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
1184 && !read_buffer);
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
1185 if (read_undo_file)
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
1186 sha256_start(&sha_ctx);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
1187 #endif
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1188 #ifdef FEAT_CRYPT
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1189 if (curbuf->b_cryptstate != NULL)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1190 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1191 /* Need to free the state, but keep the key, don't want to ask for
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1192 * it again. */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1193 crypt_free_state(curbuf->b_cryptstate);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1194 curbuf->b_cryptstate = NULL;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1195 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1196 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1197 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1198
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1199 while (!error && !got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1200 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1201 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1202 * We allocate as much space for the file as we can get, plus
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1203 * space for the old line plus room for one terminating NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1204 * The amount is limited by the fact that read() only can read
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205 * upto max_unsigned characters (and other things).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206 */
5684
136f05449f29 updated for version 7.4.188
Bram Moolenaar <bram@vim.org>
parents: 5651
diff changeset
1207 #if VIM_SIZEOF_INT <= 2
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1208 if (linerest >= 0x7ff0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1210 ++split;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1211 *ptr = NL; /* split line by inserting a NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 size = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 if (!skip_read)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 {
5684
136f05449f29 updated for version 7.4.188
Bram Moolenaar <bram@vim.org>
parents: 5651
diff changeset
1219 #if VIM_SIZEOF_INT > 2
1076
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1061
diff changeset
1220 # if defined(SSIZE_MAX) && (SSIZE_MAX < 0x10000L)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221 size = SSIZE_MAX; /* use max I/O size, 52K */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1222 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223 size = 0x10000L; /* use buffer >= 64K */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1224 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1226 size = 0x7ff0L - linerest; /* limit buffer to 32K */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
1229 for ( ; size >= 10; size = (long)((long_u)size >> 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 if ((new_buffer = lalloc((long_u)(size + linerest + 1),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232 FALSE)) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1235 if (new_buffer == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 do_outofmem_msg((long_u)(size * 2 + linerest + 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1239 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1240 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1241 if (linerest) /* copy characters from the previous buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 mch_memmove(new_buffer, ptr - linerest, (size_t)linerest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 buffer = new_buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 ptr = buffer + linerest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 line_start = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 /* May need room to translate into.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 * For iconv() we don't really know the required space, use a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 * factor ICONV_MULT.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 * latin1 to utf-8: 1 byte becomes up to 2 bytes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253 * utf-16 to utf-8: 2 bytes become up to 3 bytes, 4 bytes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 * become up to 4 bytes, size must be multiple of 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 * ucs-2 to utf-8: 2 bytes become up to 3 bytes, size must be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 * multiple of 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 * ucs-4 to utf-8: 4 bytes become up to 6 bytes, size must be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 * multiple of 4 */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1259 real_size = (int)size;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 if (iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1262 size = size / ICONV_MULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1264 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1265 if (fio_flags & FIO_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 size = size / 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 size = (size * 2 / 3) & ~1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 else if (fio_flags & FIO_UCS4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270 size = (size * 2 / 3) & ~3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 else if (fio_flags == FIO_UCSBOM)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 size = size / ICONV_MULT; /* worst case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 else if (fio_flags & FIO_CODEPAGE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 size = size / ICONV_MULT; /* also worst case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 else if (fio_flags & FIO_MACROMAN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 size = size / ICONV_MULT; /* also worst case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 if (conv_restlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 /* Insert unconverted bytes from previous line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 mch_memmove(ptr, conv_rest, conv_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288 ptr += conv_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 size -= conv_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 if (read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 * Read bytes from curbuf. Used for converting text read
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 * from stdin.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 if (read_buf_lnum > from)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 int n, ni;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 long tlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 tlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 p = ml_get(read_buf_lnum) + read_buf_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 n = (int)STRLEN(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311 if ((int)tlen + n + 1 > size)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313 /* Filled up to "size", append partial line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 * Change NL to NUL to reverse the effect done
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 * below. */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1316 n = (int)(size - tlen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 for (ni = 0; ni < n; ++ni)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 if (p[ni] == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 ptr[tlen++] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1322 ptr[tlen++] = p[ni];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324 read_buf_col += n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329 /* Append whole line and new-line. Change NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 * to NUL to reverse the effect done below. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 for (ni = 0; ni < n; ++ni)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 if (p[ni] == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 ptr[tlen++] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336 ptr[tlen++] = p[ni];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 ptr[tlen++] = NL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339 read_buf_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 if (++read_buf_lnum > from)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 /* When the last line didn't have an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 * end-of-line don't add it now either. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 if (!curbuf->b_p_eol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 --tlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 size = tlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1354 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1355 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1356 * Read bytes from the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 */
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
1358 size = read_eintr(fd, ptr, size);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1361 #ifdef FEAT_CRYPT
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1362 /*
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1363 * At start of file: Check for magic number of encryption.
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1364 */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1365 if (filesize == 0 && size > 0)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1366 cryptkey = check_for_cryptkey(cryptkey, ptr, &size,
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1367 &filesize, newfile, sfname,
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1368 &did_ask_for_key);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1369 /*
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1370 * Decrypt the read bytes. This is done before checking for
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1371 * EOF because the crypt layer may be buffering.
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1372 */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1373 if (cryptkey != NULL && size > 0)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1374 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1375 if (crypt_works_inplace(curbuf->b_cryptstate))
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1376 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1377 crypt_decode_inplace(curbuf->b_cryptstate, ptr, size);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1378 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1379 else
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1380 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1381 char_u *newptr = NULL;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1382 int decrypted_size;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1383
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1384 decrypted_size = crypt_decode_alloc(
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1385 curbuf->b_cryptstate, ptr, size, &newptr);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1386
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1387 /* If the crypt layer is buffering, not producing
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1388 * anything yet, need to read more. */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1389 if (size > 0 && decrypted_size == 0)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1390 continue;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1391
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1392 if (linerest == 0)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1393 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1394 /* Simple case: reuse returned buffer (may be
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1395 * NULL, checked later). */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1396 new_buffer = newptr;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1397 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1398 else
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1399 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1400 long_u new_size;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1401
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1402 /* Need new buffer to add bytes carried over. */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1403 new_size = (long_u)(decrypted_size + linerest + 1);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1404 new_buffer = lalloc(new_size, FALSE);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1405 if (new_buffer == NULL)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1406 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1407 do_outofmem_msg(new_size);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1408 error = TRUE;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1409 break;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1410 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1411
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1412 mch_memmove(new_buffer, buffer, linerest);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1413 if (newptr != NULL)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1414 mch_memmove(new_buffer + linerest, newptr,
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1415 decrypted_size);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1416 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1417
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1418 if (new_buffer != NULL)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1419 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1420 vim_free(buffer);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1421 buffer = new_buffer;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1422 new_buffer = NULL;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1423 line_start = buffer;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1424 ptr = buffer + linerest;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1425 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1426 size = decrypted_size;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1427 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1428 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1429 #endif
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1430
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 if (size <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 if (size < 0) /* read error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1436 else if (conv_restlen > 0)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1437 {
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1438 /*
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1439 * Reached end-of-file but some trailing bytes could
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1440 * not be converted. Truncated file?
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1441 */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1442
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1443 /* When we did a conversion report an error. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1444 if (fio_flags != 0
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1445 # ifdef USE_ICONV
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1446 || iconv_fd != (iconv_t)-1
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1447 # endif
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1448 )
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1449 {
4331
d8053e6bf72a updated for version 7.3.915
Bram Moolenaar <bram@vim.org>
parents: 4287
diff changeset
1450 if (can_retry)
d8053e6bf72a updated for version 7.3.915
Bram Moolenaar <bram@vim.org>
parents: 4287
diff changeset
1451 goto rewind_retry;
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1452 if (conv_error == 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1453 conv_error = curbuf->b_ml.ml_line_count
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1454 - linecnt + 1;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1455 }
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1456 /* Remember the first linenr with an illegal byte */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1457 else if (illegal_byte == 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1458 illegal_byte = curbuf->b_ml.ml_line_count
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1459 - linecnt + 1;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1460 if (bad_char_behavior == BAD_DROP)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1461 {
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1462 *(ptr - conv_restlen) = NUL;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1463 conv_restlen = 0;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1464 }
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1465 else
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1466 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1467 /* Replace the trailing bytes with the replacement
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1468 * character if we were converting; if we weren't,
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1469 * leave the UTF8 checking code to do it, as it
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1470 * works slightly differently. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1471 if (bad_char_behavior != BAD_KEEP && (fio_flags != 0
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1472 # ifdef USE_ICONV
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1473 || iconv_fd != (iconv_t)-1
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1474 # endif
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1475 ))
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1476 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1477 while (conv_restlen > 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1478 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1479 *(--ptr) = bad_char_behavior;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1480 --conv_restlen;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1481 }
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1482 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1483 fio_flags = 0; /* don't convert this */
834
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1484 # ifdef USE_ICONV
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1485 if (iconv_fd != (iconv_t)-1)
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1486 {
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1487 iconv_close(iconv_fd);
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1488 iconv_fd = (iconv_t)-1;
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1489 }
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1490 # endif
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1491 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1492 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 skip_read = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 * At start of file (or after crypt magic number): Check for BOM.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 * Also check for a BOM for other Unicode encodings, but not after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 * converting with 'charconvert' or when a BOM has already been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 * found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505 if ((filesize == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 # ifdef FEAT_CRYPT
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1507 || (cryptkey != NULL
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1508 && filesize == crypt_get_header_len(
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
1509 crypt_get_method_nr(curbuf)))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1510 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1511 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1512 && (fio_flags == FIO_UCSBOM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1513 || (!curbuf->b_p_bomb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 && tmpname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515 && (*fenc == 'u' || (*fenc == NUL && enc_utf8)))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 char_u *ccname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 int blen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520 /* no BOM detection in a short file or in binary mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 if (size < 2 || curbuf->b_p_bin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522 ccname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 ccname = check_for_bom(ptr, size, &blen,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags(fenc));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 if (ccname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 /* Remove BOM from the text */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 filesize += blen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 size -= blen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 mch_memmove(ptr, ptr + blen, (size_t)size);
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
1532 if (set_options)
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
1533 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534 curbuf->b_p_bomb = TRUE;
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
1535 curbuf->b_start_bomb = TRUE;
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
1536 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539 if (fio_flags == FIO_UCSBOM)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 if (ccname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1543 /* No BOM detected: retry with next encoding. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1544 advance_fenc = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1546 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1547 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 /* BOM detected: set "fenc" and jump back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 if (fenc_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1550 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1551 fenc = ccname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1552 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1553 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1554 /* retry reading without getting new bytes or rewinding */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1555 skip_read = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1556 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1557 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1558 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1559
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1560 /* Include not converted bytes. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1561 ptr -= conv_restlen;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1562 size += conv_restlen;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1563 conv_restlen = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1564 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1565 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1566 * Break here for a read error or end-of-file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1567 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1568 if (size <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1569 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1570
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 if (iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 * Attempt conversion of the read bytes to 'encoding' using
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 * iconv().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 const char *fromp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 char *top;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 size_t from_size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 size_t to_size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 fromp = (char *)ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586 from_size = size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 ptr += size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588 top = (char *)ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 to_size = real_size - size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1590
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1591 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1592 * If there is conversion error or not enough room try using
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
1593 * another conversion. Except for when there is no
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
1594 * alternative (help files).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1595 */
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1596 while ((iconv(iconv_fd, (void *)&fromp, &from_size,
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1597 &top, &to_size)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 == (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 || from_size > CONV_RESTLEN)
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1600 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1601 if (can_retry)
375
f14cbd913415 updated for version 7.0097
vimboss
parents: 355
diff changeset
1602 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1603 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1604 conv_error = readfile_linenr(linecnt,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1605 ptr, (char_u *)top);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1606
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1607 /* Deal with a bad byte and continue with the next. */
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1608 ++fromp;
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1609 --from_size;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1610 if (bad_char_behavior == BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1611 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1612 *top++ = *(fromp - 1);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1613 --to_size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1614 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1615 else if (bad_char_behavior != BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1616 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1617 *top++ = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1618 --to_size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1619 }
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1620 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1621
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1622 if (from_size > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 /* Some remaining characters, keep them for the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1625 * round. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626 mch_memmove(conv_rest, (char_u *)fromp, from_size);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1627 conv_restlen = (int)from_size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1628 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1629
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 /* move the linerest to before the converted characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1631 line_start = ptr - linerest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632 mch_memmove(line_start, buffer, (size_t)linerest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633 size = (long)((char_u *)top - ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1634 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1636
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1637 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1638 if (fio_flags & FIO_CODEPAGE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1639 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1640 char_u *src, *dst;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1641 WCHAR ucs2buf[3];
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1642 int ucs2len;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1643 int codepage = FIO_GET_CP(fio_flags);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1644 int bytelen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1645 int found_bad;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1646 char replstr[2];
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1647
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1648 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1649 * Conversion from an MS-Windows codepage or UTF-8 to UTF-8 or
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1650 * a codepage, using standard MS-Windows functions. This
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1651 * requires two steps:
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1652 * 1. convert from 'fileencoding' to ucs-2
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1653 * 2. convert from ucs-2 to 'encoding'
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1654 *
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1655 * Because there may be illegal bytes AND an incomplete byte
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1656 * sequence at the end, we may have to do the conversion one
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1657 * character at a time to get it right.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1658 */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1659
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1660 /* Replacement string for WideCharToMultiByte(). */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1661 if (bad_char_behavior > 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1662 replstr[0] = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1663 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1664 replstr[0] = '?';
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1665 replstr[1] = NUL;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1666
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1667 /*
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1668 * Move the bytes to the end of the buffer, so that we have
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1669 * room to put the result at the start.
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1670 */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1671 src = ptr + real_size - size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1672 mch_memmove(src, ptr, size);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1673
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1674 /*
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1675 * Do the conversion.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1676 */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1677 dst = ptr;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1678 size = size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1679 while (size > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1680 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1681 found_bad = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1682
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1683 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1684 if (codepage == CP_UTF8)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1685 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1686 /* Handle CP_UTF8 input ourselves to be able to handle
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1687 * trailing bytes properly.
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1688 * Get one UTF-8 character from src. */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1689 bytelen = (int)utf_ptr2len_len(src, size);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1690 if (bytelen > size)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1691 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1692 /* Only got some bytes of a character. Normally
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1693 * it's put in "conv_rest", but if it's too long
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1694 * deal with it as if they were illegal bytes. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1695 if (bytelen <= CONV_RESTLEN)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1696 break;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1697
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1698 /* weird overlong byte sequence */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1699 bytelen = size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1700 found_bad = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1701 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1702 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1703 {
799
6beb2c667935 updated for version 7.0b
vimboss
parents: 788
diff changeset
1704 int u8c = utf_ptr2char(src);
6beb2c667935 updated for version 7.0b
vimboss
parents: 788
diff changeset
1705
622
4096208d2a50 updated for version 7.0178
vimboss
parents: 617
diff changeset
1706 if (u8c > 0xffff || (*src >= 0x80 && bytelen == 1))
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1707 found_bad = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1708 ucs2buf[0] = u8c;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1709 ucs2len = 1;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1710 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1711 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1712 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1713 # endif
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1714 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1715 /* We don't know how long the byte sequence is, try
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1716 * from one to three bytes. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1717 for (bytelen = 1; bytelen <= size && bytelen <= 3;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1718 ++bytelen)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1719 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1720 ucs2len = MultiByteToWideChar(codepage,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1721 MB_ERR_INVALID_CHARS,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1722 (LPCSTR)src, bytelen,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1723 ucs2buf, 3);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1724 if (ucs2len > 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1725 break;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1726 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1727 if (ucs2len == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1728 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1729 /* If we have only one byte then it's probably an
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1730 * incomplete byte sequence. Otherwise discard
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1731 * one byte as a bad character. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1732 if (size == 1)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1733 break;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1734 found_bad = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1735 bytelen = 1;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1736 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1737 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1738
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1739 if (!found_bad)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1740 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1741 int i;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1742
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1743 /* Convert "ucs2buf[ucs2len]" to 'enc' in "dst". */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1744 if (enc_utf8)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1745 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1746 /* From UCS-2 to UTF-8. Cannot fail. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1747 for (i = 0; i < ucs2len; ++i)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1748 dst += utf_char2bytes(ucs2buf[i], dst);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1749 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1750 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1751 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1752 BOOL bad = FALSE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1753 int dstlen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1754
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1755 /* From UCS-2 to "enc_codepage". If the
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1756 * conversion uses the default character "?",
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1757 * the data doesn't fit in this encoding. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1758 dstlen = WideCharToMultiByte(enc_codepage, 0,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1759 (LPCWSTR)ucs2buf, ucs2len,
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1760 (LPSTR)dst, (int)(src - dst),
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1761 replstr, &bad);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1762 if (bad)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1763 found_bad = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1764 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1765 dst += dstlen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1766 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1768
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1769 if (found_bad)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1770 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1771 /* Deal with bytes we can't convert. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1772 if (can_retry)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1773 goto rewind_retry;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1774 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1775 conv_error = readfile_linenr(linecnt, ptr, dst);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1776 if (bad_char_behavior != BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1777 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1778 if (bad_char_behavior == BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1779 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1780 mch_memmove(dst, src, bytelen);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1781 dst += bytelen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1782 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1783 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1784 *dst++ = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1785 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1786 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1787
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1788 src += bytelen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1789 size -= bytelen;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1791
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1792 if (size > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1794 /* An incomplete byte sequence remaining. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1795 mch_memmove(conv_rest, src, size);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1796 conv_restlen = size;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1798
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1799 /* The new size is equal to how much "dst" was advanced. */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1800 size = (long)(dst - ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 # endif
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
1804 # ifdef MACOS_CONVERT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805 if (fio_flags & FIO_MACROMAN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 * Conversion from Apple MacRoman char encoding to UTF-8 or
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
1809 * latin1. This is in os_mac_conv.c.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 */
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
1811 if (macroman2enc(ptr, &size, real_size) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812 goto rewind_retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1813 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 if (fio_flags != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 int u8c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 char_u *tail = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 * "enc_utf8" set: Convert Unicode or Latin1 to UTF-8.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824 * "enc_utf8" not set: Convert Unicode to Latin1.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 * Go from end to start through the buffer, because the number
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 * of bytes may increase.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 * "dest" points to after where the UTF-8 bytes go, "p" points
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828 * to after the next character to convert.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1829 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 dest = ptr + real_size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 if (fio_flags == FIO_LATIN1 || fio_flags == FIO_UTF8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833 p = ptr + size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 if (fio_flags == FIO_UTF8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 /* Check for a trailing incomplete UTF-8 sequence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837 tail = ptr + size - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838 while (tail > ptr && (*tail & 0xc0) == 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 --tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 if (tail + utf_byte2len(*tail) <= ptr + size)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841 tail = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 p = tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 /* Check for a trailing byte */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 p = ptr + (size & ~1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 if (size & 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 tail = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 if ((fio_flags & FIO_UTF16) && p > ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 /* Check for a trailing leading word */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 if (fio_flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 u8c = (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 u8c += *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 u8c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 u8c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1865 if (u8c >= 0xd800 && u8c <= 0xdbff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1866 tail = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1867 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1868 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1869 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1870 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1871 else /* FIO_UCS4 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873 /* Check for trailing 1, 2 or 3 bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 p = ptr + (size & ~3);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 if (size & 3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 tail = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879 /* If there is a trailing incomplete sequence move it to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 * conv_rest[]. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 if (tail != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 conv_restlen = (int)((ptr + size) - tail);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 mch_memmove(conv_rest, (char_u *)tail, conv_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 size -= conv_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1886 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1887
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1888
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889 while (p > ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 if (fio_flags & FIO_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 u8c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1894 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1895 if (fio_flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1896 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1897 u8c = (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1898 u8c += *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1899 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1900 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 u8c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 u8c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 if ((fio_flags & FIO_UTF16)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 && u8c >= 0xdc00 && u8c <= 0xdfff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908 int u16c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 if (p == ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 /* Missing leading word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913 if (can_retry)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1915 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1916 conv_error = readfile_linenr(linecnt,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1917 ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1918 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1919 continue;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1920 if (bad_char_behavior != BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1921 u8c = bad_char_behavior;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 /* found second word of double-word, get the first
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 * word and compute the resulting character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 if (fio_flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1928 u16c = (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1929 u16c += *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 u16c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 u16c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1936 u8c = 0x10000 + ((u16c & 0x3ff) << 10)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1937 + (u8c & 0x3ff);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1938
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1939 /* Check if the word is indeed a leading word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1940 if (u16c < 0xd800 || u16c > 0xdbff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1941 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1942 if (can_retry)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1943 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1944 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1945 conv_error = readfile_linenr(linecnt,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1946 ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1947 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1948 continue;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1949 if (bad_char_behavior != BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1950 u8c = bad_char_behavior;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954 else if (fio_flags & FIO_UCS4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956 if (fio_flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958 u8c = (*--p << 24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 u8c += (*--p << 16);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1960 u8c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961 u8c += *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1962 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1963 else /* big endian */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1964 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1965 u8c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1966 u8c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1967 u8c += (*--p << 16);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1968 u8c += (*--p << 24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1969 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1970 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1971 else /* UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 if (*--p < 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 u8c = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977 len = utf_head_off(ptr, p);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1978 p -= len;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1979 u8c = utf_ptr2char(p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980 if (len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 /* Not a valid UTF-8 character, retry with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 * another fenc when possible, otherwise just
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1984 * report the error. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1985 if (can_retry)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1986 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1987 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1988 conv_error = readfile_linenr(linecnt,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1989 ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1990 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1991 continue;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1992 if (bad_char_behavior != BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1993 u8c = bad_char_behavior;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1994 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1995 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1996 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 if (enc_utf8) /* produce UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 dest -= utf_char2len(u8c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 (void)utf_char2bytes(u8c, dest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2002 else /* produce Latin1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2003 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 --dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2005 if (u8c >= 0x100)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2006 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2007 /* character doesn't fit in latin1, retry with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2008 * another fenc when possible, otherwise just
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2009 * report the error. */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2010 if (can_retry)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2011 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2012 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2013 conv_error = readfile_linenr(linecnt, ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2014 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2015 ++dest;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2016 else if (bad_char_behavior == BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2017 *dest = u8c;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2018 else if (eap != NULL && eap->bad_char != 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2019 *dest = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2020 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2021 *dest = 0xBF;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2022 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2023 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2024 *dest = u8c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2025 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2026 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2027
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2028 /* move the linerest to before the converted characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2029 line_start = dest - linerest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2030 mch_memmove(line_start, buffer, (size_t)linerest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2031 size = (long)((ptr + real_size) - dest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2032 ptr = dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2033 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2034 else if (enc_utf8 && !curbuf->b_p_bin)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2035 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2036 int incomplete_tail = FALSE;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2037
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2038 /* Reading UTF-8: Check if the bytes are valid UTF-8. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2039 for (p = ptr; ; ++p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2040 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
2041 int todo = (int)((ptr + size) - p);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2042 int l;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2043
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2044 if (todo <= 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2045 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2046 if (*p >= 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2047 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2048 /* A length of 1 means it's an illegal byte. Accept
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2049 * an incomplete character at the end though, the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 * read() will get the next bytes, we'll check it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 * then. */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2052 l = utf_ptr2len_len(p, todo);
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2053 if (l > todo && !incomplete_tail)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 {
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2055 /* Avoid retrying with a different encoding when
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2056 * a truncated file is more likely, or attempting
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2057 * to read the rest of an incomplete sequence when
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2058 * we have already done so. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2059 if (p > ptr || filesize > 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2060 incomplete_tail = TRUE;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2061 /* Incomplete byte sequence, move it to conv_rest[]
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2062 * and try to read the rest of it, unless we've
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2063 * already done so. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2064 if (p > ptr)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2065 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2066 conv_restlen = todo;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2067 mch_memmove(conv_rest, p, conv_restlen);
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2068 size -= conv_restlen;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2069 break;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2070 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2072 if (l == 1 || l > todo)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2073 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2074 /* Illegal byte. If we can try another encoding
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2075 * do that, unless at EOF where a truncated
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2076 * file is more likely than a conversion error. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2077 if (can_retry && !incomplete_tail)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2078 break;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2079 # ifdef USE_ICONV
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2080 /* When we did a conversion report an error. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2081 if (iconv_fd != (iconv_t)-1 && conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2082 conv_error = readfile_linenr(linecnt, ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2083 # endif
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2084 /* Remember the first linenr with an illegal byte */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2085 if (conv_error == 0 && illegal_byte == 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2086 illegal_byte = readfile_linenr(linecnt, ptr, p);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2087
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2088 /* Drop, keep or replace the bad byte. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2089 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2090 {
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2091 mch_memmove(p, p + 1, todo - 1);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2092 --p;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2093 --size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2094 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2095 else if (bad_char_behavior != BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2096 *p = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2097 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2098 else
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2099 p += l - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2102 if (p < ptr + size && !incomplete_tail)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 /* Detected a UTF-8 error. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105 rewind_retry:
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2106 /* Retry reading with another conversion. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107 # if defined(FEAT_EVAL) && defined(USE_ICONV)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2108 if (*p_ccv != NUL && iconv_fd != (iconv_t)-1)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2109 /* iconv() failed, try 'charconvert' */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2110 did_iconv = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 # endif
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2113 /* use next item from 'fileencodings' */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2114 advance_fenc = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2115 file_rewind = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2116 goto retry;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121 /* count the number of characters (after conversion!) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 filesize += size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125 * when reading the first part of a file: guess EOL type
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2127 if (fileformat == EOL_UNKNOWN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 /* First try finding a NL, for Dos and Unix */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 if (try_dos || try_unix)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131 {
6635
050e6df85f99 updated for version 7.4.643
Bram Moolenaar <bram@vim.org>
parents: 6623
diff changeset
2132 /* Reset the carriage return counter. */
050e6df85f99 updated for version 7.4.643
Bram Moolenaar <bram@vim.org>
parents: 6623
diff changeset
2133 if (try_mac)
050e6df85f99 updated for version 7.4.643
Bram Moolenaar <bram@vim.org>
parents: 6623
diff changeset
2134 try_mac = 1;
050e6df85f99 updated for version 7.4.643
Bram Moolenaar <bram@vim.org>
parents: 6623
diff changeset
2135
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 for (p = ptr; p < ptr + size; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 if (*p == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 if (!try_unix
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141 || (try_dos && p > ptr && p[-1] == CAR))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 fileformat = EOL_DOS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 fileformat = EOL_UNIX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 }
6618
a871b5070d59 updated for version 7.4.635
Bram Moolenaar <bram@vim.org>
parents: 6608
diff changeset
2147 else if (*p == CAR && try_mac)
a871b5070d59 updated for version 7.4.635
Bram Moolenaar <bram@vim.org>
parents: 6608
diff changeset
2148 try_mac++;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 /* Don't give in to EOL_UNIX if EOL_MAC is more likely */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 if (fileformat == EOL_UNIX && try_mac)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 /* Need to reset the counters when retrying fenc. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155 try_mac = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 try_unix = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 for (; p >= ptr && *p != CAR; p--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2159 if (p >= ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2160 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2161 for (p = ptr; p < ptr + size; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2162 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 if (*p == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 try_unix++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 else if (*p == CAR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 try_mac++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 if (try_mac > try_unix)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 fileformat = EOL_MAC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 }
6618
a871b5070d59 updated for version 7.4.635
Bram Moolenaar <bram@vim.org>
parents: 6608
diff changeset
2172 else if (fileformat == EOL_UNKNOWN && try_mac == 1)
a871b5070d59 updated for version 7.4.635
Bram Moolenaar <bram@vim.org>
parents: 6608
diff changeset
2173 /* Looking for CR but found no end-of-line markers at
a871b5070d59 updated for version 7.4.635
Bram Moolenaar <bram@vim.org>
parents: 6608
diff changeset
2174 * all: use the default format. */
a871b5070d59 updated for version 7.4.635
Bram Moolenaar <bram@vim.org>
parents: 6608
diff changeset
2175 fileformat = default_fileformat();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 /* No NL found: may use Mac format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179 if (fileformat == EOL_UNKNOWN && try_mac)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 fileformat = EOL_MAC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 /* Still nothing found? Use first format in 'ffs' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 if (fileformat == EOL_UNKNOWN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 fileformat = default_fileformat();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 /* if editing a new file: may set p_tx and p_ff */
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2187 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188 set_fileformat(fileformat, OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 * This loop is executed once for every character read.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194 * Keep it fast!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2195 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196 if (fileformat == EOL_MAC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 --ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 while (++ptr, --size >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 /* catch most common case first */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 if ((c = *ptr) != NUL && c != CAR && c != NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 *ptr = NL; /* NULs are replaced by newlines! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 else if (c == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 *ptr = CAR; /* NLs are replaced by CRs! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 if (skip_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 *ptr = NUL; /* end of line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2213 len = (colnr_T) (ptr - line_start + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 if (ml_append(lnum, line_start, len, newfile) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 }
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2219 #ifdef FEAT_PERSISTENT_UNDO
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2220 if (read_undo_file)
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2221 sha256_update(&sha_ctx, line_start, len);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2222 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 ++lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 if (--read_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 error = TRUE; /* break loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2227 line_start = ptr; /* nothing left to write */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2228 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2229 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2230 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232 --skip_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 line_start = ptr + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239 --ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2240 while (++ptr, --size >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2241 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 if ((c = *ptr) != NUL && c != NL) /* catch most common case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245 *ptr = NL; /* NULs are replaced by newlines! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2248 if (skip_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2249 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2250 *ptr = NUL; /* end of line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251 len = (colnr_T)(ptr - line_start + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2252 if (fileformat == EOL_DOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2253 {
10674
d6857a8dc07e patch 8.0.0227: crash with ff=dos when first line in file has no CR
Christian Brabandt <cb@256bit.org>
parents: 10668
diff changeset
2254 if (ptr > line_start && ptr[-1] == CAR)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2255 {
10674
d6857a8dc07e patch 8.0.0227: crash with ff=dos when first line in file has no CR
Christian Brabandt <cb@256bit.org>
parents: 10668
diff changeset
2256 /* remove CR before NL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 ptr[-1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2258 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2259 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 * Reading in Dos format, but no CR-LF found!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2262 * When 'fileformats' includes "unix", delete all
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2263 * the lines read so far and start all over again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 * Otherwise give an error message later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266 else if (ff_error != EOL_DOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2267 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2268 if ( try_unix
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2269 && !read_stdin
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270 && (read_buffer
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
2271 || vim_lseek(fd, (off_T)0L, SEEK_SET)
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
2272 == 0))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 fileformat = EOL_UNIX;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2275 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2276 set_fileformat(EOL_UNIX, OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2277 file_rewind = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2278 keep_fileformat = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2279 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2280 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2281 ff_error = EOL_DOS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2283 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2284 if (ml_append(lnum, line_start, len, newfile) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2285 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2286 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2287 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2288 }
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2289 #ifdef FEAT_PERSISTENT_UNDO
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2290 if (read_undo_file)
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2291 sha256_update(&sha_ctx, line_start, len);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2292 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2293 ++lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2294 if (--read_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2295 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 error = TRUE; /* break loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2297 line_start = ptr; /* nothing left to write */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2299 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2300 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2301 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 --skip_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2303 line_start = ptr + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 linerest = (long)(ptr - line_start);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2308 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2309 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 failed:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 /* not an error, max. number of lines reached */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 if (error && read_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314 error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2317 * If we get EOF in the middle of a line, note the fact and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2318 * complete the line ourselves.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2319 * In Dos format ignore a trailing CTRL-Z, unless 'binary' set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2320 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2321 if (!error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2322 && !got_int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2323 && linerest != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2324 && !(!curbuf->b_p_bin
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325 && fileformat == EOL_DOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326 && *line_start == Ctrl_Z
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 && ptr == line_start + 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 {
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2329 /* remember for when writing */
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2330 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331 curbuf->b_p_eol = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2332 *ptr = NUL;
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2333 len = (colnr_T)(ptr - line_start + 1);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2334 if (ml_append(lnum, line_start, len, newfile) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2335 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336 else
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2337 {
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2338 #ifdef FEAT_PERSISTENT_UNDO
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2339 if (read_undo_file)
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2340 sha256_update(&sha_ctx, line_start, len);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2341 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 read_no_eol_lnum = ++lnum;
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2343 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2344 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2346 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 save_file_ff(curbuf); /* remember the current file format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 #ifdef FEAT_CRYPT
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2350 if (curbuf->b_cryptstate != NULL)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2351 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2352 crypt_free_state(curbuf->b_cryptstate);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2353 curbuf->b_cryptstate = NULL;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2354 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2355 if (cryptkey != NULL && cryptkey != curbuf->b_p_key)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2356 crypt_free_key(cryptkey);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2357 /* Don't set cryptkey to NULL, it's used below as a flag that
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2358 * encryption was used. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 #ifdef FEAT_MBYTE
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2362 /* If editing a new file: set 'fenc' for the current buffer.
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2363 * Also for ":read ++edit file". */
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2364 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365 set_string_option_direct((char_u *)"fenc", -1, fenc,
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
2366 OPT_FREE|OPT_LOCAL, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367 if (fenc_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2368 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2369 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2370 if (iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2371 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2372 iconv_close(iconv_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2373 iconv_fd = (iconv_t)-1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2374 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2375 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2376 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2377
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2378 if (!read_buffer && !read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2379 close(fd); /* errors are ignored */
2003
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2380 #ifdef HAVE_FD_CLOEXEC
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2381 else
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2382 {
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2383 int fdflags = fcntl(fd, F_GETFD);
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2384 if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
7961
a7e58c6e4e9a commit https://github.com/vim/vim/commit/fbc4b4db3a9690906a96e16724350a6241cf32a5
Christian Brabandt <cb@256bit.org>
parents: 7856
diff changeset
2385 (void)fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
2003
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2386 }
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2387 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 #ifdef HAVE_DUP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 /* Use stderr for stdin, makes shell commands work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 close(0);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
2395 ignored = dup(2);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 if (tmpname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 mch_remove(tmpname); /* delete converted file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403 vim_free(tmpname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 --no_wait_return; /* may wait for return now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2408 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2409 * In recovery mode everything but autocommands is skipped.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411 if (!recoverymode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2413 /* need to delete the last line, which comes from the empty buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 if (newfile && wasempty && !(curbuf->b_ml.ml_flags & ML_EMPTY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 #ifdef FEAT_NETBEANS_INTG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417 netbeansFireChanges = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 ml_delete(curbuf->b_ml.ml_line_count, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420 #ifdef FEAT_NETBEANS_INTG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2421 netbeansFireChanges = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 --linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 linecnt = curbuf->b_ml.ml_line_count - linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 if (filesize == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 linecnt = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 if (newfile || read_buffer)
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2429 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2430 redraw_curbuf_later(NOT_VALID);
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2431 #ifdef FEAT_DIFF
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2432 /* After reading the text into the buffer the diff info needs to
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2433 * be updated. */
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2434 diff_invalidate(curbuf);
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2435 #endif
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2436 #ifdef FEAT_FOLDING
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2437 /* All folds in the window are invalid now. Mark them for update
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2438 * before triggering autocommands. */
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2439 foldUpdateAll(curwin);
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2440 #endif
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2441 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2442 else if (linecnt) /* appended at least one line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2443 appended_lines_mark(from, linecnt);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2444
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2445 #ifndef ALWAYS_USE_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447 * If we were reading from the same terminal as where messages go,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2448 * the screen will have been messed up.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 * Switch on raw mode now and clear the screen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2450 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2451 if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2452 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2453 settmode(TMODE_RAW); /* set to raw mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454 starttermcap();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2455 screenclear();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2456 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461 if (!(flags & READ_DUMMY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 filemess(curbuf, sfname, (char_u *)_(e_interr), 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2465 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2467 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 check_marks_read();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2470 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2471 return OK; /* an interrupt isn't really an error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2472 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2473
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 if (!filtering && !(flags & READ_DUMMY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2475 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476 msg_add_fname(curbuf, sfname); /* fname in IObuff with quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 c = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480 # ifdef S_ISFIFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2481 if (S_ISFIFO(perm)) /* fifo or socket */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2482 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483 STRCAT(IObuff, _("[fifo/socket]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2485 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2486 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2487 # ifdef S_IFIFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2488 if ((perm & S_IFMT) == S_IFIFO) /* fifo */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2489 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2490 STRCAT(IObuff, _("[fifo]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2491 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2492 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2493 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2494 # ifdef S_IFSOCK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2495 if ((perm & S_IFMT) == S_IFSOCK) /* or socket */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 STRCAT(IObuff, _("[socket]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2498 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2499 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2500 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2501 # endif
1313
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2502 # ifdef OPEN_CHR_FILES
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2503 if (S_ISCHR(perm)) /* or character special */
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2504 {
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2505 STRCAT(IObuff, _("[character special]"));
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2506 c = TRUE;
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2507 }
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2508 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2509 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2510 if (curbuf->b_p_ro)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2511 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2512 STRCAT(IObuff, shortmess(SHM_RO) ? _("[RO]") : _("[readonly]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2513 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2515 if (read_no_eol_lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2516 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517 msg_add_eol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520 if (ff_error == EOL_DOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2521 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2522 STRCAT(IObuff, _("[CR missing]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2523 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525 if (split)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2527 STRCAT(IObuff, _("[long lines split]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2528 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2530 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2531 if (notconverted)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2532 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2533 STRCAT(IObuff, _("[NOT converted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2534 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2536 else if (converted)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2537 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2538 STRCAT(IObuff, _("[converted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2539 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543 if (cryptkey != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2544 {
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2545 crypt_append_msg(curbuf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549 #ifdef FEAT_MBYTE
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2550 if (conv_error != 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2551 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2552 sprintf((char *)IObuff + STRLEN(IObuff),
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2553 _("[CONVERSION ERROR in line %ld]"), (long)conv_error);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 else if (illegal_byte > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 sprintf((char *)IObuff + STRLEN(IObuff),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559 _("[ILLEGAL BYTE in line %ld]"), (long)illegal_byte);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2560 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564 if (error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 STRCAT(IObuff, _("[READ ERRORS]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 if (msg_add_fileformat(fileformat))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2570 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2571 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2572 if (cryptkey != NULL)
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2573 msg_add_lines(c, (long)linecnt, filesize
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2574 - crypt_get_header_len(crypt_get_method_nr(curbuf)));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2575 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2576 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2577 msg_add_lines(c, (long)linecnt, filesize);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2578
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2579 vim_free(keep_msg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2580 keep_msg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2581 msg_scrolled_ign = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2582 #ifdef ALWAYS_USE_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2583 /* Don't show the message when reading stdin, it would end up in a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2584 * message box (which might be shown when exiting!) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2585 if (read_stdin || read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2586 p = msg_may_trunc(FALSE, IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2587 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 p = msg_trunc_attr(IObuff, FALSE, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590 if (read_stdin || read_buffer || restart_edit != 0
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 532
diff changeset
2591 || (msg_scrolled != 0 && !need_wait_return))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 /* Need to repeat the message after redrawing when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 * - When reading from stdin (the screen will be cleared next).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594 * - When restart_edit is set (otherwise there will be a delay
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595 * before redrawing).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 * - When the screen was scrolled but there is no wait-return
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2597 * prompt. */
679
e629de7618da updated for version 7.0203
vimboss
parents: 676
diff changeset
2598 set_keep_msg(p, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 msg_scrolled_ign = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602 /* with errors writing the file requires ":w!" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2603 if (newfile && (error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2604 #ifdef FEAT_MBYTE
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2605 || conv_error != 0
679
e629de7618da updated for version 7.0203
vimboss
parents: 676
diff changeset
2606 || (illegal_byte > 0 && bad_char_behavior != BAD_KEEP)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2607 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2608 ))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2609 curbuf->b_p_ro = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2610
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2611 u_clearline(); /* cannot use "U" command after adding lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2612
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2613 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2614 * In Ex mode: cursor at last new line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2615 * Otherwise: cursor at first new line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2616 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617 if (exmode_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 curwin->w_cursor.lnum = from + linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2619 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620 curwin->w_cursor.lnum = from + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621 check_cursor_lnum();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 beginline(BL_WHITE | BL_FIX); /* on first non-blank */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2624 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625 * Set '[ and '] marks to the newly read lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 curbuf->b_op_start.lnum = from + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628 curbuf->b_op_start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2629 curbuf->b_op_end.lnum = from + linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 curbuf->b_op_end.col = 0;
696
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2631
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2632 #ifdef WIN32
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2633 /*
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2634 * Work around a weird problem: When a file has two links (only
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2635 * possible on NTFS) and we write through one link, then stat() it
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
2636 * through the other link, the timestamp information may be wrong.
696
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2637 * It's correct again after reading the file, thus reset the timestamp
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2638 * here.
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2639 */
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2640 if (newfile && !read_stdin && !read_buffer
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2641 && mch_stat((char *)fname, &st) >= 0)
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2642 {
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2643 buf_store_time(curbuf, &st, fname);
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2644 curbuf->b_mtime_read = curbuf->b_mtime;
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2645 }
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2646 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2651 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2652 * Get the marks before executing autocommands, so they can be used there.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654 check_marks_read();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2655 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2656
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2657 /*
6933
62ba356c2d4e patch 7.4.785
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
2658 * We remember if the last line of the read didn't have
62ba356c2d4e patch 7.4.785
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
2659 * an eol even when 'binary' is off, to support turning 'fixeol' off,
62ba356c2d4e patch 7.4.785
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
2660 * or writing the read again with 'binary' on. The latter is required
62ba356c2d4e patch 7.4.785
Bram Moolenaar <bram@vim.org>
parents: 6721
diff changeset
2661 * for ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2662 */
2707
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
2663 curbuf->b_no_eol_lnum = read_no_eol_lnum;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2664
2482
88751831fa0a When undoing a reload, move the cursor to the first changed line.
Bram Moolenaar <bram@vim.org>
parents: 2410
diff changeset
2665 /* When reloading a buffer put the cursor at the first line that is
88751831fa0a When undoing a reload, move the cursor to the first changed line.
Bram Moolenaar <bram@vim.org>
parents: 2410
diff changeset
2666 * different. */
88751831fa0a When undoing a reload, move the cursor to the first changed line.
Bram Moolenaar <bram@vim.org>
parents: 2410
diff changeset
2667 if (flags & READ_KEEP_UNDO)
88751831fa0a When undoing a reload, move the cursor to the first changed line.
Bram Moolenaar <bram@vim.org>
parents: 2410
diff changeset
2668 u_find_first_changed();
88751831fa0a When undoing a reload, move the cursor to the first changed line.
Bram Moolenaar <bram@vim.org>
parents: 2410
diff changeset
2669
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2670 #ifdef FEAT_PERSISTENT_UNDO
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2671 /*
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2672 * When opening a new file locate undo info and read it.
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2673 */
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2674 if (read_undo_file)
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2675 {
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2676 char_u hash[UNDO_HASH_SIZE];
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2677
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2678 sha256_finish(&sha_ctx, hash);
2238
3d0a7beb0d75 Made reading/writing undo info a bit more robust.
Bram Moolenaar <bram@vim.org>
parents: 2217
diff changeset
2679 u_read_undo(NULL, hash, fname);
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2680 }
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2681 #endif
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2682
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
2683 #ifdef FEAT_AUTOCMD
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
2684 if (!read_stdin && !read_fifo && (!read_buffer || sfname != NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2685 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2686 int m = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2687 int n = msg_scrolled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2688
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2689 /* Save the fileformat now, otherwise the buffer will be considered
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2690 * modified if the format/encoding was automatically detected. */
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2691 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2692 save_file_ff(curbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2693
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2694 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2695 * The output from the autocommands should not overwrite anything and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2696 * should not be overwritten: Set msg_scroll, restore its value if no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2697 * output was done.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2698 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 msg_scroll = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2700 if (filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2701 apply_autocmds_exarg(EVENT_FILTERREADPOST, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2702 FALSE, curbuf, eap);
9828
e84e45786691 commit https://github.com/vim/vim/commit/f71d7b9ee5ceba75f70c30845332ddd728fd16c6
Christian Brabandt <cb@256bit.org>
parents: 9682
diff changeset
2703 else if (newfile || (read_buffer && sfname != NULL))
8937
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2704 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705 apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706 FALSE, curbuf, eap);
8937
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2707 if (!au_did_filetype && *curbuf->b_p_ft != NUL)
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2708 /*
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2709 * EVENT_FILETYPE was not triggered but the buffer already has a
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2710 * filetype. Trigger EVENT_FILETYPE using the existing filetype.
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2711 */
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2712 apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname,
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2713 TRUE, curbuf);
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
2714 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2716 apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2717 FALSE, NULL, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2718 if (msg_scrolled == n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2719 msg_scroll = m;
2707
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
2720 # ifdef FEAT_EVAL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 if (aborting()) /* autocmds may abort script processing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 return FAIL;
2707
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
2723 # endif
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
2724 }
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
2725 #endif
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
2726
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2727 if (recoverymode && error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2728 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2729 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2730 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2731
9911
74e345d2878c commit https://github.com/vim/vim/commit/f04507d132fbcb63999167ec006fc6e700b5af4f
Christian Brabandt <cb@256bit.org>
parents: 9828
diff changeset
2732 #if defined(OPEN_CHR_FILES) || defined(PROTO)
1313
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2733 /*
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2734 * Returns TRUE if the file name argument is of the form "/dev/fd/\d\+",
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2735 * which is the name of files used for process substitution output by
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2736 * some shells on some operating systems, e.g., bash on SunOS.
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2737 * Do not accept "/dev/fd/[012]", opening these may hang Vim.
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2738 */
9911
74e345d2878c commit https://github.com/vim/vim/commit/f04507d132fbcb63999167ec006fc6e700b5af4f
Christian Brabandt <cb@256bit.org>
parents: 9828
diff changeset
2739 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2740 is_dev_fd_file(char_u *fname)
1313
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2741 {
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2742 return (STRNCMP(fname, "/dev/fd/", 8) == 0
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2743 && VIM_ISDIGIT(fname[8])
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2744 && *skipdigits(fname + 9) == NUL
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2745 && (fname[9] != NUL
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2746 || (fname[8] != '0' && fname[8] != '1' && fname[8] != '2')));
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2747 }
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2748 #endif
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2749
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2750 #ifdef FEAT_MBYTE
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2751
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2752 /*
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2753 * From the current line count and characters read after that, estimate the
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2754 * line number where we are now.
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2755 * Used for error messages that include a line number.
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2756 */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2757 static linenr_T
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2758 readfile_linenr(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2759 linenr_T linecnt, /* line count before reading more bytes */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2760 char_u *p, /* start of more bytes read */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2761 char_u *endp) /* end of more bytes read */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2762 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2763 char_u *s;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2764 linenr_T lnum;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2765
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2766 lnum = curbuf->b_ml.ml_line_count - linecnt + 1;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2767 for (s = p; s < endp; ++s)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2768 if (*s == '\n')
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2769 ++lnum;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2770 return lnum;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2771 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2772 #endif
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2773
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 /*
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2775 * Fill "*eap" to force the 'fileencoding', 'fileformat' and 'binary to be
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2776 * equal to the buffer "buf". Used for calling readfile().
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 * Returns OK or FAIL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2780 prep_exarg(exarg_T *eap, buf_T *buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 eap->cmd = alloc((unsigned)(STRLEN(buf->b_p_ff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2783 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 + STRLEN(buf->b_p_fenc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2785 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2786 + 15));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2787 if (eap->cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2790 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791 sprintf((char *)eap->cmd, "e ++ff=%s ++enc=%s", buf->b_p_ff, buf->b_p_fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2792 eap->force_enc = 14 + (int)STRLEN(buf->b_p_ff);
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2793 eap->bad_char = buf->b_bad_char;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2794 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2795 sprintf((char *)eap->cmd, "e ++ff=%s", buf->b_p_ff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 eap->force_ff = 7;
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2798
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2799 eap->force_bin = buf->b_p_bin ? FORCE_BIN : FORCE_NOBIN;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2800 eap->read_edit = FALSE;
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2801 eap->forceit = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804
5231
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2805 /*
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2806 * Set default or forced 'fileformat' and 'binary'.
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2807 */
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2808 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2809 set_file_options(int set_options, exarg_T *eap)
5231
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2810 {
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2811 /* set default 'fileformat' */
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2812 if (set_options)
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2813 {
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2814 if (eap != NULL && eap->force_ff != 0)
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2815 set_fileformat(get_fileformat_force(curbuf, eap), OPT_LOCAL);
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2816 else if (*p_ffs != NUL)
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2817 set_fileformat(default_fileformat(), OPT_LOCAL);
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2818 }
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2819
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2820 /* set or reset 'binary' */
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2821 if (eap != NULL && eap->force_bin != 0)
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2822 {
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2823 int oldval = curbuf->b_p_bin;
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2824
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2825 curbuf->b_p_bin = (eap->force_bin == FORCE_BIN);
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2826 set_options_bin(oldval, curbuf->b_p_bin, OPT_LOCAL);
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2827 }
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2828 }
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2829
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2830 #if defined(FEAT_MBYTE) || defined(PROTO)
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2831 /*
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2832 * Set forced 'fileencoding'.
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2833 */
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2834 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2835 set_forced_fenc(exarg_T *eap)
5231
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2836 {
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2837 if (eap->force_enc != 0)
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2838 {
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2839 char_u *fenc = enc_canonize(eap->cmd + eap->force_enc);
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2840
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2841 if (fenc != NULL)
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2842 set_string_option_direct((char_u *)"fenc", -1,
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2843 fenc, OPT_FREE|OPT_LOCAL, 0);
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2844 vim_free(fenc);
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2845 }
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2846 }
74d2f3188cd0 updated for version 7.4a.041
Bram Moolenaar <bram@vim.org>
parents: 5104
diff changeset
2847
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2848 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2849 * Find next fileencoding to use from 'fileencodings'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2850 * "pp" points to fenc_next. It's advanced to the next item.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2851 * When there are no more items, an empty string is returned and *pp is set to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 * NULL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2853 * When *pp is not set to NULL, the result is in allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2854 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2855 static char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2856 next_fenc(char_u **pp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2857 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2858 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2859 char_u *r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2860
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2861 if (**pp == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2862 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2863 *pp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2864 return (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2865 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2866 p = vim_strchr(*pp, ',');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2867 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2868 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2869 r = enc_canonize(*pp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2870 *pp += STRLEN(*pp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2871 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2872 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2873 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2874 r = vim_strnsave(*pp, (int)(p - *pp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2875 *pp = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2876 if (r != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2877 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2878 p = enc_canonize(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2879 vim_free(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2880 r = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 if (r == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 r = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2886 *pp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 return r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2890
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2892 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2893 * Convert a file with the 'charconvert' expression.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894 * This closes the file which is to be read, converts it and opens the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2895 * resulting file for reading.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2896 * Returns name of the resulting converted file (the caller should delete it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2897 * after reading it).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2898 * Returns NULL if the conversion failed ("*fdp" is not set) .
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2899 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2900 static char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2901 readfile_charconvert(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2902 char_u *fname, /* name of input file */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2903 char_u *fenc, /* converted from */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2904 int *fdp) /* in/out: file descriptor of file */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 char_u *tmpname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 char_u *errmsg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2908
6721
7347229a646a updated for version 7.4.684
Bram Moolenaar <bram@vim.org>
parents: 6635
diff changeset
2909 tmpname = vim_tempname('r', FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2910 if (tmpname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2911 errmsg = (char_u *)_("Can't find temp file for conversion");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2912 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2913 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 close(*fdp); /* close the input file, ignore errors */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2915 *fdp = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2916 if (eval_charconvert(fenc, enc_utf8 ? (char_u *)"utf-8" : p_enc,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 fname, tmpname) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 errmsg = (char_u *)_("Conversion with 'charconvert' failed");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 if (errmsg == NULL && (*fdp = mch_open((char *)tmpname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 O_RDONLY | O_EXTRA, 0)) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 errmsg = (char_u *)_("can't read output of 'charconvert'");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 if (errmsg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926 /* Don't use emsg(), it breaks mappings, the retry with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 * another type of conversion might still work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 MSG(errmsg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2929 if (tmpname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2930 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2931 mch_remove(tmpname); /* delete converted file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2932 vim_free(tmpname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2933 tmpname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2934 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2935 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2936
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2937 /* If the input file is closed, open it (caller should check for error). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2938 if (*fdp < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2939 *fdp = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2940
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941 return tmpname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2943 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2944
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2945 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2946
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2947 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2948 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2949 * Read marks for the current buffer from the viminfo file, when we support
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2950 * buffer marks and the buffer has a name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2953 check_marks_read(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2956 && curbuf->b_ffname != NULL)
1733
5a7384b9ca66 updated for version 7.2-031
vimboss
parents: 1723
diff changeset
2957 read_viminfo(NULL, VIF_WANT_MARKS);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2958
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2959 /* Always set b_marks_read; needed when 'viminfo' is changed to include
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2960 * the ' parameter after opening a buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2961 curbuf->b_marks_read = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2962 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2963 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2964
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2965 #if defined(FEAT_CRYPT) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2966 /*
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2967 * Check for magic number used for encryption. Applies to the current buffer.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2968 * If found, the magic number is removed from ptr[*sizep] and *sizep and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2969 * *filesizep are updated.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2970 * Return the (new) encryption key, NULL for no encryption.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2971 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2972 static char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2973 check_for_cryptkey(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2974 char_u *cryptkey, /* previous encryption key or NULL */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2975 char_u *ptr, /* pointer to read bytes */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2976 long *sizep, /* length of read bytes */
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
2977 off_T *filesizep, /* nr of bytes used from file */
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2978 int newfile, /* editing a new buffer */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2979 char_u *fname, /* file name to display */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
2980 int *did_ask) /* flag: whether already asked for key */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2981 {
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2982 int method = crypt_method_nr_from_magic((char *)ptr, *sizep);
5312
8b5d80861c5e updated for version 7.4.009
Bram Moolenaar <bram@vim.org>
parents: 5278
diff changeset
2983 int b_p_ro = curbuf->b_p_ro;
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2984
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2985 if (method >= 0)
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2986 {
5312
8b5d80861c5e updated for version 7.4.009
Bram Moolenaar <bram@vim.org>
parents: 5278
diff changeset
2987 /* Mark the buffer as read-only until the decryption has taken place.
8b5d80861c5e updated for version 7.4.009
Bram Moolenaar <bram@vim.org>
parents: 5278
diff changeset
2988 * Avoids accidentally overwriting the file with garbage. */
8b5d80861c5e updated for version 7.4.009
Bram Moolenaar <bram@vim.org>
parents: 5278
diff changeset
2989 curbuf->b_p_ro = TRUE;
8b5d80861c5e updated for version 7.4.009
Bram Moolenaar <bram@vim.org>
parents: 5278
diff changeset
2990
6130
86fb698a38d5 updated for version 7.4.403
Bram Moolenaar <bram@vim.org>
parents: 6122
diff changeset
2991 /* Set the cryptmethod local to the buffer. */
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
2992 crypt_set_cm_option(curbuf, method);
2204
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
2993 if (cryptkey == NULL && !*did_ask)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2994 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2995 if (*curbuf->b_p_key)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2996 cryptkey = curbuf->b_p_key;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2997 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2998 {
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2999 /* When newfile is TRUE, store the typed key in the 'key'
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
3000 * option and don't free it. bf needs hash of the key saved.
2204
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
3001 * Don't ask for the key again when first time Enter was hit.
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
3002 * Happens when retrying to detect encoding. */
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
3003 smsg((char_u *)_(need_key_msg), fname);
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
3004 msg_scroll = TRUE;
6353
60659773c73b updated for version 7.4.509
Bram Moolenaar <bram@vim.org>
parents: 6320
diff changeset
3005 crypt_check_method(method);
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3006 cryptkey = crypt_get_key(newfile, FALSE);
2204
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
3007 *did_ask = TRUE;
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
3008
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3009 /* check if empty key entered */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3010 if (cryptkey != NULL && *cryptkey == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3011 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3012 if (cryptkey != curbuf->b_p_key)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3013 vim_free(cryptkey);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3014 cryptkey = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3015 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3016 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3017 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3018
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3019 if (cryptkey != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3020 {
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3021 int header_len;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3022
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3023 curbuf->b_cryptstate = crypt_create_from_header(
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3024 method, cryptkey, ptr);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3025 crypt_set_cm_option(curbuf, method);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3026
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3027 /* Remove cryptmethod specific header from the text. */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3028 header_len = crypt_get_header_len(method);
10221
fb1fde4fcff7 commit https://github.com/vim/vim/commit/680e015bfe19be6772d3bd754486fbd45c1a9d3b
Christian Brabandt <cb@256bit.org>
parents: 10086
diff changeset
3029 if (*sizep <= header_len)
fb1fde4fcff7 commit https://github.com/vim/vim/commit/680e015bfe19be6772d3bd754486fbd45c1a9d3b
Christian Brabandt <cb@256bit.org>
parents: 10086
diff changeset
3030 /* invalid header, buffer can't be encrypted */
fb1fde4fcff7 commit https://github.com/vim/vim/commit/680e015bfe19be6772d3bd754486fbd45c1a9d3b
Christian Brabandt <cb@256bit.org>
parents: 10086
diff changeset
3031 return NULL;
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3032 *filesizep += header_len;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3033 *sizep -= header_len;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3034 mch_memmove(ptr, ptr + header_len, (size_t)*sizep);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3035
5312
8b5d80861c5e updated for version 7.4.009
Bram Moolenaar <bram@vim.org>
parents: 5278
diff changeset
3036 /* Restore the read-only flag. */
8b5d80861c5e updated for version 7.4.009
Bram Moolenaar <bram@vim.org>
parents: 5278
diff changeset
3037 curbuf->b_p_ro = b_p_ro;
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
3038 }
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
3039 }
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
3040 /* When starting to edit a new file which does not have encryption, clear
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
3041 * the 'key' option, except when starting up (called with -x argument) */
2410
8f6106dd3d12 Fix: editing a not encrypted file after a crypted file messed up reading the
Bram Moolenaar <bram@vim.org>
parents: 2394
diff changeset
3042 else if (newfile && *curbuf->b_p_key != NUL && !starting)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 set_option_value((char_u *)"key", 0L, (char_u *)"", OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 return cryptkey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046 }
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3047 #endif /* FEAT_CRYPT */
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3048
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3049 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3051 set_file_time(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3052 char_u *fname,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3053 time_t atime, /* access time */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3054 time_t mtime) /* modification time */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3055 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 # if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057 struct utimbuf buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3059 buf.actime = atime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3060 buf.modtime = mtime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3061 (void)utime((char *)fname, &buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063 # if defined(HAVE_UTIMES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 struct timeval tvp[2];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 tvp[0].tv_sec = atime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067 tvp[0].tv_usec = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3068 tvp[1].tv_sec = mtime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3069 tvp[1].tv_usec = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3070 # ifdef NeXT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3071 (void)utimes((char *)fname, tvp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3072 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 (void)utimes((char *)fname, (const struct timeval *)&tvp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3074 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3075 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3076 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3077 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3078 #endif /* UNIX */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3079
22
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3080 #if defined(VMS) && !defined(MIN)
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3081 /* Older DECC compiler for VAX doesn't define MIN() */
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3082 # define MIN(a, b) ((a) < (b) ? (a) : (b))
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3083 #endif
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3084
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3085 /*
1303
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3086 * Return TRUE if a file appears to be read-only from the file permissions.
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3087 */
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3088 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3089 check_file_readonly(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3090 char_u *fname, /* full path to file */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3091 int perm) /* known permissions on file */
1303
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3092 {
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3093 #ifndef USE_MCH_ACCESS
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3094 int fd = 0;
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3095 #endif
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3096
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3097 return (
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3098 #ifdef USE_MCH_ACCESS
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3099 # ifdef UNIX
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3100 (perm & 0222) == 0 ||
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3101 # endif
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3102 mch_access((char *)fname, W_OK)
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3103 #else
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3104 (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3105 ? TRUE : (close(fd), FALSE)
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3106 #endif
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3107 );
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3108 }
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3109
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3110
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3111 /*
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3112 * buf_write() - write to file "fname" lines "start" through "end"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 * We do our own buffering here because fwrite() is so slow.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 *
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3116 * If "forceit" is true, we don't care for errors when attempting backups.
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3117 * In case of an error everything possible is done to restore the original
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1688
diff changeset
3118 * file. But when "forceit" is TRUE, we risk losing it.
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3119 *
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3120 * When "reset_changed" is TRUE and "append" == FALSE and "start" == 1 and
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3121 * "end" == curbuf->b_ml.ml_line_count, reset curbuf->b_changed.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3122 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3123 * This function must NOT use NameBuff (because it's called by autowrite()).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3124 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3125 * return FAIL for failure, OK otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3126 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3127 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3128 buf_write(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3129 buf_T *buf,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3130 char_u *fname,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3131 char_u *sfname,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3132 linenr_T start,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3133 linenr_T end,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3134 exarg_T *eap, /* for forced 'ff' and 'fenc', can be
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135 NULL! */
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3136 int append, /* append to the file */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3137 int forceit,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3138 int reset_changed,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
3139 int filtering)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 int fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3142 char_u *backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 int backup_copy = FALSE; /* copy the original file? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144 int dobackup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 char_u *ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 char_u *wfname = NULL; /* name of file to write to */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3148 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149 char_u c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3152 long nchars;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 char_u *errmsg = NULL;
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
3154 int errmsg_allocated = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155 char_u *errnum = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 char_u *buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 char_u smallbuf[SMBUFSIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 char_u *backup_ext;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159 int bufsize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160 long perm; /* file permissions */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 int retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 int newfile = FALSE; /* TRUE if file doesn't exist yet */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 int msg_save = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 int overwriting; /* TRUE if writing over original */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3165 int no_eol = FALSE; /* no end-of-line written */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 int device = FALSE; /* writing to a device */
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
3167 stat_T st_old;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 int prev_got_int = got_int;
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
3169 int checking_conversion;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170 int file_readonly = FALSE; /* overwritten file is read-only */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3171 static char *err_readonly = "is read-only (cannot override: \"W\" in 'cpoptions')";
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9509
diff changeset
3172 #if defined(UNIX) /*XXX fix me sometime? */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173 int made_writable = FALSE; /* 'w' bit has been set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175 /* writing everything */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 int whole = (start == 1 && end == buf->b_ml.ml_line_count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 linenr_T old_line_count = buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 int attr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 int fileformat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 int write_bin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183 struct bw_info write_info; /* info for buf_write_bytes() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3184 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3185 int converted = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3186 int notconverted = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3187 char_u *fenc; /* effective 'fileencoding' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188 char_u *fenc_tofree = NULL; /* allocated "fenc" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3190 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3191 int wb_flags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3192 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3193 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3194 vim_acl_T acl = NULL; /* ACL copied from original file to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3195 backup or new file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3196 #endif
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
3197 #ifdef FEAT_PERSISTENT_UNDO
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
3198 int write_undo_file = FALSE;
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
3199 context_sha256_T sha_ctx;
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
3200 #endif
6243
54194bd6ed60 updated for version 7.4.456
Bram Moolenaar <bram@vim.org>
parents: 6201
diff changeset
3201 unsigned int bkc = get_bkc_value(buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3202
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3203 if (fname == NULL || *fname == NUL) /* safety check */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3204 return FAIL;
2028
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3205 if (buf->b_ml.ml_mfp == NULL)
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3206 {
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3207 /* This can happen during startup when there is a stray "w" in the
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3208 * vimrc file. */
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3209 EMSG(_(e_emptybuf));
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3210 return FAIL;
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3211 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3212
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3213 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3214 * Disallow writing from .exrc and .vimrc in current directory for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3215 * security reasons.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3216 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3217 if (check_secure())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3218 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3219
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3220 /* Avoid a crash for a long name. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3221 if (STRLEN(fname) >= MAXPATHL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3222 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3223 EMSG(_(e_longname));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3224 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3225 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3226
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3227 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3228 /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3229 write_info.bw_conv_buf = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3230 write_info.bw_conv_error = FALSE;
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
3231 write_info.bw_conv_error_lnum = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3232 write_info.bw_restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3233 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3234 write_info.bw_iconv_fd = (iconv_t)-1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3235 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3236 #endif
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3237 #ifdef FEAT_CRYPT
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3238 write_info.bw_buffer = buf;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
3239 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3240
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3241 /* After writing a file changedtick changes but we don't want to display
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3242 * the line. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3243 ex_no_reprint = TRUE;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3244
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3245 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3246 * If there is no file name yet, use the one for the written file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3247 * BF_NOTEDITED is set to reflect this (in case the write fails).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3248 * Don't do this when the write is for a filter command.
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3249 * Don't do this when appending.
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3250 * Only do this when 'cpoptions' contains the 'F' flag.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3251 */
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
3252 if (buf->b_ffname == NULL
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
3253 && reset_changed
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3254 && whole
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3255 && buf == curbuf
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 216
diff changeset
3256 #ifdef FEAT_QUICKFIX
4707450c2b33 updated for version 7.0066
vimboss
parents: 216
diff changeset
3257 && !bt_nofile(buf)
4707450c2b33 updated for version 7.0066
vimboss
parents: 216
diff changeset
3258 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3259 && !filtering
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3260 && (!append || vim_strchr(p_cpo, CPO_FNAMEAPP) != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3261 && vim_strchr(p_cpo, CPO_FNAMEW) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3262 {
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
3263 if (set_rw_fname(fname, sfname) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3264 return FAIL;
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
3265 buf = curbuf; /* just in case autocmds made "buf" invalid */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3266 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3267
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3268 if (sfname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3269 sfname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3270 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3271 * For Unix: Use the short file name whenever possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3272 * Avoids problems with networks and when directory names are changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3273 * Don't do this for MS-DOS, a "cd" in a sub-shell may have moved us to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3274 * another directory, which we don't detect
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3275 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3276 ffname = fname; /* remember full fname */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3277 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3278 fname = sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3279 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3280
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3281 if (buf->b_ffname != NULL && fnamecmp(ffname, buf->b_ffname) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3282 overwriting = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3283 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3284 overwriting = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3285
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3286 if (exiting)
4352
04736b4030ec updated for version 7.3.925
Bram Moolenaar <bram@vim.org>
parents: 4331
diff changeset
3287 settmode(TMODE_COOK); /* when exiting allow typeahead now */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3288
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3289 ++no_wait_return; /* don't wait for return yet */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3290
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3291 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3292 * Set '[ and '] marks to the lines to be written.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3293 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3294 buf->b_op_start.lnum = start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3295 buf->b_op_start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3296 buf->b_op_end.lnum = end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3297 buf->b_op_end.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3298
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3299 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3300 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3301 aco_save_T aco;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3302 int buf_ffname = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3303 int buf_sfname = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3304 int buf_fname_f = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3305 int buf_fname_s = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3306 int did_cmd = FALSE;
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3307 int nofile_err = FALSE;
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
3308 int empty_memline = (buf->b_ml.ml_mfp == NULL);
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
3309 bufref_T bufref;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3311 /*
4352
04736b4030ec updated for version 7.3.925
Bram Moolenaar <bram@vim.org>
parents: 4331
diff changeset
3312 * Apply PRE autocommands.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3313 * Set curbuf to the buffer to be written.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3314 * Careful: The autocommands may call buf_write() recursively!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3315 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3316 if (ffname == buf->b_ffname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3317 buf_ffname = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3318 if (sfname == buf->b_sfname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3319 buf_sfname = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3320 if (fname == buf->b_ffname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3321 buf_fname_f = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3322 if (fname == buf->b_sfname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3323 buf_fname_s = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3325 /* set curwin/curbuf to buf and save a few things */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3326 aucmd_prepbuf(&aco, buf);
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
3327 set_bufref(&bufref, buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3328
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3329 if (append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3330 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3331 if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEAPPENDCMD,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3332 sfname, sfname, FALSE, curbuf, eap)))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3333 {
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3334 #ifdef FEAT_QUICKFIX
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
3335 if (overwriting && bt_nofile(curbuf))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3336 nofile_err = TRUE;
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3337 else
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3338 #endif
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3339 apply_autocmds_exarg(EVENT_FILEAPPENDPRE,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3340 sfname, sfname, FALSE, curbuf, eap);
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3341 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3343 else if (filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3344 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3345 apply_autocmds_exarg(EVENT_FILTERWRITEPRE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3346 NULL, sfname, FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3347 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3348 else if (reset_changed && whole)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3349 {
3036
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3350 int was_changed = curbufIsChanged();
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3351
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3352 did_cmd = apply_autocmds_exarg(EVENT_BUFWRITECMD,
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3353 sfname, sfname, FALSE, curbuf, eap);
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3354 if (did_cmd)
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3355 {
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3356 if (was_changed && !curbufIsChanged())
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3357 {
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3358 /* Written everything correctly and BufWriteCmd has reset
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3359 * 'modified': Correct the undo information so that an
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3360 * undo now sets 'modified'. */
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3361 u_unchanged(curbuf);
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3362 u_update_save_nr(curbuf);
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3363 }
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3364 }
df33dba4e553 updated for version 7.3.290
Bram Moolenaar <bram@vim.org>
parents: 2976
diff changeset
3365 else
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3366 {
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3367 #ifdef FEAT_QUICKFIX
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
3368 if (overwriting && bt_nofile(curbuf))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3369 nofile_err = TRUE;
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3370 else
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3371 #endif
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3372 apply_autocmds_exarg(EVENT_BUFWRITEPRE,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3373 sfname, sfname, FALSE, curbuf, eap);
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3374 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3375 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3376 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3377 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3378 if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEWRITECMD,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3379 sfname, sfname, FALSE, curbuf, eap)))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3380 {
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3381 #ifdef FEAT_QUICKFIX
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
3382 if (overwriting && bt_nofile(curbuf))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3383 nofile_err = TRUE;
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3384 else
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3385 #endif
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3386 apply_autocmds_exarg(EVENT_FILEWRITEPRE,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3387 sfname, sfname, FALSE, curbuf, eap);
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3388 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3389 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3390
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3391 /* restore curwin/curbuf and a few other things */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3392 aucmd_restbuf(&aco);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3393
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3394 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3395 * In three situations we return here and don't write the file:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3396 * 1. the autocommands deleted or unloaded the buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3397 * 2. The autocommands abort script processing.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3398 * 3. If one of the "Cmd" autocommands was executed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3399 */
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
3400 if (!bufref_valid(&bufref))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3401 buf = NULL;
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
3402 if (buf == NULL || (buf->b_ml.ml_mfp == NULL && !empty_memline)
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3403 || did_cmd || nofile_err
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3404 #ifdef FEAT_EVAL
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3405 || aborting()
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3406 #endif
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3407 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3408 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3409 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3410 msg_scroll = msg_save;
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3411 if (nofile_err)
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3412 EMSG(_("E676: No matching autocommands for acwrite buffer"));
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3413
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3414 if (nofile_err
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3415 #ifdef FEAT_EVAL
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3416 || aborting()
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3417 #endif
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3418 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3419 /* An aborting error, interrupt or exception in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3420 * autocommands. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3421 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3422 if (did_cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3423 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3424 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3425 /* The buffer was deleted. We assume it was written
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3426 * (can't retry anyway). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3427 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3428 if (overwriting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3429 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3430 /* Assume the buffer was written, update the timestamp. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3431 ml_timestamp(buf);
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3432 if (append)
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3433 buf->b_flags &= ~BF_NEW;
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3434 else
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3435 buf->b_flags &= ~BF_WRITE_MASK;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3436 }
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3437 if (reset_changed && buf->b_changed && !append
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
3438 && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3439 /* Buffer still changed, the autocommands didn't work
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3440 * properly. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3441 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3442 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3443 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3444 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3445 if (!aborting())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3446 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3447 EMSG(_("E203: Autocommands deleted or unloaded buffer to be written"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3448 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3449 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3450
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3451 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3452 * The autocommands may have changed the number of lines in the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3453 * When writing the whole file, adjust the end.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3454 * When writing part of the file, assume that the autocommands only
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3455 * changed the number of lines that are to be written (tricky!).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3456 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3457 if (buf->b_ml.ml_line_count != old_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3458 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3459 if (whole) /* write all */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3460 end = buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3461 else if (buf->b_ml.ml_line_count > old_line_count) /* more lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3462 end += buf->b_ml.ml_line_count - old_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3463 else /* less lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3464 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3465 end -= old_line_count - buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3466 if (end < start)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3467 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3468 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3469 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3470 EMSG(_("E204: Autocommand changed number of lines in unexpected way"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3471 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3472 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3473 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3474 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3475
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3476 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3477 * The autocommands may have changed the name of the buffer, which may
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3478 * be kept in fname, ffname and sfname.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3479 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3480 if (buf_ffname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3481 ffname = buf->b_ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3482 if (buf_sfname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3483 sfname = buf->b_sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3484 if (buf_fname_f)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3485 fname = buf->b_ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3486 if (buf_fname_s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3487 fname = buf->b_sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3488 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3489 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3490
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3491 #ifdef FEAT_NETBEANS_INTG
2210
8c6a66e2b3cc Add :nbstart and :nbclose.
Bram Moolenaar <bram@vim.org>
parents: 2204
diff changeset
3492 if (netbeans_active() && isNetbeansBuffer(buf))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3493 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3494 if (whole)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3495 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3496 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3497 * b_changed can be 0 after an undo, but we still need to write
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3498 * the buffer to NetBeans.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3499 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3500 if (buf->b_changed || isNetbeansModified(buf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3501 {
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
3502 --no_wait_return; /* may wait for return now */
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
3503 msg_scroll = msg_save;
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
3504 netbeans_save_buffer(buf); /* no error checking... */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3505 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3506 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3507 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3508 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3509 errnum = (char_u *)"E656: ";
1653
d166fe2bfe74 updated for version 7.2a-005
vimboss
parents: 1651
diff changeset
3510 errmsg = (char_u *)_("NetBeans disallows writes of unmodified buffers");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3511 buffer = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3512 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3513 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3514 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3515 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3516 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3517 errnum = (char_u *)"E657: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3518 errmsg = (char_u *)_("Partial writes disallowed for NetBeans buffers");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3519 buffer = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3520 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3521 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3522 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3523 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3525 if (shortmess(SHM_OVER) && !exiting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3526 msg_scroll = FALSE; /* overwrite previous file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3527 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3528 msg_scroll = TRUE; /* don't overwrite previous file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3529 if (!filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3530 filemess(buf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3531 #ifndef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3532 sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3533 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3534 fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3535 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3536 (char_u *)"", 0); /* show that we are busy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3537 msg_scroll = FALSE; /* always overwrite the file message now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3539 buffer = alloc(BUFSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3540 if (buffer == NULL) /* can't allocate big buffer, use small
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3541 * one (to be able to write when out of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3542 * memory) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3543 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3544 buffer = smallbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3545 bufsize = SMBUFSIZE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3546 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3547 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3548 bufsize = BUFSIZE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3549
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3550 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3551 * Get information about original file (if there is one).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3552 */
7410
08e62c4fc17d commit https://github.com/vim/vim/commit/53076830fea6df737455523f7e235bfe4f79864d
Christian Brabandt <cb@256bit.org>
parents: 7408
diff changeset
3553 #if defined(UNIX)
1438
c7654c4db8fd updated for version 7.1-153
vimboss
parents: 1431
diff changeset
3554 st_old.st_dev = 0;
c7654c4db8fd updated for version 7.1-153
vimboss
parents: 1431
diff changeset
3555 st_old.st_ino = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3556 perm = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3557 if (mch_stat((char *)fname, &st_old) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3558 newfile = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3559 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3560 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3561 perm = st_old.st_mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3562 if (!S_ISREG(st_old.st_mode)) /* not a file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3563 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3564 if (S_ISDIR(st_old.st_mode))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3565 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3566 errnum = (char_u *)"E502: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3567 errmsg = (char_u *)_("is a directory");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3568 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3569 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3570 if (mch_nodetype(fname) != NODE_WRITABLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3571 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3572 errnum = (char_u *)"E503: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3573 errmsg = (char_u *)_("is not a file or writable device");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3574 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3575 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3576 /* It's a device of some kind (or a fifo) which we can write to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3577 * but for which we can't make a backup. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3578 device = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3579 newfile = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3580 perm = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3581 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3582 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3583 #else /* !UNIX */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3584 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3585 * Check for a writable device name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3586 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3587 c = mch_nodetype(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3588 if (c == NODE_OTHER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3589 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3590 errnum = (char_u *)"E503: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3591 errmsg = (char_u *)_("is not a file or writable device");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3592 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3593 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3594 if (c == NODE_WRITABLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3595 {
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3596 # if defined(MSWIN)
1004
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3597 /* MS-Windows allows opening a device, but we will probably get stuck
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3598 * trying to write to it. */
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3599 if (!p_odev)
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3600 {
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3601 errnum = (char_u *)"E796: ";
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3602 errmsg = (char_u *)_("writing to device disabled with 'opendevice' option");
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3603 goto fail;
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3604 }
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3605 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3606 device = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3607 newfile = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3608 perm = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3609 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3610 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3611 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3612 perm = mch_getperm(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3613 if (perm < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3614 newfile = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3615 else if (mch_isdir(fname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3616 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3617 errnum = (char_u *)"E502: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3618 errmsg = (char_u *)_("is a directory");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3619 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3620 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3621 if (overwriting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3622 (void)mch_stat((char *)fname, &st_old);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3623 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3624 #endif /* !UNIX */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3625
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3626 if (!device && !newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3627 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3628 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3629 * Check if the file is really writable (when renaming the file to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3630 * make a backup we won't discover it later).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3631 */
1303
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3632 file_readonly = check_file_readonly(fname, (int)perm);
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3633
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3634 if (!forceit && file_readonly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3635 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3636 if (vim_strchr(p_cpo, CPO_FWRITE) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3637 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3638 errnum = (char_u *)"E504: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3639 errmsg = (char_u *)_(err_readonly);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3640 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3641 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3642 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3643 errnum = (char_u *)"E505: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3644 errmsg = (char_u *)_("is read-only (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3645 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3646 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3647 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3648
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3649 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3650 * Check if the timestamp hasn't changed since reading the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3651 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3652 if (overwriting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3653 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3654 retval = check_mtime(buf, &st_old);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3655 if (retval == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3656 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3657 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3658 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3659
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3660 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3661 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3662 * For systems that support ACL: get the ACL from the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3663 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3664 if (!newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3665 acl = mch_get_acl(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3666 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3667
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3668 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3669 * If 'backupskip' is not empty, don't make a backup for some files.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3670 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3671 dobackup = (p_wb || p_bk || *p_pm != NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3672 #ifdef FEAT_WILDIGN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3673 if (dobackup && *p_bsk != NUL && match_file_list(p_bsk, sfname, ffname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3674 dobackup = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3675 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3676
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3677 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3678 * Save the value of got_int and reset it. We don't want a previous
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3679 * interruption cancel writing, only hitting CTRL-C while writing should
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3680 * abort it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3681 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3682 prev_got_int = got_int;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3683 got_int = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3684
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3685 /* Mark the buffer as 'being saved' to prevent changed buffer warnings */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3686 buf->b_saving = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3687
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3688 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3689 * If we are not appending or filtering, the file exists, and the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3690 * 'writebackup', 'backup' or 'patchmode' option is set, need a backup.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3691 * When 'patchmode' is set also make a backup when appending.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3692 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3693 * Do not make any backup, if 'writebackup' and 'backup' are both switched
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3694 * off. This helps when editing large files on almost-full disks.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3695 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3696 if (!(append && *p_pm == NUL) && !filtering && perm >= 0 && dobackup)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3697 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3698 #if defined(UNIX) || defined(WIN32)
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
3699 stat_T st;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3700 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3701
6243
54194bd6ed60 updated for version 7.4.456
Bram Moolenaar <bram@vim.org>
parents: 6201
diff changeset
3702 if ((bkc & BKC_YES) || append) /* "yes" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3703 backup_copy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3704 #if defined(UNIX) || defined(WIN32)
6243
54194bd6ed60 updated for version 7.4.456
Bram Moolenaar <bram@vim.org>
parents: 6201
diff changeset
3705 else if ((bkc & BKC_AUTO)) /* "auto" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3706 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3707 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3708
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3709 # ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3710 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3711 * Don't rename the file when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3712 * - it's a hard link
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3713 * - it's a symbolic link
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3714 * - we don't have write permission in the directory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3715 * - we can't set the owner/group of the new file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3716 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3717 if (st_old.st_nlink > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3718 || mch_lstat((char *)fname, &st) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3719 || st.st_dev != st_old.st_dev
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3720 || st.st_ino != st_old.st_ino
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3721 # ifndef HAVE_FCHOWN
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3722 || st.st_uid != st_old.st_uid
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3723 || st.st_gid != st_old.st_gid
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3724 # endif
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3725 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3726 backup_copy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3727 else
696
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3728 # else
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3729 # ifdef WIN32
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3730 /* On NTFS file systems hard links are possible. */
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3731 if (mch_is_linked(fname))
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3732 backup_copy = TRUE;
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3733 else
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3734 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3735 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3736 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3737 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3738 * Check if we can create a file and set the owner/group to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3739 * the ones from the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3740 * First find a file name that doesn't exist yet (use some
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3741 * arbitrary numbers).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3742 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3743 STRCPY(IObuff, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3744 for (i = 4913; ; i += 123)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3745 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3746 sprintf((char *)gettail(IObuff), "%d", i);
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3747 if (mch_lstat((char *)IObuff, &st) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3748 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3749 }
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3750 fd = mch_open((char *)IObuff,
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3751 O_CREAT|O_WRONLY|O_EXCL|O_NOFOLLOW, perm);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3752 if (fd < 0) /* can't write in directory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3753 backup_copy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3754 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3755 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3756 # ifdef UNIX
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3757 # ifdef HAVE_FCHOWN
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
3758 ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3759 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3760 if (mch_stat((char *)IObuff, &st) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3761 || st.st_uid != st_old.st_uid
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3762 || st.st_gid != st_old.st_gid
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
3763 || (long)st.st_mode != perm)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3764 backup_copy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3765 # endif
567
afd8e69dba19 updated for version 7.0161
vimboss
parents: 557
diff changeset
3766 /* Close the file before removing it, on MS-Windows we
afd8e69dba19 updated for version 7.0161
vimboss
parents: 557
diff changeset
3767 * can't delete an open file. */
afd8e69dba19 updated for version 7.0161
vimboss
parents: 557
diff changeset
3768 close(fd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3769 mch_remove(IObuff);
2523
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3770 # ifdef MSWIN
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3771 /* MS-Windows may trigger a virus scanner to open the
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3772 * file, we can't delete it then. Keep trying for half a
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3773 * second. */
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3774 {
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3775 int try;
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3776
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3777 for (try = 0; try < 10; ++try)
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3778 {
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3779 if (mch_lstat((char *)IObuff, &st) < 0)
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3780 break;
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3781 ui_delay(50L, TRUE); /* wait 50 msec */
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3782 mch_remove(IObuff);
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3783 }
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3784 }
0dffdd8f8871 Fixed: on MS-Windows sometimes files with number 4913 or higher are left
Bram Moolenaar <bram@vim.org>
parents: 2482
diff changeset
3785 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3786 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3787 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3788 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3789
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3790 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3791 * Break symlinks and/or hardlinks if we've been asked to.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3792 */
6243
54194bd6ed60 updated for version 7.4.456
Bram Moolenaar <bram@vim.org>
parents: 6201
diff changeset
3793 if ((bkc & BKC_BREAKSYMLINK) || (bkc & BKC_BREAKHARDLINK))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3794 {
4872
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3795 # ifdef UNIX
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3796 int lstat_res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3797
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3798 lstat_res = mch_lstat((char *)fname, &st);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3799
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3800 /* Symlinks. */
6243
54194bd6ed60 updated for version 7.4.456
Bram Moolenaar <bram@vim.org>
parents: 6201
diff changeset
3801 if ((bkc & BKC_BREAKSYMLINK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3802 && lstat_res == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3803 && st.st_ino != st_old.st_ino)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3804 backup_copy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3805
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3806 /* Hardlinks. */
6243
54194bd6ed60 updated for version 7.4.456
Bram Moolenaar <bram@vim.org>
parents: 6201
diff changeset
3807 if ((bkc & BKC_BREAKHARDLINK)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3808 && st_old.st_nlink > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3809 && (lstat_res != 0 || st.st_ino == st_old.st_ino))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3810 backup_copy = FALSE;
4872
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3811 # else
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3812 # if defined(WIN32)
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3813 /* Symlinks. */
6243
54194bd6ed60 updated for version 7.4.456
Bram Moolenaar <bram@vim.org>
parents: 6201
diff changeset
3814 if ((bkc & BKC_BREAKSYMLINK) && mch_is_symbolic_link(fname))
4872
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3815 backup_copy = FALSE;
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3816
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3817 /* Hardlinks. */
6243
54194bd6ed60 updated for version 7.4.456
Bram Moolenaar <bram@vim.org>
parents: 6201
diff changeset
3818 if ((bkc & BKC_BREAKHARDLINK) && mch_is_hard_link(fname))
4872
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3819 backup_copy = FALSE;
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3820 # endif
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3821 # endif
fa98c2b030ed updated for version 7.3.1182
Bram Moolenaar <bram@vim.org>
parents: 4861
diff changeset
3822 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3823
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3824 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3825
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3826 /* make sure we have a valid backup extension to use */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3827 if (*p_bex == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3828 backup_ext = (char_u *)".bak";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3829 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3830 backup_ext = p_bex;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3831
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3832 if (backup_copy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3833 && (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3834 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3835 int bfd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3836 char_u *copybuf, *wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3837 int some_error = FALSE;
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
3838 stat_T st_new;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3839 char_u *dirp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3840 char_u *rootname;
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3841 #if defined(UNIX)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3842 int did_set_shortname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3843 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3844
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3845 copybuf = alloc(BUFSIZE + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3846 if (copybuf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3847 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3848 some_error = TRUE; /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3849 goto nobackup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3850 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3851
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3852 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3853 * Try to make the backup in each directory in the 'bdir' option.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3854 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3855 * Unix semantics has it, that we may have a writable file,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3856 * that cannot be recreated with a simple open(..., O_CREAT, ) e.g:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3857 * - the directory is not writable,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3858 * - the file may be a symbolic link,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3859 * - the file may belong to another user/group, etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3860 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3861 * For these reasons, the existing writable file must be truncated
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3862 * and reused. Creation of a backup COPY will be attempted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3863 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3864 dirp = p_bdir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3865 while (*dirp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3866 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3867 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3868 st_new.st_ino = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3869 st_new.st_dev = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3870 st_new.st_gid = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3871 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3872
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3873 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3874 * Isolate one directory name, using an entry in 'bdir'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3875 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3876 (void)copy_option_part(&dirp, copybuf, BUFSIZE, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3877 rootname = get_file_in_dir(fname, copybuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3878 if (rootname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3879 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3880 some_error = TRUE; /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3881 goto nobackup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3882 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3883
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3884 #if defined(UNIX)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3885 did_set_shortname = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3886 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3887
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3888 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3889 * May try twice if 'shortname' not set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3890 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3891 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3892 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3893 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3894 * Make backup file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3895 */
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
3896 backup = buf_modname((buf->b_p_sn || buf->b_shortname),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3897 rootname, backup_ext, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3898 if (backup == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3899 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3900 vim_free(rootname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3901 some_error = TRUE; /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3902 goto nobackup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3903 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3904
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3905 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3906 * Check if backup file already exists.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3907 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3908 if (mch_stat((char *)backup, &st_new) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3909 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3910 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3911 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3912 * Check if backup file is same as original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3913 * May happen when modname() gave the same file back.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3914 * E.g. silly link, or file name-length reached.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3915 * If we don't check here, we either ruin the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3916 * when copying or erase it after writing. jw.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3917 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3918 if (st_new.st_dev == st_old.st_dev
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3919 && st_new.st_ino == st_old.st_ino)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3920 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3921 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3922 backup = NULL; /* no backup file to delete */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3923 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3924 * may try again with 'shortname' set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3925 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3926 if (!(buf->b_shortname || buf->b_p_sn))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3927 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3928 buf->b_shortname = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3929 did_set_shortname = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3930 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3931 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3932 /* setting shortname didn't help */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3933 if (did_set_shortname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3934 buf->b_shortname = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3935 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3936 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3937 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3938
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3939 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3940 * If we are not going to keep the backup file, don't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3941 * delete an existing one, try to use another name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3942 * Change one character, just before the extension.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3943 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3944 if (!p_bk)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3945 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3946 wp = backup + STRLEN(backup) - 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3947 - STRLEN(backup_ext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3948 if (wp < backup) /* empty file name ??? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3949 wp = backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3950 *wp = 'z';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3951 while (*wp > 'a'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3952 && mch_stat((char *)backup, &st_new) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3953 --*wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3954 /* They all exist??? Must be something wrong. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3955 if (*wp == 'a')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3956 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3957 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3958 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3959 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3960 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3961 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3962 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3963 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3964 vim_free(rootname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3965
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3966 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3967 * Try to create the backup file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3968 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3969 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3970 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3971 /* remove old backup, if present */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3972 mch_remove(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3973 /* Open with O_EXCL to avoid the file being created while
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3974 * we were sleeping (symlink hacker attack?) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3975 bfd = mch_open((char *)backup,
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3976 O_WRONLY|O_CREAT|O_EXTRA|O_EXCL|O_NOFOLLOW,
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3977 perm & 0777);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3978 if (bfd < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3979 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3980 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3981 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3982 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3983 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3984 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3985 /* set file protection same as original file, but
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3986 * strip s-bit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3987 (void)mch_setperm(backup, perm & 0777);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3988
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3989 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3990 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3991 * Try to set the group of the backup same as the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3992 * original file. If this fails, set the protection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3993 * bits for the group same as the protection bits for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3994 * others.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3995 */
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3996 if (st_new.st_gid != st_old.st_gid
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3997 # ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3998 && fchown(bfd, (uid_t)-1, st_old.st_gid) != 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3999 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4000 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4001 mch_setperm(backup,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4002 (perm & 0707) | ((perm & 07) << 3));
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
4003 # if defined(HAVE_SELINUX) || defined(HAVE_SMACK)
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4004 mch_copy_sec(fname, backup);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4005 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4006 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4007
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4008 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4009 * copy the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4010 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4011 write_info.bw_fd = bfd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4012 write_info.bw_buf = copybuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4013 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4014 write_info.bw_flags = FIO_NOCONVERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4015 #endif
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
4016 while ((write_info.bw_len = read_eintr(fd, copybuf,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4017 BUFSIZE)) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4018 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4019 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4020 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4021 errmsg = (char_u *)_("E506: Can't write to backup file (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4022 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4023 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4024 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4025 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4026 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4027 errmsg = (char_u *)_(e_interr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4028 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4029 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4030 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4031
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4032 if (close(bfd) < 0 && errmsg == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4033 errmsg = (char_u *)_("E507: Close error for backup file (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4034 if (write_info.bw_len < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4035 errmsg = (char_u *)_("E508: Can't read file for backup (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4036 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4037 set_file_time(backup, st_old.st_atime, st_old.st_mtime);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4038 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4039 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4040 mch_set_acl(backup, acl);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4041 #endif
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
4042 #if defined(HAVE_SELINUX) || defined(HAVE_SMACK)
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4043 mch_copy_sec(fname, backup);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4044 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4045 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4046 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4047 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4048 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4049 nobackup:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4050 close(fd); /* ignore errors for closing read file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4051 vim_free(copybuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4052
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4053 if (backup == NULL && errmsg == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4054 errmsg = (char_u *)_("E509: Cannot create backup file (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4055 /* ignore errors when forceit is TRUE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4056 if ((some_error || errmsg != NULL) && !forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4057 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4058 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4059 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4060 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4061 errmsg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4062 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4063 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4064 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4065 char_u *dirp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4066 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4067 char_u *rootname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4068
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4069 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4070 * Make a backup by renaming the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4071 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4072 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4073 * If 'cpoptions' includes the "W" flag, we don't want to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4074 * overwrite a read-only file. But rename may be possible
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4075 * anyway, thus we need an extra check here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4076 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4077 if (file_readonly && vim_strchr(p_cpo, CPO_FWRITE) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4078 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4079 errnum = (char_u *)"E504: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4080 errmsg = (char_u *)_(err_readonly);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4081 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4082 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4083
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4084 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4085 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4086 * Form the backup file name - change path/fo.o.h to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4087 * path/fo.o.h.bak Try all directories in 'backupdir', first one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4088 * that works is used.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4089 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4090 dirp = p_bdir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4091 while (*dirp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4092 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4093 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4094 * Isolate one directory name and make the backup file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4095 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4096 (void)copy_option_part(&dirp, IObuff, IOSIZE, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4097 rootname = get_file_in_dir(fname, IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4098 if (rootname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4099 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4100 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4101 {
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
4102 backup = buf_modname((buf->b_p_sn || buf->b_shortname),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4103 rootname, backup_ext, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4104 vim_free(rootname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4105 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4106
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4107 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4108 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4109 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4110 * If we are not going to keep the backup file, don't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4111 * delete an existing one, try to use another name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4112 * Change one character, just before the extension.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4113 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4114 if (!p_bk && mch_getperm(backup) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4115 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4116 p = backup + STRLEN(backup) - 1 - STRLEN(backup_ext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4117 if (p < backup) /* empty file name ??? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4118 p = backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4119 *p = 'z';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4120 while (*p > 'a' && mch_getperm(backup) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4121 --*p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4122 /* They all exist??? Must be something wrong! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4123 if (*p == 'a')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4124 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4125 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4126 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4127 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4128 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4129 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4130 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4131 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4132 /*
531
da9142bd190a updated for version 7.0149
vimboss
parents: 501
diff changeset
4133 * Delete any existing backup and move the current version
da9142bd190a updated for version 7.0149
vimboss
parents: 501
diff changeset
4134 * to the backup. For safety, we don't remove the backup
da9142bd190a updated for version 7.0149
vimboss
parents: 501
diff changeset
4135 * until the write has finished successfully. And if the
da9142bd190a updated for version 7.0149
vimboss
parents: 501
diff changeset
4136 * 'backup' option is set, leave it around.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4137 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4138 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4139 * If the renaming of the original file to the backup file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4140 * works, quit here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4141 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4142 if (vim_rename(fname, backup) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4143 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4144
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4145 vim_free(backup); /* don't do the rename below */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4146 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4147 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4148 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4149 if (backup == NULL && !forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4150 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4151 errmsg = (char_u *)_("E510: Can't make backup file (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4152 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4153 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4154 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4155 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4156
7410
08e62c4fc17d commit https://github.com/vim/vim/commit/53076830fea6df737455523f7e235bfe4f79864d
Christian Brabandt <cb@256bit.org>
parents: 7408
diff changeset
4157 #if defined(UNIX)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4158 /* When using ":w!" and the file was read-only: make it writable */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4159 if (forceit && perm >= 0 && !(perm & 0200) && st_old.st_uid == getuid()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4160 && vim_strchr(p_cpo, CPO_FWRITE) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4161 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4162 perm |= 0200;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4163 (void)mch_setperm(fname, perm);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4164 made_writable = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4165 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4166 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4167
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
4168 /* When using ":w!" and writing to the current file, 'readonly' makes no
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
4169 * sense, reset it, unless 'Z' appears in 'cpoptions'. */
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
4170 if (forceit && overwriting && vim_strchr(p_cpo, CPO_KEEPRO) == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4171 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4172 buf->b_p_ro = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4173 #ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4174 need_maketitle = TRUE; /* set window title later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4175 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4176 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4177 status_redraw_all(); /* redraw status lines later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4178 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4179 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4180
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4181 if (end > buf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4182 end = buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4183 if (buf->b_ml.ml_flags & ML_EMPTY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4184 start = end + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4185
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4186 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4187 * If the original file is being overwritten, there is a small chance that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4188 * we crash in the middle of writing. Therefore the file is preserved now.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4189 * This makes all block numbers positive so that recovery does not need
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4190 * the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4191 * Don't do this if there is a backup file and we are exiting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4192 */
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4193 if (reset_changed && !newfile && overwriting
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4194 && !(exiting && backup != NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4195 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4196 ml_preserve(buf, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4197 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4198 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4199 errmsg = (char_u *)_(e_interr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4200 goto restore_backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4201 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4202 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4203
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4204 #ifdef MACOS_CLASSIC /* TODO: Is it need for MACOS_X? (Dany) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4205 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4206 * Before risking to lose the original file verify if there's
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4207 * a resource fork to preserve, and if cannot be done warn
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4208 * the users. This happens when overwriting without backups.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4209 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4210 if (backup == NULL && overwriting && !append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4211 if (mch_has_resource_fork(fname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4212 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4213 errmsg = (char_u *)_("E460: The resource fork would be lost (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4214 goto restore_backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4215 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4216 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4217
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4218 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4219 vms_remove_version(fname); /* remove version */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4220 #endif
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
4221 /* Default: write the file directly. May write to a temp file for
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4222 * multi-byte conversion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4223 wfname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4224
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4225 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4226 /* Check for forced 'fileencoding' from "++opt=val" argument. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4227 if (eap != NULL && eap->force_enc != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4228 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4229 fenc = eap->cmd + eap->force_enc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4230 fenc = enc_canonize(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4231 fenc_tofree = fenc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4232 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4233 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4234 fenc = buf->b_p_fenc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4235
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4236 /*
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
4237 * Check if the file needs to be converted.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4238 */
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
4239 converted = need_conversion(fenc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4240
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4241 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4242 * Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done. Or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4243 * Latin1 to Unicode conversion. This is handled in buf_write_bytes().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4244 * Prepare the flags for it and allocate bw_conv_buf when needed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4245 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4246 if (converted && (enc_utf8 || STRCMP(p_enc, "latin1") == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4248 wb_flags = get_fio_flags(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4249 if (wb_flags & (FIO_UCS2 | FIO_UCS4 | FIO_UTF16 | FIO_UTF8))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4250 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4251 /* Need to allocate a buffer to translate into. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4252 if (wb_flags & (FIO_UCS2 | FIO_UTF16 | FIO_UTF8))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4253 write_info.bw_conv_buflen = bufsize * 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4254 else /* FIO_UCS4 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4255 write_info.bw_conv_buflen = bufsize * 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4256 write_info.bw_conv_buf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4257 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4258 if (write_info.bw_conv_buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4259 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4260 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4261 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4262
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4263 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4264 if (converted && wb_flags == 0 && (wb_flags = get_win_fio_flags(fenc)) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4265 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4266 /* Convert UTF-8 -> UCS-2 and UCS-2 -> DBCS. Worst-case * 4: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4267 write_info.bw_conv_buflen = bufsize * 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4268 write_info.bw_conv_buf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4269 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4270 if (write_info.bw_conv_buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4271 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4272 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4273 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4274
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4275 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4276 if (converted && wb_flags == 0 && (wb_flags = get_mac_fio_flags(fenc)) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4277 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4278 write_info.bw_conv_buflen = bufsize * 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4279 write_info.bw_conv_buf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4280 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4281 if (write_info.bw_conv_buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4282 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4283 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4284 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4285
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4286 # if defined(FEAT_EVAL) || defined(USE_ICONV)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4287 if (converted && wb_flags == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4288 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4289 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4290 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4291 * Use iconv() conversion when conversion is needed and it's not done
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4292 * internally.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4293 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4294 write_info.bw_iconv_fd = (iconv_t)my_iconv_open(fenc,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4295 enc_utf8 ? (char_u *)"utf-8" : p_enc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4296 if (write_info.bw_iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4297 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4298 /* We're going to use iconv(), allocate a buffer to convert in. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4299 write_info.bw_conv_buflen = bufsize * ICONV_MULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4300 write_info.bw_conv_buf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4301 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4302 if (write_info.bw_conv_buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4303 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4304 write_info.bw_first = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4305 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4306 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4307 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4308 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4309 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4310
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4311 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4312 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4313 * When the file needs to be converted with 'charconvert' after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4314 * writing, write to a temp file instead and let the conversion
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4315 * overwrite the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4316 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4317 if (*p_ccv != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4318 {
6721
7347229a646a updated for version 7.4.684
Bram Moolenaar <bram@vim.org>
parents: 6635
diff changeset
4319 wfname = vim_tempname('w', FALSE);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4320 if (wfname == NULL) /* Can't write without a tempfile! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4321 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4322 errmsg = (char_u *)_("E214: Can't find temp file for writing");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4323 goto restore_backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4324 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4325 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4326 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4327 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4328 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4329 if (converted && wb_flags == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4330 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4331 && write_info.bw_iconv_fd == (iconv_t)-1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4332 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4333 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4334 && wfname == fname
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4335 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4336 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4338 if (!forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4339 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4340 errmsg = (char_u *)_("E213: Cannot convert (add ! to write without conversion)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4341 goto restore_backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4342 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4343 notconverted = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4344 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4345 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4347 /*
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4348 * If conversion is taking place, we may first pretend to write and check
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4349 * for conversion errors. Then loop again to write for real.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4350 * When not doing conversion this writes for real right away.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4351 */
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4352 for (checking_conversion = TRUE; ; checking_conversion = FALSE)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4353 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4354 /*
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4355 * There is no need to check conversion when:
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4356 * - there is no conversion
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4357 * - we make a backup file, that can be restored in case of conversion
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4358 * failure.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4359 */
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4360 #ifdef FEAT_MBYTE
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4361 if (!converted || dobackup)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4362 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4363 checking_conversion = FALSE;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4364
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4365 if (checking_conversion)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4366 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4367 /* Make sure we don't write anything. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4368 fd = -1;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4369 write_info.bw_fd = fd;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4370 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4371 else
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4372 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4373 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4374 * Open the file "wfname" for writing.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4375 * We may try to open the file twice: If we can't write to the file
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4376 * and forceit is TRUE we delete the existing file and try to
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4377 * create a new one. If this still fails we may have lost the
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4378 * original file! (this may happen when the user reached his
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4379 * quotum for number of files).
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4380 * Appending will fail if the file does not exist and forceit is
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4381 * FALSE.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4382 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4383 while ((fd = mch_open((char *)wfname, O_WRONLY | O_EXTRA | (append
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4384 ? (forceit ? (O_APPEND | O_CREAT) : O_APPEND)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4385 : (O_CREAT | O_TRUNC))
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4386 , perm < 0 ? 0666 : (perm & 0777))) < 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4387 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4388 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4389 * A forced write will try to create a new file if the old one
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4390 * is still readonly. This may also happen when the directory
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4391 * is read-only. In that case the mch_remove() will fail.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4392 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4393 if (errmsg == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4394 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4395 #ifdef UNIX
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4396 stat_T st;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4397
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4398 /* Don't delete the file when it's a hard or symbolic link.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4399 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4400 if ((!newfile && st_old.st_nlink > 1)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4401 || (mch_lstat((char *)fname, &st) == 0
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4402 && (st.st_dev != st_old.st_dev
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4403 || st.st_ino != st_old.st_ino)))
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4404 errmsg = (char_u *)_("E166: Can't open linked file for writing");
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4405 else
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4406 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4407 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4408 errmsg = (char_u *)_("E212: Can't open file for writing");
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4409 if (forceit && vim_strchr(p_cpo, CPO_FWRITE) == NULL
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4410 && perm >= 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4411 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4412 #ifdef UNIX
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4413 /* we write to the file, thus it should be marked
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4414 writable after all */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4415 if (!(perm & 0200))
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4416 made_writable = TRUE;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4417 perm |= 0200;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4418 if (st_old.st_uid != getuid()
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4419 || st_old.st_gid != getgid())
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4420 perm &= 0777;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4421 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4422 if (!append) /* don't remove when appending */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4423 mch_remove(wfname);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4424 continue;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4425 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4426 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4427 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4428
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4429 restore_backup:
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4430 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4431 stat_T st;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4432
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4433 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4434 * If we failed to open the file, we don't need a backup.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4435 * Throw it away. If we moved or removed the original file
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4436 * try to put the backup in its place.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4437 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4438 if (backup != NULL && wfname == fname)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4439 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4440 if (backup_copy)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4441 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4442 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4443 * There is a small chance that we removed the
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4444 * original, try to move the copy in its place.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4445 * This may not work if the vim_rename() fails.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4446 * In that case we leave the copy around.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4447 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4448 /* If file does not exist, put the copy in its
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4449 * place */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4450 if (mch_stat((char *)fname, &st) < 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4451 vim_rename(backup, fname);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4452 /* if original file does exist throw away the copy
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4453 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4454 if (mch_stat((char *)fname, &st) >= 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4455 mch_remove(backup);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4456 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4457 else
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4458 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4459 /* try to put the original file back */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4460 vim_rename(backup, fname);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4461 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4462 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4463
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4464 /* if original file no longer exists give an extra warning
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4465 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4466 if (!newfile && mch_stat((char *)fname, &st) < 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4467 end = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4468 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4469
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4470 #ifdef FEAT_MBYTE
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4471 if (wfname != fname)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4472 vim_free(wfname);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4473 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4474 goto fail;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4475 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4476 write_info.bw_fd = fd;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4477
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4478 #if defined(MACOS_CLASSIC) || defined(WIN3264)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4479 /* TODO: Is it need for MACOS_X? (Dany) */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4480 /*
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4481 * On macintosh copy the original files attributes (i.e. the backup)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4482 * This is done in order to preserve the resource fork and the
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4483 * Finder attribute (label, comments, custom icons, file creator)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4484 */
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4485 if (backup != NULL && overwriting && !append)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4486 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4487 if (backup_copy)
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4488 (void)mch_copy_file_attribute(wfname, backup);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4489 else
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4490 (void)mch_copy_file_attribute(backup, wfname);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4491 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4492
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4493 if (!overwriting && !append)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4494 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4495 if (buf->b_ffname != NULL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4496 (void)mch_copy_file_attribute(buf->b_ffname, wfname);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4497 /* Should copy resource fork */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4498 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4499 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4500
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4501 #ifdef FEAT_CRYPT
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4502 if (*buf->b_p_key != NUL && !filtering)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4503 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4504 char_u *header;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4505 int header_len;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4506
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4507 buf->b_cryptstate = crypt_create_for_writing(
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4508 crypt_get_method_nr(buf),
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4509 buf->b_p_key, &header, &header_len);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4510 if (buf->b_cryptstate == NULL || header == NULL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4511 end = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4512 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4513 {
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4514 /* Write magic number, so that Vim knows how this file is
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4515 * encrypted when reading it back. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4516 write_info.bw_buf = header;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4517 write_info.bw_len = header_len;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4518 write_info.bw_flags = FIO_NOCONVERT;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4519 if (buf_write_bytes(&write_info) == FAIL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4520 end = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4521 wb_flags |= FIO_ENCRYPTED;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4522 vim_free(header);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4523 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4524 }
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4525 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4526 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4527 errmsg = NULL;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4528
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4529 write_info.bw_buf = buffer;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4530 nchars = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4531
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4532 /* use "++bin", "++nobin" or 'binary' */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4533 if (eap != NULL && eap->force_bin != 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4534 write_bin = (eap->force_bin == FORCE_BIN);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4535 else
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4536 write_bin = buf->b_p_bin;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4537
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4538 #ifdef FEAT_MBYTE
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4539 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4540 * The BOM is written just after the encryption magic number.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4541 * Skip it when appending and the file already existed, the BOM only
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4542 * makes sense at the start of the file.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4543 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4544 if (buf->b_p_bomb && !write_bin && (!append || perm < 0))
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4545 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4546 write_info.bw_len = make_bom(buffer, fenc);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4547 if (write_info.bw_len > 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4548 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4549 /* don't convert, do encryption */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4550 write_info.bw_flags = FIO_NOCONVERT | wb_flags;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4551 if (buf_write_bytes(&write_info) == FAIL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4552 end = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4553 else
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4554 nchars += write_info.bw_len;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4555 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4556 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4557 write_info.bw_start_lnum = start;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4558 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4559
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4560 #ifdef FEAT_PERSISTENT_UNDO
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4561 write_undo_file = (buf->b_p_udf
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4562 && overwriting
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4563 && !append
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4564 && !filtering
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4565 && reset_changed
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4566 && !checking_conversion);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4567 if (write_undo_file)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4568 /* Prepare for computing the hash value of the text. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4569 sha256_start(&sha_ctx);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4570 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4571
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4572 write_info.bw_len = bufsize;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4573 #ifdef HAS_BW_FLAGS
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4574 write_info.bw_flags = wb_flags;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4575 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4576 fileformat = get_fileformat_force(buf, eap);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4577 s = buffer;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4578 len = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4579 for (lnum = start; lnum <= end; ++lnum)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4580 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4581 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4582 * The next while loop is done once for each character written.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4583 * Keep it fast!
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4584 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4585 ptr = ml_get_buf(buf, lnum, FALSE) - 1;
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4586 #ifdef FEAT_PERSISTENT_UNDO
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4587 if (write_undo_file)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4588 sha256_update(&sha_ctx, ptr + 1,
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4589 (UINT32_T)(STRLEN(ptr + 1) + 1));
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4590 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4591 while ((c = *++ptr) != NUL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4592 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4593 if (c == NL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4594 *s = NUL; /* replace newlines with NULs */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4595 else if (c == CAR && fileformat == EOL_MAC)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4596 *s = NL; /* Mac: replace CRs with NLs */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4597 else
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4598 *s = c;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4599 ++s;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4600 if (++len != bufsize)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4601 continue;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4602 if (buf_write_bytes(&write_info) == FAIL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4603 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4604 end = 0; /* write error: break loop */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4605 break;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4606 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4607 nchars += bufsize;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4608 s = buffer;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4609 len = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4610 #ifdef FEAT_MBYTE
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4611 write_info.bw_start_lnum = lnum;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4612 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4613 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4614 /* write failed or last line has no EOL: stop here */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4615 if (end == 0
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4616 || (lnum == end
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4617 && (write_bin || !buf->b_p_fixeol)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4618 && (lnum == buf->b_no_eol_lnum
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4619 || (lnum == buf->b_ml.ml_line_count
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4620 && !buf->b_p_eol))))
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4621 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4622 ++lnum; /* written the line, count it */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4623 no_eol = TRUE;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4624 break;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4625 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4626 if (fileformat == EOL_UNIX)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4627 *s++ = NL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4628 else
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4629 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4630 *s++ = CAR; /* EOL_MAC or EOL_DOS: write CR */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4631 if (fileformat == EOL_DOS) /* write CR-NL */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4632 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4633 if (++len == bufsize)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4634 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4635 if (buf_write_bytes(&write_info) == FAIL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4636 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4637 end = 0; /* write error: break loop */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4638 break;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4639 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4640 nchars += bufsize;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4641 s = buffer;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4642 len = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4643 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4644 *s++ = NL;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4645 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4646 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4647 if (++len == bufsize && end)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4648 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4649 if (buf_write_bytes(&write_info) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4650 {
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4651 end = 0; /* write error: break loop */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4652 break;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4653 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4654 nchars += bufsize;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4655 s = buffer;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4656 len = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4657
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4658 ui_breakcheck();
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4659 if (got_int)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4660 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4661 end = 0; /* Interrupted, break loop */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4662 break;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4663 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4664 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4665 #ifdef VMS
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4666 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4667 * On VMS there is a problem: newlines get added when writing
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4668 * blocks at a time. Fix it by writing a line at a time.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4669 * This is much slower!
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4670 * Explanation: VAX/DECC RTL insists that records in some RMS
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4671 * structures end with a newline (carriage return) character, and
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4672 * if they don't it adds one.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4673 * With other RMS structures it works perfect without this fix.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4674 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4675 if (buf->b_fab_rfm == FAB$C_VFC
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4676 || ((buf->b_fab_rat & (FAB$M_FTN | FAB$M_CR)) != 0))
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4677 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4678 int b2write;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4679
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4680 buf->b_fab_mrs = (buf->b_fab_mrs == 0
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4681 ? MIN(4096, bufsize)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4682 : MIN(buf->b_fab_mrs, bufsize));
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4683
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4684 b2write = len;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4685 while (b2write > 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4686 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4687 write_info.bw_len = MIN(b2write, buf->b_fab_mrs);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4688 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4689 {
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4690 end = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4691 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4692 }
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4693 b2write -= MIN(b2write, buf->b_fab_mrs);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4694 }
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4695 write_info.bw_len = bufsize;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4696 nchars += len;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4697 s = buffer;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4698 len = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4699 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4700 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4701 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4702 if (len > 0 && end > 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4703 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4704 write_info.bw_len = len;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4705 if (buf_write_bytes(&write_info) == FAIL)
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4706 end = 0; /* write error */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4707 nchars += len;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4708 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4709
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4710 /* Stop when writing done or an error was encountered. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4711 if (!checking_conversion || end == 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4712 break;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4713
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4714 /* If no error happened until now, writing should be ok, so loop to
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4715 * really write the buffer. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4716 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4717
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4718 /* If we started writing, finish writing. Also when an error was
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4719 * encountered. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4720 if (!checking_conversion)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4721 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4722 #if defined(UNIX) && defined(HAVE_FSYNC)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4723 /*
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4724 * On many journalling file systems there is a bug that causes both the
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4725 * original and the backup file to be lost when halting the system
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4726 * right after writing the file. That's because only the meta-data is
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4727 * journalled. Syncing the file slows down the system, but assures it
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4728 * has been written to disk and we don't lose it.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4729 * For a device do try the fsync() but don't complain if it does not
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4730 * work (could be a pipe).
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4731 * If the 'fsync' option is FALSE, don't fsync(). Useful for laptops.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4732 */
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4733 if (p_fs && fsync(fd) != 0 && !device)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4734 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4735 errmsg = (char_u *)_("E667: Fsync failed");
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4736 end = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4737 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4738 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4739
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
4740 #if defined(HAVE_SELINUX) || defined(HAVE_SMACK)
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4741 /* Probably need to set the security context. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4742 if (!backup_copy)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4743 mch_copy_sec(backup, wfname);
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4744 #endif
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4745
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4746 #ifdef UNIX
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4747 /* When creating a new file, set its owner/group to that of the
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4748 * original file. Get the new device and inode number. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4749 if (backup != NULL && !backup_copy)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4750 {
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4751 # ifdef HAVE_FCHOWN
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4752 stat_T st;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4753
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4754 /* don't change the owner when it's already OK, some systems remove
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4755 * permission or ACL stuff */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4756 if (mch_stat((char *)wfname, &st) < 0
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4757 || st.st_uid != st_old.st_uid
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4758 || st.st_gid != st_old.st_gid)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4759 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4760 ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4761 if (perm >= 0) /* set permission again, may have changed */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4762 (void)mch_setperm(wfname, perm);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4763 }
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4764 # endif
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4765 buf_setino(buf);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4766 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4767 else if (!buf->b_dev_valid)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4768 /* Set the inode when creating a new file. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4769 buf_setino(buf);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4770 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4771
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4772 if (close(fd) != 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4773 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4774 errmsg = (char_u *)_("E512: Close failed");
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4775 end = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4776 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4777
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4778 #ifdef UNIX
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4779 if (made_writable)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4780 perm &= ~0200; /* reset 'w' bit for security reasons */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4781 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4782 if (perm >= 0) /* set perm. of new file same as old file */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4783 (void)mch_setperm(wfname, perm);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4784 #ifdef HAVE_ACL
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4785 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4786 * Probably need to set the ACL before changing the user (can't set the
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4787 * ACL on a file the user doesn't own).
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4788 * On Solaris, with ZFS and the aclmode property set to "discard" (the
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4789 * default), chmod() discards all part of a file's ACL that don't
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4790 * represent the mode of the file. It's non-trivial for us to discover
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4791 * whether we're in that situation, so we simply always re-set the ACL.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4792 */
9509
e61974ab3ed0 commit https://github.com/vim/vim/commit/da4127794aa333631bde879e73bcfce4aef42f85
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
4793 # ifndef HAVE_SOLARIS_ZFS_ACL
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4794 if (!backup_copy)
9509
e61974ab3ed0 commit https://github.com/vim/vim/commit/da4127794aa333631bde879e73bcfce4aef42f85
Christian Brabandt <cb@256bit.org>
parents: 9487
diff changeset
4795 # endif
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4796 mch_set_acl(wfname, acl);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4797 #endif
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
4798 #ifdef FEAT_CRYPT
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4799 if (buf->b_cryptstate != NULL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4800 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4801 crypt_free_state(buf->b_cryptstate);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4802 buf->b_cryptstate = NULL;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4803 }
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
4804 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4805
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4806 #if defined(FEAT_MBYTE) && defined(FEAT_EVAL)
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4807 if (wfname != fname)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4808 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4809 /*
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4810 * The file was written to a temp file, now it needs to be
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4811 * converted with 'charconvert' to (overwrite) the output file.
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4812 */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4813 if (end != 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4814 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4815 if (eval_charconvert(enc_utf8 ? (char_u *)"utf-8" : p_enc,
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4816 fenc, wfname, fname) == FAIL)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4817 {
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4818 write_info.bw_conv_error = TRUE;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4819 end = 0;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4820 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4821 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4822 mch_remove(wfname);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4823 vim_free(wfname);
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4824 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4825 #endif
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4826 }
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4827
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4828 if (end == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4829 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4830 /*
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
4831 * Error encountered.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4832 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4833 if (errmsg == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4834 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4835 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4836 if (write_info.bw_conv_error)
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4837 {
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4838 if (write_info.bw_conv_error_lnum == 0)
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4839 errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)");
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4840 else
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4841 {
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4842 errmsg_allocated = TRUE;
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4843 errmsg = alloc(300);
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4844 vim_snprintf((char *)errmsg, 300, _("E513: write error, conversion failed in line %ld (make 'fenc' empty to override)"),
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4845 (long)write_info.bw_conv_error_lnum);
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4846 }
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4847 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4848 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4849 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4850 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4851 errmsg = (char_u *)_(e_interr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4852 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4853 errmsg = (char_u *)_("E514: write error (file system full?)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4854 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4855
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4856 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4857 * If we have a backup file, try to put it in place of the new file,
1698
f4f8014d516e updated for version 7.2c-000
vimboss
parents: 1688
diff changeset
4858 * because the new file is probably corrupt. This avoids losing the
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4859 * original file when trying to make a backup when writing the file a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4860 * second time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4861 * When "backup_copy" is set we need to copy the backup over the new
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4862 * file. Otherwise rename the backup file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4863 * If this is OK, don't give the extra warning message.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4864 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4865 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4866 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4867 if (backup_copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4868 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4869 /* This may take a while, if we were interrupted let the user
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4870 * know we got the message. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4871 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4872 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4873 MSG(_(e_interr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4874 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4875 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4876 if ((fd = mch_open((char *)backup, O_RDONLY | O_EXTRA, 0)) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4877 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4878 if ((write_info.bw_fd = mch_open((char *)fname,
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
4879 O_WRONLY | O_CREAT | O_TRUNC | O_EXTRA,
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
4880 perm & 0777)) >= 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4881 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4882 /* copy the file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4883 write_info.bw_buf = smallbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4884 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4885 write_info.bw_flags = FIO_NOCONVERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4886 #endif
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
4887 while ((write_info.bw_len = read_eintr(fd, smallbuf,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4888 SMBUFSIZE)) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4889 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4890 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4891
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4892 if (close(write_info.bw_fd) >= 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4893 && write_info.bw_len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4894 end = 1; /* success */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4895 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4896 close(fd); /* ignore errors for closing read file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4897 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4898 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4899 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4900 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4901 if (vim_rename(backup, fname) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4902 end = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4903 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4904 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4905 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4906 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4907
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4908 lnum -= start; /* compute number of written lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4909 --no_wait_return; /* may wait for return now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4910
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4911 #if !(defined(UNIX) || defined(VMS))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4912 fname = sfname; /* use shortname now, for the messages */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4913 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4914 if (!filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4915 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4916 msg_add_fname(buf, fname); /* put fname in IObuff with quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4917 c = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4918 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4919 if (write_info.bw_conv_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4920 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4921 STRCAT(IObuff, _(" CONVERSION ERROR"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4922 c = TRUE;
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4923 if (write_info.bw_conv_error_lnum != 0)
2280
941ff1cd317a Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents: 2267
diff changeset
4924 vim_snprintf_add((char *)IObuff, IOSIZE, _(" in line %ld;"),
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4925 (long)write_info.bw_conv_error_lnum);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4926 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4927 else if (notconverted)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4928 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4929 STRCAT(IObuff, _("[NOT converted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4930 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4931 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4932 else if (converted)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4933 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4934 STRCAT(IObuff, _("[converted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4935 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4936 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4937 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4938 if (device)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4939 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4940 STRCAT(IObuff, _("[Device]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4941 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4942 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4943 else if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4944 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4945 STRCAT(IObuff, shortmess(SHM_NEW) ? _("[New]") : _("[New File]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4946 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4947 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4948 if (no_eol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4949 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4950 msg_add_eol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4951 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4952 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4953 /* may add [unix/dos/mac] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4954 if (msg_add_fileformat(fileformat))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4955 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4956 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4957 if (wb_flags & FIO_ENCRYPTED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4958 {
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
4959 crypt_append_msg(buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4960 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4961 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4962 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4963 msg_add_lines(c, (long)lnum, nchars); /* add line/char count */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4964 if (!shortmess(SHM_WRITE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4965 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4966 if (append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4967 STRCAT(IObuff, shortmess(SHM_WRI) ? _(" [a]") : _(" appended"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4968 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4969 STRCAT(IObuff, shortmess(SHM_WRI) ? _(" [w]") : _(" written"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4970 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4971
679
e629de7618da updated for version 7.0203
vimboss
parents: 676
diff changeset
4972 set_keep_msg(msg_trunc_attr(IObuff, FALSE, 0), 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4974
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4975 /* When written everything correctly: reset 'modified'. Unless not
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4976 * writing to the original file and '+' is not in 'cpoptions'. */
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
4977 if (reset_changed && whole && !append
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4978 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4979 && !write_info.bw_conv_error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4980 #endif
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4981 && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4982 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4983 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4984 unchanged(buf, TRUE);
6320
a0daa5feaccb updated for version 7.4.493
Bram Moolenaar <bram@vim.org>
parents: 6243
diff changeset
4985 #ifdef FEAT_AUTOCMD
10952
835604f3c37a patch 8.0.0365: might free a dict item that wasn't allocated
Christian Brabandt <cb@256bit.org>
parents: 10889
diff changeset
4986 /* b:changedtick is always incremented in unchanged() but that
6320
a0daa5feaccb updated for version 7.4.493
Bram Moolenaar <bram@vim.org>
parents: 6243
diff changeset
4987 * should not trigger a TextChanged event. */
10952
835604f3c37a patch 8.0.0365: might free a dict item that wasn't allocated
Christian Brabandt <cb@256bit.org>
parents: 10889
diff changeset
4988 if (last_changedtick + 1 == CHANGEDTICK(buf)
6320
a0daa5feaccb updated for version 7.4.493
Bram Moolenaar <bram@vim.org>
parents: 6243
diff changeset
4989 && last_changedtick_buf == buf)
10952
835604f3c37a patch 8.0.0365: might free a dict item that wasn't allocated
Christian Brabandt <cb@256bit.org>
parents: 10889
diff changeset
4990 last_changedtick = CHANGEDTICK(buf);
6320
a0daa5feaccb updated for version 7.4.493
Bram Moolenaar <bram@vim.org>
parents: 6243
diff changeset
4991 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4992 u_unchanged(buf);
2281
e41433ea71df Added ":earlier 1f" and ":later 1f".
Bram Moolenaar <bram@vim.org>
parents: 2280
diff changeset
4993 u_update_save_nr(buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4994 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4995
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4996 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4997 * If written to the current file, update the timestamp of the swap file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4998 * and reset the BF_WRITE_MASK flags. Also sets buf->b_mtime.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4999 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5000 if (overwriting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5001 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5002 ml_timestamp(buf);
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
5003 if (append)
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
5004 buf->b_flags &= ~BF_NEW;
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
5005 else
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
5006 buf->b_flags &= ~BF_WRITE_MASK;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5007 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5008
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5009 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5010 * If we kept a backup until now, and we are in patch mode, then we make
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5011 * the backup file our 'original' file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5012 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5013 if (*p_pm && dobackup)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5014 {
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
5015 char *org = (char *)buf_modname((buf->b_p_sn || buf->b_shortname),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5016 fname, p_pm, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5017
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5018 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5019 {
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
5020 stat_T st;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5021
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5022 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5023 * If the original file does not exist yet
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5024 * the current backup file becomes the original file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5025 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5026 if (org == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5027 EMSG(_("E205: Patchmode: can't save original file"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5028 else if (mch_stat(org, &st) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5029 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5030 vim_rename(backup, (char_u *)org);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5031 vim_free(backup); /* don't delete the file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5032 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5033 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5034 set_file_time((char_u *)org, st_old.st_atime, st_old.st_mtime);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5035 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5036 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5037 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5038 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5039 * If there is no backup file, remember that a (new) file was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5040 * created.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5041 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5042 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5044 int empty_fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5045
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5046 if (org == NULL
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
5047 || (empty_fd = mch_open(org,
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
5048 O_CREAT | O_EXTRA | O_EXCL | O_NOFOLLOW,
216
da182deebec7 updated for version 7.0061
vimboss
parents: 199
diff changeset
5049 perm < 0 ? 0666 : (perm & 0777))) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5050 EMSG(_("E206: patchmode: can't touch empty original file"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5051 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5052 close(empty_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5053 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5054 if (org != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5055 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5056 mch_setperm((char_u *)org, mch_getperm(fname) & 0777);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5057 vim_free(org);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5058 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5059 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5060
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5061 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5062 * Remove the backup unless 'backup' option is set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5063 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5064 if (!p_bk && backup != NULL && mch_remove(backup) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5065 EMSG(_("E207: Can't delete backup file"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5066
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5067 #ifdef FEAT_SUN_WORKSHOP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5068 if (usingSunWorkShop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5069 workshop_file_saved((char *) ffname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5070 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5071
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5072 goto nofail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5073
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5074 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5075 * Finish up. We get here either after failure or success.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5076 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5077 fail:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5078 --no_wait_return; /* may wait for return now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5079 nofail:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5080
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5081 /* Done saving, we accept changed buffer warnings again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5082 buf->b_saving = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5083
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5084 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5085 if (buffer != smallbuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5086 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5087 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5088 vim_free(fenc_tofree);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5089 vim_free(write_info.bw_conv_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5090 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5091 if (write_info.bw_iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5092 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5093 iconv_close(write_info.bw_iconv_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5094 write_info.bw_iconv_fd = (iconv_t)-1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5096 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5097 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5098 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5099 mch_free_acl(acl);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5100 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5101
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5102 if (errmsg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5103 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
5104 int numlen = errnum != NULL ? (int)STRLEN(errnum) : 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5105
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
5106 attr = HL_ATTR(HLF_E); /* set highlight for error messages */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5107 msg_add_fname(buf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5108 #ifndef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5109 sfname
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5110 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5111 fname
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5112 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5113 ); /* put file name in IObuff with quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5114 if (STRLEN(IObuff) + STRLEN(errmsg) + numlen >= IOSIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5115 IObuff[IOSIZE - STRLEN(errmsg) - numlen - 1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5116 /* If the error message has the form "is ...", put the error number in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5117 * front of the file name. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5118 if (errnum != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5119 {
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1597
diff changeset
5120 STRMOVE(IObuff + numlen, IObuff);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5121 mch_memmove(IObuff, errnum, (size_t)numlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5122 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5123 STRCAT(IObuff, errmsg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5124 emsg(IObuff);
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5125 if (errmsg_allocated)
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5126 vim_free(errmsg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5127
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5128 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5129 if (end == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5130 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5131 MSG_PUTS_ATTR(_("\nWARNING: Original file may be lost or damaged\n"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5132 attr | MSG_HIST);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5133 MSG_PUTS_ATTR(_("don't quit the editor until the file is successfully written!"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5134 attr | MSG_HIST);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5135
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5136 /* Update the timestamp to avoid an "overwrite changed file"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5137 * prompt when writing again. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5138 if (mch_stat((char *)fname, &st_old) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5139 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5140 buf_store_time(buf, &st_old, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5141 buf->b_mtime_read = buf->b_mtime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5142 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5143 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5144 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5145 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5146
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5147 #ifdef FEAT_PERSISTENT_UNDO
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5148 /*
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5149 * When writing the whole file and 'undofile' is set, also write the undo
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5150 * file.
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5151 */
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5152 if (retval == OK && write_undo_file)
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5153 {
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5154 char_u hash[UNDO_HASH_SIZE];
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5155
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5156 sha256_finish(&sha_ctx, hash);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5157 u_write_undo(NULL, FALSE, buf, hash);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5158 }
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5159 #endif
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5160
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5161 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5162 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5163 if (!should_abort(retval))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5164 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5165 if (!got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5166 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5167 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5168 aco_save_T aco;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5169
3482
fe7bf24804e1 updated for version 7.3.505
Bram Moolenaar <bram@vim.org>
parents: 3390
diff changeset
5170 curbuf->b_no_eol_lnum = 0; /* in case it was set by the previous read */
fe7bf24804e1 updated for version 7.3.505
Bram Moolenaar <bram@vim.org>
parents: 3390
diff changeset
5171
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5172 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5173 * Apply POST autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5174 * Careful: The autocommands may call buf_write() recursively!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5175 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5176 aucmd_prepbuf(&aco, buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5177
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5178 if (append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5179 apply_autocmds_exarg(EVENT_FILEAPPENDPOST, fname, fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5180 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5181 else if (filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5182 apply_autocmds_exarg(EVENT_FILTERWRITEPOST, NULL, fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5183 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5184 else if (reset_changed && whole)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5185 apply_autocmds_exarg(EVENT_BUFWRITEPOST, fname, fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5186 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5187 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5188 apply_autocmds_exarg(EVENT_FILEWRITEPOST, fname, fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5189 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5190
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5191 /* restore curwin/curbuf and a few other things */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5192 aucmd_restbuf(&aco);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5193
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5194 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5195 if (aborting()) /* autocmds may abort script processing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5196 retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5197 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5199 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5200
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5201 got_int |= prev_got_int;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5202
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5203 #ifdef MACOS_CLASSIC /* TODO: Is it need for MACOS_X? (Dany) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5204 /* Update machine specific information. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5205 mch_post_buffer_write(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5206 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5207 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5208 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5209
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5210 /*
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5211 * Set the name of the current buffer. Use when the buffer doesn't have a
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5212 * name and a ":r" or ":w" command with a file name is used.
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5213 */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5214 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5215 set_rw_fname(char_u *fname, char_u *sfname)
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5216 {
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5217 #ifdef FEAT_AUTOCMD
1905
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5218 buf_T *buf = curbuf;
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5219
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5220 /* It's like the unnamed buffer is deleted.... */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5221 if (curbuf->b_p_bl)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5222 apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5223 apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5224 # ifdef FEAT_EVAL
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5225 if (aborting()) /* autocmds may abort script processing */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5226 return FAIL;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5227 # endif
1905
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5228 if (curbuf != buf)
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5229 {
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5230 /* We are in another buffer now, don't do the renaming. */
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5231 EMSG(_(e_auchangedbuf));
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5232 return FAIL;
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5233 }
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5234 #endif
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5235
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5236 if (setfname(curbuf, fname, sfname, FALSE) == OK)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5237 curbuf->b_flags |= BF_NOTEDITED;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5238
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5239 #ifdef FEAT_AUTOCMD
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5240 /* ....and a new named one is created */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5241 apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, curbuf);
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5242 if (curbuf->b_p_bl)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5243 apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, curbuf);
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5244 # ifdef FEAT_EVAL
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5245 if (aborting()) /* autocmds may abort script processing */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5246 return FAIL;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5247 # endif
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5248
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5249 /* Do filetype detection now if 'filetype' is empty. */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5250 if (*curbuf->b_p_ft == NUL)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5251 {
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
5252 if (au_has_group((char_u *)"filetypedetect"))
9260
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
5253 (void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE, NULL);
717
2fa8cb05b861 updated for version 7.0218
vimboss
parents: 715
diff changeset
5254 do_modelines(0);
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5255 }
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5256 #endif
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5257
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5258 return OK;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5259 }
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5260
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5261 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5262 * Put file name into IObuff with quotes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5263 */
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
5264 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5265 msg_add_fname(buf_T *buf, char_u *fname)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5266 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5267 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5268 fname = (char_u *)"-stdin-";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5269 home_replace(buf, fname, IObuff + 1, IOSIZE - 4, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5270 IObuff[0] = '"';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5271 STRCAT(IObuff, "\" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5272 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5273
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5274 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5275 * Append message for text mode to IObuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5276 * Return TRUE if something appended.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5277 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5278 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5279 msg_add_fileformat(int eol_type)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5280 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5281 #ifndef USE_CRNL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5282 if (eol_type == EOL_DOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5283 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5284 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[dos]") : _("[dos format]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5285 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5286 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5287 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5288 #ifndef USE_CR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5289 if (eol_type == EOL_MAC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5290 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5291 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[mac]") : _("[mac format]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5292 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5293 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5294 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5295 #if defined(USE_CRNL) || defined(USE_CR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5296 if (eol_type == EOL_UNIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5297 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5298 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[unix]") : _("[unix format]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5299 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5300 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5301 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5302 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5303 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5304
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5305 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5306 * Append line and character count to IObuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5307 */
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
5308 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5309 msg_add_lines(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5310 int insert_space,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5311 long lnum,
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
5312 off_T nchars)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5313 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5314 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5315
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5316 p = IObuff + STRLEN(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5317
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5318 if (insert_space)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5319 *p++ = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5320 if (shortmess(SHM_LINES))
9391
4c40631238e4 commit https://github.com/vim/vim/commit/bde9810d6103ffe3a22a9330021cb21db1ed1792
Christian Brabandt <cb@256bit.org>
parents: 9389
diff changeset
5321 vim_snprintf((char *)p, IOSIZE - (p - IObuff),
4c40631238e4 commit https://github.com/vim/vim/commit/bde9810d6103ffe3a22a9330021cb21db1ed1792
Christian Brabandt <cb@256bit.org>
parents: 9389
diff changeset
5322 "%ldL, %lldC", lnum, (varnumber_T)nchars);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5323 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5324 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5325 if (lnum == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5326 STRCPY(p, _("1 line, "));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5327 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5328 sprintf((char *)p, _("%ld lines, "), lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5329 p += STRLEN(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5330 if (nchars == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5331 STRCPY(p, _("1 character"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5332 else
9391
4c40631238e4 commit https://github.com/vim/vim/commit/bde9810d6103ffe3a22a9330021cb21db1ed1792
Christian Brabandt <cb@256bit.org>
parents: 9389
diff changeset
5333 vim_snprintf((char *)p, IOSIZE - (p - IObuff),
4c40631238e4 commit https://github.com/vim/vim/commit/bde9810d6103ffe3a22a9330021cb21db1ed1792
Christian Brabandt <cb@256bit.org>
parents: 9389
diff changeset
5334 _("%lld characters"), (varnumber_T)nchars);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5335 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5336 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5337
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5338 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5339 * Append message for missing line separator to IObuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5340 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5341 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5342 msg_add_eol(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5343 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5344 STRCAT(IObuff, shortmess(SHM_LAST) ? _("[noeol]") : _("[Incomplete last line]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5345 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5346
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5347 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5348 * Check modification time of file, before writing to it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5349 * The size isn't checked, because using a tool like "gzip" takes care of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5350 * using the same timestamp but can't set the size.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5351 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5352 static int
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
5353 check_mtime(buf_T *buf, stat_T *st)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5354 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5355 if (buf->b_mtime_read != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5356 && time_differs((long)st->st_mtime, buf->b_mtime_read))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5357 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5358 msg_scroll = TRUE; /* don't overwrite messages here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5359 msg_silent = 0; /* must give this prompt */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5360 /* don't use emsg() here, don't want to flush the buffers */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5361 MSG_ATTR(_("WARNING: The file has been changed since reading it!!!"),
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
5362 HL_ATTR(HLF_E));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5363 if (ask_yesno((char_u *)_("Do you really want to write to it"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5364 TRUE) == 'n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5365 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5366 msg_scroll = FALSE; /* always overwrite the file message now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5367 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5368 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5369 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5370
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5371 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5372 time_differs(long t1, long t2)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5373 {
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
5374 #if defined(__linux__) || defined(MSWIN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5375 /* On a FAT filesystem, esp. under Linux, there are only 5 bits to store
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5376 * the seconds. Since the roundoff is done when flushing the inode, the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5377 * time may change unexpectedly by one second!!! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5378 return (t1 - t2 > 1 || t2 - t1 > 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5379 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5380 return (t1 != t2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5381 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5382 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5383
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5384 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5385 * Call write() to write a number of bytes to the file.
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
5386 * Handles encryption and 'encoding' conversion.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5387 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5388 * Return FAIL for failure, OK otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5389 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5390 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5391 buf_write_bytes(struct bw_info *ip)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5392 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5393 int wlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5394 char_u *buf = ip->bw_buf; /* data to write */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5395 int len = ip->bw_len; /* length of data */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5396 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5397 int flags = ip->bw_flags; /* extra flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5398 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5399
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5400 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5401 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5402 * Skip conversion when writing the crypt magic number or the BOM.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5403 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5404 if (!(flags & FIO_NOCONVERT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5405 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5406 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5407 unsigned c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5408 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5409
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5410 if (flags & FIO_UTF8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5411 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5412 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5413 * Convert latin1 in the buffer to UTF-8 in the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5414 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5415 p = ip->bw_conv_buf; /* translate to buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5416 for (wlen = 0; wlen < len; ++wlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5417 p += utf_char2bytes(buf[wlen], p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5418 buf = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5419 len = (int)(p - ip->bw_conv_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5420 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5421 else if (flags & (FIO_UCS4 | FIO_UTF16 | FIO_UCS2 | FIO_LATIN1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5422 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5423 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5424 * Convert UTF-8 bytes in the buffer to UCS-2, UCS-4, UTF-16 or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5425 * Latin1 chars in the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5426 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5427 if (flags & FIO_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5428 p = buf; /* translate in-place (can only get shorter) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5429 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5430 p = ip->bw_conv_buf; /* translate to buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5431 for (wlen = 0; wlen < len; wlen += n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5432 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5433 if (wlen == 0 && ip->bw_restlen != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5434 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5435 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5436
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5437 /* Use remainder of previous call. Append the start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5438 * buf[] to get a full sequence. Might still be too
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5439 * short! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5440 l = CONV_RESTLEN - ip->bw_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5441 if (l > len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5442 l = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5443 mch_memmove(ip->bw_rest + ip->bw_restlen, buf, (size_t)l);
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
5444 n = utf_ptr2len_len(ip->bw_rest, ip->bw_restlen + l);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5445 if (n > ip->bw_restlen + len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5446 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5447 /* We have an incomplete byte sequence at the end to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5448 * be written. We can't convert it without the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5449 * remaining bytes. Keep them for the next call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5450 if (ip->bw_restlen + len > CONV_RESTLEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5451 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5452 ip->bw_restlen += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5453 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5454 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5455 if (n > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5456 c = utf_ptr2char(ip->bw_rest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5457 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5458 c = ip->bw_rest[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5459 if (n >= ip->bw_restlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5460 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5461 n -= ip->bw_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5462 ip->bw_restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5463 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5464 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5465 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5466 ip->bw_restlen -= n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5467 mch_memmove(ip->bw_rest, ip->bw_rest + n,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5468 (size_t)ip->bw_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5469 n = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5470 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5471 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5472 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5473 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
5474 n = utf_ptr2len_len(buf + wlen, len - wlen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5475 if (n > len - wlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5476 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5477 /* We have an incomplete byte sequence at the end to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5478 * be written. We can't convert it without the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5479 * remaining bytes. Keep them for the next call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5480 if (len - wlen > CONV_RESTLEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5481 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5482 ip->bw_restlen = len - wlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5483 mch_memmove(ip->bw_rest, buf + wlen,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5484 (size_t)ip->bw_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5485 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5486 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5487 if (n > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5488 c = utf_ptr2char(buf + wlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5489 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5490 c = buf[wlen];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5491 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5492
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5493 if (ucs2bytes(c, &p, flags) && !ip->bw_conv_error)
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5494 {
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5495 ip->bw_conv_error = TRUE;
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5496 ip->bw_conv_error_lnum = ip->bw_start_lnum;
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5497 }
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5498 if (c == NL)
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5499 ++ip->bw_start_lnum;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5500 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5501 if (flags & FIO_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5502 len = (int)(p - buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5503 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5504 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5505 buf = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5506 len = (int)(p - ip->bw_conv_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5507 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5508 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5509
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5510 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5511 else if (flags & FIO_CODEPAGE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5512 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5513 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5514 * Convert UTF-8 or codepage to UCS-2 and then to MS-Windows
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5515 * codepage.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5516 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5517 char_u *from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5518 size_t fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5519 char_u *to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5520 int u8c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5521 BOOL bad = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5522 int needed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5523
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5524 if (ip->bw_restlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5525 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5526 /* Need to concatenate the remainder of the previous call and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5527 * the bytes of the current call. Use the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5528 * conversion buffer for this. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5529 fromlen = len + ip->bw_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5530 from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5531 mch_memmove(from, ip->bw_rest, (size_t)ip->bw_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5532 mch_memmove(from + ip->bw_restlen, buf, (size_t)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5533 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5534 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5535 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5536 from = buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5537 fromlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5538 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5539
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5540 to = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5541 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5542 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5543 /* Convert from UTF-8 to UCS-2, to the start of the buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5544 * The buffer has been allocated to be big enough. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5545 while (fromlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5546 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
5547 n = (int)utf_ptr2len_len(from, (int)fromlen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5548 if (n > (int)fromlen) /* incomplete byte sequence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5549 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5550 u8c = utf_ptr2char(from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5551 *to++ = (u8c & 0xff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5552 *to++ = (u8c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5553 fromlen -= n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5554 from += n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5555 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5556
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5557 /* Copy remainder to ip->bw_rest[] to be used for the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5558 * call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5559 if (fromlen > CONV_RESTLEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5560 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5561 /* weird overlong sequence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5562 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5563 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5564 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5565 mch_memmove(ip->bw_rest, from, fromlen);
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
5566 ip->bw_restlen = (int)fromlen;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5567 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5568 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5569 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5570 /* Convert from enc_codepage to UCS-2, to the start of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5571 * buffer. The buffer has been allocated to be big enough. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5572 ip->bw_restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5573 needed = MultiByteToWideChar(enc_codepage,
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5574 MB_ERR_INVALID_CHARS, (LPCSTR)from, (int)fromlen,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5575 NULL, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5576 if (needed == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5577 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5578 /* When conversion fails there may be a trailing byte. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5579 needed = MultiByteToWideChar(enc_codepage,
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5580 MB_ERR_INVALID_CHARS, (LPCSTR)from, (int)fromlen - 1,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5581 NULL, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5582 if (needed == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5583 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5584 /* Conversion doesn't work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5585 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5586 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5587 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5588 /* Save the trailing byte for the next call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5589 ip->bw_rest[0] = from[fromlen - 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5590 ip->bw_restlen = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5591 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5592 needed = MultiByteToWideChar(enc_codepage, MB_ERR_INVALID_CHARS,
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5593 (LPCSTR)from, (int)(fromlen - ip->bw_restlen),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5594 (LPWSTR)to, needed);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5595 if (needed == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5596 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5597 /* Safety check: Conversion doesn't work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5598 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5599 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5600 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5601 to += needed * 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5602 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5603
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5604 fromlen = to - ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5605 buf = to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5606 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5607 if (FIO_GET_CP(flags) == CP_UTF8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5608 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5609 /* Convert from UCS-2 to UTF-8, using the remainder of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5610 * conversion buffer. Fails when out of space. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5611 for (from = ip->bw_conv_buf; fromlen > 1; fromlen -= 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5612 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5613 u8c = *from++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5614 u8c += (*from++ << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5615 to += utf_char2bytes(u8c, to);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5616 if (to + 6 >= ip->bw_conv_buf + ip->bw_conv_buflen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5617 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5618 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5619 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5620 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5621 }
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
5622 len = (int)(to - buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5623 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5624 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5625 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5626 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5627 /* Convert from UCS-2 to the codepage, using the remainder of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5628 * the conversion buffer. If the conversion uses the default
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5629 * character "0", the data doesn't fit in this encoding, so
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5630 * fail. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5631 len = WideCharToMultiByte(FIO_GET_CP(flags), 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5632 (LPCWSTR)ip->bw_conv_buf, (int)fromlen / sizeof(WCHAR),
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5633 (LPSTR)to, (int)(ip->bw_conv_buflen - fromlen), 0,
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5634 &bad);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5635 if (bad)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5636 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5637 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5638 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5639 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5640 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5641 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5642 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5643
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
5644 # ifdef MACOS_CONVERT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5645 else if (flags & FIO_MACROMAN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5646 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5647 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5648 * Convert UTF-8 or latin1 to Apple MacRoman.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5649 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5650 char_u *from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5651 size_t fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5652
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5653 if (ip->bw_restlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5654 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5655 /* Need to concatenate the remainder of the previous call and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5656 * the bytes of the current call. Use the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5657 * conversion buffer for this. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5658 fromlen = len + ip->bw_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5659 from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5660 mch_memmove(from, ip->bw_rest, (size_t)ip->bw_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5661 mch_memmove(from + ip->bw_restlen, buf, (size_t)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5662 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5663 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5664 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5665 from = buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5666 fromlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5667 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5668
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
5669 if (enc2macroman(from, fromlen,
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
5670 ip->bw_conv_buf, &len, ip->bw_conv_buflen,
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
5671 ip->bw_rest, &ip->bw_restlen) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5672 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5673 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5674 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5675 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5676 buf = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5677 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5678 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5679
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5680 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5681 if (ip->bw_iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5682 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5683 const char *from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5684 size_t fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5685 char *to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5686 size_t tolen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5687
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5688 /* Convert with iconv(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5689 if (ip->bw_restlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5690 {
1836
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5691 char *fp;
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5692
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5693 /* Need to concatenate the remainder of the previous call and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5694 * the bytes of the current call. Use the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5695 * conversion buffer for this. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5696 fromlen = len + ip->bw_restlen;
1836
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5697 fp = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5698 mch_memmove(fp, ip->bw_rest, (size_t)ip->bw_restlen);
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5699 mch_memmove(fp + ip->bw_restlen, buf, (size_t)len);
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5700 from = fp;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5701 tolen = ip->bw_conv_buflen - fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5702 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5703 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5704 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5705 from = (const char *)buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5706 fromlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5707 tolen = ip->bw_conv_buflen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5709 to = (char *)ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5710
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5711 if (ip->bw_first)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5712 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5713 size_t save_len = tolen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5714
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5715 /* output the initial shift state sequence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5716 (void)iconv(ip->bw_iconv_fd, NULL, NULL, &to, &tolen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5717
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5718 /* There is a bug in iconv() on Linux (which appears to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5719 * wide-spread) which sets "to" to NULL and messes up "tolen".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5720 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5721 if (to == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5722 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5723 to = (char *)ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5724 tolen = save_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5725 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5726 ip->bw_first = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5727 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5728
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5729 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5730 * If iconv() has an error or there is not enough room, fail.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5731 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5732 if ((iconv(ip->bw_iconv_fd, (void *)&from, &fromlen, &to, &tolen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5733 == (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5734 || fromlen > CONV_RESTLEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5735 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5736 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5737 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5738 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5739
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5740 /* copy remainder to ip->bw_rest[] to be used for the next call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5741 if (fromlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5742 mch_memmove(ip->bw_rest, (void *)from, fromlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5743 ip->bw_restlen = (int)fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5744
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5745 buf = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5746 len = (int)((char_u *)to - ip->bw_conv_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5747 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5748 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5749 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5750 #endif /* FEAT_MBYTE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5751
11605
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
5752 if (ip->bw_fd < 0)
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
5753 /* Only checking conversion, which is OK if we get here. */
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
5754 return OK;
16ccaedce025 patch 8.0.0685: when conversion fails written file may be truncated
Christian Brabandt <cb@256bit.org>
parents: 11325
diff changeset
5755
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5756 #ifdef FEAT_CRYPT
6122
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5757 if (flags & FIO_ENCRYPTED)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5758 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5759 /* Encrypt the data. Do it in-place if possible, otherwise use an
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5760 * allocated buffer. */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5761 if (crypt_works_inplace(ip->bw_buffer->b_cryptstate))
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5762 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5763 crypt_encode_inplace(ip->bw_buffer->b_cryptstate, buf, len);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5764 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5765 else
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5766 {
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5767 char_u *outbuf;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5768
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5769 len = crypt_encode_alloc(curbuf->b_cryptstate, buf, len, &outbuf);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5770 if (len == 0)
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5771 return OK; /* Crypt layer is buffering, will flush later. */
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5772 wlen = write_eintr(ip->bw_fd, outbuf, len);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5773 vim_free(outbuf);
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5774 return (wlen < len) ? FAIL : OK;
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5775 }
18ac55444b37 updated for version 7.4.399
Bram Moolenaar <bram@vim.org>
parents: 5958
diff changeset
5776 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5777 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5778
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
5779 wlen = write_eintr(ip->bw_fd, buf, len);
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
5780 return (wlen < len) ? FAIL : OK;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5781 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5782
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5783 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5784 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5785 * Convert a Unicode character to bytes.
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5786 * Return TRUE for an error, FALSE when it's OK.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5787 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5788 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5789 ucs2bytes(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5790 unsigned c, /* in: character */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5791 char_u **pp, /* in/out: pointer to result */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5792 int flags) /* FIO_ flags */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5793 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5794 char_u *p = *pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5795 int error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5796 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5797
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5798
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5799 if (flags & FIO_UCS4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5800 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5801 if (flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5802 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5803 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5804 *p++ = (c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5805 *p++ = (c >> 16);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5806 *p++ = (c >> 24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5807 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5808 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5809 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5810 *p++ = (c >> 24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5811 *p++ = (c >> 16);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5812 *p++ = (c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5813 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5814 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5815 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5816 else if (flags & (FIO_UCS2 | FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5817 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5818 if (c >= 0x10000)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5819 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5820 if (flags & FIO_UTF16)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5821 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5822 /* Make two words, ten bits of the character in each. First
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5823 * word is 0xd800 - 0xdbff, second one 0xdc00 - 0xdfff */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5824 c -= 0x10000;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5825 if (c >= 0x100000)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5826 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5827 cc = ((c >> 10) & 0x3ff) + 0xd800;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5828 if (flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5829 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5830 *p++ = cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5831 *p++ = ((unsigned)cc >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5832 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5833 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5834 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5835 *p++ = ((unsigned)cc >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5836 *p++ = cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5837 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5838 c = (c & 0x3ff) + 0xdc00;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5839 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5840 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5841 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5842 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5843 if (flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5844 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5845 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5846 *p++ = (c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5847 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5848 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5849 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5850 *p++ = (c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5851 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5852 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5853 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5854 else /* Latin1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5855 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5856 if (c >= 0x100)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5857 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5858 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5859 *p++ = 0xBF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5860 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5861 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5862 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5863 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5864
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5865 *pp = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5866 return error;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5867 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5868
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5869 /*
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5870 * Return TRUE if file encoding "fenc" requires conversion from or to
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5871 * 'encoding'.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5872 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5873 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5874 need_conversion(char_u *fenc)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5875 {
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5876 int same_encoding;
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5877 int enc_flags;
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5878 int fenc_flags;
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5879
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5880 if (*fenc == NUL || STRCMP(p_enc, fenc) == 0)
2217
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2215
diff changeset
5881 {
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5882 same_encoding = TRUE;
2217
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2215
diff changeset
5883 fenc_flags = 0;
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2215
diff changeset
5884 }
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5885 else
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5886 {
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5887 /* Ignore difference between "ansi" and "latin1", "ucs-4" and
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5888 * "ucs-4be", etc. */
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5889 enc_flags = get_fio_flags(p_enc);
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5890 fenc_flags = get_fio_flags(fenc);
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5891 same_encoding = (enc_flags != 0 && fenc_flags == enc_flags);
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5892 }
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5893 if (same_encoding)
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5894 {
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5895 /* Specified encoding matches with 'encoding'. This requires
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5896 * conversion when 'encoding' is Unicode but not UTF-8. */
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5897 return enc_unicode != 0;
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5898 }
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5899
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5900 /* Encodings differ. However, conversion is not needed when 'enc' is any
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5901 * Unicode encoding and the file is UTF-8. */
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5902 return !(enc_utf8 && fenc_flags == FIO_UTF8);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5903 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5904
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5905 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5906 * Check "ptr" for a unicode encoding and return the FIO_ flags needed for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5907 * internal conversion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5908 * if "ptr" is an empty string, use 'encoding'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5909 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5910 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5911 get_fio_flags(char_u *ptr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5912 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5913 int prop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5914
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5915 if (*ptr == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5916 ptr = p_enc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5917
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5918 prop = enc_canon_props(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5919 if (prop & ENC_UNICODE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5920 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5921 if (prop & ENC_2BYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5922 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5923 if (prop & ENC_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5924 return FIO_UCS2 | FIO_ENDIAN_L;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5925 return FIO_UCS2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5926 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5927 if (prop & ENC_4BYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5928 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5929 if (prop & ENC_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5930 return FIO_UCS4 | FIO_ENDIAN_L;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5931 return FIO_UCS4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5932 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5933 if (prop & ENC_2WORD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5934 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5935 if (prop & ENC_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5936 return FIO_UTF16 | FIO_ENDIAN_L;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5937 return FIO_UTF16;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5938 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5939 return FIO_UTF8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5940 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5941 if (prop & ENC_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5942 return FIO_LATIN1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5943 /* must be ENC_DBCS, requires iconv() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5944 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5945 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5946
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5947 #ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5948 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5949 * Check "ptr" for a MS-Windows codepage name and return the FIO_ flags needed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5950 * for the conversion MS-Windows can do for us. Also accept "utf-8".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5951 * Used for conversion between 'encoding' and 'fileencoding'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5952 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5953 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5954 get_win_fio_flags(char_u *ptr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5955 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5956 int cp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5957
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5958 /* Cannot do this when 'encoding' is not utf-8 and not a codepage. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5959 if (!enc_utf8 && enc_codepage <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5960 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5961
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5962 cp = encname2codepage(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5963 if (cp == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5964 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5965 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5966 if (STRCMP(ptr, "utf-8") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5967 cp = CP_UTF8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5968 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5969 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5970 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5971 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5972 return FIO_PUT_CP(cp) | FIO_CODEPAGE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5973 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5974 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5975
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5976 #ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5977 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5978 * Check "ptr" for a Carbon supported encoding and return the FIO_ flags
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5979 * needed for the internal conversion to/from utf-8 or latin1.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5980 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5981 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5982 get_mac_fio_flags(char_u *ptr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5983 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5984 if ((enc_utf8 || STRCMP(p_enc, "latin1") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5985 && (enc_canon_props(ptr) & ENC_MACROMAN))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5986 return FIO_MACROMAN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5987 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5988 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5989 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5990
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5991 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5992 * Check for a Unicode BOM (Byte Order Mark) at the start of p[size].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5993 * "size" must be at least 2.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5994 * Return the name of the encoding and set "*lenp" to the length.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5995 * Returns NULL when no BOM found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5996 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5997 static char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5998 check_for_bom(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
5999 char_u *p,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6000 long size,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6001 int *lenp,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6002 int flags)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6003 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6004 char *name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6005 int len = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6006
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6007 if (p[0] == 0xef && p[1] == 0xbb && size >= 3 && p[2] == 0xbf
1688
17526daaf79d updated for version 7.2b-021
vimboss
parents: 1665
diff changeset
6008 && (flags == FIO_ALL || flags == FIO_UTF8 || flags == 0))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6009 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6010 name = "utf-8"; /* EF BB BF */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6011 len = 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6012 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6013 else if (p[0] == 0xff && p[1] == 0xfe)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6014 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6015 if (size >= 4 && p[2] == 0 && p[3] == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6016 && (flags == FIO_ALL || flags == (FIO_UCS4 | FIO_ENDIAN_L)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6017 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6018 name = "ucs-4le"; /* FF FE 00 00 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6019 len = 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6020 }
1735
35abb7026415 updated for version 7.2-033
vimboss
parents: 1733
diff changeset
6021 else if (flags == (FIO_UCS2 | FIO_ENDIAN_L))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6022 name = "ucs-2le"; /* FF FE */
1735
35abb7026415 updated for version 7.2-033
vimboss
parents: 1733
diff changeset
6023 else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L))
35abb7026415 updated for version 7.2-033
vimboss
parents: 1733
diff changeset
6024 /* utf-16le is preferred, it also works for ucs-2le text */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6025 name = "utf-16le"; /* FF FE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6026 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6027 else if (p[0] == 0xfe && p[1] == 0xff
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6028 && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6029 {
1547
e72e30c69d58 updated for version 7.1-261
vimboss
parents: 1486
diff changeset
6030 /* Default to utf-16, it works also for ucs-2 text. */
e72e30c69d58 updated for version 7.1-261
vimboss
parents: 1486
diff changeset
6031 if (flags == FIO_UCS2)
e72e30c69d58 updated for version 7.1-261
vimboss
parents: 1486
diff changeset
6032 name = "ucs-2"; /* FE FF */
e72e30c69d58 updated for version 7.1-261
vimboss
parents: 1486
diff changeset
6033 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6034 name = "utf-16"; /* FE FF */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6035 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6036 else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6037 && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6038 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6039 name = "ucs-4"; /* 00 00 FE FF */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6040 len = 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6041 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6043 *lenp = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6044 return (char_u *)name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6045 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6046
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6047 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6048 * Generate a BOM in "buf[4]" for encoding "name".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6049 * Return the length of the BOM (zero when no BOM).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6050 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6051 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6052 make_bom(char_u *buf, char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6053 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6054 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6055 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6056
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6057 flags = get_fio_flags(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6058
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6059 /* Can't put a BOM in a non-Unicode file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6060 if (flags == FIO_LATIN1 || flags == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6061 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6062
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6063 if (flags == FIO_UTF8) /* UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6064 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6065 buf[0] = 0xef;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6066 buf[1] = 0xbb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6067 buf[2] = 0xbf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6068 return 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6069 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6070 p = buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6071 (void)ucs2bytes(0xfeff, &p, flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6072 return (int)(p - buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6073 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6074 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6075
1418
bac7c3fce150 updated for version 7.1-133
vimboss
parents: 1411
diff changeset
6076 #if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \
1471
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
6077 defined(FEAT_QUICKFIX) || defined(FEAT_AUTOCMD) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6078 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6079 * Try to find a shortname by comparing the fullname with the current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6080 * directory.
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6081 * Returns "full_path" or pointer into "full_path" if shortened.
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6082 */
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6083 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6084 shorten_fname1(char_u *full_path)
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6085 {
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2717
diff changeset
6086 char_u *dirname;
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6087 char_u *p = full_path;
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6088
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2717
diff changeset
6089 dirname = alloc(MAXPATHL);
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2717
diff changeset
6090 if (dirname == NULL)
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2717
diff changeset
6091 return full_path;
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6092 if (mch_dirname(dirname, MAXPATHL) == OK)
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6093 {
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6094 p = shorten_fname(full_path, dirname);
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6095 if (p == NULL || *p == NUL)
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6096 p = full_path;
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6097 }
2770
25672ad7f377 updated for version 7.3.161
Bram Moolenaar <bram@vim.org>
parents: 2717
diff changeset
6098 vim_free(dirname);
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6099 return p;
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6100 }
1418
bac7c3fce150 updated for version 7.1-133
vimboss
parents: 1411
diff changeset
6101 #endif
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6102
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6103 /*
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6104 * Try to find a shortname by comparing the fullname with the current
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6105 * directory.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6106 * Returns NULL if not shorter name possible, pointer into "full_path"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6107 * otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6108 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6109 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6110 shorten_fname(char_u *full_path, char_u *dir_name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6111 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6112 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6113 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6114
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6115 if (full_path == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6116 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6117 len = (int)STRLEN(dir_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6118 if (fnamencmp(dir_name, full_path, len) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6119 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6120 p = full_path + len;
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
6121 #if defined(MSWIN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6122 /*
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
6123 * MSWIN: when a file is in the root directory, dir_name will end in a
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6124 * slash, since C: by itself does not define a specific dir. In this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6125 * case p may already be correct. <negri>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6126 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6127 if (!((len > 2) && (*(p - 2) == ':')))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6128 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6129 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6130 if (vim_ispathsep(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6131 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6132 #ifndef VMS /* the path separator is always part of the path */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6133 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6134 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6135 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6136 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6137 }
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
6138 #if defined(MSWIN)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6139 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6140 * When using a file in the current drive, remove the drive name:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6141 * "A:\dir\file" -> "\dir\file". This helps when moving a session file on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6142 * a floppy from "A:\dir" to "B:\dir".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6143 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6144 else if (len > 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6145 && TOUPPER_LOC(full_path[0]) == TOUPPER_LOC(dir_name[0])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6146 && full_path[1] == ':'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6147 && vim_ispathsep(full_path[2]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6148 p = full_path + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6149 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6150 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6151 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6152 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6153 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6154
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6155 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6156 * Shorten filenames for all buffers.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6157 * When "force" is TRUE: Use full path from now on for files currently being
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6158 * edited, both for file name and swap file name. Try to shorten the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6159 * names a bit, if safe to do so.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6160 * When "force" is FALSE: Only try to shorten absolute file names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6161 * For buffers that have buftype "nofile" or "scratch": never change the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6162 * name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6163 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6164 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6165 shorten_fnames(int force)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6166 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6167 char_u dirname[MAXPATHL];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6168 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6169 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6170
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6171 mch_dirname(dirname, MAXPATHL);
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9599
diff changeset
6172 FOR_ALL_BUFFERS(buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6173 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6174 if (buf->b_fname != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6175 #ifdef FEAT_QUICKFIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6176 && !bt_nofile(buf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6177 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6178 && !path_with_url(buf->b_fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6179 && (force
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6180 || buf->b_sfname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6181 || mch_isFullName(buf->b_sfname)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6182 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6183 vim_free(buf->b_sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6184 buf->b_sfname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6185 p = shorten_fname(buf->b_ffname, dirname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6186 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6187 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6188 buf->b_sfname = vim_strsave(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6189 buf->b_fname = buf->b_sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6190 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6191 if (p == NULL || buf->b_fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6192 buf->b_fname = buf->b_ffname;
9
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6193 }
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6194
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6195 /* Always make the swap file name a full path, a "nofile" buffer may
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6196 * also have a swap file. */
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6197 mf_fullname(buf->b_ml.ml_mfp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6199 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6200 status_redraw_all();
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 661
diff changeset
6201 redraw_tabline = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6202 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6203 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6204
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6205 #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6206 || defined(FEAT_GUI_MSWIN) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6207 || defined(FEAT_GUI_MAC) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6208 || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6209 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6210 * Shorten all filenames in "fnames[count]" by current directory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6211 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6212 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6213 shorten_filenames(char_u **fnames, int count)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6214 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6215 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6216 char_u dirname[MAXPATHL];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6217 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6218
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6219 if (fnames == NULL || count < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6220 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6221 mch_dirname(dirname, sizeof(dirname));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6222 for (i = 0; i < count; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6223 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6224 if ((p = shorten_fname(fnames[i], dirname)) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6225 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6226 /* shorten_fname() returns pointer in given "fnames[i]". If free
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6227 * "fnames[i]" first, "p" becomes invalid. So we need to copy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6228 * "p" first then free fnames[i]. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6229 p = vim_strsave(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6230 vim_free(fnames[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6231 fnames[i] = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6232 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6233 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6235 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6236
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6237 /*
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6238 * add extension to file name - change path/fo.o.h to path/fo.o.h.ext or
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6239 * fo_o_h.ext for MSDOS or when shortname option set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6240 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6241 * Assumed that fname is a valid name found in the filesystem we assure that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6242 * the return value is a different name and ends in 'ext'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6243 * "ext" MUST be at most 4 characters long if it starts with a dot, 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6244 * characters otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6245 * Space for the returned name is allocated, must be freed later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6246 * Returns NULL when out of memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6247 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6248 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6249 modname(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6250 char_u *fname,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6251 char_u *ext,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6252 int prepend_dot) /* may prepend a '.' to file name */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6253 {
8212
05b88224cea1 commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents: 8080
diff changeset
6254 return buf_modname((curbuf->b_p_sn || curbuf->b_shortname),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6255 fname, ext, prepend_dot);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6256 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6257
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6258 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6259 buf_modname(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6260 int shortname, /* use 8.3 file name */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6261 char_u *fname,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6262 char_u *ext,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6263 int prepend_dot) /* may prepend a '.' to file name */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6264 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6265 char_u *retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6266 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6267 char_u *e;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6268 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6269 int fnamelen, extlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6270
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6271 extlen = (int)STRLEN(ext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6272
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6273 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6274 * If there is no file name we must get the name of the current directory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6275 * (we need the full path in case :cd is used).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6276 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6277 if (fname == NULL || *fname == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6278 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6279 retval = alloc((unsigned)(MAXPATHL + extlen + 3));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6280 if (retval == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6281 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6282 if (mch_dirname(retval, MAXPATHL) == FAIL ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6283 (fnamelen = (int)STRLEN(retval)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6284 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6285 vim_free(retval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6286 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6287 }
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
6288 if (!after_pathsep(retval, retval + fnamelen))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6289 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6290 retval[fnamelen++] = PATHSEP;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6291 retval[fnamelen] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6292 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6293 prepend_dot = FALSE; /* nothing to prepend a dot to */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6294 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6295 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6296 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6297 fnamelen = (int)STRLEN(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6298 retval = alloc((unsigned)(fnamelen + extlen + 3));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6299 if (retval == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6300 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6301 STRCPY(retval, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6302 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6303 vms_remove_version(retval); /* we do not need versions here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6304 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6305 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6306
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6307 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6308 * search backwards until we hit a '/', '\' or ':' replacing all '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6309 * by '_' for MSDOS or when shortname option set and ext starts with a dot.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6310 * Then truncate what is after the '/', '\' or ':' to 8 characters for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6311 * MSDOS and 26 characters for AMIGA, a lot more for UNIX.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6312 */
11127
506f5d8b7d8b patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11121
diff changeset
6313 for (ptr = retval + fnamelen; ptr > retval; MB_PTR_BACK(retval, ptr))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6314 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6315 if (*ext == '.'
2823
8bd38abda314 updated for version 7.3.187
Bram Moolenaar <bram@vim.org>
parents: 2793
diff changeset
6316 #ifdef USE_LONG_FNAME
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6317 && (!USE_LONG_FNAME || shortname)
2823
8bd38abda314 updated for version 7.3.187
Bram Moolenaar <bram@vim.org>
parents: 2793
diff changeset
6318 #else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6319 && shortname
2823
8bd38abda314 updated for version 7.3.187
Bram Moolenaar <bram@vim.org>
parents: 2793
diff changeset
6320 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6321 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6322 if (*ptr == '.') /* replace '.' by '_' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6323 *ptr = '_';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6324 if (vim_ispathsep(*ptr))
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6325 {
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6326 ++ptr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6327 break;
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6328 }
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6329 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6330
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6331 /* the file name has at most BASENAMELEN characters. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6332 if (STRLEN(ptr) > (unsigned)BASENAMELEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6333 ptr[BASENAMELEN] = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6334
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6335 s = ptr + STRLEN(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6336
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6337 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6338 * For 8.3 file names we may have to reduce the length.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6339 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6340 #ifdef USE_LONG_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6341 if (!USE_LONG_FNAME || shortname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6342 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6343 if (shortname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6344 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6345 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6346 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6347 * If there is no file name, or the file name ends in '/', and the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6348 * extension starts with '.', put a '_' before the dot, because just
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6349 * ".ext" is invalid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6350 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6351 if (fname == NULL || *fname == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6352 || vim_ispathsep(fname[STRLEN(fname) - 1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6353 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6354 if (*ext == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6355 *s++ = '_';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6356 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6357 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6358 * If the extension starts with '.', truncate the base name at 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6359 * characters
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6360 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6361 else if (*ext == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6362 {
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
6363 if ((size_t)(s - ptr) > (size_t)8)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6364 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6365 s = ptr + 8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6366 *s = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6367 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6368 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6369 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6370 * If the extension doesn't start with '.', and the file name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6371 * doesn't have an extension yet, append a '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6372 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6373 else if ((e = vim_strchr(ptr, '.')) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6374 *s++ = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6375 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6376 * If the extension doesn't start with '.', and there already is an
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
6377 * extension, it may need to be truncated
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6378 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6379 else if ((int)STRLEN(e) + extlen > 4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6380 s = e + 4 - extlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6381 }
7408
1886f2863437 commit https://github.com/vim/vim/commit/e7fedb6ebe72d9a475aa65109b77d5ed4667067a
Christian Brabandt <cb@256bit.org>
parents: 7320
diff changeset
6382 #if defined(USE_LONG_FNAME) || defined(WIN3264)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6383 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6384 * If there is no file name, and the extension starts with '.', put a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6385 * '_' before the dot, because just ".ext" may be invalid if it's on a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6386 * FAT partition, and on HPFS it doesn't matter.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6387 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6388 else if ((fname == NULL || *fname == NUL) && *ext == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6389 *s++ = '_';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6390 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6391
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6392 /*
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6393 * Append the extension.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6394 * ext can start with '.' and cannot exceed 3 more characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6395 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6396 STRCPY(s, ext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6397
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6398 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6399 * Prepend the dot.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6400 */
2823
8bd38abda314 updated for version 7.3.187
Bram Moolenaar <bram@vim.org>
parents: 2793
diff changeset
6401 if (prepend_dot && !shortname && *(e = gettail(retval)) != '.'
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6402 #ifdef USE_LONG_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6403 && USE_LONG_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6404 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6405 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6406 {
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1597
diff changeset
6407 STRMOVE(e + 1, e);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6408 *e = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6409 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6410
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6411 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6412 * Check that, after appending the extension, the file name is really
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6413 * different.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6414 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6415 if (fname != NULL && STRCMP(fname, retval) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6416 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6417 /* we search for a character that can be replaced by '_' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6418 while (--s >= ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6419 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6420 if (*s != '_')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6421 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6422 *s = '_';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6423 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6425 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6426 if (s < ptr) /* fname was "________.<ext>", how tricky! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6427 *ptr = 'v';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6429 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6430 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6431
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6432 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6433 * Like fgets(), but if the file line is too long, it is truncated and the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6434 * rest of the line is thrown away. Returns TRUE for end-of-file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6435 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6436 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6437 vim_fgets(char_u *buf, int size, FILE *fp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6438 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6439 char *eof;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6440 #define FGETS_SIZE 200
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6441 char tbuf[FGETS_SIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6442
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6443 buf[size - 2] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6444 #ifdef USE_CR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6445 eof = fgets_cr((char *)buf, size, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6446 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6447 eof = fgets((char *)buf, size, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6448 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6449 if (buf[size - 2] != NUL && buf[size - 2] != '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6450 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6451 buf[size - 1] = NUL; /* Truncate the line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6452
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6453 /* Now throw away the rest of the line: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6454 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6455 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6456 tbuf[FGETS_SIZE - 2] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6457 #ifdef USE_CR
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
6458 ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6459 #else
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
6460 ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6461 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6462 } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6463 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6464 return (eof == NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6465 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6466
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6467 #if defined(USE_CR) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6468 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6469 * Like vim_fgets(), but accept any line terminator: CR, CR-LF or LF.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6470 * Returns TRUE for end-of-file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6471 * Only used for the Mac, because it's much slower than vim_fgets().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6472 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6473 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6474 tag_fgets(char_u *buf, int size, FILE *fp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6475 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6476 int i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6477 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6478 int eof = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6479
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6480 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6481 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6482 c = fgetc(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6483 if (c == EOF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6484 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6485 eof = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6486 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6487 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6488 if (c == '\r')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6489 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6490 /* Always store a NL for end-of-line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6491 if (i < size - 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6492 buf[i++] = '\n';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6493 c = fgetc(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6494 if (c != '\n') /* Macintosh format: single CR. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6495 ungetc(c, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6496 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6497 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6498 if (i < size - 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6499 buf[i++] = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6500 if (c == '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6501 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6502 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6503 buf[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6504 return eof;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6505 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6506 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6507
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6508 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6509 * rename() only works if both files are on the same file system, this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6510 * function will (attempts to?) copy the file across if rename fails -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6511 * Return -1 for failure, 0 for success.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6512 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6513 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6514 vim_rename(char_u *from, char_u *to)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6515 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6516 int fd_in;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6517 int fd_out;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6518 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6519 char *errmsg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6520 char *buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6521 #ifdef AMIGA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6522 BPTR flock;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6523 #endif
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
6524 stat_T st;
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6525 long perm;
199
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6526 #ifdef HAVE_ACL
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6527 vim_acl_T acl; /* ACL from original file */
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6528 #endif
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6529 int use_tmp_file = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6530
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6531 /*
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6532 * When the names are identical, there is nothing to do. When they refer
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6533 * to the same file (ignoring case and slash/backslash differences) but
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6534 * the file name differs we need to go through a temp file.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6535 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6536 if (fnamecmp(from, to) == 0)
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6537 {
4242
edd0bc1f26bd updated for version 7.3.872
Bram Moolenaar <bram@vim.org>
parents: 4232
diff changeset
6538 if (p_fic && STRCMP(gettail(from), gettail(to)) != 0)
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6539 use_tmp_file = TRUE;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6540 else
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6541 return 0;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6542 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6543
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6544 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6545 * Fail if the "from" file doesn't exist. Avoids that "to" is deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6546 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6547 if (mch_stat((char *)from, &st) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6548 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6549
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6550 #ifdef UNIX
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6551 {
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
6552 stat_T st_to;
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6553
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6554 /* It's possible for the source and destination to be the same file.
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6555 * This happens when "from" and "to" differ in case and are on a FAT32
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6556 * filesystem. In that case go through a temp file name. */
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6557 if (mch_stat((char *)to, &st_to) >= 0
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6558 && st.st_dev == st_to.st_dev
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6559 && st.st_ino == st_to.st_ino)
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6560 use_tmp_file = TRUE;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6561 }
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6562 #endif
2793
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6563 #ifdef WIN3264
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6564 {
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6565 BY_HANDLE_FILE_INFORMATION info1, info2;
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6566
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6567 /* It's possible for the source and destination to be the same file.
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6568 * In that case go through a temp file name. This makes rename("foo",
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6569 * "./foo") a no-op (in a complicated way). */
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6570 if (win32_fileinfo(from, &info1) == FILEINFO_OK
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6571 && win32_fileinfo(to, &info2) == FILEINFO_OK
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6572 && info1.dwVolumeSerialNumber == info2.dwVolumeSerialNumber
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6573 && info1.nFileIndexHigh == info2.nFileIndexHigh
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6574 && info1.nFileIndexLow == info2.nFileIndexLow)
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6575 use_tmp_file = TRUE;
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6576 }
ee48b3da9d53 updated for version 7.3.172
Bram Moolenaar <bram@vim.org>
parents: 2770
diff changeset
6577 #endif
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6578
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6579 if (use_tmp_file)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6580 {
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6581 char tempname[MAXPATHL + 1];
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6582
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6583 /*
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6584 * Find a name that doesn't exist and is in the same directory.
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6585 * Rename "from" to "tempname" and then rename "tempname" to "to".
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6586 */
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6587 if (STRLEN(from) >= MAXPATHL - 5)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6588 return -1;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6589 STRCPY(tempname, from);
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6590 for (n = 123; n < 99999; ++n)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6591 {
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6592 sprintf((char *)gettail((char_u *)tempname), "%d", n);
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6593 if (mch_stat(tempname, &st) < 0)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6594 {
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6595 if (mch_rename((char *)from, tempname) == 0)
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6596 {
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6597 if (mch_rename(tempname, (char *)to) == 0)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6598 return 0;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6599 /* Strange, the second step failed. Try moving the
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6600 * file back and return failure. */
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6601 mch_rename(tempname, (char *)from);
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6602 return -1;
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6603 }
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6604 /* If it fails for one temp name it will most likely fail
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6605 * for any temp name, give up. */
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6606 return -1;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6607 }
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6608 }
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6609 return -1;
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6610 }
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6611
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6612 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6613 * Delete the "to" file, this is required on some systems to make the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6614 * mch_rename() work, on other systems it makes sure that we don't have
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6615 * two files when the mch_rename() fails.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6616 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6617
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6618 #ifdef AMIGA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6619 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6620 * With MSDOS-compatible filesystems (crossdos, messydos) it is possible
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6621 * that the name of the "to" file is the same as the "from" file, even
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
6622 * though the names are different. To avoid the chance of accidentally
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6623 * deleting the "from" file (horror!) we lock it during the remove.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6624 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6625 * When used for making a backup before writing the file: This should not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6626 * happen with ":w", because startscript() should detect this problem and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6627 * set buf->b_shortname, causing modname() to return a correct ".bak" file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6628 * name. This problem does exist with ":w filename", but then the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6629 * original file will be somewhere else so the backup isn't really
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6630 * important. If autoscripting is off the rename may fail.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6631 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6632 flock = Lock((UBYTE *)from, (long)ACCESS_READ);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6633 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6634 mch_remove(to);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6635 #ifdef AMIGA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6636 if (flock)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6637 UnLock(flock);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6638 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6639
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6640 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6641 * First try a normal rename, return if it works.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6642 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6643 if (mch_rename((char *)from, (char *)to) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6644 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6645
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6646 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6647 * Rename() failed, try copying the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6648 */
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6649 perm = mch_getperm(from);
199
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6650 #ifdef HAVE_ACL
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6651 /* For systems that support ACL: get the ACL from the original file. */
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6652 acl = mch_get_acl(from);
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6653 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6654 fd_in = mch_open((char *)from, O_RDONLY|O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6655 if (fd_in == -1)
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6656 {
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6657 #ifdef HAVE_ACL
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6658 mch_free_acl(acl);
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6659 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6660 return -1;
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6661 }
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6662
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6663 /* Create the new file with same permissions as the original. */
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
6664 fd_out = mch_open((char *)to,
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
6665 O_CREAT|O_EXCL|O_WRONLY|O_EXTRA|O_NOFOLLOW, (int)perm);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6666 if (fd_out == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6667 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6668 close(fd_in);
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6669 #ifdef HAVE_ACL
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6670 mch_free_acl(acl);
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6671 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6672 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6673 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6674
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6675 buffer = (char *)alloc(BUFSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6676 if (buffer == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6677 {
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6678 close(fd_out);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6679 close(fd_in);
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6680 #ifdef HAVE_ACL
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6681 mch_free_acl(acl);
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6682 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6683 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6684 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6685
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
6686 while ((n = read_eintr(fd_in, buffer, BUFSIZE)) > 0)
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
6687 if (write_eintr(fd_out, buffer, n) != n)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6688 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6689 errmsg = _("E208: Error writing to \"%s\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6690 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6691 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6692
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6693 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6694 close(fd_in);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6695 if (close(fd_out) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6696 errmsg = _("E209: Error closing \"%s\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6697 if (n < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6698 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6699 errmsg = _("E210: Error reading \"%s\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6700 to = from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6701 }
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
6702 #ifndef UNIX /* for Unix mch_open() already set the permission */
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6703 mch_setperm(to, perm);
570
27d1ec742f17 updated for version 7.0162
vimboss
parents: 567
diff changeset
6704 #endif
199
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6705 #ifdef HAVE_ACL
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6706 mch_set_acl(to, acl);
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6707 mch_free_acl(acl);
199
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6708 #endif
5788
410ef4f1a3d2 updated for version 7.4.238
Bram Moolenaar <bram@vim.org>
parents: 5704
diff changeset
6709 #if defined(HAVE_SELINUX) || defined(HAVE_SMACK)
5483
9502d1caf90b updated for version 7.4.091
Bram Moolenaar <bram@vim.org>
parents: 5479
diff changeset
6710 mch_copy_sec(from, to);
5479
6707c44cec61 updated for version 7.4.089
Bram Moolenaar <bram@vim.org>
parents: 5322
diff changeset
6711 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6712 if (errmsg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6713 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6714 EMSG2(errmsg, to);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6715 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6717 mch_remove(from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6718 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6719 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6720
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6721 static int already_warned = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6722
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6723 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6724 * Check if any not hidden buffer has been changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6725 * Postpone the check if there are characters in the stuff buffer, a global
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6726 * command is being executed, a mapping is being executed or an autocommand is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6727 * busy.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6728 * Returns TRUE if some message was written (screen should be redrawn and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6729 * cursor positioned).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6730 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6731 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6732 check_timestamps(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6733 int focus) /* called for GUI focus event */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6734 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6735 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6736 int didit = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6737 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6738
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6739 /* Don't check timestamps while system() or another low-level function may
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6740 * cause us to lose and gain focus. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6741 if (no_check_timestamps > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6742 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6743
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6744 /* Avoid doing a check twice. The OK/Reload dialog can cause a focus
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6745 * event and we would keep on checking if the file is steadily growing.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6746 * Do check again after typing something. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6747 if (focus && did_check_timestamps)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6748 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6749 need_check_timestamps = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6750 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6751 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6752
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6753 if (!stuff_empty() || global_busy || !typebuf_typed()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6754 #ifdef FEAT_AUTOCMD
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
6755 || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6756 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6757 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6758 need_check_timestamps = TRUE; /* check later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6759 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6760 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6761 ++no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6762 did_check_timestamps = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6763 already_warned = FALSE;
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9599
diff changeset
6764 FOR_ALL_BUFFERS(buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6765 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6766 /* Only check buffers in a window. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6767 if (buf->b_nwindows > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6768 {
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6769 bufref_T bufref;
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6770
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6771 set_bufref(&bufref, buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6772 n = buf_check_timestamp(buf, focus);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6773 if (didit < n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6774 didit = n;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6775 if (n > 0 && !bufref_valid(&bufref))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6776 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6777 /* Autocommands have removed the buffer, start at the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6778 * first one again. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6779 buf = firstbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6780 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6781 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6782 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6783 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6784 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6785 need_check_timestamps = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6786 if (need_wait_return && didit == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6787 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6788 /* make sure msg isn't overwritten */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6789 msg_puts((char_u *)"\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6790 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6791 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6792 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6793 return didit;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6794 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6795
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6796 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6797 * Move all the lines from buffer "frombuf" to buffer "tobuf".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6798 * Return OK or FAIL. When FAIL "tobuf" is incomplete and/or "frombuf" is not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6799 * empty.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6800 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6801 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6802 move_lines(buf_T *frombuf, buf_T *tobuf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6803 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6804 buf_T *tbuf = curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6805 int retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6806 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6807 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6808
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6809 /* Copy the lines in "frombuf" to "tobuf". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6810 curbuf = tobuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6811 for (lnum = 1; lnum <= frombuf->b_ml.ml_line_count; ++lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6812 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6813 p = vim_strsave(ml_get_buf(frombuf, lnum, FALSE));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6814 if (p == NULL || ml_append(lnum - 1, p, 0, FALSE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6815 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6816 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6817 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6818 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6820 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6821 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6822
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6823 /* Delete all the lines in "frombuf". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6824 if (retval != FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6825 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6826 curbuf = frombuf;
1055
ef6b11bee7d0 updated for version 7.0-181
vimboss
parents: 1006
diff changeset
6827 for (lnum = curbuf->b_ml.ml_line_count; lnum > 0; --lnum)
ef6b11bee7d0 updated for version 7.0-181
vimboss
parents: 1006
diff changeset
6828 if (ml_delete(lnum, FALSE) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6829 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6830 /* Oops! We could try putting back the saved lines, but that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6831 * might fail again... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6832 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6833 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6834 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6835 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6836
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6837 curbuf = tbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6838 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6839 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6840
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6841 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6842 * Check if buffer "buf" has been changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6843 * Also check if the file for a new buffer unexpectedly appeared.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6844 * return 1 if a changed buffer was found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6845 * return 2 if a message has been displayed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6846 * return 0 otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6847 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6848 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6849 buf_check_timestamp(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6850 buf_T *buf,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
6851 int focus UNUSED) /* called for GUI focus event */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6852 {
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
6853 stat_T st;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6854 int stat_res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6855 int retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6856 char_u *path;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6857 char_u *tbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6858 char *mesg = NULL;
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
6859 char *mesg2 = "";
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6860 int helpmesg = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6861 int reload = FALSE;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6862 char *reason;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6863 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6864 int can_reload = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6865 #endif
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
6866 off_T orig_size = buf->b_orig_size;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6867 int orig_mode = buf->b_orig_mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6868 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6869 int save_mouse_correct = need_mouse_correct;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6870 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6871 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6872 static int busy = FALSE;
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6873 int n;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6874 char_u *s;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6875 bufref_T bufref;
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6876
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6877 set_bufref(&bufref, buf);
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6878 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6879
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6880 /* If there is no file name, the buffer is not loaded, 'buftype' is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6881 * set, we are in the middle of a save or being called recursively: ignore
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6882 * this buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6883 if (buf->b_ffname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6884 || buf->b_ml.ml_mfp == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6885 || *buf->b_p_bt != NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6886 || buf->b_saving
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6887 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6888 || busy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6889 #endif
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
6890 #ifdef FEAT_NETBEANS_INTG
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
6891 || isNetbeansBuffer(buf)
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
6892 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6893 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6894 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6895
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6896 if ( !(buf->b_flags & BF_NOTEDITED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6897 && buf->b_mtime != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6898 && ((stat_res = mch_stat((char *)buf->b_ffname, &st)) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6899 || time_differs((long)st.st_mtime, buf->b_mtime)
5863
1ee3fc5b40ae updated for version 7.4.274
Bram Moolenaar <bram@vim.org>
parents: 5816
diff changeset
6900 || st.st_size != buf->b_orig_size
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6901 #ifdef HAVE_ST_MODE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6902 || (int)st.st_mode != buf->b_orig_mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6903 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6904 || mch_getperm(buf->b_ffname) != buf->b_orig_mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6905 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6906 ))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6907 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6908 retval = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6909
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
6910 /* set b_mtime to stop further warnings (e.g., when executing
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
6911 * FileChangedShell autocmd) */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6912 if (stat_res < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6913 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6914 buf->b_mtime = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6915 buf->b_orig_size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6916 buf->b_orig_mode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6917 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6918 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6919 buf_store_time(buf, &st, buf->b_ffname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6920
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6921 /* Don't do anything for a directory. Might contain the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6922 * explorer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6923 if (mch_isdir(buf->b_fname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6924 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6925
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6926 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6927 * If 'autoread' is set, the buffer has no changes and the file still
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6928 * exists, reload the buffer. Use the buffer-local option value if it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6929 * was set, the global option value otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6930 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6931 else if ((buf->b_p_ar >= 0 ? buf->b_p_ar : p_ar)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6932 && !bufIsChanged(buf) && stat_res >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6933 reload = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6934 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6935 {
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6936 if (stat_res < 0)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6937 reason = "deleted";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6938 else if (bufIsChanged(buf))
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6939 reason = "conflict";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6940 else if (orig_size != buf->b_orig_size || buf_contents_changed(buf))
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6941 reason = "changed";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6942 else if (orig_mode != buf->b_orig_mode)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6943 reason = "mode";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6944 else
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6945 reason = "time";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6946
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6947 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6948 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6949 * Only give the warning if there are no FileChangedShell
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6950 * autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6951 * Avoid being called recursively by setting "busy".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6952 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6953 busy = TRUE;
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
6954 # ifdef FEAT_EVAL
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6955 set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6956 set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
6957 # endif
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
6958 ++allbuf_lock;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6959 n = apply_autocmds(EVENT_FILECHANGEDSHELL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6960 buf->b_fname, buf->b_fname, FALSE, buf);
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
6961 --allbuf_lock;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6962 busy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6963 if (n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6964 {
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
6965 if (!bufref_valid(&bufref))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6966 EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
6967 # ifdef FEAT_EVAL
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6968 s = get_vim_var_str(VV_FCS_CHOICE);
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6969 if (STRCMP(s, "reload") == 0 && *reason != 'd')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6970 reload = TRUE;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6971 else if (STRCMP(s, "ask") == 0)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6972 n = FALSE;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6973 else
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
6974 # endif
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6975 return 2;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6976 }
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6977 if (!n)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6978 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6979 {
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6980 if (*reason == 'd')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6981 mesg = _("E211: File \"%s\" no longer available");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6982 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6983 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6984 helpmesg = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6985 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6986 can_reload = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6987 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6988 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6989 * Check if the file contents really changed to avoid
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6990 * giving a warning when only the timestamp was set (e.g.,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6991 * checked out of CVS). Always warn when the buffer was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6992 * changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6993 */
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6994 if (reason[2] == 'n')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6995 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6996 mesg = _("W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as well");
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6997 mesg2 = _("See \":help W12\" for more info.");
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6998 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6999 else if (reason[1] == 'h')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
7000 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7001 mesg = _("W11: Warning: File \"%s\" has changed since editing started");
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
7002 mesg2 = _("See \":help W11\" for more info.");
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
7003 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
7004 else if (*reason == 'm')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
7005 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7006 mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started");
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
7007 mesg2 = _("See \":help W16\" for more info.");
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
7008 }
1913
bddda5d8caa1 updated for version 7.2-210
vimboss
parents: 1906
diff changeset
7009 else
bddda5d8caa1 updated for version 7.2-210
vimboss
parents: 1906
diff changeset
7010 /* Only timestamp changed, store it to avoid a warning
bddda5d8caa1 updated for version 7.2-210
vimboss
parents: 1906
diff changeset
7011 * in check_mtime() later. */
bddda5d8caa1 updated for version 7.2-210
vimboss
parents: 1906
diff changeset
7012 buf->b_mtime_read = buf->b_mtime;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7013 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7014 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7015 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7016
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7017 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7018 else if ((buf->b_flags & BF_NEW) && !(buf->b_flags & BF_NEW_W)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7019 && vim_fexists(buf->b_ffname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7020 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7021 retval = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7022 mesg = _("W13: Warning: File \"%s\" has been created after editing started");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7023 buf->b_flags |= BF_NEW_W;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7024 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7025 can_reload = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7026 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7027 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7028
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7029 if (mesg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7030 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7031 path = home_replace_save(buf, buf->b_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7032 if (path != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7033 {
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
7034 if (!helpmesg)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7035 mesg2 = "";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7036 tbuf = alloc((unsigned)(STRLEN(path) + STRLEN(mesg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7037 + STRLEN(mesg2) + 2));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7038 sprintf((char *)tbuf, mesg, path);
1848
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
7039 #ifdef FEAT_EVAL
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
7040 /* Set warningmsg here, before the unimportant and output-specific
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
7041 * mesg2 has been appended. */
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
7042 set_vim_var_string(VV_WARNINGMSG, tbuf, -1);
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
7043 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7044 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7045 if (can_reload)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7046 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7047 if (*mesg2 != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7048 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7049 STRCAT(tbuf, "\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7050 STRCAT(tbuf, mesg2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7051 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7052 if (do_dialog(VIM_WARNING, (char_u *)_("Warning"), tbuf,
2684
951641b8784d updated for version 7.3.102
Bram Moolenaar <bram@vim.org>
parents: 2666
diff changeset
7053 (char_u *)_("&OK\n&Load File"), 1, NULL, TRUE) == 2)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7054 reload = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7055 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7056 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7057 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7058 if (State > NORMAL_BUSY || (State & CMDLINE) || already_warned)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7059 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7060 if (*mesg2 != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7061 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7062 STRCAT(tbuf, "; ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7063 STRCAT(tbuf, mesg2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7065 EMSG(tbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7066 retval = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7067 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7068 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7069 {
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
7070 # ifdef FEAT_AUTOCMD
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7071 if (!autocmd_busy)
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
7072 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7073 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7074 msg_start();
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
7075 msg_puts_attr(tbuf, HL_ATTR(HLF_E) + MSG_HIST);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7076 if (*mesg2 != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7077 msg_puts_attr((char_u *)mesg2,
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
7078 HL_ATTR(HLF_W) + MSG_HIST);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7079 msg_clr_eos();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7080 (void)msg_end();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7081 if (emsg_silent == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7082 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7083 out_flush();
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
7084 # ifdef FEAT_GUI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7085 if (!focus)
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
7086 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7087 /* give the user some time to think about it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7088 ui_delay(1000L, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7089
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7090 /* don't redraw and erase the message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7091 redraw_cmdline = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7092 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7093 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7094 already_warned = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7096
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7097 vim_free(path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7098 vim_free(tbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7099 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7100 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7101
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7102 if (reload)
3776
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7103 {
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7104 /* Reload the buffer. */
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
7105 buf_reload(buf, orig_mode);
3776
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7106 #ifdef FEAT_PERSISTENT_UNDO
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7107 if (buf->b_p_udf && buf->b_ffname != NULL)
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7108 {
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7109 char_u hash[UNDO_HASH_SIZE];
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7110 buf_T *save_curbuf = curbuf;
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7111
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7112 /* Any existing undo file is unusable, write it now. */
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7113 curbuf = buf;
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7114 u_compute_hash(hash);
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7115 u_write_undo(NULL, FALSE, buf, hash);
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7116 curbuf = save_curbuf;
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7117 }
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7118 #endif
e70485d3f81d updated for version 7.3.646
Bram Moolenaar <bram@vim.org>
parents: 3676
diff changeset
7119 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7120
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7121 #ifdef FEAT_AUTOCMD
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1597
diff changeset
7122 /* Trigger FileChangedShell when the file was changed in any way. */
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
7123 if (bufref_valid(&bufref) && retval != 0)
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7124 (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7125 buf->b_fname, buf->b_fname, FALSE, buf);
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7126 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7127 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7128 /* restore this in case an autocommand has set it; it would break
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7129 * 'mousefocus' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7130 need_mouse_correct = save_mouse_correct;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7131 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7132
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7133 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7134 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7135
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7136 /*
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7137 * Reload a buffer that is already loaded.
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7138 * Used when the file was changed outside of Vim.
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
7139 * "orig_mode" is buf->b_orig_mode before the need for reloading was detected.
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
7140 * buf->b_orig_mode may have been reset already.
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7141 */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7142 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7143 buf_reload(buf_T *buf, int orig_mode)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7144 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7145 exarg_T ea;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7146 pos_T old_cursor;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7147 linenr_T old_topline;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7148 int old_ro = buf->b_p_ro;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7149 buf_T *savebuf;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
7150 bufref_T bufref;
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7151 int saved = OK;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7152 aco_save_T aco;
2394
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7153 int flags = READ_NEW;
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7154
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7155 /* set curwin/curbuf for "buf" and save some things */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7156 aucmd_prepbuf(&aco, buf);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7157
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7158 /* We only want to read the text from the file, not reset the syntax
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7159 * highlighting, clear marks, diff status, etc. Force the fileformat
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7160 * and encoding to be the same. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7161 if (prep_exarg(&ea, buf) == OK)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7162 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7163 old_cursor = curwin->w_cursor;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7164 old_topline = curwin->w_topline;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7165
2482
88751831fa0a When undoing a reload, move the cursor to the first changed line.
Bram Moolenaar <bram@vim.org>
parents: 2410
diff changeset
7166 if (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur)
2394
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7167 {
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7168 /* Save all the text, so that the reload can be undone.
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7169 * Sync first so that this is a separate undo-able action. */
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7170 u_sync(FALSE);
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7171 saved = u_savecommon(0, curbuf->b_ml.ml_line_count + 1, 0, TRUE);
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7172 flags |= READ_KEEP_UNDO;
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7173 }
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7174
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7175 /*
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7176 * To behave like when a new file is edited (matters for
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7177 * BufReadPost autocommands) we first need to delete the current
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7178 * buffer contents. But if reading the file fails we should keep
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7179 * the old contents. Can't use memory only, the file might be
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7180 * too big. Use a hidden buffer to move the buffer contents to.
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7181 */
11121
778c10516955 patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 10952
diff changeset
7182 if (BUFEMPTY() || saved == FAIL)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7183 savebuf = NULL;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7184 else
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7185 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7186 /* Allocate a buffer without putting it in the buffer list. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7187 savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
7188 set_bufref(&bufref, savebuf);
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7189 if (savebuf != NULL && buf == curbuf)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7190 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7191 /* Open the memline. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7192 curbuf = savebuf;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7193 curwin->w_buffer = savebuf;
625
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 622
diff changeset
7194 saved = ml_open(curbuf);
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7195 curbuf = buf;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7196 curwin->w_buffer = buf;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7197 }
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7198 if (savebuf == NULL || saved == FAIL || buf != curbuf
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7199 || move_lines(buf, savebuf) == FAIL)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7200 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7201 EMSG2(_("E462: Could not prepare for reloading \"%s\""),
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7202 buf->b_fname);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7203 saved = FAIL;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7204 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7205 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7206
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7207 if (saved == OK)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7208 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7209 curbuf->b_flags |= BF_CHECK_RO; /* check for RO again */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7210 #ifdef FEAT_AUTOCMD
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7211 keep_filetype = TRUE; /* don't detect 'filetype' */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7212 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7213 if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7214 (linenr_T)0,
10575
01a5f64a7a20 patch 8.0.0177: BufEnter autocommand not fired for a directory
Christian Brabandt <cb@256bit.org>
parents: 10221
diff changeset
7215 (linenr_T)MAXLNUM, &ea, flags) != OK)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7216 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7217 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7218 if (!aborting())
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7219 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7220 EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
7221 if (savebuf != NULL && bufref_valid(&bufref) && buf == curbuf)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7222 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7223 /* Put the text back from the save buffer. First
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7224 * delete any lines that readfile() added. */
11121
778c10516955 patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 10952
diff changeset
7225 while (!BUFEMPTY())
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7226 if (ml_delete(buf->b_ml.ml_line_count, FALSE) == FAIL)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7227 break;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7228 (void)move_lines(savebuf, buf);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7229 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7230 }
2394
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7231 else if (buf == curbuf) /* "buf" still valid */
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7232 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7233 /* Mark the buffer as unmodified and free undo info. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7234 unchanged(buf, TRUE);
2394
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7235 if ((flags & READ_KEEP_UNDO) == 0)
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7236 {
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7237 u_blockfree(buf);
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7238 u_clearall(buf);
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7239 }
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7240 else
2482
88751831fa0a When undoing a reload, move the cursor to the first changed line.
Bram Moolenaar <bram@vim.org>
parents: 2410
diff changeset
7241 {
2394
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7242 /* Mark all undo states as changed. */
a3aca345aafa Add the 'undoreload' option to be able to undo a file reload.
Bram Moolenaar <bram@vim.org>
parents: 2360
diff changeset
7243 u_unchanged(curbuf);
2482
88751831fa0a When undoing a reload, move the cursor to the first changed line.
Bram Moolenaar <bram@vim.org>
parents: 2410
diff changeset
7244 }
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7245 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7246 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7247 vim_free(ea.cmd);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7248
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
7249 if (savebuf != NULL && bufref_valid(&bufref))
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7250 wipe_buffer(savebuf, FALSE);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7251
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7252 #ifdef FEAT_DIFF
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7253 /* Invalidate diff info if necessary. */
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7254 diff_invalidate(curbuf);
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7255 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7256
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7257 /* Restore the topline and cursor position and check it (lines may
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7258 * have been removed). */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7259 if (old_topline > curbuf->b_ml.ml_line_count)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7260 curwin->w_topline = curbuf->b_ml.ml_line_count;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7261 else
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7262 curwin->w_topline = old_topline;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7263 curwin->w_cursor = old_cursor;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7264 check_cursor();
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7265 update_topline();
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7266 #ifdef FEAT_AUTOCMD
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7267 keep_filetype = FALSE;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7268 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7269 #ifdef FEAT_FOLDING
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7270 {
1863
63369d73b551 updated for version 7.2-161
vimboss
parents: 1848
diff changeset
7271 win_T *wp;
63369d73b551 updated for version 7.2-161
vimboss
parents: 1848
diff changeset
7272 tabpage_T *tp;
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7273
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7274 /* Update folds unless they are defined manually. */
1863
63369d73b551 updated for version 7.2-161
vimboss
parents: 1848
diff changeset
7275 FOR_ALL_TAB_WINDOWS(tp, wp)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7276 if (wp->w_buffer == curwin->w_buffer
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7277 && !foldmethodIsManual(wp))
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7278 foldUpdateAll(wp);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7279 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7280 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7281 /* If the mode didn't change and 'readonly' was set, keep the old
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7282 * value; the user probably used the ":view" command. But don't
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7283 * reset it, might have had a read error. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7284 if (orig_mode == curbuf->b_orig_mode)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7285 curbuf->b_p_ro |= old_ro;
4071
8819ea6dcb72 updated for version 7.3.790
Bram Moolenaar <bram@vim.org>
parents: 3997
diff changeset
7286
8819ea6dcb72 updated for version 7.3.790
Bram Moolenaar <bram@vim.org>
parents: 3997
diff changeset
7287 /* Modelines must override settings done by autocommands. */
8819ea6dcb72 updated for version 7.3.790
Bram Moolenaar <bram@vim.org>
parents: 3997
diff changeset
7288 do_modelines(0);
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7289 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7290
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7291 /* restore curwin/curbuf and a few other things */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7292 aucmd_restbuf(&aco);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7293 /* Careful: autocommands may have made "buf" invalid! */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7294 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7295
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7296 void
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
7297 buf_store_time(buf_T *buf, stat_T *st, char_u *fname UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7299 buf->b_mtime = (long)st->st_mtime;
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
7300 buf->b_orig_size = st->st_size;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7301 #ifdef HAVE_ST_MODE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7302 buf->b_orig_mode = (int)st->st_mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7303 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7304 buf->b_orig_mode = mch_getperm(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7305 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7306 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7307
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7308 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7309 * Adjust the line with missing eol, used for the next write.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7310 * Used for do_filter(), when the input lines for the filter are deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7311 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7312 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7313 write_lnum_adjust(linenr_T offset)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7314 {
2707
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
7315 if (curbuf->b_no_eol_lnum != 0) /* only if there is a missing eol */
cd3f52531f6c updated for version 7.3.124
Bram Moolenaar <bram@vim.org>
parents: 2697
diff changeset
7316 curbuf->b_no_eol_lnum += offset;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7317 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7318
7615
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7319 #if defined(TEMPDIRNAMES) || defined(FEAT_EVAL) || defined(PROTO)
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7320 /*
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7321 * Delete "name" and everything in it, recursively.
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7322 * return 0 for succes, -1 if some file was not deleted.
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7323 */
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7324 int
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7325 delete_recursive(char_u *name)
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7326 {
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7327 int result = 0;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7328 char_u **files;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7329 int file_count;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7330 int i;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7331 char_u *exp;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7332
7629
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7615
diff changeset
7333 /* A symbolic link to a directory itself is deleted, not the directory it
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7615
diff changeset
7334 * points to. */
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7615
diff changeset
7335 if (
7657
9c5e8254ea6b commit https://github.com/vim/vim/commit/203258c3ad2966cc9d08b3805b103333988b30b7
Christian Brabandt <cb@256bit.org>
parents: 7641
diff changeset
7336 # if defined(UNIX) || defined(WIN32)
9c5e8254ea6b commit https://github.com/vim/vim/commit/203258c3ad2966cc9d08b3805b103333988b30b7
Christian Brabandt <cb@256bit.org>
parents: 7641
diff changeset
7337 mch_isrealdir(name)
7629
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7615
diff changeset
7338 # else
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7615
diff changeset
7339 mch_isdir(name)
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7615
diff changeset
7340 # endif
befbed72da87 commit https://github.com/vim/vim/commit/43a34f9f74fdce462fa250baab620264c28b6165
Christian Brabandt <cb@256bit.org>
parents: 7615
diff changeset
7341 )
7615
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7342 {
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7343 vim_snprintf((char *)NameBuff, MAXPATHL, "%s/*", name);
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7344 exp = vim_strsave(NameBuff);
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7345 if (exp == NULL)
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7346 return -1;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7347 if (gen_expand_wildcards(1, &exp, &file_count, &files,
7641
b44fc33ef92a commit https://github.com/vim/vim/commit/336bd622c31e1805495c034e1a8cfadcc0bbabc7
Christian Brabandt <cb@256bit.org>
parents: 7633
diff changeset
7348 EW_DIR|EW_FILE|EW_SILENT|EW_ALLLINKS|EW_DODOT|EW_EMPTYOK) == OK)
7615
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7349 {
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7350 for (i = 0; i < file_count; ++i)
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7351 if (delete_recursive(files[i]) != 0)
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7352 result = -1;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7353 FreeWild(file_count, files);
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7354 }
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7355 else
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7356 result = -1;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7357 vim_free(exp);
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7358 (void)mch_rmdir(name);
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7359 }
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7360 else
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7361 result = mch_remove(name) == 0 ? 0 : -1;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7362
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7363 return result;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7364 }
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7365 #endif
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7366
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7367 #if defined(TEMPDIRNAMES) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7368 static long temp_count = 0; /* Temp filename counter. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7370 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7371 * Delete the temp directory and all files it contains.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7372 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7373 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7374 vim_deltempdir(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7375 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7376 if (vim_tempdir != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7377 {
7615
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7378 /* remove the trailing path separator */
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7379 gettail(vim_tempdir)[-1] = NUL;
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7380 delete_recursive(vim_tempdir);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7381 vim_free(vim_tempdir);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7382 vim_tempdir = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7383 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7384 }
7615
228ff048db20 commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Christian Brabandt <cb@256bit.org>
parents: 7410
diff changeset
7385
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7386 /*
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7387 * Directory "tempdir" was created. Expand this name to a full path and put
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7388 * it in "vim_tempdir". This avoids that using ":cd" would confuse us.
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7389 * "tempdir" must be no longer than MAXPATHL.
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7390 */
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7391 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7392 vim_settempdir(char_u *tempdir)
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7393 {
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7394 char_u *buf;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7395
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7396 buf = alloc((unsigned)MAXPATHL + 2);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7397 if (buf != NULL)
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7398 {
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7399 if (vim_FullName(tempdir, buf, MAXPATHL, FALSE) == FAIL)
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7400 STRCPY(buf, tempdir);
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9509
diff changeset
7401 add_pathsep(buf);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7402 vim_tempdir = vim_strsave(buf);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7403 vim_free(buf);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7404 }
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7405 }
2006
78e032bb3260 updated for version 7.2-303
vimboss
parents: 2003
diff changeset
7406 #endif
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7407
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7408 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7409 * vim_tempname(): Return a unique name that can be used for a temp file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7410 *
9291
bff3cd5cf922 commit https://github.com/vim/vim/commit/76ae22fef3cb224ca7fbf97517f881e825d4d0c2
Christian Brabandt <cb@256bit.org>
parents: 9260
diff changeset
7411 * The temp file is NOT guaranteed to be created. If "keep" is FALSE it is
bff3cd5cf922 commit https://github.com/vim/vim/commit/76ae22fef3cb224ca7fbf97517f881e825d4d0c2
Christian Brabandt <cb@256bit.org>
parents: 9260
diff changeset
7412 * guaranteed to NOT be created.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7413 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7414 * The returned pointer is to allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7415 * The returned pointer is NULL if no valid name was found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7416 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7417 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7418 vim_tempname(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7419 int extra_char UNUSED, /* char to use in the name instead of '?' */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7420 int keep UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7421 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7422 #ifdef USE_TMPNAM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7423 char_u itmp[L_tmpnam]; /* use tmpnam() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7424 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7425 char_u itmp[TEMPNAMELEN];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7426 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7427
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7428 #ifdef TEMPDIRNAMES
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7429 static char *(tempdirs[]) = {TEMPDIRNAMES};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7430 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7431 # ifndef EEXIST
9387
f094d4085014 commit https://github.com/vim/vim/commit/8767f52fbfd4f053ce00a978227c95f1d7d323fe
Christian Brabandt <cb@256bit.org>
parents: 9291
diff changeset
7432 stat_T st;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7433 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7434
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7435 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7436 * This will create a directory for private use by this instance of Vim.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7437 * This is done once, and the same directory is used for all temp files.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7438 * This method avoids security problems because of symlink attacks et al.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7439 * It's also a bit faster, because we only need to check for an existing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7440 * file when creating the directory and not for each temp file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7441 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7442 if (vim_tempdir == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7443 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7444 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7445 * Try the entries in TEMPDIRNAMES to create the temp directory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7446 */
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
7447 for (i = 0; i < (int)(sizeof(tempdirs) / sizeof(char *)); ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7448 {
2047
85da03763130 updated for version 7.2.333
Bram Moolenaar <bram@zimbu.org>
parents: 2028
diff changeset
7449 # ifndef HAVE_MKDTEMP
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7450 size_t itmplen;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7451 long nr;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7452 long off;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7453 # endif
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7454
7305
372c785c04b6 commit https://github.com/vim/vim/commit/e1a61991d9b6fd5f65636d17583f93118268cda5
Christian Brabandt <cb@256bit.org>
parents: 7285
diff changeset
7455 /* Expand $TMP, leave room for "/v1100000/999999999".
372c785c04b6 commit https://github.com/vim/vim/commit/e1a61991d9b6fd5f65636d17583f93118268cda5
Christian Brabandt <cb@256bit.org>
parents: 7285
diff changeset
7456 * Skip the directory check if the expansion fails. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7457 expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20);
7305
372c785c04b6 commit https://github.com/vim/vim/commit/e1a61991d9b6fd5f65636d17583f93118268cda5
Christian Brabandt <cb@256bit.org>
parents: 7285
diff changeset
7458 if (itmp[0] != '$' && mch_isdir(itmp))
372c785c04b6 commit https://github.com/vim/vim/commit/e1a61991d9b6fd5f65636d17583f93118268cda5
Christian Brabandt <cb@256bit.org>
parents: 7285
diff changeset
7459 {
372c785c04b6 commit https://github.com/vim/vim/commit/e1a61991d9b6fd5f65636d17583f93118268cda5
Christian Brabandt <cb@256bit.org>
parents: 7285
diff changeset
7460 /* directory exists */
9536
b2aada04d84e commit https://github.com/vim/vim/commit/a06ecab7a5159e744448ace731036f0dc5f87dd4
Christian Brabandt <cb@256bit.org>
parents: 9509
diff changeset
7461 add_pathsep(itmp);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7462
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7463 # ifdef HAVE_MKDTEMP
9211
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7464 {
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7465 # if defined(UNIX) || defined(VMS)
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7466 /* Make sure the umask doesn't remove the executable bit.
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7467 * "repl" has been reported to use "177". */
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7468 mode_t umask_save = umask(077);
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7469 # endif
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7470 /* Leave room for filename */
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7471 STRCAT(itmp, "vXXXXXX");
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7472 if (mkdtemp((char *)itmp) != NULL)
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7473 vim_settempdir(itmp);
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7474 # if defined(UNIX) || defined(VMS)
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7475 (void)umask(umask_save);
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7476 # endif
d2b9e454c73d commit https://github.com/vim/vim/commit/35d88f4e2ff5dcd9904f04612d5febede996137c
Christian Brabandt <cb@256bit.org>
parents: 9068
diff changeset
7477 }
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7478 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7479 /* Get an arbitrary number of up to 6 digits. When it's
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7480 * unlikely that it already exists it will be faster,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7481 * otherwise it doesn't matter. The use of mkdir() avoids any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7482 * security problems because of the predictable number. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7483 nr = (mch_get_pid() + (long)time(NULL)) % 1000000L;
2047
85da03763130 updated for version 7.2.333
Bram Moolenaar <bram@zimbu.org>
parents: 2028
diff changeset
7484 itmplen = STRLEN(itmp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7485
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7486 /* Try up to 10000 different values until we find a name that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7487 * doesn't exist. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7488 for (off = 0; off < 10000L; ++off)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7489 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7490 int r;
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7491 # if defined(UNIX) || defined(VMS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7492 mode_t umask_save;
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7493 # endif
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7494
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7495 sprintf((char *)itmp + itmplen, "v%ld", nr + off);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7496 # ifndef EEXIST
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7497 /* If mkdir() does not set errno to EEXIST, check for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7498 * existing file here. There is a race condition then,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7499 * although it's fail-safe. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7500 if (mch_stat((char *)itmp, &st) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7501 continue;
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7502 # endif
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7503 # if defined(UNIX) || defined(VMS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7504 /* Make sure the umask doesn't remove the executable bit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7505 * "repl" has been reported to use "177". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7506 umask_save = umask(077);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7507 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7508 r = vim_mkdir(itmp, 0700);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7509 # if defined(UNIX) || defined(VMS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7510 (void)umask(umask_save);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7511 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7512 if (r == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7513 {
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7514 vim_settempdir(itmp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7515 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7516 }
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7517 # ifdef EEXIST
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7518 /* If the mkdir() didn't fail because the file/dir exists,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7519 * we probably can't create any dir here, try another
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7520 * place. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7521 if (errno != EEXIST)
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7522 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7523 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7524 }
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7525 # endif /* HAVE_MKDTEMP */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7526 if (vim_tempdir != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7527 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7528 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7529 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7530 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7531
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7532 if (vim_tempdir != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7533 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7534 /* There is no need to check if the file exists, because we own the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7535 * directory and nobody else creates a file in it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7536 sprintf((char *)itmp, "%s%ld", vim_tempdir, temp_count++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7537 return vim_strsave(itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7538 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7539
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7540 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7541
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7542 #else /* TEMPDIRNAMES */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7543
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7544 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7545 char szTempFile[_MAX_PATH + 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7546 char buf4[4];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7547 char_u *retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7548 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7549
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7550 STRCPY(itmp, "");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7551 if (GetTempPath(_MAX_PATH, szTempFile) == 0)
2695
b0605f2f9786 updated for version 7.3.113
Bram Moolenaar <bram@vim.org>
parents: 2684
diff changeset
7552 {
b0605f2f9786 updated for version 7.3.113
Bram Moolenaar <bram@vim.org>
parents: 2684
diff changeset
7553 szTempFile[0] = '.'; /* GetTempPath() failed, use current dir */
b0605f2f9786 updated for version 7.3.113
Bram Moolenaar <bram@vim.org>
parents: 2684
diff changeset
7554 szTempFile[1] = NUL;
b0605f2f9786 updated for version 7.3.113
Bram Moolenaar <bram@vim.org>
parents: 2684
diff changeset
7555 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7556 strcpy(buf4, "VIM");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7557 buf4[2] = extra_char; /* make it "VIa", "VIb", etc. */
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
7558 if (GetTempFileName(szTempFile, buf4, 0, (LPSTR)itmp) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7559 return NULL;
6721
7347229a646a updated for version 7.4.684
Bram Moolenaar <bram@vim.org>
parents: 6635
diff changeset
7560 if (!keep)
7347229a646a updated for version 7.4.684
Bram Moolenaar <bram@vim.org>
parents: 6635
diff changeset
7561 /* GetTempFileName() will create the file, we don't want that */
8080
b6cb94ad97a4 commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents: 7961
diff changeset
7562 (void)DeleteFile((LPSTR)itmp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7563
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7564 /* Backslashes in a temp file name cause problems when filtering with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7565 * "sh". NOTE: This also checks 'shellcmdflag' to help those people who
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7566 * didn't set 'shellslash'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7567 retval = vim_strsave(itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7568 if (*p_shcf == '-' || p_ssl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7569 for (p = retval; *p; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7570 if (*p == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7571 *p = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7572 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7573
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7574 # else /* WIN3264 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7575
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7576 # ifdef USE_TMPNAM
2697
6cc8a093e4a9 updated for version 7.3.115
Bram Moolenaar <bram@vim.org>
parents: 2695
diff changeset
7577 char_u *p;
6cc8a093e4a9 updated for version 7.3.115
Bram Moolenaar <bram@vim.org>
parents: 2695
diff changeset
7578
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7579 /* tmpnam() will make its own name */
2697
6cc8a093e4a9 updated for version 7.3.115
Bram Moolenaar <bram@vim.org>
parents: 2695
diff changeset
7580 p = tmpnam((char *)itmp);
6cc8a093e4a9 updated for version 7.3.115
Bram Moolenaar <bram@vim.org>
parents: 2695
diff changeset
7581 if (p == NULL || *p == NUL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7582 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7583 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7584 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7585
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7586 # ifdef VMS_TEMPNAM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7587 /* mktemp() is not working on VMS. It seems to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7588 * a do-nothing function. Therefore we use tempnam().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7589 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7590 sprintf((char *)itmp, "VIM%c", extra_char);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7591 p = (char_u *)tempnam("tmp:", (char *)itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7592 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7593 {
5704
47a673b20e49 updated for version 7.4.197
Bram Moolenaar <bram@vim.org>
parents: 5688
diff changeset
7594 /* VMS will use '.LIS' if we don't explicitly specify an extension,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7595 * and VIM will then be unable to find the file later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7596 STRCPY(itmp, p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7597 STRCAT(itmp, ".txt");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7598 free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7599 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7600 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7601 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7602 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7603 STRCPY(itmp, TEMPNAME);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7604 if ((p = vim_strchr(itmp, '?')) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7605 *p = extra_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7606 if (mktemp((char *)itmp) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7607 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7608 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7609 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7610
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7611 return vim_strsave(itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7612 # endif /* WIN3264 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7613 #endif /* TEMPDIRNAMES */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7614 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7615
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7616 #if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7617 /*
7170
beb67ef38f88 commit https://github.com/vim/vim/commit/b4f6a46b01ed00b642a2271e9d1559e51ab0f2c4
Christian Brabandt <cb@256bit.org>
parents: 7005
diff changeset
7618 * Convert all backslashes in fname to forward slashes in-place, unless when
beb67ef38f88 commit https://github.com/vim/vim/commit/b4f6a46b01ed00b642a2271e9d1559e51ab0f2c4
Christian Brabandt <cb@256bit.org>
parents: 7005
diff changeset
7619 * it looks like a URL.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7620 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7621 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7622 forward_slash(char_u *fname)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7623 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7624 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7625
7170
beb67ef38f88 commit https://github.com/vim/vim/commit/b4f6a46b01ed00b642a2271e9d1559e51ab0f2c4
Christian Brabandt <cb@256bit.org>
parents: 7005
diff changeset
7626 if (path_with_url(fname))
beb67ef38f88 commit https://github.com/vim/vim/commit/b4f6a46b01ed00b642a2271e9d1559e51ab0f2c4
Christian Brabandt <cb@256bit.org>
parents: 7005
diff changeset
7627 return;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7628 for (p = fname; *p != NUL; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7629 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7630 /* The Big5 encoding can have '\' in the trail byte. */
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
7631 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7632 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7633 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7634 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7635 if (*p == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7636 *p = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7637 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7638 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7639
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7640
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7641 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7642 * Code for automatic commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7643 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7644 * Only included when "FEAT_AUTOCMD" has been defined.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7645 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7646
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7647 #if defined(FEAT_AUTOCMD) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7648
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7649 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7650 * The autocommands are stored in a list for each event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7651 * Autocommands for the same pattern, that are consecutive, are joined
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7652 * together, to avoid having to match the pattern too often.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7653 * The result is an array of Autopat lists, which point to AutoCmd lists:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7654 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7655 * first_autopat[0] --> Autopat.next --> Autopat.next --> NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7656 * Autopat.cmds Autopat.cmds
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7657 * | |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7658 * V V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7659 * AutoCmd.next AutoCmd.next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7660 * | |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7661 * V V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7662 * AutoCmd.next NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7663 * |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7664 * V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7665 * NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7666 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7667 * first_autopat[1] --> Autopat.next --> NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7668 * Autopat.cmds
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7669 * |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7670 * V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7671 * AutoCmd.next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7672 * |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7673 * V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7674 * NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7675 * etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7676 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7677 * The order of AutoCmds is important, this is the order in which they were
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7678 * defined and will have to be executed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7679 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7680 typedef struct AutoCmd
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7681 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7682 char_u *cmd; /* The command to be executed (NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7683 when command has been removed) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7684 char nested; /* If autocommands nest here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7685 char last; /* last command in list */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7686 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7687 scid_T scriptID; /* script ID where defined */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7688 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7689 struct AutoCmd *next; /* Next AutoCmd in list */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7690 } AutoCmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7691
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7692 typedef struct AutoPat
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7693 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7694 char_u *pat; /* pattern as typed (NULL when pattern
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7695 has been removed) */
4861
e79a20f07daa updated for version 7.3.1177
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
7696 regprog_T *reg_prog; /* compiled regprog for pattern */
e79a20f07daa updated for version 7.3.1177
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
7697 AutoCmd *cmds; /* list of commands to do */
e79a20f07daa updated for version 7.3.1177
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
7698 struct AutoPat *next; /* next AutoPat in AutoPat list */
e79a20f07daa updated for version 7.3.1177
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
7699 int group; /* group ID */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7700 int patlen; /* strlen() of pat */
4861
e79a20f07daa updated for version 7.3.1177
Bram Moolenaar <bram@vim.org>
parents: 4805
diff changeset
7701 int buflocal_nr; /* !=0 for buffer-local AutoPat */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7702 char allow_dirs; /* Pattern may match whole path */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7703 char last; /* last pattern for apply_autocmds() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7704 } AutoPat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7705
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7706 static struct event_name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7707 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7708 char *name; /* event name */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7709 event_T event; /* event number */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7710 } event_names[] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7711 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7712 {"BufAdd", EVENT_BUFADD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7713 {"BufCreate", EVENT_BUFADD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7714 {"BufDelete", EVENT_BUFDELETE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7715 {"BufEnter", EVENT_BUFENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7716 {"BufFilePost", EVENT_BUFFILEPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7717 {"BufFilePre", EVENT_BUFFILEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7718 {"BufHidden", EVENT_BUFHIDDEN},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7719 {"BufLeave", EVENT_BUFLEAVE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7720 {"BufNew", EVENT_BUFNEW},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7721 {"BufNewFile", EVENT_BUFNEWFILE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7722 {"BufRead", EVENT_BUFREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7723 {"BufReadCmd", EVENT_BUFREADCMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7724 {"BufReadPost", EVENT_BUFREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7725 {"BufReadPre", EVENT_BUFREADPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7726 {"BufUnload", EVENT_BUFUNLOAD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7727 {"BufWinEnter", EVENT_BUFWINENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7728 {"BufWinLeave", EVENT_BUFWINLEAVE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7729 {"BufWipeout", EVENT_BUFWIPEOUT},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7730 {"BufWrite", EVENT_BUFWRITEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7731 {"BufWritePost", EVENT_BUFWRITEPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7732 {"BufWritePre", EVENT_BUFWRITEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7733 {"BufWriteCmd", EVENT_BUFWRITECMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7734 {"CmdwinEnter", EVENT_CMDWINENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7735 {"CmdwinLeave", EVENT_CMDWINLEAVE},
6154
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
7736 {"CmdUndefined", EVENT_CMDUNDEFINED},
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
7737 {"ColorScheme", EVENT_COLORSCHEME},
3676
f07475816079 updated for version 7.3.598
Bram Moolenaar <bram@vim.org>
parents: 3582
diff changeset
7738 {"CompleteDone", EVENT_COMPLETEDONE},
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7739 {"CursorHold", EVENT_CURSORHOLD},
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7740 {"CursorHoldI", EVENT_CURSORHOLDI},
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7741 {"CursorMoved", EVENT_CURSORMOVED},
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7742 {"CursorMovedI", EVENT_CURSORMOVEDI},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7743 {"EncodingChanged", EVENT_ENCODINGCHANGED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7744 {"FileEncoding", EVENT_ENCODINGCHANGED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7745 {"FileAppendPost", EVENT_FILEAPPENDPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7746 {"FileAppendPre", EVENT_FILEAPPENDPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7747 {"FileAppendCmd", EVENT_FILEAPPENDCMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7748 {"FileChangedShell",EVENT_FILECHANGEDSHELL},
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7749 {"FileChangedShellPost",EVENT_FILECHANGEDSHELLPOST},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7750 {"FileChangedRO", EVENT_FILECHANGEDRO},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7751 {"FileReadPost", EVENT_FILEREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7752 {"FileReadPre", EVENT_FILEREADPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7753 {"FileReadCmd", EVENT_FILEREADCMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7754 {"FileType", EVENT_FILETYPE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7755 {"FileWritePost", EVENT_FILEWRITEPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7756 {"FileWritePre", EVENT_FILEWRITEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7757 {"FileWriteCmd", EVENT_FILEWRITECMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7758 {"FilterReadPost", EVENT_FILTERREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7759 {"FilterReadPre", EVENT_FILTERREADPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7760 {"FilterWritePost", EVENT_FILTERWRITEPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7761 {"FilterWritePre", EVENT_FILTERWRITEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7762 {"FocusGained", EVENT_FOCUSGAINED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7763 {"FocusLost", EVENT_FOCUSLOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7764 {"FuncUndefined", EVENT_FUNCUNDEFINED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7765 {"GUIEnter", EVENT_GUIENTER},
946
4fb859cd9ba9 updated for version 7.0-072
vimboss
parents: 934
diff changeset
7766 {"GUIFailed", EVENT_GUIFAILED},
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
7767 {"InsertChange", EVENT_INSERTCHANGE},
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
7768 {"InsertEnter", EVENT_INSERTENTER},
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
7769 {"InsertLeave", EVENT_INSERTLEAVE},
2845
d641f141f937 updated for version 7.3.196
Bram Moolenaar <bram@vim.org>
parents: 2823
diff changeset
7770 {"InsertCharPre", EVENT_INSERTCHARPRE},
434
9595cf1d80a7 updated for version 7.0112
vimboss
parents: 391
diff changeset
7771 {"MenuPopup", EVENT_MENUPOPUP},
6935
4db70c94226b patch 7.4.786
Bram Moolenaar <bram@vim.org>
parents: 6933
diff changeset
7772 {"OptionSet", EVENT_OPTIONSET},
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
7773 {"QuickFixCmdPost", EVENT_QUICKFIXCMDPOST},
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
7774 {"QuickFixCmdPre", EVENT_QUICKFIXCMDPRE},
3568
09d0bda69df0 updated for version 7.3.544
Bram Moolenaar <bram@vim.org>
parents: 3497
diff changeset
7775 {"QuitPre", EVENT_QUITPRE},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7776 {"RemoteReply", EVENT_REMOTEREPLY},
574
25a70b1cd2da updated for version 7.0163
vimboss
parents: 570
diff changeset
7777 {"SessionLoadPost", EVENT_SESSIONLOADPOST},
723
587ea89ab80c updated for version 7.0220
vimboss
parents: 717
diff changeset
7778 {"ShellCmdPost", EVENT_SHELLCMDPOST},
587ea89ab80c updated for version 7.0220
vimboss
parents: 717
diff changeset
7779 {"ShellFilterPost", EVENT_SHELLFILTERPOST},
715
b526e10493b1 updated for version 7.0217
vimboss
parents: 714
diff changeset
7780 {"SourcePre", EVENT_SOURCEPRE},
1061
b4d11ddb7303 updated for version 7.0-187
vimboss
parents: 1055
diff changeset
7781 {"SourceCmd", EVENT_SOURCECMD},
649
8157079cea85 updated for version 7.0191
vimboss
parents: 635
diff changeset
7782 {"SpellFileMissing",EVENT_SPELLFILEMISSING},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7783 {"StdinReadPost", EVENT_STDINREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7784 {"StdinReadPre", EVENT_STDINREADPRE},
674
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 672
diff changeset
7785 {"SwapExists", EVENT_SWAPEXISTS},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7786 {"Syntax", EVENT_SYNTAX},
9595
0190d5de215f commit https://github.com/vim/vim/commit/c917da4b3e8801a255dbefea8e4ed19c1c716dd8
Christian Brabandt <cb@256bit.org>
parents: 9536
diff changeset
7787 {"TabNew", EVENT_TABNEW},
9599
42a8a81decdf commit https://github.com/vim/vim/commit/12c11d553053f5a9eae9eb3c518279b12fa928c2
Christian Brabandt <cb@256bit.org>
parents: 9595
diff changeset
7788 {"TabClosed", EVENT_TABCLOSED},
676
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
7789 {"TabEnter", EVENT_TABENTER},
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
7790 {"TabLeave", EVENT_TABLEAVE},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7791 {"TermChanged", EVENT_TERMCHANGED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7792 {"TermResponse", EVENT_TERMRESPONSE},
4232
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
7793 {"TextChanged", EVENT_TEXTCHANGED},
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
7794 {"TextChangedI", EVENT_TEXTCHANGEDI},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7795 {"User", EVENT_USER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7796 {"VimEnter", EVENT_VIMENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7797 {"VimLeave", EVENT_VIMLEAVE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7798 {"VimLeavePre", EVENT_VIMLEAVEPRE},
9595
0190d5de215f commit https://github.com/vim/vim/commit/c917da4b3e8801a255dbefea8e4ed19c1c716dd8
Christian Brabandt <cb@256bit.org>
parents: 9536
diff changeset
7799 {"WinNew", EVENT_WINNEW},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7800 {"WinEnter", EVENT_WINENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7801 {"WinLeave", EVENT_WINLEAVE},
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7802 {"VimResized", EVENT_VIMRESIZED},
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7803 {NULL, (event_T)0}
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7804 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7805
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7806 static AutoPat *first_autopat[NUM_EVENTS] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7807 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7808 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7809 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7810 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7811 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
7812 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6935
4db70c94226b patch 7.4.786
Bram Moolenaar <bram@vim.org>
parents: 6933
diff changeset
7813 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7814 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7815
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7816 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7817 * struct used to keep status while executing autocommands for an event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7818 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7819 typedef struct AutoPatCmd
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7820 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7821 AutoPat *curpat; /* next AutoPat to examine */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7822 AutoCmd *nextcmd; /* next AutoCmd to execute */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7823 int group; /* group being used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7824 char_u *fname; /* fname to match with */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7825 char_u *sfname; /* sfname to match with */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7826 char_u *tail; /* tail of fname */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7827 event_T event; /* current event */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7828 int arg_bufnr; /* initially equal to <abuf>, set to zero when
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7829 buf is deleted */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7830 struct AutoPatCmd *next; /* chain of active apc-s for auto-invalidation*/
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7831 } AutoPatCmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7832
297
9a1c2a8186b7 updated for version 7.0078
vimboss
parents: 292
diff changeset
7833 static AutoPatCmd *active_apc_list = NULL; /* stack of active autocommands */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7834
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7835 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7836 * augroups stores a list of autocmd group names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7837 */
297
9a1c2a8186b7 updated for version 7.0078
vimboss
parents: 292
diff changeset
7838 static garray_T augroups = {0, 0, sizeof(char_u *), 10, NULL};
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7839 #define AUGROUP_NAME(i) (((char_u **)augroups.ga_data)[i])
10084
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7840 /* use get_deleted_augroup() to get this */
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
7841 static char_u *deleted_augroup = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7842
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7843 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7844 * The ID of the current group. Group 0 is the default one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7845 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7846 static int current_augroup = AUGROUP_DEFAULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7847
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7848 static int au_need_clean = FALSE; /* need to delete marked patterns */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7849
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7850 static void show_autocmd(AutoPat *ap, event_T event);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7851 static void au_remove_pat(AutoPat *ap);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7852 static void au_remove_cmds(AutoPat *ap);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7853 static void au_cleanup(void);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7854 static int au_new_group(char_u *name);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7855 static void au_del_group(char_u *name);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7856 static event_T event_name2nr(char_u *start, char_u **end);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7857 static char_u *event_nr2name(event_T event);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7858 static char_u *find_end_event(char_u *arg, int have_group);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7859 static int event_ignored(event_T event);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7860 static int au_get_grouparg(char_u **argp);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7861 static int do_autocmd_event(event_T event, char_u *pat, int nested, char_u *cmd, int forceit, int group);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7862 static int apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io, int force, int group, buf_T *buf, exarg_T *eap);
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7863 static void auto_next_pat(AutoPatCmd *apc, int stop_at_last);
6375
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6353
diff changeset
7864 #if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN)
7801
a1e71a01dbd6 commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents: 7657
diff changeset
7865 static int match_file_pat(char_u *pattern, regprog_T **prog, char_u *fname, char_u *sfname, char_u *tail, int allow_dirs);
6375
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6353
diff changeset
7866 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7867
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7868
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7869 static event_T last_event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7870 static int last_group;
1410
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
7871 static int autocmd_blocked = 0; /* block all autocmds */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7872
10084
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7873 static char_u *
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7874 get_deleted_augroup(void)
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7875 {
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7876 if (deleted_augroup == NULL)
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7877 deleted_augroup = (char_u *)_("--Deleted--");
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7878 return deleted_augroup;
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7879 }
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
7880
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7881 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7882 * Show the autocommands for one AutoPat.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7883 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7884 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7885 show_autocmd(AutoPat *ap, event_T event)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7886 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7887 AutoCmd *ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7888
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7889 /* Check for "got_int" (here and at various places below), which is set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7890 * when "q" has been hit for the "--more--" prompt */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7891 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7892 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7893 if (ap->pat == NULL) /* pattern has been removed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7894 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7895
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7896 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7897 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7898 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7899 if (event != last_event || ap->group != last_group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7900 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7901 if (ap->group != AUGROUP_DEFAULT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7902 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7903 if (AUGROUP_NAME(ap->group) == NULL)
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
7904 msg_puts_attr(get_deleted_augroup(), HL_ATTR(HLF_E));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7905 else
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
7906 msg_puts_attr(AUGROUP_NAME(ap->group), HL_ATTR(HLF_T));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7907 msg_puts((char_u *)" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7908 }
11158
501f46f7644c patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents: 11129
diff changeset
7909 msg_puts_attr(event_nr2name(event), HL_ATTR(HLF_T));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7910 last_event = event;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7911 last_group = ap->group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7912 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7913 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7914 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7915 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7916 msg_col = 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7917 msg_outtrans(ap->pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7918
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7919 for (ac = ap->cmds; ac != NULL; ac = ac->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7920 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7921 if (ac->cmd != NULL) /* skip removed commands */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7922 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7923 if (msg_col >= 14)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7924 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7925 msg_col = 14;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7926 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7927 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7928 msg_outtrans(ac->cmd);
500
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 474
diff changeset
7929 #ifdef FEAT_EVAL
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 474
diff changeset
7930 if (p_verbose > 0)
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 474
diff changeset
7931 last_set_msg(ac->scriptID);
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 474
diff changeset
7932 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7933 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7934 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7935 if (ac->next != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7936 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7937 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7938 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7939 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7940 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7941 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7942 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7943 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7944
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7945 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7946 * Mark an autocommand pattern for deletion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7947 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7948 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7949 au_remove_pat(AutoPat *ap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7950 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7951 vim_free(ap->pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7952 ap->pat = NULL;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7953 ap->buflocal_nr = -1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7954 au_need_clean = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7955 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7956
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7957 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7958 * Mark all commands for a pattern for deletion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7959 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7960 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7961 au_remove_cmds(AutoPat *ap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7962 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7963 AutoCmd *ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7964
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7965 for (ac = ap->cmds; ac != NULL; ac = ac->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7966 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7967 vim_free(ac->cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7968 ac->cmd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7969 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7970 au_need_clean = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7971 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7972
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7973 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7974 * Cleanup autocommands and patterns that have been deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7975 * This is only done when not executing autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7976 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7977 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
7978 au_cleanup(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7979 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7980 AutoPat *ap, **prev_ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7981 AutoCmd *ac, **prev_ac;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7982 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7983
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7984 if (autocmd_busy || !au_need_clean)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7985 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7986
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7987 /* loop over all events */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7988 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7989 event = (event_T)((int)event + 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7990 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7991 /* loop over all autocommand patterns */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7992 prev_ap = &(first_autopat[(int)event]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7993 for (ap = *prev_ap; ap != NULL; ap = *prev_ap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7994 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7995 /* loop over all commands for this pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7996 prev_ac = &(ap->cmds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7997 for (ac = *prev_ac; ac != NULL; ac = *prev_ac)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7998 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7999 /* remove the command if the pattern is to be deleted or when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8000 * the command has been marked for deletion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8001 if (ap->pat == NULL || ac->cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8002 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8003 *prev_ac = ac->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8004 vim_free(ac->cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8005 vim_free(ac);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8006 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8007 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8008 prev_ac = &(ac->next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8009 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8010
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8011 /* remove the pattern if it has been marked for deletion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8012 if (ap->pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8013 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8014 *prev_ap = ap->next;
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4354
diff changeset
8015 vim_regfree(ap->reg_prog);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8016 vim_free(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8017 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8018 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8019 prev_ap = &(ap->next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8020 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8021 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8022
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8023 au_need_clean = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8024 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8025
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8026 /*
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8027 * Called when buffer is freed, to remove/invalidate related buffer-local
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8028 * autocmds.
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8029 */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8030 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8031 aubuflocal_remove(buf_T *buf)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8032 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8033 AutoPat *ap;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8034 event_T event;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8035 AutoPatCmd *apc;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8036
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8037 /* invalidate currently executing autocommands */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8038 for (apc = active_apc_list; apc; apc = apc->next)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8039 if (buf->b_fnum == apc->arg_bufnr)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8040 apc->arg_bufnr = 0;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8041
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8042 /* invalidate buflocals looping through events */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8043 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8044 event = (event_T)((int)event + 1))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8045 /* loop over all autocommand patterns */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8046 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8047 if (ap->buflocal_nr == buf->b_fnum)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8048 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8049 au_remove_pat(ap);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8050 if (p_verbose >= 6)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
8051 {
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
8052 verbose_enter();
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8053 smsg((char_u *)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8054 _("auto-removing autocommand: %s <buffer=%d>"),
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8055 event_nr2name(event), buf->b_fnum);
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
8056 verbose_leave();
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
8057 }
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8058 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8059 au_cleanup();
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8060 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8061
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8062 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8063 * Add an autocmd group name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8064 * Return it's ID. Returns AUGROUP_ERROR (< 0) for error.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8065 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8066 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8067 au_new_group(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8068 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8069 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8070
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8071 i = au_find_group(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8072 if (i == AUGROUP_ERROR) /* the group doesn't exist yet, add it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8073 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8074 /* First try using a free entry. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8075 for (i = 0; i < augroups.ga_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8076 if (AUGROUP_NAME(i) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8077 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8078 if (i == augroups.ga_len && ga_grow(&augroups, 1) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8079 return AUGROUP_ERROR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8080
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8081 AUGROUP_NAME(i) = vim_strsave(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8082 if (AUGROUP_NAME(i) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8083 return AUGROUP_ERROR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8084 if (i == augroups.ga_len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8085 ++augroups.ga_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8086 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8087
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8088 return i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8089 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8091 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8092 au_del_group(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8093 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8094 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8095
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8096 i = au_find_group(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8097 if (i == AUGROUP_ERROR) /* the group doesn't exist */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8098 EMSG2(_("E367: No such group: \"%s\""), name);
10086
1de911ef1edf commit https://github.com/vim/vim/commit/de653f08805dde14424d417502a0480a6ad292f8
Christian Brabandt <cb@256bit.org>
parents: 10084
diff changeset
8099 else if (i == current_augroup)
1de911ef1edf commit https://github.com/vim/vim/commit/de653f08805dde14424d417502a0480a6ad292f8
Christian Brabandt <cb@256bit.org>
parents: 10084
diff changeset
8100 EMSG(_("E936: Cannot delete the current group"));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8101 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8102 {
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8103 event_T event;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8104 AutoPat *ap;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8105 int in_use = FALSE;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8106
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8107 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8108 event = (event_T)((int)event + 1))
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8109 {
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8110 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
10058
65e43481d7de commit https://github.com/vim/vim/commit/5c80908ced601be6db7554a147cdb0f98ac8daa1
Christian Brabandt <cb@256bit.org>
parents: 10042
diff changeset
8111 if (ap->group == i && ap->pat != NULL)
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8112 {
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8113 give_warning((char_u *)_("W19: Deleting augroup that is still in use"), TRUE);
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8114 in_use = TRUE;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8115 event = NUM_EVENTS;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8116 break;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8117 }
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8118 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8119 vim_free(AUGROUP_NAME(i));
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8120 if (in_use)
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8121 {
10084
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
8122 AUGROUP_NAME(i) = get_deleted_augroup();
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8123 }
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8124 else
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8125 AUGROUP_NAME(i) = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8126 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8127 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8128
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8129 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8130 * Find the ID of an autocmd group name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8131 * Return it's ID. Returns AUGROUP_ERROR (< 0) for error.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8132 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8133 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8134 au_find_group(char_u *name)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8135 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8136 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8137
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8138 for (i = 0; i < augroups.ga_len; ++i)
10084
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
8139 if (AUGROUP_NAME(i) != NULL && AUGROUP_NAME(i) != get_deleted_augroup()
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8140 && STRCMP(AUGROUP_NAME(i), name) == 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8141 return i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8142 return AUGROUP_ERROR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8143 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8144
461
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
8145 /*
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
8146 * Return TRUE if augroup "name" exists.
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
8147 */
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
8148 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8149 au_has_group(char_u *name)
461
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
8150 {
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
8151 return au_find_group(name) != AUGROUP_ERROR;
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
8152 }
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
8153
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8154 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8155 * ":augroup {name}".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8156 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8157 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8158 do_augroup(char_u *arg, int del_group)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8159 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8160 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8161
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8162 if (del_group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8163 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8164 if (*arg == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8165 EMSG(_(e_argreq));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8166 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8167 au_del_group(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8168 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8169 else if (STRICMP(arg, "end") == 0) /* ":aug end": back to group 0 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8170 current_augroup = AUGROUP_DEFAULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8171 else if (*arg) /* ":aug xxx": switch to group xxx */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8172 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8173 i = au_new_group(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8174 if (i != AUGROUP_ERROR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8175 current_augroup = i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8176 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8177 else /* ":aug": list the group names */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8178 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8179 msg_start();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8180 for (i = 0; i < augroups.ga_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8181 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8182 if (AUGROUP_NAME(i) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8183 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8184 msg_puts(AUGROUP_NAME(i));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8185 msg_puts((char_u *)" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8186 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8187 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8188 msg_clr_eos();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8189 msg_end();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8190 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8191 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8192
355
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8193 #if defined(EXITFREE) || defined(PROTO)
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8194 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8195 free_all_autocmds(void)
355
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8196 {
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8197 int i;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8198 char_u *s;
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8199
355
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8200 for (current_augroup = -1; current_augroup < augroups.ga_len;
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8201 ++current_augroup)
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8202 do_autocmd((char_u *)"", TRUE);
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8203
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8204 for (i = 0; i < augroups.ga_len; ++i)
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8205 {
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8206 s = ((char_u **)(augroups.ga_data))[i];
10084
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
8207 if (s != get_deleted_augroup())
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8208 vim_free(s);
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8209 }
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
8210 ga_clear(&augroups);
355
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8211 }
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8212 #endif
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8213
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8214 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8215 * Return the event number for event name "start".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8216 * Return NUM_EVENTS if the event name was not found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8217 * Return a pointer to the next event name in "end".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8218 */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8219 static event_T
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8220 event_name2nr(char_u *start, char_u **end)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8221 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8222 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8223 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8224 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8225
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8226 /* the event name ends with end of line, '|', a blank or a comma */
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
8227 for (p = start; *p && !VIM_ISWHITE(*p) && *p != ',' && *p != '|'; ++p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8228 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8229 for (i = 0; event_names[i].name != NULL; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8230 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8231 len = (int)STRLEN(event_names[i].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8232 if (len == p - start && STRNICMP(event_names[i].name, start, len) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8233 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8234 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8235 if (*p == ',')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8236 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8237 *end = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8238 if (event_names[i].name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8239 return NUM_EVENTS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8240 return event_names[i].event;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8241 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8242
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8243 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8244 * Return the name for event "event".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8245 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8246 static char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8247 event_nr2name(event_T event)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8248 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8249 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8250
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8251 for (i = 0; event_names[i].name != NULL; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8252 if (event_names[i].event == event)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8253 return (char_u *)event_names[i].name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8254 return (char_u *)"Unknown";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8255 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8256
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8257 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8258 * Scan over the events. "*" stands for all events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8259 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8260 static char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8261 find_end_event(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8262 char_u *arg,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8263 int have_group) /* TRUE when group name was found */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8264 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8265 char_u *pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8266 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8267
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8268 if (*arg == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8269 {
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
8270 if (arg[1] && !VIM_ISWHITE(arg[1]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8271 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8272 EMSG2(_("E215: Illegal character after *: %s"), arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8273 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8274 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8275 pat = arg + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8276 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8277 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8278 {
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
8279 for (pat = arg; *pat && *pat != '|' && !VIM_ISWHITE(*pat); pat = p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8280 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8281 if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8282 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8283 if (have_group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8284 EMSG2(_("E216: No such event: %s"), pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8285 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8286 EMSG2(_("E216: No such group or event: %s"), pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8287 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8288 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8289 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8290 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8291 return pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8292 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8293
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8294 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8295 * Return TRUE if "event" is included in 'eventignore'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8296 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8297 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8298 event_ignored(event_T event)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8299 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8300 char_u *p = p_ei;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8301
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8302 while (*p != NUL)
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8303 {
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8304 if (STRNICMP(p, "all", 3) == 0 && (p[3] == NUL || p[3] == ','))
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8305 return TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8306 if (event_name2nr(p, &p) == event)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8307 return TRUE;
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8308 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8309
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8310 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8311 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8312
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8313 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8314 * Return OK when the contents of p_ei is valid, FAIL otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8315 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8316 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8317 check_ei(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8319 char_u *p = p_ei;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8320
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8321 while (*p)
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8322 {
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8323 if (STRNICMP(p, "all", 3) == 0 && (p[3] == NUL || p[3] == ','))
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8324 {
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8325 p += 3;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8326 if (*p == ',')
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8327 ++p;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8328 }
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8329 else if (event_name2nr(p, &p) == NUM_EVENTS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8330 return FAIL;
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8331 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8332
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8333 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8334 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8335
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8336 # if defined(FEAT_SYN_HL) || defined(PROTO)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8337
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8338 /*
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8339 * Add "what" to 'eventignore' to skip loading syntax highlighting for every
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8340 * buffer loaded into the window. "what" must start with a comma.
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8341 * Returns the old value of 'eventignore' in allocated memory.
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8342 */
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8343 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8344 au_event_disable(char *what)
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8345 {
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8346 char_u *new_ei;
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8347 char_u *save_ei;
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8348
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8349 save_ei = vim_strsave(p_ei);
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8350 if (save_ei != NULL)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8351 {
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
8352 new_ei = vim_strnsave(p_ei, (int)(STRLEN(p_ei) + STRLEN(what)));
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8353 if (new_ei != NULL)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8354 {
2095
8aa3cd045aef updated for version 7.2.379
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
8355 if (*what == ',' && *p_ei == NUL)
8aa3cd045aef updated for version 7.2.379
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
8356 STRCPY(new_ei, what + 1);
8aa3cd045aef updated for version 7.2.379
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
8357 else
8aa3cd045aef updated for version 7.2.379
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
8358 STRCAT(new_ei, what);
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
8359 set_string_option_direct((char_u *)"ei", -1, new_ei,
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
8360 OPT_FREE, SID_NONE);
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8361 vim_free(new_ei);
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8362 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8363 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8364 return save_ei;
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8365 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8366
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8367 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8368 au_event_restore(char_u *old_ei)
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8369 {
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8370 if (old_ei != NULL)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8371 {
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
8372 set_string_option_direct((char_u *)"ei", -1, old_ei,
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
8373 OPT_FREE, SID_NONE);
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8374 vim_free(old_ei);
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8375 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8376 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8377 # endif /* FEAT_SYN_HL */
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8378
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8379 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8380 * do_autocmd() -- implements the :autocmd command. Can be used in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8381 * following ways:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8382 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8383 * :autocmd <event> <pat> <cmd> Add <cmd> to the list of commands that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8384 * will be automatically executed for <event>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8385 * when editing a file matching <pat>, in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8386 * the current group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8387 * :autocmd <event> <pat> Show the auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8388 * <event> and <pat>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8389 * :autocmd <event> Show the auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8390 * <event>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8391 * :autocmd Show all auto-commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8392 * :autocmd! <event> <pat> <cmd> Remove all auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8393 * <event> and <pat>, and add the command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8394 * <cmd>, for the current group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8395 * :autocmd! <event> <pat> Remove all auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8396 * <event> and <pat> for the current group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8397 * :autocmd! <event> Remove all auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8398 * <event> for the current group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8399 * :autocmd! Remove ALL auto-commands for the current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8400 * group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8401 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8402 * Multiple events and patterns may be given separated by commas. Here are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8403 * some examples:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8404 * :autocmd bufread,bufenter *.c,*.h set tw=0 smartindent noic
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8405 * :autocmd bufleave * set tw=79 nosmartindent ic infercase
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8406 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8407 * :autocmd * *.c show all autocommands for *.c files.
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
8408 *
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
8409 * Mostly a {group} argument can optionally appear before <event>.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8410 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8411 void
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8412 do_autocmd(char_u *arg_in, int forceit)
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8413 {
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8414 char_u *arg = arg_in;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8415 char_u *pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8416 char_u *envpat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8417 char_u *cmd;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8418 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8419 int need_free = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8420 int nested = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8421 int group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8422
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8423 if (*arg == '|')
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8424 {
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8425 arg = (char_u *)"";
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8426 group = AUGROUP_ALL; /* no argument, use all groups */
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8427 }
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8428 else
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8429 {
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8430 /*
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8431 * Check for a legal group name. If not, use AUGROUP_ALL.
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8432 */
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8433 group = au_get_grouparg(&arg);
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8434 if (arg == NULL) /* out of memory */
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8435 return;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8436 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8437
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8438 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8439 * Scan over the events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8440 * If we find an illegal name, return here, don't do anything.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8441 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8442 pat = find_end_event(arg, group != AUGROUP_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8443 if (pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8444 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8445
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8446 pat = skipwhite(pat);
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8447 if (*pat == '|')
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8448 {
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8449 pat = (char_u *)"";
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8450 cmd = (char_u *)"";
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8451 }
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8452 else
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8453 {
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8454 /*
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8455 * Scan over the pattern. Put a NUL at the end.
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8456 */
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8457 cmd = pat;
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
8458 while (*cmd && (!VIM_ISWHITE(*cmd) || cmd[-1] == '\\'))
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8459 cmd++;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8460 if (*cmd)
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8461 *cmd++ = NUL;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8462
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8463 /* Expand environment variables in the pattern. Set 'shellslash', we want
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8464 * forward slashes here. */
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8465 if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL)
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8466 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8467 #ifdef BACKSLASH_IN_FILENAME
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8468 int p_ssl_save = p_ssl;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8469
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8470 p_ssl = TRUE;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8471 #endif
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8472 envpat = expand_env_save(pat);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8473 #ifdef BACKSLASH_IN_FILENAME
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8474 p_ssl = p_ssl_save;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8475 #endif
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8476 if (envpat != NULL)
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8477 pat = envpat;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8478 }
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8479
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8480 /*
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8481 * Check for "nested" flag.
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8482 */
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8483 cmd = skipwhite(cmd);
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
8484 if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0 && VIM_ISWHITE(cmd[6]))
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8485 {
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8486 nested = TRUE;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8487 cmd = skipwhite(cmd + 6);
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8488 }
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8489
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8490 /*
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8491 * Find the start of the commands.
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8492 * Expand <sfile> in it.
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8493 */
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8494 if (*cmd != NUL)
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8495 {
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8496 cmd = expand_sfile(cmd);
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8497 if (cmd == NULL) /* some error */
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8498 return;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8499 need_free = TRUE;
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8500 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8501 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8502
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8503 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8504 * Print header when showing autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8505 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8506 if (!forceit && *cmd == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8507 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8508 /* Highlight title */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8509 MSG_PUTS_TITLE(_("\n--- Auto-Commands ---"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8510 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8511
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8512 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8513 * Loop over the events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8514 */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8515 last_event = (event_T)-1; /* for listing the event name */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8516 last_group = AUGROUP_ERROR; /* for listing the group name */
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8517 if (*arg == '*' || *arg == NUL || *arg == '|')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8518 {
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8519 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8520 event = (event_T)((int)event + 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8521 if (do_autocmd_event(event, pat,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8522 nested, cmd, forceit, group) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8523 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8524 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8525 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8526 {
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
8527 while (*arg && *arg != '|' && !VIM_ISWHITE(*arg))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8528 if (do_autocmd_event(event_name2nr(arg, &arg), pat,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8529 nested, cmd, forceit, group) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8530 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8531 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8532
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8533 if (need_free)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8534 vim_free(cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8535 vim_free(envpat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8536 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8537
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8538 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8539 * Find the group ID in a ":autocmd" or ":doautocmd" argument.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8540 * The "argp" argument is advanced to the following argument.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8541 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8542 * Returns the group ID, AUGROUP_ERROR for error (out of memory).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8543 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8544 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8545 au_get_grouparg(char_u **argp)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8546 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8547 char_u *group_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8548 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8549 char_u *arg = *argp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8550 int group = AUGROUP_ALL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8551
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
8552 for (p = arg; *p && !VIM_ISWHITE(*p) && *p != '|'; ++p)
9653
01c9630e80e0 commit https://github.com/vim/vim/commit/e99e84497b89e5f91df519790802770920ecf4fe
Christian Brabandt <cb@256bit.org>
parents: 9649
diff changeset
8553 ;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8554 if (p > arg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8555 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8556 group_name = vim_strnsave(arg, (int)(p - arg));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8557 if (group_name == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8558 return AUGROUP_ERROR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8559 group = au_find_group(group_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8560 if (group == AUGROUP_ERROR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8561 group = AUGROUP_ALL; /* no match, use all groups */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8562 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8563 *argp = skipwhite(p); /* match, skip over group name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8564 vim_free(group_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8565 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8566 return group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8567 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8568
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8569 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8570 * do_autocmd() for one event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8571 * If *pat == NUL do for all patterns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8572 * If *cmd == NUL show entries.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8573 * If forceit == TRUE delete entries.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8574 * If group is not AUGROUP_ALL, only use this group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8575 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8576 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8577 do_autocmd_event(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8578 event_T event,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8579 char_u *pat,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8580 int nested,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8581 char_u *cmd,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8582 int forceit,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8583 int group)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8585 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8586 AutoPat **prev_ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8587 AutoCmd *ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8588 AutoCmd **prev_ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8589 int brace_level;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8590 char_u *endpat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8591 int findgroup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8592 int allgroups;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8593 int patlen;
856
8cd729851562 updated for version 7.0g
vimboss
parents: 844
diff changeset
8594 int is_buflocal;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8595 int buflocal_nr;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8596 char_u buflocal_pat[25]; /* for "<buffer=X>" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8597
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8598 if (group == AUGROUP_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8599 findgroup = current_augroup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8600 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8601 findgroup = group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8602 allgroups = (group == AUGROUP_ALL && !forceit && *cmd == NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8603
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8604 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8605 * Show or delete all patterns for an event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8606 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8607 if (*pat == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8608 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8609 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8610 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8611 if (forceit) /* delete the AutoPat, if it's in the current group */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8612 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8613 if (ap->group == findgroup)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8614 au_remove_pat(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8615 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8616 else if (group == AUGROUP_ALL || ap->group == group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8617 show_autocmd(ap, event);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8618 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8619 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8620
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8621 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8622 * Loop through all the specified patterns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8623 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8624 for ( ; *pat; pat = (*endpat == ',' ? endpat + 1 : endpat))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8625 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8626 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8627 * Find end of the pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8628 * Watch out for a comma in braces, like "*.\{obj,o\}".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8629 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8630 brace_level = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8631 for (endpat = pat; *endpat && (*endpat != ',' || brace_level
6963
4bf9538ff25e patch 7.4.799
Bram Moolenaar <bram@vim.org>
parents: 6935
diff changeset
8632 || (endpat > pat && endpat[-1] == '\\')); ++endpat)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8633 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8634 if (*endpat == '{')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8635 brace_level++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8636 else if (*endpat == '}')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8637 brace_level--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8638 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8639 if (pat == endpat) /* ignore single comma */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8640 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8641 patlen = (int)(endpat - pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8642
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8643 /*
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8644 * detect special <buflocal[=X]> buffer-local patterns
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8645 */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8646 is_buflocal = FALSE;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8647 buflocal_nr = 0;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8648
6623
a532340f3940 updated for version 7.4.637
Bram Moolenaar <bram@vim.org>
parents: 6618
diff changeset
8649 if (patlen >= 8 && STRNCMP(pat, "<buffer", 7) == 0
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8650 && pat[patlen - 1] == '>')
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8651 {
6623
a532340f3940 updated for version 7.4.637
Bram Moolenaar <bram@vim.org>
parents: 6618
diff changeset
8652 /* "<buffer...>": Error will be printed only for addition.
a532340f3940 updated for version 7.4.637
Bram Moolenaar <bram@vim.org>
parents: 6618
diff changeset
8653 * printing and removing will proceed silently. */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8654 is_buflocal = TRUE;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8655 if (patlen == 8)
6623
a532340f3940 updated for version 7.4.637
Bram Moolenaar <bram@vim.org>
parents: 6618
diff changeset
8656 /* "<buffer>" */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8657 buflocal_nr = curbuf->b_fnum;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8658 else if (patlen > 9 && pat[7] == '=')
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8659 {
6623
a532340f3940 updated for version 7.4.637
Bram Moolenaar <bram@vim.org>
parents: 6618
diff changeset
8660 if (patlen == 13 && STRNICMP(pat, "<buffer=abuf>", 13) == 0)
a532340f3940 updated for version 7.4.637
Bram Moolenaar <bram@vim.org>
parents: 6618
diff changeset
8661 /* "<buffer=abuf>" */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8662 buflocal_nr = autocmd_bufnr;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8663 else if (skipdigits(pat + 8) == pat + patlen - 1)
6623
a532340f3940 updated for version 7.4.637
Bram Moolenaar <bram@vim.org>
parents: 6618
diff changeset
8664 /* "<buffer=123>" */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8665 buflocal_nr = atoi((char *)pat + 8);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8666 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8667 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8668
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8669 if (is_buflocal)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8670 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8671 /* normalize pat into standard "<buffer>#N" form */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8672 sprintf((char *)buflocal_pat, "<buffer=%d>", buflocal_nr);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8673 pat = buflocal_pat; /* can modify pat and patlen */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
8674 patlen = (int)STRLEN(buflocal_pat); /* but not endpat */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8675 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8676
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8677 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8678 * Find AutoPat entries with this pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8679 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8680 prev_ap = &first_autopat[(int)event];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8681 while ((ap = *prev_ap) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8682 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8683 if (ap->pat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8684 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8685 /* Accept a pattern when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8686 * - a group was specified and it's that group, or a group was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8687 * not specified and it's the current group, or a group was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8688 * not specified and we are listing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8689 * - the length of the pattern matches
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8690 * - the pattern matches.
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8691 * For <buffer[=X]>, this condition works because we normalize
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8692 * all buffer-local patterns.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8693 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8694 if ((allgroups || ap->group == findgroup)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8695 && ap->patlen == patlen
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8696 && STRNCMP(pat, ap->pat, patlen) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8697 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8698 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8699 * Remove existing autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8700 * If adding any new autocmd's for this AutoPat, don't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8701 * delete the pattern from the autopat list, append to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8702 * this list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8703 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8704 if (forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8705 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8706 if (*cmd != NUL && ap->next == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8707 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8708 au_remove_cmds(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8709 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8710 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8711 au_remove_pat(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8712 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8713
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8714 /*
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8715 * Show autocmd's for this autopat, or buflocals <buffer=X>
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8716 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8717 else if (*cmd == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8718 show_autocmd(ap, event);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8719
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8720 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8721 * Add autocmd to this autopat, if it's the last one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8722 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8723 else if (ap->next == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8724 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8725 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8726 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8727 prev_ap = &ap->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8728 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8729
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8730 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8731 * Add a new command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8732 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8733 if (*cmd != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8734 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8735 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8736 * If the pattern we want to add a command to does appear at the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8737 * end of the list (or not is not in the list at all), add the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8738 * pattern at the end of the list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8739 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8740 if (ap == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8741 {
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8742 /* refuse to add buffer-local ap if buffer number is invalid */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8743 if (is_buflocal && (buflocal_nr == 0
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8744 || buflist_findnr(buflocal_nr) == NULL))
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8745 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8746 EMSGN(_("E680: <buffer=%d>: invalid buffer number "),
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8747 buflocal_nr);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8748 return FAIL;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8749 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8750
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8751 ap = (AutoPat *)alloc((unsigned)sizeof(AutoPat));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8752 if (ap == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8753 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8754 ap->pat = vim_strnsave(pat, patlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8755 ap->patlen = patlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8756 if (ap->pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8757 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8758 vim_free(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8759 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8760 }
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8761
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8762 if (is_buflocal)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8763 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8764 ap->buflocal_nr = buflocal_nr;
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8765 ap->reg_prog = NULL;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8766 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8767 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8768 {
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8769 char_u *reg_pat;
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8770
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8771 ap->buflocal_nr = 0;
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8772 reg_pat = file_pat_to_reg_pat(pat, endpat,
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8773 &ap->allow_dirs, TRUE);
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8774 if (reg_pat != NULL)
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8775 ap->reg_prog = vim_regcomp(reg_pat, RE_MAGIC);
355
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8776 vim_free(reg_pat);
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8777 if (reg_pat == NULL || ap->reg_prog == NULL)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8778 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8779 vim_free(ap->pat);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8780 vim_free(ap);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8781 return FAIL;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8782 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8783 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8784 ap->cmds = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8785 *prev_ap = ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8786 ap->next = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8787 if (group == AUGROUP_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8788 ap->group = current_augroup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8789 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8790 ap->group = group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8791 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8792
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8793 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8794 * Add the autocmd at the end of the AutoCmd list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8795 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8796 prev_ac = &(ap->cmds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8797 while ((ac = *prev_ac) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8798 prev_ac = &ac->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8799 ac = (AutoCmd *)alloc((unsigned)sizeof(AutoCmd));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8800 if (ac == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8801 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8802 ac->cmd = vim_strsave(cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8803 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8804 ac->scriptID = current_SID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8805 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8806 if (ac->cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8807 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8808 vim_free(ac);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8809 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8810 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8811 ac->next = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8812 *prev_ac = ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8813 ac->nested = nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8814 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8815 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8816
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8817 au_cleanup(); /* may really delete removed patterns/commands now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8818 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8820
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8821 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8822 * Implementation of ":doautocmd [group] event [fname]".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8823 * Return OK for success, FAIL for failure;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8824 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8825 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8826 do_doautocmd(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8827 char_u *arg,
9260
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8828 int do_msg, /* give message for no matching autocmds? */
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8829 int *did_something)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8830 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8831 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8832 int nothing_done = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8833 int group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8834
9260
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8835 if (did_something != NULL)
9291
bff3cd5cf922 commit https://github.com/vim/vim/commit/76ae22fef3cb224ca7fbf97517f881e825d4d0c2
Christian Brabandt <cb@256bit.org>
parents: 9260
diff changeset
8836 *did_something = FALSE;
9260
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8837
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8838 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8839 * Check for a legal group name. If not, use AUGROUP_ALL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8840 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8841 group = au_get_grouparg(&arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8842 if (arg == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8843 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8844
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8845 if (*arg == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8846 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8847 EMSG(_("E217: Can't execute autocommands for ALL events"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8848 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8849 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8850
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8851 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8852 * Scan over the events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8853 * If we find an illegal name, return here, don't do anything.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8854 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8855 fname = find_end_event(arg, group != AUGROUP_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8856 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8857 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8858
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8859 fname = skipwhite(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8860
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8861 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8862 * Loop over the events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8863 */
11641
dbce7e03bf55 patch 8.0.0703: illegal memory access with empty :doau command
Christian Brabandt <cb@256bit.org>
parents: 11605
diff changeset
8864 while (*arg && !ends_excmd(*arg) && !VIM_ISWHITE(*arg))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8865 if (apply_autocmds_group(event_name2nr(arg, &arg),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8866 fname, NULL, TRUE, group, curbuf, NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8867 nothing_done = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8868
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8869 if (nothing_done && do_msg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8870 MSG(_("No matching autocommands"));
9260
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8871 if (did_something != NULL)
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8872 *did_something = !nothing_done;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8873
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8874 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8875 return aborting() ? FAIL : OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8876 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8877 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8878 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8879 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8880
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8881 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8882 * ":doautoall": execute autocommands for each loaded buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8883 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8884 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8885 ex_doautoall(exarg_T *eap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8886 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8887 int retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8888 aco_save_T aco;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8889 buf_T *buf;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
8890 bufref_T bufref;
3342
bb67cd961fc3 updated for version 7.3.438
Bram Moolenaar <bram@vim.org>
parents: 3340
diff changeset
8891 char_u *arg = eap->arg;
3350
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8892 int call_do_modelines = check_nomodeline(&arg);
9260
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8893 int did_aucmd;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8894
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8895 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8896 * This is a bit tricky: For some commands curwin->w_buffer needs to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8897 * equal to curbuf, but for some buffers there may not be a window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8898 * So we change the buffer for the current window for a moment. This
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8899 * gives problems when the autocommands make changes to the list of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8900 * buffers or windows...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8901 */
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9599
diff changeset
8902 FOR_ALL_BUFFERS(buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8903 {
1665
5c3844ad7d56 updated for version 7.2a-017
vimboss
parents: 1653
diff changeset
8904 if (buf->b_ml.ml_mfp != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8905 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8906 /* find a window for this buffer and save some values */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8907 aucmd_prepbuf(&aco, buf);
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
8908 set_bufref(&bufref, buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8909
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8910 /* execute the autocommands for this buffer */
9260
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8911 retval = do_doautocmd(arg, FALSE, &did_aucmd);
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8912
ac8180818504 commit https://github.com/vim/vim/commit/1610d052413e0ed664498853a47acc2d677a22d1
Christian Brabandt <cb@256bit.org>
parents: 9211
diff changeset
8913 if (call_do_modelines && did_aucmd)
3342
bb67cd961fc3 updated for version 7.3.438
Bram Moolenaar <bram@vim.org>
parents: 3340
diff changeset
8914 {
bb67cd961fc3 updated for version 7.3.438
Bram Moolenaar <bram@vim.org>
parents: 3340
diff changeset
8915 /* Execute the modeline settings, but don't set window-local
bb67cd961fc3 updated for version 7.3.438
Bram Moolenaar <bram@vim.org>
parents: 3340
diff changeset
8916 * options if we are using the current window for another
bb67cd961fc3 updated for version 7.3.438
Bram Moolenaar <bram@vim.org>
parents: 3340
diff changeset
8917 * buffer. */
bb67cd961fc3 updated for version 7.3.438
Bram Moolenaar <bram@vim.org>
parents: 3340
diff changeset
8918 do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
bb67cd961fc3 updated for version 7.3.438
Bram Moolenaar <bram@vim.org>
parents: 3340
diff changeset
8919 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8920
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8921 /* restore the current window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8922 aucmd_restbuf(&aco);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8924 /* stop if there is some error or buffer was deleted */
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
8925 if (retval == FAIL || !bufref_valid(&bufref))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8926 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8927 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8928 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8929
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8930 check_cursor(); /* just in case lines got deleted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8931 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8932
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8933 /*
3350
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8934 * Check *argp for <nomodeline>. When it is present return FALSE, otherwise
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8935 * return TRUE and advance *argp to after it.
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8936 * Thus return TRUE when do_modelines() should be called.
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8937 */
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8938 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8939 check_nomodeline(char_u **argp)
3350
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8940 {
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8941 if (STRNCMP(*argp, "<nomodeline>", 12) == 0)
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8942 {
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8943 *argp = skipwhite(*argp + 12);
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8944 return FALSE;
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8945 }
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8946 return TRUE;
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8947 }
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8948
198ec1fff71a updated for version 7.3.442
Bram Moolenaar <bram@vim.org>
parents: 3342
diff changeset
8949 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8950 * Prepare for executing autocommands for (hidden) buffer "buf".
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8951 * Search for a visible window containing the current buffer. If there isn't
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8952 * one then use "aucmd_win".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8953 * Set "curbuf" and "curwin" to match "buf".
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
8954 * When FEAT_AUTOCMD is not defined another version is used, see below.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8955 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8956 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8957 aucmd_prepbuf(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8958 aco_save_T *aco, /* structure to save values in */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
8959 buf_T *buf) /* new curbuf */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8960 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8961 win_T *win;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8962 #ifdef FEAT_WINDOWS
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8963 int save_ea;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8964 #endif
5278
d96f16667cc4 updated for version 7.4b.015
Bram Moolenaar <bram@vim.org>
parents: 5263
diff changeset
8965 #ifdef FEAT_AUTOCHDIR
5263
3059c799fcd9 updated for version 7.4b.008
Bram Moolenaar <bram@vim.org>
parents: 5259
diff changeset
8966 int save_acd;
5278
d96f16667cc4 updated for version 7.4b.015
Bram Moolenaar <bram@vim.org>
parents: 5263
diff changeset
8967 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8968
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8969 /* Find a window that is for the new buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8970 if (buf == curbuf) /* be quick when buf is curbuf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8971 win = curwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8972 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8973 #ifdef FEAT_WINDOWS
9649
fd9727ae3c49 commit https://github.com/vim/vim/commit/2932359000b2f918d5fade79ea4d124d5943cd07
Christian Brabandt <cb@256bit.org>
parents: 9599
diff changeset
8974 FOR_ALL_WINDOWS(win)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8975 if (win->w_buffer == buf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8976 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8977 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8978 win = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8979 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8980
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8981 /* Allocate "aucmd_win" when needed. If this fails (out of memory) fall
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8982 * back to using the current window. */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8983 if (win == NULL && aucmd_win == NULL)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8984 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8985 win_alloc_aucmd_win();
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8986 if (aucmd_win == NULL)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8987 win = curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8988 }
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8989 if (win == NULL && aucmd_win_used)
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8990 /* Strange recursive autocommand, fall back to using the current
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8991 * window. Expect a few side effects... */
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8992 win = curwin;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8993
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8994 aco->save_curwin = curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8995 aco->save_curbuf = curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8996 if (win != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8997 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8998 /* There is a window for "buf" in the current tab page, make it the
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8999 * curwin. This is preferred, it has the least side effects (esp. if
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9000 * "buf" is curbuf). */
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9001 aco->use_aucmd_win = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9002 curwin = win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9003 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9004 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9005 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9006 /* There is no window for "buf", use "aucmd_win". To minimize the side
4352
04736b4030ec updated for version 7.3.925
Bram Moolenaar <bram@vim.org>
parents: 4331
diff changeset
9007 * effects, insert it in the current tab page.
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9008 * Anything related to a window (e.g., setting folds) may have
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9009 * unexpected results. */
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9010 aco->use_aucmd_win = TRUE;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9011 aucmd_win_used = TRUE;
1918
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
9012 aucmd_win->w_buffer = buf;
2258
772bfca06c18 Fix crash when using ":grep".
Bram Moolenaar <bram@vim.org>
parents: 2244
diff changeset
9013 aucmd_win->w_s = &buf->b_s;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9014 ++buf->b_nwindows;
1918
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
9015 win_init_empty(aucmd_win); /* set cursor and topline to safe values */
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9016
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9017 /* Make sure w_localdir and globaldir are NULL to avoid a chdir() in
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9018 * win_enter_ext(). */
5263
3059c799fcd9 updated for version 7.4b.008
Bram Moolenaar <bram@vim.org>
parents: 5259
diff changeset
9019 vim_free(aucmd_win->w_localdir);
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9020 aucmd_win->w_localdir = NULL;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9021 aco->globaldir = globaldir;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9022 globaldir = NULL;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9023
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9024
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9025 #ifdef FEAT_WINDOWS
1923
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
9026 /* Split the current window, put the aucmd_win in the upper half.
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
9027 * We don't want the BufEnter or WinEnter autocommands. */
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
9028 block_autocmds();
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9029 make_snapshot(SNAP_AUCMD_IDX);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9030 save_ea = p_ea;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9031 p_ea = FALSE;
5263
3059c799fcd9 updated for version 7.4b.008
Bram Moolenaar <bram@vim.org>
parents: 5259
diff changeset
9032
5278
d96f16667cc4 updated for version 7.4b.015
Bram Moolenaar <bram@vim.org>
parents: 5263
diff changeset
9033 # ifdef FEAT_AUTOCHDIR
5263
3059c799fcd9 updated for version 7.4b.008
Bram Moolenaar <bram@vim.org>
parents: 5259
diff changeset
9034 /* Prevent chdir() call in win_enter_ext(), through do_autochdir(). */
3059c799fcd9 updated for version 7.4b.008
Bram Moolenaar <bram@vim.org>
parents: 5259
diff changeset
9035 save_acd = p_acd;
3059c799fcd9 updated for version 7.4b.008
Bram Moolenaar <bram@vim.org>
parents: 5259
diff changeset
9036 p_acd = FALSE;
5278
d96f16667cc4 updated for version 7.4b.015
Bram Moolenaar <bram@vim.org>
parents: 5263
diff changeset
9037 # endif
5263
3059c799fcd9 updated for version 7.4b.008
Bram Moolenaar <bram@vim.org>
parents: 5259
diff changeset
9038
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9039 (void)win_split_ins(0, WSP_TOP, aucmd_win, 0);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9040 (void)win_comp_pos(); /* recompute window positions */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9041 p_ea = save_ea;
5278
d96f16667cc4 updated for version 7.4b.015
Bram Moolenaar <bram@vim.org>
parents: 5263
diff changeset
9042 # ifdef FEAT_AUTOCHDIR
5263
3059c799fcd9 updated for version 7.4b.008
Bram Moolenaar <bram@vim.org>
parents: 5259
diff changeset
9043 p_acd = save_acd;
5278
d96f16667cc4 updated for version 7.4b.015
Bram Moolenaar <bram@vim.org>
parents: 5263
diff changeset
9044 # endif
1923
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
9045 unblock_autocmds();
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9046 #endif
1918
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
9047 curwin = aucmd_win;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9048 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9049 curbuf = buf;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9050 aco->new_curwin = curwin;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9051 set_bufref(&aco->new_curbuf, curbuf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9052 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9053
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9054 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9055 * Cleanup after executing autocommands for a (hidden) buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9056 * Restore the window as it was (if possible).
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9057 * When FEAT_AUTOCMD is not defined another version is used, see below.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9058 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9059 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9060 aucmd_restbuf(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9061 aco_save_T *aco) /* structure holding saved values */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9062 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9063 #ifdef FEAT_WINDOWS
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9064 int dummy;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9065 #endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9066
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9067 if (aco->use_aucmd_win)
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9068 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9069 --curbuf->b_nwindows;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9070 #ifdef FEAT_WINDOWS
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9071 /* Find "aucmd_win", it can't be closed, but it may be in another tab
1923
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
9072 * page. Do not trigger autocommands here. */
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
9073 block_autocmds();
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9074 if (curwin != aucmd_win)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9075 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9076 tabpage_T *tp;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9077 win_T *wp;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9078
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9079 FOR_ALL_TAB_WINDOWS(tp, wp)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9080 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9081 if (wp == aucmd_win)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9082 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9083 if (tp != curtab)
4354
c80838526eeb updated for version 7.3.926
Bram Moolenaar <bram@vim.org>
parents: 4352
diff changeset
9084 goto_tabpage_tp(tp, TRUE, TRUE);
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9085 win_goto(aucmd_win);
3340
539613ce999d updated for version 7.3.437
Bram Moolenaar <bram@vim.org>
parents: 3036
diff changeset
9086 goto win_found;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9087 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9088 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9089 }
3340
539613ce999d updated for version 7.3.437
Bram Moolenaar <bram@vim.org>
parents: 3036
diff changeset
9090 win_found:
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9091
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9092 /* Remove the window and frame from the tree of frames. */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9093 (void)winframe_remove(curwin, &dummy, NULL);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9094 win_remove(curwin, NULL);
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9095 aucmd_win_used = FALSE;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9096 last_status(FALSE); /* may need to remove last status line */
11199
e08ead1d269f patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
9097
e08ead1d269f patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
9098 if (!valid_tabpage_win(curtab))
e08ead1d269f patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
9099 /* no valid window in current tabpage */
e08ead1d269f patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
9100 close_tabpage(curtab);
e08ead1d269f patch 8.0.0486: crash and endless loop when closing windows in autocmd
Christian Brabandt <cb@256bit.org>
parents: 11158
diff changeset
9101
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9102 restore_snapshot(SNAP_AUCMD_IDX, FALSE);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9103 (void)win_comp_pos(); /* recompute window positions */
1923
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
9104 unblock_autocmds();
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9105
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9106 if (win_valid(aco->save_curwin))
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9107 curwin = aco->save_curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9108 else
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9109 /* Hmm, original window disappeared. Just use the first one. */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9110 curwin = firstwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9111 # ifdef FEAT_EVAL
4287
dc3efb6d5a08 updated for version 7.3.893
Bram Moolenaar <bram@vim.org>
parents: 4242
diff changeset
9112 vars_clear(&aucmd_win->w_vars->dv_hashtab); /* free all w: variables */
dc3efb6d5a08 updated for version 7.3.893
Bram Moolenaar <bram@vim.org>
parents: 4242
diff changeset
9113 hash_init(&aucmd_win->w_vars->dv_hashtab); /* re-use the hashtab */
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9114 # endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9115 #else
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9116 curwin = aco->save_curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9117 #endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9118 curbuf = curwin->w_buffer;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9119
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9120 vim_free(globaldir);
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9121 globaldir = aco->globaldir;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9122
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9123 /* the buffer contents may have changed */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9124 check_cursor();
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9125 if (curwin->w_topline > curbuf->b_ml.ml_line_count)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9126 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9127 curwin->w_topline = curbuf->b_ml.ml_line_count;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9128 #ifdef FEAT_DIFF
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9129 curwin->w_topfill = 0;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9130 #endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9131 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9132 #if defined(FEAT_GUI)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9133 /* Hide the scrollbars from the aucmd_win and update. */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9134 gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_LEFT], FALSE);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9135 gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_RIGHT], FALSE);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9136 gui_may_update_scrollbars();
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9137 #endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9138 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9139 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9141 /* restore curwin */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9142 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9143 if (win_valid(aco->save_curwin))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9144 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9145 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9146 /* Restore the buffer which was previously edited by curwin, if
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
9147 * it was changed, we are still the same window and the buffer is
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9148 * valid. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9149 if (curwin == aco->new_curwin
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9150 && curbuf != aco->new_curbuf.br_buf
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9151 && bufref_valid(&aco->new_curbuf)
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9152 && aco->new_curbuf.br_buf->b_ml.ml_mfp != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9153 {
3497
b782e2f9e689 updated for version 7.3.511
Bram Moolenaar <bram@vim.org>
parents: 3482
diff changeset
9154 # if defined(FEAT_SYN_HL) || defined(FEAT_SPELL)
b782e2f9e689 updated for version 7.3.511
Bram Moolenaar <bram@vim.org>
parents: 3482
diff changeset
9155 if (curwin->w_s == &curbuf->b_s)
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9156 curwin->w_s = &aco->new_curbuf.br_buf->b_s;
3497
b782e2f9e689 updated for version 7.3.511
Bram Moolenaar <bram@vim.org>
parents: 3482
diff changeset
9157 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9158 --curbuf->b_nwindows;
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9159 curbuf = aco->new_curbuf.br_buf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9160 curwin->w_buffer = curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9161 ++curbuf->b_nwindows;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9162 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9163
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9164 curwin = aco->save_curwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9165 curbuf = curwin->w_buffer;
6201
52fa8300ce20 updated for version 7.4.436
Bram Moolenaar <bram@vim.org>
parents: 6154
diff changeset
9166 /* In case the autocommand move the cursor to a position that that
52fa8300ce20 updated for version 7.4.436
Bram Moolenaar <bram@vim.org>
parents: 6154
diff changeset
9167 * not exist in curbuf. */
52fa8300ce20 updated for version 7.4.436
Bram Moolenaar <bram@vim.org>
parents: 6154
diff changeset
9168 check_cursor();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9169 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9170 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9171 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9172
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9173 static int autocmd_nested = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9174
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9175 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9176 * Execute autocommands for "event" and file name "fname".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9177 * Return TRUE if some commands were executed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9178 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9179 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9180 apply_autocmds(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9181 event_T event,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9182 char_u *fname, /* NULL or empty means use actual file name */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9183 char_u *fname_io, /* fname to use for <afile> on cmdline */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9184 int force, /* when TRUE, ignore autocmd_busy */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9185 buf_T *buf) /* buffer for <abuf> */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9186 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9187 return apply_autocmds_group(event, fname, fname_io, force,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9188 AUGROUP_ALL, buf, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9189 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9190
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9191 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9192 * Like apply_autocmds(), but with extra "eap" argument. This takes care of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9193 * setting v:filearg.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9194 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9195 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9196 apply_autocmds_exarg(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9197 event_T event,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9198 char_u *fname,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9199 char_u *fname_io,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9200 int force,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9201 buf_T *buf,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9202 exarg_T *eap)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9203 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9204 return apply_autocmds_group(event, fname, fname_io, force,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9205 AUGROUP_ALL, buf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9206 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9207
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9208 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9209 * Like apply_autocmds(), but handles the caller's retval. If the script
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9210 * processing is being aborted or if retval is FAIL when inside a try
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9211 * conditional, no autocommands are executed. If otherwise the autocommands
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9212 * cause the script to be aborted, retval is set to FAIL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9213 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9214 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9215 apply_autocmds_retval(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9216 event_T event,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9217 char_u *fname, /* NULL or empty means use actual file name */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9218 char_u *fname_io, /* fname to use for <afile> on cmdline */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9219 int force, /* when TRUE, ignore autocmd_busy */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9220 buf_T *buf, /* buffer for <abuf> */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9221 int *retval) /* pointer to caller's retval */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9222 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9223 int did_cmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9224
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
9225 #ifdef FEAT_EVAL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9226 if (should_abort(*retval))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9227 return FALSE;
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
9228 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9229
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9230 did_cmd = apply_autocmds_group(event, fname, fname_io, force,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9231 AUGROUP_ALL, buf, NULL);
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
9232 if (did_cmd
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
9233 #ifdef FEAT_EVAL
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
9234 && aborting()
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
9235 #endif
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
9236 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9237 *retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9238 return did_cmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9239 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9240
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9241 /*
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9242 * Return TRUE when there is a CursorHold autocommand defined.
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9243 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9244 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9245 has_cursorhold(void)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9246 {
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9247 return (first_autopat[(int)(get_real_state() == NORMAL_BUSY
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9248 ? EVENT_CURSORHOLD : EVENT_CURSORHOLDI)] != NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9249 }
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9250
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9251 /*
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9252 * Return TRUE if the CursorHold event can be triggered.
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9253 */
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9254 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9255 trigger_cursorhold(void)
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9256 {
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9257 int state;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9258
2976
cb4682b95909 updated for version 7.3.260
Bram Moolenaar <bram@vim.org>
parents: 2845
diff changeset
9259 if (!did_cursorhold
cb4682b95909 updated for version 7.3.260
Bram Moolenaar <bram@vim.org>
parents: 2845
diff changeset
9260 && has_cursorhold()
cb4682b95909 updated for version 7.3.260
Bram Moolenaar <bram@vim.org>
parents: 2845
diff changeset
9261 && !Recording
cb4682b95909 updated for version 7.3.260
Bram Moolenaar <bram@vim.org>
parents: 2845
diff changeset
9262 && typebuf.tb_len == 0
978
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9263 #ifdef FEAT_INS_EXPAND
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9264 && !ins_compl_active()
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9265 #endif
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9266 )
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9267 {
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9268 state = get_real_state();
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9269 if (state == NORMAL_BUSY || (state & INSERT) != 0)
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9270 return TRUE;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9271 }
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9272 return FALSE;
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9273 }
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9274
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9275 /*
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9276 * Return TRUE when there is a CursorMoved autocommand defined.
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9277 */
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9278 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9279 has_cursormoved(void)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9280 {
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9281 return (first_autopat[(int)EVENT_CURSORMOVED] != NULL);
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9282 }
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9283
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9284 /*
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9285 * Return TRUE when there is a CursorMovedI autocommand defined.
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9286 */
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9287 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9288 has_cursormovedI(void)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9289 {
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9290 return (first_autopat[(int)EVENT_CURSORMOVEDI] != NULL);
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9291 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9292
3390
de60f6fa3d8d updated for version 7.3.461
Bram Moolenaar <bram@vim.org>
parents: 3350
diff changeset
9293 /*
4232
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9294 * Return TRUE when there is a TextChanged autocommand defined.
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9295 */
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9296 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9297 has_textchanged(void)
4232
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9298 {
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9299 return (first_autopat[(int)EVENT_TEXTCHANGED] != NULL);
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9300 }
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9301
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9302 /*
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9303 * Return TRUE when there is a TextChangedI autocommand defined.
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9304 */
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9305 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9306 has_textchangedI(void)
4232
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9307 {
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9308 return (first_autopat[(int)EVENT_TEXTCHANGEDI] != NULL);
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9309 }
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9310
0fcb050fd79d updated for version 7.3.867
Bram Moolenaar <bram@vim.org>
parents: 4071
diff changeset
9311 /*
3390
de60f6fa3d8d updated for version 7.3.461
Bram Moolenaar <bram@vim.org>
parents: 3350
diff changeset
9312 * Return TRUE when there is an InsertCharPre autocommand defined.
de60f6fa3d8d updated for version 7.3.461
Bram Moolenaar <bram@vim.org>
parents: 3350
diff changeset
9313 */
de60f6fa3d8d updated for version 7.3.461
Bram Moolenaar <bram@vim.org>
parents: 3350
diff changeset
9314 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9315 has_insertcharpre(void)
3390
de60f6fa3d8d updated for version 7.3.461
Bram Moolenaar <bram@vim.org>
parents: 3350
diff changeset
9316 {
de60f6fa3d8d updated for version 7.3.461
Bram Moolenaar <bram@vim.org>
parents: 3350
diff changeset
9317 return (first_autopat[(int)EVENT_INSERTCHARPRE] != NULL);
de60f6fa3d8d updated for version 7.3.461
Bram Moolenaar <bram@vim.org>
parents: 3350
diff changeset
9318 }
de60f6fa3d8d updated for version 7.3.461
Bram Moolenaar <bram@vim.org>
parents: 3350
diff changeset
9319
6154
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9320 /*
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9321 * Return TRUE when there is an CmdUndefined autocommand defined.
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9322 */
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9323 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9324 has_cmdundefined(void)
6154
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9325 {
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9326 return (first_autopat[(int)EVENT_CMDUNDEFINED] != NULL);
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9327 }
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9328
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9329 /*
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9330 * Return TRUE when there is an FuncUndefined autocommand defined.
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9331 */
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9332 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9333 has_funcundefined(void)
6154
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9334 {
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9335 return (first_autopat[(int)EVENT_FUNCUNDEFINED] != NULL);
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9336 }
67edf731a240 updated for version 7.4.414
Bram Moolenaar <bram@vim.org>
parents: 6130
diff changeset
9337
9487
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9338 /*
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9339 * Execute autocommands for "event" and file name "fname".
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9340 * Return TRUE if some commands were executed.
69ed2c9d34a6 commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents: 9391
diff changeset
9341 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9342 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9343 apply_autocmds_group(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9344 event_T event,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9345 char_u *fname, /* NULL or empty means use actual file name */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9346 char_u *fname_io, /* fname to use for <afile> on cmdline, NULL means
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9347 use fname */
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9348 int force, /* when TRUE, ignore autocmd_busy */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9349 int group, /* group ID, or AUGROUP_ALL */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9350 buf_T *buf, /* buffer for <abuf> */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9351 exarg_T *eap) /* command arguments */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9352 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9353 char_u *sfname = NULL; /* short file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9354 char_u *tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9355 int save_changed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9356 buf_T *old_curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9357 int retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9358 char_u *save_sourcing_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9359 linenr_T save_sourcing_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9360 char_u *save_autocmd_fname;
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9361 int save_autocmd_fname_full;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9362 int save_autocmd_bufnr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9363 char_u *save_autocmd_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9364 int save_autocmd_busy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9365 int save_autocmd_nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9366 static int nesting = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9367 AutoPatCmd patcmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9368 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9369 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9370 scid_T save_current_SID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9371 void *save_funccalp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9372 char_u *save_cmdarg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9373 long save_cmdbang;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9374 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9375 static int filechangeshell_busy = FALSE;
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9376 #ifdef FEAT_PROFILE
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9377 proftime_T wait_time;
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9378 #endif
6608
a5ba0921efcb updated for version 7.4.630
Bram Moolenaar <bram@vim.org>
parents: 6470
diff changeset
9379 int did_save_redobuff = FALSE;
11325
77f3b7316d8b patch 8.0.0548: saving the redo buffer only works one time
Christian Brabandt <cb@256bit.org>
parents: 11199
diff changeset
9380 save_redo_T save_redo;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9381
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9382 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9383 * Quickly return if there are no autocommands for this event or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9384 * autocommands are blocked.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9385 */
11641
dbce7e03bf55 patch 8.0.0703: illegal memory access with empty :doau command
Christian Brabandt <cb@256bit.org>
parents: 11605
diff changeset
9386 if (event == NUM_EVENTS || first_autopat[(int)event] == NULL
dbce7e03bf55 patch 8.0.0703: illegal memory access with empty :doau command
Christian Brabandt <cb@256bit.org>
parents: 11605
diff changeset
9387 || autocmd_blocked > 0)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9388 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9389
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9390 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9391 * When autocommands are busy, new autocommands are only executed when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9392 * explicitly enabled with the "nested" flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9393 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9394 if (autocmd_busy && !(force || autocmd_nested))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9395 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9396
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9397 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9398 /*
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
9399 * Quickly return when immediately aborting on error, or when an interrupt
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9400 * occurred or an exception was thrown but not caught.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9401 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9402 if (aborting())
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9403 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9404 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9405
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9406 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9407 * FileChangedShell never nests, because it can create an endless loop.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9408 */
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
9409 if (filechangeshell_busy && (event == EVENT_FILECHANGEDSHELL
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
9410 || event == EVENT_FILECHANGEDSHELLPOST))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9411 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9412
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9413 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9414 * Ignore events in 'eventignore'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9415 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9416 if (event_ignored(event))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9417 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9418
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9419 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9420 * Allow nesting of autocommands, but restrict the depth, because it's
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9421 * possible to create an endless loop.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9422 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9423 if (nesting == 10)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9424 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9425 EMSG(_("E218: autocommand nesting too deep"));
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9426 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9427 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9428
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9429 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9430 * Check if these autocommands are disabled. Used when doing ":all" or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9431 * ":ball".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9432 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9433 if ( (autocmd_no_enter
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9434 && (event == EVENT_WINENTER || event == EVENT_BUFENTER))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9435 || (autocmd_no_leave
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9436 && (event == EVENT_WINLEAVE || event == EVENT_BUFLEAVE)))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9437 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9438
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9439 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9440 * Save the autocmd_* variables and info about the current buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9441 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9442 save_autocmd_fname = autocmd_fname;
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9443 save_autocmd_fname_full = autocmd_fname_full;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9444 save_autocmd_bufnr = autocmd_bufnr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9445 save_autocmd_match = autocmd_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9446 save_autocmd_busy = autocmd_busy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9447 save_autocmd_nested = autocmd_nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9448 save_changed = curbuf->b_changed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9449 old_curbuf = curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9450
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9451 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9452 * Set the file name to be used for <afile>.
1471
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
9453 * Make a copy to avoid that changing a buffer name or directory makes it
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
9454 * invalid.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9455 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9456 if (fname_io == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9457 {
6935
4db70c94226b patch 7.4.786
Bram Moolenaar <bram@vim.org>
parents: 6933
diff changeset
9458 if (event == EVENT_COLORSCHEME || event == EVENT_OPTIONSET)
5521
1cdf51706774 updated for version 7.4.109
Bram Moolenaar <bram@vim.org>
parents: 5483
diff changeset
9459 autocmd_fname = NULL;
11641
dbce7e03bf55 patch 8.0.0703: illegal memory access with empty :doau command
Christian Brabandt <cb@256bit.org>
parents: 11605
diff changeset
9460 else if (fname != NULL && !ends_excmd(*fname))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9461 autocmd_fname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9462 else if (buf != NULL)
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9463 autocmd_fname = buf->b_ffname;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9464 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9465 autocmd_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9466 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9467 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9468 autocmd_fname = fname_io;
1471
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
9469 if (autocmd_fname != NULL)
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9470 autocmd_fname = vim_strsave(autocmd_fname);
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9471 autocmd_fname_full = FALSE; /* call FullName_save() later */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9472
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9473 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9474 * Set the buffer number to be used for <abuf>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9475 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9476 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9477 autocmd_bufnr = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9478 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9479 autocmd_bufnr = buf->b_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9480
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9481 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9482 * When the file name is NULL or empty, use the file name of buffer "buf".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9483 * Always use the full path of the file name to match with, in case
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9484 * "allow_dirs" is set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9485 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9486 if (fname == NULL || *fname == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9487 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9488 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9489 fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9490 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9491 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9492 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9493 if (event == EVENT_SYNTAX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9494 fname = buf->b_p_syn;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9495 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9496 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9497 if (event == EVENT_FILETYPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9498 fname = buf->b_p_ft;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9499 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9500 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9501 if (buf->b_sfname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9502 sfname = vim_strsave(buf->b_sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9503 fname = buf->b_ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9504 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9505 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9506 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9507 fname = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9508 fname = vim_strsave(fname); /* make a copy, so we can change it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9509 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9510 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9511 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9512 sfname = vim_strsave(fname);
5521
1cdf51706774 updated for version 7.4.109
Bram Moolenaar <bram@vim.org>
parents: 5483
diff changeset
9513 /* Don't try expanding FileType, Syntax, FuncUndefined, WindowID,
1cdf51706774 updated for version 7.4.109
Bram Moolenaar <bram@vim.org>
parents: 5483
diff changeset
9514 * ColorScheme or QuickFixCmd* */
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9515 if (event == EVENT_FILETYPE
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9516 || event == EVENT_SYNTAX
1867
5ea1f7516c2c updated for version 7.2-165
vimboss
parents: 1863
diff changeset
9517 || event == EVENT_FUNCUNDEFINED
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9518 || event == EVENT_REMOTEREPLY
649
8157079cea85 updated for version 7.0191
vimboss
parents: 635
diff changeset
9519 || event == EVENT_SPELLFILEMISSING
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9520 || event == EVENT_QUICKFIXCMDPRE
5521
1cdf51706774 updated for version 7.4.109
Bram Moolenaar <bram@vim.org>
parents: 5483
diff changeset
9521 || event == EVENT_COLORSCHEME
6935
4db70c94226b patch 7.4.786
Bram Moolenaar <bram@vim.org>
parents: 6933
diff changeset
9522 || event == EVENT_OPTIONSET
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9523 || event == EVENT_QUICKFIXCMDPOST)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9524 fname = vim_strsave(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9525 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9526 fname = FullName_save(fname, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9527 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9528 if (fname == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9529 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9530 vim_free(sfname);
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9531 retval = FALSE;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9532 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9533 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9534
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9535 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9536 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9537 * Replace all backslashes with forward slashes. This makes the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9538 * autocommand patterns portable between Unix and MS-DOS.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9539 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9540 if (sfname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9541 forward_slash(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9542 forward_slash(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9543 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9544
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9545 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9546 /* remove version for correct match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9547 if (sfname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9548 vms_remove_version(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9549 vms_remove_version(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9550 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9551
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9552 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9553 * Set the name to be used for <amatch>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9554 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9555 autocmd_match = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9556
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9557
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9558 /* Don't redraw while doing auto commands. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9559 ++RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9560 save_sourcing_name = sourcing_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9561 sourcing_name = NULL; /* don't free this one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9562 save_sourcing_lnum = sourcing_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9563 sourcing_lnum = 0; /* no line number here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9564
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9565 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9566 save_current_SID = current_SID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9567
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9568 # ifdef FEAT_PROFILE
788
b5aed52a4881 updated for version 7.0230
vimboss
parents: 765
diff changeset
9569 if (do_profiling == PROF_YES)
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9570 prof_child_enter(&wait_time); /* doesn't count for the caller itself */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9571 # endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9572
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9573 /* Don't use local function variables, if called from a function */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9574 save_funccalp = save_funccal();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9575 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9576
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9577 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9578 * When starting to execute autocommands, save the search patterns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9579 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9580 if (!autocmd_busy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9581 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9582 save_search_patterns();
7285
a34232b17763 commit https://github.com/vim/vim/commit/20ad69ccfb60ef718bd26387ef0e5424461a643e
Christian Brabandt <cb@256bit.org>
parents: 7170
diff changeset
9583 #ifdef FEAT_INS_EXPAND
6608
a5ba0921efcb updated for version 7.4.630
Bram Moolenaar <bram@vim.org>
parents: 6470
diff changeset
9584 if (!ins_compl_active())
7285
a34232b17763 commit https://github.com/vim/vim/commit/20ad69ccfb60ef718bd26387ef0e5424461a643e
Christian Brabandt <cb@256bit.org>
parents: 7170
diff changeset
9585 #endif
6608
a5ba0921efcb updated for version 7.4.630
Bram Moolenaar <bram@vim.org>
parents: 6470
diff changeset
9586 {
11325
77f3b7316d8b patch 8.0.0548: saving the redo buffer only works one time
Christian Brabandt <cb@256bit.org>
parents: 11199
diff changeset
9587 saveRedobuff(&save_redo);
6608
a5ba0921efcb updated for version 7.4.630
Bram Moolenaar <bram@vim.org>
parents: 6470
diff changeset
9588 did_save_redobuff = TRUE;
a5ba0921efcb updated for version 7.4.630
Bram Moolenaar <bram@vim.org>
parents: 6470
diff changeset
9589 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9590 did_filetype = keep_filetype;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9591 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9592
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9593 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9594 * Note that we are applying autocmds. Some commands need to know.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9595 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9596 autocmd_busy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9597 filechangeshell_busy = (event == EVENT_FILECHANGEDSHELL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9598 ++nesting; /* see matching decrement below */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9599
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9600 /* Remember that FileType was triggered. Used for did_filetype(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9601 if (event == EVENT_FILETYPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9602 did_filetype = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9603
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9604 tail = gettail(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9605
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9606 /* Find first autocommand that matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9607 patcmd.curpat = first_autopat[(int)event];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9608 patcmd.nextcmd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9609 patcmd.group = group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9610 patcmd.fname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9611 patcmd.sfname = sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9612 patcmd.tail = tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9613 patcmd.event = event;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9614 patcmd.arg_bufnr = autocmd_bufnr;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9615 patcmd.next = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9616 auto_next_pat(&patcmd, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9617
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9618 /* found one, start executing the autocommands */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9619 if (patcmd.curpat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9620 {
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9621 /* add to active_apc_list */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9622 patcmd.next = active_apc_list;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9623 active_apc_list = &patcmd;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9624
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9625 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9626 /* set v:cmdarg (only when there is a matching pattern) */
9389
32e34e574716 commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents: 9387
diff changeset
9627 save_cmdbang = (long)get_vim_var_nr(VV_CMDBANG);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9628 if (eap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9629 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9630 save_cmdarg = set_cmdarg(eap, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9631 set_vim_var_nr(VV_CMDBANG, (long)eap->forceit);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9632 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9633 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9634 save_cmdarg = NULL; /* avoid gcc warning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9635 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9636 retval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9637 /* mark the last pattern, to avoid an endless loop when more patterns
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9638 * are added when executing autocommands */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9639 for (ap = patcmd.curpat; ap->next != NULL; ap = ap->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9640 ap->last = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9641 ap->last = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9642 check_lnums(TRUE); /* make sure cursor and topline are valid */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9643 do_cmdline(NULL, getnextac, (void *)&patcmd,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9644 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9645 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9646 if (eap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9647 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9648 (void)set_cmdarg(NULL, save_cmdarg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9649 set_vim_var_nr(VV_CMDBANG, save_cmdbang);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9650 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9651 #endif
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9652 /* delete from active_apc_list */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9653 if (active_apc_list == &patcmd) /* just in case */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9654 active_apc_list = patcmd.next;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9655 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9656
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9657 --RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9658 autocmd_busy = save_autocmd_busy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9659 filechangeshell_busy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9660 autocmd_nested = save_autocmd_nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9661 vim_free(sourcing_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9662 sourcing_name = save_sourcing_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9663 sourcing_lnum = save_sourcing_lnum;
1471
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
9664 vim_free(autocmd_fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9665 autocmd_fname = save_autocmd_fname;
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9666 autocmd_fname_full = save_autocmd_fname_full;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9667 autocmd_bufnr = save_autocmd_bufnr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9668 autocmd_match = save_autocmd_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9669 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9670 current_SID = save_current_SID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9671 restore_funccal(save_funccalp);
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9672 # ifdef FEAT_PROFILE
788
b5aed52a4881 updated for version 7.0230
vimboss
parents: 765
diff changeset
9673 if (do_profiling == PROF_YES)
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9674 prof_child_exit(&wait_time);
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9675 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9676 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9677 vim_free(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9678 vim_free(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9679 --nesting; /* see matching increment above */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9680
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9681 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9682 * When stopping to execute autocommands, restore the search patterns and
5958
f7bc601823e5 updated for version 7.4.320
Bram Moolenaar <bram@vim.org>
parents: 5863
diff changeset
9683 * the redo buffer. Free any buffers in the au_pending_free_buf list and
f7bc601823e5 updated for version 7.4.320
Bram Moolenaar <bram@vim.org>
parents: 5863
diff changeset
9684 * free any windows in the au_pending_free_win list.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9685 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9686 if (!autocmd_busy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9687 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9688 restore_search_patterns();
6608
a5ba0921efcb updated for version 7.4.630
Bram Moolenaar <bram@vim.org>
parents: 6470
diff changeset
9689 if (did_save_redobuff)
11325
77f3b7316d8b patch 8.0.0548: saving the redo buffer only works one time
Christian Brabandt <cb@256bit.org>
parents: 11199
diff changeset
9690 restoreRedobuff(&save_redo);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9691 did_filetype = FALSE;
5816
29eb4c2a33ac updated for version 7.4.251
Bram Moolenaar <bram@vim.org>
parents: 5788
diff changeset
9692 while (au_pending_free_buf != NULL)
29eb4c2a33ac updated for version 7.4.251
Bram Moolenaar <bram@vim.org>
parents: 5788
diff changeset
9693 {
29eb4c2a33ac updated for version 7.4.251
Bram Moolenaar <bram@vim.org>
parents: 5788
diff changeset
9694 buf_T *b = au_pending_free_buf->b_next;
29eb4c2a33ac updated for version 7.4.251
Bram Moolenaar <bram@vim.org>
parents: 5788
diff changeset
9695 vim_free(au_pending_free_buf);
29eb4c2a33ac updated for version 7.4.251
Bram Moolenaar <bram@vim.org>
parents: 5788
diff changeset
9696 au_pending_free_buf = b;
29eb4c2a33ac updated for version 7.4.251
Bram Moolenaar <bram@vim.org>
parents: 5788
diff changeset
9697 }
5958
f7bc601823e5 updated for version 7.4.320
Bram Moolenaar <bram@vim.org>
parents: 5863
diff changeset
9698 while (au_pending_free_win != NULL)
f7bc601823e5 updated for version 7.4.320
Bram Moolenaar <bram@vim.org>
parents: 5863
diff changeset
9699 {
f7bc601823e5 updated for version 7.4.320
Bram Moolenaar <bram@vim.org>
parents: 5863
diff changeset
9700 win_T *w = au_pending_free_win->w_next;
f7bc601823e5 updated for version 7.4.320
Bram Moolenaar <bram@vim.org>
parents: 5863
diff changeset
9701 vim_free(au_pending_free_win);
f7bc601823e5 updated for version 7.4.320
Bram Moolenaar <bram@vim.org>
parents: 5863
diff changeset
9702 au_pending_free_win = w;
f7bc601823e5 updated for version 7.4.320
Bram Moolenaar <bram@vim.org>
parents: 5863
diff changeset
9703 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9704 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9705
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9706 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9707 * Some events don't set or reset the Changed flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9708 * Check if still in the same buffer!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9709 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9710 if (curbuf == old_curbuf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9711 && (event == EVENT_BUFREADPOST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9712 || event == EVENT_BUFWRITEPOST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9713 || event == EVENT_FILEAPPENDPOST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9714 || event == EVENT_VIMLEAVE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9715 || event == EVENT_VIMLEAVEPRE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9716 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9717 #ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9718 if (curbuf->b_changed != save_changed)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9719 need_maketitle = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9720 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9721 curbuf->b_changed = save_changed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9722 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9723
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9724 au_cleanup(); /* may really delete removed patterns/commands now */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9725
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9726 BYPASS_AU:
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9727 /* When wiping out a buffer make sure all its buffer-local autocommands
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9728 * are deleted. */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9729 if (event == EVENT_BUFWIPEOUT && buf != NULL)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9730 aubuflocal_remove(buf);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9731
8937
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
9732 if (retval == OK && event == EVENT_FILETYPE)
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
9733 au_did_filetype = TRUE;
da4f6e238374 commit https://github.com/vim/vim/commit/c3691332f72169c486066200c0f3935418364900
Christian Brabandt <cb@256bit.org>
parents: 8212
diff changeset
9734
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9735 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9736 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9737
1410
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9738 # ifdef FEAT_EVAL
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9739 static char_u *old_termresponse = NULL;
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9740 # endif
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9741
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9742 /*
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9743 * Block triggering autocommands until unblock_autocmd() is called.
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9744 * Can be used recursively, so long as it's symmetric.
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9745 */
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9746 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9747 block_autocmds(void)
1410
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9748 {
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9749 # ifdef FEAT_EVAL
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9750 /* Remember the value of v:termresponse. */
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9751 if (autocmd_blocked == 0)
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9752 old_termresponse = get_vim_var_str(VV_TERMRESPONSE);
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9753 # endif
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9754 ++autocmd_blocked;
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9755 }
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9756
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9757 void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9758 unblock_autocmds(void)
1410
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9759 {
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9760 --autocmd_blocked;
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9761
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9762 # ifdef FEAT_EVAL
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9763 /* When v:termresponse was set while autocommands were blocked, trigger
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9764 * the autocommands now. Esp. useful when executing a shell command
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9765 * during startup (vimdiff). */
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9766 if (autocmd_blocked == 0
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9767 && get_vim_var_str(VV_TERMRESPONSE) != old_termresponse)
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9768 apply_autocmds(EVENT_TERMRESPONSE, NULL, NULL, FALSE, curbuf);
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9769 # endif
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9770 }
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9771
5008
3717d569027d updated for version 7.3.1248
Bram Moolenaar <bram@vim.org>
parents: 4872
diff changeset
9772 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9773 is_autocmd_blocked(void)
5008
3717d569027d updated for version 7.3.1248
Bram Moolenaar <bram@vim.org>
parents: 4872
diff changeset
9774 {
3717d569027d updated for version 7.3.1248
Bram Moolenaar <bram@vim.org>
parents: 4872
diff changeset
9775 return autocmd_blocked != 0;
3717d569027d updated for version 7.3.1248
Bram Moolenaar <bram@vim.org>
parents: 4872
diff changeset
9776 }
3717d569027d updated for version 7.3.1248
Bram Moolenaar <bram@vim.org>
parents: 4872
diff changeset
9777
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9778 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9779 * Find next autocommand pattern that matches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9780 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9781 static void
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9782 auto_next_pat(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9783 AutoPatCmd *apc,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9784 int stop_at_last) /* stop when 'last' flag is set */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9785 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9786 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9787 AutoCmd *cp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9788 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9789 char *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9790
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9791 vim_free(sourcing_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9792 sourcing_name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9793
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9794 for (ap = apc->curpat; ap != NULL && !got_int; ap = ap->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9795 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9796 apc->curpat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9797
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9798 /* Only use a pattern when it has not been removed, has commands and
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9799 * the group matches. For buffer-local autocommands only check the
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9800 * buffer number. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9801 if (ap->pat != NULL && ap->cmds != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9802 && (apc->group == AUGROUP_ALL || apc->group == ap->group))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9803 {
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9804 /* execution-condition */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9805 if (ap->buflocal_nr == 0
6375
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6353
diff changeset
9806 ? (match_file_pat(NULL, &ap->reg_prog, apc->fname,
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9807 apc->sfname, apc->tail, ap->allow_dirs))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9808 : ap->buflocal_nr == apc->arg_bufnr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9809 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9810 name = event_nr2name(apc->event);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9811 s = _("%s Auto commands for \"%s\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9812 sourcing_name = alloc((unsigned)(STRLEN(s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9813 + STRLEN(name) + ap->patlen + 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9814 if (sourcing_name != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9815 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9816 sprintf((char *)sourcing_name, s,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9817 (char *)name, (char *)ap->pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9818 if (p_verbose >= 8)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9819 {
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9820 verbose_enter();
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
9821 smsg((char_u *)_("Executing %s"), sourcing_name);
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9822 verbose_leave();
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9823 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9824 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9825
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9826 apc->curpat = ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9827 apc->nextcmd = ap->cmds;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9828 /* mark last command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9829 for (cp = ap->cmds; cp->next != NULL; cp = cp->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9830 cp->last = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9831 cp->last = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9832 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9833 line_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9834 if (apc->curpat != NULL) /* found a match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9835 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9836 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9837 if (stop_at_last && ap->last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9838 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9839 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9840 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9841
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9842 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9843 * Get next autocommand command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9844 * Called by do_cmdline() to get the next line for ":if".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9845 * Returns allocated string, or NULL for end of autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9846 */
3997
c83cd3d01128 updated for version 7.3.753
Bram Moolenaar <bram@vim.org>
parents: 3776
diff changeset
9847 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9848 getnextac(int c UNUSED, void *cookie, int indent UNUSED)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9849 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9850 AutoPatCmd *acp = (AutoPatCmd *)cookie;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9851 char_u *retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9852 AutoCmd *ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9853
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9854 /* Can be called again after returning the last line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9855 if (acp->curpat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9856 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9857
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9858 /* repeat until we find an autocommand to execute */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9859 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9860 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9861 /* skip removed commands */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9862 while (acp->nextcmd != NULL && acp->nextcmd->cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9863 if (acp->nextcmd->last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9864 acp->nextcmd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9865 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9866 acp->nextcmd = acp->nextcmd->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9867
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9868 if (acp->nextcmd != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9869 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9870
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9871 /* at end of commands, find next pattern that matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9872 if (acp->curpat->last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9873 acp->curpat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9874 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9875 acp->curpat = acp->curpat->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9876 if (acp->curpat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9877 auto_next_pat(acp, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9878 if (acp->curpat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9879 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9880 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9881
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9882 ac = acp->nextcmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9883
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9884 if (p_verbose >= 9)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9885 {
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9886 verbose_enter_scroll();
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
9887 smsg((char_u *)_("autocommand %s"), ac->cmd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9888 msg_puts((char_u *)"\n"); /* don't overwrite this either */
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9889 verbose_leave_scroll();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9890 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9891 retval = vim_strsave(ac->cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9892 autocmd_nested = ac->nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9893 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9894 current_SID = ac->scriptID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9895 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9896 if (ac->last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9897 acp->nextcmd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9898 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9899 acp->nextcmd = ac->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9900 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9901 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9902
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9903 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9904 * Return TRUE if there is a matching autocommand for "fname".
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9905 * To account for buffer-local autocommands, function needs to know
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9906 * in which buffer the file will be opened.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9907 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9908 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9909 has_autocmd(event_T event, char_u *sfname, buf_T *buf)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9910 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9911 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9912 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9913 char_u *tail = gettail(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9914 int retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9915
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9916 fname = FullName_save(sfname, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9917 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9918 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9919
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9920 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9921 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9922 * Replace all backslashes with forward slashes. This makes the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9923 * autocommand patterns portable between Unix and MS-DOS.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9924 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9925 sfname = vim_strsave(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9926 if (sfname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9927 forward_slash(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9928 forward_slash(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9929 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9930
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9931 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9932 if (ap->pat != NULL && ap->cmds != NULL
856
8cd729851562 updated for version 7.0g
vimboss
parents: 844
diff changeset
9933 && (ap->buflocal_nr == 0
6375
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6353
diff changeset
9934 ? match_file_pat(NULL, &ap->reg_prog,
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9935 fname, sfname, tail, ap->allow_dirs)
856
8cd729851562 updated for version 7.0g
vimboss
parents: 844
diff changeset
9936 : buf != NULL && ap->buflocal_nr == buf->b_fnum
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9937 ))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9938 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9939 retval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9940 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9941 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9942
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9943 vim_free(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9944 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9945 vim_free(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9946 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9947
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9948 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9949 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9950
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9951 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9952 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9953 * Function given to ExpandGeneric() to obtain the list of autocommand group
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9954 * names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9955 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9956 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9957 get_augroup_name(expand_T *xp UNUSED, int idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9958 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9959 if (idx == augroups.ga_len) /* add "END" add the end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9960 return (char_u *)"END";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9961 if (idx >= augroups.ga_len) /* end of list */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9962 return NULL;
10084
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
9963 if (AUGROUP_NAME(idx) == NULL || AUGROUP_NAME(idx) == get_deleted_augroup())
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
9964 /* skip deleted entries */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9965 return (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9966 return AUGROUP_NAME(idx); /* return a name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9967 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9968
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9969 static int include_groups = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9970
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9971 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9972 set_context_in_autocmd(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9973 expand_T *xp,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9974 char_u *arg,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
9975 int doautocmd) /* TRUE for :doauto*, FALSE for :autocmd */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9976 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9977 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9978 int group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9979
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9980 /* check for a group name, skip it if present */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9981 include_groups = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9982 p = arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9983 group = au_get_grouparg(&arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9984 if (group == AUGROUP_ERROR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9985 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9986 /* If there only is a group name that's what we expand. */
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
9987 if (*arg == NUL && group != AUGROUP_ALL && !VIM_ISWHITE(arg[-1]))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9988 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9989 arg = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9990 group = AUGROUP_ALL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9991 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9992
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9993 /* skip over event name */
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
9994 for (p = arg; *p != NUL && !VIM_ISWHITE(*p); ++p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9995 if (*p == ',')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9996 arg = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9997 if (*p == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9998 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9999 if (group == AUGROUP_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10000 include_groups = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10001 xp->xp_context = EXPAND_EVENTS; /* expand event name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10002 xp->xp_pattern = arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10003 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10004 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10005
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10006 /* skip over pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10007 arg = skipwhite(p);
11129
f4ea50924c6d patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents: 11127
diff changeset
10008 while (*arg && (!VIM_ISWHITE(*arg) || arg[-1] == '\\'))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10009 arg++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10010 if (*arg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10011 return arg; /* expand (next) command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10012
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10013 if (doautocmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10014 xp->xp_context = EXPAND_FILES; /* expand file names */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10015 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10016 xp->xp_context = EXPAND_NOTHING; /* pattern is not expanded */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10017 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10018 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10019
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10020 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10021 * Function given to ExpandGeneric() to obtain the list of event names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10022 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10023 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10024 get_event_name(expand_T *xp UNUSED, int idx)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10025 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10026 if (idx < augroups.ga_len) /* First list group names, if wanted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10027 {
9682
a98607bb756c commit https://github.com/vim/vim/commit/f2c4c391192cab6e923b1a418d4af09106fba25f
Christian Brabandt <cb@256bit.org>
parents: 9653
diff changeset
10028 if (!include_groups || AUGROUP_NAME(idx) == NULL
10084
3e410e6e1986 commit https://github.com/vim/vim/commit/b62cc36a600e2e1e5a1d1d484fef89898c847c4c
Christian Brabandt <cb@256bit.org>
parents: 10058
diff changeset
10029 || AUGROUP_NAME(idx) == get_deleted_augroup())
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10030 return (char_u *)""; /* skip deleted entries */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10031 return AUGROUP_NAME(idx); /* return a name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10032 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10033 return (char_u *)event_names[idx - augroups.ga_len].name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10034 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10035
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10036 #endif /* FEAT_CMDL_COMPL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10037
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10038 /*
615
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10039 * Return TRUE if autocmd is supported.
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10040 */
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10041 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10042 autocmd_supported(char_u *name)
615
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10043 {
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10044 char_u *p;
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10045
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10046 return (event_name2nr(name, &p) != NUM_EVENTS);
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10047 }
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10048
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10049 /*
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10050 * Return TRUE if an autocommand is defined for a group, event and
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10051 * pattern: The group can be omitted to accept any group. "event" and "pattern"
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10052 * can be NULL to accept any event and pattern. "pattern" can be NULL to accept
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10053 * any pattern. Buffer-local patterns <buffer> or <buffer=N> are accepted.
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10054 * Used for:
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10055 * exists("#Group") or
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10056 * exists("#Group#Event") or
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10057 * exists("#Group#Event#pat") or
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10058 * exists("#Event") or
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10059 * exists("#Event#pat")
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10060 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10061 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10062 au_exists(char_u *arg)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10063 {
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10064 char_u *arg_save;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10065 char_u *pattern = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10066 char_u *event_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10067 char_u *p;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
10068 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10069 AutoPat *ap;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
10070 buf_T *buflocal_buf = NULL;
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10071 int group;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10072 int retval = FALSE;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10073
615
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10074 /* Make a copy so that we can change the '#' chars to a NUL. */
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10075 arg_save = vim_strsave(arg);
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10076 if (arg_save == NULL)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10077 return FALSE;
615
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
10078 p = vim_strchr(arg_save, '#');
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10079 if (p != NULL)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10080 *p++ = NUL;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10081
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10082 /* First, look for an autocmd group name */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10083 group = au_find_group(arg_save);
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10084 if (group == AUGROUP_ERROR)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10085 {
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10086 /* Didn't match a group name, assume the first argument is an event. */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10087 group = AUGROUP_ALL;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10088 event_name = arg_save;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10089 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10090 else
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10091 {
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10092 if (p == NULL)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10093 {
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10094 /* "Group": group name is present and it's recognized */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10095 retval = TRUE;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10096 goto theend;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10097 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10098
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10099 /* Must be "Group#Event" or "Group#Event#pat". */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10100 event_name = p;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10101 p = vim_strchr(event_name, '#');
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10102 if (p != NULL)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10103 *p++ = NUL; /* "Group#Event#pat" */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10104 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10105
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10106 pattern = p; /* "pattern" is NULL when there is no pattern */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10107
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10108 /* find the index (enum) for the event name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10109 event = event_name2nr(event_name, &p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10110
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10111 /* return FALSE if the event name is not recognized */
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10112 if (event == NUM_EVENTS)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10113 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10114
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10115 /* Find the first autocommand for this event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10116 * If there isn't any, return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10117 * If there is one and no pattern given, return TRUE; */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10118 ap = first_autopat[(int)event];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10119 if (ap == NULL)
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10120 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10121
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
10122 /* if pattern is "<buffer>", special handling is needed which uses curbuf */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
10123 /* for pattern "<buffer=N>, fnamecmp() will work fine */
1962
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
10124 if (pattern != NULL && STRICMP(pattern, "<buffer>") == 0)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
10125 buflocal_buf = curbuf;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
10126
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10127 /* Check if there is an autocommand with the given pattern. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10128 for ( ; ap != NULL; ap = ap->next)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
10129 /* only use a pattern when it has not been removed and has commands. */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
10130 /* For buffer-local autocommands, fnamecmp() works fine. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10131 if (ap->pat != NULL && ap->cmds != NULL
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10132 && (group == AUGROUP_ALL || ap->group == group)
1962
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
10133 && (pattern == NULL
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
10134 || (buflocal_buf == NULL
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
10135 ? fnamecmp(ap->pat, pattern) == 0
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
10136 : ap->buflocal_nr == buflocal_buf->b_fnum)))
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10137 {
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10138 retval = TRUE;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10139 break;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10140 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10141
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10142 theend:
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10143 vim_free(arg_save);
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
10144 return retval;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10145 }
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
10146
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10147 #else /* FEAT_AUTOCMD */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10148
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10149 /*
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10150 * Prepare for executing commands for (hidden) buffer "buf".
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10151 * This is the non-autocommand version, it simply saves "curbuf" and sets
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10152 * "curbuf" and "curwin" to match "buf".
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10153 */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10154 void
7856
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7819
diff changeset
10155 aucmd_prepbuf(
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7819
diff changeset
10156 aco_save_T *aco, /* structure to save values in */
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7819
diff changeset
10157 buf_T *buf) /* new curbuf */
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10158 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
10159 aco->save_curbuf = curbuf;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
10160 --curbuf->b_nwindows;
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10161 curbuf = buf;
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10162 curwin->w_buffer = buf;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
10163 ++curbuf->b_nwindows;
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10164 }
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10165
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10166 /*
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10167 * Restore after executing commands for a (hidden) buffer.
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10168 * This is the non-autocommand version.
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10169 */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10170 void
7856
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7819
diff changeset
10171 aucmd_restbuf(
226ed297307f commit https://github.com/vim/vim/commit/d14e00ea67afbaa8cb4a7e6b1eb306da6a2d5adb
Christian Brabandt <cb@256bit.org>
parents: 7819
diff changeset
10172 aco_save_T *aco) /* structure holding saved values */
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10173 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
10174 --curbuf->b_nwindows;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
10175 curbuf = aco->save_curbuf;
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10176 curwin->w_buffer = curbuf;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
10177 ++curbuf->b_nwindows;
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10178 }
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10179
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10180 #endif /* FEAT_AUTOCMD */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10181
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
10182
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10183 #if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10184 /*
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
10185 * Try matching a filename with a "pattern" ("prog" is NULL), or use the
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
10186 * precompiled regprog "prog" ("pattern" is NULL). That avoids calling
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
10187 * vim_regcomp() often.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10188 * Used for autocommands and 'wildignore'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10189 * Returns TRUE if there is a match, FALSE otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10190 */
6375
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6353
diff changeset
10191 static int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10192 match_file_pat(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10193 char_u *pattern, /* pattern to match with */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10194 regprog_T **prog, /* pre-compiled regprog or NULL */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10195 char_u *fname, /* full path of file name */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10196 char_u *sfname, /* short file name or NULL */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10197 char_u *tail, /* tail of path */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10198 int allow_dirs) /* allow matching with dir */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10199 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10200 regmatch_T regmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10201 int result = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10202
4242
edd0bc1f26bd updated for version 7.3.872
Bram Moolenaar <bram@vim.org>
parents: 4232
diff changeset
10203 regmatch.rm_ic = p_fic; /* ignore case if 'fileignorecase' is set */
6470
9657929ee562 updated for version 7.4.564
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
10204 if (prog != NULL)
9657929ee562 updated for version 7.4.564
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
10205 regmatch.regprog = *prog;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10206 else
6470
9657929ee562 updated for version 7.4.564
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
10207 regmatch.regprog = vim_regcomp(pattern, RE_MAGIC);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10208
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10209 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10210 * Try for a match with the pattern with:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10211 * 1. the full file name, when the pattern has a '/'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10212 * 2. the short file name, when the pattern has a '/'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10213 * 3. the tail of the file name, when the pattern has no '/'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10214 */
6470
9657929ee562 updated for version 7.4.564
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
10215 if (regmatch.regprog != NULL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10216 && ((allow_dirs
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10217 && (vim_regexec(&regmatch, fname, (colnr_T)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10218 || (sfname != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10219 && vim_regexec(&regmatch, sfname, (colnr_T)0))))
6470
9657929ee562 updated for version 7.4.564
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
10220 || (!allow_dirs && vim_regexec(&regmatch, tail, (colnr_T)0))))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10221 result = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10222
6375
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6353
diff changeset
10223 if (prog != NULL)
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6353
diff changeset
10224 *prog = regmatch.regprog;
27a36d1013a6 updated for version 7.4.519
Bram Moolenaar <bram@vim.org>
parents: 6353
diff changeset
10225 else
4805
66803af09906 updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents: 4354
diff changeset
10226 vim_regfree(regmatch.regprog);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10227 return result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10228 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10229 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10230
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10231 #if defined(FEAT_WILDIGN) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10232 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10233 * Return TRUE if a file matches with a pattern in "list".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10234 * "list" is a comma-separated list of patterns, like 'wildignore'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10235 * "sfname" is the short file name or NULL, "ffname" the long file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10236 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10237 int
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10238 match_file_list(char_u *list, char_u *sfname, char_u *ffname)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10239 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10240 char_u buf[100];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10241 char_u *tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10242 char_u *regpat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10243 char allow_dirs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10244 int match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10245 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10246
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10247 tail = gettail(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10248
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10249 /* try all patterns in 'wildignore' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10250 p = list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10251 while (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10252 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10253 copy_option_part(&p, buf, 100, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10254 regpat = file_pat_to_reg_pat(buf, NULL, &allow_dirs, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10255 if (regpat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10256 break;
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
10257 match = match_file_pat(regpat, NULL, ffname, sfname,
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
10258 tail, (int)allow_dirs);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10259 vim_free(regpat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10260 if (match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10261 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10262 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10263 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10264 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10265 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10266
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10267 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10268 * Convert the given pattern "pat" which has shell style wildcards in it, into
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10269 * a regular expression, and return the result in allocated memory. If there
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10270 * is a directory path separator to be matched, then TRUE is put in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10271 * allow_dirs, otherwise FALSE is put there -- webb.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10272 * Handle backslashes before special characters, like "\*" and "\ ".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10273 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10274 * Returns NULL when out of memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10275 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10276 char_u *
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10277 file_pat_to_reg_pat(
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10278 char_u *pat,
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10279 char_u *pat_end, /* first char after pattern or NULL */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10280 char *allow_dirs, /* Result passed back out in here */
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10281 int no_bslash UNUSED) /* Don't use a backward slash as pathsep */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10282 {
6470
9657929ee562 updated for version 7.4.564
Bram Moolenaar <bram@vim.org>
parents: 6375
diff changeset
10283 int size = 2; /* '^' at start, '$' at end */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10284 char_u *endp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10285 char_u *reg_pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10286 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10287 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10288 int nested = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10289 int add_dollar = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10290
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10291 if (allow_dirs != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10292 *allow_dirs = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10293 if (pat_end == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10294 pat_end = pat + STRLEN(pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10295
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10296 for (p = pat; p < pat_end; p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10297 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10298 switch (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10299 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10300 case '*':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10301 case '.':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10302 case ',':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10303 case '{':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10304 case '}':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10305 case '~':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10306 size += 2; /* extra backslash */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10307 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10308 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10309 case '\\':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10310 case '/':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10311 size += 4; /* could become "[\/]" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10312 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10313 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10314 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10315 size++;
6999
dc1b678f0e4e patch 7.4.817
Bram Moolenaar <bram@vim.org>
parents: 6963
diff changeset
10316 # ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
10317 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10319 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10320 ++size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10321 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10322 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10323 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10324 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10325 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10326 reg_pat = alloc(size + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10327 if (reg_pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10328 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10329
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10330 i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10331
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10332 if (pat[0] == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10333 while (pat[0] == '*' && pat < pat_end - 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10334 pat++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10335 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10336 reg_pat[i++] = '^';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10337 endp = pat_end - 1;
7005
bb44542231dc patch 7.4.820
Bram Moolenaar <bram@vim.org>
parents: 6999
diff changeset
10338 if (endp >= pat && *endp == '*')
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10339 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10340 while (endp - pat > 0 && *endp == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10341 endp--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10342 add_dollar = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10343 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10344 for (p = pat; *p && nested >= 0 && p <= endp; p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10345 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10346 switch (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10347 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10348 case '*':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10349 reg_pat[i++] = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10350 reg_pat[i++] = '*';
444
d0d15b184c56 updated for version 7.0116
vimboss
parents: 434
diff changeset
10351 while (p[1] == '*') /* "**" matches like "*" */
d0d15b184c56 updated for version 7.0116
vimboss
parents: 434
diff changeset
10352 ++p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10353 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10354 case '.':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10355 case '~':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10356 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10357 reg_pat[i++] = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10358 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10359 case '?':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10360 reg_pat[i++] = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10361 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10362 case '\\':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10363 if (p[1] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10364 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10365 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10366 if (!no_bslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10367 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10368 /* translate:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10369 * "\x" to "\\x" e.g., "dir\file"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10370 * "\*" to "\\.*" e.g., "dir\*.c"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10371 * "\?" to "\\." e.g., "dir\??.c"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10372 * "\+" to "\+" e.g., "fileX\+.c"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10373 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10374 if ((vim_isfilec(p[1]) || p[1] == '*' || p[1] == '?')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10375 && p[1] != '+')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10376 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10377 reg_pat[i++] = '[';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10378 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10379 reg_pat[i++] = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10380 reg_pat[i++] = ']';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10381 if (allow_dirs != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10382 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10383 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10384 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10385 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10386 #endif
2243
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10387 /* Undo escaping from ExpandEscape():
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10388 * foo\?bar -> foo?bar
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10389 * foo\%bar -> foo%bar
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10390 * foo\,bar -> foo,bar
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10391 * foo\ bar -> foo bar
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10392 * Don't unescape \, * and others that are also special in a
5104
93cccad6a26b updated for version 7.3.1295
Bram Moolenaar <bram@vim.org>
parents: 5008
diff changeset
10393 * regexp.
93cccad6a26b updated for version 7.3.1295
Bram Moolenaar <bram@vim.org>
parents: 5008
diff changeset
10394 * An escaped { must be unescaped since we use magic not
5259
6b7ab6a4f31a updated for version 7.4b.006
Bram Moolenaar <bram@vim.org>
parents: 5231
diff changeset
10395 * verymagic. Use "\\\{n,m\}"" to get "\{n,m}".
5104
93cccad6a26b updated for version 7.3.1295
Bram Moolenaar <bram@vim.org>
parents: 5008
diff changeset
10396 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10397 if (*++p == '?'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10398 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10399 && no_bslash
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10400 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10401 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10402 reg_pat[i++] = '?';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10403 else
5104
93cccad6a26b updated for version 7.3.1295
Bram Moolenaar <bram@vim.org>
parents: 5008
diff changeset
10404 if (*p == ',' || *p == '%' || *p == '#'
6999
dc1b678f0e4e patch 7.4.817
Bram Moolenaar <bram@vim.org>
parents: 6963
diff changeset
10405 || vim_isspace(*p) || *p == '{' || *p == '}')
2243
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10406 reg_pat[i++] = *p;
5259
6b7ab6a4f31a updated for version 7.4b.006
Bram Moolenaar <bram@vim.org>
parents: 5231
diff changeset
10407 else if (*p == '\\' && p[1] == '\\' && p[2] == '{')
6b7ab6a4f31a updated for version 7.4b.006
Bram Moolenaar <bram@vim.org>
parents: 5231
diff changeset
10408 {
6b7ab6a4f31a updated for version 7.4b.006
Bram Moolenaar <bram@vim.org>
parents: 5231
diff changeset
10409 reg_pat[i++] = '\\';
6b7ab6a4f31a updated for version 7.4b.006
Bram Moolenaar <bram@vim.org>
parents: 5231
diff changeset
10410 reg_pat[i++] = '{';
6b7ab6a4f31a updated for version 7.4b.006
Bram Moolenaar <bram@vim.org>
parents: 5231
diff changeset
10411 p += 2;
6b7ab6a4f31a updated for version 7.4b.006
Bram Moolenaar <bram@vim.org>
parents: 5231
diff changeset
10412 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10413 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10414 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10415 if (allow_dirs != NULL && vim_ispathsep(*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10416 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10417 && (!no_bslash || *p != '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10418 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10419 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10420 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10421 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10422 reg_pat[i++] = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10423 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10424 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10425 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10426 case '/':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10427 reg_pat[i++] = '[';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10428 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10429 reg_pat[i++] = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10430 reg_pat[i++] = ']';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10431 if (allow_dirs != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10432 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10433 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10434 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10435 case '{':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10436 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10437 reg_pat[i++] = '(';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10438 nested++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10439 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10440 case '}':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10441 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10442 reg_pat[i++] = ')';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10443 --nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10444 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10445 case ',':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10446 if (nested)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10447 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10448 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10449 reg_pat[i++] = '|';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10450 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10451 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10452 reg_pat[i++] = ',';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10453 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10454 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10455 # ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
10456 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10457 reg_pat[i++] = *p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10458 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10459 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10460 if (allow_dirs != NULL && vim_ispathsep(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10461 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10462 reg_pat[i++] = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10463 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10464 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10465 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10466 if (add_dollar)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10467 reg_pat[i++] = '$';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10468 reg_pat[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10469 if (nested != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10470 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10471 if (nested < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10472 EMSG(_("E219: Missing {."));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10473 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10474 EMSG(_("E220: Missing }."));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10475 vim_free(reg_pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10476 reg_pat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10477 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10478 return reg_pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10479 }
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10480
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10481 #if defined(EINTR) || defined(PROTO)
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10482 /*
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10483 * Version of read() that retries when interrupted by EINTR (possibly
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10484 * by a SIGWINCH).
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10485 */
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10486 long
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10487 read_eintr(int fd, void *buf, size_t bufsize)
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10488 {
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10489 long ret;
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10490
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10491 for (;;)
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10492 {
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10493 ret = vim_read(fd, buf, bufsize);
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10494 if (ret >= 0 || errno != EINTR)
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10495 break;
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10496 }
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10497 return ret;
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10498 }
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10499
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10500 /*
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10501 * Version of write() that retries when interrupted by EINTR (possibly
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10502 * by a SIGWINCH).
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10503 */
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10504 long
7819
f86adafb28d4 commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents: 7801
diff changeset
10505 write_eintr(int fd, void *buf, size_t bufsize)
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10506 {
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10507 long ret = 0;
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10508 long wlen;
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10509
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10510 /* Repeat the write() so long it didn't fail, other than being interrupted
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10511 * by a signal. */
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10512 while (ret < (long)bufsize)
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10513 {
2666
1a0d346695fa updated for version 7.3.085
Bram Moolenaar <bram@vim.org>
parents: 2664
diff changeset
10514 wlen = vim_write(fd, (char *)buf + ret, bufsize - ret);
2664
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10515 if (wlen < 0)
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10516 {
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10517 if (errno != EINTR)
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10518 break;
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10519 }
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10520 else
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10521 ret += wlen;
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10522 }
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10523 return ret;
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10524 }
033e7b49356c updated for version 7.3.083
Bram Moolenaar <bram@vim.org>
parents: 2563
diff changeset
10525 #endif