Merge branch 'vim'
[MacVim.git] / src / fileio.c
blobb0c07c97707f739a1ec4f75bfca3d107aa6464bf
1 /* vi:set ts=8 sts=4 sw=4:
3 * VIM - Vi IMproved by Bram Moolenaar
5 * Do ":help uganda" in Vim to read copying and usage conditions.
6 * Do ":help credits" in Vim to see a list of people who contributed.
7 * See README.txt for an overview of the Vim source code.
8 */
11 * fileio.c: read from and write to a file
14 #if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
15 # include "vimio.h" /* for lseek(), must be before vim.h */
16 #endif
18 #if defined __EMX__
19 # include "vimio.h" /* for mktemp(), CJW 1997-12-03 */
20 #endif
22 #include "vim.h"
24 #if defined(__TANDEM) || defined(__MINT__)
25 # include <limits.h> /* for SSIZE_MAX */
26 #endif
28 #if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
29 # include <utime.h> /* for struct utimbuf */
30 #endif
32 #define BUFSIZE 8192 /* size of normal write buffer */
33 #define SMBUFSIZE 256 /* size of emergency write buffer */
35 #ifdef FEAT_CRYPT
36 # define CRYPT_MAGIC "VimCrypt~01!" /* "01" is the version nr */
37 # define CRYPT_MAGIC_LEN 12 /* must be multiple of 4! */
38 #endif
40 /* Is there any system that doesn't have access()? */
41 #define USE_MCH_ACCESS
43 #if defined(sun) && defined(S_ISCHR)
44 # define OPEN_CHR_FILES
45 static int is_dev_fd_file(char_u *fname);
46 #endif
47 #ifdef FEAT_MBYTE
48 static char_u *next_fenc __ARGS((char_u **pp));
49 # ifdef FEAT_EVAL
50 static char_u *readfile_charconvert __ARGS((char_u *fname, char_u *fenc, int *fdp));
51 # endif
52 #endif
53 #ifdef FEAT_VIMINFO
54 static void check_marks_read __ARGS((void));
55 #endif
56 #ifdef FEAT_CRYPT
57 static char_u *check_for_cryptkey __ARGS((char_u *cryptkey, char_u *ptr, long *sizep, long *filesizep, int newfile));
58 #endif
59 #ifdef UNIX
60 static void set_file_time __ARGS((char_u *fname, time_t atime, time_t mtime));
61 #endif
62 static int set_rw_fname __ARGS((char_u *fname, char_u *sfname));
63 static int msg_add_fileformat __ARGS((int eol_type));
64 static void msg_add_eol __ARGS((void));
65 static int check_mtime __ARGS((buf_T *buf, struct stat *s));
66 static int time_differs __ARGS((long t1, long t2));
67 #ifdef FEAT_AUTOCMD
68 static int apply_autocmds_exarg __ARGS((event_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap));
69 static int au_find_group __ARGS((char_u *name));
71 # define AUGROUP_DEFAULT -1 /* default autocmd group */
72 # define AUGROUP_ERROR -2 /* erroneous autocmd group */
73 # define AUGROUP_ALL -3 /* all autocmd groups */
74 #endif
76 #if defined(FEAT_CRYPT) || defined(FEAT_MBYTE)
77 # define HAS_BW_FLAGS
78 # define FIO_LATIN1 0x01 /* convert Latin1 */
79 # define FIO_UTF8 0x02 /* convert UTF-8 */
80 # define FIO_UCS2 0x04 /* convert UCS-2 */
81 # define FIO_UCS4 0x08 /* convert UCS-4 */
82 # define FIO_UTF16 0x10 /* convert UTF-16 */
83 # ifdef WIN3264
84 # define FIO_CODEPAGE 0x20 /* convert MS-Windows codepage */
85 # define FIO_PUT_CP(x) (((x) & 0xffff) << 16) /* put codepage in top word */
86 # define FIO_GET_CP(x) (((x)>>16) & 0xffff) /* get codepage from top word */
87 # endif
88 # ifdef MACOS_X
89 # define FIO_MACROMAN 0x20 /* convert MacRoman */
90 # endif
91 # define FIO_ENDIAN_L 0x80 /* little endian */
92 # define FIO_ENCRYPTED 0x1000 /* encrypt written bytes */
93 # define FIO_NOCONVERT 0x2000 /* skip encoding conversion */
94 # define FIO_UCSBOM 0x4000 /* check for BOM at start of file */
95 # define FIO_ALL -1 /* allow all formats */
96 #endif
98 /* When converting, a read() or write() may leave some bytes to be converted
99 * for the next call. The value is guessed... */
100 #define CONV_RESTLEN 30
102 /* We have to guess how much a sequence of bytes may expand when converting
103 * with iconv() to be able to allocate a buffer. */
104 #define ICONV_MULT 8
107 * Structure to pass arguments from buf_write() to buf_write_bytes().
109 struct bw_info
111 int bw_fd; /* file descriptor */
112 char_u *bw_buf; /* buffer with data to be written */
113 int bw_len; /* length of data */
114 #ifdef HAS_BW_FLAGS
115 int bw_flags; /* FIO_ flags */
116 #endif
117 #ifdef FEAT_MBYTE
118 char_u bw_rest[CONV_RESTLEN]; /* not converted bytes */
119 int bw_restlen; /* nr of bytes in bw_rest[] */
120 int bw_first; /* first write call */
121 char_u *bw_conv_buf; /* buffer for writing converted chars */
122 int bw_conv_buflen; /* size of bw_conv_buf */
123 int bw_conv_error; /* set for conversion error */
124 linenr_T bw_conv_error_lnum; /* first line with error or zero */
125 linenr_T bw_start_lnum; /* line number at start of buffer */
126 # ifdef USE_ICONV
127 iconv_t bw_iconv_fd; /* descriptor for iconv() or -1 */
128 # endif
129 #endif
132 static int buf_write_bytes __ARGS((struct bw_info *ip));
134 #ifdef FEAT_MBYTE
135 static linenr_T readfile_linenr __ARGS((linenr_T linecnt, char_u *p, char_u *endp));
136 static int ucs2bytes __ARGS((unsigned c, char_u **pp, int flags));
137 static int need_conversion __ARGS((char_u *fenc));
138 static int get_fio_flags __ARGS((char_u *ptr));
139 static char_u *check_for_bom __ARGS((char_u *p, long size, int *lenp, int flags));
140 static int make_bom __ARGS((char_u *buf, char_u *name));
141 # ifdef WIN3264
142 static int get_win_fio_flags __ARGS((char_u *ptr));
143 # endif
144 # ifdef MACOS_X
145 static int get_mac_fio_flags __ARGS((char_u *ptr));
146 # endif
147 #endif
148 static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
149 #ifdef TEMPDIRNAMES
150 static void vim_settempdir __ARGS((char_u *tempdir));
151 #endif
152 #ifdef FEAT_AUTOCMD
153 static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
154 #endif
156 void
157 filemess(buf, name, s, attr)
158 buf_T *buf;
159 char_u *name;
160 char_u *s;
161 int attr;
163 int msg_scroll_save;
165 if (msg_silent != 0)
166 return;
167 msg_add_fname(buf, name); /* put file name in IObuff with quotes */
168 /* If it's extremely long, truncate it. */
169 if (STRLEN(IObuff) > IOSIZE - 80)
170 IObuff[IOSIZE - 80] = NUL;
171 STRCAT(IObuff, s);
173 * For the first message may have to start a new line.
174 * For further ones overwrite the previous one, reset msg_scroll before
175 * calling filemess().
177 msg_scroll_save = msg_scroll;
178 if (shortmess(SHM_OVERALL) && !exiting && p_verbose == 0)
179 msg_scroll = FALSE;
180 if (!msg_scroll) /* wait a bit when overwriting an error msg */
181 check_for_delay(FALSE);
182 msg_start();
183 msg_scroll = msg_scroll_save;
184 msg_scrolled_ign = TRUE;
185 /* may truncate the message to avoid a hit-return prompt */
186 msg_outtrans_attr(msg_may_trunc(FALSE, IObuff), attr);
187 msg_clr_eos();
188 out_flush();
189 msg_scrolled_ign = FALSE;
193 * Read lines from file "fname" into the buffer after line "from".
195 * 1. We allocate blocks with lalloc, as big as possible.
196 * 2. Each block is filled with characters from the file with a single read().
197 * 3. The lines are inserted in the buffer with ml_append().
199 * (caller must check that fname != NULL, unless READ_STDIN is used)
201 * "lines_to_skip" is the number of lines that must be skipped
202 * "lines_to_read" is the number of lines that are appended
203 * When not recovering lines_to_skip is 0 and lines_to_read MAXLNUM.
205 * flags:
206 * READ_NEW starting to edit a new buffer
207 * READ_FILTER reading filter output
208 * READ_STDIN read from stdin instead of a file
209 * READ_BUFFER read from curbuf instead of a file (converting after reading
210 * stdin)
211 * READ_DUMMY read into a dummy buffer (to check if file contents changed)
213 * return FAIL for failure, OK otherwise
216 readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
217 char_u *fname;
218 char_u *sfname;
219 linenr_T from;
220 linenr_T lines_to_skip;
221 linenr_T lines_to_read;
222 exarg_T *eap; /* can be NULL! */
223 int flags;
225 int fd = 0;
226 int newfile = (flags & READ_NEW);
227 int check_readonly;
228 int filtering = (flags & READ_FILTER);
229 int read_stdin = (flags & READ_STDIN);
230 int read_buffer = (flags & READ_BUFFER);
231 int set_options = newfile || read_buffer
232 || (eap != NULL && eap->read_edit);
233 linenr_T read_buf_lnum = 1; /* next line to read from curbuf */
234 colnr_T read_buf_col = 0; /* next char to read from this line */
235 char_u c;
236 linenr_T lnum = from;
237 char_u *ptr = NULL; /* pointer into read buffer */
238 char_u *buffer = NULL; /* read buffer */
239 char_u *new_buffer = NULL; /* init to shut up gcc */
240 char_u *line_start = NULL; /* init to shut up gcc */
241 int wasempty; /* buffer was empty before reading */
242 colnr_T len;
243 long size = 0;
244 char_u *p;
245 long filesize = 0;
246 int skip_read = FALSE;
247 #ifdef FEAT_CRYPT
248 char_u *cryptkey = NULL;
249 #endif
250 int split = 0; /* number of split lines */
251 #define UNKNOWN 0x0fffffff /* file size is unknown */
252 linenr_T linecnt;
253 int error = FALSE; /* errors encountered */
254 int ff_error = EOL_UNKNOWN; /* file format with errors */
255 long linerest = 0; /* remaining chars in line */
256 #ifdef UNIX
257 int perm = 0;
258 int swap_mode = -1; /* protection bits for swap file */
259 #else
260 int perm;
261 #endif
262 int fileformat = 0; /* end-of-line format */
263 int keep_fileformat = FALSE;
264 struct stat st;
265 int file_readonly;
266 linenr_T skip_count = 0;
267 linenr_T read_count = 0;
268 int msg_save = msg_scroll;
269 linenr_T read_no_eol_lnum = 0; /* non-zero lnum when last line of
270 * last read was missing the eol */
271 int try_mac = (vim_strchr(p_ffs, 'm') != NULL);
272 int try_dos = (vim_strchr(p_ffs, 'd') != NULL);
273 int try_unix = (vim_strchr(p_ffs, 'x') != NULL);
274 int file_rewind = FALSE;
275 #ifdef FEAT_MBYTE
276 int can_retry;
277 linenr_T conv_error = 0; /* line nr with conversion error */
278 linenr_T illegal_byte = 0; /* line nr with illegal byte */
279 int keep_dest_enc = FALSE; /* don't retry when char doesn't fit
280 in destination encoding */
281 int bad_char_behavior = BAD_REPLACE;
282 /* BAD_KEEP, BAD_DROP or character to
283 * replace with */
284 char_u *tmpname = NULL; /* name of 'charconvert' output file */
285 int fio_flags = 0;
286 char_u *fenc; /* fileencoding to use */
287 int fenc_alloced; /* fenc_next is in allocated memory */
288 char_u *fenc_next = NULL; /* next item in 'fencs' or NULL */
289 int advance_fenc = FALSE;
290 long real_size = 0;
291 # ifdef USE_ICONV
292 iconv_t iconv_fd = (iconv_t)-1; /* descriptor for iconv() or -1 */
293 # ifdef FEAT_EVAL
294 int did_iconv = FALSE; /* TRUE when iconv() failed and trying
295 'charconvert' next */
296 # endif
297 # endif
298 int converted = FALSE; /* TRUE if conversion done */
299 int notconverted = FALSE; /* TRUE if conversion wanted but it
300 wasn't possible */
301 char_u conv_rest[CONV_RESTLEN];
302 int conv_restlen = 0; /* nr of bytes in conv_rest[] */
303 #endif
305 #ifdef FEAT_AUTOCMD
306 /* Remember the initial values of curbuf, curbuf->b_ffname and
307 * curbuf->b_fname to detect whether they are altered as a result of
308 * executing nasty autocommands. Also check if "fname" and "sfname"
309 * point to one of these values. */
310 buf_T *old_curbuf = curbuf;
311 char_u *old_b_ffname = curbuf->b_ffname;
312 char_u *old_b_fname = curbuf->b_fname;
313 int using_b_ffname = (fname == curbuf->b_ffname)
314 || (sfname == curbuf->b_ffname);
315 int using_b_fname = (fname == curbuf->b_fname)
316 || (sfname == curbuf->b_fname);
317 #endif
318 write_no_eol_lnum = 0; /* in case it was set by the previous read */
321 * If there is no file name yet, use the one for the read file.
322 * BF_NOTEDITED is set to reflect this.
323 * Don't do this for a read from a filter.
324 * Only do this when 'cpoptions' contains the 'f' flag.
326 if (curbuf->b_ffname == NULL
327 && !filtering
328 && fname != NULL
329 && vim_strchr(p_cpo, CPO_FNAMER) != NULL
330 && !(flags & READ_DUMMY))
332 if (set_rw_fname(fname, sfname) == FAIL)
333 return FAIL;
336 /* After reading a file the cursor line changes but we don't want to
337 * display the line. */
338 ex_no_reprint = TRUE;
340 /* don't display the file info for another buffer now */
341 need_fileinfo = FALSE;
344 * For Unix: Use the short file name whenever possible.
345 * Avoids problems with networks and when directory names are changed.
346 * Don't do this for MS-DOS, a "cd" in a sub-shell may have moved us to
347 * another directory, which we don't detect.
349 if (sfname == NULL)
350 sfname = fname;
351 #if defined(UNIX) || defined(__EMX__)
352 fname = sfname;
353 #endif
355 #ifdef FEAT_AUTOCMD
357 * The BufReadCmd and FileReadCmd events intercept the reading process by
358 * executing the associated commands instead.
360 if (!filtering && !read_stdin && !read_buffer)
362 pos_T pos;
364 pos = curbuf->b_op_start;
366 /* Set '[ mark to the line above where the lines go (line 1 if zero). */
367 curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
368 curbuf->b_op_start.col = 0;
370 if (newfile)
372 if (apply_autocmds_exarg(EVENT_BUFREADCMD, NULL, sfname,
373 FALSE, curbuf, eap))
374 #ifdef FEAT_EVAL
375 return aborting() ? FAIL : OK;
376 #else
377 return OK;
378 #endif
380 else if (apply_autocmds_exarg(EVENT_FILEREADCMD, sfname, sfname,
381 FALSE, NULL, eap))
382 #ifdef FEAT_EVAL
383 return aborting() ? FAIL : OK;
384 #else
385 return OK;
386 #endif
388 curbuf->b_op_start = pos;
390 #endif
392 if ((shortmess(SHM_OVER) || curbuf->b_help) && p_verbose == 0)
393 msg_scroll = FALSE; /* overwrite previous file message */
394 else
395 msg_scroll = TRUE; /* don't overwrite previous file message */
398 * If the name ends in a path separator, we can't open it. Check here,
399 * because reading the file may actually work, but then creating the swap
400 * file may destroy it! Reported on MS-DOS and Win 95.
401 * If the name is too long we might crash further on, quit here.
403 if (fname != NULL && *fname != NUL)
405 p = fname + STRLEN(fname);
406 if (after_pathsep(fname, p) || STRLEN(fname) >= MAXPATHL)
408 filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0);
409 msg_end();
410 msg_scroll = msg_save;
411 return FAIL;
415 #ifdef UNIX
417 * On Unix it is possible to read a directory, so we have to
418 * check for it before the mch_open().
420 if (!read_stdin && !read_buffer)
422 perm = mch_getperm(fname);
423 if (perm >= 0 && !S_ISREG(perm) /* not a regular file ... */
424 # ifdef S_ISFIFO
425 && !S_ISFIFO(perm) /* ... or fifo */
426 # endif
427 # ifdef S_ISSOCK
428 && !S_ISSOCK(perm) /* ... or socket */
429 # endif
430 # ifdef OPEN_CHR_FILES
431 && !(S_ISCHR(perm) && is_dev_fd_file(fname))
432 /* ... or a character special file named /dev/fd/<n> */
433 # endif
436 if (S_ISDIR(perm))
437 filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
438 else
439 filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
440 msg_end();
441 msg_scroll = msg_save;
442 return FAIL;
445 # if defined(MSDOS) || defined(MSWIN) || defined(OS2)
447 * MS-Windows allows opening a device, but we will probably get stuck
448 * trying to read it.
450 if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE)
452 filemess(curbuf, fname, (char_u *)_("is a device (disabled with 'opendevice' option)"), 0);
453 msg_end();
454 msg_scroll = msg_save;
455 return FAIL;
457 # endif
459 #endif
461 /* set default 'fileformat' */
462 if (set_options)
464 if (eap != NULL && eap->force_ff != 0)
465 set_fileformat(get_fileformat_force(curbuf, eap), OPT_LOCAL);
466 else if (*p_ffs != NUL)
467 set_fileformat(default_fileformat(), OPT_LOCAL);
470 /* set or reset 'binary' */
471 if (eap != NULL && eap->force_bin != 0)
473 int oldval = curbuf->b_p_bin;
475 curbuf->b_p_bin = (eap->force_bin == FORCE_BIN);
476 set_options_bin(oldval, curbuf->b_p_bin, OPT_LOCAL);
480 * When opening a new file we take the readonly flag from the file.
481 * Default is r/w, can be set to r/o below.
482 * Don't reset it when in readonly mode
483 * Only set/reset b_p_ro when BF_CHECK_RO is set.
485 check_readonly = (newfile && (curbuf->b_flags & BF_CHECK_RO));
486 if (check_readonly && !readonlymode)
487 curbuf->b_p_ro = FALSE;
489 if (newfile && !read_stdin && !read_buffer)
491 /* Remember time of file.
492 * For RISCOS, also remember the filetype.
494 if (mch_stat((char *)fname, &st) >= 0)
496 buf_store_time(curbuf, &st, fname);
497 curbuf->b_mtime_read = curbuf->b_mtime;
499 #if defined(RISCOS) && defined(FEAT_OSFILETYPE)
500 /* Read the filetype into the buffer local filetype option. */
501 mch_read_filetype(fname);
502 #endif
503 #ifdef UNIX
505 * Use the protection bits of the original file for the swap file.
506 * This makes it possible for others to read the name of the
507 * edited file from the swapfile, but only if they can read the
508 * edited file.
509 * Remove the "write" and "execute" bits for group and others
510 * (they must not write the swapfile).
511 * Add the "read" and "write" bits for the user, otherwise we may
512 * not be able to write to the file ourselves.
513 * Setting the bits is done below, after creating the swap file.
515 swap_mode = (st.st_mode & 0644) | 0600;
516 #endif
517 #ifdef FEAT_CW_EDITOR
518 /* Get the FSSpec on MacOS
519 * TODO: Update it properly when the buffer name changes
521 (void)GetFSSpecFromPath(curbuf->b_ffname, &curbuf->b_FSSpec);
522 #endif
523 #ifdef VMS
524 curbuf->b_fab_rfm = st.st_fab_rfm;
525 curbuf->b_fab_rat = st.st_fab_rat;
526 curbuf->b_fab_mrs = st.st_fab_mrs;
527 #endif
529 else
531 curbuf->b_mtime = 0;
532 curbuf->b_mtime_read = 0;
533 curbuf->b_orig_size = 0;
534 curbuf->b_orig_mode = 0;
537 /* Reset the "new file" flag. It will be set again below when the
538 * file doesn't exist. */
539 curbuf->b_flags &= ~(BF_NEW | BF_NEW_W);
543 * for UNIX: check readonly with perm and mch_access()
544 * for RISCOS: same as Unix, otherwise file gets re-datestamped!
545 * for MSDOS and Amiga: check readonly by trying to open the file for writing
547 file_readonly = FALSE;
548 if (read_stdin)
550 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
551 /* Force binary I/O on stdin to avoid CR-LF -> LF conversion. */
552 setmode(0, O_BINARY);
553 #endif
555 else if (!read_buffer)
557 #ifdef USE_MCH_ACCESS
558 if (
559 # ifdef UNIX
560 !(perm & 0222) ||
561 # endif
562 mch_access((char *)fname, W_OK))
563 file_readonly = TRUE;
564 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
565 #else
566 if (!newfile
567 || readonlymode
568 || (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0)
570 file_readonly = TRUE;
571 /* try to open ro */
572 fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
574 #endif
577 if (fd < 0) /* cannot open at all */
579 #ifndef UNIX
580 int isdir_f;
581 #endif
582 msg_scroll = msg_save;
583 #ifndef UNIX
585 * On MSDOS and Amiga we can't open a directory, check here.
587 isdir_f = (mch_isdir(fname));
588 perm = mch_getperm(fname); /* check if the file exists */
589 if (isdir_f)
591 filemess(curbuf, sfname, (char_u *)_("is a directory"), 0);
592 curbuf->b_p_ro = TRUE; /* must use "w!" now */
594 else
595 #endif
596 if (newfile)
598 if (perm < 0)
601 * Set the 'new-file' flag, so that when the file has
602 * been created by someone else, a ":w" will complain.
604 curbuf->b_flags |= BF_NEW;
606 /* Create a swap file now, so that other Vims are warned
607 * that we are editing this file. Don't do this for a
608 * "nofile" or "nowrite" buffer type. */
609 #ifdef FEAT_QUICKFIX
610 if (!bt_dontwrite(curbuf))
611 #endif
613 check_need_swap(newfile);
614 #ifdef FEAT_AUTOCMD
615 /* SwapExists autocommand may mess things up */
616 if (curbuf != old_curbuf
617 || (using_b_ffname
618 && (old_b_ffname != curbuf->b_ffname))
619 || (using_b_fname
620 && (old_b_fname != curbuf->b_fname)))
622 EMSG(_(e_auchangedbuf));
623 return FAIL;
625 #endif
627 if (dir_of_file_exists(fname))
628 filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
629 else
630 filemess(curbuf, sfname,
631 (char_u *)_("[New DIRECTORY]"), 0);
632 #ifdef FEAT_VIMINFO
633 /* Even though this is a new file, it might have been
634 * edited before and deleted. Get the old marks. */
635 check_marks_read();
636 #endif
637 #ifdef FEAT_MBYTE
638 if (eap != NULL && eap->force_enc != 0)
640 /* set forced 'fileencoding' */
641 fenc = enc_canonize(eap->cmd + eap->force_enc);
642 if (fenc != NULL)
643 set_string_option_direct((char_u *)"fenc", -1,
644 fenc, OPT_FREE|OPT_LOCAL, 0);
645 vim_free(fenc);
647 #endif
648 #ifdef FEAT_AUTOCMD
649 apply_autocmds_exarg(EVENT_BUFNEWFILE, sfname, sfname,
650 FALSE, curbuf, eap);
651 #endif
652 /* remember the current fileformat */
653 save_file_ff(curbuf);
655 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
656 if (aborting()) /* autocmds may abort script processing */
657 return FAIL;
658 #endif
659 return OK; /* a new file is not an error */
661 else
663 filemess(curbuf, sfname, (char_u *)(
664 # ifdef EFBIG
665 (errno == EFBIG) ? _("[File too big]") :
666 # endif
667 _("[Permission Denied]")), 0);
668 curbuf->b_p_ro = TRUE; /* must use "w!" now */
672 return FAIL;
676 * Only set the 'ro' flag for readonly files the first time they are
677 * loaded. Help files always get readonly mode
679 if ((check_readonly && file_readonly) || curbuf->b_help)
680 curbuf->b_p_ro = TRUE;
682 if (set_options)
684 /* Don't change 'eol' if reading from buffer as it will already be
685 * correctly set when reading stdin. */
686 if (!read_buffer)
688 curbuf->b_p_eol = TRUE;
689 curbuf->b_start_eol = TRUE;
691 #ifdef FEAT_MBYTE
692 curbuf->b_p_bomb = FALSE;
693 curbuf->b_start_bomb = FALSE;
694 #endif
697 /* Create a swap file now, so that other Vims are warned that we are
698 * editing this file.
699 * Don't do this for a "nofile" or "nowrite" buffer type. */
700 #ifdef FEAT_QUICKFIX
701 if (!bt_dontwrite(curbuf))
702 #endif
704 check_need_swap(newfile);
705 #ifdef FEAT_AUTOCMD
706 if (!read_stdin && (curbuf != old_curbuf
707 || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
708 || (using_b_fname && (old_b_fname != curbuf->b_fname))))
710 EMSG(_(e_auchangedbuf));
711 if (!read_buffer)
712 close(fd);
713 return FAIL;
715 #endif
716 #ifdef UNIX
717 /* Set swap file protection bits after creating it. */
718 if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
719 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
720 (void)mch_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode);
721 #endif
724 #if defined(HAS_SWAP_EXISTS_ACTION)
725 /* If "Quit" selected at ATTENTION dialog, don't load the file */
726 if (swap_exists_action == SEA_QUIT)
728 if (!read_buffer && !read_stdin)
729 close(fd);
730 return FAIL;
732 #endif
734 ++no_wait_return; /* don't wait for return yet */
737 * Set '[ mark to the line above where the lines go (line 1 if zero).
739 curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
740 curbuf->b_op_start.col = 0;
742 #ifdef FEAT_AUTOCMD
743 if (!read_buffer)
745 int m = msg_scroll;
746 int n = msg_scrolled;
749 * The file must be closed again, the autocommands may want to change
750 * the file before reading it.
752 if (!read_stdin)
753 close(fd); /* ignore errors */
756 * The output from the autocommands should not overwrite anything and
757 * should not be overwritten: Set msg_scroll, restore its value if no
758 * output was done.
760 msg_scroll = TRUE;
761 if (filtering)
762 apply_autocmds_exarg(EVENT_FILTERREADPRE, NULL, sfname,
763 FALSE, curbuf, eap);
764 else if (read_stdin)
765 apply_autocmds_exarg(EVENT_STDINREADPRE, NULL, sfname,
766 FALSE, curbuf, eap);
767 else if (newfile)
768 apply_autocmds_exarg(EVENT_BUFREADPRE, NULL, sfname,
769 FALSE, curbuf, eap);
770 else
771 apply_autocmds_exarg(EVENT_FILEREADPRE, sfname, sfname,
772 FALSE, NULL, eap);
773 if (msg_scrolled == n)
774 msg_scroll = m;
776 #ifdef FEAT_EVAL
777 if (aborting()) /* autocmds may abort script processing */
779 --no_wait_return;
780 msg_scroll = msg_save;
781 curbuf->b_p_ro = TRUE; /* must use "w!" now */
782 return FAIL;
784 #endif
786 * Don't allow the autocommands to change the current buffer.
787 * Try to re-open the file.
789 * Don't allow the autocommands to change the buffer name either
790 * (cd for example) if it invalidates fname or sfname.
792 if (!read_stdin && (curbuf != old_curbuf
793 || (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
794 || (using_b_fname && (old_b_fname != curbuf->b_fname))
795 || (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
797 --no_wait_return;
798 msg_scroll = msg_save;
799 if (fd < 0)
800 EMSG(_("E200: *ReadPre autocommands made the file unreadable"));
801 else
802 EMSG(_("E201: *ReadPre autocommands must not change current buffer"));
803 curbuf->b_p_ro = TRUE; /* must use "w!" now */
804 return FAIL;
807 #endif /* FEAT_AUTOCMD */
809 /* Autocommands may add lines to the file, need to check if it is empty */
810 wasempty = (curbuf->b_ml.ml_flags & ML_EMPTY);
812 if (!recoverymode && !filtering && !(flags & READ_DUMMY))
815 * Show the user that we are busy reading the input. Sometimes this
816 * may take a while. When reading from stdin another program may
817 * still be running, don't move the cursor to the last line, unless
818 * always using the GUI.
820 if (read_stdin)
822 #ifndef ALWAYS_USE_GUI
823 mch_msg(_("Vim: Reading from stdin...\n"));
824 #endif
825 #ifdef FEAT_GUI
826 /* Also write a message in the GUI window, if there is one. */
827 if (gui.in_use && !gui.dying && !gui.starting)
829 p = (char_u *)_("Reading from stdin...");
830 gui_write(p, (int)STRLEN(p));
832 #endif
834 else if (!read_buffer)
835 filemess(curbuf, sfname, (char_u *)"", 0);
838 msg_scroll = FALSE; /* overwrite the file message */
841 * Set linecnt now, before the "retry" caused by a wrong guess for
842 * fileformat, and after the autocommands, which may change them.
844 linecnt = curbuf->b_ml.ml_line_count;
846 #ifdef FEAT_MBYTE
847 /* "++bad=" argument. */
848 if (eap != NULL && eap->bad_char != 0)
850 bad_char_behavior = eap->bad_char;
851 if (set_options)
852 curbuf->b_bad_char = eap->bad_char;
854 else
855 curbuf->b_bad_char = 0;
858 * Decide which 'encoding' to use or use first.
860 if (eap != NULL && eap->force_enc != 0)
862 fenc = enc_canonize(eap->cmd + eap->force_enc);
863 fenc_alloced = TRUE;
864 keep_dest_enc = TRUE;
866 else if (curbuf->b_p_bin)
868 fenc = (char_u *)""; /* binary: don't convert */
869 fenc_alloced = FALSE;
871 else if (curbuf->b_help)
873 char_u firstline[80];
874 int fc;
876 /* Help files are either utf-8 or latin1. Try utf-8 first, if this
877 * fails it must be latin1.
878 * Always do this when 'encoding' is "utf-8". Otherwise only do
879 * this when needed to avoid [converted] remarks all the time.
880 * It is needed when the first line contains non-ASCII characters.
881 * That is only in *.??x files. */
882 fenc = (char_u *)"latin1";
883 c = enc_utf8;
884 if (!c && !read_stdin)
886 fc = fname[STRLEN(fname) - 1];
887 if (TOLOWER_ASC(fc) == 'x')
889 /* Read the first line (and a bit more). Immediately rewind to
890 * the start of the file. If the read() fails "len" is -1. */
891 len = vim_read(fd, firstline, 80);
892 lseek(fd, (off_t)0L, SEEK_SET);
893 for (p = firstline; p < firstline + len; ++p)
894 if (*p >= 0x80)
896 c = TRUE;
897 break;
902 if (c)
904 fenc_next = fenc;
905 fenc = (char_u *)"utf-8";
907 /* When the file is utf-8 but a character doesn't fit in
908 * 'encoding' don't retry. In help text editing utf-8 bytes
909 * doesn't make sense. */
910 if (!enc_utf8)
911 keep_dest_enc = TRUE;
913 fenc_alloced = FALSE;
915 else if (*p_fencs == NUL)
917 fenc = curbuf->b_p_fenc; /* use format from buffer */
918 fenc_alloced = FALSE;
920 else
922 fenc_next = p_fencs; /* try items in 'fileencodings' */
923 fenc = next_fenc(&fenc_next);
924 fenc_alloced = TRUE;
926 #endif
929 * Jump back here to retry reading the file in different ways.
930 * Reasons to retry:
931 * - encoding conversion failed: try another one from "fenc_next"
932 * - BOM detected and fenc was set, need to setup conversion
933 * - "fileformat" check failed: try another
935 * Variables set for special retry actions:
936 * "file_rewind" Rewind the file to start reading it again.
937 * "advance_fenc" Advance "fenc" using "fenc_next".
938 * "skip_read" Re-use already read bytes (BOM detected).
939 * "did_iconv" iconv() conversion failed, try 'charconvert'.
940 * "keep_fileformat" Don't reset "fileformat".
942 * Other status indicators:
943 * "tmpname" When != NULL did conversion with 'charconvert'.
944 * Output file has to be deleted afterwards.
945 * "iconv_fd" When != -1 did conversion with iconv().
947 retry:
949 if (file_rewind)
951 if (read_buffer)
953 read_buf_lnum = 1;
954 read_buf_col = 0;
956 else if (read_stdin || lseek(fd, (off_t)0L, SEEK_SET) != 0)
958 /* Can't rewind the file, give up. */
959 error = TRUE;
960 goto failed;
962 /* Delete the previously read lines. */
963 while (lnum > from)
964 ml_delete(lnum--, FALSE);
965 file_rewind = FALSE;
966 #ifdef FEAT_MBYTE
967 if (set_options)
969 curbuf->b_p_bomb = FALSE;
970 curbuf->b_start_bomb = FALSE;
972 conv_error = 0;
973 #endif
977 * When retrying with another "fenc" and the first time "fileformat"
978 * will be reset.
980 if (keep_fileformat)
981 keep_fileformat = FALSE;
982 else
984 if (eap != NULL && eap->force_ff != 0)
986 fileformat = get_fileformat_force(curbuf, eap);
987 try_unix = try_dos = try_mac = FALSE;
989 else if (curbuf->b_p_bin)
990 fileformat = EOL_UNIX; /* binary: use Unix format */
991 else if (*p_ffs == NUL)
992 fileformat = get_fileformat(curbuf);/* use format from buffer */
993 else
994 fileformat = EOL_UNKNOWN; /* detect from file */
997 #ifdef FEAT_MBYTE
998 # ifdef USE_ICONV
999 if (iconv_fd != (iconv_t)-1)
1001 /* aborted conversion with iconv(), close the descriptor */
1002 iconv_close(iconv_fd);
1003 iconv_fd = (iconv_t)-1;
1005 # endif
1007 if (advance_fenc)
1010 * Try the next entry in 'fileencodings'.
1012 advance_fenc = FALSE;
1014 if (eap != NULL && eap->force_enc != 0)
1016 /* Conversion given with "++cc=" wasn't possible, read
1017 * without conversion. */
1018 notconverted = TRUE;
1019 conv_error = 0;
1020 if (fenc_alloced)
1021 vim_free(fenc);
1022 fenc = (char_u *)"";
1023 fenc_alloced = FALSE;
1025 else
1027 if (fenc_alloced)
1028 vim_free(fenc);
1029 if (fenc_next != NULL)
1031 fenc = next_fenc(&fenc_next);
1032 fenc_alloced = (fenc_next != NULL);
1034 else
1036 fenc = (char_u *)"";
1037 fenc_alloced = FALSE;
1040 if (tmpname != NULL)
1042 mch_remove(tmpname); /* delete converted file */
1043 vim_free(tmpname);
1044 tmpname = NULL;
1049 * Conversion may be required when the encoding of the file is different
1050 * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4.
1052 fio_flags = 0;
1053 converted = need_conversion(fenc);
1054 if (converted)
1057 /* "ucs-bom" means we need to check the first bytes of the file
1058 * for a BOM. */
1059 if (STRCMP(fenc, ENC_UCSBOM) == 0)
1060 fio_flags = FIO_UCSBOM;
1063 * Check if UCS-2/4 or Latin1 to UTF-8 conversion needs to be
1064 * done. This is handled below after read(). Prepare the
1065 * fio_flags to avoid having to parse the string each time.
1066 * Also check for Unicode to Latin1 conversion, because iconv()
1067 * appears not to handle this correctly. This works just like
1068 * conversion to UTF-8 except how the resulting character is put in
1069 * the buffer.
1071 else if (enc_utf8 || STRCMP(p_enc, "latin1") == 0)
1072 fio_flags = get_fio_flags(fenc);
1074 # ifdef WIN3264
1076 * Conversion from an MS-Windows codepage to UTF-8 or another codepage
1077 * is handled with MultiByteToWideChar().
1079 if (fio_flags == 0)
1080 fio_flags = get_win_fio_flags(fenc);
1081 # endif
1083 # ifdef MACOS_X
1084 /* Conversion from Apple MacRoman to latin1 or UTF-8 */
1085 if (fio_flags == 0)
1086 fio_flags = get_mac_fio_flags(fenc);
1087 # endif
1089 # ifdef USE_ICONV
1091 * Try using iconv() if we can't convert internally.
1093 if (fio_flags == 0
1094 # ifdef FEAT_EVAL
1095 && !did_iconv
1096 # endif
1098 iconv_fd = (iconv_t)my_iconv_open(
1099 enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc);
1100 # endif
1102 # ifdef FEAT_EVAL
1104 * Use the 'charconvert' expression when conversion is required
1105 * and we can't do it internally or with iconv().
1107 if (fio_flags == 0 && !read_stdin && !read_buffer && *p_ccv != NUL
1108 # ifdef USE_ICONV
1109 && iconv_fd == (iconv_t)-1
1110 # endif
1113 # ifdef USE_ICONV
1114 did_iconv = FALSE;
1115 # endif
1116 /* Skip conversion when it's already done (retry for wrong
1117 * "fileformat"). */
1118 if (tmpname == NULL)
1120 tmpname = readfile_charconvert(fname, fenc, &fd);
1121 if (tmpname == NULL)
1123 /* Conversion failed. Try another one. */
1124 advance_fenc = TRUE;
1125 if (fd < 0)
1127 /* Re-opening the original file failed! */
1128 EMSG(_("E202: Conversion made file unreadable!"));
1129 error = TRUE;
1130 goto failed;
1132 goto retry;
1136 else
1137 # endif
1139 if (fio_flags == 0
1140 # ifdef USE_ICONV
1141 && iconv_fd == (iconv_t)-1
1142 # endif
1145 /* Conversion wanted but we can't.
1146 * Try the next conversion in 'fileencodings' */
1147 advance_fenc = TRUE;
1148 goto retry;
1153 /* Set "can_retry" when it's possible to rewind the file and try with
1154 * another "fenc" value. It's FALSE when no other "fenc" to try, reading
1155 * stdin or fixed at a specific encoding. */
1156 can_retry = (*fenc != NUL && !read_stdin && !keep_dest_enc);
1157 #endif
1159 if (!skip_read)
1161 linerest = 0;
1162 filesize = 0;
1163 skip_count = lines_to_skip;
1164 read_count = lines_to_read;
1165 #ifdef FEAT_MBYTE
1166 conv_restlen = 0;
1167 #endif
1170 while (!error && !got_int)
1173 * We allocate as much space for the file as we can get, plus
1174 * space for the old line plus room for one terminating NUL.
1175 * The amount is limited by the fact that read() only can read
1176 * upto max_unsigned characters (and other things).
1178 #if SIZEOF_INT <= 2
1179 if (linerest >= 0x7ff0)
1181 ++split;
1182 *ptr = NL; /* split line by inserting a NL */
1183 size = 1;
1185 else
1186 #endif
1188 if (!skip_read)
1190 #if SIZEOF_INT > 2
1191 # if defined(SSIZE_MAX) && (SSIZE_MAX < 0x10000L)
1192 size = SSIZE_MAX; /* use max I/O size, 52K */
1193 # else
1194 size = 0x10000L; /* use buffer >= 64K */
1195 # endif
1196 #else
1197 size = 0x7ff0L - linerest; /* limit buffer to 32K */
1198 #endif
1200 for ( ; size >= 10; size = (long)((long_u)size >> 1))
1202 if ((new_buffer = lalloc((long_u)(size + linerest + 1),
1203 FALSE)) != NULL)
1204 break;
1206 if (new_buffer == NULL)
1208 do_outofmem_msg((long_u)(size * 2 + linerest + 1));
1209 error = TRUE;
1210 break;
1212 if (linerest) /* copy characters from the previous buffer */
1213 mch_memmove(new_buffer, ptr - linerest, (size_t)linerest);
1214 vim_free(buffer);
1215 buffer = new_buffer;
1216 ptr = buffer + linerest;
1217 line_start = buffer;
1219 #ifdef FEAT_MBYTE
1220 /* May need room to translate into.
1221 * For iconv() we don't really know the required space, use a
1222 * factor ICONV_MULT.
1223 * latin1 to utf-8: 1 byte becomes up to 2 bytes
1224 * utf-16 to utf-8: 2 bytes become up to 3 bytes, 4 bytes
1225 * become up to 4 bytes, size must be multiple of 2
1226 * ucs-2 to utf-8: 2 bytes become up to 3 bytes, size must be
1227 * multiple of 2
1228 * ucs-4 to utf-8: 4 bytes become up to 6 bytes, size must be
1229 * multiple of 4 */
1230 real_size = (int)size;
1231 # ifdef USE_ICONV
1232 if (iconv_fd != (iconv_t)-1)
1233 size = size / ICONV_MULT;
1234 else
1235 # endif
1236 if (fio_flags & FIO_LATIN1)
1237 size = size / 2;
1238 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1239 size = (size * 2 / 3) & ~1;
1240 else if (fio_flags & FIO_UCS4)
1241 size = (size * 2 / 3) & ~3;
1242 else if (fio_flags == FIO_UCSBOM)
1243 size = size / ICONV_MULT; /* worst case */
1244 # ifdef WIN3264
1245 else if (fio_flags & FIO_CODEPAGE)
1246 size = size / ICONV_MULT; /* also worst case */
1247 # endif
1248 # ifdef MACOS_X
1249 else if (fio_flags & FIO_MACROMAN)
1250 size = size / ICONV_MULT; /* also worst case */
1251 # endif
1252 #endif
1254 #ifdef FEAT_MBYTE
1255 if (conv_restlen > 0)
1257 /* Insert unconverted bytes from previous line. */
1258 mch_memmove(ptr, conv_rest, conv_restlen);
1259 ptr += conv_restlen;
1260 size -= conv_restlen;
1262 #endif
1264 if (read_buffer)
1267 * Read bytes from curbuf. Used for converting text read
1268 * from stdin.
1270 if (read_buf_lnum > from)
1271 size = 0;
1272 else
1274 int n, ni;
1275 long tlen;
1277 tlen = 0;
1278 for (;;)
1280 p = ml_get(read_buf_lnum) + read_buf_col;
1281 n = (int)STRLEN(p);
1282 if ((int)tlen + n + 1 > size)
1284 /* Filled up to "size", append partial line.
1285 * Change NL to NUL to reverse the effect done
1286 * below. */
1287 n = (int)(size - tlen);
1288 for (ni = 0; ni < n; ++ni)
1290 if (p[ni] == NL)
1291 ptr[tlen++] = NUL;
1292 else
1293 ptr[tlen++] = p[ni];
1295 read_buf_col += n;
1296 break;
1298 else
1300 /* Append whole line and new-line. Change NL
1301 * to NUL to reverse the effect done below. */
1302 for (ni = 0; ni < n; ++ni)
1304 if (p[ni] == NL)
1305 ptr[tlen++] = NUL;
1306 else
1307 ptr[tlen++] = p[ni];
1309 ptr[tlen++] = NL;
1310 read_buf_col = 0;
1311 if (++read_buf_lnum > from)
1313 /* When the last line didn't have an
1314 * end-of-line don't add it now either. */
1315 if (!curbuf->b_p_eol)
1316 --tlen;
1317 size = tlen;
1318 break;
1324 else
1327 * Read bytes from the file.
1329 size = vim_read(fd, ptr, size);
1332 if (size <= 0)
1334 if (size < 0) /* read error */
1335 error = TRUE;
1336 #ifdef FEAT_MBYTE
1337 else if (conv_restlen > 0)
1340 * Reached end-of-file but some trailing bytes could
1341 * not be converted. Truncated file?
1344 /* When we did a conversion report an error. */
1345 if (fio_flags != 0
1346 # ifdef USE_ICONV
1347 || iconv_fd != (iconv_t)-1
1348 # endif
1351 if (conv_error == 0)
1352 conv_error = curbuf->b_ml.ml_line_count
1353 - linecnt + 1;
1355 /* Remember the first linenr with an illegal byte */
1356 else if (illegal_byte == 0)
1357 illegal_byte = curbuf->b_ml.ml_line_count
1358 - linecnt + 1;
1359 if (bad_char_behavior == BAD_DROP)
1361 *(ptr - conv_restlen) = NUL;
1362 conv_restlen = 0;
1364 else
1366 /* Replace the trailing bytes with the replacement
1367 * character if we were converting; if we weren't,
1368 * leave the UTF8 checking code to do it, as it
1369 * works slightly differently. */
1370 if (bad_char_behavior != BAD_KEEP && (fio_flags != 0
1371 # ifdef USE_ICONV
1372 || iconv_fd != (iconv_t)-1
1373 # endif
1376 while (conv_restlen > 0)
1378 *(--ptr) = bad_char_behavior;
1379 --conv_restlen;
1382 fio_flags = 0; /* don't convert this */
1383 # ifdef USE_ICONV
1384 if (iconv_fd != (iconv_t)-1)
1386 iconv_close(iconv_fd);
1387 iconv_fd = (iconv_t)-1;
1389 # endif
1392 #endif
1395 #ifdef FEAT_CRYPT
1397 * At start of file: Check for magic number of encryption.
1399 if (filesize == 0)
1400 cryptkey = check_for_cryptkey(cryptkey, ptr, &size,
1401 &filesize, newfile);
1403 * Decrypt the read bytes.
1405 if (cryptkey != NULL && size > 0)
1406 for (p = ptr; p < ptr + size; ++p)
1407 ZDECODE(*p);
1408 #endif
1410 skip_read = FALSE;
1412 #ifdef FEAT_MBYTE
1414 * At start of file (or after crypt magic number): Check for BOM.
1415 * Also check for a BOM for other Unicode encodings, but not after
1416 * converting with 'charconvert' or when a BOM has already been
1417 * found.
1419 if ((filesize == 0
1420 # ifdef FEAT_CRYPT
1421 || (filesize == CRYPT_MAGIC_LEN && cryptkey != NULL)
1422 # endif
1424 && (fio_flags == FIO_UCSBOM
1425 || (!curbuf->b_p_bomb
1426 && tmpname == NULL
1427 && (*fenc == 'u' || (*fenc == NUL && enc_utf8)))))
1429 char_u *ccname;
1430 int blen;
1432 /* no BOM detection in a short file or in binary mode */
1433 if (size < 2 || curbuf->b_p_bin)
1434 ccname = NULL;
1435 else
1436 ccname = check_for_bom(ptr, size, &blen,
1437 fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags(fenc));
1438 if (ccname != NULL)
1440 /* Remove BOM from the text */
1441 filesize += blen;
1442 size -= blen;
1443 mch_memmove(ptr, ptr + blen, (size_t)size);
1444 if (set_options)
1446 curbuf->b_p_bomb = TRUE;
1447 curbuf->b_start_bomb = TRUE;
1451 if (fio_flags == FIO_UCSBOM)
1453 if (ccname == NULL)
1455 /* No BOM detected: retry with next encoding. */
1456 advance_fenc = TRUE;
1458 else
1460 /* BOM detected: set "fenc" and jump back */
1461 if (fenc_alloced)
1462 vim_free(fenc);
1463 fenc = ccname;
1464 fenc_alloced = FALSE;
1466 /* retry reading without getting new bytes or rewinding */
1467 skip_read = TRUE;
1468 goto retry;
1472 /* Include not converted bytes. */
1473 ptr -= conv_restlen;
1474 size += conv_restlen;
1475 conv_restlen = 0;
1476 #endif
1478 * Break here for a read error or end-of-file.
1480 if (size <= 0)
1481 break;
1483 #ifdef FEAT_MBYTE
1485 # ifdef USE_ICONV
1486 if (iconv_fd != (iconv_t)-1)
1489 * Attempt conversion of the read bytes to 'encoding' using
1490 * iconv().
1492 const char *fromp;
1493 char *top;
1494 size_t from_size;
1495 size_t to_size;
1497 fromp = (char *)ptr;
1498 from_size = size;
1499 ptr += size;
1500 top = (char *)ptr;
1501 to_size = real_size - size;
1504 * If there is conversion error or not enough room try using
1505 * another conversion. Except for when there is no
1506 * alternative (help files).
1508 while ((iconv(iconv_fd, (void *)&fromp, &from_size,
1509 &top, &to_size)
1510 == (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
1511 || from_size > CONV_RESTLEN)
1513 if (can_retry)
1514 goto rewind_retry;
1515 if (conv_error == 0)
1516 conv_error = readfile_linenr(linecnt,
1517 ptr, (char_u *)top);
1519 /* Deal with a bad byte and continue with the next. */
1520 ++fromp;
1521 --from_size;
1522 if (bad_char_behavior == BAD_KEEP)
1524 *top++ = *(fromp - 1);
1525 --to_size;
1527 else if (bad_char_behavior != BAD_DROP)
1529 *top++ = bad_char_behavior;
1530 --to_size;
1534 if (from_size > 0)
1536 /* Some remaining characters, keep them for the next
1537 * round. */
1538 mch_memmove(conv_rest, (char_u *)fromp, from_size);
1539 conv_restlen = (int)from_size;
1542 /* move the linerest to before the converted characters */
1543 line_start = ptr - linerest;
1544 mch_memmove(line_start, buffer, (size_t)linerest);
1545 size = (long)((char_u *)top - ptr);
1547 # endif
1549 # ifdef WIN3264
1550 if (fio_flags & FIO_CODEPAGE)
1552 char_u *src, *dst;
1553 WCHAR ucs2buf[3];
1554 int ucs2len;
1555 int codepage = FIO_GET_CP(fio_flags);
1556 int bytelen;
1557 int found_bad;
1558 char replstr[2];
1561 * Conversion from an MS-Windows codepage or UTF-8 to UTF-8 or
1562 * a codepage, using standard MS-Windows functions. This
1563 * requires two steps:
1564 * 1. convert from 'fileencoding' to ucs-2
1565 * 2. convert from ucs-2 to 'encoding'
1567 * Because there may be illegal bytes AND an incomplete byte
1568 * sequence at the end, we may have to do the conversion one
1569 * character at a time to get it right.
1572 /* Replacement string for WideCharToMultiByte(). */
1573 if (bad_char_behavior > 0)
1574 replstr[0] = bad_char_behavior;
1575 else
1576 replstr[0] = '?';
1577 replstr[1] = NUL;
1580 * Move the bytes to the end of the buffer, so that we have
1581 * room to put the result at the start.
1583 src = ptr + real_size - size;
1584 mch_memmove(src, ptr, size);
1587 * Do the conversion.
1589 dst = ptr;
1590 size = size;
1591 while (size > 0)
1593 found_bad = FALSE;
1595 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
1596 if (codepage == CP_UTF8)
1598 /* Handle CP_UTF8 input ourselves to be able to handle
1599 * trailing bytes properly.
1600 * Get one UTF-8 character from src. */
1601 bytelen = (int)utf_ptr2len_len(src, size);
1602 if (bytelen > size)
1604 /* Only got some bytes of a character. Normally
1605 * it's put in "conv_rest", but if it's too long
1606 * deal with it as if they were illegal bytes. */
1607 if (bytelen <= CONV_RESTLEN)
1608 break;
1610 /* weird overlong byte sequence */
1611 bytelen = size;
1612 found_bad = TRUE;
1614 else
1616 int u8c = utf_ptr2char(src);
1618 if (u8c > 0xffff || (*src >= 0x80 && bytelen == 1))
1619 found_bad = TRUE;
1620 ucs2buf[0] = u8c;
1621 ucs2len = 1;
1624 else
1625 # endif
1627 /* We don't know how long the byte sequence is, try
1628 * from one to three bytes. */
1629 for (bytelen = 1; bytelen <= size && bytelen <= 3;
1630 ++bytelen)
1632 ucs2len = MultiByteToWideChar(codepage,
1633 MB_ERR_INVALID_CHARS,
1634 (LPCSTR)src, bytelen,
1635 ucs2buf, 3);
1636 if (ucs2len > 0)
1637 break;
1639 if (ucs2len == 0)
1641 /* If we have only one byte then it's probably an
1642 * incomplete byte sequence. Otherwise discard
1643 * one byte as a bad character. */
1644 if (size == 1)
1645 break;
1646 found_bad = TRUE;
1647 bytelen = 1;
1651 if (!found_bad)
1653 int i;
1655 /* Convert "ucs2buf[ucs2len]" to 'enc' in "dst". */
1656 if (enc_utf8)
1658 /* From UCS-2 to UTF-8. Cannot fail. */
1659 for (i = 0; i < ucs2len; ++i)
1660 dst += utf_char2bytes(ucs2buf[i], dst);
1662 else
1664 BOOL bad = FALSE;
1665 int dstlen;
1667 /* From UCS-2 to "enc_codepage". If the
1668 * conversion uses the default character "?",
1669 * the data doesn't fit in this encoding. */
1670 dstlen = WideCharToMultiByte(enc_codepage, 0,
1671 (LPCWSTR)ucs2buf, ucs2len,
1672 (LPSTR)dst, (int)(src - dst),
1673 replstr, &bad);
1674 if (bad)
1675 found_bad = TRUE;
1676 else
1677 dst += dstlen;
1681 if (found_bad)
1683 /* Deal with bytes we can't convert. */
1684 if (can_retry)
1685 goto rewind_retry;
1686 if (conv_error == 0)
1687 conv_error = readfile_linenr(linecnt, ptr, dst);
1688 if (bad_char_behavior != BAD_DROP)
1690 if (bad_char_behavior == BAD_KEEP)
1692 mch_memmove(dst, src, bytelen);
1693 dst += bytelen;
1695 else
1696 *dst++ = bad_char_behavior;
1700 src += bytelen;
1701 size -= bytelen;
1704 if (size > 0)
1706 /* An incomplete byte sequence remaining. */
1707 mch_memmove(conv_rest, src, size);
1708 conv_restlen = size;
1711 /* The new size is equal to how much "dst" was advanced. */
1712 size = (long)(dst - ptr);
1714 else
1715 # endif
1716 # ifdef MACOS_CONVERT
1717 if (fio_flags & FIO_MACROMAN)
1720 * Conversion from Apple MacRoman char encoding to UTF-8 or
1721 * latin1. This is in os_mac_conv.c.
1723 if (macroman2enc(ptr, &size, real_size) == FAIL)
1724 goto rewind_retry;
1726 else
1727 # endif
1728 if (fio_flags != 0)
1730 int u8c;
1731 char_u *dest;
1732 char_u *tail = NULL;
1735 * "enc_utf8" set: Convert Unicode or Latin1 to UTF-8.
1736 * "enc_utf8" not set: Convert Unicode to Latin1.
1737 * Go from end to start through the buffer, because the number
1738 * of bytes may increase.
1739 * "dest" points to after where the UTF-8 bytes go, "p" points
1740 * to after the next character to convert.
1742 dest = ptr + real_size;
1743 if (fio_flags == FIO_LATIN1 || fio_flags == FIO_UTF8)
1745 p = ptr + size;
1746 if (fio_flags == FIO_UTF8)
1748 /* Check for a trailing incomplete UTF-8 sequence */
1749 tail = ptr + size - 1;
1750 while (tail > ptr && (*tail & 0xc0) == 0x80)
1751 --tail;
1752 if (tail + utf_byte2len(*tail) <= ptr + size)
1753 tail = NULL;
1754 else
1755 p = tail;
1758 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1760 /* Check for a trailing byte */
1761 p = ptr + (size & ~1);
1762 if (size & 1)
1763 tail = p;
1764 if ((fio_flags & FIO_UTF16) && p > ptr)
1766 /* Check for a trailing leading word */
1767 if (fio_flags & FIO_ENDIAN_L)
1769 u8c = (*--p << 8);
1770 u8c += *--p;
1772 else
1774 u8c = *--p;
1775 u8c += (*--p << 8);
1777 if (u8c >= 0xd800 && u8c <= 0xdbff)
1778 tail = p;
1779 else
1780 p += 2;
1783 else /* FIO_UCS4 */
1785 /* Check for trailing 1, 2 or 3 bytes */
1786 p = ptr + (size & ~3);
1787 if (size & 3)
1788 tail = p;
1791 /* If there is a trailing incomplete sequence move it to
1792 * conv_rest[]. */
1793 if (tail != NULL)
1795 conv_restlen = (int)((ptr + size) - tail);
1796 mch_memmove(conv_rest, (char_u *)tail, conv_restlen);
1797 size -= conv_restlen;
1801 while (p > ptr)
1803 if (fio_flags & FIO_LATIN1)
1804 u8c = *--p;
1805 else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1807 if (fio_flags & FIO_ENDIAN_L)
1809 u8c = (*--p << 8);
1810 u8c += *--p;
1812 else
1814 u8c = *--p;
1815 u8c += (*--p << 8);
1817 if ((fio_flags & FIO_UTF16)
1818 && u8c >= 0xdc00 && u8c <= 0xdfff)
1820 int u16c;
1822 if (p == ptr)
1824 /* Missing leading word. */
1825 if (can_retry)
1826 goto rewind_retry;
1827 if (conv_error == 0)
1828 conv_error = readfile_linenr(linecnt,
1829 ptr, p);
1830 if (bad_char_behavior == BAD_DROP)
1831 continue;
1832 if (bad_char_behavior != BAD_KEEP)
1833 u8c = bad_char_behavior;
1836 /* found second word of double-word, get the first
1837 * word and compute the resulting character */
1838 if (fio_flags & FIO_ENDIAN_L)
1840 u16c = (*--p << 8);
1841 u16c += *--p;
1843 else
1845 u16c = *--p;
1846 u16c += (*--p << 8);
1848 u8c = 0x10000 + ((u16c & 0x3ff) << 10)
1849 + (u8c & 0x3ff);
1851 /* Check if the word is indeed a leading word. */
1852 if (u16c < 0xd800 || u16c > 0xdbff)
1854 if (can_retry)
1855 goto rewind_retry;
1856 if (conv_error == 0)
1857 conv_error = readfile_linenr(linecnt,
1858 ptr, p);
1859 if (bad_char_behavior == BAD_DROP)
1860 continue;
1861 if (bad_char_behavior != BAD_KEEP)
1862 u8c = bad_char_behavior;
1866 else if (fio_flags & FIO_UCS4)
1868 if (fio_flags & FIO_ENDIAN_L)
1870 u8c = (*--p << 24);
1871 u8c += (*--p << 16);
1872 u8c += (*--p << 8);
1873 u8c += *--p;
1875 else /* big endian */
1877 u8c = *--p;
1878 u8c += (*--p << 8);
1879 u8c += (*--p << 16);
1880 u8c += (*--p << 24);
1883 else /* UTF-8 */
1885 if (*--p < 0x80)
1886 u8c = *p;
1887 else
1889 len = utf_head_off(ptr, p);
1890 p -= len;
1891 u8c = utf_ptr2char(p);
1892 if (len == 0)
1894 /* Not a valid UTF-8 character, retry with
1895 * another fenc when possible, otherwise just
1896 * report the error. */
1897 if (can_retry)
1898 goto rewind_retry;
1899 if (conv_error == 0)
1900 conv_error = readfile_linenr(linecnt,
1901 ptr, p);
1902 if (bad_char_behavior == BAD_DROP)
1903 continue;
1904 if (bad_char_behavior != BAD_KEEP)
1905 u8c = bad_char_behavior;
1909 if (enc_utf8) /* produce UTF-8 */
1911 dest -= utf_char2len(u8c);
1912 (void)utf_char2bytes(u8c, dest);
1914 else /* produce Latin1 */
1916 --dest;
1917 if (u8c >= 0x100)
1919 /* character doesn't fit in latin1, retry with
1920 * another fenc when possible, otherwise just
1921 * report the error. */
1922 if (can_retry)
1923 goto rewind_retry;
1924 if (conv_error == 0)
1925 conv_error = readfile_linenr(linecnt, ptr, p);
1926 if (bad_char_behavior == BAD_DROP)
1927 ++dest;
1928 else if (bad_char_behavior == BAD_KEEP)
1929 *dest = u8c;
1930 else if (eap != NULL && eap->bad_char != 0)
1931 *dest = bad_char_behavior;
1932 else
1933 *dest = 0xBF;
1935 else
1936 *dest = u8c;
1940 /* move the linerest to before the converted characters */
1941 line_start = dest - linerest;
1942 mch_memmove(line_start, buffer, (size_t)linerest);
1943 size = (long)((ptr + real_size) - dest);
1944 ptr = dest;
1946 else if (enc_utf8 && !curbuf->b_p_bin)
1948 int incomplete_tail = FALSE;
1950 /* Reading UTF-8: Check if the bytes are valid UTF-8. */
1951 for (p = ptr; ; ++p)
1953 int todo = (int)((ptr + size) - p);
1954 int l;
1956 if (todo <= 0)
1957 break;
1958 if (*p >= 0x80)
1960 /* A length of 1 means it's an illegal byte. Accept
1961 * an incomplete character at the end though, the next
1962 * read() will get the next bytes, we'll check it
1963 * then. */
1964 l = utf_ptr2len_len(p, todo);
1965 if (l > todo && !incomplete_tail)
1967 /* Avoid retrying with a different encoding when
1968 * a truncated file is more likely, or attempting
1969 * to read the rest of an incomplete sequence when
1970 * we have already done so. */
1971 if (p > ptr || filesize > 0)
1972 incomplete_tail = TRUE;
1973 /* Incomplete byte sequence, move it to conv_rest[]
1974 * and try to read the rest of it, unless we've
1975 * already done so. */
1976 if (p > ptr)
1978 conv_restlen = todo;
1979 mch_memmove(conv_rest, p, conv_restlen);
1980 size -= conv_restlen;
1981 break;
1984 if (l == 1 || l > todo)
1986 /* Illegal byte. If we can try another encoding
1987 * do that, unless at EOF where a truncated
1988 * file is more likely than a conversion error. */
1989 if (can_retry && !incomplete_tail)
1990 break;
1991 # ifdef USE_ICONV
1992 /* When we did a conversion report an error. */
1993 if (iconv_fd != (iconv_t)-1 && conv_error == 0)
1994 conv_error = readfile_linenr(linecnt, ptr, p);
1995 # endif
1996 /* Remember the first linenr with an illegal byte */
1997 if (conv_error == 0 && illegal_byte == 0)
1998 illegal_byte = readfile_linenr(linecnt, ptr, p);
2000 /* Drop, keep or replace the bad byte. */
2001 if (bad_char_behavior == BAD_DROP)
2003 mch_memmove(p, p + 1, todo - 1);
2004 --p;
2005 --size;
2007 else if (bad_char_behavior != BAD_KEEP)
2008 *p = bad_char_behavior;
2010 else
2011 p += l - 1;
2014 if (p < ptr + size && !incomplete_tail)
2016 /* Detected a UTF-8 error. */
2017 rewind_retry:
2018 /* Retry reading with another conversion. */
2019 # if defined(FEAT_EVAL) && defined(USE_ICONV)
2020 if (*p_ccv != NUL && iconv_fd != (iconv_t)-1)
2021 /* iconv() failed, try 'charconvert' */
2022 did_iconv = TRUE;
2023 else
2024 # endif
2025 /* use next item from 'fileencodings' */
2026 advance_fenc = TRUE;
2027 file_rewind = TRUE;
2028 goto retry;
2031 #endif
2033 /* count the number of characters (after conversion!) */
2034 filesize += size;
2037 * when reading the first part of a file: guess EOL type
2039 if (fileformat == EOL_UNKNOWN)
2041 /* First try finding a NL, for Dos and Unix */
2042 if (try_dos || try_unix)
2044 for (p = ptr; p < ptr + size; ++p)
2046 if (*p == NL)
2048 if (!try_unix
2049 || (try_dos && p > ptr && p[-1] == CAR))
2050 fileformat = EOL_DOS;
2051 else
2052 fileformat = EOL_UNIX;
2053 break;
2057 /* Don't give in to EOL_UNIX if EOL_MAC is more likely */
2058 if (fileformat == EOL_UNIX && try_mac)
2060 /* Need to reset the counters when retrying fenc. */
2061 try_mac = 1;
2062 try_unix = 1;
2063 for (; p >= ptr && *p != CAR; p--)
2065 if (p >= ptr)
2067 for (p = ptr; p < ptr + size; ++p)
2069 if (*p == NL)
2070 try_unix++;
2071 else if (*p == CAR)
2072 try_mac++;
2074 if (try_mac > try_unix)
2075 fileformat = EOL_MAC;
2080 /* No NL found: may use Mac format */
2081 if (fileformat == EOL_UNKNOWN && try_mac)
2082 fileformat = EOL_MAC;
2084 /* Still nothing found? Use first format in 'ffs' */
2085 if (fileformat == EOL_UNKNOWN)
2086 fileformat = default_fileformat();
2088 /* if editing a new file: may set p_tx and p_ff */
2089 if (set_options)
2090 set_fileformat(fileformat, OPT_LOCAL);
2095 * This loop is executed once for every character read.
2096 * Keep it fast!
2098 if (fileformat == EOL_MAC)
2100 --ptr;
2101 while (++ptr, --size >= 0)
2103 /* catch most common case first */
2104 if ((c = *ptr) != NUL && c != CAR && c != NL)
2105 continue;
2106 if (c == NUL)
2107 *ptr = NL; /* NULs are replaced by newlines! */
2108 else if (c == NL)
2109 *ptr = CAR; /* NLs are replaced by CRs! */
2110 else
2112 if (skip_count == 0)
2114 *ptr = NUL; /* end of line */
2115 len = (colnr_T) (ptr - line_start + 1);
2116 if (ml_append(lnum, line_start, len, newfile) == FAIL)
2118 error = TRUE;
2119 break;
2121 ++lnum;
2122 if (--read_count == 0)
2124 error = TRUE; /* break loop */
2125 line_start = ptr; /* nothing left to write */
2126 break;
2129 else
2130 --skip_count;
2131 line_start = ptr + 1;
2135 else
2137 --ptr;
2138 while (++ptr, --size >= 0)
2140 if ((c = *ptr) != NUL && c != NL) /* catch most common case */
2141 continue;
2142 if (c == NUL)
2143 *ptr = NL; /* NULs are replaced by newlines! */
2144 else
2146 if (skip_count == 0)
2148 *ptr = NUL; /* end of line */
2149 len = (colnr_T)(ptr - line_start + 1);
2150 if (fileformat == EOL_DOS)
2152 if (ptr[-1] == CAR) /* remove CR */
2154 ptr[-1] = NUL;
2155 --len;
2158 * Reading in Dos format, but no CR-LF found!
2159 * When 'fileformats' includes "unix", delete all
2160 * the lines read so far and start all over again.
2161 * Otherwise give an error message later.
2163 else if (ff_error != EOL_DOS)
2165 if ( try_unix
2166 && !read_stdin
2167 && (read_buffer
2168 || lseek(fd, (off_t)0L, SEEK_SET) == 0))
2170 fileformat = EOL_UNIX;
2171 if (set_options)
2172 set_fileformat(EOL_UNIX, OPT_LOCAL);
2173 file_rewind = TRUE;
2174 keep_fileformat = TRUE;
2175 goto retry;
2177 ff_error = EOL_DOS;
2180 if (ml_append(lnum, line_start, len, newfile) == FAIL)
2182 error = TRUE;
2183 break;
2185 ++lnum;
2186 if (--read_count == 0)
2188 error = TRUE; /* break loop */
2189 line_start = ptr; /* nothing left to write */
2190 break;
2193 else
2194 --skip_count;
2195 line_start = ptr + 1;
2199 linerest = (long)(ptr - line_start);
2200 ui_breakcheck();
2203 failed:
2204 /* not an error, max. number of lines reached */
2205 if (error && read_count == 0)
2206 error = FALSE;
2209 * If we get EOF in the middle of a line, note the fact and
2210 * complete the line ourselves.
2211 * In Dos format ignore a trailing CTRL-Z, unless 'binary' set.
2213 if (!error
2214 && !got_int
2215 && linerest != 0
2216 && !(!curbuf->b_p_bin
2217 && fileformat == EOL_DOS
2218 && *line_start == Ctrl_Z
2219 && ptr == line_start + 1))
2221 /* remember for when writing */
2222 if (set_options)
2223 curbuf->b_p_eol = FALSE;
2224 *ptr = NUL;
2225 if (ml_append(lnum, line_start,
2226 (colnr_T)(ptr - line_start + 1), newfile) == FAIL)
2227 error = TRUE;
2228 else
2229 read_no_eol_lnum = ++lnum;
2232 if (set_options)
2233 save_file_ff(curbuf); /* remember the current file format */
2235 #ifdef FEAT_CRYPT
2236 if (cryptkey != curbuf->b_p_key)
2237 vim_free(cryptkey);
2238 #endif
2240 #ifdef FEAT_MBYTE
2241 /* If editing a new file: set 'fenc' for the current buffer.
2242 * Also for ":read ++edit file". */
2243 if (set_options)
2244 set_string_option_direct((char_u *)"fenc", -1, fenc,
2245 OPT_FREE|OPT_LOCAL, 0);
2246 if (fenc_alloced)
2247 vim_free(fenc);
2248 # ifdef USE_ICONV
2249 if (iconv_fd != (iconv_t)-1)
2251 iconv_close(iconv_fd);
2252 iconv_fd = (iconv_t)-1;
2254 # endif
2255 #endif
2257 if (!read_buffer && !read_stdin)
2258 close(fd); /* errors are ignored */
2259 #ifdef HAVE_FD_CLOEXEC
2260 else
2262 int fdflags = fcntl(fd, F_GETFD);
2263 if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
2264 fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
2266 #endif
2267 vim_free(buffer);
2269 #ifdef HAVE_DUP
2270 if (read_stdin)
2272 /* Use stderr for stdin, makes shell commands work. */
2273 close(0);
2274 ignored = dup(2);
2276 #endif
2278 #ifdef FEAT_MBYTE
2279 if (tmpname != NULL)
2281 mch_remove(tmpname); /* delete converted file */
2282 vim_free(tmpname);
2284 #endif
2285 --no_wait_return; /* may wait for return now */
2288 * In recovery mode everything but autocommands is skipped.
2290 if (!recoverymode)
2292 /* need to delete the last line, which comes from the empty buffer */
2293 if (newfile && wasempty && !(curbuf->b_ml.ml_flags & ML_EMPTY))
2295 #ifdef FEAT_NETBEANS_INTG
2296 netbeansFireChanges = 0;
2297 #endif
2298 ml_delete(curbuf->b_ml.ml_line_count, FALSE);
2299 #ifdef FEAT_NETBEANS_INTG
2300 netbeansFireChanges = 1;
2301 #endif
2302 --linecnt;
2304 linecnt = curbuf->b_ml.ml_line_count - linecnt;
2305 if (filesize == 0)
2306 linecnt = 0;
2307 if (newfile || read_buffer)
2309 redraw_curbuf_later(NOT_VALID);
2310 #ifdef FEAT_DIFF
2311 /* After reading the text into the buffer the diff info needs to
2312 * be updated. */
2313 diff_invalidate(curbuf);
2314 #endif
2315 #ifdef FEAT_FOLDING
2316 /* All folds in the window are invalid now. Mark them for update
2317 * before triggering autocommands. */
2318 foldUpdateAll(curwin);
2319 #endif
2321 else if (linecnt) /* appended at least one line */
2322 appended_lines_mark(from, linecnt);
2324 #ifndef ALWAYS_USE_GUI
2326 * If we were reading from the same terminal as where messages go,
2327 * the screen will have been messed up.
2328 * Switch on raw mode now and clear the screen.
2330 if (read_stdin)
2332 settmode(TMODE_RAW); /* set to raw mode */
2333 starttermcap();
2334 screenclear();
2336 #endif
2338 if (got_int)
2340 if (!(flags & READ_DUMMY))
2342 filemess(curbuf, sfname, (char_u *)_(e_interr), 0);
2343 if (newfile)
2344 curbuf->b_p_ro = TRUE; /* must use "w!" now */
2346 msg_scroll = msg_save;
2347 #ifdef FEAT_VIMINFO
2348 check_marks_read();
2349 #endif
2350 return OK; /* an interrupt isn't really an error */
2353 if (!filtering && !(flags & READ_DUMMY))
2355 msg_add_fname(curbuf, sfname); /* fname in IObuff with quotes */
2356 c = FALSE;
2358 #ifdef UNIX
2359 # ifdef S_ISFIFO
2360 if (S_ISFIFO(perm)) /* fifo or socket */
2362 STRCAT(IObuff, _("[fifo/socket]"));
2363 c = TRUE;
2365 # else
2366 # ifdef S_IFIFO
2367 if ((perm & S_IFMT) == S_IFIFO) /* fifo */
2369 STRCAT(IObuff, _("[fifo]"));
2370 c = TRUE;
2372 # endif
2373 # ifdef S_IFSOCK
2374 if ((perm & S_IFMT) == S_IFSOCK) /* or socket */
2376 STRCAT(IObuff, _("[socket]"));
2377 c = TRUE;
2379 # endif
2380 # endif
2381 # ifdef OPEN_CHR_FILES
2382 if (S_ISCHR(perm)) /* or character special */
2384 STRCAT(IObuff, _("[character special]"));
2385 c = TRUE;
2387 # endif
2388 #endif
2389 if (curbuf->b_p_ro)
2391 STRCAT(IObuff, shortmess(SHM_RO) ? _("[RO]") : _("[readonly]"));
2392 c = TRUE;
2394 if (read_no_eol_lnum)
2396 msg_add_eol();
2397 c = TRUE;
2399 if (ff_error == EOL_DOS)
2401 STRCAT(IObuff, _("[CR missing]"));
2402 c = TRUE;
2404 if (split)
2406 STRCAT(IObuff, _("[long lines split]"));
2407 c = TRUE;
2409 #ifdef FEAT_MBYTE
2410 if (notconverted)
2412 STRCAT(IObuff, _("[NOT converted]"));
2413 c = TRUE;
2415 else if (converted)
2417 STRCAT(IObuff, _("[converted]"));
2418 c = TRUE;
2420 #endif
2421 #ifdef FEAT_CRYPT
2422 if (cryptkey != NULL)
2424 STRCAT(IObuff, _("[crypted]"));
2425 c = TRUE;
2427 #endif
2428 #ifdef FEAT_MBYTE
2429 if (conv_error != 0)
2431 sprintf((char *)IObuff + STRLEN(IObuff),
2432 _("[CONVERSION ERROR in line %ld]"), (long)conv_error);
2433 c = TRUE;
2435 else if (illegal_byte > 0)
2437 sprintf((char *)IObuff + STRLEN(IObuff),
2438 _("[ILLEGAL BYTE in line %ld]"), (long)illegal_byte);
2439 c = TRUE;
2441 else
2442 #endif
2443 if (error)
2445 STRCAT(IObuff, _("[READ ERRORS]"));
2446 c = TRUE;
2448 if (msg_add_fileformat(fileformat))
2449 c = TRUE;
2450 #ifdef FEAT_CRYPT
2451 if (cryptkey != NULL)
2452 msg_add_lines(c, (long)linecnt, filesize - CRYPT_MAGIC_LEN);
2453 else
2454 #endif
2455 msg_add_lines(c, (long)linecnt, filesize);
2457 vim_free(keep_msg);
2458 keep_msg = NULL;
2459 msg_scrolled_ign = TRUE;
2460 #ifdef ALWAYS_USE_GUI
2461 /* Don't show the message when reading stdin, it would end up in a
2462 * message box (which might be shown when exiting!) */
2463 if (read_stdin || read_buffer)
2464 p = msg_may_trunc(FALSE, IObuff);
2465 else
2466 #endif
2467 p = msg_trunc_attr(IObuff, FALSE, 0);
2468 if (read_stdin || read_buffer || restart_edit != 0
2469 || (msg_scrolled != 0 && !need_wait_return))
2470 /* Need to repeat the message after redrawing when:
2471 * - When reading from stdin (the screen will be cleared next).
2472 * - When restart_edit is set (otherwise there will be a delay
2473 * before redrawing).
2474 * - When the screen was scrolled but there is no wait-return
2475 * prompt. */
2476 set_keep_msg(p, 0);
2477 msg_scrolled_ign = FALSE;
2480 /* with errors writing the file requires ":w!" */
2481 if (newfile && (error
2482 #ifdef FEAT_MBYTE
2483 || conv_error != 0
2484 || (illegal_byte > 0 && bad_char_behavior != BAD_KEEP)
2485 #endif
2487 curbuf->b_p_ro = TRUE;
2489 u_clearline(); /* cannot use "U" command after adding lines */
2492 * In Ex mode: cursor at last new line.
2493 * Otherwise: cursor at first new line.
2495 if (exmode_active)
2496 curwin->w_cursor.lnum = from + linecnt;
2497 else
2498 curwin->w_cursor.lnum = from + 1;
2499 check_cursor_lnum();
2500 beginline(BL_WHITE | BL_FIX); /* on first non-blank */
2503 * Set '[ and '] marks to the newly read lines.
2505 curbuf->b_op_start.lnum = from + 1;
2506 curbuf->b_op_start.col = 0;
2507 curbuf->b_op_end.lnum = from + linecnt;
2508 curbuf->b_op_end.col = 0;
2510 #ifdef WIN32
2512 * Work around a weird problem: When a file has two links (only
2513 * possible on NTFS) and we write through one link, then stat() it
2514 * through the other link, the timestamp information may be wrong.
2515 * It's correct again after reading the file, thus reset the timestamp
2516 * here.
2518 if (newfile && !read_stdin && !read_buffer
2519 && mch_stat((char *)fname, &st) >= 0)
2521 buf_store_time(curbuf, &st, fname);
2522 curbuf->b_mtime_read = curbuf->b_mtime;
2524 #endif
2526 msg_scroll = msg_save;
2528 #ifdef FEAT_VIMINFO
2530 * Get the marks before executing autocommands, so they can be used there.
2532 check_marks_read();
2533 #endif
2536 * Trick: We remember if the last line of the read didn't have
2537 * an eol for when writing it again. This is required for
2538 * ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
2540 write_no_eol_lnum = read_no_eol_lnum;
2542 #ifdef FEAT_AUTOCMD
2543 if (!read_stdin && !read_buffer)
2545 int m = msg_scroll;
2546 int n = msg_scrolled;
2548 /* Save the fileformat now, otherwise the buffer will be considered
2549 * modified if the format/encoding was automatically detected. */
2550 if (set_options)
2551 save_file_ff(curbuf);
2554 * The output from the autocommands should not overwrite anything and
2555 * should not be overwritten: Set msg_scroll, restore its value if no
2556 * output was done.
2558 msg_scroll = TRUE;
2559 if (filtering)
2560 apply_autocmds_exarg(EVENT_FILTERREADPOST, NULL, sfname,
2561 FALSE, curbuf, eap);
2562 else if (newfile)
2563 apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
2564 FALSE, curbuf, eap);
2565 else
2566 apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
2567 FALSE, NULL, eap);
2568 if (msg_scrolled == n)
2569 msg_scroll = m;
2570 #ifdef FEAT_EVAL
2571 if (aborting()) /* autocmds may abort script processing */
2572 return FAIL;
2573 #endif
2575 #endif
2577 if (recoverymode && error)
2578 return FAIL;
2579 return OK;
2582 #ifdef OPEN_CHR_FILES
2584 * Returns TRUE if the file name argument is of the form "/dev/fd/\d\+",
2585 * which is the name of files used for process substitution output by
2586 * some shells on some operating systems, e.g., bash on SunOS.
2587 * Do not accept "/dev/fd/[012]", opening these may hang Vim.
2589 static int
2590 is_dev_fd_file(fname)
2591 char_u *fname;
2593 return (STRNCMP(fname, "/dev/fd/", 8) == 0
2594 && VIM_ISDIGIT(fname[8])
2595 && *skipdigits(fname + 9) == NUL
2596 && (fname[9] != NUL
2597 || (fname[8] != '0' && fname[8] != '1' && fname[8] != '2')));
2599 #endif
2601 #ifdef FEAT_MBYTE
2604 * From the current line count and characters read after that, estimate the
2605 * line number where we are now.
2606 * Used for error messages that include a line number.
2608 static linenr_T
2609 readfile_linenr(linecnt, p, endp)
2610 linenr_T linecnt; /* line count before reading more bytes */
2611 char_u *p; /* start of more bytes read */
2612 char_u *endp; /* end of more bytes read */
2614 char_u *s;
2615 linenr_T lnum;
2617 lnum = curbuf->b_ml.ml_line_count - linecnt + 1;
2618 for (s = p; s < endp; ++s)
2619 if (*s == '\n')
2620 ++lnum;
2621 return lnum;
2623 #endif
2626 * Fill "*eap" to force the 'fileencoding', 'fileformat' and 'binary to be
2627 * equal to the buffer "buf". Used for calling readfile().
2628 * Returns OK or FAIL.
2631 prep_exarg(eap, buf)
2632 exarg_T *eap;
2633 buf_T *buf;
2635 eap->cmd = alloc((unsigned)(STRLEN(buf->b_p_ff)
2636 #ifdef FEAT_MBYTE
2637 + STRLEN(buf->b_p_fenc)
2638 #endif
2639 + 15));
2640 if (eap->cmd == NULL)
2641 return FAIL;
2643 #ifdef FEAT_MBYTE
2644 sprintf((char *)eap->cmd, "e ++ff=%s ++enc=%s", buf->b_p_ff, buf->b_p_fenc);
2645 eap->force_enc = 14 + (int)STRLEN(buf->b_p_ff);
2646 eap->bad_char = buf->b_bad_char;
2647 #else
2648 sprintf((char *)eap->cmd, "e ++ff=%s", buf->b_p_ff);
2649 #endif
2650 eap->force_ff = 7;
2652 eap->force_bin = buf->b_p_bin ? FORCE_BIN : FORCE_NOBIN;
2653 eap->read_edit = FALSE;
2654 eap->forceit = FALSE;
2655 return OK;
2658 #ifdef FEAT_MBYTE
2660 * Find next fileencoding to use from 'fileencodings'.
2661 * "pp" points to fenc_next. It's advanced to the next item.
2662 * When there are no more items, an empty string is returned and *pp is set to
2663 * NULL.
2664 * When *pp is not set to NULL, the result is in allocated memory.
2666 static char_u *
2667 next_fenc(pp)
2668 char_u **pp;
2670 char_u *p;
2671 char_u *r;
2673 if (**pp == NUL)
2675 *pp = NULL;
2676 return (char_u *)"";
2678 p = vim_strchr(*pp, ',');
2679 if (p == NULL)
2681 r = enc_canonize(*pp);
2682 *pp += STRLEN(*pp);
2684 else
2686 r = vim_strnsave(*pp, (int)(p - *pp));
2687 *pp = p + 1;
2688 if (r != NULL)
2690 p = enc_canonize(r);
2691 vim_free(r);
2692 r = p;
2695 if (r == NULL) /* out of memory */
2697 r = (char_u *)"";
2698 *pp = NULL;
2700 return r;
2703 # ifdef FEAT_EVAL
2705 * Convert a file with the 'charconvert' expression.
2706 * This closes the file which is to be read, converts it and opens the
2707 * resulting file for reading.
2708 * Returns name of the resulting converted file (the caller should delete it
2709 * after reading it).
2710 * Returns NULL if the conversion failed ("*fdp" is not set) .
2712 static char_u *
2713 readfile_charconvert(fname, fenc, fdp)
2714 char_u *fname; /* name of input file */
2715 char_u *fenc; /* converted from */
2716 int *fdp; /* in/out: file descriptor of file */
2718 char_u *tmpname;
2719 char_u *errmsg = NULL;
2721 tmpname = vim_tempname('r');
2722 if (tmpname == NULL)
2723 errmsg = (char_u *)_("Can't find temp file for conversion");
2724 else
2726 close(*fdp); /* close the input file, ignore errors */
2727 *fdp = -1;
2728 if (eval_charconvert(fenc, enc_utf8 ? (char_u *)"utf-8" : p_enc,
2729 fname, tmpname) == FAIL)
2730 errmsg = (char_u *)_("Conversion with 'charconvert' failed");
2731 if (errmsg == NULL && (*fdp = mch_open((char *)tmpname,
2732 O_RDONLY | O_EXTRA, 0)) < 0)
2733 errmsg = (char_u *)_("can't read output of 'charconvert'");
2736 if (errmsg != NULL)
2738 /* Don't use emsg(), it breaks mappings, the retry with
2739 * another type of conversion might still work. */
2740 MSG(errmsg);
2741 if (tmpname != NULL)
2743 mch_remove(tmpname); /* delete converted file */
2744 vim_free(tmpname);
2745 tmpname = NULL;
2749 /* If the input file is closed, open it (caller should check for error). */
2750 if (*fdp < 0)
2751 *fdp = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
2753 return tmpname;
2755 # endif
2757 #endif
2759 #ifdef FEAT_VIMINFO
2761 * Read marks for the current buffer from the viminfo file, when we support
2762 * buffer marks and the buffer has a name.
2764 static void
2765 check_marks_read()
2767 if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
2768 && curbuf->b_ffname != NULL)
2769 read_viminfo(NULL, VIF_WANT_MARKS);
2771 /* Always set b_marks_read; needed when 'viminfo' is changed to include
2772 * the ' parameter after opening a buffer. */
2773 curbuf->b_marks_read = TRUE;
2775 #endif
2777 #ifdef FEAT_CRYPT
2779 * Check for magic number used for encryption.
2780 * If found, the magic number is removed from ptr[*sizep] and *sizep and
2781 * *filesizep are updated.
2782 * Return the (new) encryption key, NULL for no encryption.
2784 static char_u *
2785 check_for_cryptkey(cryptkey, ptr, sizep, filesizep, newfile)
2786 char_u *cryptkey; /* previous encryption key or NULL */
2787 char_u *ptr; /* pointer to read bytes */
2788 long *sizep; /* length of read bytes */
2789 long *filesizep; /* nr of bytes used from file */
2790 int newfile; /* editing a new buffer */
2792 if (*sizep >= CRYPT_MAGIC_LEN
2793 && STRNCMP(ptr, CRYPT_MAGIC, CRYPT_MAGIC_LEN) == 0)
2795 if (cryptkey == NULL)
2797 if (*curbuf->b_p_key)
2798 cryptkey = curbuf->b_p_key;
2799 else
2801 /* When newfile is TRUE, store the typed key
2802 * in the 'key' option and don't free it. */
2803 cryptkey = get_crypt_key(newfile, FALSE);
2804 /* check if empty key entered */
2805 if (cryptkey != NULL && *cryptkey == NUL)
2807 if (cryptkey != curbuf->b_p_key)
2808 vim_free(cryptkey);
2809 cryptkey = NULL;
2814 if (cryptkey != NULL)
2816 crypt_init_keys(cryptkey);
2818 /* Remove magic number from the text */
2819 *filesizep += CRYPT_MAGIC_LEN;
2820 *sizep -= CRYPT_MAGIC_LEN;
2821 mch_memmove(ptr, ptr + CRYPT_MAGIC_LEN, (size_t)*sizep);
2824 /* When starting to edit a new file which does not have
2825 * encryption, clear the 'key' option, except when
2826 * starting up (called with -x argument) */
2827 else if (newfile && *curbuf->b_p_key && !starting)
2828 set_option_value((char_u *)"key", 0L, (char_u *)"", OPT_LOCAL);
2830 return cryptkey;
2832 #endif
2834 #ifdef UNIX
2835 static void
2836 set_file_time(fname, atime, mtime)
2837 char_u *fname;
2838 time_t atime; /* access time */
2839 time_t mtime; /* modification time */
2841 # if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
2842 struct utimbuf buf;
2844 buf.actime = atime;
2845 buf.modtime = mtime;
2846 (void)utime((char *)fname, &buf);
2847 # else
2848 # if defined(HAVE_UTIMES)
2849 struct timeval tvp[2];
2851 tvp[0].tv_sec = atime;
2852 tvp[0].tv_usec = 0;
2853 tvp[1].tv_sec = mtime;
2854 tvp[1].tv_usec = 0;
2855 # ifdef NeXT
2856 (void)utimes((char *)fname, tvp);
2857 # else
2858 (void)utimes((char *)fname, (const struct timeval *)&tvp);
2859 # endif
2860 # endif
2861 # endif
2863 #endif /* UNIX */
2865 #if defined(VMS) && !defined(MIN)
2866 /* Older DECC compiler for VAX doesn't define MIN() */
2867 # define MIN(a, b) ((a) < (b) ? (a) : (b))
2868 #endif
2871 * Return TRUE if a file appears to be read-only from the file permissions.
2874 check_file_readonly(fname, perm)
2875 char_u *fname; /* full path to file */
2876 int perm; /* known permissions on file */
2878 #ifndef USE_MCH_ACCESS
2879 int fd = 0;
2880 #endif
2882 return (
2883 #ifdef USE_MCH_ACCESS
2884 # ifdef UNIX
2885 (perm & 0222) == 0 ||
2886 # endif
2887 mch_access((char *)fname, W_OK)
2888 #else
2889 (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0
2890 ? TRUE : (close(fd), FALSE)
2891 #endif
2897 * buf_write() - write to file "fname" lines "start" through "end"
2899 * We do our own buffering here because fwrite() is so slow.
2901 * If "forceit" is true, we don't care for errors when attempting backups.
2902 * In case of an error everything possible is done to restore the original
2903 * file. But when "forceit" is TRUE, we risk losing it.
2905 * When "reset_changed" is TRUE and "append" == FALSE and "start" == 1 and
2906 * "end" == curbuf->b_ml.ml_line_count, reset curbuf->b_changed.
2908 * This function must NOT use NameBuff (because it's called by autowrite()).
2910 * return FAIL for failure, OK otherwise
2913 buf_write(buf, fname, sfname, start, end, eap, append, forceit,
2914 reset_changed, filtering)
2915 buf_T *buf;
2916 char_u *fname;
2917 char_u *sfname;
2918 linenr_T start, end;
2919 exarg_T *eap; /* for forced 'ff' and 'fenc', can be
2920 NULL! */
2921 int append; /* append to the file */
2922 int forceit;
2923 int reset_changed;
2924 int filtering;
2926 int fd;
2927 char_u *backup = NULL;
2928 int backup_copy = FALSE; /* copy the original file? */
2929 int dobackup;
2930 char_u *ffname;
2931 char_u *wfname = NULL; /* name of file to write to */
2932 char_u *s;
2933 char_u *ptr;
2934 char_u c;
2935 int len;
2936 linenr_T lnum;
2937 long nchars;
2938 char_u *errmsg = NULL;
2939 int errmsg_allocated = FALSE;
2940 char_u *errnum = NULL;
2941 char_u *buffer;
2942 char_u smallbuf[SMBUFSIZE];
2943 char_u *backup_ext;
2944 int bufsize;
2945 long perm; /* file permissions */
2946 int retval = OK;
2947 int newfile = FALSE; /* TRUE if file doesn't exist yet */
2948 int msg_save = msg_scroll;
2949 int overwriting; /* TRUE if writing over original */
2950 int no_eol = FALSE; /* no end-of-line written */
2951 int device = FALSE; /* writing to a device */
2952 struct stat st_old;
2953 int prev_got_int = got_int;
2954 int file_readonly = FALSE; /* overwritten file is read-only */
2955 static char *err_readonly = "is read-only (cannot override: \"W\" in 'cpoptions')";
2956 #if defined(UNIX) || defined(__EMX__XX) /*XXX fix me sometime? */
2957 int made_writable = FALSE; /* 'w' bit has been set */
2958 #endif
2959 /* writing everything */
2960 int whole = (start == 1 && end == buf->b_ml.ml_line_count);
2961 #ifdef FEAT_AUTOCMD
2962 linenr_T old_line_count = buf->b_ml.ml_line_count;
2963 #endif
2964 int attr;
2965 int fileformat;
2966 int write_bin;
2967 struct bw_info write_info; /* info for buf_write_bytes() */
2968 #ifdef FEAT_MBYTE
2969 int converted = FALSE;
2970 int notconverted = FALSE;
2971 char_u *fenc; /* effective 'fileencoding' */
2972 char_u *fenc_tofree = NULL; /* allocated "fenc" */
2973 #endif
2974 #ifdef HAS_BW_FLAGS
2975 int wb_flags = 0;
2976 #endif
2977 #ifdef HAVE_ACL
2978 vim_acl_T acl = NULL; /* ACL copied from original file to
2979 backup or new file */
2980 #endif
2982 if (fname == NULL || *fname == NUL) /* safety check */
2983 return FAIL;
2984 if (buf->b_ml.ml_mfp == NULL)
2986 /* This can happen during startup when there is a stray "w" in the
2987 * vimrc file. */
2988 EMSG(_(e_emptybuf));
2989 return FAIL;
2993 * Disallow writing from .exrc and .vimrc in current directory for
2994 * security reasons.
2996 if (check_secure())
2997 return FAIL;
2999 /* Avoid a crash for a long name. */
3000 if (STRLEN(fname) >= MAXPATHL)
3002 EMSG(_(e_longname));
3003 return FAIL;
3006 #ifdef FEAT_MBYTE
3007 /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */
3008 write_info.bw_conv_buf = NULL;
3009 write_info.bw_conv_error = FALSE;
3010 write_info.bw_conv_error_lnum = 0;
3011 write_info.bw_restlen = 0;
3012 # ifdef USE_ICONV
3013 write_info.bw_iconv_fd = (iconv_t)-1;
3014 # endif
3015 #endif
3017 /* After writing a file changedtick changes but we don't want to display
3018 * the line. */
3019 ex_no_reprint = TRUE;
3022 * If there is no file name yet, use the one for the written file.
3023 * BF_NOTEDITED is set to reflect this (in case the write fails).
3024 * Don't do this when the write is for a filter command.
3025 * Don't do this when appending.
3026 * Only do this when 'cpoptions' contains the 'F' flag.
3028 if (buf->b_ffname == NULL
3029 && reset_changed
3030 && whole
3031 && buf == curbuf
3032 #ifdef FEAT_QUICKFIX
3033 && !bt_nofile(buf)
3034 #endif
3035 && !filtering
3036 && (!append || vim_strchr(p_cpo, CPO_FNAMEAPP) != NULL)
3037 && vim_strchr(p_cpo, CPO_FNAMEW) != NULL)
3039 if (set_rw_fname(fname, sfname) == FAIL)
3040 return FAIL;
3041 buf = curbuf; /* just in case autocmds made "buf" invalid */
3044 if (sfname == NULL)
3045 sfname = fname;
3047 * For Unix: Use the short file name whenever possible.
3048 * Avoids problems with networks and when directory names are changed.
3049 * Don't do this for MS-DOS, a "cd" in a sub-shell may have moved us to
3050 * another directory, which we don't detect
3052 ffname = fname; /* remember full fname */
3053 #ifdef UNIX
3054 fname = sfname;
3055 #endif
3057 if (buf->b_ffname != NULL && fnamecmp(ffname, buf->b_ffname) == 0)
3058 overwriting = TRUE;
3059 else
3060 overwriting = FALSE;
3062 if (exiting)
3063 settmode(TMODE_COOK); /* when exiting allow typahead now */
3065 ++no_wait_return; /* don't wait for return yet */
3068 * Set '[ and '] marks to the lines to be written.
3070 buf->b_op_start.lnum = start;
3071 buf->b_op_start.col = 0;
3072 buf->b_op_end.lnum = end;
3073 buf->b_op_end.col = 0;
3075 #ifdef FEAT_AUTOCMD
3077 aco_save_T aco;
3078 int buf_ffname = FALSE;
3079 int buf_sfname = FALSE;
3080 int buf_fname_f = FALSE;
3081 int buf_fname_s = FALSE;
3082 int did_cmd = FALSE;
3083 int nofile_err = FALSE;
3084 int empty_memline = (buf->b_ml.ml_mfp == NULL);
3087 * Apply PRE aucocommands.
3088 * Set curbuf to the buffer to be written.
3089 * Careful: The autocommands may call buf_write() recursively!
3091 if (ffname == buf->b_ffname)
3092 buf_ffname = TRUE;
3093 if (sfname == buf->b_sfname)
3094 buf_sfname = TRUE;
3095 if (fname == buf->b_ffname)
3096 buf_fname_f = TRUE;
3097 if (fname == buf->b_sfname)
3098 buf_fname_s = TRUE;
3100 /* set curwin/curbuf to buf and save a few things */
3101 aucmd_prepbuf(&aco, buf);
3103 if (append)
3105 if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEAPPENDCMD,
3106 sfname, sfname, FALSE, curbuf, eap)))
3108 #ifdef FEAT_QUICKFIX
3109 if (overwriting && bt_nofile(curbuf))
3110 nofile_err = TRUE;
3111 else
3112 #endif
3113 apply_autocmds_exarg(EVENT_FILEAPPENDPRE,
3114 sfname, sfname, FALSE, curbuf, eap);
3117 else if (filtering)
3119 apply_autocmds_exarg(EVENT_FILTERWRITEPRE,
3120 NULL, sfname, FALSE, curbuf, eap);
3122 else if (reset_changed && whole)
3124 if (!(did_cmd = apply_autocmds_exarg(EVENT_BUFWRITECMD,
3125 sfname, sfname, FALSE, curbuf, eap)))
3127 #ifdef FEAT_QUICKFIX
3128 if (overwriting && bt_nofile(curbuf))
3129 nofile_err = TRUE;
3130 else
3131 #endif
3132 apply_autocmds_exarg(EVENT_BUFWRITEPRE,
3133 sfname, sfname, FALSE, curbuf, eap);
3136 else
3138 if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEWRITECMD,
3139 sfname, sfname, FALSE, curbuf, eap)))
3141 #ifdef FEAT_QUICKFIX
3142 if (overwriting && bt_nofile(curbuf))
3143 nofile_err = TRUE;
3144 else
3145 #endif
3146 apply_autocmds_exarg(EVENT_FILEWRITEPRE,
3147 sfname, sfname, FALSE, curbuf, eap);
3151 /* restore curwin/curbuf and a few other things */
3152 aucmd_restbuf(&aco);
3155 * In three situations we return here and don't write the file:
3156 * 1. the autocommands deleted or unloaded the buffer.
3157 * 2. The autocommands abort script processing.
3158 * 3. If one of the "Cmd" autocommands was executed.
3160 if (!buf_valid(buf))
3161 buf = NULL;
3162 if (buf == NULL || (buf->b_ml.ml_mfp == NULL && !empty_memline)
3163 || did_cmd || nofile_err
3164 #ifdef FEAT_EVAL
3165 || aborting()
3166 #endif
3169 --no_wait_return;
3170 msg_scroll = msg_save;
3171 if (nofile_err)
3172 EMSG(_("E676: No matching autocommands for acwrite buffer"));
3174 if (nofile_err
3175 #ifdef FEAT_EVAL
3176 || aborting()
3177 #endif
3179 /* An aborting error, interrupt or exception in the
3180 * autocommands. */
3181 return FAIL;
3182 if (did_cmd)
3184 if (buf == NULL)
3185 /* The buffer was deleted. We assume it was written
3186 * (can't retry anyway). */
3187 return OK;
3188 if (overwriting)
3190 /* Assume the buffer was written, update the timestamp. */
3191 ml_timestamp(buf);
3192 if (append)
3193 buf->b_flags &= ~BF_NEW;
3194 else
3195 buf->b_flags &= ~BF_WRITE_MASK;
3197 if (reset_changed && buf->b_changed && !append
3198 && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL))
3199 /* Buffer still changed, the autocommands didn't work
3200 * properly. */
3201 return FAIL;
3202 return OK;
3204 #ifdef FEAT_EVAL
3205 if (!aborting())
3206 #endif
3207 EMSG(_("E203: Autocommands deleted or unloaded buffer to be written"));
3208 return FAIL;
3212 * The autocommands may have changed the number of lines in the file.
3213 * When writing the whole file, adjust the end.
3214 * When writing part of the file, assume that the autocommands only
3215 * changed the number of lines that are to be written (tricky!).
3217 if (buf->b_ml.ml_line_count != old_line_count)
3219 if (whole) /* write all */
3220 end = buf->b_ml.ml_line_count;
3221 else if (buf->b_ml.ml_line_count > old_line_count) /* more lines */
3222 end += buf->b_ml.ml_line_count - old_line_count;
3223 else /* less lines */
3225 end -= old_line_count - buf->b_ml.ml_line_count;
3226 if (end < start)
3228 --no_wait_return;
3229 msg_scroll = msg_save;
3230 EMSG(_("E204: Autocommand changed number of lines in unexpected way"));
3231 return FAIL;
3237 * The autocommands may have changed the name of the buffer, which may
3238 * be kept in fname, ffname and sfname.
3240 if (buf_ffname)
3241 ffname = buf->b_ffname;
3242 if (buf_sfname)
3243 sfname = buf->b_sfname;
3244 if (buf_fname_f)
3245 fname = buf->b_ffname;
3246 if (buf_fname_s)
3247 fname = buf->b_sfname;
3249 #endif
3251 #ifdef FEAT_NETBEANS_INTG
3252 if (usingNetbeans && isNetbeansBuffer(buf))
3254 if (whole)
3257 * b_changed can be 0 after an undo, but we still need to write
3258 * the buffer to NetBeans.
3260 if (buf->b_changed || isNetbeansModified(buf))
3262 --no_wait_return; /* may wait for return now */
3263 msg_scroll = msg_save;
3264 netbeans_save_buffer(buf); /* no error checking... */
3265 return retval;
3267 else
3269 errnum = (char_u *)"E656: ";
3270 errmsg = (char_u *)_("NetBeans disallows writes of unmodified buffers");
3271 buffer = NULL;
3272 goto fail;
3275 else
3277 errnum = (char_u *)"E657: ";
3278 errmsg = (char_u *)_("Partial writes disallowed for NetBeans buffers");
3279 buffer = NULL;
3280 goto fail;
3283 #endif
3285 if (shortmess(SHM_OVER) && !exiting)
3286 msg_scroll = FALSE; /* overwrite previous file message */
3287 else
3288 msg_scroll = TRUE; /* don't overwrite previous file message */
3289 if (!filtering)
3290 filemess(buf,
3291 #ifndef UNIX
3292 sfname,
3293 #else
3294 fname,
3295 #endif
3296 (char_u *)"", 0); /* show that we are busy */
3297 msg_scroll = FALSE; /* always overwrite the file message now */
3299 buffer = alloc(BUFSIZE);
3300 if (buffer == NULL) /* can't allocate big buffer, use small
3301 * one (to be able to write when out of
3302 * memory) */
3304 buffer = smallbuf;
3305 bufsize = SMBUFSIZE;
3307 else
3308 bufsize = BUFSIZE;
3311 * Get information about original file (if there is one).
3313 #if defined(UNIX) && !defined(ARCHIE)
3314 st_old.st_dev = 0;
3315 st_old.st_ino = 0;
3316 perm = -1;
3317 if (mch_stat((char *)fname, &st_old) < 0)
3318 newfile = TRUE;
3319 else
3321 perm = st_old.st_mode;
3322 if (!S_ISREG(st_old.st_mode)) /* not a file */
3324 if (S_ISDIR(st_old.st_mode))
3326 errnum = (char_u *)"E502: ";
3327 errmsg = (char_u *)_("is a directory");
3328 goto fail;
3330 if (mch_nodetype(fname) != NODE_WRITABLE)
3332 errnum = (char_u *)"E503: ";
3333 errmsg = (char_u *)_("is not a file or writable device");
3334 goto fail;
3336 /* It's a device of some kind (or a fifo) which we can write to
3337 * but for which we can't make a backup. */
3338 device = TRUE;
3339 newfile = TRUE;
3340 perm = -1;
3343 #else /* !UNIX */
3345 * Check for a writable device name.
3347 c = mch_nodetype(fname);
3348 if (c == NODE_OTHER)
3350 errnum = (char_u *)"E503: ";
3351 errmsg = (char_u *)_("is not a file or writable device");
3352 goto fail;
3354 if (c == NODE_WRITABLE)
3356 # if defined(MSDOS) || defined(MSWIN) || defined(OS2)
3357 /* MS-Windows allows opening a device, but we will probably get stuck
3358 * trying to write to it. */
3359 if (!p_odev)
3361 errnum = (char_u *)"E796: ";
3362 errmsg = (char_u *)_("writing to device disabled with 'opendevice' option");
3363 goto fail;
3365 # endif
3366 device = TRUE;
3367 newfile = TRUE;
3368 perm = -1;
3370 else
3372 perm = mch_getperm(fname);
3373 if (perm < 0)
3374 newfile = TRUE;
3375 else if (mch_isdir(fname))
3377 errnum = (char_u *)"E502: ";
3378 errmsg = (char_u *)_("is a directory");
3379 goto fail;
3381 if (overwriting)
3382 (void)mch_stat((char *)fname, &st_old);
3384 #endif /* !UNIX */
3386 if (!device && !newfile)
3389 * Check if the file is really writable (when renaming the file to
3390 * make a backup we won't discover it later).
3392 file_readonly = check_file_readonly(fname, (int)perm);
3394 if (!forceit && file_readonly)
3396 if (vim_strchr(p_cpo, CPO_FWRITE) != NULL)
3398 errnum = (char_u *)"E504: ";
3399 errmsg = (char_u *)_(err_readonly);
3401 else
3403 errnum = (char_u *)"E505: ";
3404 errmsg = (char_u *)_("is read-only (add ! to override)");
3406 goto fail;
3410 * Check if the timestamp hasn't changed since reading the file.
3412 if (overwriting)
3414 retval = check_mtime(buf, &st_old);
3415 if (retval == FAIL)
3416 goto fail;
3420 #ifdef HAVE_ACL
3422 * For systems that support ACL: get the ACL from the original file.
3424 if (!newfile)
3425 acl = mch_get_acl(fname);
3426 #endif
3429 * If 'backupskip' is not empty, don't make a backup for some files.
3431 dobackup = (p_wb || p_bk || *p_pm != NUL);
3432 #ifdef FEAT_WILDIGN
3433 if (dobackup && *p_bsk != NUL && match_file_list(p_bsk, sfname, ffname))
3434 dobackup = FALSE;
3435 #endif
3438 * Save the value of got_int and reset it. We don't want a previous
3439 * interruption cancel writing, only hitting CTRL-C while writing should
3440 * abort it.
3442 prev_got_int = got_int;
3443 got_int = FALSE;
3445 /* Mark the buffer as 'being saved' to prevent changed buffer warnings */
3446 buf->b_saving = TRUE;
3449 * If we are not appending or filtering, the file exists, and the
3450 * 'writebackup', 'backup' or 'patchmode' option is set, need a backup.
3451 * When 'patchmode' is set also make a backup when appending.
3453 * Do not make any backup, if 'writebackup' and 'backup' are both switched
3454 * off. This helps when editing large files on almost-full disks.
3456 if (!(append && *p_pm == NUL) && !filtering && perm >= 0 && dobackup)
3458 #if defined(UNIX) || defined(WIN32)
3459 struct stat st;
3460 #endif
3462 if ((bkc_flags & BKC_YES) || append) /* "yes" */
3463 backup_copy = TRUE;
3464 #if defined(UNIX) || defined(WIN32)
3465 else if ((bkc_flags & BKC_AUTO)) /* "auto" */
3467 int i;
3469 # ifdef UNIX
3471 * Don't rename the file when:
3472 * - it's a hard link
3473 * - it's a symbolic link
3474 * - we don't have write permission in the directory
3475 * - we can't set the owner/group of the new file
3477 if (st_old.st_nlink > 1
3478 || mch_lstat((char *)fname, &st) < 0
3479 || st.st_dev != st_old.st_dev
3480 || st.st_ino != st_old.st_ino
3481 # ifndef HAVE_FCHOWN
3482 || st.st_uid != st_old.st_uid
3483 || st.st_gid != st_old.st_gid
3484 # endif
3486 backup_copy = TRUE;
3487 else
3488 # else
3489 # ifdef WIN32
3490 /* On NTFS file systems hard links are possible. */
3491 if (mch_is_linked(fname))
3492 backup_copy = TRUE;
3493 else
3494 # endif
3495 # endif
3498 * Check if we can create a file and set the owner/group to
3499 * the ones from the original file.
3500 * First find a file name that doesn't exist yet (use some
3501 * arbitrary numbers).
3503 STRCPY(IObuff, fname);
3504 for (i = 4913; ; i += 123)
3506 sprintf((char *)gettail(IObuff), "%d", i);
3507 if (mch_lstat((char *)IObuff, &st) < 0)
3508 break;
3510 fd = mch_open((char *)IObuff,
3511 O_CREAT|O_WRONLY|O_EXCL|O_NOFOLLOW, perm);
3512 if (fd < 0) /* can't write in directory */
3513 backup_copy = TRUE;
3514 else
3516 # ifdef UNIX
3517 # ifdef HAVE_FCHOWN
3518 ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
3519 # endif
3520 if (mch_stat((char *)IObuff, &st) < 0
3521 || st.st_uid != st_old.st_uid
3522 || st.st_gid != st_old.st_gid
3523 || (long)st.st_mode != perm)
3524 backup_copy = TRUE;
3525 # endif
3526 /* Close the file before removing it, on MS-Windows we
3527 * can't delete an open file. */
3528 close(fd);
3529 mch_remove(IObuff);
3534 # ifdef UNIX
3536 * Break symlinks and/or hardlinks if we've been asked to.
3538 if ((bkc_flags & BKC_BREAKSYMLINK) || (bkc_flags & BKC_BREAKHARDLINK))
3540 int lstat_res;
3542 lstat_res = mch_lstat((char *)fname, &st);
3544 /* Symlinks. */
3545 if ((bkc_flags & BKC_BREAKSYMLINK)
3546 && lstat_res == 0
3547 && st.st_ino != st_old.st_ino)
3548 backup_copy = FALSE;
3550 /* Hardlinks. */
3551 if ((bkc_flags & BKC_BREAKHARDLINK)
3552 && st_old.st_nlink > 1
3553 && (lstat_res != 0 || st.st_ino == st_old.st_ino))
3554 backup_copy = FALSE;
3556 #endif
3558 #endif
3560 /* make sure we have a valid backup extension to use */
3561 if (*p_bex == NUL)
3563 #ifdef RISCOS
3564 backup_ext = (char_u *)"/bak";
3565 #else
3566 backup_ext = (char_u *)".bak";
3567 #endif
3569 else
3570 backup_ext = p_bex;
3572 if (backup_copy
3573 && (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) >= 0)
3575 int bfd;
3576 char_u *copybuf, *wp;
3577 int some_error = FALSE;
3578 struct stat st_new;
3579 char_u *dirp;
3580 char_u *rootname;
3581 #if defined(UNIX) && !defined(SHORT_FNAME)
3582 int did_set_shortname;
3583 #endif
3585 copybuf = alloc(BUFSIZE + 1);
3586 if (copybuf == NULL)
3588 some_error = TRUE; /* out of memory */
3589 goto nobackup;
3593 * Try to make the backup in each directory in the 'bdir' option.
3595 * Unix semantics has it, that we may have a writable file,
3596 * that cannot be recreated with a simple open(..., O_CREAT, ) e.g:
3597 * - the directory is not writable,
3598 * - the file may be a symbolic link,
3599 * - the file may belong to another user/group, etc.
3601 * For these reasons, the existing writable file must be truncated
3602 * and reused. Creation of a backup COPY will be attempted.
3604 dirp = p_bdir;
3605 while (*dirp)
3607 #ifdef UNIX
3608 st_new.st_ino = 0;
3609 st_new.st_dev = 0;
3610 st_new.st_gid = 0;
3611 #endif
3614 * Isolate one directory name, using an entry in 'bdir'.
3616 (void)copy_option_part(&dirp, copybuf, BUFSIZE, ",");
3617 rootname = get_file_in_dir(fname, copybuf);
3618 if (rootname == NULL)
3620 some_error = TRUE; /* out of memory */
3621 goto nobackup;
3624 #if defined(UNIX) && !defined(SHORT_FNAME)
3625 did_set_shortname = FALSE;
3626 #endif
3629 * May try twice if 'shortname' not set.
3631 for (;;)
3634 * Make backup file name.
3636 backup = buf_modname(
3637 #ifdef SHORT_FNAME
3638 TRUE,
3639 #else
3640 (buf->b_p_sn || buf->b_shortname),
3641 #endif
3642 rootname, backup_ext, FALSE);
3643 if (backup == NULL)
3645 vim_free(rootname);
3646 some_error = TRUE; /* out of memory */
3647 goto nobackup;
3651 * Check if backup file already exists.
3653 if (mch_stat((char *)backup, &st_new) >= 0)
3655 #ifdef UNIX
3657 * Check if backup file is same as original file.
3658 * May happen when modname() gave the same file back.
3659 * E.g. silly link, or file name-length reached.
3660 * If we don't check here, we either ruin the file
3661 * when copying or erase it after writing. jw.
3663 if (st_new.st_dev == st_old.st_dev
3664 && st_new.st_ino == st_old.st_ino)
3666 vim_free(backup);
3667 backup = NULL; /* no backup file to delete */
3668 # ifndef SHORT_FNAME
3670 * may try again with 'shortname' set
3672 if (!(buf->b_shortname || buf->b_p_sn))
3674 buf->b_shortname = TRUE;
3675 did_set_shortname = TRUE;
3676 continue;
3678 /* setting shortname didn't help */
3679 if (did_set_shortname)
3680 buf->b_shortname = FALSE;
3681 # endif
3682 break;
3684 #endif
3687 * If we are not going to keep the backup file, don't
3688 * delete an existing one, try to use another name.
3689 * Change one character, just before the extension.
3691 if (!p_bk)
3693 wp = backup + STRLEN(backup) - 1
3694 - STRLEN(backup_ext);
3695 if (wp < backup) /* empty file name ??? */
3696 wp = backup;
3697 *wp = 'z';
3698 while (*wp > 'a'
3699 && mch_stat((char *)backup, &st_new) >= 0)
3700 --*wp;
3701 /* They all exist??? Must be something wrong. */
3702 if (*wp == 'a')
3704 vim_free(backup);
3705 backup = NULL;
3709 break;
3711 vim_free(rootname);
3714 * Try to create the backup file
3716 if (backup != NULL)
3718 /* remove old backup, if present */
3719 mch_remove(backup);
3720 /* Open with O_EXCL to avoid the file being created while
3721 * we were sleeping (symlink hacker attack?) */
3722 bfd = mch_open((char *)backup,
3723 O_WRONLY|O_CREAT|O_EXTRA|O_EXCL|O_NOFOLLOW,
3724 perm & 0777);
3725 if (bfd < 0)
3727 vim_free(backup);
3728 backup = NULL;
3730 else
3732 /* set file protection same as original file, but
3733 * strip s-bit */
3734 (void)mch_setperm(backup, perm & 0777);
3736 #ifdef UNIX
3738 * Try to set the group of the backup same as the
3739 * original file. If this fails, set the protection
3740 * bits for the group same as the protection bits for
3741 * others.
3743 if (st_new.st_gid != st_old.st_gid
3744 # ifdef HAVE_FCHOWN /* sequent-ptx lacks fchown() */
3745 && fchown(bfd, (uid_t)-1, st_old.st_gid) != 0
3746 # endif
3748 mch_setperm(backup,
3749 (perm & 0707) | ((perm & 07) << 3));
3750 # ifdef HAVE_SELINUX
3751 mch_copy_sec(fname, backup);
3752 # endif
3753 #endif
3756 * copy the file.
3758 write_info.bw_fd = bfd;
3759 write_info.bw_buf = copybuf;
3760 #ifdef HAS_BW_FLAGS
3761 write_info.bw_flags = FIO_NOCONVERT;
3762 #endif
3763 while ((write_info.bw_len = vim_read(fd, copybuf,
3764 BUFSIZE)) > 0)
3766 if (buf_write_bytes(&write_info) == FAIL)
3768 errmsg = (char_u *)_("E506: Can't write to backup file (add ! to override)");
3769 break;
3771 ui_breakcheck();
3772 if (got_int)
3774 errmsg = (char_u *)_(e_interr);
3775 break;
3779 if (close(bfd) < 0 && errmsg == NULL)
3780 errmsg = (char_u *)_("E507: Close error for backup file (add ! to override)");
3781 if (write_info.bw_len < 0)
3782 errmsg = (char_u *)_("E508: Can't read file for backup (add ! to override)");
3783 #ifdef UNIX
3784 set_file_time(backup, st_old.st_atime, st_old.st_mtime);
3785 #endif
3786 #ifdef HAVE_ACL
3787 mch_set_acl(backup, acl);
3788 #endif
3789 #ifdef HAVE_SELINUX
3790 mch_copy_sec(fname, backup);
3791 #endif
3792 break;
3796 nobackup:
3797 close(fd); /* ignore errors for closing read file */
3798 vim_free(copybuf);
3800 if (backup == NULL && errmsg == NULL)
3801 errmsg = (char_u *)_("E509: Cannot create backup file (add ! to override)");
3802 /* ignore errors when forceit is TRUE */
3803 if ((some_error || errmsg != NULL) && !forceit)
3805 retval = FAIL;
3806 goto fail;
3808 errmsg = NULL;
3810 else
3812 char_u *dirp;
3813 char_u *p;
3814 char_u *rootname;
3817 * Make a backup by renaming the original file.
3820 * If 'cpoptions' includes the "W" flag, we don't want to
3821 * overwrite a read-only file. But rename may be possible
3822 * anyway, thus we need an extra check here.
3824 if (file_readonly && vim_strchr(p_cpo, CPO_FWRITE) != NULL)
3826 errnum = (char_u *)"E504: ";
3827 errmsg = (char_u *)_(err_readonly);
3828 goto fail;
3833 * Form the backup file name - change path/fo.o.h to
3834 * path/fo.o.h.bak Try all directories in 'backupdir', first one
3835 * that works is used.
3837 dirp = p_bdir;
3838 while (*dirp)
3841 * Isolate one directory name and make the backup file name.
3843 (void)copy_option_part(&dirp, IObuff, IOSIZE, ",");
3844 rootname = get_file_in_dir(fname, IObuff);
3845 if (rootname == NULL)
3846 backup = NULL;
3847 else
3849 backup = buf_modname(
3850 #ifdef SHORT_FNAME
3851 TRUE,
3852 #else
3853 (buf->b_p_sn || buf->b_shortname),
3854 #endif
3855 rootname, backup_ext, FALSE);
3856 vim_free(rootname);
3859 if (backup != NULL)
3862 * If we are not going to keep the backup file, don't
3863 * delete an existing one, try to use another name.
3864 * Change one character, just before the extension.
3866 if (!p_bk && mch_getperm(backup) >= 0)
3868 p = backup + STRLEN(backup) - 1 - STRLEN(backup_ext);
3869 if (p < backup) /* empty file name ??? */
3870 p = backup;
3871 *p = 'z';
3872 while (*p > 'a' && mch_getperm(backup) >= 0)
3873 --*p;
3874 /* They all exist??? Must be something wrong! */
3875 if (*p == 'a')
3877 vim_free(backup);
3878 backup = NULL;
3882 if (backup != NULL)
3885 * Delete any existing backup and move the current version
3886 * to the backup. For safety, we don't remove the backup
3887 * until the write has finished successfully. And if the
3888 * 'backup' option is set, leave it around.
3891 * If the renaming of the original file to the backup file
3892 * works, quit here.
3894 if (vim_rename(fname, backup) == 0)
3895 break;
3897 vim_free(backup); /* don't do the rename below */
3898 backup = NULL;
3901 if (backup == NULL && !forceit)
3903 errmsg = (char_u *)_("E510: Can't make backup file (add ! to override)");
3904 goto fail;
3909 #if defined(UNIX) && !defined(ARCHIE)
3910 /* When using ":w!" and the file was read-only: make it writable */
3911 if (forceit && perm >= 0 && !(perm & 0200) && st_old.st_uid == getuid()
3912 && vim_strchr(p_cpo, CPO_FWRITE) == NULL)
3914 perm |= 0200;
3915 (void)mch_setperm(fname, perm);
3916 made_writable = TRUE;
3918 #endif
3920 /* When using ":w!" and writing to the current file, 'readonly' makes no
3921 * sense, reset it, unless 'Z' appears in 'cpoptions'. */
3922 if (forceit && overwriting && vim_strchr(p_cpo, CPO_KEEPRO) == NULL)
3924 buf->b_p_ro = FALSE;
3925 #ifdef FEAT_TITLE
3926 need_maketitle = TRUE; /* set window title later */
3927 #endif
3928 #ifdef FEAT_WINDOWS
3929 status_redraw_all(); /* redraw status lines later */
3930 #endif
3933 if (end > buf->b_ml.ml_line_count)
3934 end = buf->b_ml.ml_line_count;
3935 if (buf->b_ml.ml_flags & ML_EMPTY)
3936 start = end + 1;
3939 * If the original file is being overwritten, there is a small chance that
3940 * we crash in the middle of writing. Therefore the file is preserved now.
3941 * This makes all block numbers positive so that recovery does not need
3942 * the original file.
3943 * Don't do this if there is a backup file and we are exiting.
3945 if (reset_changed && !newfile && overwriting
3946 && !(exiting && backup != NULL))
3948 ml_preserve(buf, FALSE);
3949 if (got_int)
3951 errmsg = (char_u *)_(e_interr);
3952 goto restore_backup;
3956 #ifdef MACOS_CLASSIC /* TODO: Is it need for MACOS_X? (Dany) */
3958 * Before risking to lose the original file verify if there's
3959 * a resource fork to preserve, and if cannot be done warn
3960 * the users. This happens when overwriting without backups.
3962 if (backup == NULL && overwriting && !append)
3963 if (mch_has_resource_fork(fname))
3965 errmsg = (char_u *)_("E460: The resource fork would be lost (add ! to override)");
3966 goto restore_backup;
3968 #endif
3970 #ifdef VMS
3971 vms_remove_version(fname); /* remove version */
3972 #endif
3973 /* Default: write the file directly. May write to a temp file for
3974 * multi-byte conversion. */
3975 wfname = fname;
3977 #ifdef FEAT_MBYTE
3978 /* Check for forced 'fileencoding' from "++opt=val" argument. */
3979 if (eap != NULL && eap->force_enc != 0)
3981 fenc = eap->cmd + eap->force_enc;
3982 fenc = enc_canonize(fenc);
3983 fenc_tofree = fenc;
3985 else
3986 fenc = buf->b_p_fenc;
3989 * Check if the file needs to be converted.
3991 converted = need_conversion(fenc);
3994 * Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done. Or
3995 * Latin1 to Unicode conversion. This is handled in buf_write_bytes().
3996 * Prepare the flags for it and allocate bw_conv_buf when needed.
3998 if (converted && (enc_utf8 || STRCMP(p_enc, "latin1") == 0))
4000 wb_flags = get_fio_flags(fenc);
4001 if (wb_flags & (FIO_UCS2 | FIO_UCS4 | FIO_UTF16 | FIO_UTF8))
4003 /* Need to allocate a buffer to translate into. */
4004 if (wb_flags & (FIO_UCS2 | FIO_UTF16 | FIO_UTF8))
4005 write_info.bw_conv_buflen = bufsize * 2;
4006 else /* FIO_UCS4 */
4007 write_info.bw_conv_buflen = bufsize * 4;
4008 write_info.bw_conv_buf
4009 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
4010 if (write_info.bw_conv_buf == NULL)
4011 end = 0;
4015 # ifdef WIN3264
4016 if (converted && wb_flags == 0 && (wb_flags = get_win_fio_flags(fenc)) != 0)
4018 /* Convert UTF-8 -> UCS-2 and UCS-2 -> DBCS. Worst-case * 4: */
4019 write_info.bw_conv_buflen = bufsize * 4;
4020 write_info.bw_conv_buf
4021 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
4022 if (write_info.bw_conv_buf == NULL)
4023 end = 0;
4025 # endif
4027 # ifdef MACOS_X
4028 if (converted && wb_flags == 0 && (wb_flags = get_mac_fio_flags(fenc)) != 0)
4030 write_info.bw_conv_buflen = bufsize * 3;
4031 write_info.bw_conv_buf
4032 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
4033 if (write_info.bw_conv_buf == NULL)
4034 end = 0;
4036 # endif
4038 # if defined(FEAT_EVAL) || defined(USE_ICONV)
4039 if (converted && wb_flags == 0)
4041 # ifdef USE_ICONV
4043 * Use iconv() conversion when conversion is needed and it's not done
4044 * internally.
4046 write_info.bw_iconv_fd = (iconv_t)my_iconv_open(fenc,
4047 enc_utf8 ? (char_u *)"utf-8" : p_enc);
4048 if (write_info.bw_iconv_fd != (iconv_t)-1)
4050 /* We're going to use iconv(), allocate a buffer to convert in. */
4051 write_info.bw_conv_buflen = bufsize * ICONV_MULT;
4052 write_info.bw_conv_buf
4053 = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
4054 if (write_info.bw_conv_buf == NULL)
4055 end = 0;
4056 write_info.bw_first = TRUE;
4058 # ifdef FEAT_EVAL
4059 else
4060 # endif
4061 # endif
4063 # ifdef FEAT_EVAL
4065 * When the file needs to be converted with 'charconvert' after
4066 * writing, write to a temp file instead and let the conversion
4067 * overwrite the original file.
4069 if (*p_ccv != NUL)
4071 wfname = vim_tempname('w');
4072 if (wfname == NULL) /* Can't write without a tempfile! */
4074 errmsg = (char_u *)_("E214: Can't find temp file for writing");
4075 goto restore_backup;
4078 # endif
4080 # endif
4081 if (converted && wb_flags == 0
4082 # ifdef USE_ICONV
4083 && write_info.bw_iconv_fd == (iconv_t)-1
4084 # endif
4085 # ifdef FEAT_EVAL
4086 && wfname == fname
4087 # endif
4090 if (!forceit)
4092 errmsg = (char_u *)_("E213: Cannot convert (add ! to write without conversion)");
4093 goto restore_backup;
4095 notconverted = TRUE;
4097 #endif
4100 * Open the file "wfname" for writing.
4101 * We may try to open the file twice: If we can't write to the
4102 * file and forceit is TRUE we delete the existing file and try to create
4103 * a new one. If this still fails we may have lost the original file!
4104 * (this may happen when the user reached his quotum for number of files).
4105 * Appending will fail if the file does not exist and forceit is FALSE.
4107 while ((fd = mch_open((char *)wfname, O_WRONLY | O_EXTRA | (append
4108 ? (forceit ? (O_APPEND | O_CREAT) : O_APPEND)
4109 : (O_CREAT | O_TRUNC))
4110 , perm < 0 ? 0666 : (perm & 0777))) < 0)
4113 * A forced write will try to create a new file if the old one is
4114 * still readonly. This may also happen when the directory is
4115 * read-only. In that case the mch_remove() will fail.
4117 if (errmsg == NULL)
4119 #ifdef UNIX
4120 struct stat st;
4122 /* Don't delete the file when it's a hard or symbolic link. */
4123 if ((!newfile && st_old.st_nlink > 1)
4124 || (mch_lstat((char *)fname, &st) == 0
4125 && (st.st_dev != st_old.st_dev
4126 || st.st_ino != st_old.st_ino)))
4127 errmsg = (char_u *)_("E166: Can't open linked file for writing");
4128 else
4129 #endif
4131 errmsg = (char_u *)_("E212: Can't open file for writing");
4132 if (forceit && vim_strchr(p_cpo, CPO_FWRITE) == NULL
4133 && perm >= 0)
4135 #ifdef UNIX
4136 /* we write to the file, thus it should be marked
4137 writable after all */
4138 if (!(perm & 0200))
4139 made_writable = TRUE;
4140 perm |= 0200;
4141 if (st_old.st_uid != getuid() || st_old.st_gid != getgid())
4142 perm &= 0777;
4143 #endif
4144 if (!append) /* don't remove when appending */
4145 mch_remove(wfname);
4146 continue;
4151 restore_backup:
4153 struct stat st;
4156 * If we failed to open the file, we don't need a backup. Throw it
4157 * away. If we moved or removed the original file try to put the
4158 * backup in its place.
4160 if (backup != NULL && wfname == fname)
4162 if (backup_copy)
4165 * There is a small chance that we removed the original,
4166 * try to move the copy in its place.
4167 * This may not work if the vim_rename() fails.
4168 * In that case we leave the copy around.
4170 /* If file does not exist, put the copy in its place */
4171 if (mch_stat((char *)fname, &st) < 0)
4172 vim_rename(backup, fname);
4173 /* if original file does exist throw away the copy */
4174 if (mch_stat((char *)fname, &st) >= 0)
4175 mch_remove(backup);
4177 else
4179 /* try to put the original file back */
4180 vim_rename(backup, fname);
4184 /* if original file no longer exists give an extra warning */
4185 if (!newfile && mch_stat((char *)fname, &st) < 0)
4186 end = 0;
4189 #ifdef FEAT_MBYTE
4190 if (wfname != fname)
4191 vim_free(wfname);
4192 #endif
4193 goto fail;
4195 errmsg = NULL;
4197 #if defined(MACOS_CLASSIC) || defined(WIN3264)
4198 /* TODO: Is it need for MACOS_X? (Dany) */
4200 * On macintosh copy the original files attributes (i.e. the backup)
4201 * This is done in order to preserve the resource fork and the
4202 * Finder attribute (label, comments, custom icons, file creator)
4204 if (backup != NULL && overwriting && !append)
4206 if (backup_copy)
4207 (void)mch_copy_file_attribute(wfname, backup);
4208 else
4209 (void)mch_copy_file_attribute(backup, wfname);
4212 if (!overwriting && !append)
4214 if (buf->b_ffname != NULL)
4215 (void)mch_copy_file_attribute(buf->b_ffname, wfname);
4216 /* Should copy resource fork */
4218 #endif
4220 write_info.bw_fd = fd;
4222 #ifdef FEAT_CRYPT
4223 if (*buf->b_p_key && !filtering)
4225 crypt_init_keys(buf->b_p_key);
4226 /* Write magic number, so that Vim knows that this file is encrypted
4227 * when reading it again. This also undergoes utf-8 to ucs-2/4
4228 * conversion when needed. */
4229 write_info.bw_buf = (char_u *)CRYPT_MAGIC;
4230 write_info.bw_len = CRYPT_MAGIC_LEN;
4231 write_info.bw_flags = FIO_NOCONVERT;
4232 if (buf_write_bytes(&write_info) == FAIL)
4233 end = 0;
4234 wb_flags |= FIO_ENCRYPTED;
4236 #endif
4238 write_info.bw_buf = buffer;
4239 nchars = 0;
4241 /* use "++bin", "++nobin" or 'binary' */
4242 if (eap != NULL && eap->force_bin != 0)
4243 write_bin = (eap->force_bin == FORCE_BIN);
4244 else
4245 write_bin = buf->b_p_bin;
4247 #ifdef FEAT_MBYTE
4249 * The BOM is written just after the encryption magic number.
4250 * Skip it when appending and the file already existed, the BOM only makes
4251 * sense at the start of the file.
4253 if (buf->b_p_bomb && !write_bin && (!append || perm < 0))
4255 write_info.bw_len = make_bom(buffer, fenc);
4256 if (write_info.bw_len > 0)
4258 /* don't convert, do encryption */
4259 write_info.bw_flags = FIO_NOCONVERT | wb_flags;
4260 if (buf_write_bytes(&write_info) == FAIL)
4261 end = 0;
4262 else
4263 nchars += write_info.bw_len;
4266 write_info.bw_start_lnum = start;
4267 #endif
4269 write_info.bw_len = bufsize;
4270 #ifdef HAS_BW_FLAGS
4271 write_info.bw_flags = wb_flags;
4272 #endif
4273 fileformat = get_fileformat_force(buf, eap);
4274 s = buffer;
4275 len = 0;
4276 for (lnum = start; lnum <= end; ++lnum)
4279 * The next while loop is done once for each character written.
4280 * Keep it fast!
4282 ptr = ml_get_buf(buf, lnum, FALSE) - 1;
4283 while ((c = *++ptr) != NUL)
4285 if (c == NL)
4286 *s = NUL; /* replace newlines with NULs */
4287 else if (c == CAR && fileformat == EOL_MAC)
4288 *s = NL; /* Mac: replace CRs with NLs */
4289 else
4290 *s = c;
4291 ++s;
4292 if (++len != bufsize)
4293 continue;
4294 if (buf_write_bytes(&write_info) == FAIL)
4296 end = 0; /* write error: break loop */
4297 break;
4299 nchars += bufsize;
4300 s = buffer;
4301 len = 0;
4302 #ifdef FEAT_MBYTE
4303 write_info.bw_start_lnum = lnum;
4304 #endif
4306 /* write failed or last line has no EOL: stop here */
4307 if (end == 0
4308 || (lnum == end
4309 && write_bin
4310 && (lnum == write_no_eol_lnum
4311 || (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol))))
4313 ++lnum; /* written the line, count it */
4314 no_eol = TRUE;
4315 break;
4317 if (fileformat == EOL_UNIX)
4318 *s++ = NL;
4319 else
4321 *s++ = CAR; /* EOL_MAC or EOL_DOS: write CR */
4322 if (fileformat == EOL_DOS) /* write CR-NL */
4324 if (++len == bufsize)
4326 if (buf_write_bytes(&write_info) == FAIL)
4328 end = 0; /* write error: break loop */
4329 break;
4331 nchars += bufsize;
4332 s = buffer;
4333 len = 0;
4335 *s++ = NL;
4338 if (++len == bufsize && end)
4340 if (buf_write_bytes(&write_info) == FAIL)
4342 end = 0; /* write error: break loop */
4343 break;
4345 nchars += bufsize;
4346 s = buffer;
4347 len = 0;
4349 ui_breakcheck();
4350 if (got_int)
4352 end = 0; /* Interrupted, break loop */
4353 break;
4356 #ifdef VMS
4358 * On VMS there is a problem: newlines get added when writing blocks
4359 * at a time. Fix it by writing a line at a time.
4360 * This is much slower!
4361 * Explanation: VAX/DECC RTL insists that records in some RMS
4362 * structures end with a newline (carriage return) character, and if
4363 * they don't it adds one.
4364 * With other RMS structures it works perfect without this fix.
4366 if (buf->b_fab_rfm == FAB$C_VFC
4367 || ((buf->b_fab_rat & (FAB$M_FTN | FAB$M_CR)) != 0))
4369 int b2write;
4371 buf->b_fab_mrs = (buf->b_fab_mrs == 0
4372 ? MIN(4096, bufsize)
4373 : MIN(buf->b_fab_mrs, bufsize));
4375 b2write = len;
4376 while (b2write > 0)
4378 write_info.bw_len = MIN(b2write, buf->b_fab_mrs);
4379 if (buf_write_bytes(&write_info) == FAIL)
4381 end = 0;
4382 break;
4384 b2write -= MIN(b2write, buf->b_fab_mrs);
4386 write_info.bw_len = bufsize;
4387 nchars += len;
4388 s = buffer;
4389 len = 0;
4391 #endif
4393 if (len > 0 && end > 0)
4395 write_info.bw_len = len;
4396 if (buf_write_bytes(&write_info) == FAIL)
4397 end = 0; /* write error */
4398 nchars += len;
4401 #if defined(UNIX) && defined(HAVE_FSYNC)
4402 /* On many journalling file systems there is a bug that causes both the
4403 * original and the backup file to be lost when halting the system right
4404 * after writing the file. That's because only the meta-data is
4405 * journalled. Syncing the file slows down the system, but assures it has
4406 * been written to disk and we don't lose it.
4407 * For a device do try the fsync() but don't complain if it does not work
4408 * (could be a pipe).
4409 * If the 'fsync' option is FALSE, don't fsync(). Useful for laptops. */
4410 if (p_fs && fsync(fd) != 0 && !device)
4412 errmsg = (char_u *)_("E667: Fsync failed");
4413 end = 0;
4415 #endif
4417 #ifdef HAVE_SELINUX
4418 /* Probably need to set the security context. */
4419 if (!backup_copy)
4420 mch_copy_sec(backup, wfname);
4421 #endif
4423 #ifdef UNIX
4424 /* When creating a new file, set its owner/group to that of the original
4425 * file. Get the new device and inode number. */
4426 if (backup != NULL && !backup_copy)
4428 # ifdef HAVE_FCHOWN
4429 struct stat st;
4431 /* don't change the owner when it's already OK, some systems remove
4432 * permission or ACL stuff */
4433 if (mch_stat((char *)wfname, &st) < 0
4434 || st.st_uid != st_old.st_uid
4435 || st.st_gid != st_old.st_gid)
4437 ignored = fchown(fd, st_old.st_uid, st_old.st_gid);
4438 if (perm >= 0) /* set permission again, may have changed */
4439 (void)mch_setperm(wfname, perm);
4441 # endif
4442 buf_setino(buf);
4444 else if (!buf->b_dev_valid)
4445 /* Set the inode when creating a new file. */
4446 buf_setino(buf);
4447 #endif
4449 if (close(fd) != 0)
4451 errmsg = (char_u *)_("E512: Close failed");
4452 end = 0;
4455 #ifdef UNIX
4456 if (made_writable)
4457 perm &= ~0200; /* reset 'w' bit for security reasons */
4458 #endif
4459 if (perm >= 0) /* set perm. of new file same as old file */
4460 (void)mch_setperm(wfname, perm);
4461 #ifdef RISCOS
4462 if (!append && !filtering)
4463 /* Set the filetype after writing the file. */
4464 mch_set_filetype(wfname, buf->b_p_oft);
4465 #endif
4466 #ifdef HAVE_ACL
4467 /* Probably need to set the ACL before changing the user (can't set the
4468 * ACL on a file the user doesn't own). */
4469 if (!backup_copy)
4470 mch_set_acl(wfname, acl);
4471 #endif
4474 #if defined(FEAT_MBYTE) && defined(FEAT_EVAL)
4475 if (wfname != fname)
4478 * The file was written to a temp file, now it needs to be converted
4479 * with 'charconvert' to (overwrite) the output file.
4481 if (end != 0)
4483 if (eval_charconvert(enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc,
4484 wfname, fname) == FAIL)
4486 write_info.bw_conv_error = TRUE;
4487 end = 0;
4490 mch_remove(wfname);
4491 vim_free(wfname);
4493 #endif
4495 if (end == 0)
4497 if (errmsg == NULL)
4499 #ifdef FEAT_MBYTE
4500 if (write_info.bw_conv_error)
4502 if (write_info.bw_conv_error_lnum == 0)
4503 errmsg = (char_u *)_("E513: write error, conversion failed (make 'fenc' empty to override)");
4504 else
4506 errmsg_allocated = TRUE;
4507 errmsg = alloc(300);
4508 vim_snprintf((char *)errmsg, 300, _("E513: write error, conversion failed in line %ld (make 'fenc' empty to override)"),
4509 (long)write_info.bw_conv_error_lnum);
4512 else
4513 #endif
4514 if (got_int)
4515 errmsg = (char_u *)_(e_interr);
4516 else
4517 errmsg = (char_u *)_("E514: write error (file system full?)");
4521 * If we have a backup file, try to put it in place of the new file,
4522 * because the new file is probably corrupt. This avoids losing the
4523 * original file when trying to make a backup when writing the file a
4524 * second time.
4525 * When "backup_copy" is set we need to copy the backup over the new
4526 * file. Otherwise rename the backup file.
4527 * If this is OK, don't give the extra warning message.
4529 if (backup != NULL)
4531 if (backup_copy)
4533 /* This may take a while, if we were interrupted let the user
4534 * know we got the message. */
4535 if (got_int)
4537 MSG(_(e_interr));
4538 out_flush();
4540 if ((fd = mch_open((char *)backup, O_RDONLY | O_EXTRA, 0)) >= 0)
4542 if ((write_info.bw_fd = mch_open((char *)fname,
4543 O_WRONLY | O_CREAT | O_TRUNC | O_EXTRA,
4544 perm & 0777)) >= 0)
4546 /* copy the file. */
4547 write_info.bw_buf = smallbuf;
4548 #ifdef HAS_BW_FLAGS
4549 write_info.bw_flags = FIO_NOCONVERT;
4550 #endif
4551 while ((write_info.bw_len = vim_read(fd, smallbuf,
4552 SMBUFSIZE)) > 0)
4553 if (buf_write_bytes(&write_info) == FAIL)
4554 break;
4556 if (close(write_info.bw_fd) >= 0
4557 && write_info.bw_len == 0)
4558 end = 1; /* success */
4560 close(fd); /* ignore errors for closing read file */
4563 else
4565 if (vim_rename(backup, fname) == 0)
4566 end = 1;
4569 goto fail;
4572 lnum -= start; /* compute number of written lines */
4573 --no_wait_return; /* may wait for return now */
4575 #if !(defined(UNIX) || defined(VMS))
4576 fname = sfname; /* use shortname now, for the messages */
4577 #endif
4578 if (!filtering)
4580 msg_add_fname(buf, fname); /* put fname in IObuff with quotes */
4581 c = FALSE;
4582 #ifdef FEAT_MBYTE
4583 if (write_info.bw_conv_error)
4585 STRCAT(IObuff, _(" CONVERSION ERROR"));
4586 c = TRUE;
4587 if (write_info.bw_conv_error_lnum != 0)
4589 size_t l = STRLEN(IObuff);
4590 vim_snprintf((char *)IObuff + l, IOSIZE - l, _(" in line %ld;"),
4591 (long)write_info.bw_conv_error_lnum);
4594 else if (notconverted)
4596 STRCAT(IObuff, _("[NOT converted]"));
4597 c = TRUE;
4599 else if (converted)
4601 STRCAT(IObuff, _("[converted]"));
4602 c = TRUE;
4604 #endif
4605 if (device)
4607 STRCAT(IObuff, _("[Device]"));
4608 c = TRUE;
4610 else if (newfile)
4612 STRCAT(IObuff, shortmess(SHM_NEW) ? _("[New]") : _("[New File]"));
4613 c = TRUE;
4615 if (no_eol)
4617 msg_add_eol();
4618 c = TRUE;
4620 /* may add [unix/dos/mac] */
4621 if (msg_add_fileformat(fileformat))
4622 c = TRUE;
4623 #ifdef FEAT_CRYPT
4624 if (wb_flags & FIO_ENCRYPTED)
4626 STRCAT(IObuff, _("[crypted]"));
4627 c = TRUE;
4629 #endif
4630 msg_add_lines(c, (long)lnum, nchars); /* add line/char count */
4631 if (!shortmess(SHM_WRITE))
4633 if (append)
4634 STRCAT(IObuff, shortmess(SHM_WRI) ? _(" [a]") : _(" appended"));
4635 else
4636 STRCAT(IObuff, shortmess(SHM_WRI) ? _(" [w]") : _(" written"));
4639 set_keep_msg(msg_trunc_attr(IObuff, FALSE, 0), 0);
4642 /* When written everything correctly: reset 'modified'. Unless not
4643 * writing to the original file and '+' is not in 'cpoptions'. */
4644 if (reset_changed && whole && !append
4645 #ifdef FEAT_MBYTE
4646 && !write_info.bw_conv_error
4647 #endif
4648 && (overwriting || vim_strchr(p_cpo, CPO_PLUS) != NULL)
4651 unchanged(buf, TRUE);
4652 u_unchanged(buf);
4656 * If written to the current file, update the timestamp of the swap file
4657 * and reset the BF_WRITE_MASK flags. Also sets buf->b_mtime.
4659 if (overwriting)
4661 ml_timestamp(buf);
4662 if (append)
4663 buf->b_flags &= ~BF_NEW;
4664 else
4665 buf->b_flags &= ~BF_WRITE_MASK;
4669 * If we kept a backup until now, and we are in patch mode, then we make
4670 * the backup file our 'original' file.
4672 if (*p_pm && dobackup)
4674 char *org = (char *)buf_modname(
4675 #ifdef SHORT_FNAME
4676 TRUE,
4677 #else
4678 (buf->b_p_sn || buf->b_shortname),
4679 #endif
4680 fname, p_pm, FALSE);
4682 if (backup != NULL)
4684 struct stat st;
4687 * If the original file does not exist yet
4688 * the current backup file becomes the original file
4690 if (org == NULL)
4691 EMSG(_("E205: Patchmode: can't save original file"));
4692 else if (mch_stat(org, &st) < 0)
4694 vim_rename(backup, (char_u *)org);
4695 vim_free(backup); /* don't delete the file */
4696 backup = NULL;
4697 #ifdef UNIX
4698 set_file_time((char_u *)org, st_old.st_atime, st_old.st_mtime);
4699 #endif
4703 * If there is no backup file, remember that a (new) file was
4704 * created.
4706 else
4708 int empty_fd;
4710 if (org == NULL
4711 || (empty_fd = mch_open(org,
4712 O_CREAT | O_EXTRA | O_EXCL | O_NOFOLLOW,
4713 perm < 0 ? 0666 : (perm & 0777))) < 0)
4714 EMSG(_("E206: patchmode: can't touch empty original file"));
4715 else
4716 close(empty_fd);
4718 if (org != NULL)
4720 mch_setperm((char_u *)org, mch_getperm(fname) & 0777);
4721 vim_free(org);
4726 * Remove the backup unless 'backup' option is set
4728 if (!p_bk && backup != NULL && mch_remove(backup) != 0)
4729 EMSG(_("E207: Can't delete backup file"));
4731 #ifdef FEAT_SUN_WORKSHOP
4732 if (usingSunWorkShop)
4733 workshop_file_saved((char *) ffname);
4734 #endif
4736 goto nofail;
4739 * Finish up. We get here either after failure or success.
4741 fail:
4742 --no_wait_return; /* may wait for return now */
4743 nofail:
4745 /* Done saving, we accept changed buffer warnings again */
4746 buf->b_saving = FALSE;
4748 vim_free(backup);
4749 if (buffer != smallbuf)
4750 vim_free(buffer);
4751 #ifdef FEAT_MBYTE
4752 vim_free(fenc_tofree);
4753 vim_free(write_info.bw_conv_buf);
4754 # ifdef USE_ICONV
4755 if (write_info.bw_iconv_fd != (iconv_t)-1)
4757 iconv_close(write_info.bw_iconv_fd);
4758 write_info.bw_iconv_fd = (iconv_t)-1;
4760 # endif
4761 #endif
4762 #ifdef HAVE_ACL
4763 mch_free_acl(acl);
4764 #endif
4766 if (errmsg != NULL)
4768 int numlen = errnum != NULL ? (int)STRLEN(errnum) : 0;
4770 attr = hl_attr(HLF_E); /* set highlight for error messages */
4771 msg_add_fname(buf,
4772 #ifndef UNIX
4773 sfname
4774 #else
4775 fname
4776 #endif
4777 ); /* put file name in IObuff with quotes */
4778 if (STRLEN(IObuff) + STRLEN(errmsg) + numlen >= IOSIZE)
4779 IObuff[IOSIZE - STRLEN(errmsg) - numlen - 1] = NUL;
4780 /* If the error message has the form "is ...", put the error number in
4781 * front of the file name. */
4782 if (errnum != NULL)
4784 STRMOVE(IObuff + numlen, IObuff);
4785 mch_memmove(IObuff, errnum, (size_t)numlen);
4787 STRCAT(IObuff, errmsg);
4788 emsg(IObuff);
4789 if (errmsg_allocated)
4790 vim_free(errmsg);
4792 retval = FAIL;
4793 if (end == 0)
4795 MSG_PUTS_ATTR(_("\nWARNING: Original file may be lost or damaged\n"),
4796 attr | MSG_HIST);
4797 MSG_PUTS_ATTR(_("don't quit the editor until the file is successfully written!"),
4798 attr | MSG_HIST);
4800 /* Update the timestamp to avoid an "overwrite changed file"
4801 * prompt when writing again. */
4802 if (mch_stat((char *)fname, &st_old) >= 0)
4804 buf_store_time(buf, &st_old, fname);
4805 buf->b_mtime_read = buf->b_mtime;
4809 msg_scroll = msg_save;
4811 #ifdef FEAT_AUTOCMD
4812 #ifdef FEAT_EVAL
4813 if (!should_abort(retval))
4814 #else
4815 if (!got_int)
4816 #endif
4818 aco_save_T aco;
4820 write_no_eol_lnum = 0; /* in case it was set by the previous read */
4823 * Apply POST autocommands.
4824 * Careful: The autocommands may call buf_write() recursively!
4826 aucmd_prepbuf(&aco, buf);
4828 if (append)
4829 apply_autocmds_exarg(EVENT_FILEAPPENDPOST, fname, fname,
4830 FALSE, curbuf, eap);
4831 else if (filtering)
4832 apply_autocmds_exarg(EVENT_FILTERWRITEPOST, NULL, fname,
4833 FALSE, curbuf, eap);
4834 else if (reset_changed && whole)
4835 apply_autocmds_exarg(EVENT_BUFWRITEPOST, fname, fname,
4836 FALSE, curbuf, eap);
4837 else
4838 apply_autocmds_exarg(EVENT_FILEWRITEPOST, fname, fname,
4839 FALSE, curbuf, eap);
4841 /* restore curwin/curbuf and a few other things */
4842 aucmd_restbuf(&aco);
4844 #ifdef FEAT_EVAL
4845 if (aborting()) /* autocmds may abort script processing */
4846 retval = FALSE;
4847 #endif
4849 #endif
4851 got_int |= prev_got_int;
4853 #ifdef MACOS_CLASSIC /* TODO: Is it need for MACOS_X? (Dany) */
4854 /* Update machine specific information. */
4855 mch_post_buffer_write(buf);
4856 #endif
4857 #ifdef FEAT_ODB_EDITOR
4858 odb_post_buffer_write(buf);
4859 #endif
4861 return retval;
4865 * Set the name of the current buffer. Use when the buffer doesn't have a
4866 * name and a ":r" or ":w" command with a file name is used.
4868 static int
4869 set_rw_fname(fname, sfname)
4870 char_u *fname;
4871 char_u *sfname;
4873 #ifdef FEAT_AUTOCMD
4874 buf_T *buf = curbuf;
4876 /* It's like the unnamed buffer is deleted.... */
4877 if (curbuf->b_p_bl)
4878 apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
4879 apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
4880 # ifdef FEAT_EVAL
4881 if (aborting()) /* autocmds may abort script processing */
4882 return FAIL;
4883 # endif
4884 if (curbuf != buf)
4886 /* We are in another buffer now, don't do the renaming. */
4887 EMSG(_(e_auchangedbuf));
4888 return FAIL;
4890 #endif
4892 if (setfname(curbuf, fname, sfname, FALSE) == OK)
4893 curbuf->b_flags |= BF_NOTEDITED;
4895 #ifdef FEAT_AUTOCMD
4896 /* ....and a new named one is created */
4897 apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, curbuf);
4898 if (curbuf->b_p_bl)
4899 apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, curbuf);
4900 # ifdef FEAT_EVAL
4901 if (aborting()) /* autocmds may abort script processing */
4902 return FAIL;
4903 # endif
4905 /* Do filetype detection now if 'filetype' is empty. */
4906 if (*curbuf->b_p_ft == NUL)
4908 if (au_has_group((char_u *)"filetypedetect"))
4909 (void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE);
4910 do_modelines(0);
4912 #endif
4914 return OK;
4918 * Put file name into IObuff with quotes.
4920 void
4921 msg_add_fname(buf, fname)
4922 buf_T *buf;
4923 char_u *fname;
4925 if (fname == NULL)
4926 fname = (char_u *)"-stdin-";
4927 home_replace(buf, fname, IObuff + 1, IOSIZE - 4, TRUE);
4928 IObuff[0] = '"';
4929 STRCAT(IObuff, "\" ");
4933 * Append message for text mode to IObuff.
4934 * Return TRUE if something appended.
4936 static int
4937 msg_add_fileformat(eol_type)
4938 int eol_type;
4940 #ifndef USE_CRNL
4941 if (eol_type == EOL_DOS)
4943 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[dos]") : _("[dos format]"));
4944 return TRUE;
4946 #endif
4947 #ifndef USE_CR
4948 if (eol_type == EOL_MAC)
4950 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[mac]") : _("[mac format]"));
4951 return TRUE;
4953 #endif
4954 #if defined(USE_CRNL) || defined(USE_CR)
4955 if (eol_type == EOL_UNIX)
4957 STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[unix]") : _("[unix format]"));
4958 return TRUE;
4960 #endif
4961 return FALSE;
4965 * Append line and character count to IObuff.
4967 void
4968 msg_add_lines(insert_space, lnum, nchars)
4969 int insert_space;
4970 long lnum;
4971 long nchars;
4973 char_u *p;
4975 p = IObuff + STRLEN(IObuff);
4977 if (insert_space)
4978 *p++ = ' ';
4979 if (shortmess(SHM_LINES))
4980 sprintf((char *)p, "%ldL, %ldC", lnum, nchars);
4981 else
4983 if (lnum == 1)
4984 STRCPY(p, _("1 line, "));
4985 else
4986 sprintf((char *)p, _("%ld lines, "), lnum);
4987 p += STRLEN(p);
4988 if (nchars == 1)
4989 STRCPY(p, _("1 character"));
4990 else
4991 sprintf((char *)p, _("%ld characters"), nchars);
4996 * Append message for missing line separator to IObuff.
4998 static void
4999 msg_add_eol()
5001 STRCAT(IObuff, shortmess(SHM_LAST) ? _("[noeol]") : _("[Incomplete last line]"));
5005 * Check modification time of file, before writing to it.
5006 * The size isn't checked, because using a tool like "gzip" takes care of
5007 * using the same timestamp but can't set the size.
5009 static int
5010 check_mtime(buf, st)
5011 buf_T *buf;
5012 struct stat *st;
5014 if (buf->b_mtime_read != 0
5015 && time_differs((long)st->st_mtime, buf->b_mtime_read))
5017 msg_scroll = TRUE; /* don't overwrite messages here */
5018 msg_silent = 0; /* must give this prompt */
5019 /* don't use emsg() here, don't want to flush the buffers */
5020 MSG_ATTR(_("WARNING: The file has been changed since reading it!!!"),
5021 hl_attr(HLF_E));
5022 if (ask_yesno((char_u *)_("Do you really want to write to it"),
5023 TRUE) == 'n')
5024 return FAIL;
5025 msg_scroll = FALSE; /* always overwrite the file message now */
5027 return OK;
5030 static int
5031 time_differs(t1, t2)
5032 long t1, t2;
5034 #if defined(__linux__) || defined(MSDOS) || defined(MSWIN)
5035 /* On a FAT filesystem, esp. under Linux, there are only 5 bits to store
5036 * the seconds. Since the roundoff is done when flushing the inode, the
5037 * time may change unexpectedly by one second!!! */
5038 return (t1 - t2 > 1 || t2 - t1 > 1);
5039 #else
5040 return (t1 != t2);
5041 #endif
5045 * Call write() to write a number of bytes to the file.
5046 * Also handles encryption and 'encoding' conversion.
5048 * Return FAIL for failure, OK otherwise.
5050 static int
5051 buf_write_bytes(ip)
5052 struct bw_info *ip;
5054 int wlen;
5055 char_u *buf = ip->bw_buf; /* data to write */
5056 int len = ip->bw_len; /* length of data */
5057 #ifdef HAS_BW_FLAGS
5058 int flags = ip->bw_flags; /* extra flags */
5059 #endif
5061 #ifdef FEAT_MBYTE
5063 * Skip conversion when writing the crypt magic number or the BOM.
5065 if (!(flags & FIO_NOCONVERT))
5067 char_u *p;
5068 unsigned c;
5069 int n;
5071 if (flags & FIO_UTF8)
5074 * Convert latin1 in the buffer to UTF-8 in the file.
5076 p = ip->bw_conv_buf; /* translate to buffer */
5077 for (wlen = 0; wlen < len; ++wlen)
5078 p += utf_char2bytes(buf[wlen], p);
5079 buf = ip->bw_conv_buf;
5080 len = (int)(p - ip->bw_conv_buf);
5082 else if (flags & (FIO_UCS4 | FIO_UTF16 | FIO_UCS2 | FIO_LATIN1))
5085 * Convert UTF-8 bytes in the buffer to UCS-2, UCS-4, UTF-16 or
5086 * Latin1 chars in the file.
5088 if (flags & FIO_LATIN1)
5089 p = buf; /* translate in-place (can only get shorter) */
5090 else
5091 p = ip->bw_conv_buf; /* translate to buffer */
5092 for (wlen = 0; wlen < len; wlen += n)
5094 if (wlen == 0 && ip->bw_restlen != 0)
5096 int l;
5098 /* Use remainder of previous call. Append the start of
5099 * buf[] to get a full sequence. Might still be too
5100 * short! */
5101 l = CONV_RESTLEN - ip->bw_restlen;
5102 if (l > len)
5103 l = len;
5104 mch_memmove(ip->bw_rest + ip->bw_restlen, buf, (size_t)l);
5105 n = utf_ptr2len_len(ip->bw_rest, ip->bw_restlen + l);
5106 if (n > ip->bw_restlen + len)
5108 /* We have an incomplete byte sequence at the end to
5109 * be written. We can't convert it without the
5110 * remaining bytes. Keep them for the next call. */
5111 if (ip->bw_restlen + len > CONV_RESTLEN)
5112 return FAIL;
5113 ip->bw_restlen += len;
5114 break;
5116 if (n > 1)
5117 c = utf_ptr2char(ip->bw_rest);
5118 else
5119 c = ip->bw_rest[0];
5120 if (n >= ip->bw_restlen)
5122 n -= ip->bw_restlen;
5123 ip->bw_restlen = 0;
5125 else
5127 ip->bw_restlen -= n;
5128 mch_memmove(ip->bw_rest, ip->bw_rest + n,
5129 (size_t)ip->bw_restlen);
5130 n = 0;
5133 else
5135 n = utf_ptr2len_len(buf + wlen, len - wlen);
5136 if (n > len - wlen)
5138 /* We have an incomplete byte sequence at the end to
5139 * be written. We can't convert it without the
5140 * remaining bytes. Keep them for the next call. */
5141 if (len - wlen > CONV_RESTLEN)
5142 return FAIL;
5143 ip->bw_restlen = len - wlen;
5144 mch_memmove(ip->bw_rest, buf + wlen,
5145 (size_t)ip->bw_restlen);
5146 break;
5148 if (n > 1)
5149 c = utf_ptr2char(buf + wlen);
5150 else
5151 c = buf[wlen];
5154 if (ucs2bytes(c, &p, flags) && !ip->bw_conv_error)
5156 ip->bw_conv_error = TRUE;
5157 ip->bw_conv_error_lnum = ip->bw_start_lnum;
5159 if (c == NL)
5160 ++ip->bw_start_lnum;
5162 if (flags & FIO_LATIN1)
5163 len = (int)(p - buf);
5164 else
5166 buf = ip->bw_conv_buf;
5167 len = (int)(p - ip->bw_conv_buf);
5171 # ifdef WIN3264
5172 else if (flags & FIO_CODEPAGE)
5175 * Convert UTF-8 or codepage to UCS-2 and then to MS-Windows
5176 * codepage.
5178 char_u *from;
5179 size_t fromlen;
5180 char_u *to;
5181 int u8c;
5182 BOOL bad = FALSE;
5183 int needed;
5185 if (ip->bw_restlen > 0)
5187 /* Need to concatenate the remainder of the previous call and
5188 * the bytes of the current call. Use the end of the
5189 * conversion buffer for this. */
5190 fromlen = len + ip->bw_restlen;
5191 from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
5192 mch_memmove(from, ip->bw_rest, (size_t)ip->bw_restlen);
5193 mch_memmove(from + ip->bw_restlen, buf, (size_t)len);
5195 else
5197 from = buf;
5198 fromlen = len;
5201 to = ip->bw_conv_buf;
5202 if (enc_utf8)
5204 /* Convert from UTF-8 to UCS-2, to the start of the buffer.
5205 * The buffer has been allocated to be big enough. */
5206 while (fromlen > 0)
5208 n = (int)utf_ptr2len_len(from, (int)fromlen);
5209 if (n > (int)fromlen) /* incomplete byte sequence */
5210 break;
5211 u8c = utf_ptr2char(from);
5212 *to++ = (u8c & 0xff);
5213 *to++ = (u8c >> 8);
5214 fromlen -= n;
5215 from += n;
5218 /* Copy remainder to ip->bw_rest[] to be used for the next
5219 * call. */
5220 if (fromlen > CONV_RESTLEN)
5222 /* weird overlong sequence */
5223 ip->bw_conv_error = TRUE;
5224 return FAIL;
5226 mch_memmove(ip->bw_rest, from, fromlen);
5227 ip->bw_restlen = (int)fromlen;
5229 else
5231 /* Convert from enc_codepage to UCS-2, to the start of the
5232 * buffer. The buffer has been allocated to be big enough. */
5233 ip->bw_restlen = 0;
5234 needed = MultiByteToWideChar(enc_codepage,
5235 MB_ERR_INVALID_CHARS, (LPCSTR)from, (int)fromlen,
5236 NULL, 0);
5237 if (needed == 0)
5239 /* When conversion fails there may be a trailing byte. */
5240 needed = MultiByteToWideChar(enc_codepage,
5241 MB_ERR_INVALID_CHARS, (LPCSTR)from, (int)fromlen - 1,
5242 NULL, 0);
5243 if (needed == 0)
5245 /* Conversion doesn't work. */
5246 ip->bw_conv_error = TRUE;
5247 return FAIL;
5249 /* Save the trailing byte for the next call. */
5250 ip->bw_rest[0] = from[fromlen - 1];
5251 ip->bw_restlen = 1;
5253 needed = MultiByteToWideChar(enc_codepage, MB_ERR_INVALID_CHARS,
5254 (LPCSTR)from, (int)(fromlen - ip->bw_restlen),
5255 (LPWSTR)to, needed);
5256 if (needed == 0)
5258 /* Safety check: Conversion doesn't work. */
5259 ip->bw_conv_error = TRUE;
5260 return FAIL;
5262 to += needed * 2;
5265 fromlen = to - ip->bw_conv_buf;
5266 buf = to;
5267 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
5268 if (FIO_GET_CP(flags) == CP_UTF8)
5270 /* Convert from UCS-2 to UTF-8, using the remainder of the
5271 * conversion buffer. Fails when out of space. */
5272 for (from = ip->bw_conv_buf; fromlen > 1; fromlen -= 2)
5274 u8c = *from++;
5275 u8c += (*from++ << 8);
5276 to += utf_char2bytes(u8c, to);
5277 if (to + 6 >= ip->bw_conv_buf + ip->bw_conv_buflen)
5279 ip->bw_conv_error = TRUE;
5280 return FAIL;
5283 len = (int)(to - buf);
5285 else
5286 #endif
5288 /* Convert from UCS-2 to the codepage, using the remainder of
5289 * the conversion buffer. If the conversion uses the default
5290 * character "0", the data doesn't fit in this encoding, so
5291 * fail. */
5292 len = WideCharToMultiByte(FIO_GET_CP(flags), 0,
5293 (LPCWSTR)ip->bw_conv_buf, (int)fromlen / sizeof(WCHAR),
5294 (LPSTR)to, (int)(ip->bw_conv_buflen - fromlen), 0,
5295 &bad);
5296 if (bad)
5298 ip->bw_conv_error = TRUE;
5299 return FAIL;
5303 # endif
5305 # ifdef MACOS_CONVERT
5306 else if (flags & FIO_MACROMAN)
5309 * Convert UTF-8 or latin1 to Apple MacRoman.
5311 char_u *from;
5312 size_t fromlen;
5314 if (ip->bw_restlen > 0)
5316 /* Need to concatenate the remainder of the previous call and
5317 * the bytes of the current call. Use the end of the
5318 * conversion buffer for this. */
5319 fromlen = len + ip->bw_restlen;
5320 from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
5321 mch_memmove(from, ip->bw_rest, (size_t)ip->bw_restlen);
5322 mch_memmove(from + ip->bw_restlen, buf, (size_t)len);
5324 else
5326 from = buf;
5327 fromlen = len;
5330 if (enc2macroman(from, fromlen,
5331 ip->bw_conv_buf, &len, ip->bw_conv_buflen,
5332 ip->bw_rest, &ip->bw_restlen) == FAIL)
5334 ip->bw_conv_error = TRUE;
5335 return FAIL;
5337 buf = ip->bw_conv_buf;
5339 # endif
5341 # ifdef USE_ICONV
5342 if (ip->bw_iconv_fd != (iconv_t)-1)
5344 const char *from;
5345 size_t fromlen;
5346 char *to;
5347 size_t tolen;
5349 /* Convert with iconv(). */
5350 if (ip->bw_restlen > 0)
5352 char *fp;
5354 /* Need to concatenate the remainder of the previous call and
5355 * the bytes of the current call. Use the end of the
5356 * conversion buffer for this. */
5357 fromlen = len + ip->bw_restlen;
5358 fp = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
5359 mch_memmove(fp, ip->bw_rest, (size_t)ip->bw_restlen);
5360 mch_memmove(fp + ip->bw_restlen, buf, (size_t)len);
5361 from = fp;
5362 tolen = ip->bw_conv_buflen - fromlen;
5364 else
5366 from = (const char *)buf;
5367 fromlen = len;
5368 tolen = ip->bw_conv_buflen;
5370 to = (char *)ip->bw_conv_buf;
5372 if (ip->bw_first)
5374 size_t save_len = tolen;
5376 /* output the initial shift state sequence */
5377 (void)iconv(ip->bw_iconv_fd, NULL, NULL, &to, &tolen);
5379 /* There is a bug in iconv() on Linux (which appears to be
5380 * wide-spread) which sets "to" to NULL and messes up "tolen".
5382 if (to == NULL)
5384 to = (char *)ip->bw_conv_buf;
5385 tolen = save_len;
5387 ip->bw_first = FALSE;
5391 * If iconv() has an error or there is not enough room, fail.
5393 if ((iconv(ip->bw_iconv_fd, (void *)&from, &fromlen, &to, &tolen)
5394 == (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
5395 || fromlen > CONV_RESTLEN)
5397 ip->bw_conv_error = TRUE;
5398 return FAIL;
5401 /* copy remainder to ip->bw_rest[] to be used for the next call. */
5402 if (fromlen > 0)
5403 mch_memmove(ip->bw_rest, (void *)from, fromlen);
5404 ip->bw_restlen = (int)fromlen;
5406 buf = ip->bw_conv_buf;
5407 len = (int)((char_u *)to - ip->bw_conv_buf);
5409 # endif
5411 #endif /* FEAT_MBYTE */
5413 #ifdef FEAT_CRYPT
5414 if (flags & FIO_ENCRYPTED) /* encrypt the data */
5416 int ztemp, t, i;
5418 for (i = 0; i < len; i++)
5420 ztemp = buf[i];
5421 buf[i] = ZENCODE(ztemp, t);
5424 #endif
5426 /* Repeat the write(), it may be interrupted by a signal. */
5427 while (len > 0)
5429 wlen = vim_write(ip->bw_fd, buf, len);
5430 if (wlen <= 0) /* error! */
5431 return FAIL;
5432 len -= wlen;
5433 buf += wlen;
5435 return OK;
5438 #ifdef FEAT_MBYTE
5440 * Convert a Unicode character to bytes.
5441 * Return TRUE for an error, FALSE when it's OK.
5443 static int
5444 ucs2bytes(c, pp, flags)
5445 unsigned c; /* in: character */
5446 char_u **pp; /* in/out: pointer to result */
5447 int flags; /* FIO_ flags */
5449 char_u *p = *pp;
5450 int error = FALSE;
5451 int cc;
5454 if (flags & FIO_UCS4)
5456 if (flags & FIO_ENDIAN_L)
5458 *p++ = c;
5459 *p++ = (c >> 8);
5460 *p++ = (c >> 16);
5461 *p++ = (c >> 24);
5463 else
5465 *p++ = (c >> 24);
5466 *p++ = (c >> 16);
5467 *p++ = (c >> 8);
5468 *p++ = c;
5471 else if (flags & (FIO_UCS2 | FIO_UTF16))
5473 if (c >= 0x10000)
5475 if (flags & FIO_UTF16)
5477 /* Make two words, ten bits of the character in each. First
5478 * word is 0xd800 - 0xdbff, second one 0xdc00 - 0xdfff */
5479 c -= 0x10000;
5480 if (c >= 0x100000)
5481 error = TRUE;
5482 cc = ((c >> 10) & 0x3ff) + 0xd800;
5483 if (flags & FIO_ENDIAN_L)
5485 *p++ = cc;
5486 *p++ = ((unsigned)cc >> 8);
5488 else
5490 *p++ = ((unsigned)cc >> 8);
5491 *p++ = cc;
5493 c = (c & 0x3ff) + 0xdc00;
5495 else
5496 error = TRUE;
5498 if (flags & FIO_ENDIAN_L)
5500 *p++ = c;
5501 *p++ = (c >> 8);
5503 else
5505 *p++ = (c >> 8);
5506 *p++ = c;
5509 else /* Latin1 */
5511 if (c >= 0x100)
5513 error = TRUE;
5514 *p++ = 0xBF;
5516 else
5517 *p++ = c;
5520 *pp = p;
5521 return error;
5525 * Return TRUE if file encoding "fenc" requires conversion from or to
5526 * 'encoding'.
5528 static int
5529 need_conversion(fenc)
5530 char_u *fenc;
5532 int same_encoding;
5533 int enc_flags;
5534 int fenc_flags;
5536 if (*fenc == NUL || STRCMP(p_enc, fenc) == 0)
5537 same_encoding = TRUE;
5538 else
5540 /* Ignore difference between "ansi" and "latin1", "ucs-4" and
5541 * "ucs-4be", etc. */
5542 enc_flags = get_fio_flags(p_enc);
5543 fenc_flags = get_fio_flags(fenc);
5544 same_encoding = (enc_flags != 0 && fenc_flags == enc_flags);
5546 if (same_encoding)
5548 /* Specified encoding matches with 'encoding'. This requires
5549 * conversion when 'encoding' is Unicode but not UTF-8. */
5550 return enc_unicode != 0;
5553 /* Encodings differ. However, conversion is not needed when 'enc' is any
5554 * Unicode encoding and the file is UTF-8. */
5555 return !(enc_utf8 && fenc_flags == FIO_UTF8);
5559 * Check "ptr" for a unicode encoding and return the FIO_ flags needed for the
5560 * internal conversion.
5561 * if "ptr" is an empty string, use 'encoding'.
5563 static int
5564 get_fio_flags(ptr)
5565 char_u *ptr;
5567 int prop;
5569 if (*ptr == NUL)
5570 ptr = p_enc;
5572 prop = enc_canon_props(ptr);
5573 if (prop & ENC_UNICODE)
5575 if (prop & ENC_2BYTE)
5577 if (prop & ENC_ENDIAN_L)
5578 return FIO_UCS2 | FIO_ENDIAN_L;
5579 return FIO_UCS2;
5581 if (prop & ENC_4BYTE)
5583 if (prop & ENC_ENDIAN_L)
5584 return FIO_UCS4 | FIO_ENDIAN_L;
5585 return FIO_UCS4;
5587 if (prop & ENC_2WORD)
5589 if (prop & ENC_ENDIAN_L)
5590 return FIO_UTF16 | FIO_ENDIAN_L;
5591 return FIO_UTF16;
5593 return FIO_UTF8;
5595 if (prop & ENC_LATIN1)
5596 return FIO_LATIN1;
5597 /* must be ENC_DBCS, requires iconv() */
5598 return 0;
5601 #ifdef WIN3264
5603 * Check "ptr" for a MS-Windows codepage name and return the FIO_ flags needed
5604 * for the conversion MS-Windows can do for us. Also accept "utf-8".
5605 * Used for conversion between 'encoding' and 'fileencoding'.
5607 static int
5608 get_win_fio_flags(ptr)
5609 char_u *ptr;
5611 int cp;
5613 /* Cannot do this when 'encoding' is not utf-8 and not a codepage. */
5614 if (!enc_utf8 && enc_codepage <= 0)
5615 return 0;
5617 cp = encname2codepage(ptr);
5618 if (cp == 0)
5620 # ifdef CP_UTF8 /* VC 4.1 doesn't define CP_UTF8 */
5621 if (STRCMP(ptr, "utf-8") == 0)
5622 cp = CP_UTF8;
5623 else
5624 # endif
5625 return 0;
5627 return FIO_PUT_CP(cp) | FIO_CODEPAGE;
5629 #endif
5631 #ifdef MACOS_X
5633 * Check "ptr" for a Carbon supported encoding and return the FIO_ flags
5634 * needed for the internal conversion to/from utf-8 or latin1.
5636 static int
5637 get_mac_fio_flags(ptr)
5638 char_u *ptr;
5640 if ((enc_utf8 || STRCMP(p_enc, "latin1") == 0)
5641 && (enc_canon_props(ptr) & ENC_MACROMAN))
5642 return FIO_MACROMAN;
5643 return 0;
5645 #endif
5648 * Check for a Unicode BOM (Byte Order Mark) at the start of p[size].
5649 * "size" must be at least 2.
5650 * Return the name of the encoding and set "*lenp" to the length.
5651 * Returns NULL when no BOM found.
5653 static char_u *
5654 check_for_bom(p, size, lenp, flags)
5655 char_u *p;
5656 long size;
5657 int *lenp;
5658 int flags;
5660 char *name = NULL;
5661 int len = 2;
5663 if (p[0] == 0xef && p[1] == 0xbb && size >= 3 && p[2] == 0xbf
5664 && (flags == FIO_ALL || flags == FIO_UTF8 || flags == 0))
5666 name = "utf-8"; /* EF BB BF */
5667 len = 3;
5669 else if (p[0] == 0xff && p[1] == 0xfe)
5671 if (size >= 4 && p[2] == 0 && p[3] == 0
5672 && (flags == FIO_ALL || flags == (FIO_UCS4 | FIO_ENDIAN_L)))
5674 name = "ucs-4le"; /* FF FE 00 00 */
5675 len = 4;
5677 else if (flags == (FIO_UCS2 | FIO_ENDIAN_L))
5678 name = "ucs-2le"; /* FF FE */
5679 else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L))
5680 /* utf-16le is preferred, it also works for ucs-2le text */
5681 name = "utf-16le"; /* FF FE */
5683 else if (p[0] == 0xfe && p[1] == 0xff
5684 && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16))
5686 /* Default to utf-16, it works also for ucs-2 text. */
5687 if (flags == FIO_UCS2)
5688 name = "ucs-2"; /* FE FF */
5689 else
5690 name = "utf-16"; /* FE FF */
5692 else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe
5693 && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4))
5695 name = "ucs-4"; /* 00 00 FE FF */
5696 len = 4;
5699 *lenp = len;
5700 return (char_u *)name;
5704 * Generate a BOM in "buf[4]" for encoding "name".
5705 * Return the length of the BOM (zero when no BOM).
5707 static int
5708 make_bom(buf, name)
5709 char_u *buf;
5710 char_u *name;
5712 int flags;
5713 char_u *p;
5715 flags = get_fio_flags(name);
5717 /* Can't put a BOM in a non-Unicode file. */
5718 if (flags == FIO_LATIN1 || flags == 0)
5719 return 0;
5721 if (flags == FIO_UTF8) /* UTF-8 */
5723 buf[0] = 0xef;
5724 buf[1] = 0xbb;
5725 buf[2] = 0xbf;
5726 return 3;
5728 p = buf;
5729 (void)ucs2bytes(0xfeff, &p, flags);
5730 return (int)(p - buf);
5732 #endif
5734 #if defined(FEAT_VIMINFO) || defined(FEAT_BROWSE) || \
5735 defined(FEAT_QUICKFIX) || defined(FEAT_AUTOCMD) || defined(PROTO)
5737 * Try to find a shortname by comparing the fullname with the current
5738 * directory.
5739 * Returns "full_path" or pointer into "full_path" if shortened.
5741 char_u *
5742 shorten_fname1(full_path)
5743 char_u *full_path;
5745 char_u dirname[MAXPATHL];
5746 char_u *p = full_path;
5748 if (mch_dirname(dirname, MAXPATHL) == OK)
5750 p = shorten_fname(full_path, dirname);
5751 if (p == NULL || *p == NUL)
5752 p = full_path;
5754 return p;
5756 #endif
5759 * Try to find a shortname by comparing the fullname with the current
5760 * directory.
5761 * Returns NULL if not shorter name possible, pointer into "full_path"
5762 * otherwise.
5764 char_u *
5765 shorten_fname(full_path, dir_name)
5766 char_u *full_path;
5767 char_u *dir_name;
5769 int len;
5770 char_u *p;
5772 if (full_path == NULL)
5773 return NULL;
5774 len = (int)STRLEN(dir_name);
5775 if (fnamencmp(dir_name, full_path, len) == 0)
5777 p = full_path + len;
5778 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
5780 * MSDOS: when a file is in the root directory, dir_name will end in a
5781 * slash, since C: by itself does not define a specific dir. In this
5782 * case p may already be correct. <negri>
5784 if (!((len > 2) && (*(p - 2) == ':')))
5785 #endif
5787 if (vim_ispathsep(*p))
5788 ++p;
5789 #ifndef VMS /* the path separator is always part of the path */
5790 else
5791 p = NULL;
5792 #endif
5795 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
5797 * When using a file in the current drive, remove the drive name:
5798 * "A:\dir\file" -> "\dir\file". This helps when moving a session file on
5799 * a floppy from "A:\dir" to "B:\dir".
5801 else if (len > 3
5802 && TOUPPER_LOC(full_path[0]) == TOUPPER_LOC(dir_name[0])
5803 && full_path[1] == ':'
5804 && vim_ispathsep(full_path[2]))
5805 p = full_path + 2;
5806 #endif
5807 else
5808 p = NULL;
5809 return p;
5813 * Shorten filenames for all buffers.
5814 * When "force" is TRUE: Use full path from now on for files currently being
5815 * edited, both for file name and swap file name. Try to shorten the file
5816 * names a bit, if safe to do so.
5817 * When "force" is FALSE: Only try to shorten absolute file names.
5818 * For buffers that have buftype "nofile" or "scratch": never change the file
5819 * name.
5821 void
5822 shorten_fnames(force)
5823 int force;
5825 char_u dirname[MAXPATHL];
5826 buf_T *buf;
5827 char_u *p;
5829 mch_dirname(dirname, MAXPATHL);
5830 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
5832 if (buf->b_fname != NULL
5833 #ifdef FEAT_QUICKFIX
5834 && !bt_nofile(buf)
5835 #endif
5836 && !path_with_url(buf->b_fname)
5837 && (force
5838 || buf->b_sfname == NULL
5839 || mch_isFullName(buf->b_sfname)))
5841 vim_free(buf->b_sfname);
5842 buf->b_sfname = NULL;
5843 p = shorten_fname(buf->b_ffname, dirname);
5844 if (p != NULL)
5846 buf->b_sfname = vim_strsave(p);
5847 buf->b_fname = buf->b_sfname;
5849 if (p == NULL || buf->b_fname == NULL)
5850 buf->b_fname = buf->b_ffname;
5853 /* Always make the swap file name a full path, a "nofile" buffer may
5854 * also have a swap file. */
5855 mf_fullname(buf->b_ml.ml_mfp);
5857 #ifdef FEAT_WINDOWS
5858 status_redraw_all();
5859 redraw_tabline = TRUE;
5860 #endif
5863 #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
5864 || defined(FEAT_GUI_MSWIN) \
5865 || defined(FEAT_GUI_MAC) \
5866 || defined(PROTO) \
5867 || defined(FEAT_GUI_MACVIM)
5869 * Shorten all filenames in "fnames[count]" by current directory.
5871 void
5872 shorten_filenames(fnames, count)
5873 char_u **fnames;
5874 int count;
5876 int i;
5877 char_u dirname[MAXPATHL];
5878 char_u *p;
5880 if (fnames == NULL || count < 1)
5881 return;
5882 mch_dirname(dirname, sizeof(dirname));
5883 for (i = 0; i < count; ++i)
5885 if ((p = shorten_fname(fnames[i], dirname)) != NULL)
5887 /* shorten_fname() returns pointer in given "fnames[i]". If free
5888 * "fnames[i]" first, "p" becomes invalid. So we need to copy
5889 * "p" first then free fnames[i]. */
5890 p = vim_strsave(p);
5891 vim_free(fnames[i]);
5892 fnames[i] = p;
5896 #endif
5899 * add extension to file name - change path/fo.o.h to path/fo.o.h.ext or
5900 * fo_o_h.ext for MSDOS or when shortname option set.
5902 * Assumed that fname is a valid name found in the filesystem we assure that
5903 * the return value is a different name and ends in 'ext'.
5904 * "ext" MUST be at most 4 characters long if it starts with a dot, 3
5905 * characters otherwise.
5906 * Space for the returned name is allocated, must be freed later.
5907 * Returns NULL when out of memory.
5909 char_u *
5910 modname(fname, ext, prepend_dot)
5911 char_u *fname, *ext;
5912 int prepend_dot; /* may prepend a '.' to file name */
5914 return buf_modname(
5915 #ifdef SHORT_FNAME
5916 TRUE,
5917 #else
5918 (curbuf->b_p_sn || curbuf->b_shortname),
5919 #endif
5920 fname, ext, prepend_dot);
5923 char_u *
5924 buf_modname(shortname, fname, ext, prepend_dot)
5925 int shortname; /* use 8.3 file name */
5926 char_u *fname, *ext;
5927 int prepend_dot; /* may prepend a '.' to file name */
5929 char_u *retval;
5930 char_u *s;
5931 char_u *e;
5932 char_u *ptr;
5933 int fnamelen, extlen;
5935 extlen = (int)STRLEN(ext);
5938 * If there is no file name we must get the name of the current directory
5939 * (we need the full path in case :cd is used).
5941 if (fname == NULL || *fname == NUL)
5943 retval = alloc((unsigned)(MAXPATHL + extlen + 3));
5944 if (retval == NULL)
5945 return NULL;
5946 if (mch_dirname(retval, MAXPATHL) == FAIL ||
5947 (fnamelen = (int)STRLEN(retval)) == 0)
5949 vim_free(retval);
5950 return NULL;
5952 if (!after_pathsep(retval, retval + fnamelen))
5954 retval[fnamelen++] = PATHSEP;
5955 retval[fnamelen] = NUL;
5957 #ifndef SHORT_FNAME
5958 prepend_dot = FALSE; /* nothing to prepend a dot to */
5959 #endif
5961 else
5963 fnamelen = (int)STRLEN(fname);
5964 retval = alloc((unsigned)(fnamelen + extlen + 3));
5965 if (retval == NULL)
5966 return NULL;
5967 STRCPY(retval, fname);
5968 #ifdef VMS
5969 vms_remove_version(retval); /* we do not need versions here */
5970 #endif
5974 * search backwards until we hit a '/', '\' or ':' replacing all '.'
5975 * by '_' for MSDOS or when shortname option set and ext starts with a dot.
5976 * Then truncate what is after the '/', '\' or ':' to 8 characters for
5977 * MSDOS and 26 characters for AMIGA, a lot more for UNIX.
5979 for (ptr = retval + fnamelen; ptr > retval; mb_ptr_back(retval, ptr))
5981 #ifndef RISCOS
5982 if (*ext == '.'
5983 # ifdef USE_LONG_FNAME
5984 && (!USE_LONG_FNAME || shortname)
5985 # else
5986 # ifndef SHORT_FNAME
5987 && shortname
5988 # endif
5989 # endif
5991 if (*ptr == '.') /* replace '.' by '_' */
5992 *ptr = '_';
5993 #endif
5994 if (vim_ispathsep(*ptr))
5996 ++ptr;
5997 break;
6001 /* the file name has at most BASENAMELEN characters. */
6002 #ifndef SHORT_FNAME
6003 if (STRLEN(ptr) > (unsigned)BASENAMELEN)
6004 ptr[BASENAMELEN] = '\0';
6005 #endif
6007 s = ptr + STRLEN(ptr);
6010 * For 8.3 file names we may have to reduce the length.
6012 #ifdef USE_LONG_FNAME
6013 if (!USE_LONG_FNAME || shortname)
6014 #else
6015 # ifndef SHORT_FNAME
6016 if (shortname)
6017 # endif
6018 #endif
6021 * If there is no file name, or the file name ends in '/', and the
6022 * extension starts with '.', put a '_' before the dot, because just
6023 * ".ext" is invalid.
6025 if (fname == NULL || *fname == NUL
6026 || vim_ispathsep(fname[STRLEN(fname) - 1]))
6028 #ifdef RISCOS
6029 if (*ext == '/')
6030 #else
6031 if (*ext == '.')
6032 #endif
6033 *s++ = '_';
6036 * If the extension starts with '.', truncate the base name at 8
6037 * characters
6039 #ifdef RISCOS
6040 /* We normally use '/', but swap files are '_' */
6041 else if (*ext == '/' || *ext == '_')
6042 #else
6043 else if (*ext == '.')
6044 #endif
6046 if ((size_t)(s - ptr) > (size_t)8)
6048 s = ptr + 8;
6049 *s = '\0';
6053 * If the extension doesn't start with '.', and the file name
6054 * doesn't have an extension yet, append a '.'
6056 #ifdef RISCOS
6057 else if ((e = vim_strchr(ptr, '/')) == NULL)
6058 *s++ = '/';
6059 #else
6060 else if ((e = vim_strchr(ptr, '.')) == NULL)
6061 *s++ = '.';
6062 #endif
6064 * If the extension doesn't start with '.', and there already is an
6065 * extension, it may need to be truncated
6067 else if ((int)STRLEN(e) + extlen > 4)
6068 s = e + 4 - extlen;
6070 #if defined(OS2) || defined(USE_LONG_FNAME) || defined(WIN3264)
6072 * If there is no file name, and the extension starts with '.', put a
6073 * '_' before the dot, because just ".ext" may be invalid if it's on a
6074 * FAT partition, and on HPFS it doesn't matter.
6076 else if ((fname == NULL || *fname == NUL) && *ext == '.')
6077 *s++ = '_';
6078 #endif
6081 * Append the extension.
6082 * ext can start with '.' and cannot exceed 3 more characters.
6084 STRCPY(s, ext);
6086 #ifndef SHORT_FNAME
6088 * Prepend the dot.
6090 if (prepend_dot && !shortname && *(e = gettail(retval)) !=
6091 #ifdef RISCOS
6093 #else
6095 #endif
6096 #ifdef USE_LONG_FNAME
6097 && USE_LONG_FNAME
6098 #endif
6101 STRMOVE(e + 1, e);
6102 #ifdef RISCOS
6103 *e = '/';
6104 #else
6105 *e = '.';
6106 #endif
6108 #endif
6111 * Check that, after appending the extension, the file name is really
6112 * different.
6114 if (fname != NULL && STRCMP(fname, retval) == 0)
6116 /* we search for a character that can be replaced by '_' */
6117 while (--s >= ptr)
6119 if (*s != '_')
6121 *s = '_';
6122 break;
6125 if (s < ptr) /* fname was "________.<ext>", how tricky! */
6126 *ptr = 'v';
6128 return retval;
6132 * Like fgets(), but if the file line is too long, it is truncated and the
6133 * rest of the line is thrown away. Returns TRUE for end-of-file.
6136 vim_fgets(buf, size, fp)
6137 char_u *buf;
6138 int size;
6139 FILE *fp;
6141 char *eof;
6142 #define FGETS_SIZE 200
6143 char tbuf[FGETS_SIZE];
6145 buf[size - 2] = NUL;
6146 #ifdef USE_CR
6147 eof = fgets_cr((char *)buf, size, fp);
6148 #else
6149 eof = fgets((char *)buf, size, fp);
6150 #endif
6151 if (buf[size - 2] != NUL && buf[size - 2] != '\n')
6153 buf[size - 1] = NUL; /* Truncate the line */
6155 /* Now throw away the rest of the line: */
6158 tbuf[FGETS_SIZE - 2] = NUL;
6159 #ifdef USE_CR
6160 ignoredp = fgets_cr((char *)tbuf, FGETS_SIZE, fp);
6161 #else
6162 ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
6163 #endif
6164 } while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
6166 return (eof == NULL);
6169 #if defined(USE_CR) || defined(PROTO)
6171 * Like vim_fgets(), but accept any line terminator: CR, CR-LF or LF.
6172 * Returns TRUE for end-of-file.
6173 * Only used for the Mac, because it's much slower than vim_fgets().
6176 tag_fgets(buf, size, fp)
6177 char_u *buf;
6178 int size;
6179 FILE *fp;
6181 int i = 0;
6182 int c;
6183 int eof = FALSE;
6185 for (;;)
6187 c = fgetc(fp);
6188 if (c == EOF)
6190 eof = TRUE;
6191 break;
6193 if (c == '\r')
6195 /* Always store a NL for end-of-line. */
6196 if (i < size - 1)
6197 buf[i++] = '\n';
6198 c = fgetc(fp);
6199 if (c != '\n') /* Macintosh format: single CR. */
6200 ungetc(c, fp);
6201 break;
6203 if (i < size - 1)
6204 buf[i++] = c;
6205 if (c == '\n')
6206 break;
6208 buf[i] = NUL;
6209 return eof;
6211 #endif
6214 * rename() only works if both files are on the same file system, this
6215 * function will (attempts to?) copy the file across if rename fails -- webb
6216 * Return -1 for failure, 0 for success.
6219 vim_rename(from, to)
6220 char_u *from;
6221 char_u *to;
6223 int fd_in;
6224 int fd_out;
6225 int n;
6226 char *errmsg = NULL;
6227 char *buffer;
6228 #ifdef AMIGA
6229 BPTR flock;
6230 #endif
6231 struct stat st;
6232 long perm;
6233 #ifdef HAVE_ACL
6234 vim_acl_T acl; /* ACL from original file */
6235 #endif
6236 #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
6237 int use_tmp_file = FALSE;
6238 #endif
6241 * When the names are identical, there is nothing to do. When they refer
6242 * to the same file (ignoring case and slash/backslash differences) but
6243 * the file name differs we need to go through a temp file.
6245 if (fnamecmp(from, to) == 0)
6247 #ifdef CASE_INSENSITIVE_FILENAME
6248 if (STRCMP(gettail(from), gettail(to)) != 0)
6249 use_tmp_file = TRUE;
6250 else
6251 #endif
6252 return 0;
6256 * Fail if the "from" file doesn't exist. Avoids that "to" is deleted.
6258 if (mch_stat((char *)from, &st) < 0)
6259 return -1;
6261 #ifdef UNIX
6263 struct stat st_to;
6265 /* It's possible for the source and destination to be the same file.
6266 * This happens when "from" and "to" differ in case and are on a FAT32
6267 * filesystem. In that case go through a temp file name. */
6268 if (mch_stat((char *)to, &st_to) >= 0
6269 && st.st_dev == st_to.st_dev
6270 && st.st_ino == st_to.st_ino)
6271 use_tmp_file = TRUE;
6273 #endif
6275 #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME)
6276 if (use_tmp_file)
6278 char tempname[MAXPATHL + 1];
6281 * Find a name that doesn't exist and is in the same directory.
6282 * Rename "from" to "tempname" and then rename "tempname" to "to".
6284 if (STRLEN(from) >= MAXPATHL - 5)
6285 return -1;
6286 STRCPY(tempname, from);
6287 for (n = 123; n < 99999; ++n)
6289 sprintf((char *)gettail((char_u *)tempname), "%d", n);
6290 if (mch_stat(tempname, &st) < 0)
6292 if (mch_rename((char *)from, tempname) == 0)
6294 if (mch_rename(tempname, (char *)to) == 0)
6295 return 0;
6296 /* Strange, the second step failed. Try moving the
6297 * file back and return failure. */
6298 mch_rename(tempname, (char *)from);
6299 return -1;
6301 /* If it fails for one temp name it will most likely fail
6302 * for any temp name, give up. */
6303 return -1;
6306 return -1;
6308 #endif
6311 * Delete the "to" file, this is required on some systems to make the
6312 * mch_rename() work, on other systems it makes sure that we don't have
6313 * two files when the mch_rename() fails.
6316 #ifdef AMIGA
6318 * With MSDOS-compatible filesystems (crossdos, messydos) it is possible
6319 * that the name of the "to" file is the same as the "from" file, even
6320 * though the names are different. To avoid the chance of accidentally
6321 * deleting the "from" file (horror!) we lock it during the remove.
6323 * When used for making a backup before writing the file: This should not
6324 * happen with ":w", because startscript() should detect this problem and
6325 * set buf->b_shortname, causing modname() to return a correct ".bak" file
6326 * name. This problem does exist with ":w filename", but then the
6327 * original file will be somewhere else so the backup isn't really
6328 * important. If autoscripting is off the rename may fail.
6330 flock = Lock((UBYTE *)from, (long)ACCESS_READ);
6331 #endif
6332 mch_remove(to);
6333 #ifdef AMIGA
6334 if (flock)
6335 UnLock(flock);
6336 #endif
6339 * First try a normal rename, return if it works.
6341 if (mch_rename((char *)from, (char *)to) == 0)
6342 return 0;
6345 * Rename() failed, try copying the file.
6347 perm = mch_getperm(from);
6348 #ifdef HAVE_ACL
6349 /* For systems that support ACL: get the ACL from the original file. */
6350 acl = mch_get_acl(from);
6351 #endif
6352 fd_in = mch_open((char *)from, O_RDONLY|O_EXTRA, 0);
6353 if (fd_in == -1)
6355 #ifdef HAVE_ACL
6356 mch_free_acl(acl);
6357 #endif
6358 return -1;
6361 /* Create the new file with same permissions as the original. */
6362 fd_out = mch_open((char *)to,
6363 O_CREAT|O_EXCL|O_WRONLY|O_EXTRA|O_NOFOLLOW, (int)perm);
6364 if (fd_out == -1)
6366 close(fd_in);
6367 #ifdef HAVE_ACL
6368 mch_free_acl(acl);
6369 #endif
6370 return -1;
6373 buffer = (char *)alloc(BUFSIZE);
6374 if (buffer == NULL)
6376 close(fd_out);
6377 close(fd_in);
6378 #ifdef HAVE_ACL
6379 mch_free_acl(acl);
6380 #endif
6381 return -1;
6384 while ((n = vim_read(fd_in, buffer, BUFSIZE)) > 0)
6385 if (vim_write(fd_out, buffer, n) != n)
6387 errmsg = _("E208: Error writing to \"%s\"");
6388 break;
6391 vim_free(buffer);
6392 close(fd_in);
6393 if (close(fd_out) < 0)
6394 errmsg = _("E209: Error closing \"%s\"");
6395 if (n < 0)
6397 errmsg = _("E210: Error reading \"%s\"");
6398 to = from;
6400 #ifndef UNIX /* for Unix mch_open() already set the permission */
6401 mch_setperm(to, perm);
6402 #endif
6403 #ifdef HAVE_ACL
6404 mch_set_acl(to, acl);
6405 mch_free_acl(acl);
6406 #endif
6407 if (errmsg != NULL)
6409 EMSG2(errmsg, to);
6410 return -1;
6412 mch_remove(from);
6413 return 0;
6416 static int already_warned = FALSE;
6417 #ifdef FEAT_GUI_MACVIM
6418 static int default_reload_choice = 0;
6419 #endif
6422 * Check if any not hidden buffer has been changed.
6423 * Postpone the check if there are characters in the stuff buffer, a global
6424 * command is being executed, a mapping is being executed or an autocommand is
6425 * busy.
6426 * Returns TRUE if some message was written (screen should be redrawn and
6427 * cursor positioned).
6430 check_timestamps(focus)
6431 int focus; /* called for GUI focus event */
6433 buf_T *buf;
6434 int didit = 0;
6435 int n;
6437 /* Don't check timestamps while system() or another low-level function may
6438 * cause us to lose and gain focus. */
6439 if (no_check_timestamps > 0)
6440 return FALSE;
6442 /* Avoid doing a check twice. The OK/Reload dialog can cause a focus
6443 * event and we would keep on checking if the file is steadily growing.
6444 * Do check again after typing something. */
6445 if (focus && did_check_timestamps)
6447 need_check_timestamps = TRUE;
6448 return FALSE;
6451 if (!stuff_empty() || global_busy || !typebuf_typed()
6452 #ifdef FEAT_AUTOCMD
6453 || autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0
6454 #endif
6456 need_check_timestamps = TRUE; /* check later */
6457 else
6459 ++no_wait_return;
6460 did_check_timestamps = TRUE;
6461 already_warned = FALSE;
6462 #ifdef FEAT_GUI_MACVIM
6463 default_reload_choice = 0;
6464 #endif
6465 for (buf = firstbuf; buf != NULL; )
6467 /* Only check buffers in a window. */
6468 if (buf->b_nwindows > 0)
6470 n = buf_check_timestamp(buf, focus);
6471 if (didit < n)
6472 didit = n;
6473 if (n > 0 && !buf_valid(buf))
6475 /* Autocommands have removed the buffer, start at the
6476 * first one again. */
6477 buf = firstbuf;
6478 continue;
6481 buf = buf->b_next;
6483 #ifdef FEAT_GUI_MACVIM
6484 default_reload_choice = 0;
6485 #endif
6486 --no_wait_return;
6487 need_check_timestamps = FALSE;
6488 if (need_wait_return && didit == 2)
6490 /* make sure msg isn't overwritten */
6491 msg_puts((char_u *)"\n");
6492 out_flush();
6495 return didit;
6499 * Move all the lines from buffer "frombuf" to buffer "tobuf".
6500 * Return OK or FAIL. When FAIL "tobuf" is incomplete and/or "frombuf" is not
6501 * empty.
6503 static int
6504 move_lines(frombuf, tobuf)
6505 buf_T *frombuf;
6506 buf_T *tobuf;
6508 buf_T *tbuf = curbuf;
6509 int retval = OK;
6510 linenr_T lnum;
6511 char_u *p;
6513 /* Copy the lines in "frombuf" to "tobuf". */
6514 curbuf = tobuf;
6515 for (lnum = 1; lnum <= frombuf->b_ml.ml_line_count; ++lnum)
6517 p = vim_strsave(ml_get_buf(frombuf, lnum, FALSE));
6518 if (p == NULL || ml_append(lnum - 1, p, 0, FALSE) == FAIL)
6520 vim_free(p);
6521 retval = FAIL;
6522 break;
6524 vim_free(p);
6527 /* Delete all the lines in "frombuf". */
6528 if (retval != FAIL)
6530 curbuf = frombuf;
6531 for (lnum = curbuf->b_ml.ml_line_count; lnum > 0; --lnum)
6532 if (ml_delete(lnum, FALSE) == FAIL)
6534 /* Oops! We could try putting back the saved lines, but that
6535 * might fail again... */
6536 retval = FAIL;
6537 break;
6541 curbuf = tbuf;
6542 return retval;
6546 * Check if buffer "buf" has been changed.
6547 * Also check if the file for a new buffer unexpectedly appeared.
6548 * return 1 if a changed buffer was found.
6549 * return 2 if a message has been displayed.
6550 * return 0 otherwise.
6553 buf_check_timestamp(buf, focus)
6554 buf_T *buf;
6555 int focus UNUSED; /* called for GUI focus event */
6557 struct stat st;
6558 int stat_res;
6559 int retval = 0;
6560 char_u *path;
6561 char_u *tbuf;
6562 char *mesg = NULL;
6563 char *mesg2 = "";
6564 int helpmesg = FALSE;
6565 int reload = FALSE;
6566 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
6567 int can_reload = FALSE;
6568 #endif
6569 size_t orig_size = buf->b_orig_size;
6570 int orig_mode = buf->b_orig_mode;
6571 #ifdef FEAT_GUI
6572 int save_mouse_correct = need_mouse_correct;
6573 #endif
6574 #ifdef FEAT_AUTOCMD
6575 static int busy = FALSE;
6576 int n;
6577 char_u *s;
6578 #endif
6579 char *reason;
6581 /* If there is no file name, the buffer is not loaded, 'buftype' is
6582 * set, we are in the middle of a save or being called recursively: ignore
6583 * this buffer. */
6584 if (buf->b_ffname == NULL
6585 || buf->b_ml.ml_mfp == NULL
6586 #if defined(FEAT_QUICKFIX)
6587 || *buf->b_p_bt != NUL
6588 #endif
6589 || buf->b_saving
6590 #ifdef FEAT_AUTOCMD
6591 || busy
6592 #endif
6593 #ifdef FEAT_NETBEANS_INTG
6594 || isNetbeansBuffer(buf)
6595 #endif
6597 return 0;
6599 if ( !(buf->b_flags & BF_NOTEDITED)
6600 && buf->b_mtime != 0
6601 && ((stat_res = mch_stat((char *)buf->b_ffname, &st)) < 0
6602 || time_differs((long)st.st_mtime, buf->b_mtime)
6603 #ifdef HAVE_ST_MODE
6604 || (int)st.st_mode != buf->b_orig_mode
6605 #else
6606 || mch_getperm(buf->b_ffname) != buf->b_orig_mode
6607 #endif
6610 retval = 1;
6612 /* set b_mtime to stop further warnings (e.g., when executing
6613 * FileChangedShell autocmd) */
6614 if (stat_res < 0)
6616 buf->b_mtime = 0;
6617 buf->b_orig_size = 0;
6618 buf->b_orig_mode = 0;
6620 else
6621 buf_store_time(buf, &st, buf->b_ffname);
6623 /* Don't do anything for a directory. Might contain the file
6624 * explorer. */
6625 if (mch_isdir(buf->b_fname))
6629 * If 'autoread' is set, the buffer has no changes and the file still
6630 * exists, reload the buffer. Use the buffer-local option value if it
6631 * was set, the global option value otherwise.
6633 else if ((buf->b_p_ar >= 0 ? buf->b_p_ar : p_ar)
6634 && !bufIsChanged(buf) && stat_res >= 0)
6635 reload = TRUE;
6636 else
6638 if (stat_res < 0)
6639 reason = "deleted";
6640 else if (bufIsChanged(buf))
6641 reason = "conflict";
6642 else if (orig_size != buf->b_orig_size || buf_contents_changed(buf))
6643 reason = "changed";
6644 else if (orig_mode != buf->b_orig_mode)
6645 reason = "mode";
6646 else
6647 reason = "time";
6649 #ifdef FEAT_AUTOCMD
6651 * Only give the warning if there are no FileChangedShell
6652 * autocommands.
6653 * Avoid being called recursively by setting "busy".
6655 busy = TRUE;
6656 # ifdef FEAT_EVAL
6657 set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
6658 set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
6659 # endif
6660 ++allbuf_lock;
6661 n = apply_autocmds(EVENT_FILECHANGEDSHELL,
6662 buf->b_fname, buf->b_fname, FALSE, buf);
6663 --allbuf_lock;
6664 busy = FALSE;
6665 if (n)
6667 if (!buf_valid(buf))
6668 EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
6669 # ifdef FEAT_EVAL
6670 s = get_vim_var_str(VV_FCS_CHOICE);
6671 if (STRCMP(s, "reload") == 0 && *reason != 'd')
6672 reload = TRUE;
6673 else if (STRCMP(s, "ask") == 0)
6674 n = FALSE;
6675 else
6676 # endif
6677 return 2;
6679 if (!n)
6680 #endif
6682 if (*reason == 'd')
6683 mesg = _("E211: File \"%s\" no longer available");
6684 else
6686 helpmesg = TRUE;
6687 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
6688 can_reload = TRUE;
6689 #endif
6691 * Check if the file contents really changed to avoid
6692 * giving a warning when only the timestamp was set (e.g.,
6693 * checked out of CVS). Always warn when the buffer was
6694 * changed.
6696 if (reason[2] == 'n')
6698 mesg = _("W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as well");
6699 mesg2 = _("See \":help W12\" for more info.");
6701 else if (reason[1] == 'h')
6703 mesg = _("W11: Warning: File \"%s\" has changed since editing started");
6704 mesg2 = _("See \":help W11\" for more info.");
6706 else if (*reason == 'm')
6708 mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started");
6709 mesg2 = _("See \":help W16\" for more info.");
6711 else
6712 /* Only timestamp changed, store it to avoid a warning
6713 * in check_mtime() later. */
6714 buf->b_mtime_read = buf->b_mtime;
6720 else if ((buf->b_flags & BF_NEW) && !(buf->b_flags & BF_NEW_W)
6721 && vim_fexists(buf->b_ffname))
6723 retval = 1;
6724 mesg = _("W13: Warning: File \"%s\" has been created after editing started");
6725 buf->b_flags |= BF_NEW_W;
6726 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
6727 can_reload = TRUE;
6728 #endif
6731 if (mesg != NULL)
6733 path = home_replace_save(buf, buf->b_fname);
6734 if (path != NULL)
6736 if (!helpmesg)
6737 mesg2 = "";
6738 tbuf = alloc((unsigned)(STRLEN(path) + STRLEN(mesg)
6739 + STRLEN(mesg2) + 2));
6740 sprintf((char *)tbuf, mesg, path);
6741 #ifdef FEAT_EVAL
6742 /* Set warningmsg here, before the unimportant and output-specific
6743 * mesg2 has been appended. */
6744 set_vim_var_string(VV_WARNINGMSG, tbuf, -1);
6745 #endif
6746 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
6747 if (can_reload)
6749 if (*mesg2 != NUL)
6751 STRCAT(tbuf, "\n");
6752 STRCAT(tbuf, mesg2);
6754 # ifdef FEAT_GUI_MACVIM
6755 if (default_reload_choice > 0)
6757 if (default_reload_choice == 2)
6758 reload = TRUE;
6760 else
6762 switch (do_dialog(VIM_WARNING, (char_u *)_("Warning"), tbuf,
6763 (char_u *)_("&OK\n&Load File\nLoad &All\n&Ignore All"),
6764 1, NULL))
6766 case 3:
6767 default_reload_choice = 2;
6768 case 2:
6769 reload = TRUE;
6770 break;
6771 case 4:
6772 default_reload_choice = 1;
6773 break;
6776 # else
6777 if (do_dialog(VIM_WARNING, (char_u *)_("Warning"), tbuf,
6778 (char_u *)_("&OK\n&Load File"), 1, NULL) == 2)
6779 reload = TRUE;
6780 # endif
6782 else
6783 #endif
6784 if (State > NORMAL_BUSY || (State & CMDLINE) || already_warned)
6786 if (*mesg2 != NUL)
6788 STRCAT(tbuf, "; ");
6789 STRCAT(tbuf, mesg2);
6791 EMSG(tbuf);
6792 retval = 2;
6794 else
6796 # ifdef FEAT_AUTOCMD
6797 if (!autocmd_busy)
6798 # endif
6800 msg_start();
6801 msg_puts_attr(tbuf, hl_attr(HLF_E) + MSG_HIST);
6802 if (*mesg2 != NUL)
6803 msg_puts_attr((char_u *)mesg2,
6804 hl_attr(HLF_W) + MSG_HIST);
6805 msg_clr_eos();
6806 (void)msg_end();
6807 if (emsg_silent == 0)
6809 out_flush();
6810 # ifdef FEAT_GUI
6811 if (!focus)
6812 # endif
6813 /* give the user some time to think about it */
6814 ui_delay(1000L, TRUE);
6816 /* don't redraw and erase the message */
6817 redraw_cmdline = FALSE;
6820 already_warned = TRUE;
6823 vim_free(path);
6824 vim_free(tbuf);
6828 if (reload)
6829 /* Reload the buffer. */
6830 buf_reload(buf, orig_mode);
6832 #ifdef FEAT_AUTOCMD
6833 /* Trigger FileChangedShell when the file was changed in any way. */
6834 if (buf_valid(buf) && retval != 0)
6835 (void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
6836 buf->b_fname, buf->b_fname, FALSE, buf);
6837 #endif
6838 #ifdef FEAT_GUI
6839 /* restore this in case an autocommand has set it; it would break
6840 * 'mousefocus' */
6841 need_mouse_correct = save_mouse_correct;
6842 #endif
6844 return retval;
6848 * Reload a buffer that is already loaded.
6849 * Used when the file was changed outside of Vim.
6850 * "orig_mode" is buf->b_orig_mode before the need for reloading was detected.
6851 * buf->b_orig_mode may have been reset already.
6853 void
6854 buf_reload(buf, orig_mode)
6855 buf_T *buf;
6856 int orig_mode;
6858 exarg_T ea;
6859 pos_T old_cursor;
6860 linenr_T old_topline;
6861 int old_ro = buf->b_p_ro;
6862 buf_T *savebuf;
6863 int saved = OK;
6864 aco_save_T aco;
6866 /* set curwin/curbuf for "buf" and save some things */
6867 aucmd_prepbuf(&aco, buf);
6869 /* We only want to read the text from the file, not reset the syntax
6870 * highlighting, clear marks, diff status, etc. Force the fileformat
6871 * and encoding to be the same. */
6872 if (prep_exarg(&ea, buf) == OK)
6874 old_cursor = curwin->w_cursor;
6875 old_topline = curwin->w_topline;
6878 * To behave like when a new file is edited (matters for
6879 * BufReadPost autocommands) we first need to delete the current
6880 * buffer contents. But if reading the file fails we should keep
6881 * the old contents. Can't use memory only, the file might be
6882 * too big. Use a hidden buffer to move the buffer contents to.
6884 if (bufempty())
6885 savebuf = NULL;
6886 else
6888 /* Allocate a buffer without putting it in the buffer list. */
6889 savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
6890 if (savebuf != NULL && buf == curbuf)
6892 /* Open the memline. */
6893 curbuf = savebuf;
6894 curwin->w_buffer = savebuf;
6895 saved = ml_open(curbuf);
6896 curbuf = buf;
6897 curwin->w_buffer = buf;
6899 if (savebuf == NULL || saved == FAIL || buf != curbuf
6900 || move_lines(buf, savebuf) == FAIL)
6902 EMSG2(_("E462: Could not prepare for reloading \"%s\""),
6903 buf->b_fname);
6904 saved = FAIL;
6908 if (saved == OK)
6910 curbuf->b_flags |= BF_CHECK_RO; /* check for RO again */
6911 #ifdef FEAT_AUTOCMD
6912 keep_filetype = TRUE; /* don't detect 'filetype' */
6913 #endif
6914 if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
6915 (linenr_T)0,
6916 (linenr_T)MAXLNUM, &ea, READ_NEW) == FAIL)
6918 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
6919 if (!aborting())
6920 #endif
6921 EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
6922 if (savebuf != NULL && buf_valid(savebuf) && buf == curbuf)
6924 /* Put the text back from the save buffer. First
6925 * delete any lines that readfile() added. */
6926 while (!bufempty())
6927 if (ml_delete(buf->b_ml.ml_line_count, FALSE) == FAIL)
6928 break;
6929 (void)move_lines(savebuf, buf);
6932 else if (buf == curbuf)
6934 /* Mark the buffer as unmodified and free undo info. */
6935 unchanged(buf, TRUE);
6936 u_blockfree(buf);
6937 u_clearall(buf);
6940 vim_free(ea.cmd);
6942 if (savebuf != NULL && buf_valid(savebuf))
6943 wipe_buffer(savebuf, FALSE);
6945 #ifdef FEAT_DIFF
6946 /* Invalidate diff info if necessary. */
6947 diff_invalidate(curbuf);
6948 #endif
6950 /* Restore the topline and cursor position and check it (lines may
6951 * have been removed). */
6952 if (old_topline > curbuf->b_ml.ml_line_count)
6953 curwin->w_topline = curbuf->b_ml.ml_line_count;
6954 else
6955 curwin->w_topline = old_topline;
6956 curwin->w_cursor = old_cursor;
6957 check_cursor();
6958 update_topline();
6959 #ifdef FEAT_AUTOCMD
6960 keep_filetype = FALSE;
6961 #endif
6962 #ifdef FEAT_FOLDING
6964 win_T *wp;
6965 tabpage_T *tp;
6967 /* Update folds unless they are defined manually. */
6968 FOR_ALL_TAB_WINDOWS(tp, wp)
6969 if (wp->w_buffer == curwin->w_buffer
6970 && !foldmethodIsManual(wp))
6971 foldUpdateAll(wp);
6973 #endif
6974 /* If the mode didn't change and 'readonly' was set, keep the old
6975 * value; the user probably used the ":view" command. But don't
6976 * reset it, might have had a read error. */
6977 if (orig_mode == curbuf->b_orig_mode)
6978 curbuf->b_p_ro |= old_ro;
6981 /* restore curwin/curbuf and a few other things */
6982 aucmd_restbuf(&aco);
6983 /* Careful: autocommands may have made "buf" invalid! */
6986 void
6987 buf_store_time(buf, st, fname)
6988 buf_T *buf;
6989 struct stat *st;
6990 char_u *fname UNUSED;
6992 buf->b_mtime = (long)st->st_mtime;
6993 buf->b_orig_size = (size_t)st->st_size;
6994 #ifdef HAVE_ST_MODE
6995 buf->b_orig_mode = (int)st->st_mode;
6996 #else
6997 buf->b_orig_mode = mch_getperm(fname);
6998 #endif
7002 * Adjust the line with missing eol, used for the next write.
7003 * Used for do_filter(), when the input lines for the filter are deleted.
7005 void
7006 write_lnum_adjust(offset)
7007 linenr_T offset;
7009 if (write_no_eol_lnum != 0) /* only if there is a missing eol */
7010 write_no_eol_lnum += offset;
7013 #if defined(TEMPDIRNAMES) || defined(PROTO)
7014 static long temp_count = 0; /* Temp filename counter. */
7017 * Delete the temp directory and all files it contains.
7019 void
7020 vim_deltempdir()
7022 char_u **files;
7023 int file_count;
7024 int i;
7026 if (vim_tempdir != NULL)
7028 sprintf((char *)NameBuff, "%s*", vim_tempdir);
7029 if (gen_expand_wildcards(1, &NameBuff, &file_count, &files,
7030 EW_DIR|EW_FILE|EW_SILENT) == OK)
7032 for (i = 0; i < file_count; ++i)
7033 mch_remove(files[i]);
7034 FreeWild(file_count, files);
7036 gettail(NameBuff)[-1] = NUL;
7037 (void)mch_rmdir(NameBuff);
7039 vim_free(vim_tempdir);
7040 vim_tempdir = NULL;
7043 #endif
7045 #ifdef TEMPDIRNAMES
7047 * Directory "tempdir" was created. Expand this name to a full path and put
7048 * it in "vim_tempdir". This avoids that using ":cd" would confuse us.
7049 * "tempdir" must be no longer than MAXPATHL.
7051 static void
7052 vim_settempdir(tempdir)
7053 char_u *tempdir;
7055 char_u *buf;
7057 buf = alloc((unsigned)MAXPATHL + 2);
7058 if (buf != NULL)
7060 if (vim_FullName(tempdir, buf, MAXPATHL, FALSE) == FAIL)
7061 STRCPY(buf, tempdir);
7062 # ifdef __EMX__
7063 if (vim_strchr(buf, '/') != NULL)
7064 STRCAT(buf, "/");
7065 else
7066 # endif
7067 add_pathsep(buf);
7068 vim_tempdir = vim_strsave(buf);
7069 vim_free(buf);
7072 #endif
7075 * vim_tempname(): Return a unique name that can be used for a temp file.
7077 * The temp file is NOT created.
7079 * The returned pointer is to allocated memory.
7080 * The returned pointer is NULL if no valid name was found.
7082 char_u *
7083 vim_tempname(extra_char)
7084 int extra_char UNUSED; /* char to use in the name instead of '?' */
7086 #ifdef USE_TMPNAM
7087 char_u itmp[L_tmpnam]; /* use tmpnam() */
7088 #else
7089 char_u itmp[TEMPNAMELEN];
7090 #endif
7092 #ifdef TEMPDIRNAMES
7093 static char *(tempdirs[]) = {TEMPDIRNAMES};
7094 int i;
7095 # ifndef EEXIST
7096 struct stat st;
7097 # endif
7100 * This will create a directory for private use by this instance of Vim.
7101 * This is done once, and the same directory is used for all temp files.
7102 * This method avoids security problems because of symlink attacks et al.
7103 * It's also a bit faster, because we only need to check for an existing
7104 * file when creating the directory and not for each temp file.
7106 if (vim_tempdir == NULL)
7109 * Try the entries in TEMPDIRNAMES to create the temp directory.
7111 for (i = 0; i < (int)(sizeof(tempdirs) / sizeof(char *)); ++i)
7113 # ifndef HAVE_MKDTEMP
7114 size_t itmplen;
7115 long nr;
7116 long off;
7117 # endif
7119 /* expand $TMP, leave room for "/v1100000/999999999" */
7120 expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20);
7121 if (mch_isdir(itmp)) /* directory exists */
7123 # ifdef __EMX__
7124 /* If $TMP contains a forward slash (perhaps using bash or
7125 * tcsh), don't add a backslash, use a forward slash!
7126 * Adding 2 backslashes didn't work. */
7127 if (vim_strchr(itmp, '/') != NULL)
7128 STRCAT(itmp, "/");
7129 else
7130 # endif
7131 add_pathsep(itmp);
7133 # ifdef HAVE_MKDTEMP
7134 /* Leave room for filename */
7135 STRCAT(itmp, "vXXXXXX");
7136 if (mkdtemp((char *)itmp) != NULL)
7137 vim_settempdir(itmp);
7138 # else
7139 /* Get an arbitrary number of up to 6 digits. When it's
7140 * unlikely that it already exists it will be faster,
7141 * otherwise it doesn't matter. The use of mkdir() avoids any
7142 * security problems because of the predictable number. */
7143 nr = (mch_get_pid() + (long)time(NULL)) % 1000000L;
7144 itmplen = STRLEN(itmp);
7146 /* Try up to 10000 different values until we find a name that
7147 * doesn't exist. */
7148 for (off = 0; off < 10000L; ++off)
7150 int r;
7151 # if defined(UNIX) || defined(VMS)
7152 mode_t umask_save;
7153 # endif
7155 sprintf((char *)itmp + itmplen, "v%ld", nr + off);
7156 # ifndef EEXIST
7157 /* If mkdir() does not set errno to EEXIST, check for
7158 * existing file here. There is a race condition then,
7159 * although it's fail-safe. */
7160 if (mch_stat((char *)itmp, &st) >= 0)
7161 continue;
7162 # endif
7163 # if defined(UNIX) || defined(VMS)
7164 /* Make sure the umask doesn't remove the executable bit.
7165 * "repl" has been reported to use "177". */
7166 umask_save = umask(077);
7167 # endif
7168 r = vim_mkdir(itmp, 0700);
7169 # if defined(UNIX) || defined(VMS)
7170 (void)umask(umask_save);
7171 # endif
7172 if (r == 0)
7174 vim_settempdir(itmp);
7175 break;
7177 # ifdef EEXIST
7178 /* If the mkdir() didn't fail because the file/dir exists,
7179 * we probably can't create any dir here, try another
7180 * place. */
7181 if (errno != EEXIST)
7182 # endif
7183 break;
7185 # endif /* HAVE_MKDTEMP */
7186 if (vim_tempdir != NULL)
7187 break;
7192 if (vim_tempdir != NULL)
7194 /* There is no need to check if the file exists, because we own the
7195 * directory and nobody else creates a file in it. */
7196 sprintf((char *)itmp, "%s%ld", vim_tempdir, temp_count++);
7197 return vim_strsave(itmp);
7200 return NULL;
7202 #else /* TEMPDIRNAMES */
7204 # ifdef WIN3264
7205 char szTempFile[_MAX_PATH + 1];
7206 char buf4[4];
7207 char_u *retval;
7208 char_u *p;
7210 STRCPY(itmp, "");
7211 if (GetTempPath(_MAX_PATH, szTempFile) == 0)
7212 szTempFile[0] = NUL; /* GetTempPath() failed, use current dir */
7213 strcpy(buf4, "VIM");
7214 buf4[2] = extra_char; /* make it "VIa", "VIb", etc. */
7215 if (GetTempFileName(szTempFile, buf4, 0, itmp) == 0)
7216 return NULL;
7217 /* GetTempFileName() will create the file, we don't want that */
7218 (void)DeleteFile(itmp);
7220 /* Backslashes in a temp file name cause problems when filtering with
7221 * "sh". NOTE: This also checks 'shellcmdflag' to help those people who
7222 * didn't set 'shellslash'. */
7223 retval = vim_strsave(itmp);
7224 if (*p_shcf == '-' || p_ssl)
7225 for (p = retval; *p; ++p)
7226 if (*p == '\\')
7227 *p = '/';
7228 return retval;
7230 # else /* WIN3264 */
7232 # ifdef USE_TMPNAM
7233 /* tmpnam() will make its own name */
7234 if (*tmpnam((char *)itmp) == NUL)
7235 return NULL;
7236 # else
7237 char_u *p;
7239 # ifdef VMS_TEMPNAM
7240 /* mktemp() is not working on VMS. It seems to be
7241 * a do-nothing function. Therefore we use tempnam().
7243 sprintf((char *)itmp, "VIM%c", extra_char);
7244 p = (char_u *)tempnam("tmp:", (char *)itmp);
7245 if (p != NULL)
7247 /* VMS will use '.LOG' if we don't explicitly specify an extension,
7248 * and VIM will then be unable to find the file later */
7249 STRCPY(itmp, p);
7250 STRCAT(itmp, ".txt");
7251 free(p);
7253 else
7254 return NULL;
7255 # else
7256 STRCPY(itmp, TEMPNAME);
7257 if ((p = vim_strchr(itmp, '?')) != NULL)
7258 *p = extra_char;
7259 if (mktemp((char *)itmp) == NULL)
7260 return NULL;
7261 # endif
7262 # endif
7264 return vim_strsave(itmp);
7265 # endif /* WIN3264 */
7266 #endif /* TEMPDIRNAMES */
7269 #if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
7271 * Convert all backslashes in fname to forward slashes in-place.
7273 void
7274 forward_slash(fname)
7275 char_u *fname;
7277 char_u *p;
7279 for (p = fname; *p != NUL; ++p)
7280 # ifdef FEAT_MBYTE
7281 /* The Big5 encoding can have '\' in the trail byte. */
7282 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
7283 ++p;
7284 else
7285 # endif
7286 if (*p == '\\')
7287 *p = '/';
7289 #endif
7293 * Code for automatic commands.
7295 * Only included when "FEAT_AUTOCMD" has been defined.
7298 #if defined(FEAT_AUTOCMD) || defined(PROTO)
7301 * The autocommands are stored in a list for each event.
7302 * Autocommands for the same pattern, that are consecutive, are joined
7303 * together, to avoid having to match the pattern too often.
7304 * The result is an array of Autopat lists, which point to AutoCmd lists:
7306 * first_autopat[0] --> Autopat.next --> Autopat.next --> NULL
7307 * Autopat.cmds Autopat.cmds
7308 * | |
7309 * V V
7310 * AutoCmd.next AutoCmd.next
7311 * | |
7312 * V V
7313 * AutoCmd.next NULL
7316 * NULL
7318 * first_autopat[1] --> Autopat.next --> NULL
7319 * Autopat.cmds
7322 * AutoCmd.next
7325 * NULL
7326 * etc.
7328 * The order of AutoCmds is important, this is the order in which they were
7329 * defined and will have to be executed.
7331 typedef struct AutoCmd
7333 char_u *cmd; /* The command to be executed (NULL
7334 when command has been removed) */
7335 char nested; /* If autocommands nest here */
7336 char last; /* last command in list */
7337 #ifdef FEAT_EVAL
7338 scid_T scriptID; /* script ID where defined */
7339 #endif
7340 struct AutoCmd *next; /* Next AutoCmd in list */
7341 } AutoCmd;
7343 typedef struct AutoPat
7345 int group; /* group ID */
7346 char_u *pat; /* pattern as typed (NULL when pattern
7347 has been removed) */
7348 int patlen; /* strlen() of pat */
7349 regprog_T *reg_prog; /* compiled regprog for pattern */
7350 char allow_dirs; /* Pattern may match whole path */
7351 char last; /* last pattern for apply_autocmds() */
7352 AutoCmd *cmds; /* list of commands to do */
7353 struct AutoPat *next; /* next AutoPat in AutoPat list */
7354 int buflocal_nr; /* !=0 for buffer-local AutoPat */
7355 } AutoPat;
7357 static struct event_name
7359 char *name; /* event name */
7360 event_T event; /* event number */
7361 } event_names[] =
7363 {"BufAdd", EVENT_BUFADD},
7364 {"BufCreate", EVENT_BUFADD},
7365 {"BufDelete", EVENT_BUFDELETE},
7366 {"BufEnter", EVENT_BUFENTER},
7367 {"BufFilePost", EVENT_BUFFILEPOST},
7368 {"BufFilePre", EVENT_BUFFILEPRE},
7369 {"BufHidden", EVENT_BUFHIDDEN},
7370 {"BufLeave", EVENT_BUFLEAVE},
7371 {"BufNew", EVENT_BUFNEW},
7372 {"BufNewFile", EVENT_BUFNEWFILE},
7373 {"BufRead", EVENT_BUFREADPOST},
7374 {"BufReadCmd", EVENT_BUFREADCMD},
7375 {"BufReadPost", EVENT_BUFREADPOST},
7376 {"BufReadPre", EVENT_BUFREADPRE},
7377 {"BufUnload", EVENT_BUFUNLOAD},
7378 {"BufWinEnter", EVENT_BUFWINENTER},
7379 {"BufWinLeave", EVENT_BUFWINLEAVE},
7380 {"BufWipeout", EVENT_BUFWIPEOUT},
7381 {"BufWrite", EVENT_BUFWRITEPRE},
7382 {"BufWritePost", EVENT_BUFWRITEPOST},
7383 {"BufWritePre", EVENT_BUFWRITEPRE},
7384 {"BufWriteCmd", EVENT_BUFWRITECMD},
7385 {"CmdwinEnter", EVENT_CMDWINENTER},
7386 {"CmdwinLeave", EVENT_CMDWINLEAVE},
7387 {"ColorScheme", EVENT_COLORSCHEME},
7388 {"CursorHold", EVENT_CURSORHOLD},
7389 {"CursorHoldI", EVENT_CURSORHOLDI},
7390 {"CursorMoved", EVENT_CURSORMOVED},
7391 {"CursorMovedI", EVENT_CURSORMOVEDI},
7392 {"EncodingChanged", EVENT_ENCODINGCHANGED},
7393 {"FileEncoding", EVENT_ENCODINGCHANGED},
7394 {"FileAppendPost", EVENT_FILEAPPENDPOST},
7395 {"FileAppendPre", EVENT_FILEAPPENDPRE},
7396 {"FileAppendCmd", EVENT_FILEAPPENDCMD},
7397 {"FileChangedShell",EVENT_FILECHANGEDSHELL},
7398 {"FileChangedShellPost",EVENT_FILECHANGEDSHELLPOST},
7399 {"FileChangedRO", EVENT_FILECHANGEDRO},
7400 {"FileReadPost", EVENT_FILEREADPOST},
7401 {"FileReadPre", EVENT_FILEREADPRE},
7402 {"FileReadCmd", EVENT_FILEREADCMD},
7403 {"FileType", EVENT_FILETYPE},
7404 {"FileWritePost", EVENT_FILEWRITEPOST},
7405 {"FileWritePre", EVENT_FILEWRITEPRE},
7406 {"FileWriteCmd", EVENT_FILEWRITECMD},
7407 {"FilterReadPost", EVENT_FILTERREADPOST},
7408 {"FilterReadPre", EVENT_FILTERREADPRE},
7409 {"FilterWritePost", EVENT_FILTERWRITEPOST},
7410 {"FilterWritePre", EVENT_FILTERWRITEPRE},
7411 {"FocusGained", EVENT_FOCUSGAINED},
7412 {"FocusLost", EVENT_FOCUSLOST},
7413 {"FuncUndefined", EVENT_FUNCUNDEFINED},
7414 {"GUIEnter", EVENT_GUIENTER},
7415 {"GUIFailed", EVENT_GUIFAILED},
7416 {"InsertChange", EVENT_INSERTCHANGE},
7417 {"InsertEnter", EVENT_INSERTENTER},
7418 {"InsertLeave", EVENT_INSERTLEAVE},
7419 {"MenuPopup", EVENT_MENUPOPUP},
7420 {"QuickFixCmdPost", EVENT_QUICKFIXCMDPOST},
7421 {"QuickFixCmdPre", EVENT_QUICKFIXCMDPRE},
7422 {"RemoteReply", EVENT_REMOTEREPLY},
7423 {"SessionLoadPost", EVENT_SESSIONLOADPOST},
7424 {"ShellCmdPost", EVENT_SHELLCMDPOST},
7425 {"ShellFilterPost", EVENT_SHELLFILTERPOST},
7426 {"SourcePre", EVENT_SOURCEPRE},
7427 {"SourceCmd", EVENT_SOURCECMD},
7428 {"SpellFileMissing",EVENT_SPELLFILEMISSING},
7429 {"StdinReadPost", EVENT_STDINREADPOST},
7430 {"StdinReadPre", EVENT_STDINREADPRE},
7431 {"SwapExists", EVENT_SWAPEXISTS},
7432 {"Syntax", EVENT_SYNTAX},
7433 {"TabEnter", EVENT_TABENTER},
7434 {"TabLeave", EVENT_TABLEAVE},
7435 {"TermChanged", EVENT_TERMCHANGED},
7436 {"TermResponse", EVENT_TERMRESPONSE},
7437 {"User", EVENT_USER},
7438 {"VimEnter", EVENT_VIMENTER},
7439 {"VimLeave", EVENT_VIMLEAVE},
7440 {"VimLeavePre", EVENT_VIMLEAVEPRE},
7441 {"WinEnter", EVENT_WINENTER},
7442 {"WinLeave", EVENT_WINLEAVE},
7443 {"VimResized", EVENT_VIMRESIZED},
7444 {NULL, (event_T)0}
7447 static AutoPat *first_autopat[NUM_EVENTS] =
7449 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7450 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7451 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7452 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7453 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7454 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
7458 * struct used to keep status while executing autocommands for an event.
7460 typedef struct AutoPatCmd
7462 AutoPat *curpat; /* next AutoPat to examine */
7463 AutoCmd *nextcmd; /* next AutoCmd to execute */
7464 int group; /* group being used */
7465 char_u *fname; /* fname to match with */
7466 char_u *sfname; /* sfname to match with */
7467 char_u *tail; /* tail of fname */
7468 event_T event; /* current event */
7469 int arg_bufnr; /* initially equal to <abuf>, set to zero when
7470 buf is deleted */
7471 struct AutoPatCmd *next; /* chain of active apc-s for auto-invalidation*/
7472 } AutoPatCmd;
7474 static AutoPatCmd *active_apc_list = NULL; /* stack of active autocommands */
7477 * augroups stores a list of autocmd group names.
7479 static garray_T augroups = {0, 0, sizeof(char_u *), 10, NULL};
7480 #define AUGROUP_NAME(i) (((char_u **)augroups.ga_data)[i])
7483 * The ID of the current group. Group 0 is the default one.
7485 static int current_augroup = AUGROUP_DEFAULT;
7487 static int au_need_clean = FALSE; /* need to delete marked patterns */
7489 static void show_autocmd __ARGS((AutoPat *ap, event_T event));
7490 static void au_remove_pat __ARGS((AutoPat *ap));
7491 static void au_remove_cmds __ARGS((AutoPat *ap));
7492 static void au_cleanup __ARGS((void));
7493 static int au_new_group __ARGS((char_u *name));
7494 static void au_del_group __ARGS((char_u *name));
7495 static event_T event_name2nr __ARGS((char_u *start, char_u **end));
7496 static char_u *event_nr2name __ARGS((event_T event));
7497 static char_u *find_end_event __ARGS((char_u *arg, int have_group));
7498 static int event_ignored __ARGS((event_T event));
7499 static int au_get_grouparg __ARGS((char_u **argp));
7500 static int do_autocmd_event __ARGS((event_T event, char_u *pat, int nested, char_u *cmd, int forceit, int group));
7501 static char_u *getnextac __ARGS((int c, void *cookie, int indent));
7502 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));
7503 static void auto_next_pat __ARGS((AutoPatCmd *apc, int stop_at_last));
7506 static event_T last_event;
7507 static int last_group;
7508 static int autocmd_blocked = 0; /* block all autocmds */
7511 * Show the autocommands for one AutoPat.
7513 static void
7514 show_autocmd(ap, event)
7515 AutoPat *ap;
7516 event_T event;
7518 AutoCmd *ac;
7520 /* Check for "got_int" (here and at various places below), which is set
7521 * when "q" has been hit for the "--more--" prompt */
7522 if (got_int)
7523 return;
7524 if (ap->pat == NULL) /* pattern has been removed */
7525 return;
7527 msg_putchar('\n');
7528 if (got_int)
7529 return;
7530 if (event != last_event || ap->group != last_group)
7532 if (ap->group != AUGROUP_DEFAULT)
7534 if (AUGROUP_NAME(ap->group) == NULL)
7535 msg_puts_attr((char_u *)_("--Deleted--"), hl_attr(HLF_E));
7536 else
7537 msg_puts_attr(AUGROUP_NAME(ap->group), hl_attr(HLF_T));
7538 msg_puts((char_u *)" ");
7540 msg_puts_attr(event_nr2name(event), hl_attr(HLF_T));
7541 last_event = event;
7542 last_group = ap->group;
7543 msg_putchar('\n');
7544 if (got_int)
7545 return;
7547 msg_col = 4;
7548 msg_outtrans(ap->pat);
7550 for (ac = ap->cmds; ac != NULL; ac = ac->next)
7552 if (ac->cmd != NULL) /* skip removed commands */
7554 if (msg_col >= 14)
7555 msg_putchar('\n');
7556 msg_col = 14;
7557 if (got_int)
7558 return;
7559 msg_outtrans(ac->cmd);
7560 #ifdef FEAT_EVAL
7561 if (p_verbose > 0)
7562 last_set_msg(ac->scriptID);
7563 #endif
7564 if (got_int)
7565 return;
7566 if (ac->next != NULL)
7568 msg_putchar('\n');
7569 if (got_int)
7570 return;
7577 * Mark an autocommand pattern for deletion.
7579 static void
7580 au_remove_pat(ap)
7581 AutoPat *ap;
7583 vim_free(ap->pat);
7584 ap->pat = NULL;
7585 ap->buflocal_nr = -1;
7586 au_need_clean = TRUE;
7590 * Mark all commands for a pattern for deletion.
7592 static void
7593 au_remove_cmds(ap)
7594 AutoPat *ap;
7596 AutoCmd *ac;
7598 for (ac = ap->cmds; ac != NULL; ac = ac->next)
7600 vim_free(ac->cmd);
7601 ac->cmd = NULL;
7603 au_need_clean = TRUE;
7607 * Cleanup autocommands and patterns that have been deleted.
7608 * This is only done when not executing autocommands.
7610 static void
7611 au_cleanup()
7613 AutoPat *ap, **prev_ap;
7614 AutoCmd *ac, **prev_ac;
7615 event_T event;
7617 if (autocmd_busy || !au_need_clean)
7618 return;
7620 /* loop over all events */
7621 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
7622 event = (event_T)((int)event + 1))
7624 /* loop over all autocommand patterns */
7625 prev_ap = &(first_autopat[(int)event]);
7626 for (ap = *prev_ap; ap != NULL; ap = *prev_ap)
7628 /* loop over all commands for this pattern */
7629 prev_ac = &(ap->cmds);
7630 for (ac = *prev_ac; ac != NULL; ac = *prev_ac)
7632 /* remove the command if the pattern is to be deleted or when
7633 * the command has been marked for deletion */
7634 if (ap->pat == NULL || ac->cmd == NULL)
7636 *prev_ac = ac->next;
7637 vim_free(ac->cmd);
7638 vim_free(ac);
7640 else
7641 prev_ac = &(ac->next);
7644 /* remove the pattern if it has been marked for deletion */
7645 if (ap->pat == NULL)
7647 *prev_ap = ap->next;
7648 vim_free(ap->reg_prog);
7649 vim_free(ap);
7651 else
7652 prev_ap = &(ap->next);
7656 au_need_clean = FALSE;
7660 * Called when buffer is freed, to remove/invalidate related buffer-local
7661 * autocmds.
7663 void
7664 aubuflocal_remove(buf)
7665 buf_T *buf;
7667 AutoPat *ap;
7668 event_T event;
7669 AutoPatCmd *apc;
7671 /* invalidate currently executing autocommands */
7672 for (apc = active_apc_list; apc; apc = apc->next)
7673 if (buf->b_fnum == apc->arg_bufnr)
7674 apc->arg_bufnr = 0;
7676 /* invalidate buflocals looping through events */
7677 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
7678 event = (event_T)((int)event + 1))
7679 /* loop over all autocommand patterns */
7680 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
7681 if (ap->buflocal_nr == buf->b_fnum)
7683 au_remove_pat(ap);
7684 if (p_verbose >= 6)
7686 verbose_enter();
7687 smsg((char_u *)
7688 _("auto-removing autocommand: %s <buffer=%d>"),
7689 event_nr2name(event), buf->b_fnum);
7690 verbose_leave();
7693 au_cleanup();
7697 * Add an autocmd group name.
7698 * Return it's ID. Returns AUGROUP_ERROR (< 0) for error.
7700 static int
7701 au_new_group(name)
7702 char_u *name;
7704 int i;
7706 i = au_find_group(name);
7707 if (i == AUGROUP_ERROR) /* the group doesn't exist yet, add it */
7709 /* First try using a free entry. */
7710 for (i = 0; i < augroups.ga_len; ++i)
7711 if (AUGROUP_NAME(i) == NULL)
7712 break;
7713 if (i == augroups.ga_len && ga_grow(&augroups, 1) == FAIL)
7714 return AUGROUP_ERROR;
7716 AUGROUP_NAME(i) = vim_strsave(name);
7717 if (AUGROUP_NAME(i) == NULL)
7718 return AUGROUP_ERROR;
7719 if (i == augroups.ga_len)
7720 ++augroups.ga_len;
7723 return i;
7726 static void
7727 au_del_group(name)
7728 char_u *name;
7730 int i;
7732 i = au_find_group(name);
7733 if (i == AUGROUP_ERROR) /* the group doesn't exist */
7734 EMSG2(_("E367: No such group: \"%s\""), name);
7735 else
7737 vim_free(AUGROUP_NAME(i));
7738 AUGROUP_NAME(i) = NULL;
7743 * Find the ID of an autocmd group name.
7744 * Return it's ID. Returns AUGROUP_ERROR (< 0) for error.
7746 static int
7747 au_find_group(name)
7748 char_u *name;
7750 int i;
7752 for (i = 0; i < augroups.ga_len; ++i)
7753 if (AUGROUP_NAME(i) != NULL && STRCMP(AUGROUP_NAME(i), name) == 0)
7754 return i;
7755 return AUGROUP_ERROR;
7759 * Return TRUE if augroup "name" exists.
7762 au_has_group(name)
7763 char_u *name;
7765 return au_find_group(name) != AUGROUP_ERROR;
7769 * ":augroup {name}".
7771 void
7772 do_augroup(arg, del_group)
7773 char_u *arg;
7774 int del_group;
7776 int i;
7778 if (del_group)
7780 if (*arg == NUL)
7781 EMSG(_(e_argreq));
7782 else
7783 au_del_group(arg);
7785 else if (STRICMP(arg, "end") == 0) /* ":aug end": back to group 0 */
7786 current_augroup = AUGROUP_DEFAULT;
7787 else if (*arg) /* ":aug xxx": switch to group xxx */
7789 i = au_new_group(arg);
7790 if (i != AUGROUP_ERROR)
7791 current_augroup = i;
7793 else /* ":aug": list the group names */
7795 msg_start();
7796 for (i = 0; i < augroups.ga_len; ++i)
7798 if (AUGROUP_NAME(i) != NULL)
7800 msg_puts(AUGROUP_NAME(i));
7801 msg_puts((char_u *)" ");
7804 msg_clr_eos();
7805 msg_end();
7809 #if defined(EXITFREE) || defined(PROTO)
7810 void
7811 free_all_autocmds()
7813 for (current_augroup = -1; current_augroup < augroups.ga_len;
7814 ++current_augroup)
7815 do_autocmd((char_u *)"", TRUE);
7816 ga_clear_strings(&augroups);
7818 #endif
7821 * Return the event number for event name "start".
7822 * Return NUM_EVENTS if the event name was not found.
7823 * Return a pointer to the next event name in "end".
7825 static event_T
7826 event_name2nr(start, end)
7827 char_u *start;
7828 char_u **end;
7830 char_u *p;
7831 int i;
7832 int len;
7834 /* the event name ends with end of line, a blank or a comma */
7835 for (p = start; *p && !vim_iswhite(*p) && *p != ','; ++p)
7837 for (i = 0; event_names[i].name != NULL; ++i)
7839 len = (int)STRLEN(event_names[i].name);
7840 if (len == p - start && STRNICMP(event_names[i].name, start, len) == 0)
7841 break;
7843 if (*p == ',')
7844 ++p;
7845 *end = p;
7846 if (event_names[i].name == NULL)
7847 return NUM_EVENTS;
7848 return event_names[i].event;
7852 * Return the name for event "event".
7854 static char_u *
7855 event_nr2name(event)
7856 event_T event;
7858 int i;
7860 for (i = 0; event_names[i].name != NULL; ++i)
7861 if (event_names[i].event == event)
7862 return (char_u *)event_names[i].name;
7863 return (char_u *)"Unknown";
7867 * Scan over the events. "*" stands for all events.
7869 static char_u *
7870 find_end_event(arg, have_group)
7871 char_u *arg;
7872 int have_group; /* TRUE when group name was found */
7874 char_u *pat;
7875 char_u *p;
7877 if (*arg == '*')
7879 if (arg[1] && !vim_iswhite(arg[1]))
7881 EMSG2(_("E215: Illegal character after *: %s"), arg);
7882 return NULL;
7884 pat = arg + 1;
7886 else
7888 for (pat = arg; *pat && !vim_iswhite(*pat); pat = p)
7890 if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS)
7892 if (have_group)
7893 EMSG2(_("E216: No such event: %s"), pat);
7894 else
7895 EMSG2(_("E216: No such group or event: %s"), pat);
7896 return NULL;
7900 return pat;
7904 * Return TRUE if "event" is included in 'eventignore'.
7906 static int
7907 event_ignored(event)
7908 event_T event;
7910 char_u *p = p_ei;
7912 while (*p != NUL)
7914 if (STRNICMP(p, "all", 3) == 0 && (p[3] == NUL || p[3] == ','))
7915 return TRUE;
7916 if (event_name2nr(p, &p) == event)
7917 return TRUE;
7920 return FALSE;
7924 * Return OK when the contents of p_ei is valid, FAIL otherwise.
7927 check_ei()
7929 char_u *p = p_ei;
7931 while (*p)
7933 if (STRNICMP(p, "all", 3) == 0 && (p[3] == NUL || p[3] == ','))
7935 p += 3;
7936 if (*p == ',')
7937 ++p;
7939 else if (event_name2nr(p, &p) == NUM_EVENTS)
7940 return FAIL;
7943 return OK;
7946 # if defined(FEAT_SYN_HL) || defined(PROTO)
7949 * Add "what" to 'eventignore' to skip loading syntax highlighting for every
7950 * buffer loaded into the window. "what" must start with a comma.
7951 * Returns the old value of 'eventignore' in allocated memory.
7953 char_u *
7954 au_event_disable(what)
7955 char *what;
7957 char_u *new_ei;
7958 char_u *save_ei;
7960 save_ei = vim_strsave(p_ei);
7961 if (save_ei != NULL)
7963 new_ei = vim_strnsave(p_ei, (int)(STRLEN(p_ei) + STRLEN(what)));
7964 if (new_ei != NULL)
7966 if (*what == ',' && *p_ei == NUL)
7967 STRCPY(new_ei, what + 1);
7968 else
7969 STRCAT(new_ei, what);
7970 set_string_option_direct((char_u *)"ei", -1, new_ei,
7971 OPT_FREE, SID_NONE);
7972 vim_free(new_ei);
7975 return save_ei;
7978 void
7979 au_event_restore(old_ei)
7980 char_u *old_ei;
7982 if (old_ei != NULL)
7984 set_string_option_direct((char_u *)"ei", -1, old_ei,
7985 OPT_FREE, SID_NONE);
7986 vim_free(old_ei);
7989 # endif /* FEAT_SYN_HL */
7992 * do_autocmd() -- implements the :autocmd command. Can be used in the
7993 * following ways:
7995 * :autocmd <event> <pat> <cmd> Add <cmd> to the list of commands that
7996 * will be automatically executed for <event>
7997 * when editing a file matching <pat>, in
7998 * the current group.
7999 * :autocmd <event> <pat> Show the auto-commands associated with
8000 * <event> and <pat>.
8001 * :autocmd <event> Show the auto-commands associated with
8002 * <event>.
8003 * :autocmd Show all auto-commands.
8004 * :autocmd! <event> <pat> <cmd> Remove all auto-commands associated with
8005 * <event> and <pat>, and add the command
8006 * <cmd>, for the current group.
8007 * :autocmd! <event> <pat> Remove all auto-commands associated with
8008 * <event> and <pat> for the current group.
8009 * :autocmd! <event> Remove all auto-commands associated with
8010 * <event> for the current group.
8011 * :autocmd! Remove ALL auto-commands for the current
8012 * group.
8014 * Multiple events and patterns may be given separated by commas. Here are
8015 * some examples:
8016 * :autocmd bufread,bufenter *.c,*.h set tw=0 smartindent noic
8017 * :autocmd bufleave * set tw=79 nosmartindent ic infercase
8019 * :autocmd * *.c show all autocommands for *.c files.
8021 * Mostly a {group} argument can optionally appear before <event>.
8023 void
8024 do_autocmd(arg, forceit)
8025 char_u *arg;
8026 int forceit;
8028 char_u *pat;
8029 char_u *envpat = NULL;
8030 char_u *cmd;
8031 event_T event;
8032 int need_free = FALSE;
8033 int nested = FALSE;
8034 int group;
8037 * Check for a legal group name. If not, use AUGROUP_ALL.
8039 group = au_get_grouparg(&arg);
8040 if (arg == NULL) /* out of memory */
8041 return;
8044 * Scan over the events.
8045 * If we find an illegal name, return here, don't do anything.
8047 pat = find_end_event(arg, group != AUGROUP_ALL);
8048 if (pat == NULL)
8049 return;
8052 * Scan over the pattern. Put a NUL at the end.
8054 pat = skipwhite(pat);
8055 cmd = pat;
8056 while (*cmd && (!vim_iswhite(*cmd) || cmd[-1] == '\\'))
8057 cmd++;
8058 if (*cmd)
8059 *cmd++ = NUL;
8061 /* Expand environment variables in the pattern. Set 'shellslash', we want
8062 * forward slashes here. */
8063 if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL)
8065 #ifdef BACKSLASH_IN_FILENAME
8066 int p_ssl_save = p_ssl;
8068 p_ssl = TRUE;
8069 #endif
8070 envpat = expand_env_save(pat);
8071 #ifdef BACKSLASH_IN_FILENAME
8072 p_ssl = p_ssl_save;
8073 #endif
8074 if (envpat != NULL)
8075 pat = envpat;
8079 * Check for "nested" flag.
8081 cmd = skipwhite(cmd);
8082 if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0 && vim_iswhite(cmd[6]))
8084 nested = TRUE;
8085 cmd = skipwhite(cmd + 6);
8089 * Find the start of the commands.
8090 * Expand <sfile> in it.
8092 if (*cmd != NUL)
8094 cmd = expand_sfile(cmd);
8095 if (cmd == NULL) /* some error */
8096 return;
8097 need_free = TRUE;
8101 * Print header when showing autocommands.
8103 if (!forceit && *cmd == NUL)
8105 /* Highlight title */
8106 MSG_PUTS_TITLE(_("\n--- Auto-Commands ---"));
8110 * Loop over the events.
8112 last_event = (event_T)-1; /* for listing the event name */
8113 last_group = AUGROUP_ERROR; /* for listing the group name */
8114 if (*arg == '*' || *arg == NUL)
8116 for (event = (event_T)0; (int)event < (int)NUM_EVENTS;
8117 event = (event_T)((int)event + 1))
8118 if (do_autocmd_event(event, pat,
8119 nested, cmd, forceit, group) == FAIL)
8120 break;
8122 else
8124 while (*arg && !vim_iswhite(*arg))
8125 if (do_autocmd_event(event_name2nr(arg, &arg), pat,
8126 nested, cmd, forceit, group) == FAIL)
8127 break;
8130 if (need_free)
8131 vim_free(cmd);
8132 vim_free(envpat);
8136 * Find the group ID in a ":autocmd" or ":doautocmd" argument.
8137 * The "argp" argument is advanced to the following argument.
8139 * Returns the group ID, AUGROUP_ERROR for error (out of memory).
8141 static int
8142 au_get_grouparg(argp)
8143 char_u **argp;
8145 char_u *group_name;
8146 char_u *p;
8147 char_u *arg = *argp;
8148 int group = AUGROUP_ALL;
8150 p = skiptowhite(arg);
8151 if (p > arg)
8153 group_name = vim_strnsave(arg, (int)(p - arg));
8154 if (group_name == NULL) /* out of memory */
8155 return AUGROUP_ERROR;
8156 group = au_find_group(group_name);
8157 if (group == AUGROUP_ERROR)
8158 group = AUGROUP_ALL; /* no match, use all groups */
8159 else
8160 *argp = skipwhite(p); /* match, skip over group name */
8161 vim_free(group_name);
8163 return group;
8167 * do_autocmd() for one event.
8168 * If *pat == NUL do for all patterns.
8169 * If *cmd == NUL show entries.
8170 * If forceit == TRUE delete entries.
8171 * If group is not AUGROUP_ALL, only use this group.
8173 static int
8174 do_autocmd_event(event, pat, nested, cmd, forceit, group)
8175 event_T event;
8176 char_u *pat;
8177 int nested;
8178 char_u *cmd;
8179 int forceit;
8180 int group;
8182 AutoPat *ap;
8183 AutoPat **prev_ap;
8184 AutoCmd *ac;
8185 AutoCmd **prev_ac;
8186 int brace_level;
8187 char_u *endpat;
8188 int findgroup;
8189 int allgroups;
8190 int patlen;
8191 int is_buflocal;
8192 int buflocal_nr;
8193 char_u buflocal_pat[25]; /* for "<buffer=X>" */
8195 if (group == AUGROUP_ALL)
8196 findgroup = current_augroup;
8197 else
8198 findgroup = group;
8199 allgroups = (group == AUGROUP_ALL && !forceit && *cmd == NUL);
8202 * Show or delete all patterns for an event.
8204 if (*pat == NUL)
8206 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
8208 if (forceit) /* delete the AutoPat, if it's in the current group */
8210 if (ap->group == findgroup)
8211 au_remove_pat(ap);
8213 else if (group == AUGROUP_ALL || ap->group == group)
8214 show_autocmd(ap, event);
8219 * Loop through all the specified patterns.
8221 for ( ; *pat; pat = (*endpat == ',' ? endpat + 1 : endpat))
8224 * Find end of the pattern.
8225 * Watch out for a comma in braces, like "*.\{obj,o\}".
8227 brace_level = 0;
8228 for (endpat = pat; *endpat && (*endpat != ',' || brace_level
8229 || endpat[-1] == '\\'); ++endpat)
8231 if (*endpat == '{')
8232 brace_level++;
8233 else if (*endpat == '}')
8234 brace_level--;
8236 if (pat == endpat) /* ignore single comma */
8237 continue;
8238 patlen = (int)(endpat - pat);
8241 * detect special <buflocal[=X]> buffer-local patterns
8243 is_buflocal = FALSE;
8244 buflocal_nr = 0;
8246 if (patlen >= 7 && STRNCMP(pat, "<buffer", 7) == 0
8247 && pat[patlen - 1] == '>')
8249 /* Error will be printed only for addition. printing and removing
8250 * will proceed silently. */
8251 is_buflocal = TRUE;
8252 if (patlen == 8)
8253 buflocal_nr = curbuf->b_fnum;
8254 else if (patlen > 9 && pat[7] == '=')
8256 /* <buffer=abuf> */
8257 if (patlen == 13 && STRNICMP(pat, "<buffer=abuf>", 13))
8258 buflocal_nr = autocmd_bufnr;
8259 /* <buffer=123> */
8260 else if (skipdigits(pat + 8) == pat + patlen - 1)
8261 buflocal_nr = atoi((char *)pat + 8);
8265 if (is_buflocal)
8267 /* normalize pat into standard "<buffer>#N" form */
8268 sprintf((char *)buflocal_pat, "<buffer=%d>", buflocal_nr);
8269 pat = buflocal_pat; /* can modify pat and patlen */
8270 patlen = (int)STRLEN(buflocal_pat); /* but not endpat */
8274 * Find AutoPat entries with this pattern.
8276 prev_ap = &first_autopat[(int)event];
8277 while ((ap = *prev_ap) != NULL)
8279 if (ap->pat != NULL)
8281 /* Accept a pattern when:
8282 * - a group was specified and it's that group, or a group was
8283 * not specified and it's the current group, or a group was
8284 * not specified and we are listing
8285 * - the length of the pattern matches
8286 * - the pattern matches.
8287 * For <buffer[=X]>, this condition works because we normalize
8288 * all buffer-local patterns.
8290 if ((allgroups || ap->group == findgroup)
8291 && ap->patlen == patlen
8292 && STRNCMP(pat, ap->pat, patlen) == 0)
8295 * Remove existing autocommands.
8296 * If adding any new autocmd's for this AutoPat, don't
8297 * delete the pattern from the autopat list, append to
8298 * this list.
8300 if (forceit)
8302 if (*cmd != NUL && ap->next == NULL)
8304 au_remove_cmds(ap);
8305 break;
8307 au_remove_pat(ap);
8311 * Show autocmd's for this autopat, or buflocals <buffer=X>
8313 else if (*cmd == NUL)
8314 show_autocmd(ap, event);
8317 * Add autocmd to this autopat, if it's the last one.
8319 else if (ap->next == NULL)
8320 break;
8323 prev_ap = &ap->next;
8327 * Add a new command.
8329 if (*cmd != NUL)
8332 * If the pattern we want to add a command to does appear at the
8333 * end of the list (or not is not in the list at all), add the
8334 * pattern at the end of the list.
8336 if (ap == NULL)
8338 /* refuse to add buffer-local ap if buffer number is invalid */
8339 if (is_buflocal && (buflocal_nr == 0
8340 || buflist_findnr(buflocal_nr) == NULL))
8342 EMSGN(_("E680: <buffer=%d>: invalid buffer number "),
8343 buflocal_nr);
8344 return FAIL;
8347 ap = (AutoPat *)alloc((unsigned)sizeof(AutoPat));
8348 if (ap == NULL)
8349 return FAIL;
8350 ap->pat = vim_strnsave(pat, patlen);
8351 ap->patlen = patlen;
8352 if (ap->pat == NULL)
8354 vim_free(ap);
8355 return FAIL;
8358 if (is_buflocal)
8360 ap->buflocal_nr = buflocal_nr;
8361 ap->reg_prog = NULL;
8363 else
8365 char_u *reg_pat;
8367 ap->buflocal_nr = 0;
8368 reg_pat = file_pat_to_reg_pat(pat, endpat,
8369 &ap->allow_dirs, TRUE);
8370 if (reg_pat != NULL)
8371 ap->reg_prog = vim_regcomp(reg_pat, RE_MAGIC);
8372 vim_free(reg_pat);
8373 if (reg_pat == NULL || ap->reg_prog == NULL)
8375 vim_free(ap->pat);
8376 vim_free(ap);
8377 return FAIL;
8380 ap->cmds = NULL;
8381 *prev_ap = ap;
8382 ap->next = NULL;
8383 if (group == AUGROUP_ALL)
8384 ap->group = current_augroup;
8385 else
8386 ap->group = group;
8390 * Add the autocmd at the end of the AutoCmd list.
8392 prev_ac = &(ap->cmds);
8393 while ((ac = *prev_ac) != NULL)
8394 prev_ac = &ac->next;
8395 ac = (AutoCmd *)alloc((unsigned)sizeof(AutoCmd));
8396 if (ac == NULL)
8397 return FAIL;
8398 ac->cmd = vim_strsave(cmd);
8399 #ifdef FEAT_EVAL
8400 ac->scriptID = current_SID;
8401 #endif
8402 if (ac->cmd == NULL)
8404 vim_free(ac);
8405 return FAIL;
8407 ac->next = NULL;
8408 *prev_ac = ac;
8409 ac->nested = nested;
8413 au_cleanup(); /* may really delete removed patterns/commands now */
8414 return OK;
8418 * Implementation of ":doautocmd [group] event [fname]".
8419 * Return OK for success, FAIL for failure;
8422 do_doautocmd(arg, do_msg)
8423 char_u *arg;
8424 int do_msg; /* give message for no matching autocmds? */
8426 char_u *fname;
8427 int nothing_done = TRUE;
8428 int group;
8431 * Check for a legal group name. If not, use AUGROUP_ALL.
8433 group = au_get_grouparg(&arg);
8434 if (arg == NULL) /* out of memory */
8435 return FAIL;
8437 if (*arg == '*')
8439 EMSG(_("E217: Can't execute autocommands for ALL events"));
8440 return FAIL;
8444 * Scan over the events.
8445 * If we find an illegal name, return here, don't do anything.
8447 fname = find_end_event(arg, group != AUGROUP_ALL);
8448 if (fname == NULL)
8449 return FAIL;
8451 fname = skipwhite(fname);
8454 * Loop over the events.
8456 while (*arg && !vim_iswhite(*arg))
8457 if (apply_autocmds_group(event_name2nr(arg, &arg),
8458 fname, NULL, TRUE, group, curbuf, NULL))
8459 nothing_done = FALSE;
8461 if (nothing_done && do_msg)
8462 MSG(_("No matching autocommands"));
8464 #ifdef FEAT_EVAL
8465 return aborting() ? FAIL : OK;
8466 #else
8467 return OK;
8468 #endif
8472 * ":doautoall": execute autocommands for each loaded buffer.
8474 void
8475 ex_doautoall(eap)
8476 exarg_T *eap;
8478 int retval;
8479 aco_save_T aco;
8480 buf_T *buf;
8483 * This is a bit tricky: For some commands curwin->w_buffer needs to be
8484 * equal to curbuf, but for some buffers there may not be a window.
8485 * So we change the buffer for the current window for a moment. This
8486 * gives problems when the autocommands make changes to the list of
8487 * buffers or windows...
8489 for (buf = firstbuf; buf != NULL; buf = buf->b_next)
8491 if (buf->b_ml.ml_mfp != NULL)
8493 /* find a window for this buffer and save some values */
8494 aucmd_prepbuf(&aco, buf);
8496 /* execute the autocommands for this buffer */
8497 retval = do_doautocmd(eap->arg, FALSE);
8499 /* Execute the modeline settings, but don't set window-local
8500 * options if we are using the current window for another buffer. */
8501 do_modelines(curwin == aucmd_win ? OPT_NOWIN : 0);
8503 /* restore the current window */
8504 aucmd_restbuf(&aco);
8506 /* stop if there is some error or buffer was deleted */
8507 if (retval == FAIL || !buf_valid(buf))
8508 break;
8512 check_cursor(); /* just in case lines got deleted */
8516 * Prepare for executing autocommands for (hidden) buffer "buf".
8517 * Search for a visible window containing the current buffer. If there isn't
8518 * one then use "aucmd_win".
8519 * Set "curbuf" and "curwin" to match "buf".
8520 * When FEAT_AUTOCMD is not defined another version is used, see below.
8522 void
8523 aucmd_prepbuf(aco, buf)
8524 aco_save_T *aco; /* structure to save values in */
8525 buf_T *buf; /* new curbuf */
8527 win_T *win;
8528 #ifdef FEAT_WINDOWS
8529 int save_ea;
8530 #endif
8532 /* Find a window that is for the new buffer */
8533 if (buf == curbuf) /* be quick when buf is curbuf */
8534 win = curwin;
8535 else
8536 #ifdef FEAT_WINDOWS
8537 for (win = firstwin; win != NULL; win = win->w_next)
8538 if (win->w_buffer == buf)
8539 break;
8540 #else
8541 win = NULL;
8542 #endif
8544 /* Allocate "aucmd_win" when needed. If this fails (out of memory) fall
8545 * back to using the current window. */
8546 if (win == NULL && aucmd_win == NULL)
8548 win_alloc_aucmd_win();
8549 if (aucmd_win == NULL)
8550 win = curwin;
8552 if (win == NULL && aucmd_win_used)
8553 /* Strange recursive autocommand, fall back to using the current
8554 * window. Expect a few side effects... */
8555 win = curwin;
8557 aco->save_curwin = curwin;
8558 aco->save_curbuf = curbuf;
8559 if (win != NULL)
8561 /* There is a window for "buf" in the current tab page, make it the
8562 * curwin. This is preferred, it has the least side effects (esp. if
8563 * "buf" is curbuf). */
8564 aco->use_aucmd_win = FALSE;
8565 curwin = win;
8567 else
8569 /* There is no window for "buf", use "aucmd_win". To minimize the side
8570 * effects, insert it in a the current tab page.
8571 * Anything related to a window (e.g., setting folds) may have
8572 * unexpected results. */
8573 aco->use_aucmd_win = TRUE;
8574 aucmd_win_used = TRUE;
8575 aucmd_win->w_buffer = buf;
8576 ++buf->b_nwindows;
8577 win_init_empty(aucmd_win); /* set cursor and topline to safe values */
8578 vim_free(aucmd_win->w_localdir);
8579 aucmd_win->w_localdir = NULL;
8581 /* Make sure w_localdir and globaldir are NULL to avoid a chdir() in
8582 * win_enter_ext(). */
8583 aucmd_win->w_localdir = NULL;
8584 aco->globaldir = globaldir;
8585 globaldir = NULL;
8588 #ifdef FEAT_WINDOWS
8589 /* Split the current window, put the aucmd_win in the upper half.
8590 * We don't want the BufEnter or WinEnter autocommands. */
8591 block_autocmds();
8592 make_snapshot(SNAP_AUCMD_IDX);
8593 save_ea = p_ea;
8594 p_ea = FALSE;
8595 (void)win_split_ins(0, WSP_TOP, aucmd_win, 0);
8596 (void)win_comp_pos(); /* recompute window positions */
8597 p_ea = save_ea;
8598 unblock_autocmds();
8599 #endif
8600 curwin = aucmd_win;
8602 curbuf = buf;
8603 aco->new_curwin = curwin;
8604 aco->new_curbuf = curbuf;
8608 * Cleanup after executing autocommands for a (hidden) buffer.
8609 * Restore the window as it was (if possible).
8610 * When FEAT_AUTOCMD is not defined another version is used, see below.
8612 void
8613 aucmd_restbuf(aco)
8614 aco_save_T *aco; /* structure holding saved values */
8616 #ifdef FEAT_WINDOWS
8617 int dummy;
8618 #endif
8620 if (aco->use_aucmd_win)
8622 --curbuf->b_nwindows;
8623 #ifdef FEAT_WINDOWS
8624 /* Find "aucmd_win", it can't be closed, but it may be in another tab
8625 * page. Do not trigger autocommands here. */
8626 block_autocmds();
8627 if (curwin != aucmd_win)
8629 tabpage_T *tp;
8630 win_T *wp;
8632 FOR_ALL_TAB_WINDOWS(tp, wp)
8634 if (wp == aucmd_win)
8636 if (tp != curtab)
8637 goto_tabpage_tp(tp);
8638 win_goto(aucmd_win);
8639 break;
8644 /* Remove the window and frame from the tree of frames. */
8645 (void)winframe_remove(curwin, &dummy, NULL);
8646 win_remove(curwin, NULL);
8647 aucmd_win_used = FALSE;
8648 last_status(FALSE); /* may need to remove last status line */
8649 restore_snapshot(SNAP_AUCMD_IDX, FALSE);
8650 (void)win_comp_pos(); /* recompute window positions */
8651 unblock_autocmds();
8653 if (win_valid(aco->save_curwin))
8654 curwin = aco->save_curwin;
8655 else
8656 /* Hmm, original window disappeared. Just use the first one. */
8657 curwin = firstwin;
8658 # ifdef FEAT_EVAL
8659 vars_clear(&aucmd_win->w_vars.dv_hashtab); /* free all w: variables */
8660 hash_init(&aucmd_win->w_vars.dv_hashtab); /* re-use the hashtab */
8661 # endif
8662 #else
8663 curwin = aco->save_curwin;
8664 #endif
8665 curbuf = curwin->w_buffer;
8667 vim_free(globaldir);
8668 globaldir = aco->globaldir;
8670 /* the buffer contents may have changed */
8671 check_cursor();
8672 if (curwin->w_topline > curbuf->b_ml.ml_line_count)
8674 curwin->w_topline = curbuf->b_ml.ml_line_count;
8675 #ifdef FEAT_DIFF
8676 curwin->w_topfill = 0;
8677 #endif
8679 #if defined(FEAT_GUI)
8680 /* Hide the scrollbars from the aucmd_win and update. */
8681 gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_LEFT], FALSE);
8682 gui_mch_enable_scrollbar(&aucmd_win->w_scrollbars[SBAR_RIGHT], FALSE);
8683 gui_may_update_scrollbars();
8684 #endif
8686 else
8688 /* restore curwin */
8689 #ifdef FEAT_WINDOWS
8690 if (win_valid(aco->save_curwin))
8691 #endif
8693 /* Restore the buffer which was previously edited by curwin, if
8694 * it was changed, we are still the same window and the buffer is
8695 * valid. */
8696 if (curwin == aco->new_curwin
8697 && curbuf != aco->new_curbuf
8698 && buf_valid(aco->new_curbuf)
8699 && aco->new_curbuf->b_ml.ml_mfp != NULL)
8701 --curbuf->b_nwindows;
8702 curbuf = aco->new_curbuf;
8703 curwin->w_buffer = curbuf;
8704 ++curbuf->b_nwindows;
8707 curwin = aco->save_curwin;
8708 curbuf = curwin->w_buffer;
8713 static int autocmd_nested = FALSE;
8716 * Execute autocommands for "event" and file name "fname".
8717 * Return TRUE if some commands were executed.
8720 apply_autocmds(event, fname, fname_io, force, buf)
8721 event_T event;
8722 char_u *fname; /* NULL or empty means use actual file name */
8723 char_u *fname_io; /* fname to use for <afile> on cmdline */
8724 int force; /* when TRUE, ignore autocmd_busy */
8725 buf_T *buf; /* buffer for <abuf> */
8727 return apply_autocmds_group(event, fname, fname_io, force,
8728 AUGROUP_ALL, buf, NULL);
8732 * Like apply_autocmds(), but with extra "eap" argument. This takes care of
8733 * setting v:filearg.
8735 static int
8736 apply_autocmds_exarg(event, fname, fname_io, force, buf, eap)
8737 event_T event;
8738 char_u *fname;
8739 char_u *fname_io;
8740 int force;
8741 buf_T *buf;
8742 exarg_T *eap;
8744 return apply_autocmds_group(event, fname, fname_io, force,
8745 AUGROUP_ALL, buf, eap);
8749 * Like apply_autocmds(), but handles the caller's retval. If the script
8750 * processing is being aborted or if retval is FAIL when inside a try
8751 * conditional, no autocommands are executed. If otherwise the autocommands
8752 * cause the script to be aborted, retval is set to FAIL.
8755 apply_autocmds_retval(event, fname, fname_io, force, buf, retval)
8756 event_T event;
8757 char_u *fname; /* NULL or empty means use actual file name */
8758 char_u *fname_io; /* fname to use for <afile> on cmdline */
8759 int force; /* when TRUE, ignore autocmd_busy */
8760 buf_T *buf; /* buffer for <abuf> */
8761 int *retval; /* pointer to caller's retval */
8763 int did_cmd;
8765 #ifdef FEAT_EVAL
8766 if (should_abort(*retval))
8767 return FALSE;
8768 #endif
8770 did_cmd = apply_autocmds_group(event, fname, fname_io, force,
8771 AUGROUP_ALL, buf, NULL);
8772 if (did_cmd
8773 #ifdef FEAT_EVAL
8774 && aborting()
8775 #endif
8777 *retval = FAIL;
8778 return did_cmd;
8782 * Return TRUE when there is a CursorHold autocommand defined.
8785 has_cursorhold()
8787 return (first_autopat[(int)(get_real_state() == NORMAL_BUSY
8788 ? EVENT_CURSORHOLD : EVENT_CURSORHOLDI)] != NULL);
8792 * Return TRUE if the CursorHold event can be triggered.
8795 trigger_cursorhold()
8797 int state;
8799 if (!did_cursorhold && has_cursorhold() && !Recording
8800 #ifdef FEAT_INS_EXPAND
8801 && !ins_compl_active()
8802 #endif
8805 state = get_real_state();
8806 if (state == NORMAL_BUSY || (state & INSERT) != 0)
8807 return TRUE;
8809 return FALSE;
8813 * Return TRUE when there is a CursorMoved autocommand defined.
8816 has_cursormoved()
8818 return (first_autopat[(int)EVENT_CURSORMOVED] != NULL);
8822 * Return TRUE when there is a CursorMovedI autocommand defined.
8825 has_cursormovedI()
8827 return (first_autopat[(int)EVENT_CURSORMOVEDI] != NULL);
8830 static int
8831 apply_autocmds_group(event, fname, fname_io, force, group, buf, eap)
8832 event_T event;
8833 char_u *fname; /* NULL or empty means use actual file name */
8834 char_u *fname_io; /* fname to use for <afile> on cmdline, NULL means
8835 use fname */
8836 int force; /* when TRUE, ignore autocmd_busy */
8837 int group; /* group ID, or AUGROUP_ALL */
8838 buf_T *buf; /* buffer for <abuf> */
8839 exarg_T *eap; /* command arguments */
8841 char_u *sfname = NULL; /* short file name */
8842 char_u *tail;
8843 int save_changed;
8844 buf_T *old_curbuf;
8845 int retval = FALSE;
8846 char_u *save_sourcing_name;
8847 linenr_T save_sourcing_lnum;
8848 char_u *save_autocmd_fname;
8849 int save_autocmd_fname_full;
8850 int save_autocmd_bufnr;
8851 char_u *save_autocmd_match;
8852 int save_autocmd_busy;
8853 int save_autocmd_nested;
8854 static int nesting = 0;
8855 AutoPatCmd patcmd;
8856 AutoPat *ap;
8857 #ifdef FEAT_EVAL
8858 scid_T save_current_SID;
8859 void *save_funccalp;
8860 char_u *save_cmdarg;
8861 long save_cmdbang;
8862 #endif
8863 static int filechangeshell_busy = FALSE;
8864 #ifdef FEAT_PROFILE
8865 proftime_T wait_time;
8866 #endif
8869 * Quickly return if there are no autocommands for this event or
8870 * autocommands are blocked.
8872 if (first_autopat[(int)event] == NULL || autocmd_blocked > 0)
8873 goto BYPASS_AU;
8876 * When autocommands are busy, new autocommands are only executed when
8877 * explicitly enabled with the "nested" flag.
8879 if (autocmd_busy && !(force || autocmd_nested))
8880 goto BYPASS_AU;
8882 #ifdef FEAT_EVAL
8884 * Quickly return when immediately aborting on error, or when an interrupt
8885 * occurred or an exception was thrown but not caught.
8887 if (aborting())
8888 goto BYPASS_AU;
8889 #endif
8892 * FileChangedShell never nests, because it can create an endless loop.
8894 if (filechangeshell_busy && (event == EVENT_FILECHANGEDSHELL
8895 || event == EVENT_FILECHANGEDSHELLPOST))
8896 goto BYPASS_AU;
8899 * Ignore events in 'eventignore'.
8901 if (event_ignored(event))
8902 goto BYPASS_AU;
8905 * Allow nesting of autocommands, but restrict the depth, because it's
8906 * possible to create an endless loop.
8908 if (nesting == 10)
8910 EMSG(_("E218: autocommand nesting too deep"));
8911 goto BYPASS_AU;
8915 * Check if these autocommands are disabled. Used when doing ":all" or
8916 * ":ball".
8918 if ( (autocmd_no_enter
8919 && (event == EVENT_WINENTER || event == EVENT_BUFENTER))
8920 || (autocmd_no_leave
8921 && (event == EVENT_WINLEAVE || event == EVENT_BUFLEAVE)))
8922 goto BYPASS_AU;
8925 * Save the autocmd_* variables and info about the current buffer.
8927 save_autocmd_fname = autocmd_fname;
8928 save_autocmd_fname_full = autocmd_fname_full;
8929 save_autocmd_bufnr = autocmd_bufnr;
8930 save_autocmd_match = autocmd_match;
8931 save_autocmd_busy = autocmd_busy;
8932 save_autocmd_nested = autocmd_nested;
8933 save_changed = curbuf->b_changed;
8934 old_curbuf = curbuf;
8937 * Set the file name to be used for <afile>.
8938 * Make a copy to avoid that changing a buffer name or directory makes it
8939 * invalid.
8941 if (fname_io == NULL)
8943 if (fname != NULL && *fname != NUL)
8944 autocmd_fname = fname;
8945 else if (buf != NULL)
8946 autocmd_fname = buf->b_ffname;
8947 else
8948 autocmd_fname = NULL;
8950 else
8951 autocmd_fname = fname_io;
8952 if (autocmd_fname != NULL)
8953 autocmd_fname = vim_strsave(autocmd_fname);
8954 autocmd_fname_full = FALSE; /* call FullName_save() later */
8957 * Set the buffer number to be used for <abuf>.
8959 if (buf == NULL)
8960 autocmd_bufnr = 0;
8961 else
8962 autocmd_bufnr = buf->b_fnum;
8965 * When the file name is NULL or empty, use the file name of buffer "buf".
8966 * Always use the full path of the file name to match with, in case
8967 * "allow_dirs" is set.
8969 if (fname == NULL || *fname == NUL)
8971 if (buf == NULL)
8972 fname = NULL;
8973 else
8975 #ifdef FEAT_SYN_HL
8976 if (event == EVENT_SYNTAX)
8977 fname = buf->b_p_syn;
8978 else
8979 #endif
8980 if (event == EVENT_FILETYPE)
8981 fname = buf->b_p_ft;
8982 else
8984 if (buf->b_sfname != NULL)
8985 sfname = vim_strsave(buf->b_sfname);
8986 fname = buf->b_ffname;
8989 if (fname == NULL)
8990 fname = (char_u *)"";
8991 fname = vim_strsave(fname); /* make a copy, so we can change it */
8993 else
8995 sfname = vim_strsave(fname);
8996 /* Don't try expanding FileType, Syntax, FuncUndefined, WindowID or
8997 * QuickFixCmd* */
8998 if (event == EVENT_FILETYPE
8999 || event == EVENT_SYNTAX
9000 || event == EVENT_FUNCUNDEFINED
9001 || event == EVENT_REMOTEREPLY
9002 || event == EVENT_SPELLFILEMISSING
9003 || event == EVENT_QUICKFIXCMDPRE
9004 || event == EVENT_QUICKFIXCMDPOST)
9005 fname = vim_strsave(fname);
9006 else
9007 fname = FullName_save(fname, FALSE);
9009 if (fname == NULL) /* out of memory */
9011 vim_free(sfname);
9012 retval = FALSE;
9013 goto BYPASS_AU;
9016 #ifdef BACKSLASH_IN_FILENAME
9018 * Replace all backslashes with forward slashes. This makes the
9019 * autocommand patterns portable between Unix and MS-DOS.
9021 if (sfname != NULL)
9022 forward_slash(sfname);
9023 forward_slash(fname);
9024 #endif
9026 #ifdef VMS
9027 /* remove version for correct match */
9028 if (sfname != NULL)
9029 vms_remove_version(sfname);
9030 vms_remove_version(fname);
9031 #endif
9034 * Set the name to be used for <amatch>.
9036 autocmd_match = fname;
9039 /* Don't redraw while doing auto commands. */
9040 ++RedrawingDisabled;
9041 save_sourcing_name = sourcing_name;
9042 sourcing_name = NULL; /* don't free this one */
9043 save_sourcing_lnum = sourcing_lnum;
9044 sourcing_lnum = 0; /* no line number here */
9046 #ifdef FEAT_EVAL
9047 save_current_SID = current_SID;
9049 # ifdef FEAT_PROFILE
9050 if (do_profiling == PROF_YES)
9051 prof_child_enter(&wait_time); /* doesn't count for the caller itself */
9052 # endif
9054 /* Don't use local function variables, if called from a function */
9055 save_funccalp = save_funccal();
9056 #endif
9059 * When starting to execute autocommands, save the search patterns.
9061 if (!autocmd_busy)
9063 save_search_patterns();
9064 saveRedobuff();
9065 did_filetype = keep_filetype;
9069 * Note that we are applying autocmds. Some commands need to know.
9071 autocmd_busy = TRUE;
9072 filechangeshell_busy = (event == EVENT_FILECHANGEDSHELL);
9073 ++nesting; /* see matching decrement below */
9075 /* Remember that FileType was triggered. Used for did_filetype(). */
9076 if (event == EVENT_FILETYPE)
9077 did_filetype = TRUE;
9079 tail = gettail(fname);
9081 /* Find first autocommand that matches */
9082 patcmd.curpat = first_autopat[(int)event];
9083 patcmd.nextcmd = NULL;
9084 patcmd.group = group;
9085 patcmd.fname = fname;
9086 patcmd.sfname = sfname;
9087 patcmd.tail = tail;
9088 patcmd.event = event;
9089 patcmd.arg_bufnr = autocmd_bufnr;
9090 patcmd.next = NULL;
9091 auto_next_pat(&patcmd, FALSE);
9093 /* found one, start executing the autocommands */
9094 if (patcmd.curpat != NULL)
9096 /* add to active_apc_list */
9097 patcmd.next = active_apc_list;
9098 active_apc_list = &patcmd;
9100 #ifdef FEAT_EVAL
9101 /* set v:cmdarg (only when there is a matching pattern) */
9102 save_cmdbang = get_vim_var_nr(VV_CMDBANG);
9103 if (eap != NULL)
9105 save_cmdarg = set_cmdarg(eap, NULL);
9106 set_vim_var_nr(VV_CMDBANG, (long)eap->forceit);
9108 else
9109 save_cmdarg = NULL; /* avoid gcc warning */
9110 #endif
9111 retval = TRUE;
9112 /* mark the last pattern, to avoid an endless loop when more patterns
9113 * are added when executing autocommands */
9114 for (ap = patcmd.curpat; ap->next != NULL; ap = ap->next)
9115 ap->last = FALSE;
9116 ap->last = TRUE;
9117 check_lnums(TRUE); /* make sure cursor and topline are valid */
9118 do_cmdline(NULL, getnextac, (void *)&patcmd,
9119 DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
9120 #ifdef FEAT_EVAL
9121 if (eap != NULL)
9123 (void)set_cmdarg(NULL, save_cmdarg);
9124 set_vim_var_nr(VV_CMDBANG, save_cmdbang);
9126 #endif
9127 /* delete from active_apc_list */
9128 if (active_apc_list == &patcmd) /* just in case */
9129 active_apc_list = patcmd.next;
9132 --RedrawingDisabled;
9133 autocmd_busy = save_autocmd_busy;
9134 filechangeshell_busy = FALSE;
9135 autocmd_nested = save_autocmd_nested;
9136 vim_free(sourcing_name);
9137 sourcing_name = save_sourcing_name;
9138 sourcing_lnum = save_sourcing_lnum;
9139 vim_free(autocmd_fname);
9140 autocmd_fname = save_autocmd_fname;
9141 autocmd_fname_full = save_autocmd_fname_full;
9142 autocmd_bufnr = save_autocmd_bufnr;
9143 autocmd_match = save_autocmd_match;
9144 #ifdef FEAT_EVAL
9145 current_SID = save_current_SID;
9146 restore_funccal(save_funccalp);
9147 # ifdef FEAT_PROFILE
9148 if (do_profiling == PROF_YES)
9149 prof_child_exit(&wait_time);
9150 # endif
9151 #endif
9152 vim_free(fname);
9153 vim_free(sfname);
9154 --nesting; /* see matching increment above */
9157 * When stopping to execute autocommands, restore the search patterns and
9158 * the redo buffer.
9160 if (!autocmd_busy)
9162 restore_search_patterns();
9163 restoreRedobuff();
9164 did_filetype = FALSE;
9168 * Some events don't set or reset the Changed flag.
9169 * Check if still in the same buffer!
9171 if (curbuf == old_curbuf
9172 && (event == EVENT_BUFREADPOST
9173 || event == EVENT_BUFWRITEPOST
9174 || event == EVENT_FILEAPPENDPOST
9175 || event == EVENT_VIMLEAVE
9176 || event == EVENT_VIMLEAVEPRE))
9178 #ifdef FEAT_TITLE
9179 if (curbuf->b_changed != save_changed)
9180 need_maketitle = TRUE;
9181 #endif
9182 curbuf->b_changed = save_changed;
9185 au_cleanup(); /* may really delete removed patterns/commands now */
9187 BYPASS_AU:
9188 /* When wiping out a buffer make sure all its buffer-local autocommands
9189 * are deleted. */
9190 if (event == EVENT_BUFWIPEOUT && buf != NULL)
9191 aubuflocal_remove(buf);
9193 return retval;
9196 # ifdef FEAT_EVAL
9197 static char_u *old_termresponse = NULL;
9198 # endif
9201 * Block triggering autocommands until unblock_autocmd() is called.
9202 * Can be used recursively, so long as it's symmetric.
9204 void
9205 block_autocmds()
9207 # ifdef FEAT_EVAL
9208 /* Remember the value of v:termresponse. */
9209 if (autocmd_blocked == 0)
9210 old_termresponse = get_vim_var_str(VV_TERMRESPONSE);
9211 # endif
9212 ++autocmd_blocked;
9215 void
9216 unblock_autocmds()
9218 --autocmd_blocked;
9220 # ifdef FEAT_EVAL
9221 /* When v:termresponse was set while autocommands were blocked, trigger
9222 * the autocommands now. Esp. useful when executing a shell command
9223 * during startup (vimdiff). */
9224 if (autocmd_blocked == 0
9225 && get_vim_var_str(VV_TERMRESPONSE) != old_termresponse)
9226 apply_autocmds(EVENT_TERMRESPONSE, NULL, NULL, FALSE, curbuf);
9227 # endif
9231 * Find next autocommand pattern that matches.
9233 static void
9234 auto_next_pat(apc, stop_at_last)
9235 AutoPatCmd *apc;
9236 int stop_at_last; /* stop when 'last' flag is set */
9238 AutoPat *ap;
9239 AutoCmd *cp;
9240 char_u *name;
9241 char *s;
9243 vim_free(sourcing_name);
9244 sourcing_name = NULL;
9246 for (ap = apc->curpat; ap != NULL && !got_int; ap = ap->next)
9248 apc->curpat = NULL;
9250 /* Only use a pattern when it has not been removed, has commands and
9251 * the group matches. For buffer-local autocommands only check the
9252 * buffer number. */
9253 if (ap->pat != NULL && ap->cmds != NULL
9254 && (apc->group == AUGROUP_ALL || apc->group == ap->group))
9256 /* execution-condition */
9257 if (ap->buflocal_nr == 0
9258 ? (match_file_pat(NULL, ap->reg_prog, apc->fname,
9259 apc->sfname, apc->tail, ap->allow_dirs))
9260 : ap->buflocal_nr == apc->arg_bufnr)
9262 name = event_nr2name(apc->event);
9263 s = _("%s Auto commands for \"%s\"");
9264 sourcing_name = alloc((unsigned)(STRLEN(s)
9265 + STRLEN(name) + ap->patlen + 1));
9266 if (sourcing_name != NULL)
9268 sprintf((char *)sourcing_name, s,
9269 (char *)name, (char *)ap->pat);
9270 if (p_verbose >= 8)
9272 verbose_enter();
9273 smsg((char_u *)_("Executing %s"), sourcing_name);
9274 verbose_leave();
9278 apc->curpat = ap;
9279 apc->nextcmd = ap->cmds;
9280 /* mark last command */
9281 for (cp = ap->cmds; cp->next != NULL; cp = cp->next)
9282 cp->last = FALSE;
9283 cp->last = TRUE;
9285 line_breakcheck();
9286 if (apc->curpat != NULL) /* found a match */
9287 break;
9289 if (stop_at_last && ap->last)
9290 break;
9295 * Get next autocommand command.
9296 * Called by do_cmdline() to get the next line for ":if".
9297 * Returns allocated string, or NULL for end of autocommands.
9299 static char_u *
9300 getnextac(c, cookie, indent)
9301 int c UNUSED;
9302 void *cookie;
9303 int indent UNUSED;
9305 AutoPatCmd *acp = (AutoPatCmd *)cookie;
9306 char_u *retval;
9307 AutoCmd *ac;
9309 /* Can be called again after returning the last line. */
9310 if (acp->curpat == NULL)
9311 return NULL;
9313 /* repeat until we find an autocommand to execute */
9314 for (;;)
9316 /* skip removed commands */
9317 while (acp->nextcmd != NULL && acp->nextcmd->cmd == NULL)
9318 if (acp->nextcmd->last)
9319 acp->nextcmd = NULL;
9320 else
9321 acp->nextcmd = acp->nextcmd->next;
9323 if (acp->nextcmd != NULL)
9324 break;
9326 /* at end of commands, find next pattern that matches */
9327 if (acp->curpat->last)
9328 acp->curpat = NULL;
9329 else
9330 acp->curpat = acp->curpat->next;
9331 if (acp->curpat != NULL)
9332 auto_next_pat(acp, TRUE);
9333 if (acp->curpat == NULL)
9334 return NULL;
9337 ac = acp->nextcmd;
9339 if (p_verbose >= 9)
9341 verbose_enter_scroll();
9342 smsg((char_u *)_("autocommand %s"), ac->cmd);
9343 msg_puts((char_u *)"\n"); /* don't overwrite this either */
9344 verbose_leave_scroll();
9346 retval = vim_strsave(ac->cmd);
9347 autocmd_nested = ac->nested;
9348 #ifdef FEAT_EVAL
9349 current_SID = ac->scriptID;
9350 #endif
9351 if (ac->last)
9352 acp->nextcmd = NULL;
9353 else
9354 acp->nextcmd = ac->next;
9355 return retval;
9359 * Return TRUE if there is a matching autocommand for "fname".
9360 * To account for buffer-local autocommands, function needs to know
9361 * in which buffer the file will be opened.
9364 has_autocmd(event, sfname, buf)
9365 event_T event;
9366 char_u *sfname;
9367 buf_T *buf;
9369 AutoPat *ap;
9370 char_u *fname;
9371 char_u *tail = gettail(sfname);
9372 int retval = FALSE;
9374 fname = FullName_save(sfname, FALSE);
9375 if (fname == NULL)
9376 return FALSE;
9378 #ifdef BACKSLASH_IN_FILENAME
9380 * Replace all backslashes with forward slashes. This makes the
9381 * autocommand patterns portable between Unix and MS-DOS.
9383 sfname = vim_strsave(sfname);
9384 if (sfname != NULL)
9385 forward_slash(sfname);
9386 forward_slash(fname);
9387 #endif
9389 for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
9390 if (ap->pat != NULL && ap->cmds != NULL
9391 && (ap->buflocal_nr == 0
9392 ? match_file_pat(NULL, ap->reg_prog,
9393 fname, sfname, tail, ap->allow_dirs)
9394 : buf != NULL && ap->buflocal_nr == buf->b_fnum
9397 retval = TRUE;
9398 break;
9401 vim_free(fname);
9402 #ifdef BACKSLASH_IN_FILENAME
9403 vim_free(sfname);
9404 #endif
9406 return retval;
9409 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
9411 * Function given to ExpandGeneric() to obtain the list of autocommand group
9412 * names.
9414 char_u *
9415 get_augroup_name(xp, idx)
9416 expand_T *xp UNUSED;
9417 int idx;
9419 if (idx == augroups.ga_len) /* add "END" add the end */
9420 return (char_u *)"END";
9421 if (idx >= augroups.ga_len) /* end of list */
9422 return NULL;
9423 if (AUGROUP_NAME(idx) == NULL) /* skip deleted entries */
9424 return (char_u *)"";
9425 return AUGROUP_NAME(idx); /* return a name */
9428 static int include_groups = FALSE;
9430 char_u *
9431 set_context_in_autocmd(xp, arg, doautocmd)
9432 expand_T *xp;
9433 char_u *arg;
9434 int doautocmd; /* TRUE for :doauto*, FALSE for :autocmd */
9436 char_u *p;
9437 int group;
9439 /* check for a group name, skip it if present */
9440 include_groups = FALSE;
9441 p = arg;
9442 group = au_get_grouparg(&arg);
9443 if (group == AUGROUP_ERROR)
9444 return NULL;
9445 /* If there only is a group name that's what we expand. */
9446 if (*arg == NUL && group != AUGROUP_ALL && !vim_iswhite(arg[-1]))
9448 arg = p;
9449 group = AUGROUP_ALL;
9452 /* skip over event name */
9453 for (p = arg; *p != NUL && !vim_iswhite(*p); ++p)
9454 if (*p == ',')
9455 arg = p + 1;
9456 if (*p == NUL)
9458 if (group == AUGROUP_ALL)
9459 include_groups = TRUE;
9460 xp->xp_context = EXPAND_EVENTS; /* expand event name */
9461 xp->xp_pattern = arg;
9462 return NULL;
9465 /* skip over pattern */
9466 arg = skipwhite(p);
9467 while (*arg && (!vim_iswhite(*arg) || arg[-1] == '\\'))
9468 arg++;
9469 if (*arg)
9470 return arg; /* expand (next) command */
9472 if (doautocmd)
9473 xp->xp_context = EXPAND_FILES; /* expand file names */
9474 else
9475 xp->xp_context = EXPAND_NOTHING; /* pattern is not expanded */
9476 return NULL;
9480 * Function given to ExpandGeneric() to obtain the list of event names.
9482 char_u *
9483 get_event_name(xp, idx)
9484 expand_T *xp UNUSED;
9485 int idx;
9487 if (idx < augroups.ga_len) /* First list group names, if wanted */
9489 if (!include_groups || AUGROUP_NAME(idx) == NULL)
9490 return (char_u *)""; /* skip deleted entries */
9491 return AUGROUP_NAME(idx); /* return a name */
9493 return (char_u *)event_names[idx - augroups.ga_len].name;
9496 #endif /* FEAT_CMDL_COMPL */
9499 * Return TRUE if autocmd is supported.
9502 autocmd_supported(name)
9503 char_u *name;
9505 char_u *p;
9507 return (event_name2nr(name, &p) != NUM_EVENTS);
9511 * Return TRUE if an autocommand is defined for a group, event and
9512 * pattern: The group can be omitted to accept any group. "event" and "pattern"
9513 * can be NULL to accept any event and pattern. "pattern" can be NULL to accept
9514 * any pattern. Buffer-local patterns <buffer> or <buffer=N> are accepted.
9515 * Used for:
9516 * exists("#Group") or
9517 * exists("#Group#Event") or
9518 * exists("#Group#Event#pat") or
9519 * exists("#Event") or
9520 * exists("#Event#pat")
9523 au_exists(arg)
9524 char_u *arg;
9526 char_u *arg_save;
9527 char_u *pattern = NULL;
9528 char_u *event_name;
9529 char_u *p;
9530 event_T event;
9531 AutoPat *ap;
9532 buf_T *buflocal_buf = NULL;
9533 int group;
9534 int retval = FALSE;
9536 /* Make a copy so that we can change the '#' chars to a NUL. */
9537 arg_save = vim_strsave(arg);
9538 if (arg_save == NULL)
9539 return FALSE;
9540 p = vim_strchr(arg_save, '#');
9541 if (p != NULL)
9542 *p++ = NUL;
9544 /* First, look for an autocmd group name */
9545 group = au_find_group(arg_save);
9546 if (group == AUGROUP_ERROR)
9548 /* Didn't match a group name, assume the first argument is an event. */
9549 group = AUGROUP_ALL;
9550 event_name = arg_save;
9552 else
9554 if (p == NULL)
9556 /* "Group": group name is present and it's recognized */
9557 retval = TRUE;
9558 goto theend;
9561 /* Must be "Group#Event" or "Group#Event#pat". */
9562 event_name = p;
9563 p = vim_strchr(event_name, '#');
9564 if (p != NULL)
9565 *p++ = NUL; /* "Group#Event#pat" */
9568 pattern = p; /* "pattern" is NULL when there is no pattern */
9570 /* find the index (enum) for the event name */
9571 event = event_name2nr(event_name, &p);
9573 /* return FALSE if the event name is not recognized */
9574 if (event == NUM_EVENTS)
9575 goto theend;
9577 /* Find the first autocommand for this event.
9578 * If there isn't any, return FALSE;
9579 * If there is one and no pattern given, return TRUE; */
9580 ap = first_autopat[(int)event];
9581 if (ap == NULL)
9582 goto theend;
9584 /* if pattern is "<buffer>", special handling is needed which uses curbuf */
9585 /* for pattern "<buffer=N>, fnamecmp() will work fine */
9586 if (pattern != NULL && STRICMP(pattern, "<buffer>") == 0)
9587 buflocal_buf = curbuf;
9589 /* Check if there is an autocommand with the given pattern. */
9590 for ( ; ap != NULL; ap = ap->next)
9591 /* only use a pattern when it has not been removed and has commands. */
9592 /* For buffer-local autocommands, fnamecmp() works fine. */
9593 if (ap->pat != NULL && ap->cmds != NULL
9594 && (group == AUGROUP_ALL || ap->group == group)
9595 && (pattern == NULL
9596 || (buflocal_buf == NULL
9597 ? fnamecmp(ap->pat, pattern) == 0
9598 : ap->buflocal_nr == buflocal_buf->b_fnum)))
9600 retval = TRUE;
9601 break;
9604 theend:
9605 vim_free(arg_save);
9606 return retval;
9609 #else /* FEAT_AUTOCMD */
9612 * Prepare for executing commands for (hidden) buffer "buf".
9613 * This is the non-autocommand version, it simply saves "curbuf" and sets
9614 * "curbuf" and "curwin" to match "buf".
9616 void
9617 aucmd_prepbuf(aco, buf)
9618 aco_save_T *aco; /* structure to save values in */
9619 buf_T *buf; /* new curbuf */
9621 aco->save_curbuf = curbuf;
9622 --curbuf->b_nwindows;
9623 curbuf = buf;
9624 curwin->w_buffer = buf;
9625 ++curbuf->b_nwindows;
9629 * Restore after executing commands for a (hidden) buffer.
9630 * This is the non-autocommand version.
9632 void
9633 aucmd_restbuf(aco)
9634 aco_save_T *aco; /* structure holding saved values */
9636 --curbuf->b_nwindows;
9637 curbuf = aco->save_curbuf;
9638 curwin->w_buffer = curbuf;
9639 ++curbuf->b_nwindows;
9642 #endif /* FEAT_AUTOCMD */
9645 #if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN) || defined(PROTO)
9647 * Try matching a filename with a "pattern" ("prog" is NULL), or use the
9648 * precompiled regprog "prog" ("pattern" is NULL). That avoids calling
9649 * vim_regcomp() often.
9650 * Used for autocommands and 'wildignore'.
9651 * Returns TRUE if there is a match, FALSE otherwise.
9654 match_file_pat(pattern, prog, fname, sfname, tail, allow_dirs)
9655 char_u *pattern; /* pattern to match with */
9656 regprog_T *prog; /* pre-compiled regprog or NULL */
9657 char_u *fname; /* full path of file name */
9658 char_u *sfname; /* short file name or NULL */
9659 char_u *tail; /* tail of path */
9660 int allow_dirs; /* allow matching with dir */
9662 regmatch_T regmatch;
9663 int result = FALSE;
9664 #ifdef FEAT_OSFILETYPE
9665 int no_pattern = FALSE; /* TRUE if check is filetype only */
9666 char_u *type_start;
9667 char_u c;
9668 int match = FALSE;
9669 #endif
9671 #ifdef CASE_INSENSITIVE_FILENAME
9672 regmatch.rm_ic = TRUE; /* Always ignore case */
9673 #else
9674 regmatch.rm_ic = FALSE; /* Don't ever ignore case */
9675 #endif
9676 #ifdef FEAT_OSFILETYPE
9677 if (*pattern == '<')
9679 /* There is a filetype condition specified with this pattern.
9680 * Check the filetype matches first. If not, don't bother with the
9681 * pattern (set regprog to NULL).
9682 * Always use magic for the regexp.
9685 for (type_start = pattern + 1; (c = *pattern); pattern++)
9687 if ((c == ';' || c == '>') && match == FALSE)
9689 *pattern = NUL; /* Terminate the string */
9690 match = mch_check_filetype(fname, type_start);
9691 *pattern = c; /* Restore the terminator */
9692 type_start = pattern + 1;
9694 if (c == '>')
9695 break;
9698 /* (c should never be NUL, but check anyway) */
9699 if (match == FALSE || c == NUL)
9700 regmatch.regprog = NULL; /* Doesn't match - don't check pat. */
9701 else if (*pattern == NUL)
9703 regmatch.regprog = NULL; /* Vim will try to free regprog later */
9704 no_pattern = TRUE; /* Always matches - don't check pat. */
9706 else
9707 regmatch.regprog = vim_regcomp(pattern + 1, RE_MAGIC);
9709 else
9710 #endif
9712 if (prog != NULL)
9713 regmatch.regprog = prog;
9714 else
9715 regmatch.regprog = vim_regcomp(pattern, RE_MAGIC);
9719 * Try for a match with the pattern with:
9720 * 1. the full file name, when the pattern has a '/'.
9721 * 2. the short file name, when the pattern has a '/'.
9722 * 3. the tail of the file name, when the pattern has no '/'.
9724 if (
9725 #ifdef FEAT_OSFILETYPE
9726 /* If the check is for a filetype only and we don't care
9727 * about the path then skip all the regexp stuff.
9729 no_pattern ||
9730 #endif
9731 (regmatch.regprog != NULL
9732 && ((allow_dirs
9733 && (vim_regexec(&regmatch, fname, (colnr_T)0)
9734 || (sfname != NULL
9735 && vim_regexec(&regmatch, sfname, (colnr_T)0))))
9736 || (!allow_dirs && vim_regexec(&regmatch, tail, (colnr_T)0)))))
9737 result = TRUE;
9739 if (prog == NULL)
9740 vim_free(regmatch.regprog);
9741 return result;
9743 #endif
9745 #if defined(FEAT_WILDIGN) || defined(PROTO)
9747 * Return TRUE if a file matches with a pattern in "list".
9748 * "list" is a comma-separated list of patterns, like 'wildignore'.
9749 * "sfname" is the short file name or NULL, "ffname" the long file name.
9752 match_file_list(list, sfname, ffname)
9753 char_u *list;
9754 char_u *sfname;
9755 char_u *ffname;
9757 char_u buf[100];
9758 char_u *tail;
9759 char_u *regpat;
9760 char allow_dirs;
9761 int match;
9762 char_u *p;
9764 tail = gettail(sfname);
9766 /* try all patterns in 'wildignore' */
9767 p = list;
9768 while (*p)
9770 copy_option_part(&p, buf, 100, ",");
9771 regpat = file_pat_to_reg_pat(buf, NULL, &allow_dirs, FALSE);
9772 if (regpat == NULL)
9773 break;
9774 match = match_file_pat(regpat, NULL, ffname, sfname,
9775 tail, (int)allow_dirs);
9776 vim_free(regpat);
9777 if (match)
9778 return TRUE;
9780 return FALSE;
9782 #endif
9785 * Convert the given pattern "pat" which has shell style wildcards in it, into
9786 * a regular expression, and return the result in allocated memory. If there
9787 * is a directory path separator to be matched, then TRUE is put in
9788 * allow_dirs, otherwise FALSE is put there -- webb.
9789 * Handle backslashes before special characters, like "\*" and "\ ".
9791 * If FEAT_OSFILETYPE defined then pass initial <type> through unchanged. Eg:
9792 * '<html>myfile' becomes '<html>^myfile$' -- leonard.
9794 * Returns NULL when out of memory.
9796 char_u *
9797 file_pat_to_reg_pat(pat, pat_end, allow_dirs, no_bslash)
9798 char_u *pat;
9799 char_u *pat_end; /* first char after pattern or NULL */
9800 char *allow_dirs; /* Result passed back out in here */
9801 int no_bslash UNUSED; /* Don't use a backward slash as pathsep */
9803 int size;
9804 char_u *endp;
9805 char_u *reg_pat;
9806 char_u *p;
9807 int i;
9808 int nested = 0;
9809 int add_dollar = TRUE;
9810 #ifdef FEAT_OSFILETYPE
9811 int check_length = 0;
9812 #endif
9814 if (allow_dirs != NULL)
9815 *allow_dirs = FALSE;
9816 if (pat_end == NULL)
9817 pat_end = pat + STRLEN(pat);
9819 #ifdef FEAT_OSFILETYPE
9820 /* Find out how much of the string is the filetype check */
9821 if (*pat == '<')
9823 /* Count chars until the next '>' */
9824 for (p = pat + 1; p < pat_end && *p != '>'; p++)
9826 if (p < pat_end)
9828 /* Pattern is of the form <.*>.* */
9829 check_length = p - pat + 1;
9830 if (p + 1 >= pat_end)
9832 /* The 'pattern' is a filetype check ONLY */
9833 reg_pat = (char_u *)alloc(check_length + 1);
9834 if (reg_pat != NULL)
9836 mch_memmove(reg_pat, pat, (size_t)check_length);
9837 reg_pat[check_length] = NUL;
9839 return reg_pat;
9842 /* else: there was no closing '>' - assume it was a normal pattern */
9845 pat += check_length;
9846 size = 2 + check_length;
9847 #else
9848 size = 2; /* '^' at start, '$' at end */
9849 #endif
9851 for (p = pat; p < pat_end; p++)
9853 switch (*p)
9855 case '*':
9856 case '.':
9857 case ',':
9858 case '{':
9859 case '}':
9860 case '~':
9861 size += 2; /* extra backslash */
9862 break;
9863 #ifdef BACKSLASH_IN_FILENAME
9864 case '\\':
9865 case '/':
9866 size += 4; /* could become "[\/]" */
9867 break;
9868 #endif
9869 default:
9870 size++;
9871 # ifdef FEAT_MBYTE
9872 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
9874 ++p;
9875 ++size;
9877 # endif
9878 break;
9881 reg_pat = alloc(size + 1);
9882 if (reg_pat == NULL)
9883 return NULL;
9885 #ifdef FEAT_OSFILETYPE
9886 /* Copy the type check in to the start. */
9887 if (check_length)
9888 mch_memmove(reg_pat, pat - check_length, (size_t)check_length);
9889 i = check_length;
9890 #else
9891 i = 0;
9892 #endif
9894 if (pat[0] == '*')
9895 while (pat[0] == '*' && pat < pat_end - 1)
9896 pat++;
9897 else
9898 reg_pat[i++] = '^';
9899 endp = pat_end - 1;
9900 if (*endp == '*')
9902 while (endp - pat > 0 && *endp == '*')
9903 endp--;
9904 add_dollar = FALSE;
9906 for (p = pat; *p && nested >= 0 && p <= endp; p++)
9908 switch (*p)
9910 case '*':
9911 reg_pat[i++] = '.';
9912 reg_pat[i++] = '*';
9913 while (p[1] == '*') /* "**" matches like "*" */
9914 ++p;
9915 break;
9916 case '.':
9917 #ifdef RISCOS
9918 if (allow_dirs != NULL)
9919 *allow_dirs = TRUE;
9920 /* FALLTHROUGH */
9921 #endif
9922 case '~':
9923 reg_pat[i++] = '\\';
9924 reg_pat[i++] = *p;
9925 break;
9926 case '?':
9927 #ifdef RISCOS
9928 case '#':
9929 #endif
9930 reg_pat[i++] = '.';
9931 break;
9932 case '\\':
9933 if (p[1] == NUL)
9934 break;
9935 #ifdef BACKSLASH_IN_FILENAME
9936 if (!no_bslash)
9938 /* translate:
9939 * "\x" to "\\x" e.g., "dir\file"
9940 * "\*" to "\\.*" e.g., "dir\*.c"
9941 * "\?" to "\\." e.g., "dir\??.c"
9942 * "\+" to "\+" e.g., "fileX\+.c"
9944 if ((vim_isfilec(p[1]) || p[1] == '*' || p[1] == '?')
9945 && p[1] != '+')
9947 reg_pat[i++] = '[';
9948 reg_pat[i++] = '\\';
9949 reg_pat[i++] = '/';
9950 reg_pat[i++] = ']';
9951 if (allow_dirs != NULL)
9952 *allow_dirs = TRUE;
9953 break;
9956 #endif
9957 if (*++p == '?'
9958 #ifdef BACKSLASH_IN_FILENAME
9959 && no_bslash
9960 #endif
9962 reg_pat[i++] = '?';
9963 else
9964 if (*p == ',')
9965 reg_pat[i++] = ',';
9966 else
9968 if (allow_dirs != NULL && vim_ispathsep(*p)
9969 #ifdef BACKSLASH_IN_FILENAME
9970 && (!no_bslash || *p != '\\')
9971 #endif
9973 *allow_dirs = TRUE;
9974 reg_pat[i++] = '\\';
9975 reg_pat[i++] = *p;
9977 break;
9978 #ifdef BACKSLASH_IN_FILENAME
9979 case '/':
9980 reg_pat[i++] = '[';
9981 reg_pat[i++] = '\\';
9982 reg_pat[i++] = '/';
9983 reg_pat[i++] = ']';
9984 if (allow_dirs != NULL)
9985 *allow_dirs = TRUE;
9986 break;
9987 #endif
9988 case '{':
9989 reg_pat[i++] = '\\';
9990 reg_pat[i++] = '(';
9991 nested++;
9992 break;
9993 case '}':
9994 reg_pat[i++] = '\\';
9995 reg_pat[i++] = ')';
9996 --nested;
9997 break;
9998 case ',':
9999 if (nested)
10001 reg_pat[i++] = '\\';
10002 reg_pat[i++] = '|';
10004 else
10005 reg_pat[i++] = ',';
10006 break;
10007 default:
10008 # ifdef FEAT_MBYTE
10009 if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
10010 reg_pat[i++] = *p++;
10011 else
10012 # endif
10013 if (allow_dirs != NULL && vim_ispathsep(*p))
10014 *allow_dirs = TRUE;
10015 reg_pat[i++] = *p;
10016 break;
10019 if (add_dollar)
10020 reg_pat[i++] = '$';
10021 reg_pat[i] = NUL;
10022 if (nested != 0)
10024 if (nested < 0)
10025 EMSG(_("E219: Missing {."));
10026 else
10027 EMSG(_("E220: Missing }."));
10028 vim_free(reg_pat);
10029 reg_pat = NULL;
10031 return reg_pat;