annotate src/fileio.c @ 2378:85b7dc8da5eb vim73

Add the 'concealcursor' option to decide when the cursor line is to be concealed or not. Rename 'conc' to 'cole' as the short name for 'conceallevel'.
author Bram Moolenaar <bram@vim.org>
date Fri, 23 Jul 2010 22:10:27 +0200
parents d8e4b27cef80
children a3aca345aafa
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
11 * 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 #if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 696
diff changeset
15 # include "vimio.h" /* for lseek(), must be before vim.h */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
16 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
17
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
18 #if defined __EMX__
714
0f9f4761ad9c updated for version 7.0216
vimboss
parents: 696
diff changeset
19 # include "vimio.h" /* for mktemp(), CJW 1997-12-03 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
20 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
21
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
22 #include "vim.h"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
23
2014
79b395ba0ea5 updated for version 7.2-311
vimboss
parents: 2006
diff changeset
24 #if defined(__TANDEM) || defined(__MINT__)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
25 # include <limits.h> /* for SSIZE_MAX */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
26 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
27
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
28 #if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
29 # include <utime.h> /* for struct utimbuf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
30 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
31
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
32 #define BUFSIZE 8192 /* size of normal write buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
33 #define SMBUFSIZE 256 /* size of emergency write buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
34
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
35 #ifdef FEAT_CRYPT
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
36 /* crypt_magic[0] is pkzip crypt, crypt_magic[1] is sha2+blowfish */
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
37 static char *crypt_magic[] = {"VimCrypt~01!", "VimCrypt~02!"};
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
38 static char crypt_magic_head[] = "VimCrypt~";
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
39 # define CRYPT_MAGIC_LEN 12 /* must be multiple of 4! */
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
40
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
41 /* For blowfish, after the magic header, we store 8 bytes of salt and then 8
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
42 * bytes of seed (initialisation vector). */
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
43 static int crypt_salt_len[] = {0, 8};
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
44 static int crypt_seed_len[] = {0, 8};
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
45 #define CRYPT_SALT_LEN_MAX 8
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
46 #define CRYPT_SEED_LEN_MAX 8
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
47 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
48
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
49 /* Is there any system that doesn't have access()? */
574
25a70b1cd2da updated for version 7.0163
vimboss
parents: 570
diff changeset
50 #define USE_MCH_ACCESS
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
51
1313
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
52 #if defined(sun) && defined(S_ISCHR)
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
53 # define OPEN_CHR_FILES
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
54 static int is_dev_fd_file(char_u *fname);
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
55 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
56 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
57 static char_u *next_fenc __ARGS((char_u **pp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
58 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
59 static char_u *readfile_charconvert __ARGS((char_u *fname, char_u *fenc, int *fdp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
60 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
61 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
62 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
63 static void check_marks_read __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
64 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
65 #ifdef FEAT_CRYPT
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
66 static int crypt_method_from_magic __ARGS((char *ptr, int len));
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
67 static char_u *check_for_cryptkey __ARGS((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
68 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
69 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
70 static void set_file_time __ARGS((char_u *fname, time_t atime, time_t mtime));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
71 #endif
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
72 static int set_rw_fname __ARGS((char_u *fname, char_u *sfname));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
73 static int msg_add_fileformat __ARGS((int eol_type));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
74 static void msg_add_eol __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
75 static int check_mtime __ARGS((buf_T *buf, struct stat *s));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
76 static int time_differs __ARGS((long t1, long t2));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
77 #ifdef FEAT_AUTOCMD
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
78 static int apply_autocmds_exarg __ARGS((event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap));
676
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
79 static int au_find_group __ARGS((char_u *name));
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
80
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
81 # define AUGROUP_DEFAULT -1 /* default autocmd group */
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
82 # define AUGROUP_ERROR -2 /* erroneous autocmd group */
676
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
83 # define AUGROUP_ALL -3 /* all autocmd groups */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
84 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
85
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
86 #if defined(FEAT_CRYPT) || defined(FEAT_MBYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
87 # define HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
88 # define FIO_LATIN1 0x01 /* convert Latin1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
89 # define FIO_UTF8 0x02 /* convert UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
90 # define FIO_UCS2 0x04 /* convert UCS-2 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
91 # define FIO_UCS4 0x08 /* convert UCS-4 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
92 # define FIO_UTF16 0x10 /* convert UTF-16 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
93 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
94 # define FIO_CODEPAGE 0x20 /* convert MS-Windows codepage */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
95 # define FIO_PUT_CP(x) (((x) & 0xffff) << 16) /* put codepage in top word */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
96 # define FIO_GET_CP(x) (((x)>>16) & 0xffff) /* get codepage from top word */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
97 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
98 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
99 # define FIO_MACROMAN 0x20 /* convert MacRoman */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
100 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
101 # define FIO_ENDIAN_L 0x80 /* little endian */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
102 # define FIO_ENCRYPTED 0x1000 /* encrypt written bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
103 # define FIO_NOCONVERT 0x2000 /* skip encoding conversion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
104 # define FIO_UCSBOM 0x4000 /* check for BOM at start of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
105 # define FIO_ALL -1 /* allow all formats */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
106 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
107
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
108 /* When converting, a read() or write() may leave some bytes to be converted
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
109 * for the next call. The value is guessed... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
110 #define CONV_RESTLEN 30
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
112 /* We have to guess how much a sequence of bytes may expand when converting
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
113 * with iconv() to be able to allocate a buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
114 #define ICONV_MULT 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
115
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
116 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
117 * Structure to pass arguments from buf_write() to buf_write_bytes().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
118 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
119 struct bw_info
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
120 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
121 int bw_fd; /* file descriptor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
122 char_u *bw_buf; /* buffer with data to be written */
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
123 int bw_len; /* length of data */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
124 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
125 int bw_flags; /* FIO_ flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
126 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
127 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
128 char_u bw_rest[CONV_RESTLEN]; /* not converted bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
129 int bw_restlen; /* nr of bytes in bw_rest[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
130 int bw_first; /* first write call */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
131 char_u *bw_conv_buf; /* buffer for writing converted chars */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
132 int bw_conv_buflen; /* size of bw_conv_buf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
133 int bw_conv_error; /* set for conversion error */
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
134 linenr_T bw_conv_error_lnum; /* first line with error or zero */
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
135 linenr_T bw_start_lnum; /* line number at start of buffer */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
136 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
137 iconv_t bw_iconv_fd; /* descriptor for iconv() or -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
138 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
139 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
140 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
141
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
142 static int buf_write_bytes __ARGS((struct bw_info *ip));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
143
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
144 #ifdef FEAT_MBYTE
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
145 static linenr_T readfile_linenr __ARGS((linenr_T linecnt, char_u *p, char_u *endp));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
146 static int ucs2bytes __ARGS((unsigned c, char_u **pp, int flags));
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
147 static int need_conversion __ARGS((char_u *fenc));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
148 static int get_fio_flags __ARGS((char_u *ptr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
149 static char_u *check_for_bom __ARGS((char_u *p, long size, int *lenp, int flags));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
150 static int make_bom __ARGS((char_u *buf, char_u *name));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
151 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
152 static int get_win_fio_flags __ARGS((char_u *ptr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
153 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
154 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
155 static int get_mac_fio_flags __ARGS((char_u *ptr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
156 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
157 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
158 static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
2006
78e032bb3260 updated for version 7.2-303
vimboss
parents: 2003
diff changeset
159 #ifdef TEMPDIRNAMES
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
160 static void vim_settempdir __ARGS((char_u *tempdir));
2006
78e032bb3260 updated for version 7.2-303
vimboss
parents: 2003
diff changeset
161 #endif
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
162 #ifdef FEAT_AUTOCMD
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
163 static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
164 #endif
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
165
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
166 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
167 filemess(buf, name, s, attr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
168 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
169 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
170 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
171 int attr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
172 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
173 int msg_scroll_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
174
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
175 if (msg_silent != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
176 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
177 msg_add_fname(buf, name); /* put file name in IObuff with quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
178 /* If it's extremely long, truncate it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
179 if (STRLEN(IObuff) > IOSIZE - 80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
180 IObuff[IOSIZE - 80] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
181 STRCAT(IObuff, s);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
182 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
183 * For the first message may have to start a new line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
184 * For further ones overwrite the previous one, reset msg_scroll before
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
185 * calling filemess().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
186 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
187 msg_scroll_save = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
188 if (shortmess(SHM_OVERALL) && !exiting && p_verbose == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
189 msg_scroll = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
190 if (!msg_scroll) /* wait a bit when overwriting an error msg */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
191 check_for_delay(FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
192 msg_start();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
193 msg_scroll = msg_scroll_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
194 msg_scrolled_ign = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
195 /* may truncate the message to avoid a hit-return prompt */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
196 msg_outtrans_attr(msg_may_trunc(FALSE, IObuff), attr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
197 msg_clr_eos();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
198 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
199 msg_scrolled_ign = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
200 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
201
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
202 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
203 * Read lines from file "fname" into the buffer after line "from".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
204 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
205 * 1. We allocate blocks with lalloc, as big as possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
206 * 2. Each block is filled with characters from the file with a single read().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
207 * 3. The lines are inserted in the buffer with ml_append().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
208 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
209 * (caller must check that fname != NULL, unless READ_STDIN is used)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
210 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
211 * "lines_to_skip" is the number of lines that must be skipped
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
212 * "lines_to_read" is the number of lines that are appended
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
213 * When not recovering lines_to_skip is 0 and lines_to_read MAXLNUM.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
214 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
215 * flags:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
216 * READ_NEW starting to edit a new buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
217 * READ_FILTER reading filter output
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
218 * READ_STDIN read from stdin instead of a file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
219 * READ_BUFFER read from curbuf instead of a file (converting after reading
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
220 * stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
221 * READ_DUMMY read into a dummy buffer (to check if file contents changed)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
222 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
223 * return FAIL for failure, OK otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
224 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
225 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
226 readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
227 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
228 char_u *sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
229 linenr_T from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
230 linenr_T lines_to_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
231 linenr_T lines_to_read;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
232 exarg_T *eap; /* can be NULL! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
233 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
234 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
235 int fd = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
236 int newfile = (flags & READ_NEW);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
237 int check_readonly;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
238 int filtering = (flags & READ_FILTER);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
239 int read_stdin = (flags & READ_STDIN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
240 int read_buffer = (flags & READ_BUFFER);
1486
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
241 int set_options = newfile || read_buffer
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
242 || (eap != NULL && eap->read_edit);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
243 linenr_T read_buf_lnum = 1; /* next line to read from curbuf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
244 colnr_T read_buf_col = 0; /* next char to read from this line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
245 char_u c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
246 linenr_T lnum = from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
247 char_u *ptr = NULL; /* pointer into read buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
248 char_u *buffer = NULL; /* read buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
249 char_u *new_buffer = NULL; /* init to shut up gcc */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
250 char_u *line_start = NULL; /* init to shut up gcc */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
251 int wasempty; /* buffer was empty before reading */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
252 colnr_T len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
253 long size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
254 char_u *p;
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
255 off_t filesize = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
256 int skip_read = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
257 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
258 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
259 int did_ask_for_key = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
260 #endif
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
261 #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
262 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
263 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
264 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
265 int split = 0; /* number of split lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
266 #define UNKNOWN 0x0fffffff /* file size is unknown */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
267 linenr_T linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
268 int error = FALSE; /* errors encountered */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
269 int ff_error = EOL_UNKNOWN; /* file format with errors */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
270 long linerest = 0; /* remaining chars in line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
271 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
272 int perm = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
273 int swap_mode = -1; /* protection bits for swap file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
274 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
275 int perm;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
276 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
277 int fileformat = 0; /* end-of-line format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
278 int keep_fileformat = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
279 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
280 int file_readonly;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
281 linenr_T skip_count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
282 linenr_T read_count = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
283 int msg_save = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
284 linenr_T read_no_eol_lnum = 0; /* non-zero lnum when last line of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
285 * last read was missing the eol */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
286 int try_mac = (vim_strchr(p_ffs, 'm') != NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
287 int try_dos = (vim_strchr(p_ffs, 'd') != NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
288 int try_unix = (vim_strchr(p_ffs, 'x') != NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
289 int file_rewind = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
290 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
291 int can_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
292 linenr_T conv_error = 0; /* line nr with conversion error */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
293 linenr_T illegal_byte = 0; /* line nr with illegal byte */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
294 int keep_dest_enc = FALSE; /* don't retry when char doesn't fit
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
295 in destination encoding */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
296 int bad_char_behavior = BAD_REPLACE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
297 /* BAD_KEEP, BAD_DROP or character to
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
298 * replace with */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
299 char_u *tmpname = NULL; /* name of 'charconvert' output file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
300 int fio_flags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
301 char_u *fenc; /* fileencoding to use */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
302 int fenc_alloced; /* fenc_next is in allocated memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
303 char_u *fenc_next = NULL; /* next item in 'fencs' or NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
304 int advance_fenc = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
305 long real_size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
306 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
307 iconv_t iconv_fd = (iconv_t)-1; /* descriptor for iconv() or -1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
308 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
309 int did_iconv = FALSE; /* TRUE when iconv() failed and trying
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
310 'charconvert' next */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
311 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
312 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
313 int converted = FALSE; /* TRUE if conversion done */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
314 int notconverted = FALSE; /* TRUE if conversion wanted but it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
315 wasn't possible */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
316 char_u conv_rest[CONV_RESTLEN];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
317 int conv_restlen = 0; /* nr of bytes in conv_rest[] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
318 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
319
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
320 #ifdef FEAT_AUTOCMD
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
321 /* Remember the initial values of curbuf, curbuf->b_ffname and
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
322 * curbuf->b_fname to detect whether they are altered as a result of
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
323 * executing nasty autocommands. Also check if "fname" and "sfname"
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
324 * point to one of these values. */
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
325 buf_T *old_curbuf = curbuf;
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
326 char_u *old_b_ffname = curbuf->b_ffname;
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
327 char_u *old_b_fname = curbuf->b_fname;
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
328 int using_b_ffname = (fname == curbuf->b_ffname)
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
329 || (sfname == curbuf->b_ffname);
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
330 int using_b_fname = (fname == curbuf->b_fname)
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
331 || (sfname == curbuf->b_fname);
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
332 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
333 write_no_eol_lnum = 0; /* in case it was set by the previous read */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
334
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
335 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
336 * If there is no file name yet, use the one for the read file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
337 * BF_NOTEDITED is set to reflect this.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
338 * Don't do this for a read from a filter.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
339 * Only do this when 'cpoptions' contains the 'f' flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
340 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
341 if (curbuf->b_ffname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
342 && !filtering
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
343 && fname != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
344 && vim_strchr(p_cpo, CPO_FNAMER) != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
345 && !(flags & READ_DUMMY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
346 {
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
347 if (set_rw_fname(fname, sfname) == FAIL)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
348 return FAIL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
349 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
350
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
351 /* 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
352 * display the line. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
353 ex_no_reprint = TRUE;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
354
968
994ea4e6f023 updated for version 7.0-094
vimboss
parents: 946
diff changeset
355 /* don't display the file info for another buffer now */
994ea4e6f023 updated for version 7.0-094
vimboss
parents: 946
diff changeset
356 need_fileinfo = FALSE;
994ea4e6f023 updated for version 7.0-094
vimboss
parents: 946
diff changeset
357
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
358 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
359 * For Unix: Use the short file name whenever possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
360 * Avoids problems with networks and when directory names are changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
361 * 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
362 * another directory, which we don't detect.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
363 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
364 if (sfname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
365 sfname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
366 #if defined(UNIX) || defined(__EMX__)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
367 fname = sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
368 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
369
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
370 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
371 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
372 * The BufReadCmd and FileReadCmd events intercept the reading process by
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
373 * executing the associated commands instead.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
374 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
375 if (!filtering && !read_stdin && !read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
376 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
377 pos_T pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
378
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
379 pos = curbuf->b_op_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
380
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
381 /* Set '[ mark to the line above where the lines go (line 1 if zero). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
382 curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
383 curbuf->b_op_start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
384
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
385 if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
386 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
387 if (apply_autocmds_exarg(EVENT_BUFREADCMD, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
388 FALSE, curbuf, eap))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
389 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
390 return aborting() ? FAIL : OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
391 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
392 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
393 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
394 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
395 else if (apply_autocmds_exarg(EVENT_FILEREADCMD, sfname, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
396 FALSE, NULL, eap))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
397 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
398 return aborting() ? FAIL : OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
399 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
400 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
401 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
402
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
403 curbuf->b_op_start = pos;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
404 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
405 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
406
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
407 if ((shortmess(SHM_OVER) || curbuf->b_help) && p_verbose == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
408 msg_scroll = FALSE; /* overwrite previous file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
409 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
410 msg_scroll = TRUE; /* don't overwrite previous file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
411
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
412 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
413 * 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
414 * because reading the file may actually work, but then creating the swap
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
415 * file may destroy it! Reported on MS-DOS and Win 95.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
416 * If the name is too long we might crash further on, quit here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
417 */
23
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
418 if (fname != NULL && *fname != NUL)
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
419 {
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
420 p = fname + STRLEN(fname);
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
421 if (after_pathsep(fname, p) || STRLEN(fname) >= MAXPATHL)
23
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
422 {
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
423 filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0);
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
424 msg_end();
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
425 msg_scroll = msg_save;
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
426 return FAIL;
3f44e9abe4ec updated for version 7.0015
vimboss
parents: 22
diff changeset
427 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
430 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
431 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
432 * On Unix it is possible to read a directory, so we have to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
433 * check for it before the mch_open().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
434 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
435 if (!read_stdin && !read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
436 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
437 perm = mch_getperm(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
438 if (perm >= 0 && !S_ISREG(perm) /* not a regular file ... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
439 # ifdef S_ISFIFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
440 && !S_ISFIFO(perm) /* ... or fifo */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
441 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
442 # ifdef S_ISSOCK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
443 && !S_ISSOCK(perm) /* ... or socket */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
444 # endif
1313
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
445 # ifdef OPEN_CHR_FILES
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
446 && !(S_ISCHR(perm) && is_dev_fd_file(fname))
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
447 /* ... or a character special file named /dev/fd/<n> */
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
448 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
449 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
450 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
451 if (S_ISDIR(perm))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
452 filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
453 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
454 filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
455 msg_end();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
456 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
457 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
458 }
1006
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
459
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
460 # if defined(MSDOS) || defined(MSWIN) || defined(OS2)
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
461 /*
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
462 * MS-Windows allows opening a device, but we will probably get stuck
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
463 * trying to read it.
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
464 */
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
465 if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE)
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
466 {
1303
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
467 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
468 msg_end();
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
469 msg_scroll = msg_save;
992d5c69d5e9 updated for version 7.0-132
vimboss
parents: 1004
diff changeset
470 return FAIL;
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 # endif
1004
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
473 }
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
474 #endif
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
475
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
476 /* set default 'fileformat' */
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
477 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
478 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
479 if (eap != NULL && eap->force_ff != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
480 set_fileformat(get_fileformat_force(curbuf, eap), OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
481 else if (*p_ffs != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
482 set_fileformat(default_fileformat(), OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
483 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
484
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
485 /* set or reset 'binary' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
486 if (eap != NULL && eap->force_bin != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
487 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
488 int oldval = curbuf->b_p_bin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
489
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
490 curbuf->b_p_bin = (eap->force_bin == FORCE_BIN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
491 set_options_bin(oldval, curbuf->b_p_bin, OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
492 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
493
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
494 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
495 * When opening a new file we take the readonly flag from the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
496 * Default is r/w, can be set to r/o below.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
497 * Don't reset it when in readonly mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
498 * Only set/reset b_p_ro when BF_CHECK_RO is set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
499 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
500 check_readonly = (newfile && (curbuf->b_flags & BF_CHECK_RO));
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
501 if (check_readonly && !readonlymode)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
502 curbuf->b_p_ro = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
503
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
504 if (newfile && !read_stdin && !read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
505 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
506 /* Remember time of file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
507 * For RISCOS, also remember the filetype.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
508 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
509 if (mch_stat((char *)fname, &st) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
510 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
511 buf_store_time(curbuf, &st, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
512 curbuf->b_mtime_read = curbuf->b_mtime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
513
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
514 #if defined(RISCOS) && defined(FEAT_OSFILETYPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
515 /* Read the filetype into the buffer local filetype option. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
516 mch_read_filetype(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
517 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
518 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
519 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
520 * Use the protection bits of the original file for the swap file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
521 * This makes it possible for others to read the name of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
522 * edited file from the swapfile, but only if they can read the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
523 * edited file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
524 * Remove the "write" and "execute" bits for group and others
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
525 * (they must not write the swapfile).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
526 * Add the "read" and "write" bits for the user, otherwise we may
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
527 * not be able to write to the file ourselves.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
528 * Setting the bits is done below, after creating the swap file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
529 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
530 swap_mode = (st.st_mode & 0644) | 0600;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
531 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
532 #ifdef FEAT_CW_EDITOR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
533 /* Get the FSSpec on MacOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
534 * TODO: Update it properly when the buffer name changes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
535 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
536 (void)GetFSSpecFromPath(curbuf->b_ffname, &curbuf->b_FSSpec);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
537 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
538 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
539 curbuf->b_fab_rfm = st.st_fab_rfm;
22
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
540 curbuf->b_fab_rat = st.st_fab_rat;
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
541 curbuf->b_fab_mrs = st.st_fab_mrs;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
542 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
543 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
544 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
545 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
546 curbuf->b_mtime = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
547 curbuf->b_mtime_read = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
548 curbuf->b_orig_size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
549 curbuf->b_orig_mode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
550 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
551
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
552 /* Reset the "new file" flag. It will be set again below when the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
553 * file doesn't exist. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
554 curbuf->b_flags &= ~(BF_NEW | BF_NEW_W);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
555 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
556
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
557 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
558 * for UNIX: check readonly with perm and mch_access()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
559 * for RISCOS: same as Unix, otherwise file gets re-datestamped!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
560 * for MSDOS and Amiga: check readonly by trying to open the file for writing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
561 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
562 file_readonly = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
563 if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
564 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
565 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
566 /* Force binary I/O on stdin to avoid CR-LF -> LF conversion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
567 setmode(0, O_BINARY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
568 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
569 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
570 else if (!read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
571 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
572 #ifdef USE_MCH_ACCESS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
573 if (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
574 # ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
575 !(perm & 0222) ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
576 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
577 mch_access((char *)fname, W_OK))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
578 file_readonly = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
579 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
580 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
581 if (!newfile
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
582 || readonlymode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
583 || (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
585 file_readonly = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
586 /* try to open ro */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
587 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
588 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
589 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
590 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
591
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
592 if (fd < 0) /* cannot open at all */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
593 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
594 #ifndef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
595 int isdir_f;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
596 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
597 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
598 #ifndef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
599 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
600 * On MSDOS and Amiga we can't open a directory, check here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
601 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
602 isdir_f = (mch_isdir(fname));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
603 perm = mch_getperm(fname); /* check if the file exists */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
604 if (isdir_f)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
605 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
606 filemess(curbuf, sfname, (char_u *)_("is a directory"), 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
607 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
608 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
609 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
610 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
611 if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
612 {
2147
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
613 if (perm < 0
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
614 #ifdef ENOENT
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
615 && errno == ENOENT
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
616 #endif
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
617 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
618 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
619 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
620 * Set the 'new-file' flag, so that when the file has
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
621 * been created by someone else, a ":w" will complain.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
622 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
623 curbuf->b_flags |= BF_NEW;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
624
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
625 /* Create a swap file now, so that other Vims are warned
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
626 * that we are editing this file. Don't do this for a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
627 * "nofile" or "nowrite" buffer type. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
628 #ifdef FEAT_QUICKFIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
629 if (!bt_dontwrite(curbuf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
630 #endif
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
631 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
632 check_need_swap(newfile);
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
633 #ifdef FEAT_AUTOCMD
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
634 /* SwapExists autocommand may mess things up */
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
635 if (curbuf != old_curbuf
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
636 || (using_b_ffname
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
637 && (old_b_ffname != curbuf->b_ffname))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
638 || (using_b_fname
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
639 && (old_b_fname != curbuf->b_fname)))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
640 {
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
641 EMSG(_(e_auchangedbuf));
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
642 return FAIL;
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
643 }
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
644 #endif
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
645 }
592
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
646 if (dir_of_file_exists(fname))
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
647 filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
648 else
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
649 filemess(curbuf, sfname,
6a91f35b354d updated for version 7.0168
vimboss
parents: 589
diff changeset
650 (char_u *)_("[New DIRECTORY]"), 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
651 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
652 /* Even though this is a new file, it might have been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
653 * edited before and deleted. Get the old marks. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
654 check_marks_read();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
655 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
656 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
657 if (eap != NULL && eap->force_enc != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
658 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
659 /* set forced 'fileencoding' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
660 fenc = enc_canonize(eap->cmd + eap->force_enc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
661 if (fenc != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
662 set_string_option_direct((char_u *)"fenc", -1,
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
663 fenc, OPT_FREE|OPT_LOCAL, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
664 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
665 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
666 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
667 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
668 apply_autocmds_exarg(EVENT_BUFNEWFILE, sfname, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
669 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
670 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
671 /* remember the current fileformat */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
672 save_file_ff(curbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
673
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
674 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
675 if (aborting()) /* autocmds may abort script processing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
676 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
677 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
678 return OK; /* a new file is not an error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
679 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
680 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
681 {
550
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
682 filemess(curbuf, sfname, (char_u *)(
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
683 # ifdef EFBIG
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
684 (errno == EFBIG) ? _("[File too big]") :
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
685 # endif
2147
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
686 # ifdef EOVERFLOW
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
687 (errno == EOVERFLOW) ? _("[File too big]") :
2bd29808d1f6 updated for version 7.2.429
Bram Moolenaar <bram@zimbu.org>
parents: 2095
diff changeset
688 # endif
550
74c2ea3c3081 updated for version 7.0156
vimboss
parents: 540
diff changeset
689 _("[Permission Denied]")), 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
690 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
691 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
692 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
693
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
694 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
695 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
696
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
697 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
698 * Only set the 'ro' flag for readonly files the first time they are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
699 * loaded. Help files always get readonly mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
700 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
701 if ((check_readonly && file_readonly) || curbuf->b_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
702 curbuf->b_p_ro = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
703
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
704 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
705 {
1486
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
706 /* 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
707 * correctly set when reading stdin. */
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
708 if (!read_buffer)
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
709 {
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
710 curbuf->b_p_eol = TRUE;
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
711 curbuf->b_start_eol = TRUE;
1f93fbcb4e0c updated for version 7.1-201
vimboss
parents: 1471
diff changeset
712 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
713 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
714 curbuf->b_p_bomb = FALSE;
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
715 curbuf->b_start_bomb = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
716 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
717 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
718
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
719 /* Create a swap file now, so that other Vims are warned that we are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
720 * editing this file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
721 * Don't do this for a "nofile" or "nowrite" buffer type. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
722 #ifdef FEAT_QUICKFIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
723 if (!bt_dontwrite(curbuf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
724 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
725 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
726 check_need_swap(newfile);
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
727 #ifdef FEAT_AUTOCMD
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
728 if (!read_stdin && (curbuf != old_curbuf
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
729 || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
730 || (using_b_fname && (old_b_fname != curbuf->b_fname))))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
731 {
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
732 EMSG(_(e_auchangedbuf));
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
733 if (!read_buffer)
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
734 close(fd);
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
735 return FAIL;
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
736 }
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
737 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
738 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
739 /* Set swap file protection bits after creating it. */
1918
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
740 if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
741 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
742 (void)mch_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
743 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
744 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
745
578
8eb0b93ea26c updated for version 7.0164
vimboss
parents: 574
diff changeset
746 #if defined(HAS_SWAP_EXISTS_ACTION)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
747 /* If "Quit" selected at ATTENTION dialog, don't load the file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
748 if (swap_exists_action == SEA_QUIT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
749 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
750 if (!read_buffer && !read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
751 close(fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
752 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
753 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
754 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
755
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
756 ++no_wait_return; /* don't wait for return yet */
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 * Set '[ mark to the line above where the lines go (line 1 if zero).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
760 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
761 curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
762 curbuf->b_op_start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
763
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
764 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
765 if (!read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
766 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
767 int m = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
768 int n = msg_scrolled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
769
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
770 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
771 * The file must be closed again, the autocommands may want to change
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
772 * the file before reading it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
773 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
774 if (!read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
775 close(fd); /* ignore errors */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
776
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
777 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
778 * The output from the autocommands should not overwrite anything and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
779 * should not be overwritten: Set msg_scroll, restore its value if no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
780 * output was done.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
781 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
782 msg_scroll = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
783 if (filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
784 apply_autocmds_exarg(EVENT_FILTERREADPRE, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
785 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
786 else if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
787 apply_autocmds_exarg(EVENT_STDINREADPRE, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
788 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
789 else if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
790 apply_autocmds_exarg(EVENT_BUFREADPRE, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
791 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
792 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
793 apply_autocmds_exarg(EVENT_FILEREADPRE, sfname, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
794 FALSE, NULL, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
795 if (msg_scrolled == n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
796 msg_scroll = m;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
797
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
798 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
799 if (aborting()) /* autocmds may abort script processing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
800 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
801 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
802 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
803 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
804 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
805 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
806 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
807 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
808 * Don't allow the autocommands to change the current buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
809 * Try to re-open the file.
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
810 *
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
811 * Don't allow the autocommands to change the buffer name either
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
812 * (cd for example) if it invalidates fname or sfname.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
813 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
814 if (!read_stdin && (curbuf != old_curbuf
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
815 || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
816 || (using_b_fname && (old_b_fname != curbuf->b_fname))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
817 || (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
818 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
819 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
820 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
821 if (fd < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
822 EMSG(_("E200: *ReadPre autocommands made the file unreadable"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
823 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
824 EMSG(_("E201: *ReadPre autocommands must not change current buffer"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
825 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
826 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
827 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
828 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
829 #endif /* FEAT_AUTOCMD */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
830
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
831 /* Autocommands may add lines to the file, need to check if it is empty */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
832 wasempty = (curbuf->b_ml.ml_flags & ML_EMPTY);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
833
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
834 if (!recoverymode && !filtering && !(flags & READ_DUMMY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
835 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
836 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
837 * Show the user that we are busy reading the input. Sometimes this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
838 * may take a while. When reading from stdin another program may
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
839 * still be running, don't move the cursor to the last line, unless
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
840 * always using the GUI.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
841 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
842 if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
843 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
844 #ifndef ALWAYS_USE_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
845 mch_msg(_("Vim: Reading from stdin...\n"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
846 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
847 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
848 /* Also write a message in the GUI window, if there is one. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
849 if (gui.in_use && !gui.dying && !gui.starting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
850 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
851 p = (char_u *)_("Reading from stdin...");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
852 gui_write(p, (int)STRLEN(p));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
853 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
854 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
855 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
856 else if (!read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
857 filemess(curbuf, sfname, (char_u *)"", 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
858 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
859
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
860 msg_scroll = FALSE; /* overwrite the file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
861
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
862 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
863 * Set linecnt now, before the "retry" caused by a wrong guess for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
864 * fileformat, and after the autocommands, which may change them.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
865 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
866 linecnt = curbuf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
867
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
868 #ifdef FEAT_MBYTE
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
869 /* "++bad=" argument. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
870 if (eap != NULL && eap->bad_char != 0)
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
871 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
872 bad_char_behavior = eap->bad_char;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
873 if (set_options)
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
874 curbuf->b_bad_char = eap->bad_char;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
875 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
876 else
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
877 curbuf->b_bad_char = 0;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
878
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
879 /*
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
880 * Decide which 'encoding' to use or use first.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
881 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
882 if (eap != NULL && eap->force_enc != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
883 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
884 fenc = enc_canonize(eap->cmd + eap->force_enc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
885 fenc_alloced = TRUE;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
886 keep_dest_enc = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
887 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
888 else if (curbuf->b_p_bin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
889 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
890 fenc = (char_u *)""; /* binary: don't convert */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
891 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
892 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
893 else if (curbuf->b_help)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
894 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
895 char_u firstline[80];
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
896 int fc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
897
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
898 /* Help files are either utf-8 or latin1. Try utf-8 first, if this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
899 * fails it must be latin1.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
900 * Always do this when 'encoding' is "utf-8". Otherwise only do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
901 * this when needed to avoid [converted] remarks all the time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
902 * It is needed when the first line contains non-ASCII characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
903 * That is only in *.??x files. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
904 fenc = (char_u *)"latin1";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
905 c = enc_utf8;
301
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
906 if (!c && !read_stdin)
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
907 {
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
908 fc = fname[STRLEN(fname) - 1];
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
909 if (TOLOWER_ASC(fc) == 'x')
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
910 {
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
911 /* Read the first line (and a bit more). Immediately rewind to
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
912 * the start of the file. If the read() fails "len" is -1. */
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
913 len = vim_read(fd, firstline, 80);
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
914 lseek(fd, (off_t)0L, SEEK_SET);
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
915 for (p = firstline; p < firstline + len; ++p)
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
916 if (*p >= 0x80)
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
917 {
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
918 c = TRUE;
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
919 break;
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
920 }
006e9c8a6a8a updated for version 7.0079
vimboss
parents: 297
diff changeset
921 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
922 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
923
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
924 if (c)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
925 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
926 fenc_next = fenc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
927 fenc = (char_u *)"utf-8";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
928
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
929 /* When the file is utf-8 but a character doesn't fit in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
930 * 'encoding' don't retry. In help text editing utf-8 bytes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
931 * doesn't make sense. */
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
932 if (!enc_utf8)
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
933 keep_dest_enc = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
934 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
935 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
936 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
937 else if (*p_fencs == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
938 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
939 fenc = curbuf->b_p_fenc; /* use format from buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
940 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
941 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
942 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
943 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
944 fenc_next = p_fencs; /* try items in 'fileencodings' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
945 fenc = next_fenc(&fenc_next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
946 fenc_alloced = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
947 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
948 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
949
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
950 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
951 * Jump back here to retry reading the file in different ways.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
952 * Reasons to retry:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
953 * - encoding conversion failed: try another one from "fenc_next"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
954 * - BOM detected and fenc was set, need to setup conversion
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
955 * - "fileformat" check failed: try another
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
956 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
957 * Variables set for special retry actions:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
958 * "file_rewind" Rewind the file to start reading it again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
959 * "advance_fenc" Advance "fenc" using "fenc_next".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
960 * "skip_read" Re-use already read bytes (BOM detected).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
961 * "did_iconv" iconv() conversion failed, try 'charconvert'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
962 * "keep_fileformat" Don't reset "fileformat".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
963 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
964 * Other status indicators:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
965 * "tmpname" When != NULL did conversion with 'charconvert'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
966 * Output file has to be deleted afterwards.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
967 * "iconv_fd" When != -1 did conversion with iconv().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
968 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
969 retry:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
970
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
971 if (file_rewind)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
972 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
973 if (read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
974 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
975 read_buf_lnum = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
976 read_buf_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
977 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
978 else if (read_stdin || lseek(fd, (off_t)0L, SEEK_SET) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
979 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
980 /* Can't rewind the file, give up. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
981 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
982 goto failed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
983 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
984 /* Delete the previously read lines. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
985 while (lnum > from)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
986 ml_delete(lnum--, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
987 file_rewind = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
988 #ifdef FEAT_MBYTE
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
989 if (set_options)
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
990 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
991 curbuf->b_p_bomb = FALSE;
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
992 curbuf->b_start_bomb = FALSE;
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
993 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
994 conv_error = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
995 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
996 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
997
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
998 #ifdef FEAT_CRYPT
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
999 if (cryptkey != NULL)
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
1000 /* Need to reset the state, but keep the key, don't want to ask for it
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
1001 * again. */
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
1002 crypt_pop_state();
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
1003 #endif
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
1004
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1005 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1006 * When retrying with another "fenc" and the first time "fileformat"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1007 * will be reset.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1008 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1009 if (keep_fileformat)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1010 keep_fileformat = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1011 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1012 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1013 if (eap != NULL && eap->force_ff != 0)
1742
0e4fa55d20e0 updated for version 7.2-040
vimboss
parents: 1735
diff changeset
1014 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1015 fileformat = get_fileformat_force(curbuf, eap);
1742
0e4fa55d20e0 updated for version 7.2-040
vimboss
parents: 1735
diff changeset
1016 try_unix = try_dos = try_mac = FALSE;
0e4fa55d20e0 updated for version 7.2-040
vimboss
parents: 1735
diff changeset
1017 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1018 else if (curbuf->b_p_bin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1019 fileformat = EOL_UNIX; /* binary: use Unix format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1020 else if (*p_ffs == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1021 fileformat = get_fileformat(curbuf);/* use format from buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1022 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1023 fileformat = EOL_UNKNOWN; /* detect from file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1024 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1025
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1026 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1027 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1028 if (iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1029 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1030 /* aborted conversion with iconv(), close the descriptor */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1031 iconv_close(iconv_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1032 iconv_fd = (iconv_t)-1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1033 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1034 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1035
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1036 if (advance_fenc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1037 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1038 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1039 * Try the next entry in 'fileencodings'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1040 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1041 advance_fenc = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1043 if (eap != NULL && eap->force_enc != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1044 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1045 /* Conversion given with "++cc=" wasn't possible, read
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1046 * without conversion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1047 notconverted = TRUE;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1048 conv_error = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1049 if (fenc_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1050 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1051 fenc = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1052 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1053 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1054 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1055 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1056 if (fenc_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1057 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1058 if (fenc_next != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1059 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1060 fenc = next_fenc(&fenc_next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1061 fenc_alloced = (fenc_next != NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1062 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1063 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1064 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1065 fenc = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1066 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1067 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1068 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1069 if (tmpname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1070 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1071 mch_remove(tmpname); /* delete converted file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1072 vim_free(tmpname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1073 tmpname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1074 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1075 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1076
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1077 /*
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
1078 * Conversion may be required when the encoding of the file is different
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
1079 * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1080 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1081 fio_flags = 0;
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
1082 converted = need_conversion(fenc);
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
1083 if (converted)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1084 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1085
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1086 /* "ucs-bom" means we need to check the first bytes of the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1087 * for a BOM. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1088 if (STRCMP(fenc, ENC_UCSBOM) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1089 fio_flags = FIO_UCSBOM;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1091 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1092 * Check if UCS-2/4 or Latin1 to UTF-8 conversion needs to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1093 * done. This is handled below after read(). Prepare the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1094 * fio_flags to avoid having to parse the string each time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1095 * Also check for Unicode to Latin1 conversion, because iconv()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1096 * appears not to handle this correctly. This works just like
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1097 * conversion to UTF-8 except how the resulting character is put in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1098 * the buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1099 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1100 else if (enc_utf8 || STRCMP(p_enc, "latin1") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1101 fio_flags = get_fio_flags(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1102
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1103 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1104 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1105 * Conversion from an MS-Windows codepage to UTF-8 or another codepage
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1106 * is handled with MultiByteToWideChar().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1107 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1108 if (fio_flags == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1109 fio_flags = get_win_fio_flags(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1110 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1112 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1113 /* Conversion from Apple MacRoman to latin1 or UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1114 if (fio_flags == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1115 fio_flags = get_mac_fio_flags(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1116 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1117
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1118 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1119 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1120 * Try using iconv() if we can't convert internally.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1121 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1122 if (fio_flags == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1123 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1124 && !did_iconv
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1125 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1126 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1127 iconv_fd = (iconv_t)my_iconv_open(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1128 enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1129 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1130
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1131 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1132 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1133 * Use the 'charconvert' expression when conversion is required
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1134 * and we can't do it internally or with iconv().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1135 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1136 if (fio_flags == 0 && !read_stdin && !read_buffer && *p_ccv != NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1137 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1138 && iconv_fd == (iconv_t)-1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1139 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1140 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1141 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1142 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1143 did_iconv = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1144 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1145 /* Skip conversion when it's already done (retry for wrong
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1146 * "fileformat"). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1147 if (tmpname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1148 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1149 tmpname = readfile_charconvert(fname, fenc, &fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1150 if (tmpname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1151 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1152 /* Conversion failed. Try another one. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1153 advance_fenc = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1154 if (fd < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1155 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1156 /* Re-opening the original file failed! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1157 EMSG(_("E202: Conversion made file unreadable!"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1158 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1159 goto failed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1160 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1161 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1162 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1163 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1164 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1165 else
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 (fio_flags == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1169 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1170 && iconv_fd == (iconv_t)-1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1171 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1172 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1173 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1174 /* Conversion wanted but we can't.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1175 * Try the next conversion in 'fileencodings' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1176 advance_fenc = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1177 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1178 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1179 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1180 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1181
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1182 /* 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
1183 * 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
1184 * stdin or fixed at a specific encoding. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1185 can_retry = (*fenc != NUL && !read_stdin && !keep_dest_enc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1186 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1187
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1188 if (!skip_read)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1189 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1190 linerest = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1191 filesize = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1192 skip_count = lines_to_skip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1193 read_count = lines_to_read;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1194 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1195 conv_restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1196 #endif
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
1197 #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
1198 read_undo_file = (newfile && curbuf->b_ffname != NULL && curbuf->b_p_udf
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
1199 && !filtering && !read_stdin && !read_buffer);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
1200 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
1201 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
1202 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1203 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1204
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1205 while (!error && !got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1206 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1207 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1208 * We allocate as much space for the file as we can get, plus
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1209 * space for the old line plus room for one terminating NUL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1210 * The amount is limited by the fact that read() only can read
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1211 * upto max_unsigned characters (and other things).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1212 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1213 #if SIZEOF_INT <= 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1214 if (linerest >= 0x7ff0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1215 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1216 ++split;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1217 *ptr = NL; /* split line by inserting a NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1218 size = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1219 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1220 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1221 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1222 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1223 if (!skip_read)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1224 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1225 #if SIZEOF_INT > 2
1076
17b9587ff6d5 updated for version 7.0-202
vimboss
parents: 1061
diff changeset
1226 # if defined(SSIZE_MAX) && (SSIZE_MAX < 0x10000L)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1227 size = SSIZE_MAX; /* use max I/O size, 52K */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1228 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1229 size = 0x10000L; /* use buffer >= 64K */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1230 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1231 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1232 size = 0x7ff0L - linerest; /* limit buffer to 32K */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1233 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1234
836
5a7843c57316 updated for version 7.0e02
vimboss
parents: 835
diff changeset
1235 for ( ; size >= 10; size = (long)((long_u)size >> 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1237 if ((new_buffer = lalloc((long_u)(size + linerest + 1),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1238 FALSE)) != NULL)
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 (new_buffer == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1242 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1243 do_outofmem_msg((long_u)(size * 2 + linerest + 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1244 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1245 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1246 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1247 if (linerest) /* copy characters from the previous buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1248 mch_memmove(new_buffer, ptr - linerest, (size_t)linerest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1249 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1250 buffer = new_buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1251 ptr = buffer + linerest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1252 line_start = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1254 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1255 /* May need room to translate into.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1256 * For iconv() we don't really know the required space, use a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1257 * factor ICONV_MULT.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1258 * latin1 to utf-8: 1 byte becomes up to 2 bytes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1259 * utf-16 to utf-8: 2 bytes become up to 3 bytes, 4 bytes
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1260 * become up to 4 bytes, size must be multiple of 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1261 * 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
1262 * multiple of 2
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1263 * 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
1264 * multiple of 4 */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1265 real_size = (int)size;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1266 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1267 if (iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1268 size = size / ICONV_MULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1269 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1270 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1271 if (fio_flags & FIO_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1272 size = size / 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1273 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1274 size = (size * 2 / 3) & ~1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1275 else if (fio_flags & FIO_UCS4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1276 size = (size * 2 / 3) & ~3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1277 else if (fio_flags == FIO_UCSBOM)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1278 size = size / ICONV_MULT; /* worst case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1279 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1280 else if (fio_flags & FIO_CODEPAGE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1281 size = size / ICONV_MULT; /* also worst case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1282 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1283 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1284 else if (fio_flags & FIO_MACROMAN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1285 size = size / ICONV_MULT; /* also worst case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1286 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1287 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1288
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1289 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1290 if (conv_restlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1291 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1292 /* Insert unconverted bytes from previous line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1293 mch_memmove(ptr, conv_rest, conv_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1294 ptr += conv_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1295 size -= conv_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1296 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1297 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1298
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1299 if (read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1300 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1301 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1302 * Read bytes from curbuf. Used for converting text read
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1303 * from stdin.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1304 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1305 if (read_buf_lnum > from)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1306 size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1307 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1308 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1309 int n, ni;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1310 long tlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1311
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1312 tlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1313 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1314 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1315 p = ml_get(read_buf_lnum) + read_buf_col;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1316 n = (int)STRLEN(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1317 if ((int)tlen + n + 1 > size)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1319 /* Filled up to "size", append partial line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1320 * Change NL to NUL to reverse the effect done
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1321 * below. */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1322 n = (int)(size - tlen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1323 for (ni = 0; ni < n; ++ni)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1324 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1325 if (p[ni] == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1326 ptr[tlen++] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1327 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1328 ptr[tlen++] = p[ni];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1329 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1330 read_buf_col += n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1331 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1332 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1333 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1334 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1335 /* Append whole line and new-line. Change NL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1336 * to NUL to reverse the effect done below. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1337 for (ni = 0; ni < n; ++ni)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1338 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1339 if (p[ni] == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1340 ptr[tlen++] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1341 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1342 ptr[tlen++] = p[ni];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1343 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1344 ptr[tlen++] = NL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1345 read_buf_col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1346 if (++read_buf_lnum > from)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1347 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1348 /* When the last line didn't have an
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1349 * end-of-line don't add it now either. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1350 if (!curbuf->b_p_eol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1351 --tlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1352 size = tlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1353 break;
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 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1357 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1358 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1359 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1360 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1361 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1362 * Read bytes from the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1363 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1364 size = vim_read(fd, ptr, size);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1365 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1366
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1367 if (size <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1368 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1369 if (size < 0) /* read error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1370 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1371 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1372 else if (conv_restlen > 0)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1373 {
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1374 /*
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1375 * Reached end-of-file but some trailing bytes could
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1376 * not be converted. Truncated file?
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1377 */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1378
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1379 /* When we did a conversion report an error. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1380 if (fio_flags != 0
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1381 # ifdef USE_ICONV
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1382 || iconv_fd != (iconv_t)-1
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1383 # endif
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1384 )
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1385 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1386 if (conv_error == 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1387 conv_error = curbuf->b_ml.ml_line_count
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1388 - linecnt + 1;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1389 }
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1390 /* Remember the first linenr with an illegal byte */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1391 else if (illegal_byte == 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1392 illegal_byte = curbuf->b_ml.ml_line_count
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1393 - linecnt + 1;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1394 if (bad_char_behavior == BAD_DROP)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1395 {
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1396 *(ptr - conv_restlen) = NUL;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1397 conv_restlen = 0;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1398 }
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1399 else
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1400 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1401 /* Replace the trailing bytes with the replacement
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1402 * character if we were converting; if we weren't,
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1403 * leave the UTF8 checking code to do it, as it
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1404 * works slightly differently. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1405 if (bad_char_behavior != BAD_KEEP && (fio_flags != 0
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1406 # ifdef USE_ICONV
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1407 || iconv_fd != (iconv_t)-1
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1408 # endif
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1409 ))
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1410 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1411 while (conv_restlen > 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1412 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1413 *(--ptr) = bad_char_behavior;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1414 --conv_restlen;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1415 }
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1416 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1417 fio_flags = 0; /* don't convert this */
834
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1418 # ifdef USE_ICONV
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1419 if (iconv_fd != (iconv_t)-1)
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1420 {
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1421 iconv_close(iconv_fd);
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1422 iconv_fd = (iconv_t)-1;
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1423 }
5117153003bd updated for version 7.0e
vimboss
parents: 822
diff changeset
1424 # endif
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1425 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1426 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1427 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1428 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1429
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1430 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1431 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1432 * At start of file: Check for magic number of encryption.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1433 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1434 if (filesize == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1435 cryptkey = check_for_cryptkey(cryptkey, ptr, &size,
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
1436 &filesize, newfile, sfname,
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
1437 &did_ask_for_key);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1438 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1439 * Decrypt the read bytes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1440 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1441 if (cryptkey != NULL && size > 0)
2244
caca0ddd789b Made crypt/decrypt faster.
Bram Moolenaar <bram@vim.org>
parents: 2243
diff changeset
1442 crypt_decode(ptr, size);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1443 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1444 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1445 skip_read = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1446
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1447 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1448 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1449 * At start of file (or after crypt magic number): Check for BOM.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1450 * Also check for a BOM for other Unicode encodings, but not after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1451 * converting with 'charconvert' or when a BOM has already been
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1452 * found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1453 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1454 if ((filesize == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1455 # ifdef FEAT_CRYPT
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
1456 || (filesize == (CRYPT_MAGIC_LEN
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
1457 + crypt_salt_len[use_crypt_method]
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
1458 + crypt_seed_len[use_crypt_method])
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
1459 && cryptkey != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1460 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1461 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1462 && (fio_flags == FIO_UCSBOM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1463 || (!curbuf->b_p_bomb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1464 && tmpname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1465 && (*fenc == 'u' || (*fenc == NUL && enc_utf8)))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1466 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1467 char_u *ccname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1468 int blen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1469
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1470 /* no BOM detection in a short file or in binary mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1471 if (size < 2 || curbuf->b_p_bin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1472 ccname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1473 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1474 ccname = check_for_bom(ptr, size, &blen,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1475 fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags(fenc));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1476 if (ccname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1477 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1478 /* Remove BOM from the text */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1479 filesize += blen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1480 size -= blen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1481 mch_memmove(ptr, ptr + blen, (size_t)size);
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
1482 if (set_options)
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
1483 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1484 curbuf->b_p_bomb = TRUE;
1352
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
1485 curbuf->b_start_bomb = TRUE;
c544a3507e83 updated for version 7.1-066
vimboss
parents: 1313
diff changeset
1486 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1487 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1488
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1489 if (fio_flags == FIO_UCSBOM)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1490 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1491 if (ccname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1492 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1493 /* No BOM detected: retry with next encoding. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1494 advance_fenc = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1495 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1496 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1497 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1498 /* BOM detected: set "fenc" and jump back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1499 if (fenc_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1500 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1501 fenc = ccname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1502 fenc_alloced = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1503 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1504 /* retry reading without getting new bytes or rewinding */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1505 skip_read = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1506 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1507 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1508 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1509
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1510 /* Include not converted bytes. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1511 ptr -= conv_restlen;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1512 size += conv_restlen;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1513 conv_restlen = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1514 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1515 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1516 * Break here for a read error or end-of-file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1517 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1518 if (size <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1519 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1520
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1521 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1522
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1523 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1524 if (iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1525 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1526 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1527 * Attempt conversion of the read bytes to 'encoding' using
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1528 * iconv().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1529 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1530 const char *fromp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1531 char *top;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1532 size_t from_size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1533 size_t to_size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1534
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1535 fromp = (char *)ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1536 from_size = size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1537 ptr += size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1538 top = (char *)ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1539 to_size = real_size - size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1540
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1541 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1542 * If there is conversion error or not enough room try using
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
1543 * another conversion. Except for when there is no
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
1544 * alternative (help files).
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1545 */
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1546 while ((iconv(iconv_fd, (void *)&fromp, &from_size,
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1547 &top, &to_size)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1548 == (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1549 || from_size > CONV_RESTLEN)
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1550 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1551 if (can_retry)
375
f14cbd913415 updated for version 7.0097
vimboss
parents: 355
diff changeset
1552 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1553 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1554 conv_error = readfile_linenr(linecnt,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1555 ptr, (char_u *)top);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1556
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1557 /* Deal with a bad byte and continue with the next. */
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1558 ++fromp;
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1559 --from_size;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1560 if (bad_char_behavior == BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1561 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1562 *top++ = *(fromp - 1);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1563 --to_size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1564 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1565 else if (bad_char_behavior != BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1566 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1567 *top++ = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1568 --to_size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1569 }
177
84c21eb4fc40 updated for version 7.0054
vimboss
parents: 170
diff changeset
1570 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1571
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1572 if (from_size > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1573 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1574 /* Some remaining characters, keep them for the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1575 * round. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1576 mch_memmove(conv_rest, (char_u *)fromp, from_size);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1577 conv_restlen = (int)from_size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1578 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1579
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1580 /* move the linerest to before the converted characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1581 line_start = ptr - linerest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1582 mch_memmove(line_start, buffer, (size_t)linerest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1583 size = (long)((char_u *)top - ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1584 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1585 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1586
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1587 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1588 if (fio_flags & FIO_CODEPAGE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1589 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1590 char_u *src, *dst;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1591 WCHAR ucs2buf[3];
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1592 int ucs2len;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1593 int codepage = FIO_GET_CP(fio_flags);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1594 int bytelen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1595 int found_bad;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1596 char replstr[2];
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1597
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1598 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1599 * 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
1600 * a codepage, using standard MS-Windows functions. This
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1601 * requires two steps:
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1602 * 1. convert from 'fileencoding' to ucs-2
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1603 * 2. convert from ucs-2 to 'encoding'
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1604 *
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1605 * Because there may be illegal bytes AND an incomplete byte
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1606 * sequence at the end, we may have to do the conversion one
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1607 * character at a time to get it right.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1608 */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1609
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1610 /* Replacement string for WideCharToMultiByte(). */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1611 if (bad_char_behavior > 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1612 replstr[0] = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1613 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1614 replstr[0] = '?';
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1615 replstr[1] = NUL;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1616
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1617 /*
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1618 * Move the bytes to the end of the buffer, so that we have
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1619 * room to put the result at the start.
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1620 */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1621 src = ptr + real_size - size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1622 mch_memmove(src, ptr, size);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1623
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1624 /*
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1625 * Do the conversion.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1626 */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1627 dst = ptr;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1628 size = size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1629 while (size > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1630 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1631 found_bad = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1633 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1634 if (codepage == CP_UTF8)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1635 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1636 /* Handle CP_UTF8 input ourselves to be able to handle
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1637 * trailing bytes properly.
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1638 * Get one UTF-8 character from src. */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1639 bytelen = (int)utf_ptr2len_len(src, size);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1640 if (bytelen > size)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1641 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1642 /* Only got some bytes of a character. Normally
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1643 * it's put in "conv_rest", but if it's too long
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1644 * deal with it as if they were illegal bytes. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1645 if (bytelen <= CONV_RESTLEN)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1646 break;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1647
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1648 /* weird overlong byte sequence */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1649 bytelen = size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1650 found_bad = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1651 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1652 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1653 {
799
6beb2c667935 updated for version 7.0b
vimboss
parents: 788
diff changeset
1654 int u8c = utf_ptr2char(src);
6beb2c667935 updated for version 7.0b
vimboss
parents: 788
diff changeset
1655
622
4096208d2a50 updated for version 7.0178
vimboss
parents: 617
diff changeset
1656 if (u8c > 0xffff || (*src >= 0x80 && bytelen == 1))
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1657 found_bad = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1658 ucs2buf[0] = u8c;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1659 ucs2len = 1;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1660 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1661 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1662 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1663 # endif
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1664 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1665 /* We don't know how long the byte sequence is, try
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1666 * from one to three bytes. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1667 for (bytelen = 1; bytelen <= size && bytelen <= 3;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1668 ++bytelen)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1669 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1670 ucs2len = MultiByteToWideChar(codepage,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1671 MB_ERR_INVALID_CHARS,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1672 (LPCSTR)src, bytelen,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1673 ucs2buf, 3);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1674 if (ucs2len > 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1675 break;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1676 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1677 if (ucs2len == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1678 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1679 /* If we have only one byte then it's probably an
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1680 * incomplete byte sequence. Otherwise discard
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1681 * one byte as a bad character. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1682 if (size == 1)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1683 break;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1684 found_bad = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1685 bytelen = 1;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1686 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1687 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1688
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1689 if (!found_bad)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1690 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1691 int i;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1692
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1693 /* Convert "ucs2buf[ucs2len]" to 'enc' in "dst". */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1694 if (enc_utf8)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1695 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1696 /* From UCS-2 to UTF-8. Cannot fail. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1697 for (i = 0; i < ucs2len; ++i)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1698 dst += utf_char2bytes(ucs2buf[i], dst);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1699 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1700 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1701 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1702 BOOL bad = FALSE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1703 int dstlen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1704
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1705 /* From UCS-2 to "enc_codepage". If the
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1706 * conversion uses the default character "?",
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1707 * the data doesn't fit in this encoding. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1708 dstlen = WideCharToMultiByte(enc_codepage, 0,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1709 (LPCWSTR)ucs2buf, ucs2len,
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1710 (LPSTR)dst, (int)(src - dst),
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1711 replstr, &bad);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1712 if (bad)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1713 found_bad = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1714 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1715 dst += dstlen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1716 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1717 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1718
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1719 if (found_bad)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1720 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1721 /* Deal with bytes we can't convert. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1722 if (can_retry)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1723 goto rewind_retry;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1724 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1725 conv_error = readfile_linenr(linecnt, ptr, dst);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1726 if (bad_char_behavior != BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1727 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1728 if (bad_char_behavior == BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1729 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1730 mch_memmove(dst, src, bytelen);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1731 dst += bytelen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1732 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1733 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1734 *dst++ = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1735 }
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 src += bytelen;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1739 size -= bytelen;
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
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1742 if (size > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1743 {
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1744 /* An incomplete byte sequence remaining. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1745 mch_memmove(conv_rest, src, size);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1746 conv_restlen = size;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1747 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1748
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1749 /* The new size is equal to how much "dst" was advanced. */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1750 size = (long)(dst - ptr);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1751 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1752 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1753 # endif
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
1754 # ifdef MACOS_CONVERT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1755 if (fio_flags & FIO_MACROMAN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1756 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1757 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1758 * Conversion from Apple MacRoman char encoding to UTF-8 or
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
1759 * latin1. This is in os_mac_conv.c.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1760 */
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
1761 if (macroman2enc(ptr, &size, real_size) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1762 goto rewind_retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1763 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1764 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1765 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1766 if (fio_flags != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1767 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1768 int u8c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1769 char_u *dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1770 char_u *tail = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1771
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1772 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1773 * "enc_utf8" set: Convert Unicode or Latin1 to UTF-8.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1774 * "enc_utf8" not set: Convert Unicode to Latin1.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1775 * Go from end to start through the buffer, because the number
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1776 * of bytes may increase.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1777 * "dest" points to after where the UTF-8 bytes go, "p" points
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1778 * to after the next character to convert.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1779 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1780 dest = ptr + real_size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1781 if (fio_flags == FIO_LATIN1 || fio_flags == FIO_UTF8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1782 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1783 p = ptr + size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1784 if (fio_flags == FIO_UTF8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1785 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1786 /* Check for a trailing incomplete UTF-8 sequence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1787 tail = ptr + size - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1788 while (tail > ptr && (*tail & 0xc0) == 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1789 --tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1790 if (tail + utf_byte2len(*tail) <= ptr + size)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1791 tail = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1792 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1793 p = tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1794 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1795 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1796 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1797 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1798 /* Check for a trailing byte */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1799 p = ptr + (size & ~1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1800 if (size & 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1801 tail = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1802 if ((fio_flags & FIO_UTF16) && p > ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1803 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1804 /* Check for a trailing leading word */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1805 if (fio_flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1806 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1807 u8c = (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1808 u8c += *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1809 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1810 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1811 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1812 u8c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1813 u8c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1814 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1815 if (u8c >= 0xd800 && u8c <= 0xdbff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1816 tail = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1817 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1818 p += 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1820 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1821 else /* FIO_UCS4 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1822 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1823 /* Check for trailing 1, 2 or 3 bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1824 p = ptr + (size & ~3);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1825 if (size & 3)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1826 tail = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1827 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1828
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1829 /* If there is a trailing incomplete sequence move it to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1830 * conv_rest[]. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1831 if (tail != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1832 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1833 conv_restlen = (int)((ptr + size) - tail);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1834 mch_memmove(conv_rest, (char_u *)tail, conv_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1835 size -= conv_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1836 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1837
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1838
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1839 while (p > ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1840 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1841 if (fio_flags & FIO_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1842 u8c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1843 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1844 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1845 if (fio_flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1846 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1847 u8c = (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1848 u8c += *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1849 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1850 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1851 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1852 u8c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1853 u8c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1854 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1855 if ((fio_flags & FIO_UTF16)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1856 && u8c >= 0xdc00 && u8c <= 0xdfff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1857 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1858 int u16c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1859
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1860 if (p == ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1861 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1862 /* Missing leading word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1863 if (can_retry)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1864 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1865 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1866 conv_error = readfile_linenr(linecnt,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1867 ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1868 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1869 continue;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1870 if (bad_char_behavior != BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1871 u8c = bad_char_behavior;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1872 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1873
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1874 /* found second word of double-word, get the first
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1875 * word and compute the resulting character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1876 if (fio_flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1877 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1878 u16c = (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1879 u16c += *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1880 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1881 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1882 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1883 u16c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1884 u16c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1885 }
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1886 u8c = 0x10000 + ((u16c & 0x3ff) << 10)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1887 + (u8c & 0x3ff);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1888
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1889 /* Check if the word is indeed a leading word. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1890 if (u16c < 0xd800 || u16c > 0xdbff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1891 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1892 if (can_retry)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1893 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1894 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1895 conv_error = readfile_linenr(linecnt,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1896 ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1897 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1898 continue;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1899 if (bad_char_behavior != BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1900 u8c = bad_char_behavior;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1901 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1902 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1903 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1904 else if (fio_flags & FIO_UCS4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1905 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1906 if (fio_flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1907 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1908 u8c = (*--p << 24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1909 u8c += (*--p << 16);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1910 u8c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1911 u8c += *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1912 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1913 else /* big endian */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1914 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1915 u8c = *--p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1916 u8c += (*--p << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1917 u8c += (*--p << 16);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1918 u8c += (*--p << 24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1919 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1920 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1921 else /* UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1922 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1923 if (*--p < 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1924 u8c = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1925 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1926 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1927 len = utf_head_off(ptr, p);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1928 p -= len;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1929 u8c = utf_ptr2char(p);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1930 if (len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1931 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1932 /* Not a valid UTF-8 character, retry with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1933 * another fenc when possible, otherwise just
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1934 * report the error. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1935 if (can_retry)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1936 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1937 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1938 conv_error = readfile_linenr(linecnt,
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1939 ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1940 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1941 continue;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1942 if (bad_char_behavior != BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1943 u8c = bad_char_behavior;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1944 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1945 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1946 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1947 if (enc_utf8) /* produce UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1948 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1949 dest -= utf_char2len(u8c);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1950 (void)utf_char2bytes(u8c, dest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1951 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1952 else /* produce Latin1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1953 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1954 --dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1955 if (u8c >= 0x100)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1956 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1957 /* character doesn't fit in latin1, retry with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1958 * another fenc when possible, otherwise just
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1959 * report the error. */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1960 if (can_retry)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1961 goto rewind_retry;
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1962 if (conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1963 conv_error = readfile_linenr(linecnt, ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1964 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1965 ++dest;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1966 else if (bad_char_behavior == BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1967 *dest = u8c;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1968 else if (eap != NULL && eap->bad_char != 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1969 *dest = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1970 else
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1971 *dest = 0xBF;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1972 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1973 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1974 *dest = u8c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1975 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1976 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1977
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1978 /* move the linerest to before the converted characters */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1979 line_start = dest - linerest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1980 mch_memmove(line_start, buffer, (size_t)linerest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1981 size = (long)((ptr + real_size) - dest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1982 ptr = dest;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1983 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1984 else if (enc_utf8 && !curbuf->b_p_bin)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1985 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1986 int incomplete_tail = FALSE;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1987
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1988 /* Reading UTF-8: Check if the bytes are valid UTF-8. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
1989 for (p = ptr; ; ++p)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1990 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
1991 int todo = (int)((ptr + size) - p);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1992 int l;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1993
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1994 if (todo <= 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
1995 break;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1996 if (*p >= 0x80)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1997 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1998 /* A length of 1 means it's an illegal byte. Accept
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
1999 * an incomplete character at the end though, the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2000 * read() will get the next bytes, we'll check it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2001 * then. */
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2002 l = utf_ptr2len_len(p, todo);
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2003 if (l > todo && !incomplete_tail)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2004 {
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2005 /* Avoid retrying with a different encoding when
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2006 * a truncated file is more likely, or attempting
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2007 * to read the rest of an incomplete sequence when
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2008 * we have already done so. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2009 if (p > ptr || filesize > 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2010 incomplete_tail = TRUE;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2011 /* Incomplete byte sequence, move it to conv_rest[]
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2012 * and try to read the rest of it, unless we've
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2013 * already done so. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2014 if (p > ptr)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2015 {
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2016 conv_restlen = todo;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2017 mch_memmove(conv_rest, p, conv_restlen);
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2018 size -= conv_restlen;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2019 break;
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2020 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2021 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2022 if (l == 1 || l > todo)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2023 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2024 /* Illegal byte. If we can try another encoding
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2025 * do that, unless at EOF where a truncated
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2026 * file is more likely than a conversion error. */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2027 if (can_retry && !incomplete_tail)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2028 break;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2029 # ifdef USE_ICONV
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2030 /* When we did a conversion report an error. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2031 if (iconv_fd != (iconv_t)-1 && conv_error == 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2032 conv_error = readfile_linenr(linecnt, ptr, p);
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2033 # endif
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2034 /* Remember the first linenr with an illegal byte */
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2035 if (conv_error == 0 && illegal_byte == 0)
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2036 illegal_byte = readfile_linenr(linecnt, ptr, p);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2037
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2038 /* Drop, keep or replace the bad byte. */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2039 if (bad_char_behavior == BAD_DROP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2040 {
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2041 mch_memmove(p, p + 1, todo - 1);
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2042 --p;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2043 --size;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2044 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2045 else if (bad_char_behavior != BAD_KEEP)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2046 *p = bad_char_behavior;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2047 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2048 else
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2049 p += l - 1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2050 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2051 }
1597
80b9076e9e17 updated for version 7.1-310
vimboss
parents: 1583
diff changeset
2052 if (p < ptr + size && !incomplete_tail)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2053 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2054 /* Detected a UTF-8 error. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2055 rewind_retry:
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2056 /* Retry reading with another conversion. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2057 # if defined(FEAT_EVAL) && defined(USE_ICONV)
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2058 if (*p_ccv != NUL && iconv_fd != (iconv_t)-1)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2059 /* iconv() failed, try 'charconvert' */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2060 did_iconv = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2061 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2062 # endif
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2063 /* use next item from 'fileencodings' */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2064 advance_fenc = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2065 file_rewind = TRUE;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2066 goto retry;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2067 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2068 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2069 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2070
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2071 /* count the number of characters (after conversion!) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2072 filesize += size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2073
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2074 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2075 * when reading the first part of a file: guess EOL type
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2076 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2077 if (fileformat == EOL_UNKNOWN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2078 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2079 /* First try finding a NL, for Dos and Unix */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2080 if (try_dos || try_unix)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2081 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2082 for (p = ptr; p < ptr + size; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2083 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2084 if (*p == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2085 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2086 if (!try_unix
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2087 || (try_dos && p > ptr && p[-1] == CAR))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2088 fileformat = EOL_DOS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2089 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2090 fileformat = EOL_UNIX;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2091 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2092 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2093 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2094
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2095 /* Don't give in to EOL_UNIX if EOL_MAC is more likely */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2096 if (fileformat == EOL_UNIX && try_mac)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2097 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2098 /* Need to reset the counters when retrying fenc. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2099 try_mac = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2100 try_unix = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2101 for (; p >= ptr && *p != CAR; p--)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2102 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2103 if (p >= ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2104 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2105 for (p = ptr; p < ptr + size; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2106 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2107 if (*p == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2108 try_unix++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2109 else if (*p == CAR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2110 try_mac++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2111 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2112 if (try_mac > try_unix)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2113 fileformat = EOL_MAC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2114 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2115 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2116 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2117
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2118 /* No NL found: may use Mac format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2119 if (fileformat == EOL_UNKNOWN && try_mac)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2120 fileformat = EOL_MAC;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2121
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2122 /* Still nothing found? Use first format in 'ffs' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2123 if (fileformat == EOL_UNKNOWN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2124 fileformat = default_fileformat();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2125
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2126 /* if editing a new file: may set p_tx and p_ff */
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2127 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2128 set_fileformat(fileformat, OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2129 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2130 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2131
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2132 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2133 * This loop is executed once for every character read.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2134 * Keep it fast!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2135 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2136 if (fileformat == EOL_MAC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2137 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2138 --ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2139 while (++ptr, --size >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2140 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2141 /* catch most common case first */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2142 if ((c = *ptr) != NUL && c != CAR && c != NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2143 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2144 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2145 *ptr = NL; /* NULs are replaced by newlines! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2146 else if (c == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2147 *ptr = CAR; /* NLs are replaced by CRs! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2148 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2149 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2150 if (skip_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2151 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2152 *ptr = NUL; /* end of line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2153 len = (colnr_T) (ptr - line_start + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2154 if (ml_append(lnum, line_start, len, newfile) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2155 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2156 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2157 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2158 }
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2159 #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
2160 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
2161 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
2162 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2163 ++lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2164 if (--read_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2165 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2166 error = TRUE; /* break loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2167 line_start = ptr; /* nothing left to write */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2168 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2169 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2170 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2171 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2172 --skip_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2173 line_start = ptr + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2174 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2175 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2176 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2177 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2178 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2179 --ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2180 while (++ptr, --size >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2181 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2182 if ((c = *ptr) != NUL && c != NL) /* catch most common case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2183 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2184 if (c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2185 *ptr = NL; /* NULs are replaced by newlines! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2186 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2187 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2188 if (skip_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2189 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2190 *ptr = NUL; /* end of line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2191 len = (colnr_T)(ptr - line_start + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2192 if (fileformat == EOL_DOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2193 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2194 if (ptr[-1] == CAR) /* remove CR */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2195 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2196 ptr[-1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2197 --len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2198 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2199 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2200 * Reading in Dos format, but no CR-LF found!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2201 * When 'fileformats' includes "unix", delete all
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2202 * the lines read so far and start all over again.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2203 * Otherwise give an error message later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2204 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2205 else if (ff_error != EOL_DOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2206 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2207 if ( try_unix
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2208 && !read_stdin
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2209 && (read_buffer
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2210 || lseek(fd, (off_t)0L, SEEK_SET) == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2211 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2212 fileformat = EOL_UNIX;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2213 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2214 set_fileformat(EOL_UNIX, OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2215 file_rewind = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2216 keep_fileformat = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2217 goto retry;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2218 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2219 ff_error = EOL_DOS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2220 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2221 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2222 if (ml_append(lnum, line_start, len, newfile) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2223 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2224 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2225 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2226 }
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2227 #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
2228 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
2229 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
2230 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2231 ++lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2232 if (--read_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2233 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2234 error = TRUE; /* break loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2235 line_start = ptr; /* nothing left to write */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2236 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2237 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2238 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2239 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2240 --skip_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2241 line_start = ptr + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2242 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2243 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2244 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2245 linerest = (long)(ptr - line_start);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2246 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2247 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2248
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2249 failed:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2250 /* not an error, max. number of lines reached */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2251 if (error && read_count == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2252 error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2254 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2255 * If we get EOF in the middle of a line, note the fact and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2256 * complete the line ourselves.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2257 * In Dos format ignore a trailing CTRL-Z, unless 'binary' set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2258 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2259 if (!error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2260 && !got_int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2261 && linerest != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2262 && !(!curbuf->b_p_bin
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2263 && fileformat == EOL_DOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2264 && *line_start == Ctrl_Z
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2265 && ptr == line_start + 1))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2266 {
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2267 /* remember for when writing */
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2268 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2269 curbuf->b_p_eol = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2270 *ptr = NUL;
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2271 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
2272 if (ml_append(lnum, line_start, len, newfile) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2273 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2274 else
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2275 {
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2276 #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
2277 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
2278 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
2279 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2280 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
2281 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2283
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2284 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2285 save_file_ff(curbuf); /* remember the current file format */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2286
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2287 #ifdef FEAT_CRYPT
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2288 if (cryptkey != NULL)
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2289 {
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2290 crypt_pop_state();
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2291 if (cryptkey != curbuf->b_p_key)
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2292 free_crypt_key(cryptkey);
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2293 /* don't set cryptkey to NULL, it's used below as a flag that
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2294 * encryption was used */
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2295 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2296 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2297
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2298 #ifdef FEAT_MBYTE
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2299 /* If editing a new file: set 'fenc' for the current buffer.
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2300 * Also for ":read ++edit file". */
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2301 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2302 set_string_option_direct((char_u *)"fenc", -1, fenc,
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
2303 OPT_FREE|OPT_LOCAL, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2304 if (fenc_alloced)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2305 vim_free(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2306 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2307 if (iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2308 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2309 iconv_close(iconv_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2310 iconv_fd = (iconv_t)-1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2311 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2312 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2313 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2315 if (!read_buffer && !read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2316 close(fd); /* errors are ignored */
2003
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2317 #ifdef HAVE_FD_CLOEXEC
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2318 else
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2319 {
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2320 int fdflags = fcntl(fd, F_GETFD);
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2321 if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2322 fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2323 }
5d5cad78a838 updated for version 7.2-300
vimboss
parents: 2001
diff changeset
2324 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2325 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2326
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2327 #ifdef HAVE_DUP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2328 if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2329 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2330 /* Use stderr for stdin, makes shell commands work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2331 close(0);
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
2332 ignored = dup(2);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2333 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2334 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2335
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2336 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2337 if (tmpname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2338 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2339 mch_remove(tmpname); /* delete converted file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2340 vim_free(tmpname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2341 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2342 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2343 --no_wait_return; /* may wait for return now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2344
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2345 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2346 * In recovery mode everything but autocommands is skipped.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2347 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2348 if (!recoverymode)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2349 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2350 /* need to delete the last line, which comes from the empty buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2351 if (newfile && wasempty && !(curbuf->b_ml.ml_flags & ML_EMPTY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2352 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2353 #ifdef FEAT_NETBEANS_INTG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2354 netbeansFireChanges = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2355 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2356 ml_delete(curbuf->b_ml.ml_line_count, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2357 #ifdef FEAT_NETBEANS_INTG
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2358 netbeansFireChanges = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2359 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2360 --linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2361 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2362 linecnt = curbuf->b_ml.ml_line_count - linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2363 if (filesize == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2364 linecnt = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2365 if (newfile || read_buffer)
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2366 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2367 redraw_curbuf_later(NOT_VALID);
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2368 #ifdef FEAT_DIFF
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2369 /* After reading the text into the buffer the diff info needs to
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2370 * be updated. */
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2371 diff_invalidate(curbuf);
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2372 #endif
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2373 #ifdef FEAT_FOLDING
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2374 /* All folds in the window are invalid now. Mark them for update
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2375 * before triggering autocommands. */
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2376 foldUpdateAll(curwin);
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2377 #endif
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
2378 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2379 else if (linecnt) /* appended at least one line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2380 appended_lines_mark(from, linecnt);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2381
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2382 #ifndef ALWAYS_USE_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2383 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2384 * If we were reading from the same terminal as where messages go,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2385 * the screen will have been messed up.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2386 * Switch on raw mode now and clear the screen.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2387 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2388 if (read_stdin)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2389 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2390 settmode(TMODE_RAW); /* set to raw mode */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2391 starttermcap();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2392 screenclear();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2393 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2394 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2395
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2396 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2397 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2398 if (!(flags & READ_DUMMY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2399 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2400 filemess(curbuf, sfname, (char_u *)_(e_interr), 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2401 if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2402 curbuf->b_p_ro = TRUE; /* must use "w!" now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2403 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2404 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2405 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2406 check_marks_read();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2407 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2408 return OK; /* an interrupt isn't really an error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2409 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2410
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2411 if (!filtering && !(flags & READ_DUMMY))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2412 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2413 msg_add_fname(curbuf, sfname); /* fname in IObuff with quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2414 c = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2415
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2416 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2417 # ifdef S_ISFIFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2418 if (S_ISFIFO(perm)) /* fifo or socket */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2419 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2420 STRCAT(IObuff, _("[fifo/socket]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2421 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2422 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2423 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2424 # ifdef S_IFIFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2425 if ((perm & S_IFMT) == S_IFIFO) /* fifo */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2426 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2427 STRCAT(IObuff, _("[fifo]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2428 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2429 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2430 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2431 # ifdef S_IFSOCK
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2432 if ((perm & S_IFMT) == S_IFSOCK) /* or socket */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2433 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2434 STRCAT(IObuff, _("[socket]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2435 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2436 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2437 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2438 # endif
1313
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2439 # ifdef OPEN_CHR_FILES
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2440 if (S_ISCHR(perm)) /* or character special */
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2441 {
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2442 STRCAT(IObuff, _("[character special]"));
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2443 c = TRUE;
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2444 }
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2445 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2446 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2447 if (curbuf->b_p_ro)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2448 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2449 STRCAT(IObuff, shortmess(SHM_RO) ? _("[RO]") : _("[readonly]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2450 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2451 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2452 if (read_no_eol_lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2453 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2454 msg_add_eol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2455 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2456 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2457 if (ff_error == EOL_DOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2458 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2459 STRCAT(IObuff, _("[CR missing]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2460 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2461 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2462 if (split)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2463 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2464 STRCAT(IObuff, _("[long lines split]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2465 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2466 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2467 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2468 if (notconverted)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2469 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2470 STRCAT(IObuff, _("[NOT converted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2471 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2472 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2473 else if (converted)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2474 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2475 STRCAT(IObuff, _("[converted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2476 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2477 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2478 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2479 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2480 if (cryptkey != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2481 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2482 STRCAT(IObuff, _("[crypted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2483 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2484 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2485 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2486 #ifdef FEAT_MBYTE
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2487 if (conv_error != 0)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2488 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2489 sprintf((char *)IObuff + STRLEN(IObuff),
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2490 _("[CONVERSION ERROR in line %ld]"), (long)conv_error);
7
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 else if (illegal_byte > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2494 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2495 sprintf((char *)IObuff + STRLEN(IObuff),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2496 _("[ILLEGAL BYTE in line %ld]"), (long)illegal_byte);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2497 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2498 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2499 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2500 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2501 if (error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2502 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2503 STRCAT(IObuff, _("[READ ERRORS]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2504 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2505 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2506 if (msg_add_fileformat(fileformat))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2507 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2508 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2509 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
2510 msg_add_lines(c, (long)linecnt, filesize
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2511 - CRYPT_MAGIC_LEN
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2512 - crypt_salt_len[use_crypt_method]
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2513 - crypt_seed_len[use_crypt_method]);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2514 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2515 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2516 msg_add_lines(c, (long)linecnt, filesize);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2517
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2518 vim_free(keep_msg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2519 keep_msg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2520 msg_scrolled_ign = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2521 #ifdef ALWAYS_USE_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2522 /* Don't show the message when reading stdin, it would end up in a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2523 * message box (which might be shown when exiting!) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2524 if (read_stdin || read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2525 p = msg_may_trunc(FALSE, IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2526 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2527 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2528 p = msg_trunc_attr(IObuff, FALSE, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2529 if (read_stdin || read_buffer || restart_edit != 0
540
2df7f3a5eb96 updated for version 7.0153
vimboss
parents: 532
diff changeset
2530 || (msg_scrolled != 0 && !need_wait_return))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2531 /* Need to repeat the message after redrawing when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2532 * - When reading from stdin (the screen will be cleared next).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2533 * - When restart_edit is set (otherwise there will be a delay
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2534 * before redrawing).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2535 * - When the screen was scrolled but there is no wait-return
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2536 * prompt. */
679
e629de7618da updated for version 7.0203
vimboss
parents: 676
diff changeset
2537 set_keep_msg(p, 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2538 msg_scrolled_ign = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2539 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2540
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2541 /* with errors writing the file requires ":w!" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2542 if (newfile && (error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2543 #ifdef FEAT_MBYTE
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2544 || conv_error != 0
679
e629de7618da updated for version 7.0203
vimboss
parents: 676
diff changeset
2545 || (illegal_byte > 0 && bad_char_behavior != BAD_KEEP)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2546 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2547 ))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2548 curbuf->b_p_ro = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2549
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2550 u_clearline(); /* cannot use "U" command after adding lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2551
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2552 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2553 * In Ex mode: cursor at last new line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2554 * Otherwise: cursor at first new line.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2555 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2556 if (exmode_active)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2557 curwin->w_cursor.lnum = from + linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2558 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2559 curwin->w_cursor.lnum = from + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2560 check_cursor_lnum();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2561 beginline(BL_WHITE | BL_FIX); /* on first non-blank */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2562
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2563 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2564 * Set '[ and '] marks to the newly read lines.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2565 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2566 curbuf->b_op_start.lnum = from + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2567 curbuf->b_op_start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2568 curbuf->b_op_end.lnum = from + linecnt;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2569 curbuf->b_op_end.col = 0;
696
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2570
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2571 #ifdef WIN32
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2572 /*
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2573 * Work around a weird problem: When a file has two links (only
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2574 * 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
2575 * through the other link, the timestamp information may be wrong.
696
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2576 * It's correct again after reading the file, thus reset the timestamp
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2577 * here.
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2578 */
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2579 if (newfile && !read_stdin && !read_buffer
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2580 && mch_stat((char *)fname, &st) >= 0)
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2581 {
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2582 buf_store_time(curbuf, &st, fname);
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2583 curbuf->b_mtime_read = curbuf->b_mtime;
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2584 }
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
2585 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2586 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2587 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2588
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2589 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2590 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2591 * Get the marks before executing autocommands, so they can be used there.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2592 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2593 check_marks_read();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2594 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2595
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2596 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2597 * Trick: We remember if the last line of the read didn't have
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2598 * an eol for when writing it again. This is required for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2599 * ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2600 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2601 write_no_eol_lnum = read_no_eol_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2602
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2603 #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
2604 /*
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2605 * 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
2606 */
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2607 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
2608 {
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2609 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
2610
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2611 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
2612 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
2613 }
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2614 #endif
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
2615
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
2616 #ifdef FEAT_AUTOCMD
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2617 if (!read_stdin && !read_buffer)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2618 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2619 int m = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2620 int n = msg_scrolled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2621
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2622 /* Save the fileformat now, otherwise the buffer will be considered
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2623 * modified if the format/encoding was automatically detected. */
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2624 if (set_options)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2625 save_file_ff(curbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2626
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2627 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2628 * The output from the autocommands should not overwrite anything and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2629 * should not be overwritten: Set msg_scroll, restore its value if no
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2630 * output was done.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2631 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2632 msg_scroll = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2633 if (filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2634 apply_autocmds_exarg(EVENT_FILTERREADPOST, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2635 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2636 else if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2637 apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2638 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2639 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2640 apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2641 FALSE, NULL, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2642 if (msg_scrolled == n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2643 msg_scroll = m;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2644 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2645 if (aborting()) /* autocmds may abort script processing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2646 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2647 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2648 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2649 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2650
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2651 if (recoverymode && error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2652 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2653 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2654 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2655
1313
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2656 #ifdef OPEN_CHR_FILES
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2657 /*
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2658 * 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
2659 * which is the name of files used for process substitution output by
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2660 * some shells on some operating systems, e.g., bash on SunOS.
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2661 * Do not accept "/dev/fd/[012]", opening these may hang Vim.
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2662 */
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2663 static int
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2664 is_dev_fd_file(fname)
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2665 char_u *fname;
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2666 {
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2667 return (STRNCMP(fname, "/dev/fd/", 8) == 0
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2668 && VIM_ISDIGIT(fname[8])
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2669 && *skipdigits(fname + 9) == NUL
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2670 && (fname[9] != NUL
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2671 || (fname[8] != '0' && fname[8] != '1' && fname[8] != '2')));
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2672 }
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2673 #endif
dbd226be80b1 updated for version 7.1-027
vimboss
parents: 1303
diff changeset
2674
595
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2675 #ifdef FEAT_MBYTE
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2676
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2677 /*
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2678 * From the current line count and characters read after that, estimate the
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2679 * line number where we are now.
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2680 * Used for error messages that include a line number.
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2681 */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2682 static linenr_T
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2683 readfile_linenr(linecnt, p, endp)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2684 linenr_T linecnt; /* line count before reading more bytes */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2685 char_u *p; /* start of more bytes read */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2686 char_u *endp; /* end of more bytes read */
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2687 {
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2688 char_u *s;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2689 linenr_T lnum;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2690
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2691 lnum = curbuf->b_ml.ml_line_count - linecnt + 1;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2692 for (s = p; s < endp; ++s)
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2693 if (*s == '\n')
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2694 ++lnum;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2695 return lnum;
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2696 }
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2697 #endif
fea48f63efc8 updated for version 7.0169
vimboss
parents: 592
diff changeset
2698
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2699 /*
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2700 * Fill "*eap" to force the 'fileencoding', 'fileformat' and 'binary to be
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2701 * equal to the buffer "buf". Used for calling readfile().
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2702 * Returns OK or FAIL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2703 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2704 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2705 prep_exarg(eap, buf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2706 exarg_T *eap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2707 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2708 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2709 eap->cmd = alloc((unsigned)(STRLEN(buf->b_p_ff)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2710 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2711 + STRLEN(buf->b_p_fenc)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2712 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2713 + 15));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2714 if (eap->cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2715 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2716
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2717 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2718 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
2719 eap->force_enc = 14 + (int)STRLEN(buf->b_p_ff);
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2720 eap->bad_char = buf->b_bad_char;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2721 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2722 sprintf((char *)eap->cmd, "e ++ff=%s", buf->b_p_ff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2723 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2724 eap->force_ff = 7;
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2725
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2726 eap->force_bin = buf->b_p_bin ? FORCE_BIN : FORCE_NOBIN;
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
2727 eap->read_edit = FALSE;
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
2728 eap->forceit = FALSE;
7
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2732 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2733 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2734 * Find next fileencoding to use from 'fileencodings'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2735 * "pp" points to fenc_next. It's advanced to the next item.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2736 * 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
2737 * NULL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2738 * When *pp is not set to NULL, the result is in allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2739 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2740 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2741 next_fenc(pp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2742 char_u **pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2743 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2744 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2745 char_u *r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2746
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2747 if (**pp == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2748 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2749 *pp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2750 return (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2751 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2752 p = vim_strchr(*pp, ',');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2753 if (p == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2754 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2755 r = enc_canonize(*pp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2756 *pp += STRLEN(*pp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2757 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2758 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2759 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2760 r = vim_strnsave(*pp, (int)(p - *pp));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2761 *pp = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2762 if (r != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2763 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2764 p = enc_canonize(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2765 vim_free(r);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2766 r = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2767 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2768 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2769 if (r == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2770 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2771 r = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2772 *pp = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2773 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2774 return r;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2775 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2776
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2777 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2778 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2779 * Convert a file with the 'charconvert' expression.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2780 * This closes the file which is to be read, converts it and opens the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2781 * resulting file for reading.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2782 * Returns name of the resulting converted file (the caller should delete it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2783 * after reading it).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2784 * Returns NULL if the conversion failed ("*fdp" is not set) .
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2785 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2786 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2787 readfile_charconvert(fname, fenc, fdp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2788 char_u *fname; /* name of input file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2789 char_u *fenc; /* converted from */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2790 int *fdp; /* in/out: file descriptor of file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2791 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2792 char_u *tmpname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2793 char_u *errmsg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2794
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2795 tmpname = vim_tempname('r');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2796 if (tmpname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2797 errmsg = (char_u *)_("Can't find temp file for conversion");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2798 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2799 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2800 close(*fdp); /* close the input file, ignore errors */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2801 *fdp = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2802 if (eval_charconvert(fenc, enc_utf8 ? (char_u *)"utf-8" : p_enc,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2803 fname, tmpname) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2804 errmsg = (char_u *)_("Conversion with 'charconvert' failed");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2805 if (errmsg == NULL && (*fdp = mch_open((char *)tmpname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2806 O_RDONLY | O_EXTRA, 0)) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2807 errmsg = (char_u *)_("can't read output of 'charconvert'");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2808 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2809
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2810 if (errmsg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2811 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2812 /* Don't use emsg(), it breaks mappings, the retry with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2813 * another type of conversion might still work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2814 MSG(errmsg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2815 if (tmpname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2816 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2817 mch_remove(tmpname); /* delete converted file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2818 vim_free(tmpname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2819 tmpname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2820 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2821 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2822
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2823 /* If the input file is closed, open it (caller should check for error). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2824 if (*fdp < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2825 *fdp = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2826
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2827 return tmpname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2828 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2829 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2830
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2831 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2832
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2833 #ifdef FEAT_VIMINFO
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2834 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2835 * Read marks for the current buffer from the viminfo file, when we support
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2836 * buffer marks and the buffer has a name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2837 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2838 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2839 check_marks_read()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2840 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2841 if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2842 && curbuf->b_ffname != NULL)
1733
5a7384b9ca66 updated for version 7.2-031
vimboss
parents: 1723
diff changeset
2843 read_viminfo(NULL, VIF_WANT_MARKS);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2844
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2845 /* Always set b_marks_read; needed when 'viminfo' is changed to include
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2846 * the ' parameter after opening a buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2847 curbuf->b_marks_read = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2848 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2849 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2850
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2851 #if defined(FEAT_CRYPT) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2852 /*
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2853 * Get the crypt method used for a file from "ptr[len]", the magic text at the
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2854 * start of the file.
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2855 * Returns -1 when no encryption used.
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2856 */
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2857 static int
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
2858 crypt_method_from_magic(ptr, len)
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2859 char *ptr;
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2860 int len;
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2861 {
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2862 int i;
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2863
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2864 for (i = 0; i < (int)(sizeof(crypt_magic) / sizeof(crypt_magic[0])); i++)
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2865 {
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2866 if (len < (CRYPT_MAGIC_LEN + crypt_salt_len[i] + crypt_seed_len[i]))
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2867 continue;
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2868 if (memcmp(ptr, crypt_magic[i], CRYPT_MAGIC_LEN) == 0)
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2869 return i;
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2870 }
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
2871
2217
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2215
diff changeset
2872 i = (int)STRLEN(crypt_magic_head);
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
2873 if (len >= i && memcmp(ptr, crypt_magic_head, i) == 0)
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
2874 EMSG(_("E821: File is encrypted with unknown method"));
c493d6bfde09 A few more changes for encryption. Add test that encrypted file can be read.
Bram Moolenaar <bram@vim.org>
parents: 2180
diff changeset
2875
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2876 return -1;
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2877 }
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2878
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2879 /*
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2880 * Check for magic number used for encryption. Applies to the current buffer.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2881 * If found, the magic number is removed from ptr[*sizep] and *sizep and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2882 * *filesizep are updated.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2883 * Return the (new) encryption key, NULL for no encryption.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2884 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2885 static char_u *
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2886 check_for_cryptkey(cryptkey, ptr, sizep, filesizep, newfile, fname, did_ask)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2887 char_u *cryptkey; /* previous encryption key or NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2888 char_u *ptr; /* pointer to read bytes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2889 long *sizep; /* length of read bytes */
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
2890 off_t *filesizep; /* nr of bytes used from file */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2891 int newfile; /* editing a new buffer */
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2892 char_u *fname; /* file name to display */
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
2893 int *did_ask; /* flag: whether already asked for key */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2894 {
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
2895 int method = crypt_method_from_magic((char *)ptr, *sizep);
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2896
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2897 if (method >= 0)
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2898 {
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
2899 set_crypt_method(curbuf, method);
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2900 if (method > 0)
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2901 (void)blowfish_self_test();
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
2902 if (cryptkey == NULL && !*did_ask)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2903 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2904 if (*curbuf->b_p_key)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2905 cryptkey = curbuf->b_p_key;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2906 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2907 {
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2908 /* 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
2909 * 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
2910 * 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
2911 * Happens when retrying to detect encoding. */
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2912 smsg((char_u *)_(need_key_msg), fname);
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2913 msg_scroll = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2914 cryptkey = get_crypt_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
2915 *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
2916
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2917 /* check if empty key entered */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2918 if (cryptkey != NULL && *cryptkey == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2919 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2920 if (cryptkey != curbuf->b_p_key)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2921 vim_free(cryptkey);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2922 cryptkey = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2923 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2924 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2925 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2926
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2927 if (cryptkey != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2928 {
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2929 int seed_len = crypt_seed_len[method];
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2930 int salt_len = crypt_salt_len[method];
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2931
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2932 crypt_push_state();
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2933 use_crypt_method = method;
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2934 if (method == 0)
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2935 crypt_init_keys(cryptkey);
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2936 else
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2937 {
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2938 bf_key_init(cryptkey, ptr + CRYPT_MAGIC_LEN, salt_len);
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2939 bf_ofb_init(ptr + CRYPT_MAGIC_LEN + salt_len, seed_len);
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2940 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2941
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2942 /* Remove magic number from the text */
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2943 *filesizep += CRYPT_MAGIC_LEN + salt_len + seed_len;
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2944 *sizep -= CRYPT_MAGIC_LEN + salt_len + seed_len;
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2945 mch_memmove(ptr, ptr + CRYPT_MAGIC_LEN + salt_len + seed_len,
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2946 (size_t)*sizep);
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2947 }
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2948 }
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
2949 /* 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
2950 * the 'key' option, except when starting up (called with -x argument) */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2951 else if (newfile && *curbuf->b_p_key && !starting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2952 set_option_value((char_u *)"key", 0L, (char_u *)"", OPT_LOCAL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2953
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2954 return cryptkey;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
2955 }
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2956
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2957 /*
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2958 * Check for magic number used for encryption. Applies to the current buffer.
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2959 * If found and decryption is possible returns OK;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2960 */
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2961 int
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2962 prepare_crypt_read(fp)
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2963 FILE *fp;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2964 {
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2965 int method;
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2966 char_u buffer[CRYPT_MAGIC_LEN + CRYPT_SALT_LEN_MAX
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2967 + CRYPT_SEED_LEN_MAX + 2];
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2968
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2969 if (fread(buffer, CRYPT_MAGIC_LEN, 1, fp) != 1)
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2970 return FAIL;
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
2971 method = crypt_method_from_magic((char *)buffer,
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2972 CRYPT_MAGIC_LEN +
2311
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2281
diff changeset
2973 CRYPT_SEED_LEN_MAX +
ccda151dde4e Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents: 2281
diff changeset
2974 CRYPT_SALT_LEN_MAX);
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
2975 if (method < 0 || method != get_crypt_method(curbuf))
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2976 return FAIL;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2977
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2978 crypt_push_state();
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2979 if (method == 0)
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2980 crypt_init_keys(curbuf->b_p_key);
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2981 else
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2982 {
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2983 int salt_len = crypt_salt_len[method];
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2984 int seed_len = crypt_seed_len[method];
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2985
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2986 if (fread(buffer, salt_len + seed_len, 1, fp) != 1)
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2987 return FAIL;
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2988 bf_key_init(curbuf->b_p_key, buffer, salt_len);
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
2989 bf_ofb_init(buffer + salt_len, seed_len);
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2990 }
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2991 return OK;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2992 }
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2993
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2994 /*
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2995 * Prepare for writing encrypted bytes for buffer "buf".
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2996 * Returns a pointer to an allocated header of length "*lenp".
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2997 * When out of memory returns NULL.
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
2998 * Otherwise calls crypt_push_state(), call crypt_pop_state() later.
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
2999 */
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3000 char_u *
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3001 prepare_crypt_write(buf, lenp)
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3002 buf_T *buf;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3003 int *lenp;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3004 {
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3005 char_u *header;
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
3006 int seed_len = crypt_seed_len[get_crypt_method(buf)];
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
3007 int salt_len = crypt_salt_len[get_crypt_method(buf)];
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3008 char_u *salt;
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3009 char_u *seed;
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3010
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3011 header = alloc_clear(CRYPT_MAGIC_LEN + CRYPT_SALT_LEN_MAX
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3012 + CRYPT_SEED_LEN_MAX + 2);
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3013 if (header != NULL)
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3014 {
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
3015 crypt_push_state();
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
3016 use_crypt_method = get_crypt_method(buf); /* select zip or blowfish */
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3017 vim_strncpy(header, (char_u *)crypt_magic[use_crypt_method],
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3018 CRYPT_MAGIC_LEN);
2360
d8e4b27cef80 Change 'cryptmethod' from a number to a string option. Make it global-local.
Bram Moolenaar <bram@vim.org>
parents: 2311
diff changeset
3019 if (use_crypt_method == 0)
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3020 crypt_init_keys(buf->b_p_key);
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3021 else
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3022 {
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3023 /* Using blowfish, add salt and seed. */
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3024 salt = header + CRYPT_MAGIC_LEN;
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3025 seed = salt + salt_len;
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3026 sha2_seed(salt, salt_len, seed, seed_len);
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3027 bf_key_init(buf->b_p_key, salt, salt_len);
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3028 bf_ofb_init(seed, seed_len);
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3029 }
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3030 }
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3031 *lenp = CRYPT_MAGIC_LEN + salt_len + seed_len;
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3032 return header;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3033 }
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
3034
2265
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3035 #endif /* FEAT_CRYPT */
b7cb69ab616d Added salt to blowfish encryption.
Bram Moolenaar <bram@vim.org>
parents: 2261
diff changeset
3036
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3037 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3038 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3039 set_file_time(fname, atime, mtime)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3040 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3041 time_t atime; /* access time */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3042 time_t mtime; /* modification time */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3044 # if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3045 struct utimbuf buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3046
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3047 buf.actime = atime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3048 buf.modtime = mtime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3049 (void)utime((char *)fname, &buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3050 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3051 # if defined(HAVE_UTIMES)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3052 struct timeval tvp[2];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3053
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3054 tvp[0].tv_sec = atime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3055 tvp[0].tv_usec = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3056 tvp[1].tv_sec = mtime;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3057 tvp[1].tv_usec = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3058 # ifdef NeXT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3059 (void)utimes((char *)fname, tvp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3060 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3061 (void)utimes((char *)fname, (const struct timeval *)&tvp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3062 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3063 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3064 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3065 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3066 #endif /* UNIX */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3067
22
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3068 #if defined(VMS) && !defined(MIN)
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3069 /* Older DECC compiler for VAX doesn't define MIN() */
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3070 # define MIN(a, b) ((a) < (b) ? (a) : (b))
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3071 #endif
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
3072
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3073 /*
1303
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3074 * 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
3075 */
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3076 int
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3077 check_file_readonly(fname, perm)
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3078 char_u *fname; /* full path to file */
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3079 int perm; /* known permissions on file */
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3080 {
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3081 #ifndef USE_MCH_ACCESS
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3082 int fd = 0;
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3083 #endif
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3084
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3085 return (
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3086 #ifdef USE_MCH_ACCESS
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3087 # ifdef UNIX
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3088 (perm & 0222) == 0 ||
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3089 # endif
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3090 mch_access((char *)fname, W_OK)
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3091 #else
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3092 (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3093 ? TRUE : (close(fd), FALSE)
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3094 #endif
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3095 );
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
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3098
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3099 /*
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3100 * buf_write() - write to file "fname" lines "start" through "end"
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3101 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3102 * We do our own buffering here because fwrite() is so slow.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3103 *
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3104 * If "forceit" is true, we don't care for errors when attempting backups.
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3105 * 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
3106 * file. But when "forceit" is TRUE, we risk losing it.
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3107 *
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3108 * When "reset_changed" is TRUE and "append" == FALSE and "start" == 1 and
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3109 * "end" == curbuf->b_ml.ml_line_count, reset curbuf->b_changed.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3110 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3111 * This function must NOT use NameBuff (because it's called by autowrite()).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3112 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3113 * return FAIL for failure, OK otherwise
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3114 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3115 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3116 buf_write(buf, fname, sfname, start, end, eap, append, forceit,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3117 reset_changed, filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3118 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3119 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3120 char_u *sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3121 linenr_T start, end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3122 exarg_T *eap; /* for forced 'ff' and 'fenc', can be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3123 NULL! */
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3124 int append; /* append to the file */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3125 int forceit;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3126 int reset_changed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3127 int filtering;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3128 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3129 int fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3130 char_u *backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3131 int backup_copy = FALSE; /* copy the original file? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3132 int dobackup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3133 char_u *ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3134 char_u *wfname = NULL; /* name of file to write to */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3135 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3136 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3137 char_u c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3138 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3139 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3140 long nchars;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3141 char_u *errmsg = NULL;
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
3142 int errmsg_allocated = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3143 char_u *errnum = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3144 char_u *buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3145 char_u smallbuf[SMBUFSIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3146 char_u *backup_ext;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3147 int bufsize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3148 long perm; /* file permissions */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3149 int retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3150 int newfile = FALSE; /* TRUE if file doesn't exist yet */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3151 int msg_save = msg_scroll;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3152 int overwriting; /* TRUE if writing over original */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3153 int no_eol = FALSE; /* no end-of-line written */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3154 int device = FALSE; /* writing to a device */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3155 struct stat st_old;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3156 int prev_got_int = got_int;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3157 int file_readonly = FALSE; /* overwritten file is read-only */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3158 static char *err_readonly = "is read-only (cannot override: \"W\" in 'cpoptions')";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3159 #if defined(UNIX) || defined(__EMX__XX) /*XXX fix me sometime? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3160 int made_writable = FALSE; /* 'w' bit has been set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3161 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3162 /* writing everything */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3163 int whole = (start == 1 && end == buf->b_ml.ml_line_count);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3164 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3165 linenr_T old_line_count = buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3166 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3167 int attr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3168 int fileformat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3169 int write_bin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3170 struct bw_info write_info; /* info for buf_write_bytes() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3171 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3172 int converted = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3173 int notconverted = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3174 char_u *fenc; /* effective 'fileencoding' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3175 char_u *fenc_tofree = NULL; /* allocated "fenc" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3176 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3177 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3178 int wb_flags = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3179 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3180 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3181 vim_acl_T acl = NULL; /* ACL copied from original file to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3182 backup or new file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3183 #endif
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
3184 #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
3185 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
3186 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
3187 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3188
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3189 if (fname == NULL || *fname == NUL) /* safety check */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3190 return FAIL;
2028
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3191 if (buf->b_ml.ml_mfp == NULL)
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3192 {
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3193 /* 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
3194 * vimrc file. */
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3195 EMSG(_(e_emptybuf));
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3196 return FAIL;
be1d64f82db2 updated for version 7.2-325
vimboss
parents: 2014
diff changeset
3197 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3198
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3199 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3200 * Disallow writing from .exrc and .vimrc in current directory for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3201 * security reasons.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3202 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3203 if (check_secure())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3204 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3205
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3206 /* Avoid a crash for a long name. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3207 if (STRLEN(fname) >= MAXPATHL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3208 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3209 EMSG(_(e_longname));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3210 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3211 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3212
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3213 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3214 /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3215 write_info.bw_conv_buf = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3216 write_info.bw_conv_error = FALSE;
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
3217 write_info.bw_conv_error_lnum = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3218 write_info.bw_restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3219 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3220 write_info.bw_iconv_fd = (iconv_t)-1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3221 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3222 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3223
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3224 /* After writing a file changedtick changes but we don't want to display
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3225 * the line. */
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3226 ex_no_reprint = TRUE;
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
3227
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3228 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3229 * If there is no file name yet, use the one for the written file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3230 * BF_NOTEDITED is set to reflect this (in case the write fails).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3231 * Don't do this when the write is for a filter command.
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3232 * Don't do this when appending.
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3233 * Only do this when 'cpoptions' contains the 'F' flag.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3234 */
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
3235 if (buf->b_ffname == NULL
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
3236 && reset_changed
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3237 && whole
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3238 && buf == curbuf
236
4707450c2b33 updated for version 7.0066
vimboss
parents: 216
diff changeset
3239 #ifdef FEAT_QUICKFIX
4707450c2b33 updated for version 7.0066
vimboss
parents: 216
diff changeset
3240 && !bt_nofile(buf)
4707450c2b33 updated for version 7.0066
vimboss
parents: 216
diff changeset
3241 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3242 && !filtering
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3243 && (!append || vim_strchr(p_cpo, CPO_FNAMEAPP) != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3244 && vim_strchr(p_cpo, CPO_FNAMEW) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3245 {
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
3246 if (set_rw_fname(fname, sfname) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3247 return FAIL;
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
3248 buf = curbuf; /* just in case autocmds made "buf" invalid */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3249 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3250
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3251 if (sfname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3252 sfname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3253 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3254 * For Unix: Use the short file name whenever possible.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3255 * Avoids problems with networks and when directory names are changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3256 * 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
3257 * another directory, which we don't detect
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3258 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3259 ffname = fname; /* remember full fname */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3260 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3261 fname = sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3262 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3263
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3264 if (buf->b_ffname != NULL && fnamecmp(ffname, buf->b_ffname) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3265 overwriting = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3266 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3267 overwriting = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3268
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3269 if (exiting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3270 settmode(TMODE_COOK); /* when exiting allow typahead now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3271
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3272 ++no_wait_return; /* don't wait for return yet */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3273
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3274 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3275 * Set '[ and '] marks to the lines to be written.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3276 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3277 buf->b_op_start.lnum = start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3278 buf->b_op_start.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3279 buf->b_op_end.lnum = end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3280 buf->b_op_end.col = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3281
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3282 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3283 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3284 aco_save_T aco;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3285 int buf_ffname = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3286 int buf_sfname = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3287 int buf_fname_f = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3288 int buf_fname_s = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3289 int did_cmd = FALSE;
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3290 int nofile_err = FALSE;
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
3291 int empty_memline = (buf->b_ml.ml_mfp == NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3292
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3293 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3294 * Apply PRE aucocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3295 * Set curbuf to the buffer to be written.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3296 * Careful: The autocommands may call buf_write() recursively!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3297 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3298 if (ffname == buf->b_ffname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3299 buf_ffname = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3300 if (sfname == buf->b_sfname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3301 buf_sfname = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3302 if (fname == buf->b_ffname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3303 buf_fname_f = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3304 if (fname == buf->b_sfname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3305 buf_fname_s = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3306
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3307 /* set curwin/curbuf to buf and save a few things */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3308 aucmd_prepbuf(&aco, buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3309
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3310 if (append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3311 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3312 if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEAPPENDCMD,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3313 sfname, sfname, FALSE, curbuf, eap)))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3314 {
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3315 #ifdef FEAT_QUICKFIX
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
3316 if (overwriting && bt_nofile(curbuf))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3317 nofile_err = TRUE;
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3318 else
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3319 #endif
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3320 apply_autocmds_exarg(EVENT_FILEAPPENDPRE,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3321 sfname, sfname, FALSE, curbuf, eap);
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3322 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3323 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3324 else if (filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3325 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3326 apply_autocmds_exarg(EVENT_FILTERWRITEPRE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3327 NULL, sfname, FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3328 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3329 else if (reset_changed && whole)
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_BUFWRITECMD,
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
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
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_BUFWRITEPRE,
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3344 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3345 if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEWRITECMD,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3346 sfname, sfname, FALSE, curbuf, eap)))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3347 {
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3348 #ifdef FEAT_QUICKFIX
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
3349 if (overwriting && bt_nofile(curbuf))
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3350 nofile_err = TRUE;
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3351 else
635
23a639c430c5 updated for version 7.0184
vimboss
parents: 633
diff changeset
3352 #endif
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3353 apply_autocmds_exarg(EVENT_FILEWRITEPRE,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3354 sfname, sfname, FALSE, curbuf, eap);
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3355 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3356 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3357
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3358 /* restore curwin/curbuf and a few other things */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3359 aucmd_restbuf(&aco);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3360
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3361 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3362 * In three situations we return here and don't write the file:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3363 * 1. the autocommands deleted or unloaded the buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3364 * 2. The autocommands abort script processing.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3365 * 3. If one of the "Cmd" autocommands was executed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3366 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3367 if (!buf_valid(buf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3368 buf = NULL;
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
3369 if (buf == NULL || (buf->b_ml.ml_mfp == NULL && !empty_memline)
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3370 || did_cmd || nofile_err
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3371 #ifdef FEAT_EVAL
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3372 || aborting()
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3373 #endif
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
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 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3377 msg_scroll = msg_save;
17
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3378 if (nofile_err)
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3379 EMSG(_("E676: No matching autocommands for acwrite buffer"));
9be87deaeb52 updated for version 7.0009
vimboss
parents: 12
diff changeset
3380
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3381 if (nofile_err
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3382 #ifdef FEAT_EVAL
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3383 || aborting()
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3384 #endif
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
3385 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3386 /* An aborting error, interrupt or exception in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3387 * autocommands. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3388 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3389 if (did_cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3390 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3391 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3392 /* The buffer was deleted. We assume it was written
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3393 * (can't retry anyway). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3394 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3395 if (overwriting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3396 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3397 /* Assume the buffer was written, update the timestamp. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3398 ml_timestamp(buf);
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3399 if (append)
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3400 buf->b_flags &= ~BF_NEW;
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3401 else
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3402 buf->b_flags &= ~BF_WRITE_MASK;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3403 }
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
3404 if (reset_changed && buf->b_changed && !append
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
3405 && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3406 /* Buffer still changed, the autocommands didn't work
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3407 * properly. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3408 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3409 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3410 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3411 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3412 if (!aborting())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3413 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3414 EMSG(_("E203: Autocommands deleted or unloaded buffer to be written"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3415 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3416 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3417
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3418 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3419 * The autocommands may have changed the number of lines in the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3420 * When writing the whole file, adjust the end.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3421 * When writing part of the file, assume that the autocommands only
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3422 * changed the number of lines that are to be written (tricky!).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3423 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3424 if (buf->b_ml.ml_line_count != old_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3425 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3426 if (whole) /* write all */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3427 end = buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3428 else if (buf->b_ml.ml_line_count > old_line_count) /* more lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3429 end += buf->b_ml.ml_line_count - old_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3430 else /* less lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3431 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3432 end -= old_line_count - buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3433 if (end < start)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3434 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3435 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3436 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3437 EMSG(_("E204: Autocommand changed number of lines in unexpected way"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3438 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3439 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3440 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3441 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3442
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3443 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3444 * The autocommands may have changed the name of the buffer, which may
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3445 * be kept in fname, ffname and sfname.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3446 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3447 if (buf_ffname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3448 ffname = buf->b_ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3449 if (buf_sfname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3450 sfname = buf->b_sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3451 if (buf_fname_f)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3452 fname = buf->b_ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3453 if (buf_fname_s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3454 fname = buf->b_sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3455 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3456 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3457
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3458 #ifdef FEAT_NETBEANS_INTG
2210
8c6a66e2b3cc Add :nbstart and :nbclose.
Bram Moolenaar <bram@vim.org>
parents: 2204
diff changeset
3459 if (netbeans_active() && isNetbeansBuffer(buf))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3460 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3461 if (whole)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3462 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3463 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3464 * b_changed can be 0 after an undo, but we still need to write
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3465 * the buffer to NetBeans.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3466 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3467 if (buf->b_changed || isNetbeansModified(buf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3468 {
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
3469 --no_wait_return; /* may wait for return now */
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
3470 msg_scroll = msg_save;
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
3471 netbeans_save_buffer(buf); /* no error checking... */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3472 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3473 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3474 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3475 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3476 errnum = (char_u *)"E656: ";
1653
d166fe2bfe74 updated for version 7.2a-005
vimboss
parents: 1651
diff changeset
3477 errmsg = (char_u *)_("NetBeans disallows writes of unmodified buffers");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3478 buffer = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3479 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3480 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3481 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3482 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3483 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3484 errnum = (char_u *)"E657: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3485 errmsg = (char_u *)_("Partial writes disallowed for NetBeans buffers");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3486 buffer = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3487 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3488 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3489 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3490 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3491
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3492 if (shortmess(SHM_OVER) && !exiting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3493 msg_scroll = FALSE; /* overwrite previous file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3494 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3495 msg_scroll = TRUE; /* don't overwrite previous file message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3496 if (!filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3497 filemess(buf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3498 #ifndef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3499 sfname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3500 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3501 fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3502 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3503 (char_u *)"", 0); /* show that we are busy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3504 msg_scroll = FALSE; /* always overwrite the file message now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3505
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3506 buffer = alloc(BUFSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3507 if (buffer == NULL) /* can't allocate big buffer, use small
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3508 * one (to be able to write when out of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3509 * memory) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3510 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3511 buffer = smallbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3512 bufsize = SMBUFSIZE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3513 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3514 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3515 bufsize = BUFSIZE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3516
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3517 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3518 * Get information about original file (if there is one).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3519 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3520 #if defined(UNIX) && !defined(ARCHIE)
1438
c7654c4db8fd updated for version 7.1-153
vimboss
parents: 1431
diff changeset
3521 st_old.st_dev = 0;
c7654c4db8fd updated for version 7.1-153
vimboss
parents: 1431
diff changeset
3522 st_old.st_ino = 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3523 perm = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3524 if (mch_stat((char *)fname, &st_old) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3525 newfile = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3526 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3527 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3528 perm = st_old.st_mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3529 if (!S_ISREG(st_old.st_mode)) /* not a file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3530 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3531 if (S_ISDIR(st_old.st_mode))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3532 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3533 errnum = (char_u *)"E502: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3534 errmsg = (char_u *)_("is a directory");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3535 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3536 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3537 if (mch_nodetype(fname) != NODE_WRITABLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3538 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3539 errnum = (char_u *)"E503: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3540 errmsg = (char_u *)_("is not a file or writable device");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3541 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3542 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3543 /* 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
3544 * but for which we can't make a backup. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3545 device = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3546 newfile = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3547 perm = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3548 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3549 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3550 #else /* !UNIX */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3551 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3552 * Check for a writable device name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3553 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3554 c = mch_nodetype(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3555 if (c == NODE_OTHER)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3556 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3557 errnum = (char_u *)"E503: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3558 errmsg = (char_u *)_("is not a file or writable device");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3559 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3560 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3561 if (c == NODE_WRITABLE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3562 {
1004
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3563 # if defined(MSDOS) || defined(MSWIN) || defined(OS2)
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3564 /* MS-Windows allows opening a device, but we will probably get stuck
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3565 * trying to write to it. */
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3566 if (!p_odev)
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3567 {
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3568 errnum = (char_u *)"E796: ";
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3569 errmsg = (char_u *)_("writing to device disabled with 'opendevice' option");
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3570 goto fail;
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3571 }
09d0e83c29b8 updated for version 7.0-130
vimboss
parents: 978
diff changeset
3572 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3573 device = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3574 newfile = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3575 perm = -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3576 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3577 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3578 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3579 perm = mch_getperm(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3580 if (perm < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3581 newfile = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3582 else if (mch_isdir(fname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3583 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3584 errnum = (char_u *)"E502: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3585 errmsg = (char_u *)_("is a directory");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3586 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3587 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3588 if (overwriting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3589 (void)mch_stat((char *)fname, &st_old);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3590 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3591 #endif /* !UNIX */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3592
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3593 if (!device && !newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3594 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3595 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3596 * Check if the file is really writable (when renaming the file to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3597 * make a backup we won't discover it later).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3598 */
1303
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3599 file_readonly = check_file_readonly(fname, (int)perm);
da0991871b02 updated for version 7.1-017
vimboss
parents: 1201
diff changeset
3600
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3601 if (!forceit && file_readonly)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3602 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3603 if (vim_strchr(p_cpo, CPO_FWRITE) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3604 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3605 errnum = (char_u *)"E504: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3606 errmsg = (char_u *)_(err_readonly);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3607 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3608 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3609 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3610 errnum = (char_u *)"E505: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3611 errmsg = (char_u *)_("is read-only (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3612 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3613 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3614 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3615
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3616 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3617 * Check if the timestamp hasn't changed since reading the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3618 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3619 if (overwriting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3620 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3621 retval = check_mtime(buf, &st_old);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3622 if (retval == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3623 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3624 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3625 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3626
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3627 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3628 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3629 * For systems that support ACL: get the ACL from the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3630 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3631 if (!newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3632 acl = mch_get_acl(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3633 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3634
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3635 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3636 * If 'backupskip' is not empty, don't make a backup for some files.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3637 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3638 dobackup = (p_wb || p_bk || *p_pm != NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3639 #ifdef FEAT_WILDIGN
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3640 if (dobackup && *p_bsk != NUL && match_file_list(p_bsk, sfname, ffname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3641 dobackup = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3642 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3643
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3644 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3645 * 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
3646 * interruption cancel writing, only hitting CTRL-C while writing should
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3647 * abort it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3648 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3649 prev_got_int = got_int;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3650 got_int = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3651
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3652 /* Mark the buffer as 'being saved' to prevent changed buffer warnings */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3653 buf->b_saving = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3654
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3655 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3656 * If we are not appending or filtering, the file exists, and the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3657 * 'writebackup', 'backup' or 'patchmode' option is set, need a backup.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3658 * When 'patchmode' is set also make a backup when appending.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3659 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3660 * Do not make any backup, if 'writebackup' and 'backup' are both switched
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3661 * off. This helps when editing large files on almost-full disks.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3662 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3663 if (!(append && *p_pm == NUL) && !filtering && perm >= 0 && dobackup)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3664 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3665 #if defined(UNIX) || defined(WIN32)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3666 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3667 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3668
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3669 if ((bkc_flags & BKC_YES) || append) /* "yes" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3670 backup_copy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3671 #if defined(UNIX) || defined(WIN32)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3672 else if ((bkc_flags & BKC_AUTO)) /* "auto" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3673 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3674 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3675
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3676 # ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3677 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3678 * Don't rename the file when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3679 * - it's a hard link
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3680 * - it's a symbolic link
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3681 * - we don't have write permission in the directory
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3682 * - we can't set the owner/group of the new file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3683 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3684 if (st_old.st_nlink > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3685 || mch_lstat((char *)fname, &st) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3686 || st.st_dev != st_old.st_dev
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3687 || st.st_ino != st_old.st_ino
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3688 # ifndef HAVE_FCHOWN
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3689 || st.st_uid != st_old.st_uid
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3690 || st.st_gid != st_old.st_gid
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3691 # endif
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3692 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3693 backup_copy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3694 else
696
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3695 # else
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3696 # ifdef WIN32
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3697 /* On NTFS file systems hard links are possible. */
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3698 if (mch_is_linked(fname))
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3699 backup_copy = TRUE;
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3700 else
f0a9ef4db025 updated for version 7.0210
vimboss
parents: 694
diff changeset
3701 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3702 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3703 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3704 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3705 * Check if we can create a file and set the owner/group to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3706 * the ones from the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3707 * First find a file name that doesn't exist yet (use some
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3708 * arbitrary numbers).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3709 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3710 STRCPY(IObuff, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3711 for (i = 4913; ; i += 123)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3712 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3713 sprintf((char *)gettail(IObuff), "%d", i);
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3714 if (mch_lstat((char *)IObuff, &st) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3715 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3716 }
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3717 fd = mch_open((char *)IObuff,
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3718 O_CREAT|O_WRONLY|O_EXCL|O_NOFOLLOW, perm);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3719 if (fd < 0) /* can't write in directory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3720 backup_copy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3721 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3722 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3723 # ifdef UNIX
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3724 # ifdef HAVE_FCHOWN
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
3725 ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3726 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3727 if (mch_stat((char *)IObuff, &st) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3728 || st.st_uid != st_old.st_uid
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3729 || st.st_gid != st_old.st_gid
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
3730 || (long)st.st_mode != perm)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3731 backup_copy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3732 # endif
567
afd8e69dba19 updated for version 7.0161
vimboss
parents: 557
diff changeset
3733 /* Close the file before removing it, on MS-Windows we
afd8e69dba19 updated for version 7.0161
vimboss
parents: 557
diff changeset
3734 * can't delete an open file. */
afd8e69dba19 updated for version 7.0161
vimboss
parents: 557
diff changeset
3735 close(fd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3736 mch_remove(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3737 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3738 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3739 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3740
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3741 # ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3742 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3743 * Break symlinks and/or hardlinks if we've been asked to.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3744 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3745 if ((bkc_flags & BKC_BREAKSYMLINK) || (bkc_flags & BKC_BREAKHARDLINK))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3746 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3747 int lstat_res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3748
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3749 lstat_res = mch_lstat((char *)fname, &st);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3750
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3751 /* Symlinks. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3752 if ((bkc_flags & BKC_BREAKSYMLINK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3753 && lstat_res == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3754 && st.st_ino != st_old.st_ino)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3755 backup_copy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3756
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3757 /* Hardlinks. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3758 if ((bkc_flags & BKC_BREAKHARDLINK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3759 && st_old.st_nlink > 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3760 && (lstat_res != 0 || st.st_ino == st_old.st_ino))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3761 backup_copy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3762 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3763 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3764
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3765 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3766
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3767 /* make sure we have a valid backup extension to use */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3768 if (*p_bex == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3769 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3770 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3771 backup_ext = (char_u *)"/bak";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3772 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3773 backup_ext = (char_u *)".bak";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3774 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3775 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3776 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3777 backup_ext = p_bex;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3778
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3779 if (backup_copy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3780 && (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3781 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3782 int bfd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3783 char_u *copybuf, *wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3784 int some_error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3785 struct stat st_new;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3786 char_u *dirp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3787 char_u *rootname;
344
7033303ea0c0 updated for version 7.0089
vimboss
parents: 311
diff changeset
3788 #if defined(UNIX) && !defined(SHORT_FNAME)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3789 int did_set_shortname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3790 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3791
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3792 copybuf = alloc(BUFSIZE + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3793 if (copybuf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3794 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3795 some_error = TRUE; /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3796 goto nobackup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3797 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3798
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3799 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3800 * Try to make the backup in each directory in the 'bdir' option.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3801 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3802 * Unix semantics has it, that we may have a writable file,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3803 * that cannot be recreated with a simple open(..., O_CREAT, ) e.g:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3804 * - the directory is not writable,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3805 * - the file may be a symbolic link,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3806 * - the file may belong to another user/group, etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3807 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3808 * For these reasons, the existing writable file must be truncated
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3809 * and reused. Creation of a backup COPY will be attempted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3810 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3811 dirp = p_bdir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3812 while (*dirp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3813 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3814 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3815 st_new.st_ino = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3816 st_new.st_dev = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3817 st_new.st_gid = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3818 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3819
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3820 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3821 * Isolate one directory name, using an entry in 'bdir'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3822 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3823 (void)copy_option_part(&dirp, copybuf, BUFSIZE, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3824 rootname = get_file_in_dir(fname, copybuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3825 if (rootname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3826 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3827 some_error = TRUE; /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3828 goto nobackup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3829 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3830
344
7033303ea0c0 updated for version 7.0089
vimboss
parents: 311
diff changeset
3831 #if defined(UNIX) && !defined(SHORT_FNAME)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3832 did_set_shortname = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3833 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3834
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3835 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3836 * May try twice if 'shortname' not set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3837 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3838 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3839 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3840 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3841 * Make backup file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3842 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3843 backup = buf_modname(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3844 #ifdef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3845 TRUE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3846 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3847 (buf->b_p_sn || buf->b_shortname),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3848 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3849 rootname, backup_ext, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3850 if (backup == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3851 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3852 vim_free(rootname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3853 some_error = TRUE; /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3854 goto nobackup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3855 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3856
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3857 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3858 * Check if backup file already exists.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3859 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3860 if (mch_stat((char *)backup, &st_new) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3861 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3862 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3863 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3864 * Check if backup file is same as original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3865 * May happen when modname() gave the same file back.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3866 * E.g. silly link, or file name-length reached.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3867 * If we don't check here, we either ruin the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3868 * when copying or erase it after writing. jw.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3869 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3870 if (st_new.st_dev == st_old.st_dev
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3871 && st_new.st_ino == st_old.st_ino)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3872 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3873 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3874 backup = NULL; /* no backup file to delete */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3875 # ifndef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3876 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3877 * may try again with 'shortname' set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3878 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3879 if (!(buf->b_shortname || buf->b_p_sn))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3880 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3881 buf->b_shortname = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3882 did_set_shortname = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3883 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3884 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3885 /* setting shortname didn't help */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3886 if (did_set_shortname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3887 buf->b_shortname = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3888 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3889 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3890 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3891 #endif
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 * If we are not going to keep the backup file, don't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3895 * delete an existing one, try to use another name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3896 * Change one character, just before the extension.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3897 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3898 if (!p_bk)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3899 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3900 wp = backup + STRLEN(backup) - 1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3901 - STRLEN(backup_ext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3902 if (wp < backup) /* empty file name ??? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3903 wp = backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3904 *wp = 'z';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3905 while (*wp > 'a'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3906 && mch_stat((char *)backup, &st_new) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3907 --*wp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3908 /* They all exist??? Must be something wrong. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3909 if (*wp == 'a')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3910 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3911 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3912 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3913 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3914 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3915 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3916 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3917 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3918 vim_free(rootname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3919
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3920 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3921 * Try to create the backup file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3922 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3923 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3924 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3925 /* remove old backup, if present */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3926 mch_remove(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3927 /* Open with O_EXCL to avoid the file being created while
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3928 * we were sleeping (symlink hacker attack?) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3929 bfd = mch_open((char *)backup,
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3930 O_WRONLY|O_CREAT|O_EXTRA|O_EXCL|O_NOFOLLOW,
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3931 perm & 0777);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3932 if (bfd < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3933 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3934 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3935 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3936 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3937 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3938 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3939 /* set file protection same as original file, but
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3940 * strip s-bit */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3941 (void)mch_setperm(backup, perm & 0777);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3942
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3943 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3944 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3945 * Try to set the group of the backup same as the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3946 * original file. If this fails, set the protection
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3947 * bits for the group same as the protection bits for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3948 * others.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3949 */
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3950 if (st_new.st_gid != st_old.st_gid
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3951 # ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
3952 && fchown(bfd, (uid_t)-1, st_old.st_gid) != 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3953 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3954 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3955 mch_setperm(backup,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3956 (perm & 0707) | ((perm & 07) << 3));
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
3957 # ifdef HAVE_SELINUX
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
3958 mch_copy_sec(fname, backup);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
3959 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3960 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3961
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3962 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3963 * copy the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3964 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3965 write_info.bw_fd = bfd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3966 write_info.bw_buf = copybuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3967 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3968 write_info.bw_flags = FIO_NOCONVERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3969 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3970 while ((write_info.bw_len = vim_read(fd, copybuf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3971 BUFSIZE)) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3972 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3973 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3974 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3975 errmsg = (char_u *)_("E506: Can't write to backup file (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3976 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3977 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3978 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3979 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3980 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3981 errmsg = (char_u *)_(e_interr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3982 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3983 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3984 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3985
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3986 if (close(bfd) < 0 && errmsg == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3987 errmsg = (char_u *)_("E507: Close error for backup file (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3988 if (write_info.bw_len < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3989 errmsg = (char_u *)_("E508: Can't read file for backup (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3990 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3991 set_file_time(backup, st_old.st_atime, st_old.st_mtime);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3992 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3993 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3994 mch_set_acl(backup, acl);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3995 #endif
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
3996 #ifdef HAVE_SELINUX
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
3997 mch_copy_sec(fname, backup);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
3998 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
3999 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4000 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4001 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4002 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4003 nobackup:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4004 close(fd); /* ignore errors for closing read file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4005 vim_free(copybuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4006
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4007 if (backup == NULL && errmsg == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4008 errmsg = (char_u *)_("E509: Cannot create backup file (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4009 /* ignore errors when forceit is TRUE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4010 if ((some_error || errmsg != NULL) && !forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4011 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4012 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4013 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4014 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4015 errmsg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4016 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4017 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4018 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4019 char_u *dirp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4020 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4021 char_u *rootname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4022
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4023 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4024 * Make a backup by renaming the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4025 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4026 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4027 * If 'cpoptions' includes the "W" flag, we don't want to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4028 * overwrite a read-only file. But rename may be possible
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4029 * anyway, thus we need an extra check here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4030 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4031 if (file_readonly && vim_strchr(p_cpo, CPO_FWRITE) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4032 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4033 errnum = (char_u *)"E504: ";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4034 errmsg = (char_u *)_(err_readonly);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4035 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4036 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4037
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4038 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4039 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4040 * Form the backup file name - change path/fo.o.h to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4041 * path/fo.o.h.bak Try all directories in 'backupdir', first one
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4042 * that works is used.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4043 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4044 dirp = p_bdir;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4045 while (*dirp)
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 * Isolate one directory name and make the backup file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4049 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4050 (void)copy_option_part(&dirp, IObuff, IOSIZE, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4051 rootname = get_file_in_dir(fname, IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4052 if (rootname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4053 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4054 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4055 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4056 backup = buf_modname(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4057 #ifdef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4058 TRUE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4059 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4060 (buf->b_p_sn || buf->b_shortname),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4061 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4062 rootname, backup_ext, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4063 vim_free(rootname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4065
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4066 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4067 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4068 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4069 * If we are not going to keep the backup file, don't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4070 * delete an existing one, try to use another name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4071 * Change one character, just before the extension.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4072 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4073 if (!p_bk && mch_getperm(backup) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4074 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4075 p = backup + STRLEN(backup) - 1 - STRLEN(backup_ext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4076 if (p < backup) /* empty file name ??? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4077 p = backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4078 *p = 'z';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4079 while (*p > 'a' && mch_getperm(backup) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4080 --*p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4081 /* They all exist??? Must be something wrong! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4082 if (*p == 'a')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4083 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4084 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4085 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4086 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4087 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4088 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4089 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4090 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4091 /*
531
da9142bd190a updated for version 7.0149
vimboss
parents: 501
diff changeset
4092 * Delete any existing backup and move the current version
da9142bd190a updated for version 7.0149
vimboss
parents: 501
diff changeset
4093 * to the backup. For safety, we don't remove the backup
da9142bd190a updated for version 7.0149
vimboss
parents: 501
diff changeset
4094 * until the write has finished successfully. And if the
da9142bd190a updated for version 7.0149
vimboss
parents: 501
diff changeset
4095 * 'backup' option is set, leave it around.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4096 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4097 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4098 * If the renaming of the original file to the backup file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4099 * works, quit here.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4100 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4101 if (vim_rename(fname, backup) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4102 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4103
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4104 vim_free(backup); /* don't do the rename below */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4105 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4106 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4107 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4108 if (backup == NULL && !forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4109 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4110 errmsg = (char_u *)_("E510: Can't make backup file (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4111 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4112 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4113 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4114 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4115
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4116 #if defined(UNIX) && !defined(ARCHIE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4117 /* When using ":w!" and the file was read-only: make it writable */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4118 if (forceit && perm >= 0 && !(perm & 0200) && st_old.st_uid == getuid()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4119 && vim_strchr(p_cpo, CPO_FWRITE) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4120 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4121 perm |= 0200;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4122 (void)mch_setperm(fname, perm);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4123 made_writable = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4124 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4125 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4126
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
4127 /* When using ":w!" and writing to the current file, 'readonly' makes no
164
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
4128 * sense, reset it, unless 'Z' appears in 'cpoptions'. */
8b0ee9d57d7f updated for version 7.0050
vimboss
parents: 161
diff changeset
4129 if (forceit && overwriting && vim_strchr(p_cpo, CPO_KEEPRO) == NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4130 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4131 buf->b_p_ro = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4132 #ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4133 need_maketitle = TRUE; /* set window title later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4134 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4135 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4136 status_redraw_all(); /* redraw status lines later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4137 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4138 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4139
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4140 if (end > buf->b_ml.ml_line_count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4141 end = buf->b_ml.ml_line_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4142 if (buf->b_ml.ml_flags & ML_EMPTY)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4143 start = end + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4144
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4145 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4146 * If the original file is being overwritten, there is a small chance that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4147 * we crash in the middle of writing. Therefore the file is preserved now.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4148 * This makes all block numbers positive so that recovery does not need
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4149 * the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4150 * Don't do this if there is a backup file and we are exiting.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4151 */
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4152 if (reset_changed && !newfile && overwriting
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4153 && !(exiting && backup != NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4154 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4155 ml_preserve(buf, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4156 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4157 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4158 errmsg = (char_u *)_(e_interr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4159 goto restore_backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4160 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4161 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4162
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4163 #ifdef MACOS_CLASSIC /* TODO: Is it need for MACOS_X? (Dany) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4164 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4165 * Before risking to lose the original file verify if there's
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4166 * a resource fork to preserve, and if cannot be done warn
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4167 * the users. This happens when overwriting without backups.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4168 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4169 if (backup == NULL && overwriting && !append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4170 if (mch_has_resource_fork(fname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4171 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4172 errmsg = (char_u *)_("E460: The resource fork would be lost (add ! to override)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4173 goto restore_backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4174 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4175 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4176
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4177 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4178 vms_remove_version(fname); /* remove version */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4179 #endif
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
4180 /* Default: write the file directly. May write to a temp file for
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4181 * multi-byte conversion. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4182 wfname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4183
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4184 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4185 /* Check for forced 'fileencoding' from "++opt=val" argument. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4186 if (eap != NULL && eap->force_enc != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4187 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4188 fenc = eap->cmd + eap->force_enc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4189 fenc = enc_canonize(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4190 fenc_tofree = fenc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4191 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4192 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4193 fenc = buf->b_p_fenc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4194
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4195 /*
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
4196 * Check if the file needs to be converted.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4197 */
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
4198 converted = need_conversion(fenc);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4199
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4200 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4201 * 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
4202 * Latin1 to Unicode conversion. This is handled in buf_write_bytes().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4203 * Prepare the flags for it and allocate bw_conv_buf when needed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4204 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4205 if (converted && (enc_utf8 || STRCMP(p_enc, "latin1") == 0))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4206 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4207 wb_flags = get_fio_flags(fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4208 if (wb_flags & (FIO_UCS2 | FIO_UCS4 | FIO_UTF16 | FIO_UTF8))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4209 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4210 /* Need to allocate a buffer to translate into. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4211 if (wb_flags & (FIO_UCS2 | FIO_UTF16 | FIO_UTF8))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4212 write_info.bw_conv_buflen = bufsize * 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4213 else /* FIO_UCS4 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4214 write_info.bw_conv_buflen = bufsize * 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4215 write_info.bw_conv_buf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4216 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4217 if (write_info.bw_conv_buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4218 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4219 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4220 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4221
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4222 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4223 if (converted && wb_flags == 0 && (wb_flags = get_win_fio_flags(fenc)) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4224 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4225 /* Convert UTF-8 -> UCS-2 and UCS-2 -> DBCS. Worst-case * 4: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4226 write_info.bw_conv_buflen = bufsize * 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4227 write_info.bw_conv_buf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4228 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4229 if (write_info.bw_conv_buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4230 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4231 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4232 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4233
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4234 # ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4235 if (converted && wb_flags == 0 && (wb_flags = get_mac_fio_flags(fenc)) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4237 write_info.bw_conv_buflen = bufsize * 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4238 write_info.bw_conv_buf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4239 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4240 if (write_info.bw_conv_buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4241 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4242 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4243 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4244
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4245 # if defined(FEAT_EVAL) || defined(USE_ICONV)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4246 if (converted && wb_flags == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4247 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4248 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4249 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4250 * Use iconv() conversion when conversion is needed and it's not done
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4251 * internally.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4252 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4253 write_info.bw_iconv_fd = (iconv_t)my_iconv_open(fenc,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4254 enc_utf8 ? (char_u *)"utf-8" : p_enc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4255 if (write_info.bw_iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4256 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4257 /* We're going to use iconv(), allocate a buffer to convert in. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4258 write_info.bw_conv_buflen = bufsize * ICONV_MULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4259 write_info.bw_conv_buf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4260 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4261 if (write_info.bw_conv_buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4262 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4263 write_info.bw_first = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4264 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4265 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4266 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4267 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4268 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4269
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4270 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4271 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4272 * When the file needs to be converted with 'charconvert' after
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4273 * writing, write to a temp file instead and let the conversion
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4274 * overwrite the original file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4275 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4276 if (*p_ccv != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4277 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4278 wfname = vim_tempname('w');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4279 if (wfname == NULL) /* Can't write without a tempfile! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4280 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4281 errmsg = (char_u *)_("E214: Can't find temp file for writing");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4282 goto restore_backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4283 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4284 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4285 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4286 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4287 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4288 if (converted && wb_flags == 0
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 && write_info.bw_iconv_fd == (iconv_t)-1
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4291 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4292 # ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4293 && wfname == fname
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4294 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4295 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4296 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4297 if (!forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4299 errmsg = (char_u *)_("E213: Cannot convert (add ! to write without conversion)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4300 goto restore_backup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4301 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4302 notconverted = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4303 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4304 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4305
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4306 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4307 * Open the file "wfname" for writing.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4308 * We may try to open the file twice: If we can't write to the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4309 * file and forceit is TRUE we delete the existing file and try to create
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4310 * a new one. If this still fails we may have lost the original file!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4311 * (this may happen when the user reached his quotum for number of files).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4312 * Appending will fail if the file does not exist and forceit is FALSE.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4313 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4314 while ((fd = mch_open((char *)wfname, O_WRONLY | O_EXTRA | (append
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4315 ? (forceit ? (O_APPEND | O_CREAT) : O_APPEND)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4316 : (O_CREAT | O_TRUNC))
216
da182deebec7 updated for version 7.0061
vimboss
parents: 199
diff changeset
4317 , perm < 0 ? 0666 : (perm & 0777))) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4318 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4319 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4320 * A forced write will try to create a new file if the old one is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4321 * still readonly. This may also happen when the directory is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4322 * read-only. In that case the mch_remove() will fail.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4323 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4324 if (errmsg == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4325 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4326 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4327 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4328
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4329 /* Don't delete the file when it's a hard or symbolic link. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4330 if ((!newfile && st_old.st_nlink > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4331 || (mch_lstat((char *)fname, &st) == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4332 && (st.st_dev != st_old.st_dev
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4333 || st.st_ino != st_old.st_ino)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4334 errmsg = (char_u *)_("E166: Can't open linked file for writing");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4335 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4336 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4338 errmsg = (char_u *)_("E212: Can't open file for writing");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4339 if (forceit && vim_strchr(p_cpo, CPO_FWRITE) == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4340 && perm >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4341 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4342 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4343 /* we write to the file, thus it should be marked
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4344 writable after all */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4345 if (!(perm & 0200))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4346 made_writable = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4347 perm |= 0200;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4348 if (st_old.st_uid != getuid() || st_old.st_gid != getgid())
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4349 perm &= 0777;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4350 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4351 if (!append) /* don't remove when appending */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4352 mch_remove(wfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4353 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4354 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4355 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4356 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4357
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4358 restore_backup:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4360 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4361
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4362 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4363 * If we failed to open the file, we don't need a backup. Throw it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4364 * away. If we moved or removed the original file try to put the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4365 * backup in its place.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4366 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4367 if (backup != NULL && wfname == fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4368 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4369 if (backup_copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4370 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4371 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4372 * There is a small chance that we removed the original,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4373 * try to move the copy in its place.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4374 * This may not work if the vim_rename() fails.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4375 * In that case we leave the copy around.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4376 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4377 /* If file does not exist, put the copy in its place */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4378 if (mch_stat((char *)fname, &st) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4379 vim_rename(backup, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4380 /* if original file does exist throw away the copy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4381 if (mch_stat((char *)fname, &st) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4382 mch_remove(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4383 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4384 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4385 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4386 /* try to put the original file back */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4387 vim_rename(backup, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4388 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4389 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4390
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4391 /* if original file no longer exists give an extra warning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4392 if (!newfile && mch_stat((char *)fname, &st) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4393 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4394 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4395
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4396 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4397 if (wfname != fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4398 vim_free(wfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4399 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4400 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4401 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4402 errmsg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4403
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4404 #if defined(MACOS_CLASSIC) || defined(WIN3264)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4405 /* TODO: Is it need for MACOS_X? (Dany) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4406 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4407 * On macintosh copy the original files attributes (i.e. the backup)
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
4408 * This is done in order to preserve the resource fork and the
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
4409 * Finder attribute (label, comments, custom icons, file creator)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4410 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4411 if (backup != NULL && overwriting && !append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4412 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4413 if (backup_copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4414 (void)mch_copy_file_attribute(wfname, backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4415 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4416 (void)mch_copy_file_attribute(backup, wfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4417 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4418
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4419 if (!overwriting && !append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4420 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4421 if (buf->b_ffname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4422 (void)mch_copy_file_attribute(buf->b_ffname, wfname);
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
4423 /* Should copy resource fork */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4424 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4425 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4426
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4427 write_info.bw_fd = fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4428
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4429 #ifdef FEAT_CRYPT
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
4430 if (*buf->b_p_key != NUL && !filtering)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4431 {
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4432 char_u *header;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4433 int header_len;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4434
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4435 header = prepare_crypt_write(buf, &header_len);
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4436 if (header == NULL)
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4437 end = 0;
2180
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
4438 else
f60a0c9cbe6c Add the blowfish encryption patch from Mohsin Ahmed. Needs more work.
Bram Moolenaar <bram@vim.org>
parents: 2147
diff changeset
4439 {
2239
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4440 /* Write magic number, so that Vim knows that this file is
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4441 * encrypted when reading it again. This also undergoes utf-8 to
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4442 * ucs-2/4 conversion when needed. */
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4443 write_info.bw_buf = header;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4444 write_info.bw_len = header_len;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4445 write_info.bw_flags = FIO_NOCONVERT;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4446 if (buf_write_bytes(&write_info) == FAIL)
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4447 end = 0;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4448 wb_flags |= FIO_ENCRYPTED;
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4449 vim_free(header);
732cb7b31956 Crypt the text in the undo file if the file itself is crypted.
Bram Moolenaar <bram@vim.org>
parents: 2238
diff changeset
4450 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4451 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4452 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4453
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4454 write_info.bw_buf = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4455 nchars = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4456
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4457 /* use "++bin", "++nobin" or 'binary' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4458 if (eap != NULL && eap->force_bin != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4459 write_bin = (eap->force_bin == FORCE_BIN);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4460 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4461 write_bin = buf->b_p_bin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4462
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4463 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4464 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4465 * The BOM is written just after the encryption magic number.
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 23
diff changeset
4466 * Skip it when appending and the file already existed, the BOM only makes
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 23
diff changeset
4467 * sense at the start of the file.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4468 */
24
8ff7fd162d3c updated for version 7.0016
vimboss
parents: 23
diff changeset
4469 if (buf->b_p_bomb && !write_bin && (!append || perm < 0))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4470 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4471 write_info.bw_len = make_bom(buffer, fenc);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4472 if (write_info.bw_len > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4473 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4474 /* don't convert, do encryption */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4475 write_info.bw_flags = FIO_NOCONVERT | wb_flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4476 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4477 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4478 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4479 nchars += write_info.bw_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4480 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4481 }
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4482 write_info.bw_start_lnum = start;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4483 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4484
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4485 #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
4486 write_undo_file = (buf->b_p_udf && overwriting && !append
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4487 && !filtering && reset_changed);
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4488 if (write_undo_file)
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4489 /* Prepare for computing the hash value of the text. */
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4490 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
4491 #endif
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4492
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4493 write_info.bw_len = bufsize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4494 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4495 write_info.bw_flags = wb_flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4496 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4497 fileformat = get_fileformat_force(buf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4498 s = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4499 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4500 for (lnum = start; lnum <= end; ++lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4501 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4502 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4503 * The next while loop is done once for each character written.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4504 * Keep it fast!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4505 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4506 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
4507 #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
4508 if (write_undo_file)
2217
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2215
diff changeset
4509 sha256_update(&sha_ctx, ptr + 1, (UINT32_T)(STRLEN(ptr + 1) + 1));
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
4510 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4511 while ((c = *++ptr) != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4512 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4513 if (c == NL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4514 *s = NUL; /* replace newlines with NULs */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4515 else if (c == CAR && fileformat == EOL_MAC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4516 *s = NL; /* Mac: replace CRs with NLs */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4517 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4518 *s = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4519 ++s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4520 if (++len != bufsize)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4521 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4522 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4523 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4524 end = 0; /* write error: break loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4525 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4526 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4527 nchars += bufsize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4528 s = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4529 len = 0;
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4530 #ifdef FEAT_MBYTE
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4531 write_info.bw_start_lnum = lnum;
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4532 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4533 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4534 /* write failed or last line has no EOL: stop here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4535 if (end == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4536 || (lnum == end
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4537 && write_bin
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4538 && (lnum == write_no_eol_lnum
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4539 || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4540 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4541 ++lnum; /* written the line, count it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4542 no_eol = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4543 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4544 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4545 if (fileformat == EOL_UNIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4546 *s++ = NL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4547 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4548 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4549 *s++ = CAR; /* EOL_MAC or EOL_DOS: write CR */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4550 if (fileformat == EOL_DOS) /* write CR-NL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4551 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4552 if (++len == bufsize)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4553 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4554 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4555 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4556 end = 0; /* write error: break loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4557 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4558 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4559 nchars += bufsize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4560 s = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4561 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4562 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4563 *s++ = NL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4564 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4565 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4566 if (++len == bufsize && end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4567 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4568 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4569 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4570 end = 0; /* write error: break loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4571 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4572 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4573 nchars += bufsize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4574 s = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4575 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4576
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4577 ui_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4578 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4579 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4580 end = 0; /* Interrupted, break loop */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4581 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4582 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4583 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4584 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4585 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4586 * On VMS there is a problem: newlines get added when writing blocks
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4587 * at a time. Fix it by writing a line at a time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4588 * This is much slower!
22
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4589 * Explanation: VAX/DECC RTL insists that records in some RMS
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4590 * structures end with a newline (carriage return) character, and if
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4591 * they don't it adds one.
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4592 * With other RMS structures it works perfect without this fix.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4593 */
1431
d065616e0836 updated for version 7.1-146
vimboss
parents: 1418
diff changeset
4594 if (buf->b_fab_rfm == FAB$C_VFC
d065616e0836 updated for version 7.1-146
vimboss
parents: 1418
diff changeset
4595 || ((buf->b_fab_rat & (FAB$M_FTN | FAB$M_CR)) != 0))
22
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4596 {
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4597 int b2write;
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4598
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4599 buf->b_fab_mrs = (buf->b_fab_mrs == 0
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4600 ? MIN(4096, bufsize)
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4601 : MIN(buf->b_fab_mrs, bufsize));
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4602
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4603 b2write = len;
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4604 while (b2write > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4605 {
22
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4606 write_info.bw_len = MIN(b2write, buf->b_fab_mrs);
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4607 if (buf_write_bytes(&write_info) == FAIL)
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4608 {
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4609 end = 0;
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4610 break;
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4611 }
cc049b00ee70 updated for version 7.0014
vimboss
parents: 18
diff changeset
4612 b2write -= MIN(b2write, buf->b_fab_mrs);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4613 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4614 write_info.bw_len = bufsize;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4615 nchars += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4616 s = buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4617 len = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4618 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4619 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4620 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4621 if (len > 0 && end > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4622 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4623 write_info.bw_len = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4624 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4625 end = 0; /* write error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4626 nchars += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4627 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4628
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4629 #if defined(UNIX) && defined(HAVE_FSYNC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4630 /* On many journalling file systems there is a bug that causes both the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4631 * original and the backup file to be lost when halting the system right
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4632 * after writing the file. That's because only the meta-data is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4633 * journalled. Syncing the file slows down the system, but assures it has
10
4e2284e71352 updated for version 7.0002
vimboss
parents: 9
diff changeset
4634 * been written to disk and we don't lose it.
4e2284e71352 updated for version 7.0002
vimboss
parents: 9
diff changeset
4635 * For a device do try the fsync() but don't complain if it does not work
36
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
4636 * (could be a pipe).
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
4637 * If the 'fsync' option is FALSE, don't fsync(). Useful for laptops. */
125e80798a85 updated for version 7.0021
vimboss
parents: 33
diff changeset
4638 if (p_fs && fsync(fd) != 0 && !device)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4639 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4640 errmsg = (char_u *)_("E667: Fsync failed");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4641 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4642 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4643 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4644
1583
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4645 #ifdef HAVE_SELINUX
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4646 /* Probably need to set the security context. */
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4647 if (!backup_copy)
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4648 mch_copy_sec(backup, wfname);
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4649 #endif
ebe059f69b9e updated for version 7.1-296
vimboss
parents: 1558
diff changeset
4650
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4651 #ifdef UNIX
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4652 /* When creating a new file, set its owner/group to that of the original
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4653 * file. Get the new device and inode number. */
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4654 if (backup != NULL && !backup_copy)
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4655 {
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4656 # ifdef HAVE_FCHOWN
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4657 struct stat st;
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4658
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4659 /* don't change the owner when it's already OK, some systems remove
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4660 * permission or ACL stuff */
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4661 if (mch_stat((char *)wfname, &st) < 0
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4662 || st.st_uid != st_old.st_uid
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4663 || st.st_gid != st_old.st_gid)
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4664 {
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
4665 ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4666 if (perm >= 0) /* set permission again, may have changed */
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4667 (void)mch_setperm(wfname, perm);
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4668 }
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4669 # endif
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4670 buf_setino(buf);
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4671 }
1873
6c7719f94811 updated for version 7.2-170
vimboss
parents: 1867
diff changeset
4672 else if (!buf->b_dev_valid)
617
1797ca316f1c updated for version 7.0176
vimboss
parents: 615
diff changeset
4673 /* Set the inode when creating a new file. */
1797ca316f1c updated for version 7.0176
vimboss
parents: 615
diff changeset
4674 buf_setino(buf);
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4675 #endif
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4676
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4677 if (close(fd) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4678 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4679 errmsg = (char_u *)_("E512: Close failed");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4680 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4681 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4682
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4683 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4684 if (made_writable)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4685 perm &= ~0200; /* reset 'w' bit for security reasons */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4686 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4687 if (perm >= 0) /* set perm. of new file same as old file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4688 (void)mch_setperm(wfname, perm);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4689 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4690 if (!append && !filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4691 /* Set the filetype after writing the file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4692 mch_set_filetype(wfname, buf->b_p_oft);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4693 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4694 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4695 /* Probably need to set the ACL before changing the user (can't set the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4696 * ACL on a file the user doesn't own). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4697 if (!backup_copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4698 mch_set_acl(wfname, acl);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4699 #endif
2267
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
4700 #ifdef FEAT_CRYPT
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
4701 if (wb_flags & FIO_ENCRYPTED)
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
4702 crypt_pop_state();
c08f91142c41 Crypt the swapfile.
Bram Moolenaar <bram@vim.org>
parents: 2266
diff changeset
4703 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4704
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4705
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4706 #if defined(FEAT_MBYTE) && defined(FEAT_EVAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4707 if (wfname != fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4708 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4709 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4710 * The file was written to a temp file, now it needs to be converted
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4711 * with 'charconvert' to (overwrite) the output file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4712 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4713 if (end != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4714 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4715 if (eval_charconvert(enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4716 wfname, fname) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4717 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4718 write_info.bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4719 end = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4720 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4721 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4722 mch_remove(wfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4723 vim_free(wfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4724 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4725 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4726
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4727 if (end == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4728 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4729 if (errmsg == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4730 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4731 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4732 if (write_info.bw_conv_error)
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4733 {
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4734 if (write_info.bw_conv_error_lnum == 0)
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4735 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
4736 else
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4737 {
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4738 errmsg_allocated = TRUE;
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4739 errmsg = alloc(300);
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4740 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
4741 (long)write_info.bw_conv_error_lnum);
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4742 }
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4743 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4744 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4745 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4746 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4747 errmsg = (char_u *)_(e_interr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4748 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4749 errmsg = (char_u *)_("E514: write error (file system full?)");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4750 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4751
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4752 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4753 * 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
4754 * because the new file is probably corrupt. This avoids losing the
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4755 * original file when trying to make a backup when writing the file a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4756 * second time.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4757 * When "backup_copy" is set we need to copy the backup over the new
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4758 * file. Otherwise rename the backup file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4759 * If this is OK, don't give the extra warning message.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4760 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4761 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4762 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4763 if (backup_copy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4764 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4765 /* This may take a while, if we were interrupted let the user
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4766 * know we got the message. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4767 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4769 MSG(_(e_interr));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4770 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4771 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4772 if ((fd = mch_open((char *)backup, O_RDONLY | O_EXTRA, 0)) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4773 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4774 if ((write_info.bw_fd = mch_open((char *)fname,
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
4775 O_WRONLY | O_CREAT | O_TRUNC | O_EXTRA,
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
4776 perm & 0777)) >= 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4777 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4778 /* copy the file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4779 write_info.bw_buf = smallbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4780 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4781 write_info.bw_flags = FIO_NOCONVERT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4782 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4783 while ((write_info.bw_len = vim_read(fd, smallbuf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4784 SMBUFSIZE)) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4785 if (buf_write_bytes(&write_info) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4786 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4787
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4788 if (close(write_info.bw_fd) >= 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4789 && write_info.bw_len == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4790 end = 1; /* success */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4791 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4792 close(fd); /* ignore errors for closing read file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4793 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4794 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4795 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4796 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4797 if (vim_rename(backup, fname) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4798 end = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4799 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4800 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4801 goto fail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4802 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4803
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4804 lnum -= start; /* compute number of written lines */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4805 --no_wait_return; /* may wait for return now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4806
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4807 #if !(defined(UNIX) || defined(VMS))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4808 fname = sfname; /* use shortname now, for the messages */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4809 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4810 if (!filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4811 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4812 msg_add_fname(buf, fname); /* put fname in IObuff with quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4813 c = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4814 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4815 if (write_info.bw_conv_error)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4816 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4817 STRCAT(IObuff, _(" CONVERSION ERROR"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4818 c = TRUE;
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4819 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
4820 vim_snprintf_add((char *)IObuff, IOSIZE, _(" in line %ld;"),
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
4821 (long)write_info.bw_conv_error_lnum);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4822 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4823 else if (notconverted)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4824 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4825 STRCAT(IObuff, _("[NOT converted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4826 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4827 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4828 else if (converted)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4829 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4830 STRCAT(IObuff, _("[converted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4831 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4832 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4833 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4834 if (device)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4835 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4836 STRCAT(IObuff, _("[Device]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4837 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4838 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4839 else if (newfile)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4840 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4841 STRCAT(IObuff, shortmess(SHM_NEW) ? _("[New]") : _("[New File]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4842 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4843 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4844 if (no_eol)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4845 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4846 msg_add_eol();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4847 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4848 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4849 /* may add [unix/dos/mac] */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4850 if (msg_add_fileformat(fileformat))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4851 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4852 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4853 if (wb_flags & FIO_ENCRYPTED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4854 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4855 STRCAT(IObuff, _("[crypted]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4856 c = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4857 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4858 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4859 msg_add_lines(c, (long)lnum, nchars); /* add line/char count */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4860 if (!shortmess(SHM_WRITE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4861 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4862 if (append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4863 STRCAT(IObuff, shortmess(SHM_WRI) ? _(" [a]") : _(" appended"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4864 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4865 STRCAT(IObuff, shortmess(SHM_WRI) ? _(" [w]") : _(" written"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4866 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4867
679
e629de7618da updated for version 7.0203
vimboss
parents: 676
diff changeset
4868 set_keep_msg(msg_trunc_attr(IObuff, FALSE, 0), 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4869 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4870
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4871 /* When written everything correctly: reset 'modified'. Unless not
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4872 * writing to the original file and '+' is not in 'cpoptions'. */
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
4873 if (reset_changed && whole && !append
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4874 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4875 && !write_info.bw_conv_error
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4876 #endif
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4877 && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
4878 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4879 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4880 unchanged(buf, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4881 u_unchanged(buf);
2281
e41433ea71df Added ":earlier 1f" and ":later 1f".
Bram Moolenaar <bram@vim.org>
parents: 2280
diff changeset
4882 u_update_save_nr(buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4883 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4884
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4885 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4886 * If written to the current file, update the timestamp of the swap file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4887 * and reset the BF_WRITE_MASK flags. Also sets buf->b_mtime.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4888 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4889 if (overwriting)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4890 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4891 ml_timestamp(buf);
589
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
4892 if (append)
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
4893 buf->b_flags &= ~BF_NEW;
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
4894 else
bc49ed25543d updated for version 7.0167
vimboss
parents: 578
diff changeset
4895 buf->b_flags &= ~BF_WRITE_MASK;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4896 }
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 * 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
4900 * the backup file our 'original' file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4901 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4902 if (*p_pm && dobackup)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4903 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4904 char *org = (char *)buf_modname(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4905 #ifdef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4906 TRUE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4907 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4908 (buf->b_p_sn || buf->b_shortname),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4909 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4910 fname, p_pm, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4911
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4912 if (backup != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4913 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4914 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4915
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4916 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4917 * If the original file does not exist yet
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4918 * the current backup file becomes the original file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4919 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4920 if (org == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4921 EMSG(_("E205: Patchmode: can't save original file"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4922 else if (mch_stat(org, &st) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4923 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4924 vim_rename(backup, (char_u *)org);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4925 vim_free(backup); /* don't delete the file */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4926 backup = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4927 #ifdef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4928 set_file_time((char_u *)org, st_old.st_atime, st_old.st_mtime);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4929 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4930 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4931 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4932 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4933 * If there is no backup file, remember that a (new) file was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4934 * created.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4935 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4936 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4937 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4938 int empty_fd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4939
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4940 if (org == NULL
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4941 || (empty_fd = mch_open(org,
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
4942 O_CREAT | O_EXTRA | O_EXCL | O_NOFOLLOW,
216
da182deebec7 updated for version 7.0061
vimboss
parents: 199
diff changeset
4943 perm < 0 ? 0666 : (perm & 0777))) < 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4944 EMSG(_("E206: patchmode: can't touch empty original file"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4945 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4946 close(empty_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4947 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4948 if (org != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4949 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4950 mch_setperm((char_u *)org, mch_getperm(fname) & 0777);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4951 vim_free(org);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4952 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4953 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4954
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4955 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4956 * Remove the backup unless 'backup' option is set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4957 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4958 if (!p_bk && backup != NULL && mch_remove(backup) != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4959 EMSG(_("E207: Can't delete backup file"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4960
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4961 #ifdef FEAT_SUN_WORKSHOP
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4962 if (usingSunWorkShop)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4963 workshop_file_saved((char *) ffname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4964 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4965
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4966 goto nofail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4967
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4968 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4969 * Finish up. We get here either after failure or success.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4970 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4971 fail:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4972 --no_wait_return; /* may wait for return now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4973 nofail:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4974
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4975 /* Done saving, we accept changed buffer warnings again */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4976 buf->b_saving = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4977
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4978 vim_free(backup);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4979 if (buffer != smallbuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4980 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4981 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4982 vim_free(fenc_tofree);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4983 vim_free(write_info.bw_conv_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4984 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4985 if (write_info.bw_iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4986 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4987 iconv_close(write_info.bw_iconv_fd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4988 write_info.bw_iconv_fd = (iconv_t)-1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4989 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4990 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4991 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4992 #ifdef HAVE_ACL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4993 mch_free_acl(acl);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4994 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4995
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4996 if (errmsg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4997 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
4998 int numlen = errnum != NULL ? (int)STRLEN(errnum) : 0;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
4999
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5000 attr = hl_attr(HLF_E); /* set highlight for error messages */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5001 msg_add_fname(buf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5002 #ifndef UNIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5003 sfname
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5004 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5005 fname
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5006 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5007 ); /* put file name in IObuff with quotes */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5008 if (STRLEN(IObuff) + STRLEN(errmsg) + numlen >= IOSIZE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5009 IObuff[IOSIZE - STRLEN(errmsg) - numlen - 1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5010 /* If the error message has the form "is ...", put the error number in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5011 * front of the file name. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5012 if (errnum != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5013 {
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1597
diff changeset
5014 STRMOVE(IObuff + numlen, IObuff);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5015 mch_memmove(IObuff, errnum, (size_t)numlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5016 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5017 STRCAT(IObuff, errmsg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5018 emsg(IObuff);
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5019 if (errmsg_allocated)
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5020 vim_free(errmsg);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5021
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5022 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5023 if (end == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5024 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5025 MSG_PUTS_ATTR(_("\nWARNING: Original file may be lost or damaged\n"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5026 attr | MSG_HIST);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5027 MSG_PUTS_ATTR(_("don't quit the editor until the file is successfully written!"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5028 attr | MSG_HIST);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5029
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5030 /* Update the timestamp to avoid an "overwrite changed file"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5031 * prompt when writing again. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5032 if (mch_stat((char *)fname, &st_old) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5033 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5034 buf_store_time(buf, &st_old, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5035 buf->b_mtime_read = buf->b_mtime;
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 msg_scroll = msg_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5040
2214
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5041 #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
5042 /*
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5043 * 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
5044 * file.
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5045 */
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5046 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
5047 {
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5048 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
5049
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5050 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
5051 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
5052 }
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5053 #endif
f8222d1f9a73 Included patch for persistent undo. Lots of changes and added test.
Bram Moolenaar <bram@vim.org>
parents: 2210
diff changeset
5054
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5055 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5056 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5057 if (!should_abort(retval))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5058 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5059 if (!got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5060 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5061 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5062 aco_save_T aco;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5063
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5064 write_no_eol_lnum = 0; /* in case it was set by the previous read */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5065
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5066 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5067 * Apply POST autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5068 * Careful: The autocommands may call buf_write() recursively!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5069 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5070 aucmd_prepbuf(&aco, buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5071
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5072 if (append)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5073 apply_autocmds_exarg(EVENT_FILEAPPENDPOST, fname, fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5074 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5075 else if (filtering)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5076 apply_autocmds_exarg(EVENT_FILTERWRITEPOST, NULL, fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5077 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5078 else if (reset_changed && whole)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5079 apply_autocmds_exarg(EVENT_BUFWRITEPOST, fname, fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5080 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5081 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5082 apply_autocmds_exarg(EVENT_FILEWRITEPOST, fname, fname,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5083 FALSE, curbuf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5084
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5085 /* restore curwin/curbuf and a few other things */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5086 aucmd_restbuf(&aco);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5087
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5088 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5089 if (aborting()) /* autocmds may abort script processing */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5090 retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5091 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5092 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5093 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5094
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5095 got_int |= prev_got_int;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5096
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5097 #ifdef MACOS_CLASSIC /* TODO: Is it need for MACOS_X? (Dany) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5098 /* Update machine specific information. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5099 mch_post_buffer_write(buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5100 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5101 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5102 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5103
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5104 /*
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5105 * 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
5106 * name and a ":r" or ":w" command with a file name is used.
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5107 */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5108 static int
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5109 set_rw_fname(fname, sfname)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5110 char_u *fname;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5111 char_u *sfname;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5112 {
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5113 #ifdef FEAT_AUTOCMD
1905
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5114 buf_T *buf = curbuf;
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5115
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5116 /* It's like the unnamed buffer is deleted.... */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5117 if (curbuf->b_p_bl)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5118 apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5119 apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5120 # ifdef FEAT_EVAL
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5121 if (aborting()) /* autocmds may abort script processing */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5122 return FAIL;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5123 # endif
1905
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5124 if (curbuf != buf)
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5125 {
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5126 /* We are in another buffer now, don't do the renaming. */
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5127 EMSG(_(e_auchangedbuf));
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5128 return FAIL;
1a00e831244b updated for version 7.2-202
vimboss
parents: 1880
diff changeset
5129 }
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5130 #endif
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5131
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5132 if (setfname(curbuf, fname, sfname, FALSE) == OK)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5133 curbuf->b_flags |= BF_NOTEDITED;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5134
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5135 #ifdef FEAT_AUTOCMD
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5136 /* ....and a new named one is created */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5137 apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, curbuf);
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5138 if (curbuf->b_p_bl)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5139 apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, curbuf);
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5140 # ifdef FEAT_EVAL
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5141 if (aborting()) /* autocmds may abort script processing */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5142 return FAIL;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5143 # endif
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5144
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5145 /* Do filetype detection now if 'filetype' is empty. */
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5146 if (*curbuf->b_p_ft == NUL)
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5147 {
819
23f82b5d2814 updated for version 7.0c10
vimboss
parents: 799
diff changeset
5148 if (au_has_group((char_u *)"filetypedetect"))
676
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
5149 (void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE);
717
2fa8cb05b861 updated for version 7.0218
vimboss
parents: 715
diff changeset
5150 do_modelines(0);
633
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5151 }
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5152 #endif
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5153
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5154 return OK;
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5155 }
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5156
7437be625546 updated for version 7.0183
vimboss
parents: 628
diff changeset
5157 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5158 * Put file name into IObuff with quotes.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5159 */
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
5160 void
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5161 msg_add_fname(buf, fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5162 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5163 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5164 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5165 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5166 fname = (char_u *)"-stdin-";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5167 home_replace(buf, fname, IObuff + 1, IOSIZE - 4, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5168 IObuff[0] = '"';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5169 STRCAT(IObuff, "\" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5170 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5171
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5172 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5173 * Append message for text mode to IObuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5174 * Return TRUE if something appended.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5175 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5176 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5177 msg_add_fileformat(eol_type)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5178 int eol_type;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5179 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5180 #ifndef USE_CRNL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5181 if (eol_type == EOL_DOS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5182 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5183 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[dos]") : _("[dos format]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5184 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5185 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5186 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5187 #ifndef USE_CR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5188 if (eol_type == EOL_MAC)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5189 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5190 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[mac]") : _("[mac format]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5191 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5192 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5193 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5194 #if defined(USE_CRNL) || defined(USE_CR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5195 if (eol_type == EOL_UNIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5196 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5197 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[unix]") : _("[unix format]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5198 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5199 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5200 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5201 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5202 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5203
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5204 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5205 * Append line and character count to IObuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5206 */
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
5207 void
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5208 msg_add_lines(insert_space, lnum, nchars)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5209 int insert_space;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5210 long lnum;
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
5211 off_t nchars;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5212 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5213 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5214
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5215 p = IObuff + STRLEN(IObuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5216
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5217 if (insert_space)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5218 *p++ = ' ';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5219 if (shortmess(SHM_LINES))
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
5220 sprintf((char *)p,
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
5221 #ifdef LONG_LONG_OFF_T
2261
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5222 "%ldL, %lldC", lnum, nchars
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
5223 #else
2261
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5224 /* Explicit typecast avoids warning on Mac OS X 10.6 */
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5225 "%ldL, %ldC", lnum, (long)nchars
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5226 #endif
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5227 );
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5228 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5229 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5230 if (lnum == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5231 STRCPY(p, _("1 line, "));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5232 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5233 sprintf((char *)p, _("%ld lines, "), lnum);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5234 p += STRLEN(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5235 if (nchars == 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5236 STRCPY(p, _("1 character"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5237 else
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
5238 sprintf((char *)p,
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
5239 #ifdef LONG_LONG_OFF_T
2261
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5240 _("%lld characters"), nchars
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
5241 #else
2261
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5242 /* Explicit typecast avoids warning on Mac OS X 10.6 */
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5243 _("%ld characters"), (long)nchars
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5244 #endif
06a7438b3ef7 Avoid compiler warnings on Mac 10.6.
Bram Moolenaar <bram@vim.org>
parents: 2258
diff changeset
5245 );
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5246 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5247 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5248
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5249 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5250 * Append message for missing line separator to IObuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5251 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5252 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5253 msg_add_eol()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5254 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5255 STRCAT(IObuff, shortmess(SHM_LAST) ? _("[noeol]") : _("[Incomplete last line]"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5256 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5257
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5258 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5259 * Check modification time of file, before writing to it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5260 * The size isn't checked, because using a tool like "gzip" takes care of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5261 * using the same timestamp but can't set the size.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5262 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5263 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5264 check_mtime(buf, st)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5265 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5266 struct stat *st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5267 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5268 if (buf->b_mtime_read != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5269 && time_differs((long)st->st_mtime, buf->b_mtime_read))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5270 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5271 msg_scroll = TRUE; /* don't overwrite messages here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5272 msg_silent = 0; /* must give this prompt */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5273 /* don't use emsg() here, don't want to flush the buffers */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5274 MSG_ATTR(_("WARNING: The file has been changed since reading it!!!"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5275 hl_attr(HLF_E));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5276 if (ask_yesno((char_u *)_("Do you really want to write to it"),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5277 TRUE) == 'n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5278 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5279 msg_scroll = FALSE; /* always overwrite the file message now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5280 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5281 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5283
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5284 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5285 time_differs(t1, t2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5286 long t1, t2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5287 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5288 #if defined(__linux__) || defined(MSDOS) || defined(MSWIN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5289 /* On a FAT filesystem, esp. under Linux, there are only 5 bits to store
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5290 * the seconds. Since the roundoff is done when flushing the inode, the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5291 * time may change unexpectedly by one second!!! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5292 return (t1 - t2 > 1 || t2 - t1 > 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5293 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5294 return (t1 != t2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5295 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5296 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5297
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5298 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5299 * Call write() to write a number of bytes to the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5300 * Also handles encryption and 'encoding' conversion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5301 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5302 * Return FAIL for failure, OK otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5303 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5304 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5305 buf_write_bytes(ip)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5306 struct bw_info *ip;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5307 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5308 int wlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5309 char_u *buf = ip->bw_buf; /* data to write */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5310 int len = ip->bw_len; /* length of data */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5311 #ifdef HAS_BW_FLAGS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5312 int flags = ip->bw_flags; /* extra flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5313 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5315 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5316 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5317 * Skip conversion when writing the crypt magic number or the BOM.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5318 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5319 if (!(flags & FIO_NOCONVERT))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5320 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5321 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5322 unsigned c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5323 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5324
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5325 if (flags & FIO_UTF8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5326 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5327 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5328 * Convert latin1 in the buffer to UTF-8 in the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5329 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5330 p = ip->bw_conv_buf; /* translate to buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5331 for (wlen = 0; wlen < len; ++wlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5332 p += utf_char2bytes(buf[wlen], p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5333 buf = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5334 len = (int)(p - ip->bw_conv_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5335 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5336 else if (flags & (FIO_UCS4 | FIO_UTF16 | FIO_UCS2 | FIO_LATIN1))
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 * 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
5340 * Latin1 chars in the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5341 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5342 if (flags & FIO_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5343 p = buf; /* translate in-place (can only get shorter) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5344 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5345 p = ip->bw_conv_buf; /* translate to buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5346 for (wlen = 0; wlen < len; wlen += n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5347 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5348 if (wlen == 0 && ip->bw_restlen != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5349 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5350 int l;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5351
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5352 /* Use remainder of previous call. Append the start of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5353 * buf[] to get a full sequence. Might still be too
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5354 * short! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5355 l = CONV_RESTLEN - ip->bw_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5356 if (l > len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5357 l = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5358 mch_memmove(ip->bw_rest + ip->bw_restlen, buf, (size_t)l);
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
5359 n = utf_ptr2len_len(ip->bw_rest, ip->bw_restlen + l);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5360 if (n > ip->bw_restlen + len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5361 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5362 /* We have an incomplete byte sequence at the end to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5363 * be written. We can't convert it without the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5364 * remaining bytes. Keep them for the next call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5365 if (ip->bw_restlen + len > CONV_RESTLEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5366 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5367 ip->bw_restlen += len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5368 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5369 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5370 if (n > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5371 c = utf_ptr2char(ip->bw_rest);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5372 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5373 c = ip->bw_rest[0];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5374 if (n >= ip->bw_restlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5375 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5376 n -= ip->bw_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5377 ip->bw_restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5378 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5379 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5380 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5381 ip->bw_restlen -= n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5382 mch_memmove(ip->bw_rest, ip->bw_rest + n,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5383 (size_t)ip->bw_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5384 n = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5385 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5386 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5387 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5388 {
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
5389 n = utf_ptr2len_len(buf + wlen, len - wlen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5390 if (n > len - wlen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5391 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5392 /* We have an incomplete byte sequence at the end to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5393 * be written. We can't convert it without the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5394 * remaining bytes. Keep them for the next call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5395 if (len - wlen > CONV_RESTLEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5396 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5397 ip->bw_restlen = len - wlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5398 mch_memmove(ip->bw_rest, buf + wlen,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5399 (size_t)ip->bw_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5400 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5401 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5402 if (n > 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5403 c = utf_ptr2char(buf + wlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5404 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5405 c = buf[wlen];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5406 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5407
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5408 if (ucs2bytes(c, &p, flags) && !ip->bw_conv_error)
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5409 {
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5410 ip->bw_conv_error = TRUE;
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5411 ip->bw_conv_error_lnum = ip->bw_start_lnum;
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5412 }
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5413 if (c == NL)
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5414 ++ip->bw_start_lnum;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5415 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5416 if (flags & FIO_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5417 len = (int)(p - buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5418 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5419 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5420 buf = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5421 len = (int)(p - ip->bw_conv_buf);
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5425 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5426 else if (flags & FIO_CODEPAGE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5427 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5428 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5429 * Convert UTF-8 or codepage to UCS-2 and then to MS-Windows
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5430 * codepage.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5431 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5432 char_u *from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5433 size_t fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5434 char_u *to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5435 int u8c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5436 BOOL bad = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5437 int needed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5438
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5439 if (ip->bw_restlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5440 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5441 /* Need to concatenate the remainder of the previous call and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5442 * the bytes of the current call. Use the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5443 * conversion buffer for this. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5444 fromlen = len + ip->bw_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5445 from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5446 mch_memmove(from, ip->bw_rest, (size_t)ip->bw_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5447 mch_memmove(from + ip->bw_restlen, buf, (size_t)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5448 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5449 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5450 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5451 from = buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5452 fromlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5453 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5454
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5455 to = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5456 if (enc_utf8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5457 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5458 /* Convert from UTF-8 to UCS-2, to the start of the buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5459 * The buffer has been allocated to be big enough. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5460 while (fromlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5461 {
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
5462 n = (int)utf_ptr2len_len(from, (int)fromlen);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5463 if (n > (int)fromlen) /* incomplete byte sequence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5464 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5465 u8c = utf_ptr2char(from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5466 *to++ = (u8c & 0xff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5467 *to++ = (u8c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5468 fromlen -= n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5469 from += n;
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 /* Copy remainder to ip->bw_rest[] to be used for the next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5473 * call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5474 if (fromlen > CONV_RESTLEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5475 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5476 /* weird overlong sequence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5477 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5478 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5479 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5480 mch_memmove(ip->bw_rest, from, fromlen);
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
5481 ip->bw_restlen = (int)fromlen;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5482 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5483 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5484 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5485 /* Convert from enc_codepage to UCS-2, to the start of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5486 * buffer. The buffer has been allocated to be big enough. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5487 ip->bw_restlen = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5488 needed = MultiByteToWideChar(enc_codepage,
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5489 MB_ERR_INVALID_CHARS, (LPCSTR)from, (int)fromlen,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5490 NULL, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5491 if (needed == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5492 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5493 /* When conversion fails there may be a trailing byte. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5494 needed = MultiByteToWideChar(enc_codepage,
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5495 MB_ERR_INVALID_CHARS, (LPCSTR)from, (int)fromlen - 1,
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5496 NULL, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5497 if (needed == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5498 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5499 /* Conversion doesn't work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5500 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5501 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5502 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5503 /* Save the trailing byte for the next call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5504 ip->bw_rest[0] = from[fromlen - 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5505 ip->bw_restlen = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5506 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5507 needed = MultiByteToWideChar(enc_codepage, MB_ERR_INVALID_CHARS,
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5508 (LPCSTR)from, (int)(fromlen - ip->bw_restlen),
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5509 (LPWSTR)to, needed);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5510 if (needed == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5511 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5512 /* Safety check: Conversion doesn't work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5513 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5514 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5515 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5516 to += needed * 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5517 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5518
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5519 fromlen = to - ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5520 buf = to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5521 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5522 if (FIO_GET_CP(flags) == CP_UTF8)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5523 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5524 /* Convert from UCS-2 to UTF-8, using the remainder of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5525 * conversion buffer. Fails when out of space. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5526 for (from = ip->bw_conv_buf; fromlen > 1; fromlen -= 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5527 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5528 u8c = *from++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5529 u8c += (*from++ << 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5530 to += utf_char2bytes(u8c, to);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5531 if (to + 6 >= ip->bw_conv_buf + ip->bw_conv_buflen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5532 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5533 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5534 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5535 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5536 }
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
5537 len = (int)(to - buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5538 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5539 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5540 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5541 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5542 /* Convert from UCS-2 to the codepage, using the remainder of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5543 * the conversion buffer. If the conversion uses the default
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5544 * character "0", the data doesn't fit in this encoding, so
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5545 * fail. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5546 len = WideCharToMultiByte(FIO_GET_CP(flags), 0,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5547 (LPCWSTR)ip->bw_conv_buf, (int)fromlen / sizeof(WCHAR),
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5548 (LPSTR)to, (int)(ip->bw_conv_buflen - fromlen), 0,
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5549 &bad);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5550 if (bad)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5551 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5552 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5553 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5554 }
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 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5558
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
5559 # ifdef MACOS_CONVERT
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5560 else if (flags & FIO_MACROMAN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5561 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5562 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5563 * Convert UTF-8 or latin1 to Apple MacRoman.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5564 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5565 char_u *from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5566 size_t fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5567
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5568 if (ip->bw_restlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5569 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5570 /* Need to concatenate the remainder of the previous call and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5571 * the bytes of the current call. Use the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5572 * conversion buffer for this. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5573 fromlen = len + ip->bw_restlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5574 from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5575 mch_memmove(from, ip->bw_rest, (size_t)ip->bw_restlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5576 mch_memmove(from + ip->bw_restlen, buf, (size_t)len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5577 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5578 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5579 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5580 from = buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5581 fromlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5582 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5583
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
5584 if (enc2macroman(from, fromlen,
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
5585 ip->bw_conv_buf, &len, ip->bw_conv_buflen,
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
5586 ip->bw_rest, &ip->bw_restlen) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5587 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5588 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5589 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5590 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5591 buf = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5592 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5593 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5594
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5595 # ifdef USE_ICONV
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5596 if (ip->bw_iconv_fd != (iconv_t)-1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5597 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5598 const char *from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5599 size_t fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5600 char *to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5601 size_t tolen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5602
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5603 /* Convert with iconv(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5604 if (ip->bw_restlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5605 {
1836
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5606 char *fp;
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5607
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5608 /* Need to concatenate the remainder of the previous call and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5609 * the bytes of the current call. Use the end of the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5610 * conversion buffer for this. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5611 fromlen = len + ip->bw_restlen;
1836
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5612 fp = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5613 mch_memmove(fp, ip->bw_rest, (size_t)ip->bw_restlen);
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5614 mch_memmove(fp + ip->bw_restlen, buf, (size_t)len);
03714c67a82b updated for version 7.2-134
vimboss
parents: 1834
diff changeset
5615 from = fp;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5616 tolen = ip->bw_conv_buflen - fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5617 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5618 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5619 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5620 from = (const char *)buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5621 fromlen = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5622 tolen = ip->bw_conv_buflen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5623 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5624 to = (char *)ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5625
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5626 if (ip->bw_first)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5627 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5628 size_t save_len = tolen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5629
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5630 /* output the initial shift state sequence */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5631 (void)iconv(ip->bw_iconv_fd, NULL, NULL, &to, &tolen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5632
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5633 /* There is a bug in iconv() on Linux (which appears to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5634 * wide-spread) which sets "to" to NULL and messes up "tolen".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5635 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5636 if (to == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5637 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5638 to = (char *)ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5639 tolen = save_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5640 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5641 ip->bw_first = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5642 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5643
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5644 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5645 * If iconv() has an error or there is not enough room, fail.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5646 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5647 if ((iconv(ip->bw_iconv_fd, (void *)&from, &fromlen, &to, &tolen)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5648 == (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5649 || fromlen > CONV_RESTLEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5650 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5651 ip->bw_conv_error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5652 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5653 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5654
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5655 /* copy remainder to ip->bw_rest[] to be used for the next call. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5656 if (fromlen > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5657 mch_memmove(ip->bw_rest, (void *)from, fromlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5658 ip->bw_restlen = (int)fromlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5659
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5660 buf = ip->bw_conv_buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5661 len = (int)((char_u *)to - ip->bw_conv_buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5662 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5663 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5664 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5665 #endif /* FEAT_MBYTE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5666
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5667 #ifdef FEAT_CRYPT
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5668 if (flags & FIO_ENCRYPTED) /* encrypt the data */
2244
caca0ddd789b Made crypt/decrypt faster.
Bram Moolenaar <bram@vim.org>
parents: 2243
diff changeset
5669 crypt_encode(buf, len, buf);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5670 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5671
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5672 /* Repeat the write(), it may be interrupted by a signal. */
1142
f0dcee927c1d updated for version 7.1a
vimboss
parents: 1113
diff changeset
5673 while (len > 0)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5674 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5675 wlen = vim_write(ip->bw_fd, buf, len);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5676 if (wlen <= 0) /* error! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5677 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5678 len -= wlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5679 buf += wlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5680 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5681 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5682 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5683
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5684 #ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5685 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5686 * Convert a Unicode character to bytes.
1947
ce6bc4bf2b87 updated for version 7.2-244
vimboss
parents: 1944
diff changeset
5687 * Return TRUE for an error, FALSE when it's OK.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5688 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5689 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5690 ucs2bytes(c, pp, flags)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5691 unsigned c; /* in: character */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5692 char_u **pp; /* in/out: pointer to result */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5693 int flags; /* FIO_ flags */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5694 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5695 char_u *p = *pp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5696 int error = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5697 int cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5698
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5699
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5700 if (flags & FIO_UCS4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5701 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5702 if (flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5703 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5704 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5705 *p++ = (c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5706 *p++ = (c >> 16);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5707 *p++ = (c >> 24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5709 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5710 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5711 *p++ = (c >> 24);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5712 *p++ = (c >> 16);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5713 *p++ = (c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5714 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5715 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5716 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5717 else if (flags & (FIO_UCS2 | FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5718 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5719 if (c >= 0x10000)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5720 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5721 if (flags & FIO_UTF16)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5722 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5723 /* Make two words, ten bits of the character in each. First
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5724 * word is 0xd800 - 0xdbff, second one 0xdc00 - 0xdfff */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5725 c -= 0x10000;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5726 if (c >= 0x100000)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5727 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5728 cc = ((c >> 10) & 0x3ff) + 0xd800;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5729 if (flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5730 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5731 *p++ = cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5732 *p++ = ((unsigned)cc >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5733 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5734 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5735 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5736 *p++ = ((unsigned)cc >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5737 *p++ = cc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5738 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5739 c = (c & 0x3ff) + 0xdc00;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5740 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5741 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5742 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5743 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5744 if (flags & FIO_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5745 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5746 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5747 *p++ = (c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5748 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5749 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5750 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5751 *p++ = (c >> 8);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5752 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5753 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5754 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5755 else /* Latin1 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5756 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5757 if (c >= 0x100)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5758 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5759 error = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5760 *p++ = 0xBF;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5761 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5762 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5763 *p++ = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5764 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5765
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5766 *pp = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5767 return error;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5768 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5769
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5770 /*
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5771 * Return TRUE if file encoding "fenc" requires conversion from or to
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5772 * 'encoding'.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5773 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5774 static int
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5775 need_conversion(fenc)
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5776 char_u *fenc;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5777 {
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5778 int same_encoding;
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5779 int enc_flags;
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5780 int fenc_flags;
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5781
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5782 if (*fenc == NUL || STRCMP(p_enc, fenc) == 0)
2217
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2215
diff changeset
5783 {
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5784 same_encoding = TRUE;
2217
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2215
diff changeset
5785 fenc_flags = 0;
120502692d82 Improve the MS-Windows installer.
Bram Moolenaar <bram@vim.org>
parents: 2215
diff changeset
5786 }
1948
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5787 else
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5788 {
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5789 /* Ignore difference between "ansi" and "latin1", "ucs-4" and
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5790 * "ucs-4be", etc. */
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5791 enc_flags = get_fio_flags(p_enc);
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5792 fenc_flags = get_fio_flags(fenc);
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5793 same_encoding = (enc_flags != 0 && fenc_flags == enc_flags);
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5794 }
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5795 if (same_encoding)
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5796 {
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5797 /* Specified encoding matches with 'encoding'. This requires
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5798 * conversion when 'encoding' is Unicode but not UTF-8. */
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5799 return enc_unicode != 0;
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5800 }
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5801
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5802 /* Encodings differ. However, conversion is not needed when 'enc' is any
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5803 * Unicode encoding and the file is UTF-8. */
7ff9f75f9c59 updated for version 7.2-245
vimboss
parents: 1947
diff changeset
5804 return !(enc_utf8 && fenc_flags == FIO_UTF8);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5805 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5806
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5807 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5808 * Check "ptr" for a unicode encoding and return the FIO_ flags needed for the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5809 * internal conversion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5810 * if "ptr" is an empty string, use 'encoding'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5811 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5812 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5813 get_fio_flags(ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5814 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5815 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5816 int prop;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5817
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5818 if (*ptr == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5819 ptr = p_enc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5820
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5821 prop = enc_canon_props(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5822 if (prop & ENC_UNICODE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5823 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5824 if (prop & ENC_2BYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5825 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5826 if (prop & ENC_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5827 return FIO_UCS2 | FIO_ENDIAN_L;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5828 return FIO_UCS2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5829 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5830 if (prop & ENC_4BYTE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5831 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5832 if (prop & ENC_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5833 return FIO_UCS4 | FIO_ENDIAN_L;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5834 return FIO_UCS4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5835 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5836 if (prop & ENC_2WORD)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5837 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5838 if (prop & ENC_ENDIAN_L)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5839 return FIO_UTF16 | FIO_ENDIAN_L;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5840 return FIO_UTF16;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5841 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5842 return FIO_UTF8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5843 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5844 if (prop & ENC_LATIN1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5845 return FIO_LATIN1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5846 /* must be ENC_DBCS, requires iconv() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5847 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5848 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5849
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5850 #ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5851 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5852 * Check "ptr" for a MS-Windows codepage name and return the FIO_ flags needed
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5853 * for the conversion MS-Windows can do for us. Also accept "utf-8".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5854 * Used for conversion between 'encoding' and 'fileencoding'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5855 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5856 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5857 get_win_fio_flags(ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5858 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5859 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5860 int cp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5861
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5862 /* Cannot do this when 'encoding' is not utf-8 and not a codepage. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5863 if (!enc_utf8 && enc_codepage <= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5864 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5865
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5866 cp = encname2codepage(ptr);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5867 if (cp == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5868 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5869 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5870 if (STRCMP(ptr, "utf-8") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5871 cp = CP_UTF8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5872 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5873 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5874 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5875 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5876 return FIO_PUT_CP(cp) | FIO_CODEPAGE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5877 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5878 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5879
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5880 #ifdef MACOS_X
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5881 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5882 * Check "ptr" for a Carbon supported encoding and return the FIO_ flags
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5883 * needed for the internal conversion to/from utf-8 or latin1.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5884 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5885 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5886 get_mac_fio_flags(ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5887 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5888 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5889 if ((enc_utf8 || STRCMP(p_enc, "latin1") == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5890 && (enc_canon_props(ptr) & ENC_MACROMAN))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5891 return FIO_MACROMAN;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5892 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5893 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5894 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5895
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5896 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5897 * Check for a Unicode BOM (Byte Order Mark) at the start of p[size].
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5898 * "size" must be at least 2.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5899 * Return the name of the encoding and set "*lenp" to the length.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5900 * Returns NULL when no BOM found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5901 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5902 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5903 check_for_bom(p, size, lenp, flags)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5904 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5905 long size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5906 int *lenp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5907 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5908 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5909 char *name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5910 int len = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5911
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5912 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
5913 && (flags == FIO_ALL || flags == FIO_UTF8 || flags == 0))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5914 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5915 name = "utf-8"; /* EF BB BF */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5916 len = 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5917 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5918 else if (p[0] == 0xff && p[1] == 0xfe)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5919 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5920 if (size >= 4 && p[2] == 0 && p[3] == 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5921 && (flags == FIO_ALL || flags == (FIO_UCS4 | FIO_ENDIAN_L)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5922 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5923 name = "ucs-4le"; /* FF FE 00 00 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5924 len = 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5925 }
1735
35abb7026415 updated for version 7.2-033
vimboss
parents: 1733
diff changeset
5926 else if (flags == (FIO_UCS2 | FIO_ENDIAN_L))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5927 name = "ucs-2le"; /* FF FE */
1735
35abb7026415 updated for version 7.2-033
vimboss
parents: 1733
diff changeset
5928 else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L))
35abb7026415 updated for version 7.2-033
vimboss
parents: 1733
diff changeset
5929 /* utf-16le is preferred, it also works for ucs-2le text */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5930 name = "utf-16le"; /* FF FE */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5931 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5932 else if (p[0] == 0xfe && p[1] == 0xff
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5933 && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5934 {
1547
e72e30c69d58 updated for version 7.1-261
vimboss
parents: 1486
diff changeset
5935 /* Default to utf-16, it works also for ucs-2 text. */
e72e30c69d58 updated for version 7.1-261
vimboss
parents: 1486
diff changeset
5936 if (flags == FIO_UCS2)
e72e30c69d58 updated for version 7.1-261
vimboss
parents: 1486
diff changeset
5937 name = "ucs-2"; /* FE FF */
e72e30c69d58 updated for version 7.1-261
vimboss
parents: 1486
diff changeset
5938 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5939 name = "utf-16"; /* FE FF */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5940 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5941 else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5942 && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5943 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5944 name = "ucs-4"; /* 00 00 FE FF */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5945 len = 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5946 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5947
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5948 *lenp = len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5949 return (char_u *)name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5950 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5951
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5952 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5953 * Generate a BOM in "buf[4]" for encoding "name".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5954 * Return the length of the BOM (zero when no BOM).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5955 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5956 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5957 make_bom(buf, name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5958 char_u *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5959 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5960 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5961 int flags;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5962 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5963
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5964 flags = get_fio_flags(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5965
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5966 /* Can't put a BOM in a non-Unicode file. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5967 if (flags == FIO_LATIN1 || flags == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5968 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5970 if (flags == FIO_UTF8) /* UTF-8 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5971 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5972 buf[0] = 0xef;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5973 buf[1] = 0xbb;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5974 buf[2] = 0xbf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5975 return 3;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5976 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5977 p = buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5978 (void)ucs2bytes(0xfeff, &p, flags);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5979 return (int)(p - buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5980 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5981 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5982
1418
bac7c3fce150 updated for version 7.1-133
vimboss
parents: 1411
diff changeset
5983 #if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \
1471
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
5984 defined(FEAT_QUICKFIX) || defined(FEAT_AUTOCMD) || defined(PROTO)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5985 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5986 * Try to find a shortname by comparing the fullname with the current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
5987 * directory.
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5988 * Returns "full_path" or pointer into "full_path" if shortened.
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5989 */
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5990 char_u *
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5991 shorten_fname1(full_path)
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5992 char_u *full_path;
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5993 {
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5994 char_u dirname[MAXPATHL];
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5995 char_u *p = full_path;
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5996
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5997 if (mch_dirname(dirname, MAXPATHL) == OK)
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5998 {
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
5999 p = shorten_fname(full_path, dirname);
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6000 if (p == NULL || *p == NUL)
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6001 p = full_path;
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6002 }
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6003 return p;
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6004 }
1418
bac7c3fce150 updated for version 7.1-133
vimboss
parents: 1411
diff changeset
6005 #endif
1411
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6006
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6007 /*
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6008 * Try to find a shortname by comparing the fullname with the current
0e6b369b9760 updated for version 7.1-126
vimboss
parents: 1410
diff changeset
6009 * directory.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6010 * Returns NULL if not shorter name possible, pointer into "full_path"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6011 * otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6012 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6013 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6014 shorten_fname(full_path, dir_name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6015 char_u *full_path;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6016 char_u *dir_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6017 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6018 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6019 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6020
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6021 if (full_path == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6022 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6023 len = (int)STRLEN(dir_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6024 if (fnamencmp(dir_name, full_path, len) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6025 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6026 p = full_path + len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6027 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6028 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6029 * MSDOS: when a file is in the root directory, dir_name will end in a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6030 * slash, since C: by itself does not define a specific dir. In this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6031 * case p may already be correct. <negri>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6032 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6033 if (!((len > 2) && (*(p - 2) == ':')))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6034 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6035 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6036 if (vim_ispathsep(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6037 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6038 #ifndef VMS /* the path separator is always part of the path */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6039 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6040 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6041 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6042 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6043 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6044 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6045 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6046 * When using a file in the current drive, remove the drive name:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6047 * "A:\dir\file" -> "\dir\file". This helps when moving a session file on
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6048 * a floppy from "A:\dir" to "B:\dir".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6049 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6050 else if (len > 3
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6051 && TOUPPER_LOC(full_path[0]) == TOUPPER_LOC(dir_name[0])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6052 && full_path[1] == ':'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6053 && vim_ispathsep(full_path[2]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6054 p = full_path + 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6055 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6056 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6057 p = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6058 return p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6059 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6060
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6061 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6062 * Shorten filenames for all buffers.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6063 * When "force" is TRUE: Use full path from now on for files currently being
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6064 * edited, both for file name and swap file name. Try to shorten the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6065 * names a bit, if safe to do so.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6066 * When "force" is FALSE: Only try to shorten absolute file names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6067 * For buffers that have buftype "nofile" or "scratch": never change the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6068 * name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6069 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6070 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6071 shorten_fnames(force)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6072 int force;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6073 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6074 char_u dirname[MAXPATHL];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6075 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6076 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6077
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6078 mch_dirname(dirname, MAXPATHL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6079 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6080 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6081 if (buf->b_fname != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6082 #ifdef FEAT_QUICKFIX
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6083 && !bt_nofile(buf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6084 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6085 && !path_with_url(buf->b_fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6086 && (force
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6087 || buf->b_sfname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6088 || mch_isFullName(buf->b_sfname)))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6089 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6090 vim_free(buf->b_sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6091 buf->b_sfname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6092 p = shorten_fname(buf->b_ffname, dirname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6093 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6094 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6095 buf->b_sfname = vim_strsave(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6096 buf->b_fname = buf->b_sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6097 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6098 if (p == NULL || buf->b_fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6099 buf->b_fname = buf->b_ffname;
9
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6100 }
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6101
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6102 /* Always make the swap file name a full path, a "nofile" buffer may
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6103 * also have a swap file. */
4102fb4ea781 updated for version 7.0002
vimboss
parents: 8
diff changeset
6104 mf_fullname(buf->b_ml.ml_mfp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6105 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6106 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6107 status_redraw_all();
672
db58b9066b21 updated for version 7.0200
vimboss
parents: 661
diff changeset
6108 redraw_tabline = TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6109 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6110 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6111
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6112 #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6113 || defined(FEAT_GUI_MSWIN) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6114 || defined(FEAT_GUI_MAC) \
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6115 || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6116 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6117 * Shorten all filenames in "fnames[count]" by current directory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6118 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6119 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6120 shorten_filenames(fnames, count)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6121 char_u **fnames;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6122 int count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6123 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6124 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6125 char_u dirname[MAXPATHL];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6126 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6127
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6128 if (fnames == NULL || count < 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6129 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6130 mch_dirname(dirname, sizeof(dirname));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6131 for (i = 0; i < count; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6132 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6133 if ((p = shorten_fname(fnames[i], dirname)) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6134 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6135 /* shorten_fname() returns pointer in given "fnames[i]". If free
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6136 * "fnames[i]" first, "p" becomes invalid. So we need to copy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6137 * "p" first then free fnames[i]. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6138 p = vim_strsave(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6139 vim_free(fnames[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6140 fnames[i] = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6141 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6142 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6143 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6144 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6145
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6146 /*
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6147 * 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
6148 * fo_o_h.ext for MSDOS or when shortname option set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6149 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6150 * Assumed that fname is a valid name found in the filesystem we assure that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6151 * the return value is a different name and ends in 'ext'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6152 * "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
6153 * characters otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6154 * Space for the returned name is allocated, must be freed later.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6155 * Returns NULL when out of memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6156 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6157 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6158 modname(fname, ext, prepend_dot)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6159 char_u *fname, *ext;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6160 int prepend_dot; /* may prepend a '.' to file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6161 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6162 return buf_modname(
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6163 #ifdef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6164 TRUE,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6165 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6166 (curbuf->b_p_sn || curbuf->b_shortname),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6167 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6168 fname, ext, prepend_dot);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6169 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6170
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6171 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6172 buf_modname(shortname, fname, ext, prepend_dot)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6173 int shortname; /* use 8.3 file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6174 char_u *fname, *ext;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6175 int prepend_dot; /* may prepend a '.' to file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6176 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6177 char_u *retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6178 char_u *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6179 char_u *e;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6180 char_u *ptr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6181 int fnamelen, extlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6182
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6183 extlen = (int)STRLEN(ext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6184
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6185 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6186 * 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
6187 * (we need the full path in case :cd is used).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6188 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6189 if (fname == NULL || *fname == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6190 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6191 retval = alloc((unsigned)(MAXPATHL + extlen + 3));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6192 if (retval == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6193 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6194 if (mch_dirname(retval, MAXPATHL) == FAIL ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6195 (fnamelen = (int)STRLEN(retval)) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6196 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6197 vim_free(retval);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6198 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6199 }
39
410fa1a31baf updated for version 7.0023
vimboss
parents: 36
diff changeset
6200 if (!after_pathsep(retval, retval + fnamelen))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6201 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6202 retval[fnamelen++] = PATHSEP;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6203 retval[fnamelen] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6204 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6205 #ifndef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6206 prepend_dot = FALSE; /* nothing to prepend a dot to */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6207 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6208 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6209 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6210 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6211 fnamelen = (int)STRLEN(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6212 retval = alloc((unsigned)(fnamelen + extlen + 3));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6213 if (retval == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6214 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6215 STRCPY(retval, fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6216 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6217 vms_remove_version(retval); /* we do not need versions here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6218 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6219 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6220
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6221 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6222 * search backwards until we hit a '/', '\' or ':' replacing all '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6223 * by '_' for MSDOS or when shortname option set and ext starts with a dot.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6224 * Then truncate what is after the '/', '\' or ':' to 8 characters for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6225 * MSDOS and 26 characters for AMIGA, a lot more for UNIX.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6226 */
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6227 for (ptr = retval + fnamelen; ptr > retval; mb_ptr_back(retval, ptr))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6228 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6229 #ifndef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6230 if (*ext == '.'
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6231 # ifdef USE_LONG_FNAME
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6232 && (!USE_LONG_FNAME || shortname)
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6233 # else
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6234 # ifndef SHORT_FNAME
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6235 && shortname
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6236 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6237 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6238 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6239 if (*ptr == '.') /* replace '.' by '_' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6240 *ptr = '_';
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6241 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6242 if (vim_ispathsep(*ptr))
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6243 {
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6244 ++ptr;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6245 break;
391
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6246 }
289b19a6f2ed updated for version 7.0103
vimboss
parents: 375
diff changeset
6247 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6248
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6249 /* the file name has at most BASENAMELEN characters. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6250 #ifndef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6251 if (STRLEN(ptr) > (unsigned)BASENAMELEN)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6252 ptr[BASENAMELEN] = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6253 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6254
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6255 s = ptr + STRLEN(ptr);
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 * For 8.3 file names we may have to reduce the length.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6259 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6260 #ifdef USE_LONG_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6261 if (!USE_LONG_FNAME || shortname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6262 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6263 # ifndef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6264 if (shortname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6265 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6266 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6267 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6268 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6269 * If there is no file name, or the file name ends in '/', and the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6270 * extension starts with '.', put a '_' before the dot, because just
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6271 * ".ext" is invalid.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6272 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6273 if (fname == NULL || *fname == NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6274 || vim_ispathsep(fname[STRLEN(fname) - 1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6275 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6276 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6277 if (*ext == '/')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6278 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6279 if (*ext == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6280 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6281 *s++ = '_';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6283 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6284 * If the extension starts with '.', truncate the base name at 8
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6285 * characters
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6286 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6287 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6288 /* We normally use '/', but swap files are '_' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6289 else if (*ext == '/' || *ext == '_')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6290 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6291 else if (*ext == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6292 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6293 {
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
6294 if ((size_t)(s - ptr) > (size_t)8)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6295 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6296 s = ptr + 8;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6297 *s = '\0';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6298 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6299 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6300 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6301 * If the extension doesn't start with '.', and the file name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6302 * doesn't have an extension yet, append a '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6303 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6304 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6305 else if ((e = vim_strchr(ptr, '/')) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6306 *s++ = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6307 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6308 else if ((e = vim_strchr(ptr, '.')) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6309 *s++ = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6310 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6311 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6312 * If the extension doesn't start with '.', and there already is an
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
6313 * extension, it may need to be truncated
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6314 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6315 else if ((int)STRLEN(e) + extlen > 4)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6316 s = e + 4 - extlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6317 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6318 #if defined(OS2) || defined(USE_LONG_FNAME) || defined(WIN3264)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6319 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6320 * If there is no file name, and the extension starts with '.', put a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6321 * '_' before the dot, because just ".ext" may be invalid if it's on a
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6322 * FAT partition, and on HPFS it doesn't matter.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6323 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6324 else if ((fname == NULL || *fname == NUL) && *ext == '.')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6325 *s++ = '_';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6326 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6327
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6328 /*
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6329 * Append the extension.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6330 * ext can start with '.' and cannot exceed 3 more characters.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6331 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6332 STRCPY(s, ext);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6333
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6334 #ifndef SHORT_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6335 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6336 * Prepend the dot.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6337 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6338 if (prepend_dot && !shortname && *(e = gettail(retval)) !=
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6339 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6340 '/'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6341 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6342 '.'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6343 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6344 #ifdef USE_LONG_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6345 && USE_LONG_FNAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6346 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6347 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6348 {
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1597
diff changeset
6349 STRMOVE(e + 1, e);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6350 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6351 *e = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6352 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6353 *e = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6354 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6355 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6356 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6357
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6358 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6359 * Check that, after appending the extension, the file name is really
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6360 * different.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6361 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6362 if (fname != NULL && STRCMP(fname, retval) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6363 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6364 /* we search for a character that can be replaced by '_' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6365 while (--s >= ptr)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6366 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6367 if (*s != '_')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6368 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6369 *s = '_';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6370 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6371 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6372 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6373 if (s < ptr) /* fname was "________.<ext>", how tricky! */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6374 *ptr = 'v';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6375 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6376 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6377 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6378
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6379 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6380 * 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
6381 * rest of the line is thrown away. Returns TRUE for end-of-file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6382 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6383 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6384 vim_fgets(buf, size, fp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6385 char_u *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6386 int size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6387 FILE *fp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6388 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6389 char *eof;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6390 #define FGETS_SIZE 200
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6391 char tbuf[FGETS_SIZE];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6392
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6393 buf[size - 2] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6394 #ifdef USE_CR
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6395 eof = fgets_cr((char *)buf, size, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6396 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6397 eof = fgets((char *)buf, size, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6398 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6399 if (buf[size - 2] != NUL && buf[size - 2] != '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6400 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6401 buf[size - 1] = NUL; /* Truncate the line */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6402
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6403 /* Now throw away the rest of the line: */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6404 do
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6405 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6406 tbuf[FGETS_SIZE - 2] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6407 #ifdef USE_CR
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
6408 ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6409 #else
1757
f10fe14748e2 updated for version 7.2-055
vimboss
parents: 1742
diff changeset
6410 ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6411 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6412 } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6413 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6414 return (eof == NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6415 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6416
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6417 #if defined(USE_CR) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6418 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6419 * Like vim_fgets(), but accept any line terminator: CR, CR-LF or LF.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6420 * Returns TRUE for end-of-file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6421 * Only used for the Mac, because it's much slower than vim_fgets().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6422 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6423 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6424 tag_fgets(buf, size, fp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6425 char_u *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6426 int size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6427 FILE *fp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6428 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6429 int i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6430 int c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6431 int eof = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6432
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6433 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6434 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6435 c = fgetc(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6436 if (c == EOF)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6437 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6438 eof = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6439 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6440 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6441 if (c == '\r')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6442 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6443 /* Always store a NL for end-of-line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6444 if (i < size - 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6445 buf[i++] = '\n';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6446 c = fgetc(fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6447 if (c != '\n') /* Macintosh format: single CR. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6448 ungetc(c, fp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6449 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6450 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6451 if (i < size - 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6452 buf[i++] = c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6453 if (c == '\n')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6454 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6455 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6456 buf[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6457 return eof;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6458 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6459 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6460
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6461 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6462 * rename() only works if both files are on the same file system, this
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6463 * function will (attempts to?) copy the file across if rename fails -- webb
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6464 * Return -1 for failure, 0 for success.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6465 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6466 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6467 vim_rename(from, to)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6468 char_u *from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6469 char_u *to;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6470 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6471 int fd_in;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6472 int fd_out;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6473 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6474 char *errmsg = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6475 char *buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6476 #ifdef AMIGA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6477 BPTR flock;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6478 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6479 struct stat st;
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6480 long perm;
199
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6481 #ifdef HAVE_ACL
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6482 vim_acl_T acl; /* ACL from original file */
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6483 #endif
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6484 #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6485 int use_tmp_file = FALSE;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6486 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6487
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6488 /*
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6489 * 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
6490 * to the same file (ignoring case and slash/backslash differences) but
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6491 * the file name differs we need to go through a temp file.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6492 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6493 if (fnamecmp(from, to) == 0)
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6494 {
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6495 #ifdef CASE_INSENSITIVE_FILENAME
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6496 if (STRCMP(gettail(from), gettail(to)) != 0)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6497 use_tmp_file = TRUE;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6498 else
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6499 #endif
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6500 return 0;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6501 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6502
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6503 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6504 * Fail if the "from" file doesn't exist. Avoids that "to" is deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6505 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6506 if (mch_stat((char *)from, &st) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6507 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6508
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6509 #ifdef UNIX
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6510 {
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6511 struct stat st_to;
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6512
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6513 /* 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
6514 * 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
6515 * filesystem. In that case go through a temp file name. */
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6516 if (mch_stat((char *)to, &st_to) >= 0
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6517 && st.st_dev == st_to.st_dev
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6518 && st.st_ino == st_to.st_ino)
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6519 use_tmp_file = TRUE;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6520 }
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6521 #endif
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6522
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6523 #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6524 if (use_tmp_file)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6525 {
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6526 char tempname[MAXPATHL + 1];
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6527
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6528 /*
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6529 * 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
6530 * Rename "from" to "tempname" and then rename "tempname" to "to".
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6531 */
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6532 if (STRLEN(from) >= MAXPATHL - 5)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6533 return -1;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6534 STRCPY(tempname, from);
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6535 for (n = 123; n < 99999; ++n)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6536 {
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6537 sprintf((char *)gettail((char_u *)tempname), "%d", n);
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6538 if (mch_stat(tempname, &st) < 0)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6539 {
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6540 if (mch_rename((char *)from, tempname) == 0)
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6541 {
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6542 if (mch_rename(tempname, (char *)to) == 0)
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6543 return 0;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6544 /* Strange, the second step failed. Try moving the
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6545 * file back and return failure. */
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6546 mch_rename(tempname, (char *)from);
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6547 return -1;
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6548 }
1779
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6549 /* If it fails for one temp name it will most likely fail
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6550 * for any temp name, give up. */
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6551 return -1;
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6552 }
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6553 }
28e9eb0f2d84 updated for version 7.2-077
vimboss
parents: 1778
diff changeset
6554 return -1;
1778
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6555 }
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6556 #endif
0b42546f036b updated for version 7.2-076
vimboss
parents: 1757
diff changeset
6557
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6558 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6559 * Delete the "to" file, this is required on some systems to make the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6560 * mch_rename() work, on other systems it makes sure that we don't have
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6561 * two files when the mch_rename() fails.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6562 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6563
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6564 #ifdef AMIGA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6565 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6566 * With MSDOS-compatible filesystems (crossdos, messydos) it is possible
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6567 * 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
6568 * though the names are different. To avoid the chance of accidentally
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6569 * deleting the "from" file (horror!) we lock it during the remove.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6570 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6571 * When used for making a backup before writing the file: This should not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6572 * happen with ":w", because startscript() should detect this problem and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6573 * set buf->b_shortname, causing modname() to return a correct ".bak" file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6574 * name. This problem does exist with ":w filename", but then the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6575 * original file will be somewhere else so the backup isn't really
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6576 * important. If autoscripting is off the rename may fail.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6577 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6578 flock = Lock((UBYTE *)from, (long)ACCESS_READ);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6579 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6580 mch_remove(to);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6581 #ifdef AMIGA
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6582 if (flock)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6583 UnLock(flock);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6584 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6585
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6586 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6587 * First try a normal rename, return if it works.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6588 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6589 if (mch_rename((char *)from, (char *)to) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6590 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6591
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6592 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6593 * Rename() failed, try copying the file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6594 */
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6595 perm = mch_getperm(from);
199
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6596 #ifdef HAVE_ACL
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6597 /* For systems that support ACL: get the ACL from the original file. */
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6598 acl = mch_get_acl(from);
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6599 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6600 fd_in = mch_open((char *)from, O_RDONLY|O_EXTRA, 0);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6601 if (fd_in == -1)
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6602 {
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6603 #ifdef HAVE_ACL
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6604 mch_free_acl(acl);
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6605 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6606 return -1;
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6607 }
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6608
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6609 /* Create the new file with same permissions as the original. */
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
6610 fd_out = mch_open((char *)to,
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
6611 O_CREAT|O_EXCL|O_WRONLY|O_EXTRA|O_NOFOLLOW, (int)perm);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6612 if (fd_out == -1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6613 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6614 close(fd_in);
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6615 #ifdef HAVE_ACL
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6616 mch_free_acl(acl);
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6617 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6618 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6619 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6620
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6621 buffer = (char *)alloc(BUFSIZE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6622 if (buffer == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6623 {
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6624 close(fd_out);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6625 close(fd_in);
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6626 #ifdef HAVE_ACL
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6627 mch_free_acl(acl);
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6628 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6629 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6630 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6631
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6632 while ((n = vim_read(fd_in, buffer, BUFSIZE)) > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6633 if (vim_write(fd_out, buffer, n) != n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6634 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6635 errmsg = _("E208: Error writing to \"%s\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6636 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6637 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6638
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6639 vim_free(buffer);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6640 close(fd_in);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6641 if (close(fd_out) < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6642 errmsg = _("E209: Error closing \"%s\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6643 if (n < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6644 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6645 errmsg = _("E210: Error reading \"%s\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6646 to = from;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6647 }
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
6648 #ifndef UNIX /* for Unix mch_open() already set the permission */
194
5f7701639303 updated for version 7.0058
vimboss
parents: 188
diff changeset
6649 mch_setperm(to, perm);
570
27d1ec742f17 updated for version 7.0162
vimboss
parents: 567
diff changeset
6650 #endif
199
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6651 #ifdef HAVE_ACL
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6652 mch_set_acl(to, acl);
1651
9c5a9e4356f8 updated for version 7.2a-003
vimboss
parents: 1620
diff changeset
6653 mch_free_acl(acl);
199
3b32f6b507fa updated for version 7.0059
vimboss
parents: 194
diff changeset
6654 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6655 if (errmsg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6656 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6657 EMSG2(errmsg, to);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6658 return -1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6659 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6660 mch_remove(from);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6661 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6662 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6663
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6664 static int already_warned = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6665
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6666 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6667 * Check if any not hidden buffer has been changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6668 * Postpone the check if there are characters in the stuff buffer, a global
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6669 * command is being executed, a mapping is being executed or an autocommand is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6670 * busy.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6671 * Returns TRUE if some message was written (screen should be redrawn and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6672 * cursor positioned).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6673 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6674 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6675 check_timestamps(focus)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6676 int focus; /* called for GUI focus event */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6677 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6678 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6679 int didit = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6680 int n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6681
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6682 /* Don't check timestamps while system() or another low-level function may
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6683 * cause us to lose and gain focus. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6684 if (no_check_timestamps > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6685 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6686
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6687 /* Avoid doing a check twice. The OK/Reload dialog can cause a focus
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6688 * event and we would keep on checking if the file is steadily growing.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6689 * Do check again after typing something. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6690 if (focus && did_check_timestamps)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6691 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6692 need_check_timestamps = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6693 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6694 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6695
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6696 if (!stuff_empty() || global_busy || !typebuf_typed()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6697 #ifdef FEAT_AUTOCMD
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
6698 || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6699 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6700 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6701 need_check_timestamps = TRUE; /* check later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6702 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6703 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6704 ++no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6705 did_check_timestamps = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6706 already_warned = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6707 for (buf = firstbuf; buf != NULL; )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6708 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6709 /* Only check buffers in a window. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6710 if (buf->b_nwindows > 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6711 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6712 n = buf_check_timestamp(buf, focus);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6713 if (didit < n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6714 didit = n;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6715 if (n > 0 && !buf_valid(buf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6716 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6717 /* Autocommands have removed the buffer, start at the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6718 * first one again. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6719 buf = firstbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6720 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6721 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6722 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6723 buf = buf->b_next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6724 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6725 --no_wait_return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6726 need_check_timestamps = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6727 if (need_wait_return && didit == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6728 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6729 /* make sure msg isn't overwritten */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6730 msg_puts((char_u *)"\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6731 out_flush();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6732 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6733 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6734 return didit;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6735 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6736
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6737 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6738 * Move all the lines from buffer "frombuf" to buffer "tobuf".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6739 * Return OK or FAIL. When FAIL "tobuf" is incomplete and/or "frombuf" is not
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6740 * empty.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6741 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6742 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6743 move_lines(frombuf, tobuf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6744 buf_T *frombuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6745 buf_T *tobuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6746 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6747 buf_T *tbuf = curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6748 int retval = OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6749 linenr_T lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6750 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6751
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6752 /* Copy the lines in "frombuf" to "tobuf". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6753 curbuf = tobuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6754 for (lnum = 1; lnum <= frombuf->b_ml.ml_line_count; ++lnum)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6755 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6756 p = vim_strsave(ml_get_buf(frombuf, lnum, FALSE));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6757 if (p == NULL || ml_append(lnum - 1, p, 0, FALSE) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6758 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6759 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6760 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6761 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6762 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6763 vim_free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6764 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6765
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6766 /* Delete all the lines in "frombuf". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6767 if (retval != FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6769 curbuf = frombuf;
1055
ef6b11bee7d0 updated for version 7.0-181
vimboss
parents: 1006
diff changeset
6770 for (lnum = curbuf->b_ml.ml_line_count; lnum > 0; --lnum)
ef6b11bee7d0 updated for version 7.0-181
vimboss
parents: 1006
diff changeset
6771 if (ml_delete(lnum, FALSE) == FAIL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6772 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6773 /* Oops! We could try putting back the saved lines, but that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6774 * might fail again... */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6775 retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6776 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6777 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6778 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6779
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6780 curbuf = tbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6781 return retval;
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 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6785 * Check if buffer "buf" has been changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6786 * Also check if the file for a new buffer unexpectedly appeared.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6787 * return 1 if a changed buffer was found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6788 * return 2 if a message has been displayed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6789 * return 0 otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6790 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6791 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6792 buf_check_timestamp(buf, focus)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6793 buf_T *buf;
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
6794 int focus UNUSED; /* called for GUI focus event */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6795 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6796 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6797 int stat_res;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6798 int retval = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6799 char_u *path;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6800 char_u *tbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6801 char *mesg = NULL;
188
041a413d626d updated for version 7.0057
vimboss
parents: 179
diff changeset
6802 char *mesg2 = "";
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6803 int helpmesg = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6804 int reload = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6805 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6806 int can_reload = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6807 #endif
2241
60da25e3aab7 Correct use of long instead of off_t for file size. (James Vega)
Bram Moolenaar <bram@vim.org>
parents: 2239
diff changeset
6808 off_t orig_size = buf->b_orig_size;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6809 int orig_mode = buf->b_orig_mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6810 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6811 int save_mouse_correct = need_mouse_correct;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6812 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6813 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6814 static int busy = FALSE;
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6815 int n;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6816 char_u *s;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6817 #endif
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6818 char *reason;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6819
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6820 /* If there is no file name, the buffer is not loaded, 'buftype' is
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6821 * set, we are in the middle of a save or being called recursively: ignore
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6822 * this buffer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6823 if (buf->b_ffname == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6824 || buf->b_ml.ml_mfp == NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6825 #if defined(FEAT_QUICKFIX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6826 || *buf->b_p_bt != NUL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6827 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6828 || buf->b_saving
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6829 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6830 || busy
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6831 #endif
33
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
6832 #ifdef FEAT_NETBEANS_INTG
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
6833 || isNetbeansBuffer(buf)
f6033dcbaf31 updated for version 7.0020
vimboss
parents: 26
diff changeset
6834 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6835 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6836 return 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6837
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6838 if ( !(buf->b_flags & BF_NOTEDITED)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6839 && buf->b_mtime != 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6840 && ((stat_res = mch_stat((char *)buf->b_ffname, &st)) < 0
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6841 || time_differs((long)st.st_mtime, buf->b_mtime)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6842 #ifdef HAVE_ST_MODE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6843 || (int)st.st_mode != buf->b_orig_mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6844 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6845 || mch_getperm(buf->b_ffname) != buf->b_orig_mode
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6846 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6847 ))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6848 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6849 retval = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6850
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
6851 /* set b_mtime to stop further warnings (e.g., when executing
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
6852 * FileChangedShell autocmd) */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6853 if (stat_res < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6854 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6855 buf->b_mtime = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6856 buf->b_orig_size = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6857 buf->b_orig_mode = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6858 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6859 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6860 buf_store_time(buf, &st, buf->b_ffname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6861
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6862 /* Don't do anything for a directory. Might contain the file
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6863 * explorer. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6864 if (mch_isdir(buf->b_fname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6865 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6866
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6867 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6868 * If 'autoread' is set, the buffer has no changes and the file still
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6869 * exists, reload the buffer. Use the buffer-local option value if it
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6870 * was set, the global option value otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6871 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6872 else if ((buf->b_p_ar >= 0 ? buf->b_p_ar : p_ar)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6873 && !bufIsChanged(buf) && stat_res >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6874 reload = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6875 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6876 {
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6877 if (stat_res < 0)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6878 reason = "deleted";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6879 else if (bufIsChanged(buf))
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6880 reason = "conflict";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6881 else if (orig_size != buf->b_orig_size || buf_contents_changed(buf))
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6882 reason = "changed";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6883 else if (orig_mode != buf->b_orig_mode)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6884 reason = "mode";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6885 else
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6886 reason = "time";
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6887
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6888 #ifdef FEAT_AUTOCMD
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6889 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6890 * Only give the warning if there are no FileChangedShell
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6891 * autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6892 * Avoid being called recursively by setting "busy".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6893 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6894 busy = TRUE;
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
6895 # ifdef FEAT_EVAL
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6896 set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6897 set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
6898 # endif
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
6899 ++allbuf_lock;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6900 n = apply_autocmds(EVENT_FILECHANGEDSHELL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6901 buf->b_fname, buf->b_fname, FALSE, buf);
1834
ccbd8177e1f4 updated for version 7.2-132
vimboss
parents: 1779
diff changeset
6902 --allbuf_lock;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6903 busy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6904 if (n)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6905 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6906 if (!buf_valid(buf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6907 EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
6908 # ifdef FEAT_EVAL
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6909 s = get_vim_var_str(VV_FCS_CHOICE);
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6910 if (STRCMP(s, "reload") == 0 && *reason != 'd')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6911 reload = TRUE;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6912 else if (STRCMP(s, "ask") == 0)
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6913 n = FALSE;
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6914 else
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
6915 # endif
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6916 return 2;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6917 }
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6918 if (!n)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6919 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6920 {
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6921 if (*reason == 'd')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6922 mesg = _("E211: File \"%s\" no longer available");
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6923 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6924 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6925 helpmesg = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6926 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6927 can_reload = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6928 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6929 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6930 * Check if the file contents really changed to avoid
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6931 * giving a warning when only the timestamp was set (e.g.,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6932 * checked out of CVS). Always warn when the buffer was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6933 * changed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6934 */
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6935 if (reason[2] == 'n')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6936 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6937 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
6938 mesg2 = _("See \":help W12\" for more info.");
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6939 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6940 else if (reason[1] == 'h')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6941 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6942 mesg = _("W11: Warning: File \"%s\" has changed since editing started");
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6943 mesg2 = _("See \":help W11\" for more info.");
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6944 }
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6945 else if (*reason == 'm')
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6946 {
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6947 mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started");
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6948 mesg2 = _("See \":help W16\" for more info.");
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6949 }
1913
bddda5d8caa1 updated for version 7.2-210
vimboss
parents: 1906
diff changeset
6950 else
bddda5d8caa1 updated for version 7.2-210
vimboss
parents: 1906
diff changeset
6951 /* Only timestamp changed, store it to avoid a warning
bddda5d8caa1 updated for version 7.2-210
vimboss
parents: 1906
diff changeset
6952 * in check_mtime() later. */
bddda5d8caa1 updated for version 7.2-210
vimboss
parents: 1906
diff changeset
6953 buf->b_mtime_read = buf->b_mtime;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6954 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6955 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6956 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6957
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6958 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6959 else if ((buf->b_flags & BF_NEW) && !(buf->b_flags & BF_NEW_W)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6960 && vim_fexists(buf->b_ffname))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6961 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6962 retval = 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6963 mesg = _("W13: Warning: File \"%s\" has been created after editing started");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6964 buf->b_flags |= BF_NEW_W;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6965 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6966 can_reload = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6967 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6968 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6969
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6970 if (mesg != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6971 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6972 path = home_replace_save(buf, buf->b_fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6973 if (path != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6974 {
179
7fd70926e2e1 updated for version 7.0055
vimboss
parents: 177
diff changeset
6975 if (!helpmesg)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6976 mesg2 = "";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6977 tbuf = alloc((unsigned)(STRLEN(path) + STRLEN(mesg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6978 + STRLEN(mesg2) + 2));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6979 sprintf((char *)tbuf, mesg, path);
1848
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
6980 #ifdef FEAT_EVAL
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
6981 /* Set warningmsg here, before the unimportant and output-specific
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
6982 * mesg2 has been appended. */
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
6983 set_vim_var_string(VV_WARNINGMSG, tbuf, -1);
cfcc1421f5e4 updated for version 7.2-146
vimboss
parents: 1836
diff changeset
6984 #endif
7
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 if (can_reload)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6987 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6988 if (*mesg2 != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6989 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6990 STRCAT(tbuf, "\n");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6991 STRCAT(tbuf, mesg2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6992 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6993 if (do_dialog(VIM_WARNING, (char_u *)_("Warning"), tbuf,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6994 (char_u *)_("&OK\n&Load File"), 1, NULL) == 2)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6995 reload = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6996 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6997 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6998 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
6999 if (State > NORMAL_BUSY || (State & CMDLINE) || already_warned)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7000 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7001 if (*mesg2 != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7002 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7003 STRCAT(tbuf, "; ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7004 STRCAT(tbuf, mesg2);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7005 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7006 EMSG(tbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7007 retval = 2;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7008 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7009 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7010 {
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
7011 # ifdef FEAT_AUTOCMD
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7012 if (!autocmd_busy)
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
7013 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7014 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7015 msg_start();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7016 msg_puts_attr(tbuf, hl_attr(HLF_E) + MSG_HIST);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7017 if (*mesg2 != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7018 msg_puts_attr((char_u *)mesg2,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7019 hl_attr(HLF_W) + MSG_HIST);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7020 msg_clr_eos();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7021 (void)msg_end();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7022 if (emsg_silent == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7023 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7024 out_flush();
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
7025 # ifdef FEAT_GUI
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7026 if (!focus)
8
7edf9b6e4c36 Various changes
vimboss
parents: 7
diff changeset
7027 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7028 /* give the user some time to think about it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7029 ui_delay(1000L, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7030
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7031 /* don't redraw and erase the message */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7032 redraw_cmdline = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7033 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7034 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7035 already_warned = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7036 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7037
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7038 vim_free(path);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7039 vim_free(tbuf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7040 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7041 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7042
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7043 if (reload)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7044 /* Reload the buffer. */
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
7045 buf_reload(buf, orig_mode);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7046
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7047 #ifdef FEAT_AUTOCMD
1620
73fe8baea242 updated for version 7.2a
vimboss
parents: 1597
diff changeset
7048 /* Trigger FileChangedShell when the file was changed in any way. */
73fe8baea242 updated for version 7.2a
vimboss
parents: 1597
diff changeset
7049 if (buf_valid(buf) && retval != 0)
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7050 (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7051 buf->b_fname, buf->b_fname, FALSE, buf);
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7052 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7053 #ifdef FEAT_GUI
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7054 /* restore this in case an autocommand has set it; it would break
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7055 * 'mousefocus' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7056 need_mouse_correct = save_mouse_correct;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7057 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7058
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7059 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7060 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7061
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7062 /*
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7063 * Reload a buffer that is already loaded.
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7064 * Used when the file was changed outside of Vim.
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
7065 * "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
7066 * buf->b_orig_mode may have been reset already.
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7067 */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7068 void
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
7069 buf_reload(buf, orig_mode)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7070 buf_T *buf;
628
efb7557aea10 updated for version 7.0181
vimboss
parents: 625
diff changeset
7071 int orig_mode;
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7072 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7073 exarg_T ea;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7074 pos_T old_cursor;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7075 linenr_T old_topline;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7076 int old_ro = buf->b_p_ro;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7077 buf_T *savebuf;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7078 int saved = OK;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7079 aco_save_T aco;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7080
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7081 /* set curwin/curbuf for "buf" and save some things */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7082 aucmd_prepbuf(&aco, buf);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7083
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7084 /* 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
7085 * highlighting, clear marks, diff status, etc. Force the fileformat
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7086 * and encoding to be the same. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7087 if (prep_exarg(&ea, buf) == OK)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7088 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7089 old_cursor = curwin->w_cursor;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7090 old_topline = curwin->w_topline;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7091
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7092 /*
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7093 * To behave like when a new file is edited (matters for
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7094 * BufReadPost autocommands) we first need to delete the current
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7095 * buffer contents. But if reading the file fails we should keep
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7096 * the old contents. Can't use memory only, the file might be
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7097 * too big. Use a hidden buffer to move the buffer contents to.
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7098 */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7099 if (bufempty())
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7100 savebuf = NULL;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7101 else
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7102 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7103 /* Allocate a buffer without putting it in the buffer list. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7104 savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7105 if (savebuf != NULL && buf == curbuf)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7106 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7107 /* Open the memline. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7108 curbuf = savebuf;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7109 curwin->w_buffer = savebuf;
625
81fe2ccc1207 updated for version 7.0179
vimboss
parents: 622
diff changeset
7110 saved = ml_open(curbuf);
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7111 curbuf = buf;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7112 curwin->w_buffer = buf;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7113 }
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7114 if (savebuf == NULL || saved == FAIL || buf != curbuf
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7115 || move_lines(buf, savebuf) == FAIL)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7116 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7117 EMSG2(_("E462: Could not prepare for reloading \"%s\""),
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7118 buf->b_fname);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7119 saved = FAIL;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7120 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7121 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7122
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7123 if (saved == OK)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7124 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7125 curbuf->b_flags |= BF_CHECK_RO; /* check for RO again */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7126 #ifdef FEAT_AUTOCMD
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7127 keep_filetype = TRUE; /* don't detect 'filetype' */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7128 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7129 if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7130 (linenr_T)0,
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7131 (linenr_T)MAXLNUM, &ea, READ_NEW) == FAIL)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7132 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7133 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7134 if (!aborting())
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7135 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7136 EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7137 if (savebuf != NULL && buf_valid(savebuf) && buf == curbuf)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7138 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7139 /* Put the text back from the save buffer. First
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7140 * delete any lines that readfile() added. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7141 while (!bufempty())
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7142 if (ml_delete(buf->b_ml.ml_line_count, FALSE) == FAIL)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7143 break;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7144 (void)move_lines(savebuf, buf);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7145 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7146 }
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7147 else if (buf == curbuf)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7148 {
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7149 /* Mark the buffer as unmodified and free undo info. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7150 unchanged(buf, TRUE);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7151 u_blockfree(buf);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7152 u_clearall(buf);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7153 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7154 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7155 vim_free(ea.cmd);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7156
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7157 if (savebuf != NULL && buf_valid(savebuf))
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7158 wipe_buffer(savebuf, FALSE);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7159
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7160 #ifdef FEAT_DIFF
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7161 /* Invalidate diff info if necessary. */
837
6bb1fa855dc9 updated for version 7.0e03
vimboss
parents: 836
diff changeset
7162 diff_invalidate(curbuf);
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7163 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7164
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7165 /* Restore the topline and cursor position and check it (lines may
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7166 * have been removed). */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7167 if (old_topline > curbuf->b_ml.ml_line_count)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7168 curwin->w_topline = curbuf->b_ml.ml_line_count;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7169 else
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7170 curwin->w_topline = old_topline;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7171 curwin->w_cursor = old_cursor;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7172 check_cursor();
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7173 update_topline();
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7174 #ifdef FEAT_AUTOCMD
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7175 keep_filetype = FALSE;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7176 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7177 #ifdef FEAT_FOLDING
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7178 {
1863
63369d73b551 updated for version 7.2-161
vimboss
parents: 1848
diff changeset
7179 win_T *wp;
63369d73b551 updated for version 7.2-161
vimboss
parents: 1848
diff changeset
7180 tabpage_T *tp;
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7181
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7182 /* Update folds unless they are defined manually. */
1863
63369d73b551 updated for version 7.2-161
vimboss
parents: 1848
diff changeset
7183 FOR_ALL_TAB_WINDOWS(tp, wp)
311
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7184 if (wp->w_buffer == curwin->w_buffer
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7185 && !foldmethodIsManual(wp))
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7186 foldUpdateAll(wp);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7187 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7188 #endif
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7189 /* If the mode didn't change and 'readonly' was set, keep the old
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7190 * value; the user probably used the ":view" command. But don't
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7191 * reset it, might have had a read error. */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7192 if (orig_mode == curbuf->b_orig_mode)
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7193 curbuf->b_p_ro |= old_ro;
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7194 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7195
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7196 /* restore curwin/curbuf and a few other things */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7197 aucmd_restbuf(&aco);
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7198 /* Careful: autocommands may have made "buf" invalid! */
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7199 }
33c6fb10dd66 updated for version 7.0082
vimboss
parents: 301
diff changeset
7200
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7201 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7202 buf_store_time(buf, st, fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7203 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7204 struct stat *st;
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
7205 char_u *fname UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7206 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7207 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
7208 buf->b_orig_size = st->st_size;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7209 #ifdef HAVE_ST_MODE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7210 buf->b_orig_mode = (int)st->st_mode;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7211 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7212 buf->b_orig_mode = mch_getperm(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7213 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7214 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7215
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7216 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7217 * Adjust the line with missing eol, used for the next write.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7218 * Used for do_filter(), when the input lines for the filter are deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7219 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7220 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7221 write_lnum_adjust(offset)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7222 linenr_T offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7223 {
167
c93c9cad9618 updated for version 7.0051
vimboss
parents: 164
diff changeset
7224 if (write_no_eol_lnum != 0) /* only if there is a missing eol */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7225 write_no_eol_lnum += offset;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7226 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7227
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7228 #if defined(TEMPDIRNAMES) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7229 static long temp_count = 0; /* Temp filename counter. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7230
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7231 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7232 * Delete the temp directory and all files it contains.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7233 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7234 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7235 vim_deltempdir()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7236 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7237 char_u **files;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7238 int file_count;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7239 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7240
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7241 if (vim_tempdir != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7242 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7243 sprintf((char *)NameBuff, "%s*", vim_tempdir);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7244 if (gen_expand_wildcards(1, &NameBuff, &file_count, &files,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7245 EW_DIR|EW_FILE|EW_SILENT) == OK)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7246 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7247 for (i = 0; i < file_count; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7248 mch_remove(files[i]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7249 FreeWild(file_count, files);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7250 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7251 gettail(NameBuff)[-1] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7252 (void)mch_rmdir(NameBuff);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7254 vim_free(vim_tempdir);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7255 vim_tempdir = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7256 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7257 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7258 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7259
2006
78e032bb3260 updated for version 7.2-303
vimboss
parents: 2003
diff changeset
7260 #ifdef TEMPDIRNAMES
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7261 /*
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7262 * 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
7263 * it in "vim_tempdir". This avoids that using ":cd" would confuse us.
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7264 * "tempdir" must be no longer than MAXPATHL.
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7265 */
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7266 static void
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7267 vim_settempdir(tempdir)
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7268 char_u *tempdir;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7269 {
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7270 char_u *buf;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7271
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7272 buf = alloc((unsigned)MAXPATHL + 2);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7273 if (buf != NULL)
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7274 {
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7275 if (vim_FullName(tempdir, buf, MAXPATHL, FALSE) == FAIL)
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7276 STRCPY(buf, tempdir);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7277 # ifdef __EMX__
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7278 if (vim_strchr(buf, '/') != NULL)
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7279 STRCAT(buf, "/");
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7280 else
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7281 # endif
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7282 add_pathsep(buf);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7283 vim_tempdir = vim_strsave(buf);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7284 vim_free(buf);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7285 }
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7286 }
2006
78e032bb3260 updated for version 7.2-303
vimboss
parents: 2003
diff changeset
7287 #endif
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7288
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7289 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7290 * vim_tempname(): Return a unique name that can be used for a temp file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7291 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7292 * The temp file is NOT created.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7293 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7294 * The returned pointer is to allocated memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7295 * The returned pointer is NULL if no valid name was found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7296 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7297 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7298 vim_tempname(extra_char)
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
7299 int extra_char UNUSED; /* char to use in the name instead of '?' */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7300 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7301 #ifdef USE_TMPNAM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7302 char_u itmp[L_tmpnam]; /* use tmpnam() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7303 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7304 char_u itmp[TEMPNAMELEN];
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 #ifdef TEMPDIRNAMES
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7308 static char *(tempdirs[]) = {TEMPDIRNAMES};
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7309 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7310 # ifndef EEXIST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7311 struct stat st;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7312 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7313
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7314 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7315 * This will create a directory for private use by this instance of Vim.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7316 * This is done once, and the same directory is used for all temp files.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7317 * This method avoids security problems because of symlink attacks et al.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7318 * 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
7319 * file when creating the directory and not for each temp file.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7320 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7321 if (vim_tempdir == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7322 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7323 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7324 * Try the entries in TEMPDIRNAMES to create the temp directory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7325 */
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
7326 for (i = 0; i < (int)(sizeof(tempdirs) / sizeof(char *)); ++i)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7327 {
2047
85da03763130 updated for version 7.2.333
Bram Moolenaar <bram@zimbu.org>
parents: 2028
diff changeset
7328 # ifndef HAVE_MKDTEMP
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7329 size_t itmplen;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7330 long nr;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7331 long off;
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7332 # endif
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7333
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7334 /* expand $TMP, leave room for "/v1100000/999999999" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7335 expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7336 if (mch_isdir(itmp)) /* directory exists */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7337 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7338 # ifdef __EMX__
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7339 /* If $TMP contains a forward slash (perhaps using bash or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7340 * tcsh), don't add a backslash, use a forward slash!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7341 * Adding 2 backslashes didn't work. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7342 if (vim_strchr(itmp, '/') != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7343 STRCAT(itmp, "/");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7344 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7345 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7346 add_pathsep(itmp);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7347
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7348 # ifdef HAVE_MKDTEMP
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7349 /* Leave room for filename */
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7350 STRCAT(itmp, "vXXXXXX");
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7351 if (mkdtemp((char *)itmp) != NULL)
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7352 vim_settempdir(itmp);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7353 # else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7354 /* Get an arbitrary number of up to 6 digits. When it's
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7355 * unlikely that it already exists it will be faster,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7356 * otherwise it doesn't matter. The use of mkdir() avoids any
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7357 * security problems because of the predictable number. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7358 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
7359 itmplen = STRLEN(itmp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7360
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7361 /* Try up to 10000 different values until we find a name that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7362 * doesn't exist. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7363 for (off = 0; off < 10000L; ++off)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7364 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7365 int r;
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7366 # if defined(UNIX) || defined(VMS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7367 mode_t umask_save;
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7368 # endif
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7369
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7370 sprintf((char *)itmp + itmplen, "v%ld", nr + off);
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7371 # ifndef EEXIST
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7372 /* If mkdir() does not set errno to EEXIST, check for
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7373 * existing file here. There is a race condition then,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7374 * although it's fail-safe. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7375 if (mch_stat((char *)itmp, &st) >= 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7376 continue;
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7377 # endif
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7378 # if defined(UNIX) || defined(VMS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7379 /* Make sure the umask doesn't remove the executable bit.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7380 * "repl" has been reported to use "177". */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7381 umask_save = umask(077);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7382 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7383 r = vim_mkdir(itmp, 0700);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7384 # if defined(UNIX) || defined(VMS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7385 (void)umask(umask_save);
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7386 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7387 if (r == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7388 {
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7389 vim_settempdir(itmp);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7390 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7391 }
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7392 # ifdef EEXIST
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7393 /* If the mkdir() didn't fail because the file/dir exists,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7394 * we probably can't create any dir here, try another
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7395 * place. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7396 if (errno != EEXIST)
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7397 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7398 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7399 }
1997
1f53050b3868 updated for version 7.2-294
vimboss
parents: 1962
diff changeset
7400 # endif /* HAVE_MKDTEMP */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7401 if (vim_tempdir != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7402 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7403 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7404 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7405 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7406
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7407 if (vim_tempdir != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7408 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7409 /* There is no need to check if the file exists, because we own the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7410 * directory and nobody else creates a file in it. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7411 sprintf((char *)itmp, "%s%ld", vim_tempdir, temp_count++);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7412 return vim_strsave(itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7413 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7414
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7415 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7416
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7417 #else /* TEMPDIRNAMES */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7418
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7419 # ifdef WIN3264
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7420 char szTempFile[_MAX_PATH + 1];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7421 char buf4[4];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7422 char_u *retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7423 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7424
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7425 STRCPY(itmp, "");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7426 if (GetTempPath(_MAX_PATH, szTempFile) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7427 szTempFile[0] = NUL; /* GetTempPath() failed, use current dir */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7428 strcpy(buf4, "VIM");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7429 buf4[2] = extra_char; /* make it "VIa", "VIb", etc. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7430 if (GetTempFileName(szTempFile, buf4, 0, itmp) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7431 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7432 /* GetTempFileName() will create the file, we don't want that */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7433 (void)DeleteFile(itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7434
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7435 /* Backslashes in a temp file name cause problems when filtering with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7436 * "sh". NOTE: This also checks 'shellcmdflag' to help those people who
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7437 * didn't set 'shellslash'. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7438 retval = vim_strsave(itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7439 if (*p_shcf == '-' || p_ssl)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7440 for (p = retval; *p; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7441 if (*p == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7442 *p = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7443 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7444
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7445 # else /* WIN3264 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7446
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7447 # ifdef USE_TMPNAM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7448 /* tmpnam() will make its own name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7449 if (*tmpnam((char *)itmp) == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7450 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7451 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7452 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7453
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7454 # ifdef VMS_TEMPNAM
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7455 /* mktemp() is not working on VMS. It seems to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7456 * a do-nothing function. Therefore we use tempnam().
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7457 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7458 sprintf((char *)itmp, "VIM%c", extra_char);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7459 p = (char_u *)tempnam("tmp:", (char *)itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7460 if (p != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7461 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7462 /* VMS will use '.LOG' if we don't explicitly specify an extension,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7463 * and VIM will then be unable to find the file later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7464 STRCPY(itmp, p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7465 STRCAT(itmp, ".txt");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7466 free(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7467 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7468 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7469 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7470 # else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7471 STRCPY(itmp, TEMPNAME);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7472 if ((p = vim_strchr(itmp, '?')) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7473 *p = extra_char;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7474 if (mktemp((char *)itmp) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7475 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7476 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7477 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7478
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7479 return vim_strsave(itmp);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7480 # endif /* WIN3264 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7481 #endif /* TEMPDIRNAMES */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7482 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7483
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7484 #if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7485 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7486 * Convert all backslashes in fname to forward slashes in-place.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7487 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7488 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7489 forward_slash(fname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7490 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7491 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7492 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7493
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7494 for (p = fname; *p != NUL; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7495 # ifdef FEAT_MBYTE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7496 /* The Big5 encoding can have '\' in the trail byte. */
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
7497 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7498 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7499 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7500 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7501 if (*p == '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7502 *p = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7503 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7504 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7505
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7506
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7507 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7508 * Code for automatic commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7509 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7510 * Only included when "FEAT_AUTOCMD" has been defined.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7511 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7512
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7513 #if defined(FEAT_AUTOCMD) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7514
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7515 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7516 * The autocommands are stored in a list for each event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7517 * Autocommands for the same pattern, that are consecutive, are joined
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7518 * together, to avoid having to match the pattern too often.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7519 * The result is an array of Autopat lists, which point to AutoCmd lists:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7520 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7521 * first_autopat[0] --> Autopat.next --> Autopat.next --> NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7522 * Autopat.cmds Autopat.cmds
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7523 * | |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7524 * V V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7525 * AutoCmd.next AutoCmd.next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7526 * | |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7527 * V V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7528 * AutoCmd.next NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7529 * |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7530 * V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7531 * NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7532 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7533 * first_autopat[1] --> Autopat.next --> NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7534 * Autopat.cmds
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7535 * |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7536 * V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7537 * AutoCmd.next
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7538 * |
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7539 * V
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7540 * NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7541 * etc.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7542 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7543 * The order of AutoCmds is important, this is the order in which they were
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7544 * defined and will have to be executed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7545 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7546 typedef struct AutoCmd
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7547 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7548 char_u *cmd; /* The command to be executed (NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7549 when command has been removed) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7550 char nested; /* If autocommands nest here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7551 char last; /* last command in list */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7552 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7553 scid_T scriptID; /* script ID where defined */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7554 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7555 struct AutoCmd *next; /* Next AutoCmd in list */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7556 } AutoCmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7557
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7558 typedef struct AutoPat
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7559 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7560 int group; /* group ID */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7561 char_u *pat; /* pattern as typed (NULL when pattern
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7562 has been removed) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7563 int patlen; /* strlen() of pat */
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
7564 regprog_T *reg_prog; /* compiled regprog for pattern */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7565 char allow_dirs; /* Pattern may match whole path */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7566 char last; /* last pattern for apply_autocmds() */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7567 AutoCmd *cmds; /* list of commands to do */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7568 struct AutoPat *next; /* next AutoPat in AutoPat list */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7569 int buflocal_nr; /* !=0 for buffer-local AutoPat */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7570 } AutoPat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7571
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7572 static struct event_name
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7573 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7574 char *name; /* event name */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7575 event_T event; /* event number */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7576 } event_names[] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7577 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7578 {"BufAdd", EVENT_BUFADD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7579 {"BufCreate", EVENT_BUFADD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7580 {"BufDelete", EVENT_BUFDELETE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7581 {"BufEnter", EVENT_BUFENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7582 {"BufFilePost", EVENT_BUFFILEPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7583 {"BufFilePre", EVENT_BUFFILEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7584 {"BufHidden", EVENT_BUFHIDDEN},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7585 {"BufLeave", EVENT_BUFLEAVE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7586 {"BufNew", EVENT_BUFNEW},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7587 {"BufNewFile", EVENT_BUFNEWFILE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7588 {"BufRead", EVENT_BUFREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7589 {"BufReadCmd", EVENT_BUFREADCMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7590 {"BufReadPost", EVENT_BUFREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7591 {"BufReadPre", EVENT_BUFREADPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7592 {"BufUnload", EVENT_BUFUNLOAD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7593 {"BufWinEnter", EVENT_BUFWINENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7594 {"BufWinLeave", EVENT_BUFWINLEAVE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7595 {"BufWipeout", EVENT_BUFWIPEOUT},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7596 {"BufWrite", EVENT_BUFWRITEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7597 {"BufWritePost", EVENT_BUFWRITEPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7598 {"BufWritePre", EVENT_BUFWRITEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7599 {"BufWriteCmd", EVENT_BUFWRITECMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7600 {"CmdwinEnter", EVENT_CMDWINENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7601 {"CmdwinLeave", EVENT_CMDWINLEAVE},
12
bdeee1504ac1 updated for version 7.0004
vimboss
parents: 11
diff changeset
7602 {"ColorScheme", EVENT_COLORSCHEME},
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7603 {"CursorHold", EVENT_CURSORHOLD},
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7604 {"CursorHoldI", EVENT_CURSORHOLDI},
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7605 {"CursorMoved", EVENT_CURSORMOVED},
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7606 {"CursorMovedI", EVENT_CURSORMOVEDI},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7607 {"EncodingChanged", EVENT_ENCODINGCHANGED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7608 {"FileEncoding", EVENT_ENCODINGCHANGED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7609 {"FileAppendPost", EVENT_FILEAPPENDPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7610 {"FileAppendPre", EVENT_FILEAPPENDPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7611 {"FileAppendCmd", EVENT_FILEAPPENDCMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7612 {"FileChangedShell",EVENT_FILECHANGEDSHELL},
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7613 {"FileChangedShellPost",EVENT_FILECHANGEDSHELLPOST},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7614 {"FileChangedRO", EVENT_FILECHANGEDRO},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7615 {"FileReadPost", EVENT_FILEREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7616 {"FileReadPre", EVENT_FILEREADPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7617 {"FileReadCmd", EVENT_FILEREADCMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7618 {"FileType", EVENT_FILETYPE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7619 {"FileWritePost", EVENT_FILEWRITEPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7620 {"FileWritePre", EVENT_FILEWRITEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7621 {"FileWriteCmd", EVENT_FILEWRITECMD},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7622 {"FilterReadPost", EVENT_FILTERREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7623 {"FilterReadPre", EVENT_FILTERREADPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7624 {"FilterWritePost", EVENT_FILTERWRITEPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7625 {"FilterWritePre", EVENT_FILTERWRITEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7626 {"FocusGained", EVENT_FOCUSGAINED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7627 {"FocusLost", EVENT_FOCUSLOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7628 {"FuncUndefined", EVENT_FUNCUNDEFINED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7629 {"GUIEnter", EVENT_GUIENTER},
946
4fb859cd9ba9 updated for version 7.0-072
vimboss
parents: 934
diff changeset
7630 {"GUIFailed", EVENT_GUIFAILED},
11
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
7631 {"InsertChange", EVENT_INSERTCHANGE},
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
7632 {"InsertEnter", EVENT_INSERTENTER},
4424b47a0797 updated for version 7.0003
vimboss
parents: 10
diff changeset
7633 {"InsertLeave", EVENT_INSERTLEAVE},
434
9595cf1d80a7 updated for version 7.0112
vimboss
parents: 391
diff changeset
7634 {"MenuPopup", EVENT_MENUPOPUP},
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
7635 {"QuickFixCmdPost", EVENT_QUICKFIXCMDPOST},
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
7636 {"QuickFixCmdPre", EVENT_QUICKFIXCMDPRE},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7637 {"RemoteReply", EVENT_REMOTEREPLY},
574
25a70b1cd2da updated for version 7.0163
vimboss
parents: 570
diff changeset
7638 {"SessionLoadPost", EVENT_SESSIONLOADPOST},
723
587ea89ab80c updated for version 7.0220
vimboss
parents: 717
diff changeset
7639 {"ShellCmdPost", EVENT_SHELLCMDPOST},
587ea89ab80c updated for version 7.0220
vimboss
parents: 717
diff changeset
7640 {"ShellFilterPost", EVENT_SHELLFILTERPOST},
715
b526e10493b1 updated for version 7.0217
vimboss
parents: 714
diff changeset
7641 {"SourcePre", EVENT_SOURCEPRE},
1061
b4d11ddb7303 updated for version 7.0-187
vimboss
parents: 1055
diff changeset
7642 {"SourceCmd", EVENT_SOURCECMD},
649
8157079cea85 updated for version 7.0191
vimboss
parents: 635
diff changeset
7643 {"SpellFileMissing",EVENT_SPELLFILEMISSING},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7644 {"StdinReadPost", EVENT_STDINREADPOST},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7645 {"StdinReadPre", EVENT_STDINREADPRE},
674
4b8583e82cb8 updated for version 7.0201
vimboss
parents: 672
diff changeset
7646 {"SwapExists", EVENT_SWAPEXISTS},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7647 {"Syntax", EVENT_SYNTAX},
676
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
7648 {"TabEnter", EVENT_TABENTER},
9cdb8018cdf1 updated for version 7.0202
vimboss
parents: 674
diff changeset
7649 {"TabLeave", EVENT_TABLEAVE},
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7650 {"TermChanged", EVENT_TERMCHANGED},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7651 {"TermResponse", EVENT_TERMRESPONSE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7652 {"User", EVENT_USER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7653 {"VimEnter", EVENT_VIMENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7654 {"VimLeave", EVENT_VIMLEAVE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7655 {"VimLeavePre", EVENT_VIMLEAVEPRE},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7656 {"WinEnter", EVENT_WINENTER},
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7657 {"WinLeave", EVENT_WINLEAVE},
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
7658 {"VimResized", EVENT_VIMRESIZED},
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7659 {NULL, (event_T)0}
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7660 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7661
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7662 static AutoPat *first_autopat[NUM_EVENTS] =
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7664 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7665 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7666 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7667 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
18
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
7668 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
293621502c4d updated for version 7.0010
vimboss
parents: 17
diff changeset
7669 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7670 };
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7671
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7672 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7673 * struct used to keep status while executing autocommands for an event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7674 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7675 typedef struct AutoPatCmd
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7676 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7677 AutoPat *curpat; /* next AutoPat to examine */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7678 AutoCmd *nextcmd; /* next AutoCmd to execute */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7679 int group; /* group being used */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7680 char_u *fname; /* fname to match with */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7681 char_u *sfname; /* sfname to match with */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7682 char_u *tail; /* tail of fname */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7683 event_T event; /* current event */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7684 int arg_bufnr; /* initially equal to <abuf>, set to zero when
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7685 buf is deleted */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7686 struct AutoPatCmd *next; /* chain of active apc-s for auto-invalidation*/
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7687 } AutoPatCmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7688
297
9a1c2a8186b7 updated for version 7.0078
vimboss
parents: 292
diff changeset
7689 static AutoPatCmd *active_apc_list = NULL; /* stack of active autocommands */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7690
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7691 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7692 * augroups stores a list of autocmd group names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7693 */
297
9a1c2a8186b7 updated for version 7.0078
vimboss
parents: 292
diff changeset
7694 static garray_T augroups = {0, 0, sizeof(char_u *), 10, NULL};
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7695 #define AUGROUP_NAME(i) (((char_u **)augroups.ga_data)[i])
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7696
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7697 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7698 * The ID of the current group. Group 0 is the default one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7699 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7700 static int current_augroup = AUGROUP_DEFAULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7701
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7702 static int au_need_clean = FALSE; /* need to delete marked patterns */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7703
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7704 static void show_autocmd __ARGS((AutoPat *ap, event_T event));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7705 static void au_remove_pat __ARGS((AutoPat *ap));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7706 static void au_remove_cmds __ARGS((AutoPat *ap));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7707 static void au_cleanup __ARGS((void));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7708 static int au_new_group __ARGS((char_u *name));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7709 static void au_del_group __ARGS((char_u *name));
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7710 static event_T event_name2nr __ARGS((char_u *start, char_u **end));
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7711 static char_u *event_nr2name __ARGS((event_T event));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7712 static char_u *find_end_event __ARGS((char_u *arg, int have_group));
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7713 static int event_ignored __ARGS((event_T event));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7714 static int au_get_grouparg __ARGS((char_u **argp));
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7715 static int do_autocmd_event __ARGS((event_T event, char_u *pat, int nested, char_u *cmd, int forceit, int group));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7716 static char_u *getnextac __ARGS((int c, void *cookie, int indent));
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7717 static int apply_autocmds_group __ARGS((event_T event, char_u *fname, char_u *fname_io, int force, int group, buf_T *buf, exarg_T *eap));
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7718 static void auto_next_pat __ARGS((AutoPatCmd *apc, int stop_at_last));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7719
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7720
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7721 static event_T last_event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7722 static int last_group;
1410
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
7723 static int autocmd_blocked = 0; /* block all autocmds */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7724
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7725 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7726 * Show the autocommands for one AutoPat.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7727 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7728 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7729 show_autocmd(ap, event)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7730 AutoPat *ap;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7731 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7732 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7733 AutoCmd *ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7734
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7735 /* Check for "got_int" (here and at various places below), which is set
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7736 * when "q" has been hit for the "--more--" prompt */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7737 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7738 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7739 if (ap->pat == NULL) /* pattern has been removed */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7740 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7741
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7742 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7743 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7744 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7745 if (event != last_event || ap->group != last_group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7746 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7747 if (ap->group != AUGROUP_DEFAULT)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7748 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7749 if (AUGROUP_NAME(ap->group) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7750 msg_puts_attr((char_u *)_("--Deleted--"), hl_attr(HLF_E));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7751 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7752 msg_puts_attr(AUGROUP_NAME(ap->group), hl_attr(HLF_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7753 msg_puts((char_u *)" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7754 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7755 msg_puts_attr(event_nr2name(event), hl_attr(HLF_T));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7756 last_event = event;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7757 last_group = ap->group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7758 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7759 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7760 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7761 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7762 msg_col = 4;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7763 msg_outtrans(ap->pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7764
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7765 for (ac = ap->cmds; ac != NULL; ac = ac->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7766 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7767 if (ac->cmd != NULL) /* skip removed commands */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7768 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7769 if (msg_col >= 14)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7770 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7771 msg_col = 14;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7772 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7773 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7774 msg_outtrans(ac->cmd);
500
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 474
diff changeset
7775 #ifdef FEAT_EVAL
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 474
diff changeset
7776 if (p_verbose > 0)
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 474
diff changeset
7777 last_set_msg(ac->scriptID);
4772a5e3f9fa updated for version 7.0138
vimboss
parents: 474
diff changeset
7778 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7779 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7780 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7781 if (ac->next != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7782 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7783 msg_putchar('\n');
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7784 if (got_int)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7785 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7786 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7787 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7788 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7789 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7790
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7791 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7792 * Mark an autocommand pattern for deletion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7793 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7794 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7795 au_remove_pat(ap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7796 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7797 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7798 vim_free(ap->pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7799 ap->pat = NULL;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7800 ap->buflocal_nr = -1;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7801 au_need_clean = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7802 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7803
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7804 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7805 * Mark all commands for a pattern for deletion.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7806 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7807 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7808 au_remove_cmds(ap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7809 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7810 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7811 AutoCmd *ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7812
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7813 for (ac = ap->cmds; ac != NULL; ac = ac->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7814 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7815 vim_free(ac->cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7816 ac->cmd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7817 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7818 au_need_clean = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7819 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7820
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7821 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7822 * Cleanup autocommands and patterns that have been deleted.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7823 * This is only done when not executing autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7824 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7825 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7826 au_cleanup()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7827 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7828 AutoPat *ap, **prev_ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7829 AutoCmd *ac, **prev_ac;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7830 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7831
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7832 if (autocmd_busy || !au_need_clean)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7833 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7834
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7835 /* loop over all events */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7836 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7837 event = (event_T)((int)event + 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7838 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7839 /* loop over all autocommand patterns */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7840 prev_ap = &(first_autopat[(int)event]);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7841 for (ap = *prev_ap; ap != NULL; ap = *prev_ap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7842 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7843 /* loop over all commands for this pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7844 prev_ac = &(ap->cmds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7845 for (ac = *prev_ac; ac != NULL; ac = *prev_ac)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7846 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7847 /* remove the command if the pattern is to be deleted or when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7848 * the command has been marked for deletion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7849 if (ap->pat == NULL || ac->cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7850 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7851 *prev_ac = ac->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7852 vim_free(ac->cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7853 vim_free(ac);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7854 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7855 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7856 prev_ac = &(ac->next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7857 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7858
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7859 /* remove the pattern if it has been marked for deletion */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7860 if (ap->pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7861 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7862 *prev_ap = ap->next;
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
7863 vim_free(ap->reg_prog);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7864 vim_free(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7865 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7866 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7867 prev_ap = &(ap->next);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7868 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7869 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7870
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7871 au_need_clean = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7872 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7873
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7874 /*
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7875 * Called when buffer is freed, to remove/invalidate related buffer-local
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7876 * autocmds.
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7877 */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7878 void
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7879 aubuflocal_remove(buf)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7880 buf_T *buf;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7881 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7882 AutoPat *ap;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7883 event_T event;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7884 AutoPatCmd *apc;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7885
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7886 /* invalidate currently executing autocommands */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7887 for (apc = active_apc_list; apc; apc = apc->next)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7888 if (buf->b_fnum == apc->arg_bufnr)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7889 apc->arg_bufnr = 0;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7890
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7891 /* invalidate buflocals looping through events */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7892 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
7893 event = (event_T)((int)event + 1))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7894 /* loop over all autocommand patterns */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7895 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7896 if (ap->buflocal_nr == buf->b_fnum)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7897 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7898 au_remove_pat(ap);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7899 if (p_verbose >= 6)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7900 {
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7901 verbose_enter();
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7902 smsg((char_u *)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7903 _("auto-removing autocommand: %s <buffer=%d>"),
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7904 event_nr2name(event), buf->b_fnum);
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7905 verbose_leave();
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
7906 }
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7907 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7908 au_cleanup();
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7909 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7910
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
7911 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7912 * Add an autocmd group name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7913 * Return it's ID. Returns AUGROUP_ERROR (< 0) for error.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7914 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7915 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7916 au_new_group(name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7917 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7918 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7919 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7920
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7921 i = au_find_group(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7922 if (i == AUGROUP_ERROR) /* the group doesn't exist yet, add it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7923 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7924 /* First try using a free entry. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7925 for (i = 0; i < augroups.ga_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7926 if (AUGROUP_NAME(i) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7927 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7928 if (i == augroups.ga_len && ga_grow(&augroups, 1) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7929 return AUGROUP_ERROR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7930
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7931 AUGROUP_NAME(i) = vim_strsave(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7932 if (AUGROUP_NAME(i) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7933 return AUGROUP_ERROR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7934 if (i == augroups.ga_len)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7935 ++augroups.ga_len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7936 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7937
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7938 return i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7939 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7940
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7941 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7942 au_del_group(name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7943 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7944 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7945 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7946
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7947 i = au_find_group(name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7948 if (i == AUGROUP_ERROR) /* the group doesn't exist */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7949 EMSG2(_("E367: No such group: \"%s\""), name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7950 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7951 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7952 vim_free(AUGROUP_NAME(i));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7953 AUGROUP_NAME(i) = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7954 }
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 * Find the ID of an autocmd group name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7959 * Return it's ID. Returns AUGROUP_ERROR (< 0) for error.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7960 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7961 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7962 au_find_group(name)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7963 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7964 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7965 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7966
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7967 for (i = 0; i < augroups.ga_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7968 if (AUGROUP_NAME(i) != NULL && STRCMP(AUGROUP_NAME(i), name) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7969 return i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7970 return AUGROUP_ERROR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7971 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7972
461
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7973 /*
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7974 * Return TRUE if augroup "name" exists.
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7975 */
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7976 int
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7977 au_has_group(name)
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7978 char_u *name;
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7979 {
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7980 return au_find_group(name) != AUGROUP_ERROR;
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7981 }
f98374445f66 updated for version 7.0123
vimboss
parents: 444
diff changeset
7982
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7983 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7984 * ":augroup {name}".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7985 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7986 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7987 do_augroup(arg, del_group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7988 char_u *arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7989 int del_group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7990 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7991 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7992
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7993 if (del_group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7994 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7995 if (*arg == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7996 EMSG(_(e_argreq));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7997 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7998 au_del_group(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
7999 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8000 else if (STRICMP(arg, "end") == 0) /* ":aug end": back to group 0 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8001 current_augroup = AUGROUP_DEFAULT;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8002 else if (*arg) /* ":aug xxx": switch to group xxx */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8003 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8004 i = au_new_group(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8005 if (i != AUGROUP_ERROR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8006 current_augroup = i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8007 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8008 else /* ":aug": list the group names */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8009 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8010 msg_start();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8011 for (i = 0; i < augroups.ga_len; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8012 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8013 if (AUGROUP_NAME(i) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8014 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8015 msg_puts(AUGROUP_NAME(i));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8016 msg_puts((char_u *)" ");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8017 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8018 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8019 msg_clr_eos();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8020 msg_end();
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
355
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8024 #if defined(EXITFREE) || defined(PROTO)
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8025 void
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8026 free_all_autocmds()
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8027 {
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8028 for (current_augroup = -1; current_augroup < augroups.ga_len;
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8029 ++current_augroup)
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8030 do_autocmd((char_u *)"", TRUE);
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8031 ga_clear_strings(&augroups);
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8032 }
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8033 #endif
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8034
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8035 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8036 * Return the event number for event name "start".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8037 * Return NUM_EVENTS if the event name was not found.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8038 * Return a pointer to the next event name in "end".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8039 */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8040 static event_T
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8041 event_name2nr(start, end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8042 char_u *start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8043 char_u **end;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8044 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8045 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8046 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8047 int len;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8048
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8049 /* the event name ends with end of line, a blank or a comma */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8050 for (p = start; *p && !vim_iswhite(*p) && *p != ','; ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8051 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8052 for (i = 0; event_names[i].name != NULL; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8053 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8054 len = (int)STRLEN(event_names[i].name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8055 if (len == p - start && STRNICMP(event_names[i].name, start, len) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8056 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8057 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8058 if (*p == ',')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8059 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8060 *end = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8061 if (event_names[i].name == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8062 return NUM_EVENTS;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8063 return event_names[i].event;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8064 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8065
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8066 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8067 * Return the name for event "event".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8068 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8069 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8070 event_nr2name(event)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8071 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8072 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8073 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8074
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8075 for (i = 0; event_names[i].name != NULL; ++i)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8076 if (event_names[i].event == event)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8077 return (char_u *)event_names[i].name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8078 return (char_u *)"Unknown";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8079 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8080
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8081 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8082 * Scan over the events. "*" stands for all events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8083 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8084 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8085 find_end_event(arg, have_group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8086 char_u *arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8087 int have_group; /* TRUE when group name was found */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8088 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8089 char_u *pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8090 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8091
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8092 if (*arg == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8093 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8094 if (arg[1] && !vim_iswhite(arg[1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8095 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8096 EMSG2(_("E215: Illegal character after *: %s"), arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8097 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8098 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8099 pat = arg + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8100 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8101 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8102 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8103 for (pat = arg; *pat && !vim_iswhite(*pat); pat = p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8104 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8105 if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8106 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8107 if (have_group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8108 EMSG2(_("E216: No such event: %s"), pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8109 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8110 EMSG2(_("E216: No such group or event: %s"), pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8111 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8112 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8113 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8114 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8115 return pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8116 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8117
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8118 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8119 * Return TRUE if "event" is included in 'eventignore'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8120 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8121 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8122 event_ignored(event)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8123 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8124 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8125 char_u *p = p_ei;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8126
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8127 while (*p != NUL)
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8128 {
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8129 if (STRNICMP(p, "all", 3) == 0 && (p[3] == NUL || p[3] == ','))
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8130 return TRUE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8131 if (event_name2nr(p, &p) == event)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8132 return TRUE;
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8133 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8134
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8135 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8136 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8137
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8138 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8139 * Return OK when the contents of p_ei is valid, FAIL otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8140 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8141 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8142 check_ei()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8143 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8144 char_u *p = p_ei;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8145
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8146 while (*p)
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8147 {
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8148 if (STRNICMP(p, "all", 3) == 0 && (p[3] == NUL || p[3] == ','))
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8149 {
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8150 p += 3;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8151 if (*p == ',')
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8152 ++p;
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8153 }
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8154 else if (event_name2nr(p, &p) == NUM_EVENTS)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8155 return FAIL;
844
d3bbb5dd3913 updated for version 7.0f02
vimboss
parents: 837
diff changeset
8156 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8157
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8158 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8159 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8160
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8161 # if defined(FEAT_SYN_HL) || defined(PROTO)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8162
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8163 /*
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8164 * Add "what" to 'eventignore' to skip loading syntax highlighting for every
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8165 * buffer loaded into the window. "what" must start with a comma.
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8166 * Returns the old value of 'eventignore' in allocated memory.
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8167 */
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8168 char_u *
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8169 au_event_disable(what)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8170 char *what;
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8171 {
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8172 char_u *new_ei;
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8173 char_u *save_ei;
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8174
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8175 save_ei = vim_strsave(p_ei);
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8176 if (save_ei != NULL)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8177 {
557
862863033fdd updated for version 7.0158
vimboss
parents: 550
diff changeset
8178 new_ei = vim_strnsave(p_ei, (int)(STRLEN(p_ei) + STRLEN(what)));
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8179 if (new_ei != NULL)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8180 {
2095
8aa3cd045aef updated for version 7.2.379
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
8181 if (*what == ',' && *p_ei == NUL)
8aa3cd045aef updated for version 7.2.379
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
8182 STRCPY(new_ei, what + 1);
8aa3cd045aef updated for version 7.2.379
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
8183 else
8aa3cd045aef updated for version 7.2.379
Bram Moolenaar <bram@zimbu.org>
parents: 2047
diff changeset
8184 STRCAT(new_ei, what);
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
8185 set_string_option_direct((char_u *)"ei", -1, new_ei,
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
8186 OPT_FREE, SID_NONE);
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8187 vim_free(new_ei);
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8188 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8189 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8190 return save_ei;
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8191 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8192
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8193 void
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8194 au_event_restore(old_ei)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8195 char_u *old_ei;
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8196 {
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8197 if (old_ei != NULL)
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8198 {
694
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
8199 set_string_option_direct((char_u *)"ei", -1, old_ei,
07d199fe02ed updated for version 7.0209
vimboss
parents: 681
diff changeset
8200 OPT_FREE, SID_NONE);
123
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8201 vim_free(old_ei);
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8202 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8203 }
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8204 # endif /* FEAT_SYN_HL */
f67f8a8d81ba updated for version 7.0043
vimboss
parents: 41
diff changeset
8205
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8206 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8207 * do_autocmd() -- implements the :autocmd command. Can be used in the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8208 * following ways:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8209 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8210 * :autocmd <event> <pat> <cmd> Add <cmd> to the list of commands that
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8211 * will be automatically executed for <event>
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8212 * when editing a file matching <pat>, in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8213 * the current group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8214 * :autocmd <event> <pat> Show the auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8215 * <event> and <pat>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8216 * :autocmd <event> Show the auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8217 * <event>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8218 * :autocmd Show all auto-commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8219 * :autocmd! <event> <pat> <cmd> Remove all auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8220 * <event> and <pat>, and add the command
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8221 * <cmd>, for the current group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8222 * :autocmd! <event> <pat> Remove all auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8223 * <event> and <pat> for the current group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8224 * :autocmd! <event> Remove all auto-commands associated with
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8225 * <event> for the current group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8226 * :autocmd! Remove ALL auto-commands for the current
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8227 * group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8228 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8229 * Multiple events and patterns may be given separated by commas. Here are
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8230 * some examples:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8231 * :autocmd bufread,bufenter *.c,*.h set tw=0 smartindent noic
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8232 * :autocmd bufleave * set tw=79 nosmartindent ic infercase
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8233 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8234 * :autocmd * *.c show all autocommands for *.c files.
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
8235 *
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
8236 * Mostly a {group} argument can optionally appear before <event>.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8237 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8238 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8239 do_autocmd(arg, forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8240 char_u *arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8241 int forceit;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8242 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8243 char_u *pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8244 char_u *envpat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8245 char_u *cmd;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8246 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8247 int need_free = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8248 int nested = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8249 int group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8250
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8251 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8252 * Check for a legal group name. If not, use AUGROUP_ALL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8253 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8254 group = au_get_grouparg(&arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8255 if (arg == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8256 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8257
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8258 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8259 * Scan over the events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8260 * If we find an illegal name, return here, don't do anything.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8261 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8262 pat = find_end_event(arg, group != AUGROUP_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8263 if (pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8264 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8265
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8266 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8267 * Scan over the pattern. Put a NUL at the end.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8268 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8269 pat = skipwhite(pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8270 cmd = pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8271 while (*cmd && (!vim_iswhite(*cmd) || cmd[-1] == '\\'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8272 cmd++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8273 if (*cmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8274 *cmd++ = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8275
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8276 /* Expand environment variables in the pattern. Set 'shellslash', we want
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8277 * forward slashes here. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8278 if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8279 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8280 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8281 int p_ssl_save = p_ssl;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8282
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8283 p_ssl = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8284 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8285 envpat = expand_env_save(pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8286 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8287 p_ssl = p_ssl_save;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8288 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8289 if (envpat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8290 pat = envpat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8291 }
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 * Check for "nested" flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8295 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8296 cmd = skipwhite(cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8297 if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0 && vim_iswhite(cmd[6]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8298 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8299 nested = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8300 cmd = skipwhite(cmd + 6);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8301 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8302
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8303 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8304 * Find the start of the commands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8305 * Expand <sfile> in it.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8306 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8307 if (*cmd != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8308 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8309 cmd = expand_sfile(cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8310 if (cmd == NULL) /* some error */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8311 return;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8312 need_free = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8313 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8314
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8315 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8316 * Print header when showing autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8317 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8318 if (!forceit && *cmd == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8319 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8320 /* Highlight title */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8321 MSG_PUTS_TITLE(_("\n--- Auto-Commands ---"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8322 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8323
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8324 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8325 * Loop over the events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8326 */
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8327 last_event = (event_T)-1; /* for listing the event name */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8328 last_group = AUGROUP_ERROR; /* for listing the group name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8329 if (*arg == '*' || *arg == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8330 {
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8331 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8332 event = (event_T)((int)event + 1))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8333 if (do_autocmd_event(event, pat,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8334 nested, cmd, forceit, group) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8335 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8336 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8337 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8338 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8339 while (*arg && !vim_iswhite(*arg))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8340 if (do_autocmd_event(event_name2nr(arg, &arg), pat,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8341 nested, cmd, forceit, group) == FAIL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8342 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8343 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8344
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8345 if (need_free)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8346 vim_free(cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8347 vim_free(envpat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8348 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8349
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8350 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8351 * Find the group ID in a ":autocmd" or ":doautocmd" argument.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8352 * The "argp" argument is advanced to the following argument.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8353 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8354 * Returns the group ID, AUGROUP_ERROR for error (out of memory).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8355 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8356 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8357 au_get_grouparg(argp)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8358 char_u **argp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8359 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8360 char_u *group_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8361 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8362 char_u *arg = *argp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8363 int group = AUGROUP_ALL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8364
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8365 p = skiptowhite(arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8366 if (p > arg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8367 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8368 group_name = vim_strnsave(arg, (int)(p - arg));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8369 if (group_name == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8370 return AUGROUP_ERROR;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8371 group = au_find_group(group_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8372 if (group == AUGROUP_ERROR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8373 group = AUGROUP_ALL; /* no match, use all groups */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8374 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8375 *argp = skipwhite(p); /* match, skip over group name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8376 vim_free(group_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8377 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8378 return group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8379 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8380
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8381 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8382 * do_autocmd() for one event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8383 * If *pat == NUL do for all patterns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8384 * If *cmd == NUL show entries.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8385 * If forceit == TRUE delete entries.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8386 * If group is not AUGROUP_ALL, only use this group.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8387 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8388 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8389 do_autocmd_event(event, pat, nested, cmd, forceit, group)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8390 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8391 char_u *pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8392 int nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8393 char_u *cmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8394 int forceit;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8395 int group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8396 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8397 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8398 AutoPat **prev_ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8399 AutoCmd *ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8400 AutoCmd **prev_ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8401 int brace_level;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8402 char_u *endpat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8403 int findgroup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8404 int allgroups;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8405 int patlen;
856
8cd729851562 updated for version 7.0g
vimboss
parents: 844
diff changeset
8406 int is_buflocal;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8407 int buflocal_nr;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8408 char_u buflocal_pat[25]; /* for "<buffer=X>" */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8409
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8410 if (group == AUGROUP_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8411 findgroup = current_augroup;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8412 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8413 findgroup = group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8414 allgroups = (group == AUGROUP_ALL && !forceit && *cmd == NUL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8415
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8416 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8417 * Show or delete all patterns for an event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8418 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8419 if (*pat == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8420 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8421 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8422 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8423 if (forceit) /* delete the AutoPat, if it's in the current group */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8424 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8425 if (ap->group == findgroup)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8426 au_remove_pat(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8427 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8428 else if (group == AUGROUP_ALL || ap->group == group)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8429 show_autocmd(ap, event);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8430 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8431 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8432
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8433 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8434 * Loop through all the specified patterns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8435 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8436 for ( ; *pat; pat = (*endpat == ',' ? endpat + 1 : endpat))
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 * Find end of the pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8440 * Watch out for a comma in braces, like "*.\{obj,o\}".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8441 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8442 brace_level = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8443 for (endpat = pat; *endpat && (*endpat != ',' || brace_level
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8444 || endpat[-1] == '\\'); ++endpat)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8445 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8446 if (*endpat == '{')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8447 brace_level++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8448 else if (*endpat == '}')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8449 brace_level--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8450 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8451 if (pat == endpat) /* ignore single comma */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8452 continue;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8453 patlen = (int)(endpat - pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8454
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8455 /*
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8456 * detect special <buflocal[=X]> buffer-local patterns
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8457 */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8458 is_buflocal = FALSE;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8459 buflocal_nr = 0;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8460
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8461 if (patlen >= 7 && STRNCMP(pat, "<buffer", 7) == 0
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8462 && pat[patlen - 1] == '>')
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8463 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8464 /* Error will be printed only for addition. printing and removing
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8465 * will proceed silently. */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8466 is_buflocal = TRUE;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8467 if (patlen == 8)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8468 buflocal_nr = curbuf->b_fnum;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8469 else if (patlen > 9 && pat[7] == '=')
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8470 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8471 /* <buffer=abuf> */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8472 if (patlen == 13 && STRNICMP(pat, "<buffer=abuf>", 13))
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8473 buflocal_nr = autocmd_bufnr;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8474 /* <buffer=123> */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8475 else if (skipdigits(pat + 8) == pat + patlen - 1)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8476 buflocal_nr = atoi((char *)pat + 8);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8477 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8478 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8479
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8480 if (is_buflocal)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8481 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8482 /* normalize pat into standard "<buffer>#N" form */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8483 sprintf((char *)buflocal_pat, "<buffer=%d>", buflocal_nr);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8484 pat = buflocal_pat; /* can modify pat and patlen */
835
8bebcabccc2c updated for version 7.0e01
vimboss
parents: 834
diff changeset
8485 patlen = (int)STRLEN(buflocal_pat); /* but not endpat */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8486 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8487
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8488 /*
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8489 * Find AutoPat entries with this pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8490 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8491 prev_ap = &first_autopat[(int)event];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8492 while ((ap = *prev_ap) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8493 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8494 if (ap->pat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8495 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8496 /* Accept a pattern when:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8497 * - a group was specified and it's that group, or a group was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8498 * not specified and it's the current group, or a group was
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8499 * not specified and we are listing
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8500 * - the length of the pattern matches
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8501 * - the pattern matches.
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8502 * For <buffer[=X]>, this condition works because we normalize
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8503 * all buffer-local patterns.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8504 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8505 if ((allgroups || ap->group == findgroup)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8506 && ap->patlen == patlen
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8507 && STRNCMP(pat, ap->pat, patlen) == 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8508 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8509 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8510 * Remove existing autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8511 * If adding any new autocmd's for this AutoPat, don't
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8512 * delete the pattern from the autopat list, append to
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8513 * this list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8514 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8515 if (forceit)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8516 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8517 if (*cmd != NUL && ap->next == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8518 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8519 au_remove_cmds(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8520 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8521 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8522 au_remove_pat(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8523 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8525 /*
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8526 * Show autocmd's for this autopat, or buflocals <buffer=X>
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8527 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8528 else if (*cmd == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8529 show_autocmd(ap, event);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8530
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8531 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8532 * Add autocmd to this autopat, if it's the last one.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8533 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8534 else if (ap->next == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8535 break;
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 prev_ap = &ap->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8539 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8540
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8541 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8542 * Add a new command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8543 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8544 if (*cmd != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8545 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8546 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8547 * If the pattern we want to add a command to does appear at the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8548 * 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
8549 * pattern at the end of the list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8550 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8551 if (ap == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8552 {
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8553 /* refuse to add buffer-local ap if buffer number is invalid */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8554 if (is_buflocal && (buflocal_nr == 0
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8555 || buflist_findnr(buflocal_nr) == NULL))
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8556 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8557 EMSGN(_("E680: <buffer=%d>: invalid buffer number "),
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8558 buflocal_nr);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8559 return FAIL;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8560 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8561
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8562 ap = (AutoPat *)alloc((unsigned)sizeof(AutoPat));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8563 if (ap == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8564 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8565 ap->pat = vim_strnsave(pat, patlen);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8566 ap->patlen = patlen;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8567 if (ap->pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8568 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8569 vim_free(ap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8570 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8571 }
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8572
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8573 if (is_buflocal)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8574 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8575 ap->buflocal_nr = buflocal_nr;
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8576 ap->reg_prog = NULL;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8577 }
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8578 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8579 {
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8580 char_u *reg_pat;
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8581
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8582 ap->buflocal_nr = 0;
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8583 reg_pat = file_pat_to_reg_pat(pat, endpat,
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8584 &ap->allow_dirs, TRUE);
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8585 if (reg_pat != NULL)
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8586 ap->reg_prog = vim_regcomp(reg_pat, RE_MAGIC);
355
644578c9e219 updated for version 7.0092
vimboss
parents: 344
diff changeset
8587 vim_free(reg_pat);
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
8588 if (reg_pat == NULL || ap->reg_prog == NULL)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8589 {
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8590 vim_free(ap->pat);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8591 vim_free(ap);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8592 return FAIL;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
8593 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8594 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8595 ap->cmds = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8596 *prev_ap = ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8597 ap->next = NULL;
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 ap->group = 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 ap->group = group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8602 }
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 * Add the autocmd at the end of the AutoCmd list.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8606 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8607 prev_ac = &(ap->cmds);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8608 while ((ac = *prev_ac) != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8609 prev_ac = &ac->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8610 ac = (AutoCmd *)alloc((unsigned)sizeof(AutoCmd));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8611 if (ac == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8612 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8613 ac->cmd = vim_strsave(cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8614 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8615 ac->scriptID = current_SID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8616 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8617 if (ac->cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8618 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8619 vim_free(ac);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8620 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8621 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8622 ac->next = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8623 *prev_ac = ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8624 ac->nested = nested;
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
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8628 au_cleanup(); /* may really delete removed patterns/commands now */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8629 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8630 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8631
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8632 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8633 * Implementation of ":doautocmd [group] event [fname]".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8634 * Return OK for success, FAIL for failure;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8635 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8636 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8637 do_doautocmd(arg, do_msg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8638 char_u *arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8639 int do_msg; /* give message for no matching autocmds? */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8640 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8641 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8642 int nothing_done = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8643 int group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8644
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8645 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8646 * Check for a legal group name. If not, use AUGROUP_ALL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8647 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8648 group = au_get_grouparg(&arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8649 if (arg == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8650 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8651
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8652 if (*arg == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8653 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8654 EMSG(_("E217: Can't execute autocommands for ALL events"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8655 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8656 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8657
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8658 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8659 * Scan over the events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8660 * If we find an illegal name, return here, don't do anything.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8661 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8662 fname = find_end_event(arg, group != AUGROUP_ALL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8663 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8664 return FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8665
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8666 fname = skipwhite(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8667
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8668 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8669 * Loop over the events.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8670 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8671 while (*arg && !vim_iswhite(*arg))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8672 if (apply_autocmds_group(event_name2nr(arg, &arg),
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8673 fname, NULL, TRUE, group, curbuf, NULL))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8674 nothing_done = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8675
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8676 if (nothing_done && do_msg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8677 MSG(_("No matching autocommands"));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8678
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8679 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8680 return aborting() ? FAIL : OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8681 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8682 return OK;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8683 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8684 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8685
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8686 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8687 * ":doautoall": execute autocommands for each loaded buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8688 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8689 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8690 ex_doautoall(eap)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8691 exarg_T *eap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8692 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8693 int retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8694 aco_save_T aco;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8695 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8696
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8697 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8698 * This is a bit tricky: For some commands curwin->w_buffer needs to be
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8699 * equal to curbuf, but for some buffers there may not be a window.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8700 * So we change the buffer for the current window for a moment. This
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8701 * gives problems when the autocommands make changes to the list of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8702 * buffers or windows...
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8703 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8704 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8705 {
1665
5c3844ad7d56 updated for version 7.2a-017
vimboss
parents: 1653
diff changeset
8706 if (buf->b_ml.ml_mfp != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8707 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8708 /* find a window for this buffer and save some values */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8709 aucmd_prepbuf(&aco, buf);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8710
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8711 /* execute the autocommands for this buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8712 retval = do_doautocmd(eap->arg, FALSE);
1113
1df41c98fc2e updated for version 7.0-239
vimboss
parents: 1076
diff changeset
8713
1df41c98fc2e updated for version 7.0-239
vimboss
parents: 1076
diff changeset
8714 /* Execute the modeline settings, but don't set window-local
1df41c98fc2e updated for version 7.0-239
vimboss
parents: 1076
diff changeset
8715 * options if we are using the current window for another buffer. */
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8716 do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8717
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8718 /* restore the current window */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8719 aucmd_restbuf(&aco);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8720
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8721 /* stop if there is some error or buffer was deleted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8722 if (retval == FAIL || !buf_valid(buf))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8723 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8724 }
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 check_cursor(); /* just in case lines got deleted */
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 * Prepare for executing autocommands for (hidden) buffer "buf".
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8732 * 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
8733 * one then use "aucmd_win".
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8734 * Set "curbuf" and "curwin" to match "buf".
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
8735 * When FEAT_AUTOCMD is not defined another version is used, see below.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8736 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8737 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8738 aucmd_prepbuf(aco, buf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8739 aco_save_T *aco; /* structure to save values in */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8740 buf_T *buf; /* new curbuf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8741 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8742 win_T *win;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8743 #ifdef FEAT_WINDOWS
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8744 int save_ea;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8745 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8746
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8747 /* Find a window that is for the new buffer */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8748 if (buf == curbuf) /* be quick when buf is curbuf */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8749 win = curwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8750 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8751 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8752 for (win = firstwin; win != NULL; win = win->w_next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8753 if (win->w_buffer == buf)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8754 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8755 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8756 win = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8757 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8758
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8759 /* Allocate "aucmd_win" when needed. If this fails (out of memory) fall
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8760 * back to using the current window. */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8761 if (win == NULL && aucmd_win == NULL)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8762 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8763 win_alloc_aucmd_win();
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8764 if (aucmd_win == NULL)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8765 win = curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8766 }
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8767 if (win == NULL && aucmd_win_used)
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8768 /* Strange recursive autocommand, fall back to using the current
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8769 * window. Expect a few side effects... */
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8770 win = curwin;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8771
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8772 aco->save_curwin = curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8773 aco->save_curbuf = curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8774 if (win != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8775 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8776 /* 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
8777 * curwin. This is preferred, it has the least side effects (esp. if
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8778 * "buf" is curbuf). */
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8779 aco->use_aucmd_win = FALSE;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8780 curwin = win;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8781 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8782 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8783 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8784 /* There is no window for "buf", use "aucmd_win". To minimize the side
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8785 * effects, insert it in a the current tab page.
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8786 * Anything related to a window (e.g., setting folds) may have
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8787 * unexpected results. */
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8788 aco->use_aucmd_win = TRUE;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8789 aucmd_win_used = TRUE;
1918
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
8790 aucmd_win->w_buffer = buf;
2258
772bfca06c18 Fix crash when using ":grep".
Bram Moolenaar <bram@vim.org>
parents: 2244
diff changeset
8791 aucmd_win->w_s = &buf->b_s;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8792 ++buf->b_nwindows;
1918
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
8793 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
8794 vim_free(aucmd_win->w_localdir);
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8795 aucmd_win->w_localdir = NULL;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8796
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8797 /* 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
8798 * win_enter_ext(). */
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8799 aucmd_win->w_localdir = NULL;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8800 aco->globaldir = globaldir;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8801 globaldir = NULL;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8802
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8803
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8804 #ifdef FEAT_WINDOWS
1923
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
8805 /* Split the current window, put the aucmd_win in the upper half.
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
8806 * We don't want the BufEnter or WinEnter autocommands. */
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
8807 block_autocmds();
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8808 make_snapshot(SNAP_AUCMD_IDX);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8809 save_ea = p_ea;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8810 p_ea = FALSE;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8811 (void)win_split_ins(0, WSP_TOP, aucmd_win, 0);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8812 (void)win_comp_pos(); /* recompute window positions */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8813 p_ea = save_ea;
1923
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
8814 unblock_autocmds();
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8815 #endif
1918
eac2556d4620 updated for version 7.2-215
vimboss
parents: 1913
diff changeset
8816 curwin = aucmd_win;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8817 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8818 curbuf = buf;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8819 aco->new_curwin = curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8820 aco->new_curbuf = curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8821 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8822
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8823 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8824 * Cleanup after executing autocommands for a (hidden) buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8825 * Restore the window as it was (if possible).
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
8826 * When FEAT_AUTOCMD is not defined another version is used, see below.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8827 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8828 void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8829 aucmd_restbuf(aco)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8830 aco_save_T *aco; /* structure holding saved values */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8831 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8832 #ifdef FEAT_WINDOWS
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8833 int dummy;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8834 #endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8835
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8836 if (aco->use_aucmd_win)
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8837 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8838 --curbuf->b_nwindows;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8839 #ifdef FEAT_WINDOWS
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8840 /* 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
8841 * page. Do not trigger autocommands here. */
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
8842 block_autocmds();
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8843 if (curwin != aucmd_win)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8844 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8845 tabpage_T *tp;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8846 win_T *wp;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8847
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8848 FOR_ALL_TAB_WINDOWS(tp, wp)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8849 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8850 if (wp == aucmd_win)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8851 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8852 if (tp != curtab)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8853 goto_tabpage_tp(tp);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8854 win_goto(aucmd_win);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8855 break;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8856 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8857 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8858 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8859
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8860 /* Remove the window and frame from the tree of frames. */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8861 (void)winframe_remove(curwin, &dummy, NULL);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8862 win_remove(curwin, NULL);
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8863 aucmd_win_used = FALSE;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8864 last_status(FALSE); /* may need to remove last status line */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8865 restore_snapshot(SNAP_AUCMD_IDX, FALSE);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8866 (void)win_comp_pos(); /* recompute window positions */
1923
3eb34a777f49 updated for version 7.2-220
vimboss
parents: 1918
diff changeset
8867 unblock_autocmds();
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8868
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8869 if (win_valid(aco->save_curwin))
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8870 curwin = aco->save_curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8871 else
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8872 /* Hmm, original window disappeared. Just use the first one. */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8873 curwin = firstwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8874 # ifdef FEAT_EVAL
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8875 vars_clear(&aucmd_win->w_vars.dv_hashtab); /* free all w: variables */
2001
98cdf5c477ec updated for version 7.2-298
vimboss
parents: 1997
diff changeset
8876 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
8877 # endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8878 #else
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8879 curwin = aco->save_curwin;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8880 #endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8881 curbuf = curwin->w_buffer;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8882
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8883 vim_free(globaldir);
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8884 globaldir = aco->globaldir;
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8885
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8886 /* the buffer contents may have changed */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8887 check_cursor();
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8888 if (curwin->w_topline > curbuf->b_ml.ml_line_count)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8889 {
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8890 curwin->w_topline = curbuf->b_ml.ml_line_count;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8891 #ifdef FEAT_DIFF
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8892 curwin->w_topfill = 0;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8893 #endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8894 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8895 #if defined(FEAT_GUI)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8896 /* Hide the scrollbars from the aucmd_win and update. */
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8897 gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_LEFT], FALSE);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8898 gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_RIGHT], FALSE);
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8899 gui_may_update_scrollbars();
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8900 #endif
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8901 }
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8902 else
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8903 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8904 /* restore curwin */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8905 #ifdef FEAT_WINDOWS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8906 if (win_valid(aco->save_curwin))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8907 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8908 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8909 /* Restore the buffer which was previously edited by curwin, if
1944
40a8e388692b updated for version 7.2-241
vimboss
parents: 1923
diff changeset
8910 * 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
8911 * valid. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8912 if (curwin == aco->new_curwin
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8913 && curbuf != aco->new_curbuf
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8914 && buf_valid(aco->new_curbuf)
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8915 && aco->new_curbuf->b_ml.ml_mfp != NULL)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8916 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8917 --curbuf->b_nwindows;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
8918 curbuf = aco->new_curbuf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8919 curwin->w_buffer = curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8920 ++curbuf->b_nwindows;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8921 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8922
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8923 curwin = aco->save_curwin;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8924 curbuf = curwin->w_buffer;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8925 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8926 }
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 static int autocmd_nested = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8930
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8931 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8932 * Execute autocommands for "event" and file name "fname".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8933 * Return TRUE if some commands were executed.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8934 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8935 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8936 apply_autocmds(event, fname, fname_io, force, buf)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8937 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8938 char_u *fname; /* NULL or empty means use actual file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8939 char_u *fname_io; /* fname to use for <afile> on cmdline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8940 int force; /* when TRUE, ignore autocmd_busy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8941 buf_T *buf; /* buffer for <abuf> */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8942 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8943 return apply_autocmds_group(event, fname, fname_io, force,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8944 AUGROUP_ALL, buf, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8945 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8946
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8947 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8948 * Like apply_autocmds(), but with extra "eap" argument. This takes care of
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8949 * setting v:filearg.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8950 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8951 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8952 apply_autocmds_exarg(event, fname, fname_io, force, buf, eap)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8953 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8954 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8955 char_u *fname_io;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8956 int force;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8957 buf_T *buf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8958 exarg_T *eap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8959 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8960 return apply_autocmds_group(event, fname, fname_io, force,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8961 AUGROUP_ALL, buf, eap);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8962 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8963
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8964 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8965 * Like apply_autocmds(), but handles the caller's retval. If the script
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8966 * processing is being aborted or if retval is FAIL when inside a try
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8967 * conditional, no autocommands are executed. If otherwise the autocommands
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8968 * cause the script to be aborted, retval is set to FAIL.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8969 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8970 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8971 apply_autocmds_retval(event, fname, fname_io, force, buf, retval)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
8972 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8973 char_u *fname; /* NULL or empty means use actual file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8974 char_u *fname_io; /* fname to use for <afile> on cmdline */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8975 int force; /* when TRUE, ignore autocmd_busy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8976 buf_T *buf; /* buffer for <abuf> */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8977 int *retval; /* pointer to caller's retval */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8978 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8979 int did_cmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8980
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
8981 #ifdef FEAT_EVAL
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8982 if (should_abort(*retval))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8983 return FALSE;
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
8984 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8985
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8986 did_cmd = apply_autocmds_group(event, fname, fname_io, force,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8987 AUGROUP_ALL, buf, NULL);
532
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
8988 if (did_cmd
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
8989 #ifdef FEAT_EVAL
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
8990 && aborting()
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
8991 #endif
7052f11a3dc9 updated for version 7.0150
vimboss
parents: 531
diff changeset
8992 )
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8993 *retval = FAIL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8994 return did_cmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8995 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
8996
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
8997 /*
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
8998 * Return TRUE when there is a CursorHold autocommand defined.
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
8999 */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9000 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9001 has_cursorhold()
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9002 {
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9003 return (first_autopat[(int)(get_real_state() == NORMAL_BUSY
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9004 ? EVENT_CURSORHOLD : EVENT_CURSORHOLDI)] != NULL);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9005 }
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9006
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9007 /*
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9008 * Return TRUE if the CursorHold event can be triggered.
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9009 */
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9010 int
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9011 trigger_cursorhold()
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9012 {
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9013 int state;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9014
978
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9015 if (!did_cursorhold && has_cursorhold() && !Recording
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9016 #ifdef FEAT_INS_EXPAND
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9017 && !ins_compl_active()
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9018 #endif
0e3e208b4b90 updated for version 7.0-104
vimboss
parents: 968
diff changeset
9019 )
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9020 {
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9021 state = get_real_state();
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9022 if (state == NORMAL_BUSY || (state & INSERT) != 0)
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9023 return TRUE;
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9024 }
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9025 return FALSE;
609
ba54311bc43e updated for version 7.0173
vimboss
parents: 595
diff changeset
9026 }
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9027
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9028 /*
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9029 * Return TRUE when there is a CursorMoved autocommand defined.
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9030 */
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9031 int
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9032 has_cursormoved()
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9033 {
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9034 return (first_autopat[(int)EVENT_CURSORMOVED] != NULL);
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9035 }
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9036
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9037 /*
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9038 * Return TRUE when there is a CursorMovedI autocommand defined.
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9039 */
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9040 int
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9041 has_cursormovedI()
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9042 {
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9043 return (first_autopat[(int)EVENT_CURSORMOVEDI] != NULL);
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9044 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9045
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9046 static int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9047 apply_autocmds_group(event, fname, fname_io, force, group, buf, eap)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9048 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9049 char_u *fname; /* NULL or empty means use actual file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9050 char_u *fname_io; /* fname to use for <afile> on cmdline, NULL means
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9051 use fname */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9052 int force; /* when TRUE, ignore autocmd_busy */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9053 int group; /* group ID, or AUGROUP_ALL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9054 buf_T *buf; /* buffer for <abuf> */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9055 exarg_T *eap; /* command arguments */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9056 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9057 char_u *sfname = NULL; /* short file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9058 char_u *tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9059 int save_changed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9060 buf_T *old_curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9061 int retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9062 char_u *save_sourcing_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9063 linenr_T save_sourcing_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9064 char_u *save_autocmd_fname;
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9065 int save_autocmd_fname_full;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9066 int save_autocmd_bufnr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9067 char_u *save_autocmd_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9068 int save_autocmd_busy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9069 int save_autocmd_nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9070 static int nesting = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9071 AutoPatCmd patcmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9072 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9073 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9074 scid_T save_current_SID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9075 void *save_funccalp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9076 char_u *save_cmdarg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9077 long save_cmdbang;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9078 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9079 static int filechangeshell_busy = FALSE;
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9080 #ifdef FEAT_PROFILE
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9081 proftime_T wait_time;
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9082 #endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9083
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9084 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9085 * Quickly return if there are no autocommands for this event or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9086 * autocommands are blocked.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9087 */
1410
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9088 if (first_autopat[(int)event] == NULL || autocmd_blocked > 0)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9089 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9090
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9091 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9092 * When autocommands are busy, new autocommands are only executed when
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9093 * explicitly enabled with the "nested" flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9094 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9095 if (autocmd_busy && !(force || autocmd_nested))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9096 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9097
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9098 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9099 /*
1201
4d2585cf5950 updated for version 7.1b
vimboss
parents: 1142
diff changeset
9100 * Quickly return when immediately aborting on error, or when an interrupt
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9101 * occurred or an exception was thrown but not caught.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9102 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9103 if (aborting())
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9104 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9105 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9106
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9107 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9108 * FileChangedShell never nests, because it can create an endless loop.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9109 */
765
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
9110 if (filechangeshell_busy && (event == EVENT_FILECHANGEDSHELL
335444c09581 updated for version 7.0225
vimboss
parents: 723
diff changeset
9111 || event == EVENT_FILECHANGEDSHELLPOST))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9112 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9113
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9114 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9115 * Ignore events in 'eventignore'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9116 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9117 if (event_ignored(event))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9118 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9119
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9120 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9121 * Allow nesting of autocommands, but restrict the depth, because it's
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9122 * possible to create an endless loop.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9123 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9124 if (nesting == 10)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9125 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9126 EMSG(_("E218: autocommand nesting too deep"));
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9127 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9128 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9129
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9130 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9131 * Check if these autocommands are disabled. Used when doing ":all" or
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9132 * ":ball".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9133 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9134 if ( (autocmd_no_enter
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9135 && (event == EVENT_WINENTER || event == EVENT_BUFENTER))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9136 || (autocmd_no_leave
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9137 && (event == EVENT_WINLEAVE || event == EVENT_BUFLEAVE)))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9138 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9139
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9140 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9141 * Save the autocmd_* variables and info about the current buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9142 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9143 save_autocmd_fname = autocmd_fname;
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9144 save_autocmd_fname_full = autocmd_fname_full;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9145 save_autocmd_bufnr = autocmd_bufnr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9146 save_autocmd_match = autocmd_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9147 save_autocmd_busy = autocmd_busy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9148 save_autocmd_nested = autocmd_nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9149 save_changed = curbuf->b_changed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9150 old_curbuf = curbuf;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9151
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9152 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9153 * Set the file name to be used for <afile>.
1471
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
9154 * 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
9155 * invalid.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9156 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9157 if (fname_io == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9158 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9159 if (fname != NULL && *fname != NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9160 autocmd_fname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9161 else if (buf != NULL)
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9162 autocmd_fname = buf->b_ffname;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9163 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9164 autocmd_fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9165 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9166 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9167 autocmd_fname = fname_io;
1471
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
9168 if (autocmd_fname != NULL)
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9169 autocmd_fname = vim_strsave(autocmd_fname);
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9170 autocmd_fname_full = FALSE; /* call FullName_save() later */
7
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 * Set the buffer number to be used for <abuf>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9174 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9175 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9176 autocmd_bufnr = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9177 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9178 autocmd_bufnr = buf->b_fnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9179
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9180 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9181 * 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
9182 * Always use the full path of the file name to match with, in case
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9183 * "allow_dirs" is set.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9184 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9185 if (fname == NULL || *fname == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9186 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9187 if (buf == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9188 fname = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9189 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9190 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9191 #ifdef FEAT_SYN_HL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9192 if (event == EVENT_SYNTAX)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9193 fname = buf->b_p_syn;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9194 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9195 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9196 if (event == EVENT_FILETYPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9197 fname = buf->b_p_ft;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9198 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9199 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9200 if (buf->b_sfname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9201 sfname = vim_strsave(buf->b_sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9202 fname = buf->b_ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9203 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9204 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9205 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9206 fname = (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9207 fname = vim_strsave(fname); /* make a copy, so we can change it */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9208 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9209 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9210 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9211 sfname = vim_strsave(fname);
1867
5ea1f7516c2c updated for version 7.2-165
vimboss
parents: 1863
diff changeset
9212 /* Don't try expanding FileType, Syntax, FuncUndefined, WindowID or
5ea1f7516c2c updated for version 7.2-165
vimboss
parents: 1863
diff changeset
9213 * QuickFixCmd* */
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9214 if (event == EVENT_FILETYPE
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9215 || event == EVENT_SYNTAX
1867
5ea1f7516c2c updated for version 7.2-165
vimboss
parents: 1863
diff changeset
9216 || event == EVENT_FUNCUNDEFINED
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9217 || event == EVENT_REMOTEREPLY
649
8157079cea85 updated for version 7.0191
vimboss
parents: 635
diff changeset
9218 || event == EVENT_SPELLFILEMISSING
161
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9219 || event == EVENT_QUICKFIXCMDPRE
6df0106fc595 updated for version 7.0049
vimboss
parents: 153
diff changeset
9220 || event == EVENT_QUICKFIXCMDPOST)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9221 fname = vim_strsave(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9222 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9223 fname = FullName_save(fname, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9224 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9225 if (fname == NULL) /* out of memory */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9226 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9227 vim_free(sfname);
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9228 retval = FALSE;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9229 goto BYPASS_AU;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9230 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9231
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9232 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9233 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9234 * Replace all backslashes with forward slashes. This makes the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9235 * autocommand patterns portable between Unix and MS-DOS.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9236 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9237 if (sfname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9238 forward_slash(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9239 forward_slash(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9240 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9241
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9242 #ifdef VMS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9243 /* remove version for correct match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9244 if (sfname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9245 vms_remove_version(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9246 vms_remove_version(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9247 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9248
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9249 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9250 * Set the name to be used for <amatch>.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9251 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9252 autocmd_match = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9253
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9254
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9255 /* Don't redraw while doing auto commands. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9256 ++RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9257 save_sourcing_name = sourcing_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9258 sourcing_name = NULL; /* don't free this one */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9259 save_sourcing_lnum = sourcing_lnum;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9260 sourcing_lnum = 0; /* no line number here */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9261
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9262 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9263 save_current_SID = current_SID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9264
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9265 # ifdef FEAT_PROFILE
788
b5aed52a4881 updated for version 7.0230
vimboss
parents: 765
diff changeset
9266 if (do_profiling == PROF_YES)
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9267 prof_child_enter(&wait_time); /* doesn't count for the caller itself */
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9268 # endif
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9269
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9270 /* Don't use local function variables, if called from a function */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9271 save_funccalp = save_funccal();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9272 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9273
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9274 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9275 * When starting to execute autocommands, save the search patterns.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9276 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9277 if (!autocmd_busy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9278 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9279 save_search_patterns();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9280 saveRedobuff();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9281 did_filetype = keep_filetype;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9282 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9283
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9284 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9285 * Note that we are applying autocmds. Some commands need to know.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9286 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9287 autocmd_busy = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9288 filechangeshell_busy = (event == EVENT_FILECHANGEDSHELL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9289 ++nesting; /* see matching decrement below */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9290
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9291 /* Remember that FileType was triggered. Used for did_filetype(). */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9292 if (event == EVENT_FILETYPE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9293 did_filetype = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9294
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9295 tail = gettail(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9296
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9297 /* Find first autocommand that matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9298 patcmd.curpat = first_autopat[(int)event];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9299 patcmd.nextcmd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9300 patcmd.group = group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9301 patcmd.fname = fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9302 patcmd.sfname = sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9303 patcmd.tail = tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9304 patcmd.event = event;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9305 patcmd.arg_bufnr = autocmd_bufnr;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9306 patcmd.next = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9307 auto_next_pat(&patcmd, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9308
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9309 /* found one, start executing the autocommands */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9310 if (patcmd.curpat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9311 {
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9312 /* add to active_apc_list */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9313 patcmd.next = active_apc_list;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9314 active_apc_list = &patcmd;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9315
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9316 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9317 /* set v:cmdarg (only when there is a matching pattern) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9318 save_cmdbang = get_vim_var_nr(VV_CMDBANG);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9319 if (eap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9320 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9321 save_cmdarg = set_cmdarg(eap, NULL);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9322 set_vim_var_nr(VV_CMDBANG, (long)eap->forceit);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9323 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9324 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9325 save_cmdarg = NULL; /* avoid gcc warning */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9326 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9327 retval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9328 /* mark the last pattern, to avoid an endless loop when more patterns
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9329 * are added when executing autocommands */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9330 for (ap = patcmd.curpat; ap->next != NULL; ap = ap->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9331 ap->last = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9332 ap->last = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9333 check_lnums(TRUE); /* make sure cursor and topline are valid */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9334 do_cmdline(NULL, getnextac, (void *)&patcmd,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9335 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9336 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9337 if (eap != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9338 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9339 (void)set_cmdarg(NULL, save_cmdarg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9340 set_vim_var_nr(VV_CMDBANG, save_cmdbang);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9341 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9342 #endif
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9343 /* delete from active_apc_list */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9344 if (active_apc_list == &patcmd) /* just in case */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9345 active_apc_list = patcmd.next;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9346 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9347
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9348 --RedrawingDisabled;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9349 autocmd_busy = save_autocmd_busy;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9350 filechangeshell_busy = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9351 autocmd_nested = save_autocmd_nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9352 vim_free(sourcing_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9353 sourcing_name = save_sourcing_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9354 sourcing_lnum = save_sourcing_lnum;
1471
e980e93d2ac2 updated for version 7.1-186
vimboss
parents: 1438
diff changeset
9355 vim_free(autocmd_fname);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9356 autocmd_fname = save_autocmd_fname;
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9357 autocmd_fname_full = save_autocmd_fname_full;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9358 autocmd_bufnr = save_autocmd_bufnr;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9359 autocmd_match = save_autocmd_match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9360 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9361 current_SID = save_current_SID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9362 restore_funccal(save_funccalp);
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9363 # ifdef FEAT_PROFILE
788
b5aed52a4881 updated for version 7.0230
vimboss
parents: 765
diff changeset
9364 if (do_profiling == PROF_YES)
170
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9365 prof_child_exit(&wait_time);
8c60f65311fa updated for version 7.0052
vimboss
parents: 167
diff changeset
9366 # endif
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9367 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9368 vim_free(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9369 vim_free(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9370 --nesting; /* see matching increment above */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9371
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9372 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9373 * When stopping to execute autocommands, restore the search patterns and
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9374 * the redo buffer.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9375 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9376 if (!autocmd_busy)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9377 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9378 restore_search_patterns();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9379 restoreRedobuff();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9380 did_filetype = FALSE;
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 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9384 * Some events don't set or reset the Changed flag.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9385 * Check if still in the same buffer!
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9386 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9387 if (curbuf == old_curbuf
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9388 && (event == EVENT_BUFREADPOST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9389 || event == EVENT_BUFWRITEPOST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9390 || event == EVENT_FILEAPPENDPOST
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9391 || event == EVENT_VIMLEAVE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9392 || event == EVENT_VIMLEAVEPRE))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9393 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9394 #ifdef FEAT_TITLE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9395 if (curbuf->b_changed != save_changed)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9396 need_maketitle = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9397 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9398 curbuf->b_changed = save_changed;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9399 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9400
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9401 au_cleanup(); /* may really delete removed patterns/commands now */
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9402
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9403 BYPASS_AU:
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9404 /* When wiping out a buffer make sure all its buffer-local autocommands
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9405 * are deleted. */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9406 if (event == EVENT_BUFWIPEOUT && buf != NULL)
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9407 aubuflocal_remove(buf);
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9408
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9409 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9410 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9411
1410
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9412 # ifdef FEAT_EVAL
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9413 static char_u *old_termresponse = NULL;
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9414 # endif
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9415
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9416 /*
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9417 * Block triggering autocommands until unblock_autocmd() is called.
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9418 * Can be used recursively, so long as it's symmetric.
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9419 */
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9420 void
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9421 block_autocmds()
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9422 {
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9423 # ifdef FEAT_EVAL
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9424 /* Remember the value of v:termresponse. */
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9425 if (autocmd_blocked == 0)
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9426 old_termresponse = get_vim_var_str(VV_TERMRESPONSE);
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9427 # endif
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9428 ++autocmd_blocked;
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9429 }
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9430
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9431 void
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9432 unblock_autocmds()
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9433 {
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9434 --autocmd_blocked;
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9435
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9436 # ifdef FEAT_EVAL
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9437 /* When v:termresponse was set while autocommands were blocked, trigger
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9438 * the autocommands now. Esp. useful when executing a shell command
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9439 * during startup (vimdiff). */
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9440 if (autocmd_blocked == 0
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9441 && get_vim_var_str(VV_TERMRESPONSE) != old_termresponse)
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9442 apply_autocmds(EVENT_TERMRESPONSE, NULL, NULL, FALSE, curbuf);
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9443 # endif
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9444 }
cdd82acd75b4 updated for version 7.1-125
vimboss
parents: 1352
diff changeset
9445
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9446 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9447 * Find next autocommand pattern that matches.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9448 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9449 static void
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9450 auto_next_pat(apc, stop_at_last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9451 AutoPatCmd *apc;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9452 int stop_at_last; /* stop when 'last' flag is set */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9453 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9454 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9455 AutoCmd *cp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9456 char_u *name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9457 char *s;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9458
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9459 vim_free(sourcing_name);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9460 sourcing_name = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9461
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9462 for (ap = apc->curpat; ap != NULL && !got_int; ap = ap->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9463 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9464 apc->curpat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9465
1723
2e42153b37f1 updated for version 7.2-021
vimboss
parents: 1698
diff changeset
9466 /* 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
9467 * the group matches. For buffer-local autocommands only check the
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9468 * buffer number. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9469 if (ap->pat != NULL && ap->cmds != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9470 && (apc->group == AUGROUP_ALL || apc->group == ap->group))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9471 {
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9472 /* execution-condition */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9473 if (ap->buflocal_nr == 0
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9474 ? (match_file_pat(NULL, ap->reg_prog, apc->fname,
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9475 apc->sfname, apc->tail, ap->allow_dirs))
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9476 : ap->buflocal_nr == apc->arg_bufnr)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9477 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9478 name = event_nr2name(apc->event);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9479 s = _("%s Auto commands for \"%s\"");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9480 sourcing_name = alloc((unsigned)(STRLEN(s)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9481 + STRLEN(name) + ap->patlen + 1));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9482 if (sourcing_name != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9483 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9484 sprintf((char *)sourcing_name, s,
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9485 (char *)name, (char *)ap->pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9486 if (p_verbose >= 8)
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9487 {
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9488 verbose_enter();
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
9489 smsg((char_u *)_("Executing %s"), sourcing_name);
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9490 verbose_leave();
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9491 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9492 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9493
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9494 apc->curpat = ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9495 apc->nextcmd = ap->cmds;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9496 /* mark last command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9497 for (cp = ap->cmds; cp->next != NULL; cp = cp->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9498 cp->last = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9499 cp->last = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9500 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9501 line_breakcheck();
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9502 if (apc->curpat != NULL) /* found a match */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9503 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9504 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9505 if (stop_at_last && ap->last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9506 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9507 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9508 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9509
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9510 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9511 * Get next autocommand command.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9512 * Called by do_cmdline() to get the next line for ":if".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9513 * Returns allocated string, or NULL for end of autocommands.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9514 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9515 static char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9516 getnextac(c, cookie, indent)
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1877
diff changeset
9517 int c UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9518 void *cookie;
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1877
diff changeset
9519 int indent UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9520 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9521 AutoPatCmd *acp = (AutoPatCmd *)cookie;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9522 char_u *retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9523 AutoCmd *ac;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9524
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9525 /* Can be called again after returning the last line. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9526 if (acp->curpat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9527 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9528
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9529 /* repeat until we find an autocommand to execute */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9530 for (;;)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9531 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9532 /* skip removed commands */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9533 while (acp->nextcmd != NULL && acp->nextcmd->cmd == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9534 if (acp->nextcmd->last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9535 acp->nextcmd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9536 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9537 acp->nextcmd = acp->nextcmd->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9538
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9539 if (acp->nextcmd != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9540 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9541
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9542 /* at end of commands, find next pattern that matches */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9543 if (acp->curpat->last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9544 acp->curpat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9545 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9546 acp->curpat = acp->curpat->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9547 if (acp->curpat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9548 auto_next_pat(acp, TRUE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9549 if (acp->curpat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9550 return NULL;
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 ac = acp->nextcmd;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9554
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9555 if (p_verbose >= 9)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9556 {
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9557 verbose_enter_scroll();
273
2463194c8cdd updated for version 7.0073
vimboss
parents: 236
diff changeset
9558 smsg((char_u *)_("autocommand %s"), ac->cmd);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9559 msg_puts((char_u *)"\n"); /* don't overwrite this either */
292
bf6ee000a80c updated for version 7.0077
vimboss
parents: 273
diff changeset
9560 verbose_leave_scroll();
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9561 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9562 retval = vim_strsave(ac->cmd);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9563 autocmd_nested = ac->nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9564 #ifdef FEAT_EVAL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9565 current_SID = ac->scriptID;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9566 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9567 if (ac->last)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9568 acp->nextcmd = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9569 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9570 acp->nextcmd = ac->next;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9571 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9572 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9573
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9574 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9575 * Return TRUE if there is a matching autocommand for "fname".
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9576 * To account for buffer-local autocommands, function needs to know
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9577 * in which buffer the file will be opened.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9578 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9579 int
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9580 has_autocmd(event, sfname, buf)
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9581 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9582 char_u *sfname;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9583 buf_T *buf;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9584 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9585 AutoPat *ap;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9586 char_u *fname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9587 char_u *tail = gettail(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9588 int retval = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9589
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9590 fname = FullName_save(sfname, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9591 if (fname == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9592 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9593
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9594 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9595 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9596 * Replace all backslashes with forward slashes. This makes the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9597 * autocommand patterns portable between Unix and MS-DOS.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9598 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9599 sfname = vim_strsave(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9600 if (sfname != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9601 forward_slash(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9602 forward_slash(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9603 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9604
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9605 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9606 if (ap->pat != NULL && ap->cmds != NULL
856
8cd729851562 updated for version 7.0g
vimboss
parents: 844
diff changeset
9607 && (ap->buflocal_nr == 0
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9608 ? match_file_pat(NULL, ap->reg_prog,
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9609 fname, sfname, tail, ap->allow_dirs)
856
8cd729851562 updated for version 7.0g
vimboss
parents: 844
diff changeset
9610 : buf != NULL && ap->buflocal_nr == buf->b_fnum
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9611 ))
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9612 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9613 retval = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9614 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9615 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9616
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9617 vim_free(fname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9618 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9619 vim_free(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9620 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9621
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9622 return retval;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9623 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9624
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9625 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9626 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9627 * Function given to ExpandGeneric() to obtain the list of autocommand group
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9628 * names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9629 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9630 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9631 get_augroup_name(xp, idx)
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1877
diff changeset
9632 expand_T *xp UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9633 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9634 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9635 if (idx == augroups.ga_len) /* add "END" add the end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9636 return (char_u *)"END";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9637 if (idx >= augroups.ga_len) /* end of list */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9638 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9639 if (AUGROUP_NAME(idx) == NULL) /* skip deleted entries */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9640 return (char_u *)"";
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9641 return AUGROUP_NAME(idx); /* return a name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9642 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9643
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9644 static int include_groups = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9645
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9646 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9647 set_context_in_autocmd(xp, arg, doautocmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9648 expand_T *xp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9649 char_u *arg;
1733
5a7384b9ca66 updated for version 7.2-031
vimboss
parents: 1723
diff changeset
9650 int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9651 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9652 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9653 int group;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9654
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9655 /* check for a group name, skip it if present */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9656 include_groups = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9657 p = arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9658 group = au_get_grouparg(&arg);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9659 if (group == AUGROUP_ERROR)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9660 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9661 /* If there only is a group name that's what we expand. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9662 if (*arg == NUL && group != AUGROUP_ALL && !vim_iswhite(arg[-1]))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9663 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9664 arg = p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9665 group = AUGROUP_ALL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9666 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9667
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9668 /* skip over event name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9669 for (p = arg; *p != NUL && !vim_iswhite(*p); ++p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9670 if (*p == ',')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9671 arg = p + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9672 if (*p == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9673 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9674 if (group == AUGROUP_ALL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9675 include_groups = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9676 xp->xp_context = EXPAND_EVENTS; /* expand event name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9677 xp->xp_pattern = arg;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9678 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9679 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9680
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9681 /* skip over pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9682 arg = skipwhite(p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9683 while (*arg && (!vim_iswhite(*arg) || arg[-1] == '\\'))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9684 arg++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9685 if (*arg)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9686 return arg; /* expand (next) command */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9687
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9688 if (doautocmd)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9689 xp->xp_context = EXPAND_FILES; /* expand file names */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9690 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9691 xp->xp_context = EXPAND_NOTHING; /* pattern is not expanded */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9692 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9693 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9694
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9695 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9696 * Function given to ExpandGeneric() to obtain the list of event names.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9697 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9698 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9699 get_event_name(xp, idx)
1880
e5602d92da8c updated for version 7.2-177
vimboss
parents: 1877
diff changeset
9700 expand_T *xp UNUSED;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9701 int idx;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9702 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9703 if (idx < augroups.ga_len) /* First list group names, if wanted */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9704 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9705 if (!include_groups || AUGROUP_NAME(idx) == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9706 return (char_u *)""; /* skip deleted entries */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9707 return AUGROUP_NAME(idx); /* return a name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9708 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9709 return (char_u *)event_names[idx - augroups.ga_len].name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9710 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9711
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9712 #endif /* FEAT_CMDL_COMPL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9713
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9714 /*
615
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9715 * Return TRUE if autocmd is supported.
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9716 */
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9717 int
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9718 autocmd_supported(name)
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9719 char_u *name;
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9720 {
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9721 char_u *p;
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9722
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9723 return (event_name2nr(name, &p) != NUM_EVENTS);
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9724 }
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9725
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9726 /*
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9727 * Return TRUE if an autocommand is defined for a group, event and
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9728 * pattern: The group can be omitted to accept any group. "event" and "pattern"
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9729 * 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
9730 * any pattern. Buffer-local patterns <buffer> or <buffer=N> are accepted.
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9731 * Used for:
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9732 * exists("#Group") or
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9733 * exists("#Group#Event") or
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9734 * exists("#Group#Event#pat") or
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9735 * exists("#Event") or
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9736 * exists("#Event#pat")
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9737 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9738 int
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9739 au_exists(arg)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9740 char_u *arg;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9741 {
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9742 char_u *arg_save;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9743 char_u *pattern = NULL;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9744 char_u *event_name;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9745 char_u *p;
661
e93a99ef31d0 updated for version 7.0195
vimboss
parents: 649
diff changeset
9746 event_T event;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9747 AutoPat *ap;
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9748 buf_T *buflocal_buf = NULL;
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9749 int group;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9750 int retval = FALSE;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9751
615
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9752 /* 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
9753 arg_save = vim_strsave(arg);
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9754 if (arg_save == NULL)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9755 return FALSE;
615
7fe13e0f5dce updated for version 7.0175
vimboss
parents: 612
diff changeset
9756 p = vim_strchr(arg_save, '#');
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9757 if (p != NULL)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9758 *p++ = NUL;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9759
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9760 /* First, look for an autocmd group name */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9761 group = au_find_group(arg_save);
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9762 if (group == AUGROUP_ERROR)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9763 {
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9764 /* Didn't match a group name, assume the first argument is an event. */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9765 group = AUGROUP_ALL;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9766 event_name = arg_save;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9767 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9768 else
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9769 {
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9770 if (p == NULL)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9771 {
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9772 /* "Group": group name is present and it's recognized */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9773 retval = TRUE;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9774 goto theend;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9775 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9776
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9777 /* Must be "Group#Event" or "Group#Event#pat". */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9778 event_name = p;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9779 p = vim_strchr(event_name, '#');
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9780 if (p != NULL)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9781 *p++ = NUL; /* "Group#Event#pat" */
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9782 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9783
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9784 pattern = p; /* "pattern" is NULL when there is no pattern */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9785
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9786 /* find the index (enum) for the event name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9787 event = event_name2nr(event_name, &p);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9788
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9789 /* return FALSE if the event name is not recognized */
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9790 if (event == NUM_EVENTS)
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9791 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9792
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9793 /* Find the first autocommand for this event.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9794 * If there isn't any, return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9795 * If there is one and no pattern given, return TRUE; */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9796 ap = first_autopat[(int)event];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9797 if (ap == NULL)
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9798 goto theend;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9799
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9800 /* if pattern is "<buffer>", special handling is needed which uses curbuf */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9801 /* for pattern "<buffer=N>, fnamecmp() will work fine */
1962
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
9802 if (pattern != NULL && STRICMP(pattern, "<buffer>") == 0)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9803 buflocal_buf = curbuf;
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9804
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9805 /* Check if there is an autocommand with the given pattern. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9806 for ( ; ap != NULL; ap = ap->next)
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9807 /* only use a pattern when it has not been removed and has commands. */
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9808 /* For buffer-local autocommands, fnamecmp() works fine. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9809 if (ap->pat != NULL && ap->cmds != NULL
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9810 && (group == AUGROUP_ALL || ap->group == group)
1962
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
9811 && (pattern == NULL
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
9812 || (buflocal_buf == NULL
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
9813 ? fnamecmp(ap->pat, pattern) == 0
ba2ac6b5bfb9 updated for version 7.2-259
vimboss
parents: 1957
diff changeset
9814 : ap->buflocal_nr == buflocal_buf->b_fnum)))
612
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9815 {
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9816 retval = TRUE;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9817 break;
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9818 }
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9819
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9820 theend:
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9821 vim_free(arg_save);
b9370cfb091a updated for version 7.0174
vimboss
parents: 609
diff changeset
9822 return retval;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9823 }
40
f1d2a58883b9 updated for version 7.0024
vimboss
parents: 39
diff changeset
9824
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9825 #else /* FEAT_AUTOCMD */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9826
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9827 /*
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9828 * Prepare for executing commands for (hidden) buffer "buf".
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9829 * This is the non-autocommand version, it simply saves "curbuf" and sets
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9830 * "curbuf" and "curwin" to match "buf".
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9831 */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9832 void
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9833 aucmd_prepbuf(aco, buf)
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9834 aco_save_T *aco; /* structure to save values in */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9835 buf_T *buf; /* new curbuf */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9836 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9837 aco->save_curbuf = curbuf;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9838 --curbuf->b_nwindows;
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9839 curbuf = buf;
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9840 curwin->w_buffer = buf;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9841 ++curbuf->b_nwindows;
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9842 }
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9843
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9844 /*
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9845 * Restore after executing commands for a (hidden) buffer.
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9846 * This is the non-autocommand version.
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9847 */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9848 void
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9849 aucmd_restbuf(aco)
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9850 aco_save_T *aco; /* structure holding saved values */
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9851 {
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9852 --curbuf->b_nwindows;
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9853 curbuf = aco->save_curbuf;
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9854 curwin->w_buffer = curbuf;
1906
ff9ecf14efe3 updated for version 7.2-203
vimboss
parents: 1905
diff changeset
9855 ++curbuf->b_nwindows;
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9856 }
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9857
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9858 #endif /* FEAT_AUTOCMD */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9859
934
e44efb3af0d5 updated for version 7.0-060
vimboss
parents: 856
diff changeset
9860
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9861 #if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9862 /*
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9863 * Try matching a filename with a "pattern" ("prog" is NULL), or use the
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9864 * precompiled regprog "prog" ("pattern" is NULL). That avoids calling
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9865 * vim_regcomp() often.
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9866 * Used for autocommands and 'wildignore'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9867 * Returns TRUE if there is a match, FALSE otherwise.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9868 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9869 int
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9870 match_file_pat(pattern, prog, fname, sfname, tail, allow_dirs)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9871 char_u *pattern; /* pattern to match with */
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9872 regprog_T *prog; /* pre-compiled regprog or NULL */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9873 char_u *fname; /* full path of file name */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9874 char_u *sfname; /* short file name or NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9875 char_u *tail; /* tail of path */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9876 int allow_dirs; /* allow matching with dir */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9877 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9878 regmatch_T regmatch;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9879 int result = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9880 #ifdef FEAT_OSFILETYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9881 int no_pattern = FALSE; /* TRUE if check is filetype only */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9882 char_u *type_start;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9883 char_u c;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9884 int match = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9885 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9886
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9887 #ifdef CASE_INSENSITIVE_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9888 regmatch.rm_ic = TRUE; /* Always ignore case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9889 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9890 regmatch.rm_ic = FALSE; /* Don't ever ignore case */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9891 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9892 #ifdef FEAT_OSFILETYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9893 if (*pattern == '<')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9894 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9895 /* There is a filetype condition specified with this pattern.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9896 * Check the filetype matches first. If not, don't bother with the
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9897 * pattern (set regprog to NULL).
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9898 * Always use magic for the regexp.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9899 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9900
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9901 for (type_start = pattern + 1; (c = *pattern); pattern++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9902 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9903 if ((c == ';' || c == '>') && match == FALSE)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9904 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9905 *pattern = NUL; /* Terminate the string */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9906 match = mch_check_filetype(fname, type_start);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9907 *pattern = c; /* Restore the terminator */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9908 type_start = pattern + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9909 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9910 if (c == '>')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9911 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9912 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9913
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9914 /* (c should never be NUL, but check anyway) */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9915 if (match == FALSE || c == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9916 regmatch.regprog = NULL; /* Doesn't match - don't check pat. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9917 else if (*pattern == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9918 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9919 regmatch.regprog = NULL; /* Vim will try to free regprog later */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9920 no_pattern = TRUE; /* Always matches - don't check pat. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9921 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9922 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9923 regmatch.regprog = vim_regcomp(pattern + 1, RE_MAGIC);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9924 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9925 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9926 #endif
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9927 {
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9928 if (prog != NULL)
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9929 regmatch.regprog = prog;
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9930 else
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9931 regmatch.regprog = vim_regcomp(pattern, RE_MAGIC);
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9932 }
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9933
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9934 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9935 * Try for a match with the pattern with:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9936 * 1. the full file name, when the pattern has a '/'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9937 * 2. the short file name, when the pattern has a '/'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9938 * 3. the tail of the file name, when the pattern has no '/'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9939 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9940 if (
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9941 #ifdef FEAT_OSFILETYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9942 /* If the check is for a filetype only and we don't care
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9943 * about the path then skip all the regexp stuff.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9944 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9945 no_pattern ||
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9946 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9947 (regmatch.regprog != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9948 && ((allow_dirs
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9949 && (vim_regexec(&regmatch, fname, (colnr_T)0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9950 || (sfname != NULL
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9951 && vim_regexec(&regmatch, sfname, (colnr_T)0))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9952 || (!allow_dirs && vim_regexec(&regmatch, tail, (colnr_T)0)))))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9953 result = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9954
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9955 if (prog == NULL)
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9956 vim_free(regmatch.regprog);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9957 return result;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9958 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9959 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9960
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9961 #if defined(FEAT_WILDIGN) || defined(PROTO)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9962 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9963 * Return TRUE if a file matches with a pattern in "list".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9964 * "list" is a comma-separated list of patterns, like 'wildignore'.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9965 * "sfname" is the short file name or NULL, "ffname" the long file name.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9966 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9967 int
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9968 match_file_list(list, sfname, ffname)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9969 char_u *list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9970 char_u *sfname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9971 char_u *ffname;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9972 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9973 char_u buf[100];
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9974 char_u *tail;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9975 char_u *regpat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9976 char allow_dirs;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9977 int match;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9978 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9979
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9980 tail = gettail(sfname);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9981
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9982 /* try all patterns in 'wildignore' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9983 p = list;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9984 while (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9985 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9986 copy_option_part(&p, buf, 100, ",");
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9987 regpat = file_pat_to_reg_pat(buf, NULL, &allow_dirs, FALSE);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9988 if (regpat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9989 break;
153
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9990 match = match_file_pat(regpat, NULL, ffname, sfname,
19670b05ee32 updated for version 7.0047
vimboss
parents: 123
diff changeset
9991 tail, (int)allow_dirs);
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9992 vim_free(regpat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9993 if (match)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9994 return TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9995 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9996 return FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9997 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9998 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
9999
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10000 /*
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10001 * Convert the given pattern "pat" which has shell style wildcards in it, into
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10002 * a regular expression, and return the result in allocated memory. If there
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10003 * is a directory path separator to be matched, then TRUE is put in
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10004 * allow_dirs, otherwise FALSE is put there -- webb.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10005 * Handle backslashes before special characters, like "\*" and "\ ".
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10006 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10007 * If FEAT_OSFILETYPE defined then pass initial <type> through unchanged. Eg:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10008 * '<html>myfile' becomes '<html>^myfile$' -- leonard.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10009 *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10010 * Returns NULL when out of memory.
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10011 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10012 char_u *
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10013 file_pat_to_reg_pat(pat, pat_end, allow_dirs, no_bslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10014 char_u *pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10015 char_u *pat_end; /* first char after pattern or NULL */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10016 char *allow_dirs; /* Result passed back out in here */
1877
b5c1cb6f8d56 updated for version 7.2-174
vimboss
parents: 1873
diff changeset
10017 int no_bslash UNUSED; /* Don't use a backward slash as pathsep */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10018 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10019 int size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10020 char_u *endp;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10021 char_u *reg_pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10022 char_u *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10023 int i;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10024 int nested = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10025 int add_dollar = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10026 #ifdef FEAT_OSFILETYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10027 int check_length = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10028 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10029
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10030 if (allow_dirs != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10031 *allow_dirs = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10032 if (pat_end == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10033 pat_end = pat + STRLEN(pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10034
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10035 #ifdef FEAT_OSFILETYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10036 /* Find out how much of the string is the filetype check */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10037 if (*pat == '<')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10038 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10039 /* Count chars until the next '>' */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10040 for (p = pat + 1; p < pat_end && *p != '>'; p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10041 ;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10042 if (p < pat_end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10043 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10044 /* Pattern is of the form <.*>.* */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10045 check_length = p - pat + 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10046 if (p + 1 >= pat_end)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10047 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10048 /* The 'pattern' is a filetype check ONLY */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10049 reg_pat = (char_u *)alloc(check_length + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10050 if (reg_pat != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10051 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10052 mch_memmove(reg_pat, pat, (size_t)check_length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10053 reg_pat[check_length] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10054 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10055 return reg_pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10056 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10057 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10058 /* else: there was no closing '>' - assume it was a normal pattern */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10059
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10060 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10061 pat += check_length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10062 size = 2 + check_length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10063 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10064 size = 2; /* '^' at start, '$' at end */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10065 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10066
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10067 for (p = pat; p < pat_end; p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10068 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10069 switch (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10070 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10071 case '*':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10072 case '.':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10073 case ',':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10074 case '{':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10075 case '}':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10076 case '~':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10077 size += 2; /* extra backslash */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10078 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10079 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10080 case '\\':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10081 case '/':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10082 size += 4; /* could become "[\/]" */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10083 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10084 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10085 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10086 size++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10087 # ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
10088 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10089 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10090 ++p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10091 ++size;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10092 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10093 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10094 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10095 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10096 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10097 reg_pat = alloc(size + 1);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10098 if (reg_pat == NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10099 return NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10100
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10101 #ifdef FEAT_OSFILETYPE
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10102 /* Copy the type check in to the start. */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10103 if (check_length)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10104 mch_memmove(reg_pat, pat - check_length, (size_t)check_length);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10105 i = check_length;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10106 #else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10107 i = 0;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10108 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10109
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10110 if (pat[0] == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10111 while (pat[0] == '*' && pat < pat_end - 1)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10112 pat++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10113 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10114 reg_pat[i++] = '^';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10115 endp = pat_end - 1;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10116 if (*endp == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10117 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10118 while (endp - pat > 0 && *endp == '*')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10119 endp--;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10120 add_dollar = FALSE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10121 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10122 for (p = pat; *p && nested >= 0 && p <= endp; p++)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10123 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10124 switch (*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10125 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10126 case '*':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10127 reg_pat[i++] = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10128 reg_pat[i++] = '*';
444
d0d15b184c56 updated for version 7.0116
vimboss
parents: 434
diff changeset
10129 while (p[1] == '*') /* "**" matches like "*" */
d0d15b184c56 updated for version 7.0116
vimboss
parents: 434
diff changeset
10130 ++p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10131 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10132 case '.':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10133 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10134 if (allow_dirs != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10135 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10136 /* FALLTHROUGH */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10137 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10138 case '~':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10139 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10140 reg_pat[i++] = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10141 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10142 case '?':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10143 #ifdef RISCOS
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10144 case '#':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10145 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10146 reg_pat[i++] = '.';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10147 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10148 case '\\':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10149 if (p[1] == NUL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10150 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10151 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10152 if (!no_bslash)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10153 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10154 /* translate:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10155 * "\x" to "\\x" e.g., "dir\file"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10156 * "\*" to "\\.*" e.g., "dir\*.c"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10157 * "\?" to "\\." e.g., "dir\??.c"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10158 * "\+" to "\+" e.g., "fileX\+.c"
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10159 */
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10160 if ((vim_isfilec(p[1]) || p[1] == '*' || p[1] == '?')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10161 && p[1] != '+')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10162 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10163 reg_pat[i++] = '[';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10164 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10165 reg_pat[i++] = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10166 reg_pat[i++] = ']';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10167 if (allow_dirs != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10168 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10169 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10170 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10171 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10172 #endif
2243
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10173 /* Undo escaping from ExpandEscape():
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10174 * foo\?bar -> foo?bar
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10175 * foo\%bar -> foo%bar
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10176 * foo\,bar -> foo,bar
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10177 * foo\ bar -> foo bar
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10178 * Don't unescape \, * and others that are also special in a
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10179 * regexp. */
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10180 if (*++p == '?'
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10181 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10182 && no_bslash
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10183 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10184 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10185 reg_pat[i++] = '?';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10186 else
2243
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10187 if (*p == ',' || *p == '%' || *p == '#' || *p == ' ')
03a5f2897db3 Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents: 2241
diff changeset
10188 reg_pat[i++] = *p;
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10189 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10190 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10191 if (allow_dirs != NULL && vim_ispathsep(*p)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10192 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10193 && (!no_bslash || *p != '\\')
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10194 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10195 )
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10196 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10197 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10198 reg_pat[i++] = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10199 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10200 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10201 #ifdef BACKSLASH_IN_FILENAME
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10202 case '/':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10203 reg_pat[i++] = '[';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10204 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10205 reg_pat[i++] = '/';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10206 reg_pat[i++] = ']';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10207 if (allow_dirs != NULL)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10208 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10209 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10210 #endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10211 case '{':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10212 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10213 reg_pat[i++] = '(';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10214 nested++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10215 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10216 case '}':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10217 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10218 reg_pat[i++] = ')';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10219 --nested;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10220 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10221 case ',':
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10222 if (nested)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10223 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10224 reg_pat[i++] = '\\';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10225 reg_pat[i++] = '|';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10226 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10227 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10228 reg_pat[i++] = ',';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10229 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10230 default:
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10231 # ifdef FEAT_MBYTE
474
a5fcf36ef512 updated for version 7.0127
vimboss
parents: 461
diff changeset
10232 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
7
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10233 reg_pat[i++] = *p++;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10234 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10235 # endif
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10236 if (allow_dirs != NULL && vim_ispathsep(*p))
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10237 *allow_dirs = TRUE;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10238 reg_pat[i++] = *p;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10239 break;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10240 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10241 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10242 if (add_dollar)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10243 reg_pat[i++] = '$';
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10244 reg_pat[i] = NUL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10245 if (nested != 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10246 {
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10247 if (nested < 0)
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10248 EMSG(_("E219: Missing {."));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10249 else
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10250 EMSG(_("E220: Missing }."));
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10251 vim_free(reg_pat);
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10252 reg_pat = NULL;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10253 }
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10254 return reg_pat;
3fc0f57ecb91 updated for version 7.0001
vimboss
parents:
diff changeset
10255 }