xref: /vim-8.2.3635/src/fileio.c (revision 21cf823a)
1 /* vi:set ts=8 sts=4 sw=4:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
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  */
9 
10 /*
11  * fileio.c: read from and write to a file
12  */
13 
14 #if defined(MSDOS) || defined(WIN16) || defined(WIN32) || defined(_WIN64)
15 # include <io.h>	/* for lseek(), must be before vim.h */
16 #endif
17 
18 #if defined __EMX__
19 # include <io.h>	/* for mktemp(), CJW 1997-12-03 */
20 #endif
21 
22 #include "vim.h"
23 
24 #ifdef HAVE_FCNTL_H
25 # include <fcntl.h>
26 #endif
27 
28 #ifdef __TANDEM
29 # include <limits.h>		/* for SSIZE_MAX */
30 #endif
31 
32 #if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
33 # include <utime.h>		/* for struct utimbuf */
34 #endif
35 
36 #define BUFSIZE		8192	/* size of normal write buffer */
37 #define SMBUFSIZE	256	/* size of emergency write buffer */
38 
39 #ifdef FEAT_CRYPT
40 # define CRYPT_MAGIC		"VimCrypt~01!"	/* "01" is the version nr */
41 # define CRYPT_MAGIC_LEN	12		/* must be multiple of 4! */
42 #endif
43 
44 /* Is there any system that doesn't have access()? */
45 #ifndef MACOS_CLASSIC /* Not available on MacOS 9 */
46 # define USE_MCH_ACCESS
47 #endif
48 
49 #ifdef FEAT_MBYTE
50 static char_u *next_fenc __ARGS((char_u **pp));
51 # ifdef FEAT_EVAL
52 static char_u *readfile_charconvert __ARGS((char_u *fname, char_u *fenc, int *fdp));
53 # endif
54 #endif
55 #ifdef FEAT_VIMINFO
56 static void check_marks_read __ARGS((void));
57 #endif
58 #ifdef FEAT_CRYPT
59 static char_u *check_for_cryptkey __ARGS((char_u *cryptkey, char_u *ptr, long *sizep, long *filesizep, int newfile));
60 #endif
61 #ifdef UNIX
62 static void set_file_time __ARGS((char_u *fname, time_t atime, time_t mtime));
63 #endif
64 static void msg_add_fname __ARGS((buf_T *, char_u *));
65 static int msg_add_fileformat __ARGS((int eol_type));
66 static void msg_add_lines __ARGS((int, long, long));
67 static void msg_add_eol __ARGS((void));
68 static int check_mtime __ARGS((buf_T *buf, struct stat *s));
69 static int time_differs __ARGS((long t1, long t2));
70 #ifdef FEAT_AUTOCMD
71 static int apply_autocmds_exarg __ARGS((EVENT_T event, char_u *fname, char_u *fname_io, int force, buf_T *buf, exarg_T *eap));
72 #endif
73 
74 #if defined(FEAT_CRYPT) || defined(FEAT_MBYTE)
75 # define HAS_BW_FLAGS
76 # define FIO_LATIN1	0x01	/* convert Latin1 */
77 # define FIO_UTF8	0x02	/* convert UTF-8 */
78 # define FIO_UCS2	0x04	/* convert UCS-2 */
79 # define FIO_UCS4	0x08	/* convert UCS-4 */
80 # define FIO_UTF16	0x10	/* convert UTF-16 */
81 # ifdef WIN3264
82 #  define FIO_CODEPAGE	0x20	/* convert MS-Windows codepage */
83 #  define FIO_PUT_CP(x) (((x) & 0xffff) << 16)	/* put codepage in top word */
84 #  define FIO_GET_CP(x)	(((x)>>16) & 0xffff)	/* get codepage from top word */
85 # endif
86 # ifdef MACOS_X
87 #  define FIO_MACROMAN	0x20	/* convert MacRoman */
88 # endif
89 # define FIO_ENDIAN_L	0x80	/* little endian */
90 # define FIO_ENCRYPTED	0x1000	/* encrypt written bytes */
91 # define FIO_NOCONVERT	0x2000	/* skip encoding conversion */
92 # define FIO_UCSBOM	0x4000	/* check for BOM at start of file */
93 # define FIO_ALL	-1	/* allow all formats */
94 #endif
95 
96 /* When converting, a read() or write() may leave some bytes to be converted
97  * for the next call.  The value is guessed... */
98 #define CONV_RESTLEN 30
99 
100 /* We have to guess how much a sequence of bytes may expand when converting
101  * with iconv() to be able to allocate a buffer. */
102 #define ICONV_MULT 8
103 
104 /*
105  * Structure to pass arguments from buf_write() to buf_write_bytes().
106  */
107 struct bw_info
108 {
109     int		bw_fd;		/* file descriptor */
110     char_u	*bw_buf;	/* buffer with data to be written */
111     int		bw_len;	/* lenght of data */
112 #ifdef HAS_BW_FLAGS
113     int		bw_flags;	/* FIO_ flags */
114 #endif
115 #ifdef FEAT_MBYTE
116     char_u	bw_rest[CONV_RESTLEN]; /* not converted bytes */
117     int		bw_restlen;	/* nr of bytes in bw_rest[] */
118     int		bw_first;	/* first write call */
119     char_u	*bw_conv_buf;	/* buffer for writing converted chars */
120     int		bw_conv_buflen; /* size of bw_conv_buf */
121     int		bw_conv_error;	/* set for conversion error */
122 # ifdef USE_ICONV
123     iconv_t	bw_iconv_fd;	/* descriptor for iconv() or -1 */
124 # endif
125 #endif
126 };
127 
128 static int  buf_write_bytes __ARGS((struct bw_info *ip));
129 
130 #ifdef FEAT_MBYTE
131 static int ucs2bytes __ARGS((unsigned c, char_u **pp, int flags));
132 static int same_encoding __ARGS((char_u *a, char_u *b));
133 static int get_fio_flags __ARGS((char_u *ptr));
134 static char_u *check_for_bom __ARGS((char_u *p, long size, int *lenp, int flags));
135 static int make_bom __ARGS((char_u *buf, char_u *name));
136 # ifdef WIN3264
137 static int get_win_fio_flags __ARGS((char_u *ptr));
138 # endif
139 # ifdef MACOS_X
140 static int get_mac_fio_flags __ARGS((char_u *ptr));
141 # endif
142 #endif
143 static int move_lines __ARGS((buf_T *frombuf, buf_T *tobuf));
144 
145 static linenr_T	write_no_eol_lnum = 0;	/* non-zero lnum when last line of
146 					   next binary write should not have
147 					   an end-of-line */
148 
149     void
150 filemess(buf, name, s, attr)
151     buf_T	*buf;
152     char_u	*name;
153     char_u	*s;
154     int		attr;
155 {
156     int		msg_scroll_save;
157 
158     if (msg_silent != 0)
159 	return;
160     msg_add_fname(buf, name);	    /* put file name in IObuff with quotes */
161     /* If it's extremely long, truncate it. */
162     if (STRLEN(IObuff) > IOSIZE - 80)
163 	IObuff[IOSIZE - 80] = NUL;
164     STRCAT(IObuff, s);
165     /*
166      * For the first message may have to start a new line.
167      * For further ones overwrite the previous one, reset msg_scroll before
168      * calling filemess().
169      */
170     msg_scroll_save = msg_scroll;
171     if (shortmess(SHM_OVERALL) && !exiting && p_verbose == 0)
172 	msg_scroll = FALSE;
173     if (!msg_scroll)	/* wait a bit when overwriting an error msg */
174 	check_for_delay(FALSE);
175     msg_start();
176     msg_scroll = msg_scroll_save;
177     msg_scrolled_ign = TRUE;
178     /* may truncate the message to avoid a hit-return prompt */
179     msg_outtrans_attr(msg_may_trunc(FALSE, IObuff), attr);
180     msg_clr_eos();
181     out_flush();
182     msg_scrolled_ign = FALSE;
183 }
184 
185 /*
186  * Read lines from file "fname" into the buffer after line "from".
187  *
188  * 1. We allocate blocks with lalloc, as big as possible.
189  * 2. Each block is filled with characters from the file with a single read().
190  * 3. The lines are inserted in the buffer with ml_append().
191  *
192  * (caller must check that fname != NULL, unless READ_STDIN is used)
193  *
194  * "lines_to_skip" is the number of lines that must be skipped
195  * "lines_to_read" is the number of lines that are appended
196  * When not recovering lines_to_skip is 0 and lines_to_read MAXLNUM.
197  *
198  * flags:
199  * READ_NEW	starting to edit a new buffer
200  * READ_FILTER	reading filter output
201  * READ_STDIN	read from stdin instead of a file
202  * READ_BUFFER	read from curbuf instead of a file (converting after reading
203  *		stdin)
204  * READ_DUMMY	read into a dummy buffer (to check if file contents changed)
205  *
206  * return FAIL for failure, OK otherwise
207  */
208     int
209 readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags)
210     char_u	*fname;
211     char_u	*sfname;
212     linenr_T	from;
213     linenr_T	lines_to_skip;
214     linenr_T	lines_to_read;
215     exarg_T	*eap;			/* can be NULL! */
216     int		flags;
217 {
218     int		fd = 0;
219     int		newfile = (flags & READ_NEW);
220     int		check_readonly;
221     int		filtering = (flags & READ_FILTER);
222     int		read_stdin = (flags & READ_STDIN);
223     int		read_buffer = (flags & READ_BUFFER);
224     linenr_T	read_buf_lnum = 1;	/* next line to read from curbuf */
225     colnr_T	read_buf_col = 0;	/* next char to read from this line */
226     char_u	c;
227     linenr_T	lnum = from;
228     char_u	*ptr = NULL;		/* pointer into read buffer */
229     char_u	*buffer = NULL;		/* read buffer */
230     char_u	*new_buffer = NULL;	/* init to shut up gcc */
231     char_u	*line_start = NULL;	/* init to shut up gcc */
232     int		wasempty;		/* buffer was empty before reading */
233     colnr_T	len;
234     long	size = 0;
235     char_u	*p;
236     long	filesize = 0;
237     int		skip_read = FALSE;
238 #ifdef FEAT_CRYPT
239     char_u	*cryptkey = NULL;
240 #endif
241     int		split = 0;		/* number of split lines */
242 #define UNKNOWN	 0x0fffffff		/* file size is unknown */
243     linenr_T	linecnt;
244     int		error = FALSE;		/* errors encountered */
245     int		ff_error = EOL_UNKNOWN; /* file format with errors */
246     long	linerest = 0;		/* remaining chars in line */
247 #ifdef UNIX
248     int		perm = 0;
249     int		swap_mode = -1;		/* protection bits for swap file */
250 #else
251     int		perm;
252 #endif
253     int		fileformat = 0;		/* end-of-line format */
254     int		keep_fileformat = FALSE;
255     struct stat	st;
256     int		file_readonly;
257     linenr_T	skip_count = 0;
258     linenr_T	read_count = 0;
259     int		msg_save = msg_scroll;
260     linenr_T	read_no_eol_lnum = 0;   /* non-zero lnum when last line of
261 					 * last read was missing the eol */
262     int		try_mac = (vim_strchr(p_ffs, 'm') != NULL);
263     int		try_dos = (vim_strchr(p_ffs, 'd') != NULL);
264     int		try_unix = (vim_strchr(p_ffs, 'x') != NULL);
265     int		file_rewind = FALSE;
266 #ifdef FEAT_MBYTE
267     int		can_retry;
268     int		conv_error = FALSE;	/* conversion error detected */
269     int		keep_dest_enc = FALSE;	/* don't retry when char doesn't fit
270 					   in destination encoding */
271     linenr_T	illegal_byte = 0;	/* line nr with illegal byte */
272     char_u	*tmpname = NULL;	/* name of 'charconvert' output file */
273     int		fio_flags = 0;
274     char_u	*fenc;			/* fileencoding to use */
275     int		fenc_alloced;		/* fenc_next is in allocated memory */
276     char_u	*fenc_next = NULL;	/* next item in 'fencs' or NULL */
277     int		advance_fenc = FALSE;
278     long	real_size = 0;
279 # ifdef USE_ICONV
280     iconv_t	iconv_fd = (iconv_t)-1;	/* descriptor for iconv() or -1 */
281 #  ifdef FEAT_EVAL
282     int		did_iconv = FALSE;	/* TRUE when iconv() failed and trying
283 					   'charconvert' next */
284 #  endif
285 # endif
286     int		converted = FALSE;	/* TRUE if conversion done */
287     int		notconverted = FALSE;	/* TRUE if conversion wanted but it
288 					   wasn't possible */
289     char_u	conv_rest[CONV_RESTLEN];
290     int		conv_restlen = 0;	/* nr of bytes in conv_rest[] */
291 #endif
292 
293 #ifdef FEAT_AUTOCMD
294     write_no_eol_lnum = 0;	/* in case it was set by the previous read */
295 #endif
296 
297     /*
298      * If there is no file name yet, use the one for the read file.
299      * BF_NOTEDITED is set to reflect this.
300      * Don't do this for a read from a filter.
301      * Only do this when 'cpoptions' contains the 'f' flag.
302      */
303     if (curbuf->b_ffname == NULL
304 	    && !filtering
305 	    && fname != NULL
306 	    && vim_strchr(p_cpo, CPO_FNAMER) != NULL
307 	    && !(flags & READ_DUMMY))
308     {
309 	if (setfname(curbuf, fname, sfname, FALSE) == OK)
310 	    curbuf->b_flags |= BF_NOTEDITED;
311     }
312 
313     /*
314      * For Unix: Use the short file name whenever possible.
315      * Avoids problems with networks and when directory names are changed.
316      * Don't do this for MS-DOS, a "cd" in a sub-shell may have moved us to
317      * another directory, which we don't detect.
318      */
319     if (sfname == NULL)
320 	sfname = fname;
321 #if defined(UNIX) || defined(__EMX__)
322     fname = sfname;
323 #endif
324 
325 #ifdef FEAT_AUTOCMD
326     /*
327      * The BufReadCmd and FileReadCmd events intercept the reading process by
328      * executing the associated commands instead.
329      */
330     if (!filtering && !read_stdin && !read_buffer)
331     {
332 	pos_T	    pos;
333 
334 	pos = curbuf->b_op_start;
335 
336 	/* Set '[ mark to the line above where the lines go (line 1 if zero). */
337 	curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
338 	curbuf->b_op_start.col = 0;
339 
340 	if (newfile)
341 	{
342 	    if (apply_autocmds_exarg(EVENT_BUFREADCMD, NULL, sfname,
343 							  FALSE, curbuf, eap))
344 #ifdef FEAT_EVAL
345 		return aborting() ? FAIL : OK;
346 #else
347 		return OK;
348 #endif
349 	}
350 	else if (apply_autocmds_exarg(EVENT_FILEREADCMD, sfname, sfname,
351 							    FALSE, NULL, eap))
352 #ifdef FEAT_EVAL
353 	    return aborting() ? FAIL : OK;
354 #else
355 	    return OK;
356 #endif
357 
358 	curbuf->b_op_start = pos;
359     }
360 #endif
361 
362     if ((shortmess(SHM_OVER) || curbuf->b_help) && p_verbose == 0)
363 	msg_scroll = FALSE;	/* overwrite previous file message */
364     else
365 	msg_scroll = TRUE;	/* don't overwrite previous file message */
366 
367     /*
368      * If the name ends in a path separator, we can't open it.  Check here,
369      * because reading the file may actually work, but then creating the swap
370      * file may destroy it!  Reported on MS-DOS and Win 95.
371      * If the name is too long we might crash further on, quit here.
372      */
373     if (fname != NULL
374 	    && *fname != NUL
375 	    && (vim_ispathsep(*(fname + STRLEN(fname) - 1))
376 		|| STRLEN(fname) >= MAXPATHL))
377     {
378 	filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0);
379 	msg_end();
380 	msg_scroll = msg_save;
381 	return FAIL;
382     }
383 
384 #ifdef UNIX
385     /*
386      * On Unix it is possible to read a directory, so we have to
387      * check for it before the mch_open().
388      */
389     if (!read_stdin && !read_buffer)
390     {
391 	perm = mch_getperm(fname);
392 	if (perm >= 0 && !S_ISREG(perm)		    /* not a regular file ... */
393 # ifdef S_ISFIFO
394 		      && !S_ISFIFO(perm)	    /* ... or fifo */
395 # endif
396 # ifdef S_ISSOCK
397 		      && !S_ISSOCK(perm)	    /* ... or socket */
398 # endif
399 						)
400 	{
401 	    if (S_ISDIR(perm))
402 		filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
403 	    else
404 		filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
405 	    msg_end();
406 	    msg_scroll = msg_save;
407 	    return FAIL;
408 	}
409     }
410 #endif
411 
412     /* set default 'fileformat' */
413     if (newfile)
414     {
415 	if (eap != NULL && eap->force_ff != 0)
416 	    set_fileformat(get_fileformat_force(curbuf, eap), OPT_LOCAL);
417 	else if (*p_ffs != NUL)
418 	    set_fileformat(default_fileformat(), OPT_LOCAL);
419     }
420 
421     /* set or reset 'binary' */
422     if (eap != NULL && eap->force_bin != 0)
423     {
424 	int	oldval = curbuf->b_p_bin;
425 
426 	curbuf->b_p_bin = (eap->force_bin == FORCE_BIN);
427 	set_options_bin(oldval, curbuf->b_p_bin, OPT_LOCAL);
428     }
429 
430     /*
431      * When opening a new file we take the readonly flag from the file.
432      * Default is r/w, can be set to r/o below.
433      * Don't reset it when in readonly mode
434      * Only set/reset b_p_ro when BF_CHECK_RO is set.
435      */
436     check_readonly = (newfile && (curbuf->b_flags & BF_CHECK_RO));
437     if (check_readonly && !readonlymode)    /* default: set file not readonly */
438 	curbuf->b_p_ro = FALSE;
439 
440     if (newfile && !read_stdin && !read_buffer)
441     {
442 	/* Remember time of file.
443 	 * For RISCOS, also remember the filetype.
444 	 */
445 	if (mch_stat((char *)fname, &st) >= 0)
446 	{
447 	    buf_store_time(curbuf, &st, fname);
448 	    curbuf->b_mtime_read = curbuf->b_mtime;
449 
450 #if defined(RISCOS) && defined(FEAT_OSFILETYPE)
451 	    /* Read the filetype into the buffer local filetype option. */
452 	    mch_read_filetype(fname);
453 #endif
454 #ifdef UNIX
455 	    /*
456 	     * Use the protection bits of the original file for the swap file.
457 	     * This makes it possible for others to read the name of the
458 	     * edited file from the swapfile, but only if they can read the
459 	     * edited file.
460 	     * Remove the "write" and "execute" bits for group and others
461 	     * (they must not write the swapfile).
462 	     * Add the "read" and "write" bits for the user, otherwise we may
463 	     * not be able to write to the file ourselves.
464 	     * Setting the bits is done below, after creating the swap file.
465 	     */
466 	    swap_mode = (st.st_mode & 0644) | 0600;
467 #endif
468 #ifdef FEAT_CW_EDITOR
469 	    /* Get the FSSpec on MacOS
470 	     * TODO: Update it properly when the buffer name changes
471 	     */
472 	    (void)GetFSSpecFromPath(curbuf->b_ffname, &curbuf->b_FSSpec);
473 #endif
474 #ifdef VMS
475 	    curbuf->b_fab_rfm = st.st_fab_rfm;
476 #endif
477 	}
478 	else
479 	{
480 	    curbuf->b_mtime = 0;
481 	    curbuf->b_mtime_read = 0;
482 	    curbuf->b_orig_size = 0;
483 	    curbuf->b_orig_mode = 0;
484 	}
485 
486 	/* Reset the "new file" flag.  It will be set again below when the
487 	 * file doesn't exist. */
488 	curbuf->b_flags &= ~(BF_NEW | BF_NEW_W);
489     }
490 
491 /*
492  * for UNIX: check readonly with perm and mch_access()
493  * for RISCOS: same as Unix, otherwise file gets re-datestamped!
494  * for MSDOS and Amiga: check readonly by trying to open the file for writing
495  */
496     file_readonly = FALSE;
497     if (read_stdin)
498     {
499 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
500 	/* Force binary I/O on stdin to avoid CR-LF -> LF conversion. */
501 	setmode(0, O_BINARY);
502 #endif
503     }
504     else if (!read_buffer)
505     {
506 #ifdef USE_MCH_ACCESS
507 	if (
508 # ifdef UNIX
509 	    !(perm & 0222) ||
510 # endif
511 				mch_access((char *)fname, W_OK))
512 	    file_readonly = TRUE;
513 	fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
514 #else
515 	if (!newfile
516 		|| readonlymode
517 		|| (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0)
518 	{
519 	    file_readonly = TRUE;
520 	    /* try to open ro */
521 	    fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
522 	}
523 #endif
524     }
525 
526     if (fd < 0)			    /* cannot open at all */
527     {
528 #ifndef UNIX
529 	int	isdir_f;
530 #endif
531 	msg_scroll = msg_save;
532 #ifndef UNIX
533 	/*
534 	 * On MSDOS and Amiga we can't open a directory, check here.
535 	 */
536 	isdir_f = (mch_isdir(fname));
537 	perm = mch_getperm(fname);  /* check if the file exists */
538 	if (isdir_f)
539 	{
540 	    filemess(curbuf, sfname, (char_u *)_("is a directory"), 0);
541 	    curbuf->b_p_ro = TRUE;	/* must use "w!" now */
542 	}
543 	else
544 #endif
545 	    if (newfile)
546 	    {
547 		if (perm < 0)
548 		{
549 		    /*
550 		     * Set the 'new-file' flag, so that when the file has
551 		     * been created by someone else, a ":w" will complain.
552 		     */
553 		    curbuf->b_flags |= BF_NEW;
554 
555 		    /* Create a swap file now, so that other Vims are warned
556 		     * that we are editing this file.  Don't do this for a
557 		     * "nofile" or "nowrite" buffer type. */
558 #ifdef FEAT_QUICKFIX
559 		    if (!bt_dontwrite(curbuf))
560 #endif
561 			check_need_swap(newfile);
562 		    filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
563 #ifdef FEAT_VIMINFO
564 		    /* Even though this is a new file, it might have been
565 		     * edited before and deleted.  Get the old marks. */
566 		    check_marks_read();
567 #endif
568 #ifdef FEAT_MBYTE
569 		    if (eap != NULL && eap->force_enc != 0)
570 		    {
571 			/* set forced 'fileencoding' */
572 			fenc = enc_canonize(eap->cmd + eap->force_enc);
573 			if (fenc != NULL)
574 			    set_string_option_direct((char_u *)"fenc", -1,
575 						    fenc, OPT_FREE|OPT_LOCAL);
576 			vim_free(fenc);
577 		    }
578 #endif
579 #ifdef FEAT_AUTOCMD
580 		    apply_autocmds_exarg(EVENT_BUFNEWFILE, sfname, sfname,
581 							  FALSE, curbuf, eap);
582 #endif
583 		    /* remember the current fileformat */
584 		    save_file_ff(curbuf);
585 
586 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
587 		    if (aborting())   /* autocmds may abort script processing */
588 			return FAIL;
589 #endif
590 		    return OK;	    /* a new file is not an error */
591 		}
592 		else
593 		{
594 		    filemess(curbuf, sfname,
595 				       (char_u *)_("[Permission Denied]"), 0);
596 		    curbuf->b_p_ro = TRUE;	/* must use "w!" now */
597 		}
598 	    }
599 
600 	return FAIL;
601     }
602 
603     /*
604      * Only set the 'ro' flag for readonly files the first time they are
605      * loaded.	Help files always get readonly mode
606      */
607     if ((check_readonly && file_readonly) || curbuf->b_help)
608 	curbuf->b_p_ro = TRUE;
609 
610     if (newfile)
611     {
612 	curbuf->b_p_eol = TRUE;
613 	curbuf->b_start_eol = TRUE;
614 #ifdef FEAT_MBYTE
615 	curbuf->b_p_bomb = FALSE;
616 #endif
617     }
618 
619     /* Create a swap file now, so that other Vims are warned that we are
620      * editing this file.
621      * Don't do this for a "nofile" or "nowrite" buffer type. */
622 #ifdef FEAT_QUICKFIX
623     if (!bt_dontwrite(curbuf))
624 #endif
625     {
626 	check_need_swap(newfile);
627 #ifdef UNIX
628 	/* Set swap file protection bits after creating it. */
629 	if (swap_mode > 0 && curbuf->b_ml.ml_mfp->mf_fname != NULL)
630 	    (void)mch_setperm(curbuf->b_ml.ml_mfp->mf_fname, (long)swap_mode);
631 #endif
632     }
633 
634 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
635     /* If "Quit" selected at ATTENTION dialog, don't load the file */
636     if (swap_exists_action == SEA_QUIT)
637     {
638 	if (!read_buffer && !read_stdin)
639 	    close(fd);
640 	return FAIL;
641     }
642 #endif
643 
644     ++no_wait_return;	    /* don't wait for return yet */
645 
646     /*
647      * Set '[ mark to the line above where the lines go (line 1 if zero).
648      */
649     curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
650     curbuf->b_op_start.col = 0;
651 
652 #ifdef FEAT_AUTOCMD
653     if (!read_buffer)
654     {
655 	int	m = msg_scroll;
656 	int	n = msg_scrolled;
657 	buf_T	*old_curbuf = curbuf;
658 
659 	/*
660 	 * The file must be closed again, the autocommands may want to change
661 	 * the file before reading it.
662 	 */
663 	if (!read_stdin)
664 	    close(fd);		/* ignore errors */
665 
666 	/*
667 	 * The output from the autocommands should not overwrite anything and
668 	 * should not be overwritten: Set msg_scroll, restore its value if no
669 	 * output was done.
670 	 */
671 	msg_scroll = TRUE;
672 	if (filtering)
673 	    apply_autocmds_exarg(EVENT_FILTERREADPRE, NULL, sfname,
674 							  FALSE, curbuf, eap);
675 	else if (read_stdin)
676 	    apply_autocmds_exarg(EVENT_STDINREADPRE, NULL, sfname,
677 							  FALSE, curbuf, eap);
678 	else if (newfile)
679 	    apply_autocmds_exarg(EVENT_BUFREADPRE, NULL, sfname,
680 							  FALSE, curbuf, eap);
681 	else
682 	    apply_autocmds_exarg(EVENT_FILEREADPRE, sfname, sfname,
683 							    FALSE, NULL, eap);
684 	if (msg_scrolled == n)
685 	    msg_scroll = m;
686 
687 #ifdef FEAT_EVAL
688 	if (aborting())	    /* autocmds may abort script processing */
689 	{
690 	    --no_wait_return;
691 	    msg_scroll = msg_save;
692 	    curbuf->b_p_ro = TRUE;	/* must use "w!" now */
693 	    return FAIL;
694 	}
695 #endif
696 	/*
697 	 * Don't allow the autocommands to change the current buffer.
698 	 * Try to re-open the file.
699 	 */
700 	if (!read_stdin && (curbuf != old_curbuf
701 		|| (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
702 	{
703 	    --no_wait_return;
704 	    msg_scroll = msg_save;
705 	    if (fd < 0)
706 		EMSG(_("E200: *ReadPre autocommands made the file unreadable"));
707 	    else
708 		EMSG(_("E201: *ReadPre autocommands must not change current buffer"));
709 	    curbuf->b_p_ro = TRUE;	/* must use "w!" now */
710 	    return FAIL;
711 	}
712     }
713 #endif /* FEAT_AUTOCMD */
714 
715     /* Autocommands may add lines to the file, need to check if it is empty */
716     wasempty = (curbuf->b_ml.ml_flags & ML_EMPTY);
717 
718     if (!recoverymode && !filtering && !(flags & READ_DUMMY))
719     {
720 	/*
721 	 * Show the user that we are busy reading the input.  Sometimes this
722 	 * may take a while.  When reading from stdin another program may
723 	 * still be running, don't move the cursor to the last line, unless
724 	 * always using the GUI.
725 	 */
726 	if (read_stdin)
727 	{
728 #ifndef ALWAYS_USE_GUI
729 	    mch_msg(_("Vim: Reading from stdin...\n"));
730 #endif
731 #ifdef FEAT_GUI
732 	    /* Also write a message in the GUI window, if there is one. */
733 	    if (gui.in_use && !gui.dying && !gui.starting)
734 	    {
735 		p = (char_u *)_("Reading from stdin...");
736 		gui_write(p, (int)STRLEN(p));
737 	    }
738 #endif
739 	}
740 	else if (!read_buffer)
741 	    filemess(curbuf, sfname, (char_u *)"", 0);
742     }
743 
744     msg_scroll = FALSE;			/* overwrite the file message */
745 
746     /*
747      * Set linecnt now, before the "retry" caused by a wrong guess for
748      * fileformat, and after the autocommands, which may change them.
749      */
750     linecnt = curbuf->b_ml.ml_line_count;
751 
752 #ifdef FEAT_MBYTE
753     /*
754      * Decide which 'encoding' to use first.
755      */
756     if (eap != NULL && eap->force_enc != 0)
757     {
758 	fenc = enc_canonize(eap->cmd + eap->force_enc);
759 	fenc_alloced = TRUE;
760     }
761     else if (curbuf->b_p_bin)
762     {
763 	fenc = (char_u *)"";		/* binary: don't convert */
764 	fenc_alloced = FALSE;
765     }
766     else if (curbuf->b_help)
767     {
768 	char_u	    firstline[80];
769 
770 	/* Help files are either utf-8 or latin1.  Try utf-8 first, if this
771 	 * fails it must be latin1.
772 	 * Always do this when 'encoding' is "utf-8".  Otherwise only do
773 	 * this when needed to avoid [converted] remarks all the time.
774 	 * It is needed when the first line contains non-ASCII characters.
775 	 * That is only in *.??x files. */
776 	fenc = (char_u *)"latin1";
777 	c = enc_utf8;
778 	if (!c && !read_stdin && TOLOWER_ASC(fname[STRLEN(fname) - 1]) == 'x')
779 	{
780 	    /* Read the first line (and a bit more).  Immediately rewind to
781 	     * the start of the file.  If the read() fails "len" is -1. */
782 	    len = vim_read(fd, firstline, 80);
783 	    lseek(fd, (off_t)0L, SEEK_SET);
784 	    for (p = firstline; p < firstline + len; ++p)
785 		if (*p >= 0x80)
786 		{
787 		    c = TRUE;
788 		    break;
789 		}
790 	}
791 
792 	if (c)
793 	{
794 	    fenc_next = fenc;
795 	    fenc = (char_u *)"utf-8";
796 
797 	    /* When the file is utf-8 but a character doesn't fit in
798 	     * 'encoding' don't retry.  In help text editing utf-8 bytes
799 	     * doesn't make sense. */
800 	    keep_dest_enc = TRUE;
801 	}
802 	fenc_alloced = FALSE;
803     }
804     else if (*p_fencs == NUL)
805     {
806 	fenc = curbuf->b_p_fenc;	/* use format from buffer */
807 	fenc_alloced = FALSE;
808     }
809     else
810     {
811 	fenc_next = p_fencs;		/* try items in 'fileencodings' */
812 	fenc = next_fenc(&fenc_next);
813 	fenc_alloced = TRUE;
814     }
815 #endif
816 
817     /*
818      * Jump back here to retry reading the file in different ways.
819      * Reasons to retry:
820      * - encoding conversion failed: try another one from "fenc_next"
821      * - BOM detected and fenc was set, need to setup conversion
822      * - "fileformat" check failed: try another
823      *
824      * Variables set for special retry actions:
825      * "file_rewind"	Rewind the file to start reading it again.
826      * "advance_fenc"	Advance "fenc" using "fenc_next".
827      * "skip_read"	Re-use already read bytes (BOM detected).
828      * "did_iconv"	iconv() conversion failed, try 'charconvert'.
829      * "keep_fileformat" Don't reset "fileformat".
830      *
831      * Other status indicators:
832      * "tmpname"	When != NULL did conversion with 'charconvert'.
833      *			Output file has to be deleted afterwards.
834      * "iconv_fd"	When != -1 did conversion with iconv().
835      */
836 retry:
837 
838     if (file_rewind)
839     {
840 	if (read_buffer)
841 	{
842 	    read_buf_lnum = 1;
843 	    read_buf_col = 0;
844 	}
845 	else if (read_stdin || lseek(fd, (off_t)0L, SEEK_SET) != 0)
846 	{
847 	    /* Can't rewind the file, give up. */
848 	    error = TRUE;
849 	    goto failed;
850 	}
851 	/* Delete the previously read lines. */
852 	while (lnum > from)
853 	    ml_delete(lnum--, FALSE);
854 	file_rewind = FALSE;
855 #ifdef FEAT_MBYTE
856 	if (newfile)
857 	    curbuf->b_p_bomb = FALSE;
858 	conv_error = FALSE;
859 #endif
860     }
861 
862     /*
863      * When retrying with another "fenc" and the first time "fileformat"
864      * will be reset.
865      */
866     if (keep_fileformat)
867 	keep_fileformat = FALSE;
868     else
869     {
870 	if (eap != NULL && eap->force_ff != 0)
871 	    fileformat = get_fileformat_force(curbuf, eap);
872 	else if (curbuf->b_p_bin)
873 	    fileformat = EOL_UNIX;		/* binary: use Unix format */
874 	else if (*p_ffs == NUL)
875 	    fileformat = get_fileformat(curbuf);/* use format from buffer */
876 	else
877 	    fileformat = EOL_UNKNOWN;		/* detect from file */
878     }
879 
880 #ifdef FEAT_MBYTE
881 # ifdef USE_ICONV
882     if (iconv_fd != (iconv_t)-1)
883     {
884 	/* aborted conversion with iconv(), close the descriptor */
885 	iconv_close(iconv_fd);
886 	iconv_fd = (iconv_t)-1;
887     }
888 # endif
889 
890     if (advance_fenc)
891     {
892 	/*
893 	 * Try the next entry in 'fileencodings'.
894 	 */
895 	advance_fenc = FALSE;
896 
897 	if (eap != NULL && eap->force_enc != 0)
898 	{
899 	    /* Conversion given with "++cc=" wasn't possible, read
900 	     * without conversion. */
901 	    notconverted = TRUE;
902 	    conv_error = FALSE;
903 	    if (fenc_alloced)
904 		vim_free(fenc);
905 	    fenc = (char_u *)"";
906 	    fenc_alloced = FALSE;
907 	}
908 	else
909 	{
910 	    if (fenc_alloced)
911 		vim_free(fenc);
912 	    if (fenc_next != NULL)
913 	    {
914 		fenc = next_fenc(&fenc_next);
915 		fenc_alloced = (fenc_next != NULL);
916 	    }
917 	    else
918 	    {
919 		fenc = (char_u *)"";
920 		fenc_alloced = FALSE;
921 	    }
922 	}
923 	if (tmpname != NULL)
924 	{
925 	    mch_remove(tmpname);		/* delete converted file */
926 	    vim_free(tmpname);
927 	    tmpname = NULL;
928 	}
929     }
930 
931     /*
932      * Conversion is required when the encoding of the file is different
933      * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4 (requires
934      * conversion to UTF-8).
935      */
936     fio_flags = 0;
937     converted = (*fenc != NUL && !same_encoding(p_enc, fenc));
938     if (converted || enc_unicode != 0)
939     {
940 
941 	/* "ucs-bom" means we need to check the first bytes of the file
942 	 * for a BOM. */
943 	if (STRCMP(fenc, ENC_UCSBOM) == 0)
944 	    fio_flags = FIO_UCSBOM;
945 
946 	/*
947 	 * Check if UCS-2/4 or Latin1 to UTF-8 conversion needs to be
948 	 * done.  This is handled below after read().  Prepare the
949 	 * fio_flags to avoid having to parse the string each time.
950 	 * Also check for Unicode to Latin1 conversion, because iconv()
951 	 * appears not to handle this correctly.  This works just like
952 	 * conversion to UTF-8 except how the resulting character is put in
953 	 * the buffer.
954 	 */
955 	else if (enc_utf8 || STRCMP(p_enc, "latin1") == 0)
956 	    fio_flags = get_fio_flags(fenc);
957 
958 # ifdef WIN3264
959 	/*
960 	 * Conversion from an MS-Windows codepage to UTF-8 or another codepage
961 	 * is handled with MultiByteToWideChar().
962 	 */
963 	if (fio_flags == 0)
964 	    fio_flags = get_win_fio_flags(fenc);
965 # endif
966 
967 # ifdef MACOS_X
968 	/* Conversion from Apple MacRoman to latin1 or UTF-8 */
969 	if (fio_flags == 0)
970 	    fio_flags = get_mac_fio_flags(fenc);
971 # endif
972 
973 # ifdef USE_ICONV
974 	/*
975 	 * Try using iconv() if we can't convert internally.
976 	 */
977 	if (fio_flags == 0
978 #  ifdef FEAT_EVAL
979 		&& !did_iconv
980 #  endif
981 		)
982 	    iconv_fd = (iconv_t)my_iconv_open(
983 				  enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc);
984 # endif
985 
986 # ifdef FEAT_EVAL
987 	/*
988 	 * Use the 'charconvert' expression when conversion is required
989 	 * and we can't do it internally or with iconv().
990 	 */
991 	if (fio_flags == 0 && !read_stdin && !read_buffer && *p_ccv != NUL
992 #  ifdef USE_ICONV
993 						    && iconv_fd == (iconv_t)-1
994 #  endif
995 		)
996 	{
997 #  ifdef USE_ICONV
998 	    did_iconv = FALSE;
999 #  endif
1000 	    /* Skip conversion when it's already done (retry for wrong
1001 	     * "fileformat"). */
1002 	    if (tmpname == NULL)
1003 	    {
1004 		tmpname = readfile_charconvert(fname, fenc, &fd);
1005 		if (tmpname == NULL)
1006 		{
1007 		    /* Conversion failed.  Try another one. */
1008 		    advance_fenc = TRUE;
1009 		    if (fd < 0)
1010 		    {
1011 			/* Re-opening the original file failed! */
1012 			EMSG(_("E202: Conversion made file unreadable!"));
1013 			error = TRUE;
1014 			goto failed;
1015 		    }
1016 		    goto retry;
1017 		}
1018 	    }
1019 	}
1020 	else
1021 # endif
1022 	{
1023 	    if (fio_flags == 0
1024 # ifdef USE_ICONV
1025 		    && iconv_fd == (iconv_t)-1
1026 # endif
1027 	       )
1028 	    {
1029 		/* Conversion wanted but we can't.
1030 		 * Try the next conversion in 'fileencodings' */
1031 		advance_fenc = TRUE;
1032 		goto retry;
1033 	    }
1034 	}
1035     }
1036 
1037     /* Set can_retry when it's possible to rewind the file and try with
1038      * another "fenc" value.  It's FALSE when no other "fenc" to try, reading
1039      * stdin or "fenc" was specified with "++enc=". */
1040     can_retry = (*fenc != NUL && !read_stdin
1041 				     && (eap == NULL || eap->force_enc == 0));
1042 #endif
1043 
1044     if (!skip_read)
1045     {
1046 	linerest = 0;
1047 	filesize = 0;
1048 	skip_count = lines_to_skip;
1049 	read_count = lines_to_read;
1050 #ifdef FEAT_MBYTE
1051 	conv_restlen = 0;
1052 #endif
1053     }
1054 
1055     while (!error && !got_int)
1056     {
1057 	/*
1058 	 * We allocate as much space for the file as we can get, plus
1059 	 * space for the old line plus room for one terminating NUL.
1060 	 * The amount is limited by the fact that read() only can read
1061 	 * upto max_unsigned characters (and other things).
1062 	 */
1063 #if SIZEOF_INT <= 2
1064 	if (linerest >= 0x7ff0)
1065 	{
1066 	    ++split;
1067 	    *ptr = NL;		    /* split line by inserting a NL */
1068 	    size = 1;
1069 	}
1070 	else
1071 #endif
1072 	{
1073 	    if (!skip_read)
1074 	    {
1075 #if SIZEOF_INT > 2
1076 # ifdef __TANDEM
1077 		size = SSIZE_MAX;		    /* use max I/O size, 52K */
1078 # else
1079 		size = 0x10000L;		    /* use buffer >= 64K */
1080 # endif
1081 #else
1082 		size = 0x7ff0L - linerest;	    /* limit buffer to 32K */
1083 #endif
1084 
1085 		for ( ; size >= 10; size = (long_u)size >> 1)
1086 		{
1087 		    if ((new_buffer = lalloc((long_u)(size + linerest + 1),
1088 							      FALSE)) != NULL)
1089 			break;
1090 		}
1091 		if (new_buffer == NULL)
1092 		{
1093 		    do_outofmem_msg((long_u)(size * 2 + linerest + 1));
1094 		    error = TRUE;
1095 		    break;
1096 		}
1097 		if (linerest)	/* copy characters from the previous buffer */
1098 		    mch_memmove(new_buffer, ptr - linerest, (size_t)linerest);
1099 		vim_free(buffer);
1100 		buffer = new_buffer;
1101 		ptr = buffer + linerest;
1102 		line_start = buffer;
1103 
1104 #ifdef FEAT_MBYTE
1105 		/* May need room to translate into.
1106 		 * For iconv() we don't really know the required space, use a
1107 		 * factor ICONV_MULT.
1108 		 * latin1 to utf-8: 1 byte becomes up to 2 bytes
1109 		 * utf-16 to utf-8: 2 bytes become up to 3 bytes, 4 bytes
1110 		 * become up to 4 bytes, size must be multiple of 2
1111 		 * ucs-2 to utf-8: 2 bytes become up to 3 bytes, size must be
1112 		 * multiple of 2
1113 		 * ucs-4 to utf-8: 4 bytes become up to 6 bytes, size must be
1114 		 * multiple of 4 */
1115 		real_size = size;
1116 # ifdef USE_ICONV
1117 		if (iconv_fd != (iconv_t)-1)
1118 		    size = size / ICONV_MULT;
1119 		else
1120 # endif
1121 		    if (fio_flags & FIO_LATIN1)
1122 		    size = size / 2;
1123 		else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1124 		    size = (size * 2 / 3) & ~1;
1125 		else if (fio_flags & FIO_UCS4)
1126 		    size = (size * 2 / 3) & ~3;
1127 		else if (fio_flags == FIO_UCSBOM)
1128 		    size = size / ICONV_MULT;	/* worst case */
1129 # ifdef WIN3264
1130 		else if (fio_flags & FIO_CODEPAGE)
1131 		    size = size / ICONV_MULT;	/* also worst case */
1132 # endif
1133 # ifdef MACOS_X
1134 		else if (fio_flags & FIO_MACROMAN)
1135 		    size = size / ICONV_MULT;	/* also worst case */
1136 # endif
1137 #endif
1138 
1139 #ifdef FEAT_MBYTE
1140 		if (conv_restlen > 0)
1141 		{
1142 		    /* Insert unconverted bytes from previous line. */
1143 		    mch_memmove(ptr, conv_rest, conv_restlen);
1144 		    ptr += conv_restlen;
1145 		    size -= conv_restlen;
1146 		}
1147 #endif
1148 
1149 		if (read_buffer)
1150 		{
1151 		    /*
1152 		     * Read bytes from curbuf.  Used for converting text read
1153 		     * from stdin.
1154 		     */
1155 		    if (read_buf_lnum > from)
1156 			size = 0;
1157 		    else
1158 		    {
1159 			int	n, ni;
1160 			long	tlen;
1161 
1162 			tlen = 0;
1163 			for (;;)
1164 			{
1165 			    p = ml_get(read_buf_lnum) + read_buf_col;
1166 			    n = (int)STRLEN(p);
1167 			    if ((int)tlen + n + 1 > size)
1168 			    {
1169 				/* Filled up to "size", append partial line.
1170 				 * Change NL to NUL to reverse the effect done
1171 				 * below. */
1172 				n = size - tlen;
1173 				for (ni = 0; ni < n; ++ni)
1174 				{
1175 				    if (p[ni] == NL)
1176 					ptr[tlen++] = NUL;
1177 				    else
1178 					ptr[tlen++] = p[ni];
1179 				}
1180 				read_buf_col += n;
1181 				break;
1182 			    }
1183 			    else
1184 			    {
1185 				/* Append whole line and new-line.  Change NL
1186 				 * to NUL to reverse the effect done below. */
1187 				for (ni = 0; ni < n; ++ni)
1188 				{
1189 				    if (p[ni] == NL)
1190 					ptr[tlen++] = NUL;
1191 				    else
1192 					ptr[tlen++] = p[ni];
1193 				}
1194 				ptr[tlen++] = NL;
1195 				read_buf_col = 0;
1196 				if (++read_buf_lnum > from)
1197 				{
1198 				    /* When the last line didn't have an
1199 				     * end-of-line don't add it now either. */
1200 				    if (!curbuf->b_p_eol)
1201 					--tlen;
1202 				    size = tlen;
1203 				    break;
1204 				}
1205 			    }
1206 			}
1207 		    }
1208 		}
1209 		else
1210 		{
1211 		    /*
1212 		     * Read bytes from the file.
1213 		     */
1214 		    size = vim_read(fd, ptr, size);
1215 		}
1216 
1217 		if (size <= 0)
1218 		{
1219 		    if (size < 0)		    /* read error */
1220 			error = TRUE;
1221 #ifdef FEAT_MBYTE
1222 		    else if (conv_restlen > 0)
1223 			/* some trailing bytes unconverted */
1224 			conv_error = TRUE;
1225 #endif
1226 		}
1227 
1228 #ifdef FEAT_CRYPT
1229 		/*
1230 		 * At start of file: Check for magic number of encryption.
1231 		 */
1232 		if (filesize == 0)
1233 		    cryptkey = check_for_cryptkey(cryptkey, ptr, &size,
1234 							  &filesize, newfile);
1235 		/*
1236 		 * Decrypt the read bytes.
1237 		 */
1238 		if (cryptkey != NULL && size > 0)
1239 		    for (p = ptr; p < ptr + size; ++p)
1240 			ZDECODE(*p);
1241 #endif
1242 	    }
1243 	    skip_read = FALSE;
1244 
1245 #ifdef FEAT_MBYTE
1246 	    /*
1247 	     * At start of file (or after crypt magic number): Check for BOM.
1248 	     * Also check for a BOM for other Unicode encodings, but not after
1249 	     * converting with 'charconvert' or when a BOM has already been
1250 	     * found.
1251 	     */
1252 	    if ((filesize == 0
1253 # ifdef FEAT_CRYPT
1254 			|| (filesize == CRYPT_MAGIC_LEN && cryptkey != NULL)
1255 # endif
1256 		       )
1257 		    && (fio_flags == FIO_UCSBOM
1258 			|| (!curbuf->b_p_bomb
1259 			    && tmpname == NULL
1260 			    && (*fenc == 'u' || (*fenc == NUL && enc_utf8)))))
1261 	    {
1262 		char_u	*ccname;
1263 		int	blen;
1264 
1265 		/* no BOM detection in a short file or in binary mode */
1266 		if (size < 2 || curbuf->b_p_bin)
1267 		    ccname = NULL;
1268 		else
1269 		    ccname = check_for_bom(ptr, size, &blen,
1270 		      fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags(fenc));
1271 		if (ccname != NULL)
1272 		{
1273 		    /* Remove BOM from the text */
1274 		    filesize += blen;
1275 		    size -= blen;
1276 		    mch_memmove(ptr, ptr + blen, (size_t)size);
1277 		    if (newfile)
1278 			curbuf->b_p_bomb = TRUE;
1279 		}
1280 
1281 		if (fio_flags == FIO_UCSBOM)
1282 		{
1283 		    if (ccname == NULL)
1284 		    {
1285 			/* No BOM detected: retry with next encoding. */
1286 			advance_fenc = TRUE;
1287 		    }
1288 		    else
1289 		    {
1290 			/* BOM detected: set "fenc" and jump back */
1291 			if (fenc_alloced)
1292 			    vim_free(fenc);
1293 			fenc = ccname;
1294 			fenc_alloced = FALSE;
1295 		    }
1296 		    /* retry reading without getting new bytes or rewinding */
1297 		    skip_read = TRUE;
1298 		    goto retry;
1299 		}
1300 	    }
1301 #endif
1302 	    /*
1303 	     * Break here for a read error or end-of-file.
1304 	     */
1305 	    if (size <= 0)
1306 		break;
1307 
1308 #ifdef FEAT_MBYTE
1309 
1310 	    /* Include not converted bytes. */
1311 	    ptr -= conv_restlen;
1312 	    size += conv_restlen;
1313 	    conv_restlen = 0;
1314 
1315 # ifdef USE_ICONV
1316 	    if (iconv_fd != (iconv_t)-1)
1317 	    {
1318 		/*
1319 		 * Attempt conversion of the read bytes to 'encoding' using
1320 		 * iconv().
1321 		 */
1322 		const char	*fromp;
1323 		char		*top;
1324 		size_t		from_size;
1325 		size_t		to_size;
1326 
1327 		fromp = (char *)ptr;
1328 		from_size = size;
1329 		ptr += size;
1330 		top = (char *)ptr;
1331 		to_size = real_size - size;
1332 
1333 		/*
1334 		 * If there is conversion error or not enough room try using
1335 		 * another conversion.
1336 		 */
1337 		if ((iconv(iconv_fd, (void *)&fromp, &from_size, &top, &to_size)
1338 			    == (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
1339 						  || from_size > CONV_RESTLEN)
1340 		    goto rewind_retry;
1341 
1342 		if (from_size > 0)
1343 		{
1344 		    /* Some remaining characters, keep them for the next
1345 		     * round. */
1346 		    mch_memmove(conv_rest, (char_u *)fromp, from_size);
1347 		    conv_restlen = (int)from_size;
1348 		}
1349 
1350 		/* move the linerest to before the converted characters */
1351 		line_start = ptr - linerest;
1352 		mch_memmove(line_start, buffer, (size_t)linerest);
1353 		size = (long)((char_u *)top - ptr);
1354 	    }
1355 # endif
1356 
1357 # ifdef WIN3264
1358 	    if (fio_flags & FIO_CODEPAGE)
1359 	    {
1360 		/*
1361 		 * Conversion from an MS-Windows codepage or UTF-8 to UTF-8 or
1362 		 * a codepage, using standard MS-Windows functions.
1363 		 * 1. find out how many ucs-2 characters there are.
1364 		 * 2. convert from 'fileencoding' to ucs-2
1365 		 * 3. convert from ucs-2 to 'encoding'
1366 		 */
1367 		char_u	*ucsp;
1368 		size_t	from_size = size;
1369 		int	needed;
1370 		char_u	*p;
1371 		int	u8c;
1372 
1373 		/*
1374 		 * 1. find out how many ucs-2 characters there are.
1375 		 */
1376 #  ifdef CP_UTF8	/* VC 4.1 doesn't define CP_UTF8 */
1377 		if (FIO_GET_CP(fio_flags) == CP_UTF8)
1378 		{
1379 		    int		l, flen;
1380 
1381 		    /* Handle CP_UTF8 ourselves to be able to handle trailing
1382 		     * bytes properly.  First find out the number of
1383 		     * characters and check for trailing bytes. */
1384 		    needed = 0;
1385 		    p = ptr;
1386 		    for (flen = from_size; flen > 0; flen -= l)
1387 		    {
1388 			l = utf_ptr2len_check_len(p, flen);
1389 			if (l > flen)			/* incomplete char */
1390 			{
1391 			    if (l > CONV_RESTLEN)
1392 				/* weird overlong byte sequence */
1393 				goto rewind_retry;
1394 			    mch_memmove(conv_rest, p, flen);
1395 			    conv_restlen = flen;
1396 			    from_size -= flen;
1397 			    break;
1398 			}
1399 			if (l == 1 && *p >= 0x80)	/* illegal byte */
1400 			    goto rewind_retry;
1401 			++needed;
1402 			p += l;
1403 		    }
1404 		}
1405 		else
1406 #  endif
1407 		{
1408 		    /* We can't tell if the last byte of an MBCS string is
1409 		     * valid and MultiByteToWideChar() returns zero if it
1410 		     * isn't.  Try the whole string, and if that fails, bump
1411 		     * the last byte into conv_rest and try again. */
1412 		    needed = MultiByteToWideChar(FIO_GET_CP(fio_flags),
1413 				 MB_ERR_INVALID_CHARS, (LPCSTR)ptr, from_size,
1414 								     NULL, 0);
1415 		    if (needed == 0)
1416 		    {
1417 			conv_rest[0] = ptr[from_size - 1];
1418 			conv_restlen = 1;
1419 			--from_size;
1420 			needed = MultiByteToWideChar(FIO_GET_CP(fio_flags),
1421 				 MB_ERR_INVALID_CHARS, (LPCSTR)ptr, from_size,
1422 								     NULL, 0);
1423 		    }
1424 
1425 		    /* If there really is a conversion error, try using another
1426 		     * conversion. */
1427 		    if (needed == 0)
1428 			goto rewind_retry;
1429 		}
1430 
1431 		/*
1432 		 * 2. convert from 'fileencoding' to ucs-2
1433 		 *
1434 		 * Put the result of conversion to UCS-2 at the end of the
1435 		 * buffer, then convert from UCS-2 to UTF-8 or "enc_codepage"
1436 		 * into the start of the buffer.  If there is not enough space
1437 		 * just fail, there is probably something wrong.
1438 		 */
1439 		ucsp = ptr + real_size - (needed * sizeof(WCHAR));
1440 		if (ucsp < ptr + size)
1441 		    goto rewind_retry;
1442 
1443 #  ifdef CP_UTF8	/* VC 4.1 doesn't define CP_UTF8 */
1444 		if (FIO_GET_CP(fio_flags) == CP_UTF8)
1445 		{
1446 		    int		l, flen;
1447 
1448 		    /* Convert from utf-8 to ucs-2. */
1449 		    needed = 0;
1450 		    p = ptr;
1451 		    for (flen = from_size; flen > 0; flen -= l)
1452 		    {
1453 			l = utf_ptr2len_check_len(p, flen);
1454 			u8c = utf_ptr2char(p);
1455 			ucsp[needed * 2] = (u8c & 0xff);
1456 			ucsp[needed * 2 + 1] = (u8c >> 8);
1457 			++needed;
1458 			p += l;
1459 		    }
1460 		}
1461 		else
1462 #  endif
1463 		    needed = MultiByteToWideChar(FIO_GET_CP(fio_flags),
1464 					    MB_ERR_INVALID_CHARS, (LPCSTR)ptr,
1465 					     from_size, (LPWSTR)ucsp, needed);
1466 
1467 		/*
1468 		 * 3. convert from ucs-2 to 'encoding'
1469 		 */
1470 		if (enc_utf8)
1471 		{
1472 		    /* From UCS-2 to UTF-8.  Cannot fail. */
1473 		    p = ptr;
1474 		    for (; needed > 0; --needed)
1475 		    {
1476 			u8c = *ucsp++;
1477 			u8c += (*ucsp++ << 8);
1478 			p += utf_char2bytes(u8c, p);
1479 		    }
1480 		    size = p - ptr;
1481 		}
1482 		else
1483 		{
1484 		    BOOL	bad = FALSE;
1485 
1486 		    /* From UCS-2 to "enc_codepage". If the conversion uses
1487 		     * the default character "?", the data doesn't fit in this
1488 		     * encoding, so fail (unless forced). */
1489 		    size = WideCharToMultiByte(enc_codepage, 0,
1490 							(LPCWSTR)ucsp, needed,
1491 					    (LPSTR)ptr, real_size, "?", &bad);
1492 		    if (bad && !keep_dest_enc)
1493 			goto rewind_retry;
1494 		}
1495 	    }
1496 	    else
1497 # endif
1498 # ifdef MACOS_X
1499 	    if (fio_flags & FIO_MACROMAN)
1500 	    {
1501 		/*
1502 		 * Conversion from Apple MacRoman char encoding to UTF-8 or
1503 		 * latin1, using standard Carbon framework.
1504 		 */
1505 		CFStringRef	cfstr;
1506 		CFRange		r;
1507 		CFIndex		len = size;
1508 
1509 		/* MacRoman is an 8-bit encoding, no need to move bytes to
1510 		 * conv_rest[]. */
1511 		cfstr = CFStringCreateWithBytes(NULL, ptr, len,
1512 						kCFStringEncodingMacRoman, 0);
1513 		/*
1514 		 * If there is a conversion error, try using another
1515 		 * conversion.
1516 		 */
1517 		if (cfstr == NULL)
1518 		    goto rewind_retry;
1519 
1520 		r.location = 0;
1521 		r.length = CFStringGetLength(cfstr);
1522 		if (r.length != CFStringGetBytes(cfstr, r,
1523 			(enc_utf8) ? kCFStringEncodingUTF8
1524 						 : kCFStringEncodingISOLatin1,
1525 			0, /* no lossy conversion */
1526 			0, /* not external representation */
1527 			ptr + size, real_size - size, &len))
1528 		{
1529 		    CFRelease(cfstr);
1530 		    goto rewind_retry;
1531 		}
1532 		CFRelease(cfstr);
1533 		mch_memmove(ptr, ptr + size, len);
1534 		size = len;
1535 	    }
1536 	    else
1537 # endif
1538 	    if (fio_flags != 0)
1539 	    {
1540 		int	u8c;
1541 		char_u	*dest;
1542 		char_u	*tail = NULL;
1543 
1544 		/*
1545 		 * "enc_utf8" set: Convert Unicode or Latin1 to UTF-8.
1546 		 * "enc_utf8" not set: Convert Unicode to Latin1.
1547 		 * Go from end to start through the buffer, because the number
1548 		 * of bytes may increase.
1549 		 * "dest" points to after where the UTF-8 bytes go, "p" points
1550 		 * to after the next character to convert.
1551 		 */
1552 		dest = ptr + real_size;
1553 		if (fio_flags == FIO_LATIN1 || fio_flags == FIO_UTF8)
1554 		{
1555 		    p = ptr + size;
1556 		    if (fio_flags == FIO_UTF8)
1557 		    {
1558 			/* Check for a trailing incomplete UTF-8 sequence */
1559 			tail = ptr + size - 1;
1560 			while (tail > ptr && (*tail & 0xc0) == 0x80)
1561 			    --tail;
1562 			if (tail + utf_byte2len(*tail) <= ptr + size)
1563 			    tail = NULL;
1564 			else
1565 			    p = tail;
1566 		    }
1567 		}
1568 		else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1569 		{
1570 		    /* Check for a trailing byte */
1571 		    p = ptr + (size & ~1);
1572 		    if (size & 1)
1573 			tail = p;
1574 		    if ((fio_flags & FIO_UTF16) && p > ptr)
1575 		    {
1576 			/* Check for a trailing leading word */
1577 			if (fio_flags & FIO_ENDIAN_L)
1578 			{
1579 			    u8c = (*--p << 8);
1580 			    u8c += *--p;
1581 			}
1582 			else
1583 			{
1584 			    u8c = *--p;
1585 			    u8c += (*--p << 8);
1586 			}
1587 			if (u8c >= 0xd800 && u8c <= 0xdbff)
1588 			    tail = p;
1589 			else
1590 			    p += 2;
1591 		    }
1592 		}
1593 		else /*  FIO_UCS4 */
1594 		{
1595 		    /* Check for trailing 1, 2 or 3 bytes */
1596 		    p = ptr + (size & ~3);
1597 		    if (size & 3)
1598 			tail = p;
1599 		}
1600 
1601 		/* If there is a trailing incomplete sequence move it to
1602 		 * conv_rest[]. */
1603 		if (tail != NULL)
1604 		{
1605 		    conv_restlen = (int)((ptr + size) - tail);
1606 		    mch_memmove(conv_rest, (char_u *)tail, conv_restlen);
1607 		    size -= conv_restlen;
1608 		}
1609 
1610 
1611 		while (p > ptr)
1612 		{
1613 		    if (fio_flags & FIO_LATIN1)
1614 			u8c = *--p;
1615 		    else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1616 		    {
1617 			if (fio_flags & FIO_ENDIAN_L)
1618 			{
1619 			    u8c = (*--p << 8);
1620 			    u8c += *--p;
1621 			}
1622 			else
1623 			{
1624 			    u8c = *--p;
1625 			    u8c += (*--p << 8);
1626 			}
1627 			if ((fio_flags & FIO_UTF16)
1628 					    && u8c >= 0xdc00 && u8c <= 0xdfff)
1629 			{
1630 			    int u16c;
1631 
1632 			    if (p == ptr)
1633 			    {
1634 				/* Missing leading word. */
1635 				if (can_retry)
1636 				    goto rewind_retry;
1637 				conv_error = TRUE;
1638 			    }
1639 
1640 			    /* found second word of double-word, get the first
1641 			     * word and compute the resulting character */
1642 			    if (fio_flags & FIO_ENDIAN_L)
1643 			    {
1644 				u16c = (*--p << 8);
1645 				u16c += *--p;
1646 			    }
1647 			    else
1648 			    {
1649 				u16c = *--p;
1650 				u16c += (*--p << 8);
1651 			    }
1652 			    /* Check if the word is indeed a leading word. */
1653 			    if (u16c < 0xd800 || u16c > 0xdbff)
1654 			    {
1655 				if (can_retry)
1656 				    goto rewind_retry;
1657 				conv_error = TRUE;
1658 			    }
1659 			    u8c = 0x10000 + ((u16c & 0x3ff) << 10)
1660 							      + (u8c & 0x3ff);
1661 			}
1662 		    }
1663 		    else if (fio_flags & FIO_UCS4)
1664 		    {
1665 			if (fio_flags & FIO_ENDIAN_L)
1666 			{
1667 			    u8c = (*--p << 24);
1668 			    u8c += (*--p << 16);
1669 			    u8c += (*--p << 8);
1670 			    u8c += *--p;
1671 			}
1672 			else	/* big endian */
1673 			{
1674 			    u8c = *--p;
1675 			    u8c += (*--p << 8);
1676 			    u8c += (*--p << 16);
1677 			    u8c += (*--p << 24);
1678 			}
1679 		    }
1680 		    else    /* UTF-8 */
1681 		    {
1682 			if (*--p < 0x80)
1683 			    u8c = *p;
1684 			else
1685 			{
1686 			    len = utf_head_off(ptr, p);
1687 			    if (len == 0)
1688 			    {
1689 				/* Not a valid UTF-8 character, retry with
1690 				 * another fenc when possible, otherwise just
1691 				 * report the error. */
1692 				if (can_retry)
1693 				    goto rewind_retry;
1694 				conv_error = TRUE;
1695 			    }
1696 			    p -= len;
1697 			    u8c = utf_ptr2char(p);
1698 			}
1699 		    }
1700 		    if (enc_utf8)	/* produce UTF-8 */
1701 		    {
1702 			dest -= utf_char2len(u8c);
1703 			(void)utf_char2bytes(u8c, dest);
1704 		    }
1705 		    else		/* produce Latin1 */
1706 		    {
1707 			--dest;
1708 			if (u8c >= 0x100)
1709 			{
1710 			    /* character doesn't fit in latin1, retry with
1711 			     * another fenc when possible, otherwise just
1712 			     * report the error. */
1713 			    if (can_retry && !keep_dest_enc)
1714 				goto rewind_retry;
1715 			    *dest = 0xBF;
1716 			    conv_error = TRUE;
1717 			}
1718 			else
1719 			    *dest = u8c;
1720 		    }
1721 		}
1722 
1723 		/* move the linerest to before the converted characters */
1724 		line_start = dest - linerest;
1725 		mch_memmove(line_start, buffer, (size_t)linerest);
1726 		size = (long)((ptr + real_size) - dest);
1727 		ptr = dest;
1728 	    }
1729 	    else if (enc_utf8 && !conv_error && !curbuf->b_p_bin)
1730 	    {
1731 		/* Reading UTF-8: Check if the bytes are valid UTF-8.
1732 		 * Need to start before "ptr" when part of the character was
1733 		 * read in the previous read() call. */
1734 		for (p = ptr - utf_head_off(buffer, ptr); p < ptr + size; ++p)
1735 		{
1736 		    if (*p >= 0x80)
1737 		    {
1738 			len = utf_ptr2len_check(p);
1739 			/* A length of 1 means it's an illegal byte.  Accept
1740 			 * an incomplete character at the end though, the next
1741 			 * read() will get the next bytes, we'll check it
1742 			 * then. */
1743 			if (len == 1)
1744 			{
1745 			    p += utf_byte2len(*p) - 1;
1746 			    break;
1747 			}
1748 			p += len - 1;
1749 		    }
1750 		}
1751 		if (p < ptr + size)
1752 		{
1753 		    /* Detected a UTF-8 error. */
1754 		    if (can_retry)
1755 		    {
1756 rewind_retry:
1757 			/* Retry reading with another conversion. */
1758 # if defined(FEAT_EVAL) && defined(USE_ICONV)
1759 			if (*p_ccv != NUL && iconv_fd != (iconv_t)-1)
1760 			    /* iconv() failed, try 'charconvert' */
1761 			    did_iconv = TRUE;
1762 			else
1763 # endif
1764 			    /* use next item from 'fileencodings' */
1765 			    advance_fenc = TRUE;
1766 			file_rewind = TRUE;
1767 			goto retry;
1768 		    }
1769 
1770 		    /* There is no alternative fenc, just report the error. */
1771 # ifdef USE_ICONV
1772 		    if (iconv_fd != (iconv_t)-1)
1773 			conv_error = TRUE;
1774 		    else
1775 # endif
1776 		    {
1777 			char_u		*s;
1778 
1779 			/* Estimate the line number. */
1780 			illegal_byte = curbuf->b_ml.ml_line_count - linecnt + 1;
1781 			for (s = ptr; s < p; ++s)
1782 			    if (*s == '\n')
1783 				++illegal_byte;
1784 		    }
1785 		}
1786 	    }
1787 #endif
1788 
1789 	    /* count the number of characters (after conversion!) */
1790 	    filesize += size;
1791 
1792 	    /*
1793 	     * when reading the first part of a file: guess EOL type
1794 	     */
1795 	    if (fileformat == EOL_UNKNOWN)
1796 	    {
1797 		/* First try finding a NL, for Dos and Unix */
1798 		if (try_dos || try_unix)
1799 		{
1800 		    for (p = ptr; p < ptr + size; ++p)
1801 		    {
1802 			if (*p == NL)
1803 			{
1804 			    if (!try_unix
1805 				    || (try_dos && p > ptr && p[-1] == CAR))
1806 				fileformat = EOL_DOS;
1807 			    else
1808 				fileformat = EOL_UNIX;
1809 			    break;
1810 			}
1811 		    }
1812 
1813 		    /* Don't give in to EOL_UNIX if EOL_MAC is more likely */
1814 		    if (fileformat == EOL_UNIX && try_mac)
1815 		    {
1816 			/* Need to reset the counters when retrying fenc. */
1817 			try_mac = 1;
1818 			try_unix = 1;
1819 			for (; p >= ptr && *p != CAR; p--)
1820 			    ;
1821 			if (p >= ptr)
1822 			{
1823 			    for (p = ptr; p < ptr + size; ++p)
1824 			    {
1825 				if (*p == NL)
1826 				    try_unix++;
1827 				else if (*p == CAR)
1828 				    try_mac++;
1829 			    }
1830 			    if (try_mac > try_unix)
1831 				fileformat = EOL_MAC;
1832 			}
1833 		    }
1834 		}
1835 
1836 		/* No NL found: may use Mac format */
1837 		if (fileformat == EOL_UNKNOWN && try_mac)
1838 		    fileformat = EOL_MAC;
1839 
1840 		/* Still nothing found?  Use first format in 'ffs' */
1841 		if (fileformat == EOL_UNKNOWN)
1842 		    fileformat = default_fileformat();
1843 
1844 		/* if editing a new file: may set p_tx and p_ff */
1845 		if (newfile)
1846 		    set_fileformat(fileformat, OPT_LOCAL);
1847 	    }
1848 	}
1849 
1850 	/*
1851 	 * This loop is executed once for every character read.
1852 	 * Keep it fast!
1853 	 */
1854 	if (fileformat == EOL_MAC)
1855 	{
1856 	    --ptr;
1857 	    while (++ptr, --size >= 0)
1858 	    {
1859 		/* catch most common case first */
1860 		if ((c = *ptr) != NUL && c != CAR && c != NL)
1861 		    continue;
1862 		if (c == NUL)
1863 		    *ptr = NL;	/* NULs are replaced by newlines! */
1864 		else if (c == NL)
1865 		    *ptr = CAR;	/* NLs are replaced by CRs! */
1866 		else
1867 		{
1868 		    if (skip_count == 0)
1869 		    {
1870 			*ptr = NUL;	    /* end of line */
1871 			len = (colnr_T) (ptr - line_start + 1);
1872 			if (ml_append(lnum, line_start, len, newfile) == FAIL)
1873 			{
1874 			    error = TRUE;
1875 			    break;
1876 			}
1877 			++lnum;
1878 			if (--read_count == 0)
1879 			{
1880 			    error = TRUE;	/* break loop */
1881 			    line_start = ptr;	/* nothing left to write */
1882 			    break;
1883 			}
1884 		    }
1885 		    else
1886 			--skip_count;
1887 		    line_start = ptr + 1;
1888 		}
1889 	    }
1890 	}
1891 	else
1892 	{
1893 	    --ptr;
1894 	    while (++ptr, --size >= 0)
1895 	    {
1896 		if ((c = *ptr) != NUL && c != NL)  /* catch most common case */
1897 		    continue;
1898 		if (c == NUL)
1899 		    *ptr = NL;	/* NULs are replaced by newlines! */
1900 		else
1901 		{
1902 		    if (skip_count == 0)
1903 		    {
1904 			*ptr = NUL;		/* end of line */
1905 			len = (colnr_T)(ptr - line_start + 1);
1906 			if (fileformat == EOL_DOS)
1907 			{
1908 			    if (ptr[-1] == CAR)	/* remove CR */
1909 			    {
1910 				ptr[-1] = NUL;
1911 				--len;
1912 			    }
1913 			    /*
1914 			     * Reading in Dos format, but no CR-LF found!
1915 			     * When 'fileformats' includes "unix", delete all
1916 			     * the lines read so far and start all over again.
1917 			     * Otherwise give an error message later.
1918 			     */
1919 			    else if (ff_error != EOL_DOS)
1920 			    {
1921 				if (   try_unix
1922 				    && !read_stdin
1923 				    && (read_buffer
1924 					|| lseek(fd, (off_t)0L, SEEK_SET) == 0))
1925 				{
1926 				    fileformat = EOL_UNIX;
1927 				    if (newfile)
1928 					set_fileformat(EOL_UNIX, OPT_LOCAL);
1929 				    file_rewind = TRUE;
1930 				    keep_fileformat = TRUE;
1931 				    goto retry;
1932 				}
1933 				ff_error = EOL_DOS;
1934 			    }
1935 			}
1936 			if (ml_append(lnum, line_start, len, newfile) == FAIL)
1937 			{
1938 			    error = TRUE;
1939 			    break;
1940 			}
1941 			++lnum;
1942 			if (--read_count == 0)
1943 			{
1944 			    error = TRUE;	    /* break loop */
1945 			    line_start = ptr;	/* nothing left to write */
1946 			    break;
1947 			}
1948 		    }
1949 		    else
1950 			--skip_count;
1951 		    line_start = ptr + 1;
1952 		}
1953 	    }
1954 	}
1955 	linerest = (long)(ptr - line_start);
1956 	ui_breakcheck();
1957     }
1958 
1959 failed:
1960     /* not an error, max. number of lines reached */
1961     if (error && read_count == 0)
1962 	error = FALSE;
1963 
1964     /*
1965      * If we get EOF in the middle of a line, note the fact and
1966      * complete the line ourselves.
1967      * In Dos format ignore a trailing CTRL-Z, unless 'binary' set.
1968      */
1969     if (!error
1970 	    && !got_int
1971 	    && linerest != 0
1972 	    && !(!curbuf->b_p_bin
1973 		&& fileformat == EOL_DOS
1974 		&& *line_start == Ctrl_Z
1975 		&& ptr == line_start + 1))
1976     {
1977 	if (newfile)			/* remember for when writing */
1978 	    curbuf->b_p_eol = FALSE;
1979 	*ptr = NUL;
1980 	if (ml_append(lnum, line_start,
1981 			(colnr_T)(ptr - line_start + 1), newfile) == FAIL)
1982 	    error = TRUE;
1983 	else
1984 	    read_no_eol_lnum = ++lnum;
1985     }
1986 
1987     if (newfile)
1988 	save_file_ff(curbuf);		/* remember the current file format */
1989 
1990 #ifdef FEAT_CRYPT
1991     if (cryptkey != curbuf->b_p_key)
1992 	vim_free(cryptkey);
1993 #endif
1994 
1995 #ifdef FEAT_MBYTE
1996     /* If editing a new file: set 'fenc' for the current buffer. */
1997     if (newfile)
1998 	set_string_option_direct((char_u *)"fenc", -1, fenc,
1999 							  OPT_FREE|OPT_LOCAL);
2000     if (fenc_alloced)
2001 	vim_free(fenc);
2002 # ifdef USE_ICONV
2003     if (iconv_fd != (iconv_t)-1)
2004     {
2005 	iconv_close(iconv_fd);
2006 	iconv_fd = (iconv_t)-1;
2007     }
2008 # endif
2009 #endif
2010 
2011     if (!read_buffer && !read_stdin)
2012 	close(fd);				/* errors are ignored */
2013     vim_free(buffer);
2014 
2015 #ifdef HAVE_DUP
2016     if (read_stdin)
2017     {
2018 	/* Use stderr for stdin, makes shell commands work. */
2019 	close(0);
2020 	dup(2);
2021     }
2022 #endif
2023 
2024 #ifdef FEAT_MBYTE
2025     if (tmpname != NULL)
2026     {
2027 	mch_remove(tmpname);		/* delete converted file */
2028 	vim_free(tmpname);
2029     }
2030 #endif
2031     --no_wait_return;			/* may wait for return now */
2032 
2033     /*
2034      * In recovery mode everything but autocommands is skipped.
2035      */
2036     if (!recoverymode)
2037     {
2038 	/* need to delete the last line, which comes from the empty buffer */
2039 	if (newfile && wasempty && !(curbuf->b_ml.ml_flags & ML_EMPTY))
2040 	{
2041 #ifdef FEAT_NETBEANS_INTG
2042 	    netbeansFireChanges = 0;
2043 #endif
2044 	    ml_delete(curbuf->b_ml.ml_line_count, FALSE);
2045 #ifdef FEAT_NETBEANS_INTG
2046 	    netbeansFireChanges = 1;
2047 #endif
2048 	    --linecnt;
2049 	}
2050 	linecnt = curbuf->b_ml.ml_line_count - linecnt;
2051 	if (filesize == 0)
2052 	    linecnt = 0;
2053 	if (newfile || read_buffer)
2054 	    redraw_curbuf_later(NOT_VALID);
2055 	else if (linecnt)		/* appended at least one line */
2056 	    appended_lines_mark(from, linecnt);
2057 
2058 #ifdef FEAT_DIFF
2059 	/* After reading the text into the buffer the diff info needs to be
2060 	 * updated. */
2061 	if ((newfile || read_buffer))
2062 	    diff_invalidate();
2063 #endif
2064 #ifndef ALWAYS_USE_GUI
2065 	/*
2066 	 * If we were reading from the same terminal as where messages go,
2067 	 * the screen will have been messed up.
2068 	 * Switch on raw mode now and clear the screen.
2069 	 */
2070 	if (read_stdin)
2071 	{
2072 	    settmode(TMODE_RAW);	/* set to raw mode */
2073 	    starttermcap();
2074 	    screenclear();
2075 	}
2076 #endif
2077 
2078 	if (got_int)
2079 	{
2080 	    if (!(flags & READ_DUMMY))
2081 	    {
2082 		filemess(curbuf, sfname, (char_u *)_(e_interr), 0);
2083 		if (newfile)
2084 		    curbuf->b_p_ro = TRUE;	/* must use "w!" now */
2085 	    }
2086 	    msg_scroll = msg_save;
2087 #ifdef FEAT_VIMINFO
2088 	    check_marks_read();
2089 #endif
2090 	    return OK;		/* an interrupt isn't really an error */
2091 	}
2092 
2093 	if (!filtering && !(flags & READ_DUMMY))
2094 	{
2095 	    msg_add_fname(curbuf, sfname);   /* fname in IObuff with quotes */
2096 	    c = FALSE;
2097 
2098 #ifdef UNIX
2099 # ifdef S_ISFIFO
2100 	    if (S_ISFIFO(perm))			    /* fifo or socket */
2101 	    {
2102 		STRCAT(IObuff, _("[fifo/socket]"));
2103 		c = TRUE;
2104 	    }
2105 # else
2106 #  ifdef S_IFIFO
2107 	    if ((perm & S_IFMT) == S_IFIFO)	    /* fifo */
2108 	    {
2109 		STRCAT(IObuff, _("[fifo]"));
2110 		c = TRUE;
2111 	    }
2112 #  endif
2113 #  ifdef S_IFSOCK
2114 	    if ((perm & S_IFMT) == S_IFSOCK)	    /* or socket */
2115 	    {
2116 		STRCAT(IObuff, _("[socket]"));
2117 		c = TRUE;
2118 	    }
2119 #  endif
2120 # endif
2121 #endif
2122 	    if (curbuf->b_p_ro)
2123 	    {
2124 		STRCAT(IObuff, shortmess(SHM_RO) ? _("[RO]") : _("[readonly]"));
2125 		c = TRUE;
2126 	    }
2127 	    if (read_no_eol_lnum)
2128 	    {
2129 		msg_add_eol();
2130 		c = TRUE;
2131 	    }
2132 	    if (ff_error == EOL_DOS)
2133 	    {
2134 		STRCAT(IObuff, _("[CR missing]"));
2135 		c = TRUE;
2136 	    }
2137 	    if (ff_error == EOL_MAC)
2138 	    {
2139 		STRCAT(IObuff, _("[NL found]"));
2140 		c = TRUE;
2141 	    }
2142 	    if (split)
2143 	    {
2144 		STRCAT(IObuff, _("[long lines split]"));
2145 		c = TRUE;
2146 	    }
2147 #ifdef FEAT_MBYTE
2148 	    if (notconverted)
2149 	    {
2150 		STRCAT(IObuff, _("[NOT converted]"));
2151 		c = TRUE;
2152 	    }
2153 	    else if (converted)
2154 	    {
2155 		STRCAT(IObuff, _("[converted]"));
2156 		c = TRUE;
2157 	    }
2158 #endif
2159 #ifdef FEAT_CRYPT
2160 	    if (cryptkey != NULL)
2161 	    {
2162 		STRCAT(IObuff, _("[crypted]"));
2163 		c = TRUE;
2164 	    }
2165 #endif
2166 #ifdef FEAT_MBYTE
2167 	    if (conv_error)
2168 	    {
2169 		STRCAT(IObuff, _("[CONVERSION ERROR]"));
2170 		c = TRUE;
2171 	    }
2172 	    else if (illegal_byte > 0)
2173 	    {
2174 		sprintf((char *)IObuff + STRLEN(IObuff),
2175 			 _("[ILLEGAL BYTE in line %ld]"), (long)illegal_byte);
2176 		c = TRUE;
2177 	    }
2178 	    else
2179 #endif
2180 		if (error)
2181 	    {
2182 		STRCAT(IObuff, _("[READ ERRORS]"));
2183 		c = TRUE;
2184 	    }
2185 	    if (msg_add_fileformat(fileformat))
2186 		c = TRUE;
2187 #ifdef FEAT_CRYPT
2188 	    if (cryptkey != NULL)
2189 		msg_add_lines(c, (long)linecnt, filesize - CRYPT_MAGIC_LEN);
2190 	    else
2191 #endif
2192 		msg_add_lines(c, (long)linecnt, filesize);
2193 
2194 	    vim_free(keep_msg);
2195 	    keep_msg = NULL;
2196 	    msg_scrolled_ign = TRUE;
2197 #ifdef ALWAYS_USE_GUI
2198 	    /* Don't show the message when reading stdin, it would end up in a
2199 	     * message box (which might be shown when exiting!) */
2200 	    if (read_stdin || read_buffer)
2201 		p = msg_may_trunc(FALSE, IObuff);
2202 	    else
2203 #endif
2204 		p = msg_trunc_attr(IObuff, FALSE, 0);
2205 	    if (read_stdin || read_buffer || restart_edit != 0
2206 		    || (msg_scrolled && !need_wait_return))
2207 	    {
2208 		/* Need to repeat the message after redrawing when:
2209 		 * - When reading from stdin (the screen will be cleared next).
2210 		 * - When restart_edit is set (otherwise there will be a delay
2211 		 *   before redrawing).
2212 		 * - When the screen was scrolled but there is no wait-return
2213 		 *   prompt. */
2214 		set_keep_msg(p);
2215 		keep_msg_attr = 0;
2216 	    }
2217 	    msg_scrolled_ign = FALSE;
2218 	}
2219 
2220 	/* with errors writing the file requires ":w!" */
2221 	if (newfile && (error
2222 #ifdef FEAT_MBYTE
2223 		    || conv_error
2224 #endif
2225 		    ))
2226 	    curbuf->b_p_ro = TRUE;
2227 
2228 	u_clearline();	    /* cannot use "U" command after adding lines */
2229 
2230 	/*
2231 	 * In Ex mode: cursor at last new line.
2232 	 * Otherwise: cursor at first new line.
2233 	 */
2234 	if (exmode_active)
2235 	    curwin->w_cursor.lnum = from + linecnt;
2236 	else
2237 	    curwin->w_cursor.lnum = from + 1;
2238 	check_cursor_lnum();
2239 	beginline(BL_WHITE | BL_FIX);	    /* on first non-blank */
2240 
2241 	/*
2242 	 * Set '[ and '] marks to the newly read lines.
2243 	 */
2244 	curbuf->b_op_start.lnum = from + 1;
2245 	curbuf->b_op_start.col = 0;
2246 	curbuf->b_op_end.lnum = from + linecnt;
2247 	curbuf->b_op_end.col = 0;
2248     }
2249     msg_scroll = msg_save;
2250 
2251 #ifdef FEAT_VIMINFO
2252     /*
2253      * Get the marks before executing autocommands, so they can be used there.
2254      */
2255     check_marks_read();
2256 #endif
2257 
2258 #ifdef FEAT_AUTOCMD
2259     /*
2260      * Trick: We remember if the last line of the read didn't have
2261      * an eol for when writing it again.  This is required for
2262      * ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
2263      */
2264     write_no_eol_lnum = read_no_eol_lnum;
2265 
2266     if (!read_stdin && !read_buffer)
2267     {
2268 	int m = msg_scroll;
2269 	int n = msg_scrolled;
2270 
2271 	/* Save the fileformat now, otherwise the buffer will be considered
2272 	 * modified if the format/encoding was automatically detected. */
2273 	if (newfile)
2274 	    save_file_ff(curbuf);
2275 
2276 	/*
2277 	 * The output from the autocommands should not overwrite anything and
2278 	 * should not be overwritten: Set msg_scroll, restore its value if no
2279 	 * output was done.
2280 	 */
2281 	msg_scroll = TRUE;
2282 	if (filtering)
2283 	    apply_autocmds_exarg(EVENT_FILTERREADPOST, NULL, sfname,
2284 							  FALSE, curbuf, eap);
2285 	else if (newfile)
2286 	    apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
2287 							  FALSE, curbuf, eap);
2288 	else
2289 	    apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
2290 							    FALSE, NULL, eap);
2291 	if (msg_scrolled == n)
2292 	    msg_scroll = m;
2293 #ifdef FEAT_EVAL
2294 	if (aborting())	    /* autocmds may abort script processing */
2295 	    return FAIL;
2296 #endif
2297     }
2298 #endif
2299 
2300     if (recoverymode && error)
2301 	return FAIL;
2302     return OK;
2303 }
2304 
2305 /*
2306  * Fill "*eap" to force the 'fileencoding' and 'fileformat' to be equal to the
2307  * buffer "buf".  Used for calling readfile().
2308  * Returns OK or FAIL.
2309  */
2310     int
2311 prep_exarg(eap, buf)
2312     exarg_T	*eap;
2313     buf_T	*buf;
2314 {
2315     eap->cmd = alloc((unsigned)(STRLEN(buf->b_p_ff)
2316 #ifdef FEAT_MBYTE
2317 		+ STRLEN(buf->b_p_fenc)
2318 #endif
2319 						 + 15));
2320     if (eap->cmd == NULL)
2321 	return FAIL;
2322 
2323 #ifdef FEAT_MBYTE
2324     sprintf((char *)eap->cmd, "e ++ff=%s ++enc=%s", buf->b_p_ff, buf->b_p_fenc);
2325     eap->force_enc = 14 + (int)STRLEN(buf->b_p_ff);
2326 #else
2327     sprintf((char *)eap->cmd, "e ++ff=%s", buf->b_p_ff);
2328 #endif
2329     eap->force_ff = 7;
2330     return OK;
2331 }
2332 
2333 #ifdef FEAT_MBYTE
2334 /*
2335  * Find next fileencoding to use from 'fileencodings'.
2336  * "pp" points to fenc_next.  It's advanced to the next item.
2337  * When there are no more items, an empty string is returned and *pp is set to
2338  * NULL.
2339  * When *pp is not set to NULL, the result is in allocated memory.
2340  */
2341     static char_u *
2342 next_fenc(pp)
2343     char_u	**pp;
2344 {
2345     char_u	*p;
2346     char_u	*r;
2347 
2348     if (**pp == NUL)
2349     {
2350 	*pp = NULL;
2351 	return (char_u *)"";
2352     }
2353     p = vim_strchr(*pp, ',');
2354     if (p == NULL)
2355     {
2356 	r = enc_canonize(*pp);
2357 	*pp += STRLEN(*pp);
2358     }
2359     else
2360     {
2361 	r = vim_strnsave(*pp, (int)(p - *pp));
2362 	*pp = p + 1;
2363 	if (r != NULL)
2364 	{
2365 	    p = enc_canonize(r);
2366 	    vim_free(r);
2367 	    r = p;
2368 	}
2369     }
2370     if (r == NULL)	/* out of memory */
2371     {
2372 	r = (char_u *)"";
2373 	*pp = NULL;
2374     }
2375     return r;
2376 }
2377 
2378 # ifdef FEAT_EVAL
2379 /*
2380  * Convert a file with the 'charconvert' expression.
2381  * This closes the file which is to be read, converts it and opens the
2382  * resulting file for reading.
2383  * Returns name of the resulting converted file (the caller should delete it
2384  * after reading it).
2385  * Returns NULL if the conversion failed ("*fdp" is not set) .
2386  */
2387     static char_u *
2388 readfile_charconvert(fname, fenc, fdp)
2389     char_u	*fname;		/* name of input file */
2390     char_u	*fenc;		/* converted from */
2391     int		*fdp;		/* in/out: file descriptor of file */
2392 {
2393     char_u	*tmpname;
2394     char_u	*errmsg = NULL;
2395 
2396     tmpname = vim_tempname('r');
2397     if (tmpname == NULL)
2398 	errmsg = (char_u *)_("Can't find temp file for conversion");
2399     else
2400     {
2401 	close(*fdp);		/* close the input file, ignore errors */
2402 	*fdp = -1;
2403 	if (eval_charconvert(fenc, enc_utf8 ? (char_u *)"utf-8" : p_enc,
2404 						      fname, tmpname) == FAIL)
2405 	    errmsg = (char_u *)_("Conversion with 'charconvert' failed");
2406 	if (errmsg == NULL && (*fdp = mch_open((char *)tmpname,
2407 						  O_RDONLY | O_EXTRA, 0)) < 0)
2408 	    errmsg = (char_u *)_("can't read output of 'charconvert'");
2409     }
2410 
2411     if (errmsg != NULL)
2412     {
2413 	/* Don't use emsg(), it breaks mappings, the retry with
2414 	 * another type of conversion might still work. */
2415 	MSG(errmsg);
2416 	if (tmpname != NULL)
2417 	{
2418 	    mch_remove(tmpname);	/* delete converted file */
2419 	    vim_free(tmpname);
2420 	    tmpname = NULL;
2421 	}
2422     }
2423 
2424     /* If the input file is closed, open it (caller should check for error). */
2425     if (*fdp < 0)
2426 	*fdp = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
2427 
2428     return tmpname;
2429 }
2430 # endif
2431 
2432 #endif
2433 
2434 #ifdef FEAT_VIMINFO
2435 /*
2436  * Read marks for the current buffer from the viminfo file, when we support
2437  * buffer marks and the buffer has a name.
2438  */
2439     static void
2440 check_marks_read()
2441 {
2442     if (!curbuf->b_marks_read && get_viminfo_parameter('\'') > 0
2443 						  && curbuf->b_ffname != NULL)
2444 	read_viminfo(NULL, FALSE, TRUE, FALSE);
2445 
2446     /* Always set b_marks_read; needed when 'viminfo' is changed to include
2447      * the ' parameter after opening a buffer. */
2448     curbuf->b_marks_read = TRUE;
2449 }
2450 #endif
2451 
2452 #ifdef FEAT_CRYPT
2453 /*
2454  * Check for magic number used for encryption.
2455  * If found, the magic number is removed from ptr[*sizep] and *sizep and
2456  * *filesizep are updated.
2457  * Return the (new) encryption key, NULL for no encryption.
2458  */
2459     static char_u *
2460 check_for_cryptkey(cryptkey, ptr, sizep, filesizep, newfile)
2461     char_u	*cryptkey;	/* previous encryption key or NULL */
2462     char_u	*ptr;		/* pointer to read bytes */
2463     long	*sizep;		/* length of read bytes */
2464     long	*filesizep;	/* nr of bytes used from file */
2465     int		newfile;	/* editing a new buffer */
2466 {
2467     if (*sizep >= CRYPT_MAGIC_LEN
2468 	    && STRNCMP(ptr, CRYPT_MAGIC, CRYPT_MAGIC_LEN) == 0)
2469     {
2470 	if (cryptkey == NULL)
2471 	{
2472 	    if (*curbuf->b_p_key)
2473 		cryptkey = curbuf->b_p_key;
2474 	    else
2475 	    {
2476 		/* When newfile is TRUE, store the typed key
2477 		 * in the 'key' option and don't free it. */
2478 		cryptkey = get_crypt_key(newfile, FALSE);
2479 		/* check if empty key entered */
2480 		if (cryptkey != NULL && *cryptkey == NUL)
2481 		{
2482 		    if (cryptkey != curbuf->b_p_key)
2483 			vim_free(cryptkey);
2484 		    cryptkey = NULL;
2485 		}
2486 	    }
2487 	}
2488 
2489 	if (cryptkey != NULL)
2490 	{
2491 	    crypt_init_keys(cryptkey);
2492 
2493 	    /* Remove magic number from the text */
2494 	    *filesizep += CRYPT_MAGIC_LEN;
2495 	    *sizep -= CRYPT_MAGIC_LEN;
2496 	    mch_memmove(ptr, ptr + CRYPT_MAGIC_LEN, (size_t)*sizep);
2497 	}
2498     }
2499     /* When starting to edit a new file which does not have
2500      * encryption, clear the 'key' option, except when
2501      * starting up (called with -x argument) */
2502     else if (newfile && *curbuf->b_p_key && !starting)
2503 	set_option_value((char_u *)"key", 0L, (char_u *)"", OPT_LOCAL);
2504 
2505     return cryptkey;
2506 }
2507 #endif
2508 
2509 #ifdef UNIX
2510     static void
2511 set_file_time(fname, atime, mtime)
2512     char_u  *fname;
2513     time_t  atime;	    /* access time */
2514     time_t  mtime;	    /* modification time */
2515 {
2516 # if defined(HAVE_UTIME) && defined(HAVE_UTIME_H)
2517     struct utimbuf  buf;
2518 
2519     buf.actime	= atime;
2520     buf.modtime	= mtime;
2521     (void)utime((char *)fname, &buf);
2522 # else
2523 #  if defined(HAVE_UTIMES)
2524     struct timeval  tvp[2];
2525 
2526     tvp[0].tv_sec   = atime;
2527     tvp[0].tv_usec  = 0;
2528     tvp[1].tv_sec   = mtime;
2529     tvp[1].tv_usec  = 0;
2530 #   ifdef NeXT
2531     (void)utimes((char *)fname, tvp);
2532 #   else
2533     (void)utimes((char *)fname, (const struct timeval *)&tvp);
2534 #   endif
2535 #  endif
2536 # endif
2537 }
2538 #endif /* UNIX */
2539 
2540 /*
2541  * buf_write() - write to file 'fname' lines 'start' through 'end'
2542  *
2543  * We do our own buffering here because fwrite() is so slow.
2544  *
2545  * If forceit is true, we don't care for errors when attempting backups (jw).
2546  * In case of an error everything possible is done to restore the original file.
2547  * But when forceit is TRUE, we risk loosing it.
2548  * When reset_changed is TRUE and start == 1 and end ==
2549  * curbuf->b_ml.ml_line_count, reset curbuf->b_changed.
2550  *
2551  * This function must NOT use NameBuff (because it's called by autowrite()).
2552  *
2553  * return FAIL for failure, OK otherwise
2554  */
2555     int
2556 buf_write(buf, fname, sfname, start, end, eap, append, forceit,
2557 						      reset_changed, filtering)
2558     buf_T	    *buf;
2559     char_u	    *fname;
2560     char_u	    *sfname;
2561     linenr_T	    start, end;
2562     exarg_T	    *eap;		/* for forced 'ff' and 'fenc', can be
2563 					   NULL! */
2564     int		    append;
2565     int		    forceit;
2566     int		    reset_changed;
2567     int		    filtering;
2568 {
2569     int		    fd;
2570     char_u	    *backup = NULL;
2571     int		    backup_copy = FALSE; /* copy the original file? */
2572     int		    dobackup;
2573     char_u	    *ffname;
2574     char_u	    *wfname = NULL;	/* name of file to write to */
2575     char_u	    *s;
2576     char_u	    *ptr;
2577     char_u	    c;
2578     int		    len;
2579     linenr_T	    lnum;
2580     long	    nchars;
2581     char_u	    *errmsg = NULL;
2582     char_u	    *errnum = NULL;
2583     char_u	    *buffer;
2584     char_u	    smallbuf[SMBUFSIZE];
2585     char_u	    *backup_ext;
2586     int		    bufsize;
2587     long	    perm;		    /* file permissions */
2588     int		    retval = OK;
2589     int		    newfile = FALSE;	    /* TRUE if file doesn't exist yet */
2590     int		    msg_save = msg_scroll;
2591     int		    overwriting;	    /* TRUE if writing over original */
2592     int		    no_eol = FALSE;	    /* no end-of-line written */
2593     int		    device = FALSE;	    /* writing to a device */
2594     struct stat	    st_old;
2595     int		    prev_got_int = got_int;
2596     int		    file_readonly = FALSE;  /* overwritten file is read-only */
2597     static char	    *err_readonly = "is read-only (cannot override: \"W\" in 'cpoptions')";
2598 #if defined(UNIX) || defined(__EMX__XX)	    /*XXX fix me sometime? */
2599     int		    made_writable = FALSE;  /* 'w' bit has been set */
2600 #endif
2601 					/* writing everything */
2602     int		    whole = (start == 1 && end == buf->b_ml.ml_line_count);
2603 #ifdef FEAT_AUTOCMD
2604     linenr_T	    old_line_count = buf->b_ml.ml_line_count;
2605 #endif
2606     int		    attr;
2607     int		    fileformat;
2608     int		    write_bin;
2609     struct bw_info  write_info;		/* info for buf_write_bytes() */
2610 #ifdef FEAT_MBYTE
2611     int		    converted = FALSE;
2612     int		    notconverted = FALSE;
2613     char_u	    *fenc;		/* effective 'fileencoding' */
2614     char_u	    *fenc_tofree = NULL; /* allocated "fenc" */
2615 #endif
2616 #ifdef HAS_BW_FLAGS
2617     int		    wb_flags = 0;
2618 #endif
2619 #ifdef HAVE_ACL
2620     vim_acl_T	    acl = NULL;		/* ACL copied from original file to
2621 					   backup or new file */
2622 #endif
2623 
2624     if (fname == NULL || *fname == NUL)	/* safety check */
2625 	return FAIL;
2626 
2627     /*
2628      * Disallow writing from .exrc and .vimrc in current directory for
2629      * security reasons.
2630      */
2631     if (check_secure())
2632 	return FAIL;
2633 
2634     /* Avoid a crash for a long name. */
2635     if (STRLEN(fname) >= MAXPATHL)
2636     {
2637 	EMSG(_(e_longname));
2638 	return FAIL;
2639     }
2640 
2641 #ifdef FEAT_MBYTE
2642     /* must init bw_conv_buf and bw_iconv_fd before jumping to "fail" */
2643     write_info.bw_conv_buf = NULL;
2644     write_info.bw_conv_error = FALSE;
2645     write_info.bw_restlen = 0;
2646 # ifdef USE_ICONV
2647     write_info.bw_iconv_fd = (iconv_t)-1;
2648 # endif
2649 #endif
2650 
2651     /*
2652      * If there is no file name yet, use the one for the written file.
2653      * BF_NOTEDITED is set to reflect this (in case the write fails).
2654      * Don't do this when the write is for a filter command.
2655      * Only do this when 'cpoptions' contains the 'f' flag.
2656      */
2657     if (reset_changed
2658 	    && whole
2659 	    && buf == curbuf
2660 	    && curbuf->b_ffname == NULL
2661 	    && !filtering
2662 	    && vim_strchr(p_cpo, CPO_FNAMEW) != NULL)
2663     {
2664 #ifdef FEAT_AUTOCMD
2665 	/* It's like the unnamed buffer is deleted.... */
2666 	if (curbuf->b_p_bl)
2667 	    apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
2668 	apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
2669 #ifdef FEAT_EVAL
2670 	if (aborting())	    /* autocmds may abort script processing */
2671 	    return FAIL;
2672 #endif
2673 #endif
2674 	if (setfname(curbuf, fname, sfname, FALSE) == OK)
2675 	    curbuf->b_flags |= BF_NOTEDITED;
2676 #ifdef FEAT_AUTOCMD
2677 	/* ....and a new named one is created */
2678 	apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, curbuf);
2679 	if (curbuf->b_p_bl)
2680 	    apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, curbuf);
2681 #endif
2682     }
2683 
2684     if (sfname == NULL)
2685 	sfname = fname;
2686     /*
2687      * For Unix: Use the short file name whenever possible.
2688      * Avoids problems with networks and when directory names are changed.
2689      * Don't do this for MS-DOS, a "cd" in a sub-shell may have moved us to
2690      * another directory, which we don't detect
2691      */
2692     ffname = fname;			    /* remember full fname */
2693 #ifdef UNIX
2694     fname = sfname;
2695 #endif
2696 
2697     if (buf->b_ffname != NULL && fnamecmp(ffname, buf->b_ffname) == 0)
2698 	overwriting = TRUE;
2699     else
2700 	overwriting = FALSE;
2701 
2702     if (exiting)
2703 	settmode(TMODE_COOK);	    /* when exiting allow typahead now */
2704 
2705     ++no_wait_return;		    /* don't wait for return yet */
2706 
2707     /*
2708      * Set '[ and '] marks to the lines to be written.
2709      */
2710     buf->b_op_start.lnum = start;
2711     buf->b_op_start.col = 0;
2712     buf->b_op_end.lnum = end;
2713     buf->b_op_end.col = 0;
2714 
2715 #ifdef FEAT_AUTOCMD
2716     {
2717 	aco_save_T	aco;
2718 	int		buf_ffname = FALSE;
2719 	int		buf_sfname = FALSE;
2720 	int		buf_fname_f = FALSE;
2721 	int		buf_fname_s = FALSE;
2722 	int		did_cmd = FALSE;
2723 	int		nofile_err = FALSE;
2724 
2725 	/*
2726 	 * Apply PRE aucocommands.
2727 	 * Set curbuf to the buffer to be written.
2728 	 * Careful: The autocommands may call buf_write() recursively!
2729 	 */
2730 	if (ffname == buf->b_ffname)
2731 	    buf_ffname = TRUE;
2732 	if (sfname == buf->b_sfname)
2733 	    buf_sfname = TRUE;
2734 	if (fname == buf->b_ffname)
2735 	    buf_fname_f = TRUE;
2736 	if (fname == buf->b_sfname)
2737 	    buf_fname_s = TRUE;
2738 
2739 	/* set curwin/curbuf to buf and save a few things */
2740 	aucmd_prepbuf(&aco, buf);
2741 
2742 	if (append)
2743 	{
2744 	    if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEAPPENDCMD,
2745 					 sfname, sfname, FALSE, curbuf, eap)))
2746 	    {
2747 		if (bt_nofile(curbuf))
2748 		    nofile_err = TRUE;
2749 		else
2750 		    apply_autocmds_exarg(EVENT_FILEAPPENDPRE,
2751 					  sfname, sfname, FALSE, curbuf, eap);
2752 	    }
2753 	}
2754 	else if (filtering)
2755 	{
2756 	    apply_autocmds_exarg(EVENT_FILTERWRITEPRE,
2757 					    NULL, sfname, FALSE, curbuf, eap);
2758 	}
2759 	else if (reset_changed && whole)
2760 	{
2761 	    if (!(did_cmd = apply_autocmds_exarg(EVENT_BUFWRITECMD,
2762 					 sfname, sfname, FALSE, curbuf, eap)))
2763 	    {
2764 		if (bt_nofile(curbuf))
2765 		    nofile_err = TRUE;
2766 		else
2767 		    apply_autocmds_exarg(EVENT_BUFWRITEPRE,
2768 					  sfname, sfname, FALSE, curbuf, eap);
2769 	    }
2770 	}
2771 	else
2772 	{
2773 	    if (!(did_cmd = apply_autocmds_exarg(EVENT_FILEWRITECMD,
2774 					 sfname, sfname, FALSE, curbuf, eap)))
2775 	    {
2776 		if (bt_nofile(curbuf))
2777 		    nofile_err = TRUE;
2778 		else
2779 		    apply_autocmds_exarg(EVENT_FILEWRITEPRE,
2780 					  sfname, sfname, FALSE, curbuf, eap);
2781 	    }
2782 	}
2783 
2784 	/* restore curwin/curbuf and a few other things */
2785 	aucmd_restbuf(&aco);
2786 
2787 	/*
2788 	 * In three situations we return here and don't write the file:
2789 	 * 1. the autocommands deleted or unloaded the buffer.
2790 	 * 2. The autocommands abort script processing.
2791 	 * 3. If one of the "Cmd" autocommands was executed.
2792 	 */
2793 	if (!buf_valid(buf))
2794 	    buf = NULL;
2795 	if (buf == NULL || buf->b_ml.ml_mfp == NULL
2796 				       || did_cmd || nofile_err || aborting())
2797 	{
2798 	    --no_wait_return;
2799 	    msg_scroll = msg_save;
2800 	    if (nofile_err)
2801 		EMSG(_("E676: No matching autocommands for acwrite buffer"));
2802 
2803 	    if (aborting() || nofile_err)
2804 		/* An aborting error, interrupt or exception in the
2805 		 * autocommands. */
2806 		return FAIL;
2807 	    if (did_cmd)
2808 	    {
2809 		if (buf == NULL)
2810 		    /* The buffer was deleted.  We assume it was written
2811 		     * (can't retry anyway). */
2812 		    return OK;
2813 		if (overwriting)
2814 		{
2815 		    /* Assume the buffer was written, update the timestamp. */
2816 		    ml_timestamp(buf);
2817 		    buf->b_flags &= ~BF_WRITE_MASK;
2818 		}
2819 		if (reset_changed && buf->b_changed)
2820 		    /* Buffer still changed, the autocommands didn't work
2821 		     * properly. */
2822 		    return FAIL;
2823 		return OK;
2824 	    }
2825 #ifdef FEAT_EVAL
2826 	    if (!aborting())
2827 #endif
2828 		EMSG(_("E203: Autocommands deleted or unloaded buffer to be written"));
2829 	    return FAIL;
2830 	}
2831 
2832 	/*
2833 	 * The autocommands may have changed the number of lines in the file.
2834 	 * When writing the whole file, adjust the end.
2835 	 * When writing part of the file, assume that the autocommands only
2836 	 * changed the number of lines that are to be written (tricky!).
2837 	 */
2838 	if (buf->b_ml.ml_line_count != old_line_count)
2839 	{
2840 	    if (whole)						/* write all */
2841 		end = buf->b_ml.ml_line_count;
2842 	    else if (buf->b_ml.ml_line_count > old_line_count)	/* more lines */
2843 		end += buf->b_ml.ml_line_count - old_line_count;
2844 	    else						/* less lines */
2845 	    {
2846 		end -= old_line_count - buf->b_ml.ml_line_count;
2847 		if (end < start)
2848 		{
2849 		    --no_wait_return;
2850 		    msg_scroll = msg_save;
2851 		    EMSG(_("E204: Autocommand changed number of lines in unexpected way"));
2852 		    return FAIL;
2853 		}
2854 	    }
2855 	}
2856 
2857 	/*
2858 	 * The autocommands may have changed the name of the buffer, which may
2859 	 * be kept in fname, ffname and sfname.
2860 	 */
2861 	if (buf_ffname)
2862 	    ffname = buf->b_ffname;
2863 	if (buf_sfname)
2864 	    sfname = buf->b_sfname;
2865 	if (buf_fname_f)
2866 	    fname = buf->b_ffname;
2867 	if (buf_fname_s)
2868 	    fname = buf->b_sfname;
2869     }
2870 #endif
2871 
2872 #ifdef FEAT_NETBEANS_INTG
2873     if (usingNetbeans && isNetbeansBuffer(buf))
2874     {
2875 	if (whole)
2876 	{
2877 	    /*
2878 	     * b_changed can be 0 after an undo, but we still need to write
2879 	     * the buffer to NetBeans.
2880 	     */
2881 	    if (buf->b_changed || isNetbeansModified(buf))
2882 	    {
2883 		netbeans_save_buffer(buf);
2884 		return retval;
2885 	    }
2886 	    else
2887 	    {
2888 		errnum = (char_u *)"E656: ";
2889 		errmsg = (char_u *)_("NetBeans dissallows writes of unmodified buffers");
2890 		buffer = NULL;
2891 		goto fail;
2892 	    }
2893 	}
2894 	else
2895 	{
2896 	    errnum = (char_u *)"E657: ";
2897 	    errmsg = (char_u *)_("Partial writes disallowed for NetBeans buffers");
2898 	    buffer = NULL;
2899 	    goto fail;
2900 	}
2901     }
2902 #endif
2903 
2904     if (shortmess(SHM_OVER) && !exiting)
2905 	msg_scroll = FALSE;	    /* overwrite previous file message */
2906     else
2907 	msg_scroll = TRUE;	    /* don't overwrite previous file message */
2908     if (!filtering)
2909 	filemess(buf,
2910 #ifndef UNIX
2911 		sfname,
2912 #else
2913 		fname,
2914 #endif
2915 		    (char_u *)"", 0);	/* show that we are busy */
2916     msg_scroll = FALSE;		    /* always overwrite the file message now */
2917 
2918     buffer = alloc(BUFSIZE);
2919     if (buffer == NULL)		    /* can't allocate big buffer, use small
2920 				     * one (to be able to write when out of
2921 				     * memory) */
2922     {
2923 	buffer = smallbuf;
2924 	bufsize = SMBUFSIZE;
2925     }
2926     else
2927 	bufsize = BUFSIZE;
2928 
2929     /*
2930      * Get information about original file (if there is one).
2931      */
2932 #if defined(UNIX) && !defined(ARCHIE)
2933     st_old.st_dev = st_old.st_ino = 0;
2934     perm = -1;
2935     if (mch_stat((char *)fname, &st_old) < 0)
2936 	newfile = TRUE;
2937     else
2938     {
2939 	perm = st_old.st_mode;
2940 	if (!S_ISREG(st_old.st_mode))		/* not a file */
2941 	{
2942 	    if (S_ISDIR(st_old.st_mode))
2943 	    {
2944 		errnum = (char_u *)"E502: ";
2945 		errmsg = (char_u *)_("is a directory");
2946 		goto fail;
2947 	    }
2948 	    if (mch_nodetype(fname) != NODE_WRITABLE)
2949 	    {
2950 		errnum = (char_u *)"E503: ";
2951 		errmsg = (char_u *)_("is not a file or writable device");
2952 		goto fail;
2953 	    }
2954 	    /* It's a device of some kind (or a fifo) which we can write to
2955 	     * but for which we can't make a backup. */
2956 	    device = TRUE;
2957 	    newfile = TRUE;
2958 	    perm = -1;
2959 	}
2960     }
2961 #else /* !UNIX */
2962     /*
2963      * Check for a writable device name.
2964      */
2965     c = mch_nodetype(fname);
2966     if (c == NODE_OTHER)
2967     {
2968 	errnum = (char_u *)"E503: ";
2969 	errmsg = (char_u *)_("is not a file or writable device");
2970 	goto fail;
2971     }
2972     if (c == NODE_WRITABLE)
2973     {
2974 	device = TRUE;
2975 	newfile = TRUE;
2976 	perm = -1;
2977     }
2978     else
2979     {
2980 	perm = mch_getperm(fname);
2981 	if (perm < 0)
2982 	    newfile = TRUE;
2983 	else if (mch_isdir(fname))
2984 	{
2985 	    errnum = (char_u *)"E502: ";
2986 	    errmsg = (char_u *)_("is a directory");
2987 	    goto fail;
2988 	}
2989 	if (overwriting)
2990 	    (void)mch_stat((char *)fname, &st_old);
2991     }
2992 #endif /* !UNIX */
2993 
2994     if (!device && !newfile)
2995     {
2996 	/*
2997 	 * Check if the file is really writable (when renaming the file to
2998 	 * make a backup we won't discover it later).
2999 	 */
3000 	file_readonly = (
3001 # ifdef USE_MCH_ACCESS
3002 #  ifdef UNIX
3003 		    (perm & 0222) == 0 ||
3004 #  endif
3005 		    mch_access((char *)fname, W_OK)
3006 # else
3007 		    (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0
3008 						   ? TRUE : (close(fd), FALSE)
3009 # endif
3010 		    );
3011 	if (!forceit && file_readonly)
3012 	{
3013 	    if (vim_strchr(p_cpo, CPO_FWRITE) != NULL)
3014 	    {
3015 		errnum = (char_u *)"E504: ";
3016 		errmsg = (char_u *)_(err_readonly);
3017 	    }
3018 	    else
3019 	    {
3020 		errnum = (char_u *)"E505: ";
3021 		errmsg = (char_u *)_("is read-only (add ! to override)");
3022 	    }
3023 	    goto fail;
3024 	}
3025 
3026 	/*
3027 	 * Check if the timestamp hasn't changed since reading the file.
3028 	 */
3029 	if (overwriting)
3030 	{
3031 	    retval = check_mtime(buf, &st_old);
3032 	    if (retval == FAIL)
3033 		goto fail;
3034 	}
3035     }
3036 
3037 #ifdef HAVE_ACL
3038     /*
3039      * For systems that support ACL: get the ACL from the original file.
3040      */
3041     if (!newfile)
3042 	acl = mch_get_acl(fname);
3043 #endif
3044 
3045     /*
3046      * If 'backupskip' is not empty, don't make a backup for some files.
3047      */
3048     dobackup = (p_wb || p_bk || *p_pm != NUL);
3049 #ifdef FEAT_WILDIGN
3050     if (dobackup && *p_bsk != NUL && match_file_list(p_bsk, sfname, ffname))
3051 	dobackup = FALSE;
3052 #endif
3053 
3054     /*
3055      * Save the value of got_int and reset it.  We don't want a previous
3056      * interruption cancel writing, only hitting CTRL-C while writing should
3057      * abort it.
3058      */
3059     prev_got_int = got_int;
3060     got_int = FALSE;
3061 
3062     /* Mark the buffer as 'being saved' to prevent changed buffer warnings */
3063     buf->b_saving = TRUE;
3064 
3065     /*
3066      * If we are not appending or filtering, the file exists, and the
3067      * 'writebackup', 'backup' or 'patchmode' option is set, need a backup.
3068      * When 'patchmode' is set also make a backup when appending.
3069      *
3070      * Do not make any backup, if 'writebackup' and 'backup' are both switched
3071      * off.  This helps when editing large files on almost-full disks.
3072      */
3073     if (!(append && *p_pm == NUL) && !filtering && perm >= 0 && dobackup)
3074     {
3075 #if defined(UNIX) || defined(WIN32)
3076 	struct stat st;
3077 #endif
3078 
3079 	if ((bkc_flags & BKC_YES) || append)	/* "yes" */
3080 	    backup_copy = TRUE;
3081 #if defined(UNIX) || defined(WIN32)
3082 	else if ((bkc_flags & BKC_AUTO))	/* "auto" */
3083 	{
3084 	    int		i;
3085 
3086 # ifdef UNIX
3087 	    /*
3088 	     * Don't rename the file when:
3089 	     * - it's a hard link
3090 	     * - it's a symbolic link
3091 	     * - we don't have write permission in the directory
3092 	     * - we can't set the owner/group of the new file
3093 	     */
3094 	    if (st_old.st_nlink > 1
3095 		    || mch_lstat((char *)fname, &st) < 0
3096 		    || st.st_dev != st_old.st_dev
3097 		    || st.st_ino != st_old.st_ino)
3098 		backup_copy = TRUE;
3099 	    else
3100 # endif
3101 	    {
3102 		/*
3103 		 * Check if we can create a file and set the owner/group to
3104 		 * the ones from the original file.
3105 		 * First find a file name that doesn't exist yet (use some
3106 		 * arbitrary numbers).
3107 		 */
3108 		STRCPY(IObuff, fname);
3109 		for (i = 4913; ; i += 123)
3110 		{
3111 		    sprintf((char *)gettail(IObuff), "%d", i);
3112 		    if (mch_stat((char *)IObuff, &st) < 0)
3113 			break;
3114 		}
3115 		fd = mch_open((char *)IObuff, O_CREAT|O_WRONLY|O_EXCL, perm);
3116 		close(fd);
3117 		if (fd < 0)	/* can't write in directory */
3118 		    backup_copy = TRUE;
3119 		else
3120 		{
3121 # ifdef UNIX
3122 		    chown((char *)IObuff, st_old.st_uid, st_old.st_gid);
3123 		    (void)mch_setperm(IObuff, perm);
3124 		    if (mch_stat((char *)IObuff, &st) < 0
3125 			    || st.st_uid != st_old.st_uid
3126 			    || st.st_gid != st_old.st_gid
3127 			    || st.st_mode != perm)
3128 			backup_copy = TRUE;
3129 # endif
3130 		    mch_remove(IObuff);
3131 		}
3132 	    }
3133 	}
3134 
3135 # ifdef UNIX
3136 	/*
3137 	 * Break symlinks and/or hardlinks if we've been asked to.
3138 	 */
3139 	if ((bkc_flags & BKC_BREAKSYMLINK) || (bkc_flags & BKC_BREAKHARDLINK))
3140 	{
3141 	    int	lstat_res;
3142 
3143 	    lstat_res = mch_lstat((char *)fname, &st);
3144 
3145 	    /* Symlinks. */
3146 	    if ((bkc_flags & BKC_BREAKSYMLINK)
3147 		    && lstat_res == 0
3148 		    && st.st_ino != st_old.st_ino)
3149 		backup_copy = FALSE;
3150 
3151 	    /* Hardlinks. */
3152 	    if ((bkc_flags & BKC_BREAKHARDLINK)
3153 		    && st_old.st_nlink > 1
3154 		    && (lstat_res != 0 || st.st_ino == st_old.st_ino))
3155 		backup_copy = FALSE;
3156 	}
3157 #endif
3158 
3159 #endif
3160 
3161 	/* make sure we have a valid backup extension to use */
3162 	if (*p_bex == NUL)
3163 	{
3164 #ifdef RISCOS
3165 	    backup_ext = (char_u *)"/bak";
3166 #else
3167 	    backup_ext = (char_u *)".bak";
3168 #endif
3169 	}
3170 	else
3171 	    backup_ext = p_bex;
3172 
3173 	if (backup_copy
3174 		&& (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) >= 0)
3175 	{
3176 	    int		bfd;
3177 	    char_u	*copybuf, *wp;
3178 	    int		some_error = FALSE;
3179 	    struct stat	st_new;
3180 	    char_u	*dirp;
3181 	    char_u	*rootname;
3182 #ifndef SHORT_FNAME
3183 	    int		did_set_shortname;
3184 #endif
3185 
3186 	    copybuf = alloc(BUFSIZE + 1);
3187 	    if (copybuf == NULL)
3188 	    {
3189 		some_error = TRUE;	    /* out of memory */
3190 		goto nobackup;
3191 	    }
3192 
3193 	    /*
3194 	     * Try to make the backup in each directory in the 'bdir' option.
3195 	     *
3196 	     * Unix semantics has it, that we may have a writable file,
3197 	     * that cannot be recreated with a simple open(..., O_CREAT, ) e.g:
3198 	     *  - the directory is not writable,
3199 	     *  - the file may be a symbolic link,
3200 	     *  - the file may belong to another user/group, etc.
3201 	     *
3202 	     * For these reasons, the existing writable file must be truncated
3203 	     * and reused. Creation of a backup COPY will be attempted.
3204 	     */
3205 	    dirp = p_bdir;
3206 	    while (*dirp)
3207 	    {
3208 #ifdef UNIX
3209 		st_new.st_ino = 0;
3210 		st_new.st_dev = 0;
3211 		st_new.st_gid = 0;
3212 #endif
3213 
3214 		/*
3215 		 * Isolate one directory name, using an entry in 'bdir'.
3216 		 */
3217 		(void)copy_option_part(&dirp, copybuf, BUFSIZE, ",");
3218 		rootname = get_file_in_dir(fname, copybuf);
3219 		if (rootname == NULL)
3220 		{
3221 		    some_error = TRUE;	    /* out of memory */
3222 		    goto nobackup;
3223 		}
3224 
3225 #ifndef SHORT_FNAME
3226 		did_set_shortname = FALSE;
3227 #endif
3228 
3229 		/*
3230 		 * May try twice if 'shortname' not set.
3231 		 */
3232 		for (;;)
3233 		{
3234 		    /*
3235 		     * Make backup file name.
3236 		     */
3237 		    backup = buf_modname(
3238 #ifdef SHORT_FNAME
3239 			    TRUE,
3240 #else
3241 			    (buf->b_p_sn || buf->b_shortname),
3242 #endif
3243 						 rootname, backup_ext, FALSE);
3244 		    if (backup == NULL)
3245 		    {
3246 			vim_free(rootname);
3247 			some_error = TRUE;		/* out of memory */
3248 			goto nobackup;
3249 		    }
3250 
3251 		    /*
3252 		     * Check if backup file already exists.
3253 		     */
3254 		    if (mch_stat((char *)backup, &st_new) >= 0)
3255 		    {
3256 #ifdef UNIX
3257 			/*
3258 			 * Check if backup file is same as original file.
3259 			 * May happen when modname() gave the same file back.
3260 			 * E.g. silly link, or file name-length reached.
3261 			 * If we don't check here, we either ruin the file
3262 			 * when copying or erase it after writing. jw.
3263 			 */
3264 			if (st_new.st_dev == st_old.st_dev
3265 					    && st_new.st_ino == st_old.st_ino)
3266 			{
3267 			    vim_free(backup);
3268 			    backup = NULL;	/* no backup file to delete */
3269 # ifndef SHORT_FNAME
3270 			    /*
3271 			     * may try again with 'shortname' set
3272 			     */
3273 			    if (!(buf->b_shortname || buf->b_p_sn))
3274 			    {
3275 				buf->b_shortname = TRUE;
3276 				did_set_shortname = TRUE;
3277 				continue;
3278 			    }
3279 				/* setting shortname didn't help */
3280 			    if (did_set_shortname)
3281 				buf->b_shortname = FALSE;
3282 # endif
3283 			    break;
3284 			}
3285 #endif
3286 
3287 			/*
3288 			 * If we are not going to keep the backup file, don't
3289 			 * delete an existing one, try to use another name.
3290 			 * Change one character, just before the extension.
3291 			 */
3292 			if (!p_bk)
3293 			{
3294 			    wp = backup + STRLEN(backup) - 1
3295 							 - STRLEN(backup_ext);
3296 			    if (wp < backup)	/* empty file name ??? */
3297 				wp = backup;
3298 			    *wp = 'z';
3299 			    while (*wp > 'a'
3300 				    && mch_stat((char *)backup, &st_new) >= 0)
3301 				--*wp;
3302 			    /* They all exist??? Must be something wrong. */
3303 			    if (*wp == 'a')
3304 			    {
3305 				vim_free(backup);
3306 				backup = NULL;
3307 			    }
3308 			}
3309 		    }
3310 		    break;
3311 		}
3312 		vim_free(rootname);
3313 
3314 		/*
3315 		 * Try to create the backup file
3316 		 */
3317 		if (backup != NULL)
3318 		{
3319 		    /* remove old backup, if present */
3320 		    mch_remove(backup);
3321 		    /* Open with O_EXCL to avoid the file being created while
3322 		     * we were sleeping (symlink hacker attack?) */
3323 		    bfd = mch_open((char *)backup,
3324 				       O_WRONLY|O_CREAT|O_EXTRA|O_EXCL, 0666);
3325 		    if (bfd < 0)
3326 		    {
3327 			vim_free(backup);
3328 			backup = NULL;
3329 		    }
3330 		    else
3331 		    {
3332 			/* set file protection same as original file, but
3333 			 * strip s-bit */
3334 			(void)mch_setperm(backup, perm & 0777);
3335 
3336 #ifdef UNIX
3337 			/*
3338 			 * Try to set the group of the backup same as the
3339 			 * original file. If this fails, set the protection
3340 			 * bits for the group same as the protection bits for
3341 			 * others.
3342 			 */
3343 			if (st_new.st_gid != st_old.st_gid &&
3344 # ifdef HAVE_FCHOWN  /* sequent-ptx lacks fchown() */
3345 				    fchown(bfd, (uid_t)-1, st_old.st_gid) != 0
3346 # else
3347 			  chown((char *)backup, (uid_t)-1, st_old.st_gid) != 0
3348 # endif
3349 						)
3350 			    mch_setperm(backup,
3351 					  (perm & 0707) | ((perm & 07) << 3));
3352 #endif
3353 
3354 			/*
3355 			 * copy the file.
3356 			 */
3357 			write_info.bw_fd = bfd;
3358 			write_info.bw_buf = copybuf;
3359 #ifdef HAS_BW_FLAGS
3360 			write_info.bw_flags = FIO_NOCONVERT;
3361 #endif
3362 			while ((write_info.bw_len = vim_read(fd, copybuf,
3363 								BUFSIZE)) > 0)
3364 			{
3365 			    if (buf_write_bytes(&write_info) == FAIL)
3366 			    {
3367 				errmsg = (char_u *)_("E506: Can't write to backup file (add ! to override)");
3368 				break;
3369 			    }
3370 			    ui_breakcheck();
3371 			    if (got_int)
3372 			    {
3373 				errmsg = (char_u *)_(e_interr);
3374 				break;
3375 			    }
3376 			}
3377 
3378 			if (close(bfd) < 0 && errmsg == NULL)
3379 			    errmsg = (char_u *)_("E507: Close error for backup file (add ! to override)");
3380 			if (write_info.bw_len < 0)
3381 			    errmsg = (char_u *)_("E508: Can't read file for backup (add ! to override)");
3382 #ifdef UNIX
3383 			set_file_time(backup, st_old.st_atime, st_old.st_mtime);
3384 #endif
3385 #ifdef HAVE_ACL
3386 			mch_set_acl(backup, acl);
3387 #endif
3388 			break;
3389 		    }
3390 		}
3391 	    }
3392     nobackup:
3393 	    close(fd);		/* ignore errors for closing read file */
3394 	    vim_free(copybuf);
3395 
3396 	    if (backup == NULL && errmsg == NULL)
3397 		errmsg = (char_u *)_("E509: Cannot create backup file (add ! to override)");
3398 	    /* ignore errors when forceit is TRUE */
3399 	    if ((some_error || errmsg != NULL) && !forceit)
3400 	    {
3401 		retval = FAIL;
3402 		goto fail;
3403 	    }
3404 	    errmsg = NULL;
3405 	}
3406 	else
3407 	{
3408 	    char_u	*dirp;
3409 	    char_u	*p;
3410 	    char_u	*rootname;
3411 
3412 	    /*
3413 	     * Make a backup by renaming the original file.
3414 	     */
3415 	    /*
3416 	     * If 'cpoptions' includes the "W" flag, we don't want to
3417 	     * overwrite a read-only file.  But rename may be possible
3418 	     * anyway, thus we need an extra check here.
3419 	     */
3420 	    if (file_readonly && vim_strchr(p_cpo, CPO_FWRITE) != NULL)
3421 	    {
3422 		errnum = (char_u *)"E504: ";
3423 		errmsg = (char_u *)_(err_readonly);
3424 		goto fail;
3425 	    }
3426 
3427 	    /*
3428 	     *
3429 	     * Form the backup file name - change path/fo.o.h to
3430 	     * path/fo.o.h.bak Try all directories in 'backupdir', first one
3431 	     * that works is used.
3432 	     */
3433 	    dirp = p_bdir;
3434 	    while (*dirp)
3435 	    {
3436 		/*
3437 		 * Isolate one directory name and make the backup file name.
3438 		 */
3439 		(void)copy_option_part(&dirp, IObuff, IOSIZE, ",");
3440 		rootname = get_file_in_dir(fname, IObuff);
3441 		if (rootname == NULL)
3442 		    backup = NULL;
3443 		else
3444 		{
3445 		    backup = buf_modname(
3446 #ifdef SHORT_FNAME
3447 			    TRUE,
3448 #else
3449 			    (buf->b_p_sn || buf->b_shortname),
3450 #endif
3451 						 rootname, backup_ext, FALSE);
3452 		    vim_free(rootname);
3453 		}
3454 
3455 		if (backup != NULL)
3456 		{
3457 		    /*
3458 		     * If we are not going to keep the backup file, don't
3459 		     * delete an existing one, try to use another name.
3460 		     * Change one character, just before the extension.
3461 		     */
3462 		    if (!p_bk && mch_getperm(backup) >= 0)
3463 		    {
3464 			p = backup + STRLEN(backup) - 1 - STRLEN(backup_ext);
3465 			if (p < backup)	/* empty file name ??? */
3466 			    p = backup;
3467 			*p = 'z';
3468 			while (*p > 'a' && mch_getperm(backup) >= 0)
3469 			    --*p;
3470 			/* They all exist??? Must be something wrong! */
3471 			if (*p == 'a')
3472 			{
3473 			    vim_free(backup);
3474 			    backup = NULL;
3475 			}
3476 		    }
3477 		}
3478 		if (backup != NULL)
3479 		{
3480 
3481 		    /*
3482 		     * Delete any existing backup and move the current version to
3483 		     * the backup.	For safety, we don't remove the backup until
3484 		     * the write has finished successfully. And if the 'backup'
3485 		     * option is set, leave it around.
3486 		     */
3487 		    /*
3488 		     * If the renaming of the original file to the backup file
3489 		     * works, quit here.
3490 		     */
3491 		    if (vim_rename(fname, backup) == 0)
3492 			break;
3493 
3494 		    vim_free(backup);   /* don't do the rename below */
3495 		    backup = NULL;
3496 		}
3497 	    }
3498 	    if (backup == NULL && !forceit)
3499 	    {
3500 		errmsg = (char_u *)_("E510: Can't make backup file (add ! to override)");
3501 		goto fail;
3502 	    }
3503 	}
3504     }
3505 
3506 #if defined(UNIX) && !defined(ARCHIE)
3507     /* When using ":w!" and the file was read-only: make it writable */
3508     if (forceit && perm >= 0 && !(perm & 0200) && st_old.st_uid == getuid()
3509 				     && vim_strchr(p_cpo, CPO_FWRITE) == NULL)
3510     {
3511 	perm |= 0200;
3512 	(void)mch_setperm(fname, perm);
3513 	made_writable = TRUE;
3514     }
3515 #endif
3516 
3517     /* When using ":w!" and writing to the current file, readonly makes no
3518      * sense, reset it */
3519     if (forceit && overwriting)
3520     {
3521 	buf->b_p_ro = FALSE;
3522 #ifdef FEAT_TITLE
3523 	need_maketitle = TRUE;	    /* set window title later */
3524 #endif
3525 #ifdef FEAT_WINDOWS
3526 	status_redraw_all();	    /* redraw status lines later */
3527 #endif
3528     }
3529 
3530     if (end > buf->b_ml.ml_line_count)
3531 	end = buf->b_ml.ml_line_count;
3532     if (buf->b_ml.ml_flags & ML_EMPTY)
3533 	start = end + 1;
3534 
3535     /*
3536      * If the original file is being overwritten, there is a small chance that
3537      * we crash in the middle of writing. Therefore the file is preserved now.
3538      * This makes all block numbers positive so that recovery does not need
3539      * the original file.
3540      * Don't do this if there is a backup file and we are exiting.
3541      */
3542     if (reset_changed && !newfile && !otherfile(ffname)
3543 					      && !(exiting && backup != NULL))
3544     {
3545 	ml_preserve(buf, FALSE);
3546 	if (got_int)
3547 	{
3548 	    errmsg = (char_u *)_(e_interr);
3549 	    goto restore_backup;
3550 	}
3551     }
3552 
3553 #ifdef MACOS_CLASSIC /* TODO: Is it need for MACOS_X? (Dany) */
3554     /*
3555      * Before risking to lose the original file verify if there's
3556      * a resource fork to preserve, and if cannot be done warn
3557      * the users. This happens when overwriting without backups.
3558      */
3559     if (backup == NULL && overwriting && !append)
3560 	if (mch_has_resource_fork(fname))
3561 	{
3562 	    errmsg = (char_u *)_("E460: The resource fork would be lost (add ! to override)");
3563 	    goto restore_backup;
3564 	}
3565 #endif
3566 
3567 #ifdef VMS
3568     vms_remove_version(fname); /* remove version */
3569 #endif
3570     /* Default: write the the file directly.  May write to a temp file for
3571      * multi-byte conversion. */
3572     wfname = fname;
3573 
3574 #ifdef FEAT_MBYTE
3575     /* Check for forced 'fileencoding' from "++opt=val" argument. */
3576     if (eap != NULL && eap->force_enc != 0)
3577     {
3578 	fenc = eap->cmd + eap->force_enc;
3579 	fenc = enc_canonize(fenc);
3580 	fenc_tofree = fenc;
3581     }
3582     else
3583 	fenc = buf->b_p_fenc;
3584 
3585     /*
3586      * The file needs to be converted when 'fileencoding' is set and
3587      * 'fileencoding' differs from 'encoding'.
3588      */
3589     converted = (*fenc != NUL && !same_encoding(p_enc, fenc));
3590 
3591     /*
3592      * Check if UTF-8 to UCS-2/4 or Latin1 conversion needs to be done.  Or
3593      * Latin1 to Unicode conversion.  This is handled in buf_write_bytes().
3594      * Prepare the flags for it and allocate bw_conv_buf when needed.
3595      */
3596     if (converted && (enc_utf8 || STRCMP(p_enc, "latin1") == 0))
3597     {
3598 	wb_flags = get_fio_flags(fenc);
3599 	if (wb_flags & (FIO_UCS2 | FIO_UCS4 | FIO_UTF16 | FIO_UTF8))
3600 	{
3601 	    /* Need to allocate a buffer to translate into. */
3602 	    if (wb_flags & (FIO_UCS2 | FIO_UTF16 | FIO_UTF8))
3603 		write_info.bw_conv_buflen = bufsize * 2;
3604 	    else /* FIO_UCS4 */
3605 		write_info.bw_conv_buflen = bufsize * 4;
3606 	    write_info.bw_conv_buf
3607 			   = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3608 	    if (write_info.bw_conv_buf == NULL)
3609 		end = 0;
3610 	}
3611     }
3612 
3613 # ifdef WIN3264
3614     if (converted && wb_flags == 0 && (wb_flags = get_win_fio_flags(fenc)) != 0)
3615     {
3616 	/* Convert UTF-8 -> UCS-2 and UCS-2 -> DBCS.  Worst-case * 4: */
3617 	write_info.bw_conv_buflen = bufsize * 4;
3618 	write_info.bw_conv_buf
3619 			    = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3620 	if (write_info.bw_conv_buf == NULL)
3621 	    end = 0;
3622     }
3623 # endif
3624 
3625 # ifdef MACOS_X
3626     if (converted && wb_flags == 0 && (wb_flags = get_mac_fio_flags(fenc)) != 0)
3627     {
3628 	write_info.bw_conv_buflen = bufsize * 3;
3629 	write_info.bw_conv_buf
3630 			    = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3631 	if (write_info.bw_conv_buf == NULL)
3632 	    end = 0;
3633     }
3634 # endif
3635 
3636 # if defined(FEAT_EVAL) || defined(USE_ICONV)
3637     if (converted && wb_flags == 0)
3638     {
3639 #  ifdef USE_ICONV
3640 	/*
3641 	 * Use iconv() conversion when conversion is needed and it's not done
3642 	 * internally.
3643 	 */
3644 	write_info.bw_iconv_fd = (iconv_t)my_iconv_open(fenc,
3645 					enc_utf8 ? (char_u *)"utf-8" : p_enc);
3646 	if (write_info.bw_iconv_fd != (iconv_t)-1)
3647 	{
3648 	    /* We're going to use iconv(), allocate a buffer to convert in. */
3649 	    write_info.bw_conv_buflen = bufsize * ICONV_MULT;
3650 	    write_info.bw_conv_buf
3651 			   = lalloc((long_u)write_info.bw_conv_buflen, TRUE);
3652 	    if (write_info.bw_conv_buf == NULL)
3653 		end = 0;
3654 	    write_info.bw_first = TRUE;
3655 	}
3656 #   ifdef FEAT_EVAL
3657 	else
3658 #   endif
3659 #  endif
3660 
3661 #  ifdef FEAT_EVAL
3662 	    /*
3663 	     * When the file needs to be converted with 'charconvert' after
3664 	     * writing, write to a temp file instead and let the conversion
3665 	     * overwrite the original file.
3666 	     */
3667 	    if (*p_ccv != NUL)
3668 	    {
3669 		wfname = vim_tempname('w');
3670 		if (wfname == NULL)	/* Can't write without a tempfile! */
3671 		{
3672 		    errmsg = (char_u *)_("E214: Can't find temp file for writing");
3673 		    goto restore_backup;
3674 		}
3675 	    }
3676 #  endif
3677     }
3678 # endif
3679     if (converted && wb_flags == 0
3680 #  ifdef USE_ICONV
3681 	    && write_info.bw_iconv_fd == (iconv_t)-1
3682 #  endif
3683 #  ifdef FEAT_EVAL
3684 	    && wfname == fname
3685 #  endif
3686 	    )
3687     {
3688 	if (!forceit)
3689 	{
3690 	    errmsg = (char_u *)_("E213: Cannot convert (add ! to write without conversion)");
3691 	    goto restore_backup;
3692 	}
3693 	notconverted = TRUE;
3694     }
3695 #endif
3696 
3697     /*
3698      * Open the file "wfname" for writing.
3699      * We may try to open the file twice: If we can't write to the
3700      * file and forceit is TRUE we delete the existing file and try to create
3701      * a new one. If this still fails we may have lost the original file!
3702      * (this may happen when the user reached his quotum for number of files).
3703      * Appending will fail if the file does not exist and forceit is FALSE.
3704      */
3705     while ((fd = mch_open((char *)wfname, O_WRONLY | O_EXTRA | (append
3706 			? (forceit ? (O_APPEND | O_CREAT) : O_APPEND)
3707 			: (O_CREAT | O_TRUNC))
3708 			, 0666)) < 0)
3709     {
3710 	/*
3711 	 * A forced write will try to create a new file if the old one is
3712 	 * still readonly. This may also happen when the directory is
3713 	 * read-only. In that case the mch_remove() will fail.
3714 	 */
3715 	if (errmsg == NULL)
3716 	{
3717 #ifdef UNIX
3718 	    struct stat	st;
3719 
3720 	    /* Don't delete the file when it's a hard or symbolic link. */
3721 	    if ((!newfile && st_old.st_nlink > 1)
3722 		    || (mch_lstat((char *)fname, &st) == 0
3723 			&& (st.st_dev != st_old.st_dev
3724 			    || st.st_ino != st_old.st_ino)))
3725 		errmsg = (char_u *)_("E166: Can't open linked file for writing");
3726 	    else
3727 #endif
3728 	    {
3729 		errmsg = (char_u *)_("E212: Can't open file for writing");
3730 		if (forceit && vim_strchr(p_cpo, CPO_FWRITE) == NULL
3731 								 && perm >= 0)
3732 		{
3733 #ifdef UNIX
3734 		    /* we write to the file, thus it should be marked
3735 		       writable after all */
3736 		    if (!(perm & 0200))
3737 			made_writable = TRUE;
3738 		    perm |= 0200;
3739 		    if (st_old.st_uid != getuid() || st_old.st_gid != getgid())
3740 			perm &= 0777;
3741 #endif
3742 		    if (!append)	    /* don't remove when appending */
3743 			mch_remove(wfname);
3744 		    continue;
3745 		}
3746 	    }
3747 	}
3748 
3749 restore_backup:
3750 	{
3751 	    struct stat st;
3752 
3753 	    /*
3754 	     * If we failed to open the file, we don't need a backup. Throw it
3755 	     * away.  If we moved or removed the original file try to put the
3756 	     * backup in its place.
3757 	     */
3758 	    if (backup != NULL && wfname == fname)
3759 	    {
3760 		if (backup_copy)
3761 		{
3762 		    /*
3763 		     * There is a small chance that we removed the original,
3764 		     * try to move the copy in its place.
3765 		     * This may not work if the vim_rename() fails.
3766 		     * In that case we leave the copy around.
3767 		     */
3768 		    /* If file does not exist, put the copy in its place */
3769 		    if (mch_stat((char *)fname, &st) < 0)
3770 			vim_rename(backup, fname);
3771 		    /* if original file does exist throw away the copy */
3772 		    if (mch_stat((char *)fname, &st) >= 0)
3773 			mch_remove(backup);
3774 		}
3775 		else
3776 		{
3777 		    /* try to put the original file back */
3778 		    vim_rename(backup, fname);
3779 		}
3780 	    }
3781 
3782 	    /* if original file no longer exists give an extra warning */
3783 	    if (!newfile && mch_stat((char *)fname, &st) < 0)
3784 		end = 0;
3785 	}
3786 
3787 #ifdef FEAT_MBYTE
3788 	if (wfname != fname)
3789 	    vim_free(wfname);
3790 #endif
3791 	goto fail;
3792     }
3793     errmsg = NULL;
3794 
3795 #if defined(MACOS_CLASSIC) || defined(WIN3264)
3796     /* TODO: Is it need for MACOS_X? (Dany) */
3797     /*
3798      * On macintosh copy the original files attributes (i.e. the backup)
3799      * This is done in order to preserve the ressource fork and the
3800      * Finder attribute (label, comments, custom icons, file creatore)
3801      */
3802     if (backup != NULL && overwriting && !append)
3803     {
3804 	if (backup_copy)
3805 	    (void)mch_copy_file_attribute(wfname, backup);
3806 	else
3807 	    (void)mch_copy_file_attribute(backup, wfname);
3808     }
3809 
3810     if (!overwriting && !append)
3811     {
3812 	if (buf->b_ffname != NULL)
3813 	    (void)mch_copy_file_attribute(buf->b_ffname, wfname);
3814 	/* Should copy ressource fork */
3815     }
3816 #endif
3817 
3818     write_info.bw_fd = fd;
3819 
3820 #ifdef FEAT_CRYPT
3821     if (*buf->b_p_key && !filtering)
3822     {
3823 	crypt_init_keys(buf->b_p_key);
3824 	/* Write magic number, so that Vim knows that this file is encrypted
3825 	 * when reading it again.  This also undergoes utf-8 to ucs-2/4
3826 	 * conversion when needed. */
3827 	write_info.bw_buf = (char_u *)CRYPT_MAGIC;
3828 	write_info.bw_len = CRYPT_MAGIC_LEN;
3829 	write_info.bw_flags = FIO_NOCONVERT;
3830 	if (buf_write_bytes(&write_info) == FAIL)
3831 	    end = 0;
3832 	wb_flags |= FIO_ENCRYPTED;
3833     }
3834 #endif
3835 
3836     write_info.bw_buf = buffer;
3837     nchars = 0;
3838 
3839     /* use "++bin", "++nobin" or 'binary' */
3840     if (eap != NULL && eap->force_bin != 0)
3841 	write_bin = (eap->force_bin == FORCE_BIN);
3842     else
3843 	write_bin = buf->b_p_bin;
3844 
3845 #ifdef FEAT_MBYTE
3846     /*
3847      * The BOM is written just after the encryption magic number.
3848      */
3849     if (buf->b_p_bomb && !write_bin)
3850     {
3851 	write_info.bw_len = make_bom(buffer, fenc);
3852 	if (write_info.bw_len > 0)
3853 	{
3854 	    /* don't convert, do encryption */
3855 	    write_info.bw_flags = FIO_NOCONVERT | wb_flags;
3856 	    if (buf_write_bytes(&write_info) == FAIL)
3857 		end = 0;
3858 	    else
3859 		nchars += write_info.bw_len;
3860 	}
3861     }
3862 #endif
3863 
3864     write_info.bw_len = bufsize;
3865 #ifdef HAS_BW_FLAGS
3866     write_info.bw_flags = wb_flags;
3867 #endif
3868     fileformat = get_fileformat_force(buf, eap);
3869     s = buffer;
3870     len = 0;
3871     for (lnum = start; lnum <= end; ++lnum)
3872     {
3873 	/*
3874 	 * The next while loop is done once for each character written.
3875 	 * Keep it fast!
3876 	 */
3877 	ptr = ml_get_buf(buf, lnum, FALSE) - 1;
3878 	while ((c = *++ptr) != NUL)
3879 	{
3880 	    if (c == NL)
3881 		*s = NUL;		/* replace newlines with NULs */
3882 	    else if (c == CAR && fileformat == EOL_MAC)
3883 		*s = NL;		/* Mac: replace CRs with NLs */
3884 	    else
3885 		*s = c;
3886 	    ++s;
3887 	    if (++len != bufsize)
3888 		continue;
3889 	    if (buf_write_bytes(&write_info) == FAIL)
3890 	    {
3891 		end = 0;		/* write error: break loop */
3892 		break;
3893 	    }
3894 	    nchars += bufsize;
3895 	    s = buffer;
3896 	    len = 0;
3897 	}
3898 	/* write failed or last line has no EOL: stop here */
3899 	if (end == 0
3900 		|| (lnum == end
3901 		    && write_bin
3902 		    && (lnum == write_no_eol_lnum
3903 			|| (lnum == buf->b_ml.ml_line_count && !buf->b_p_eol))))
3904 	{
3905 	    ++lnum;			/* written the line, count it */
3906 	    no_eol = TRUE;
3907 	    break;
3908 	}
3909 	if (fileformat == EOL_UNIX)
3910 	    *s++ = NL;
3911 	else
3912 	{
3913 	    *s++ = CAR;			/* EOL_MAC or EOL_DOS: write CR */
3914 	    if (fileformat == EOL_DOS)	/* write CR-NL */
3915 	    {
3916 		if (++len == bufsize)
3917 		{
3918 		    if (buf_write_bytes(&write_info) == FAIL)
3919 		    {
3920 			end = 0;	/* write error: break loop */
3921 			break;
3922 		    }
3923 		    nchars += bufsize;
3924 		    s = buffer;
3925 		    len = 0;
3926 		}
3927 		*s++ = NL;
3928 	    }
3929 	}
3930 	if (++len == bufsize && end)
3931 	{
3932 	    if (buf_write_bytes(&write_info) == FAIL)
3933 	    {
3934 		end = 0;		/* write error: break loop */
3935 		break;
3936 	    }
3937 	    nchars += bufsize;
3938 	    s = buffer;
3939 	    len = 0;
3940 
3941 	    ui_breakcheck();
3942 	    if (got_int)
3943 	    {
3944 		end = 0;		/* Interrupted, break loop */
3945 		break;
3946 	    }
3947 	}
3948 #ifdef VMS
3949 	/*
3950 	 * On VMS there is a problem: newlines get added when writing blocks
3951 	 * at a time. Fix it by writing a line at a time.
3952 	 * This is much slower!
3953 	 * Explanation: Vim can not handle, so far, variable record format.
3954 	 * With $analize/rms filename you can get the rms file structure, and
3955 	 * if the Record format filed is variable, CR will be added after
3956 	 * every written buffer.  In other cases it works without this fix.
3957 	 * From other side read is about 5 times slower for "variable record
3958 	 * format" files.
3959 	 */
3960 	if (buf->b_fab_rfm == FAB$C_VAR)
3961 	{
3962 	    write_info.bw_len = len;
3963 	    if (buf_write_bytes(&write_info) == FAIL)
3964 	    {
3965 		end = 0;		/* write error: break loop */
3966 		break;
3967 	    }
3968 	    write_info.bw_len = bufsize;
3969 	    nchars += len;
3970 	    s = buffer;
3971 	    len = 0;
3972 	}
3973 #endif
3974     }
3975     if (len > 0 && end > 0)
3976     {
3977 	write_info.bw_len = len;
3978 	if (buf_write_bytes(&write_info) == FAIL)
3979 	    end = 0;		    /* write error */
3980 	nchars += len;
3981     }
3982 
3983 #if defined(UNIX) && defined(HAVE_FSYNC)
3984     /* On many journalling file systems there is a bug that causes both the
3985      * original and the backup file to be lost when halting the system right
3986      * after writing the file.  That's because only the meta-data is
3987      * journalled.  Syncing the file slows down the system, but assures it has
3988      * been written to disk and we don't lose it.
3989      * For a device do try the fsync() but don't complain if it does not work
3990      * (could be a pipe). */
3991     if (fsync(fd) != 0 && !device)
3992     {
3993 	errmsg = (char_u *)_("E667: Fsync failed");
3994 	end = 0;
3995     }
3996 #endif
3997 
3998     if (close(fd) != 0)
3999     {
4000 	errmsg = (char_u *)_("E512: Close failed");
4001 	end = 0;
4002     }
4003 
4004 #ifdef UNIX
4005     if (made_writable)
4006 	perm &= ~0200;		/* reset 'w' bit for security reasons */
4007 #endif
4008     if (perm >= 0)		/* set perm. of new file same as old file */
4009 	(void)mch_setperm(wfname, perm);
4010 #ifdef RISCOS
4011     if (!append && !filtering)
4012 	/* Set the filetype after writing the file. */
4013 	mch_set_filetype(wfname, buf->b_p_oft);
4014 #endif
4015 #ifdef HAVE_ACL
4016     /* Probably need to set the ACL before changing the user (can't set the
4017      * ACL on a file the user doesn't own). */
4018     if (!backup_copy)
4019 	mch_set_acl(wfname, acl);
4020 #endif
4021 
4022 #ifdef UNIX
4023     /* When creating a new file, set its owner/group to that of the original
4024      * file.  Get the new device and inode number. */
4025     if (backup != NULL && !backup_copy)
4026     {
4027 	struct stat	st;
4028 
4029 	/* don't change the owner when it's already OK, some systems remove
4030 	 * permission or ACL stuff */
4031 	if (mch_stat((char *)wfname, &st) < 0
4032 		|| st.st_uid != st_old.st_uid
4033 		|| st.st_gid != st_old.st_gid)
4034 	{
4035 	    chown((char *)wfname, st_old.st_uid, st_old.st_gid);
4036 	    if (perm >= 0)	/* set permission again, may have changed */
4037 		(void)mch_setperm(wfname, perm);
4038 	}
4039 	buf_setino(buf);
4040     }
4041 #endif
4042 
4043 
4044 #if defined(FEAT_MBYTE) && defined(FEAT_EVAL)
4045     if (wfname != fname)
4046     {
4047 	/*
4048 	 * The file was written to a temp file, now it needs to be converted
4049 	 * with 'charconvert' to (overwrite) the output file.
4050 	 */
4051 	if (end != 0)
4052 	{
4053 	    if (eval_charconvert(enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc,
4054 						       wfname, fname) == FAIL)
4055 	    {
4056 		write_info.bw_conv_error = TRUE;
4057 		end = 0;
4058 	    }
4059 	}
4060 	mch_remove(wfname);
4061 	vim_free(wfname);
4062     }
4063 #endif
4064 
4065     if (end == 0)
4066     {
4067 	if (errmsg == NULL)
4068 	{
4069 #ifdef FEAT_MBYTE
4070 	    if (write_info.bw_conv_error)
4071 		errmsg = (char_u *)_("E513: write error, conversion failed");
4072 	    else
4073 #endif
4074 		if (got_int)
4075 		    errmsg = (char_u *)_(e_interr);
4076 		else
4077 		    errmsg = (char_u *)_("E514: write error (file system full?)");
4078 	}
4079 
4080 	/*
4081 	 * If we have a backup file, try to put it in place of the new file,
4082 	 * because the new file is probably corrupt.  This avoids loosing the
4083 	 * original file when trying to make a backup when writing the file a
4084 	 * second time.
4085 	 * When "backup_copy" is set we need to copy the backup over the new
4086 	 * file.  Otherwise rename the backup file.
4087 	 * If this is OK, don't give the extra warning message.
4088 	 */
4089 	if (backup != NULL)
4090 	{
4091 	    if (backup_copy)
4092 	    {
4093 		/* This may take a while, if we were interrupted let the user
4094 		 * know we got the message. */
4095 		if (got_int)
4096 		{
4097 		    MSG(_(e_interr));
4098 		    out_flush();
4099 		}
4100 		if ((fd = mch_open((char *)backup, O_RDONLY | O_EXTRA, 0)) >= 0)
4101 		{
4102 		    if ((write_info.bw_fd = mch_open((char *)fname,
4103 			  O_WRONLY | O_CREAT | O_TRUNC | O_EXTRA, 0666)) >= 0)
4104 		    {
4105 			/* copy the file. */
4106 			write_info.bw_buf = smallbuf;
4107 #ifdef HAS_BW_FLAGS
4108 			write_info.bw_flags = FIO_NOCONVERT;
4109 #endif
4110 			while ((write_info.bw_len = vim_read(fd, smallbuf,
4111 						      SMBUFSIZE)) > 0)
4112 			    if (buf_write_bytes(&write_info) == FAIL)
4113 				break;
4114 
4115 			if (close(write_info.bw_fd) >= 0
4116 						   && write_info.bw_len == 0)
4117 			    end = 1;		/* success */
4118 		    }
4119 		    close(fd);	/* ignore errors for closing read file */
4120 		}
4121 	    }
4122 	    else
4123 	    {
4124 		if (vim_rename(backup, fname) == 0)
4125 		    end = 1;
4126 	    }
4127 	}
4128 	goto fail;
4129     }
4130 
4131     lnum -= start;	    /* compute number of written lines */
4132     --no_wait_return;	    /* may wait for return now */
4133 
4134 #if !(defined(UNIX) || defined(VMS))
4135     fname = sfname;	    /* use shortname now, for the messages */
4136 #endif
4137     if (!filtering)
4138     {
4139 	msg_add_fname(buf, fname);	/* put fname in IObuff with quotes */
4140 	c = FALSE;
4141 #ifdef FEAT_MBYTE
4142 	if (write_info.bw_conv_error)
4143 	{
4144 	    STRCAT(IObuff, _(" CONVERSION ERROR"));
4145 	    c = TRUE;
4146 	}
4147 	else if (notconverted)
4148 	{
4149 	    STRCAT(IObuff, _("[NOT converted]"));
4150 	    c = TRUE;
4151 	}
4152 	else if (converted)
4153 	{
4154 	    STRCAT(IObuff, _("[converted]"));
4155 	    c = TRUE;
4156 	}
4157 #endif
4158 	if (device)
4159 	{
4160 	    STRCAT(IObuff, _("[Device]"));
4161 	    c = TRUE;
4162 	}
4163 	else if (newfile)
4164 	{
4165 	    STRCAT(IObuff, shortmess(SHM_NEW) ? _("[New]") : _("[New File]"));
4166 	    c = TRUE;
4167 	}
4168 	if (no_eol)
4169 	{
4170 	    msg_add_eol();
4171 	    c = TRUE;
4172 	}
4173 	/* may add [unix/dos/mac] */
4174 	if (msg_add_fileformat(fileformat))
4175 	    c = TRUE;
4176 #ifdef FEAT_CRYPT
4177 	if (wb_flags & FIO_ENCRYPTED)
4178 	{
4179 	    STRCAT(IObuff, _("[crypted]"));
4180 	    c = TRUE;
4181 	}
4182 #endif
4183 	msg_add_lines(c, (long)lnum, nchars);	/* add line/char count */
4184 	if (!shortmess(SHM_WRITE))
4185 	{
4186 	    if (append)
4187 		STRCAT(IObuff, shortmess(SHM_WRI) ? _(" [a]") : _(" appended"));
4188 	    else
4189 		STRCAT(IObuff, shortmess(SHM_WRI) ? _(" [w]") : _(" written"));
4190 	}
4191 
4192 	set_keep_msg(msg_trunc_attr(IObuff, FALSE, 0));
4193 	keep_msg_attr = 0;
4194     }
4195 
4196     if (reset_changed && whole
4197 #ifdef FEAT_MBYTE
4198 	    && !write_info.bw_conv_error
4199 #endif
4200 	    )		/* when written everything correctly */
4201     {
4202 	unchanged(buf, TRUE);
4203 	u_unchanged(buf);
4204     }
4205 
4206     /*
4207      * If written to the current file, update the timestamp of the swap file
4208      * and reset the BF_WRITE_MASK flags. Also sets buf->b_mtime.
4209      */
4210     if (overwriting)
4211     {
4212 	ml_timestamp(buf);
4213 	buf->b_flags &= ~BF_WRITE_MASK;
4214     }
4215 
4216     /*
4217      * If we kept a backup until now, and we are in patch mode, then we make
4218      * the backup file our 'original' file.
4219      */
4220     if (*p_pm && dobackup)
4221     {
4222 	char *org = (char *)buf_modname(
4223 #ifdef SHORT_FNAME
4224 					TRUE,
4225 #else
4226 					(buf->b_p_sn || buf->b_shortname),
4227 #endif
4228 							  fname, p_pm, FALSE);
4229 
4230 	if (backup != NULL)
4231 	{
4232 	    struct stat st;
4233 
4234 	    /*
4235 	     * If the original file does not exist yet
4236 	     * the current backup file becomes the original file
4237 	     */
4238 	    if (org == NULL)
4239 		EMSG(_("E205: Patchmode: can't save original file"));
4240 	    else if (mch_stat(org, &st) < 0)
4241 	    {
4242 		vim_rename(backup, (char_u *)org);
4243 		vim_free(backup);	    /* don't delete the file */
4244 		backup = NULL;
4245 #ifdef UNIX
4246 		set_file_time((char_u *)org, st_old.st_atime, st_old.st_mtime);
4247 #endif
4248 	    }
4249 	}
4250 	/*
4251 	 * If there is no backup file, remember that a (new) file was
4252 	 * created.
4253 	 */
4254 	else
4255 	{
4256 	    int empty_fd;
4257 
4258 	    if (org == NULL
4259 		    || (empty_fd = mch_open(org, O_CREAT | O_EXTRA | O_EXCL,
4260 								   0666)) < 0)
4261 	      EMSG(_("E206: patchmode: can't touch empty original file"));
4262 	    else
4263 	      close(empty_fd);
4264 	}
4265 	if (org != NULL)
4266 	{
4267 	    mch_setperm((char_u *)org, mch_getperm(fname) & 0777);
4268 	    vim_free(org);
4269 	}
4270     }
4271 
4272     /*
4273      * Remove the backup unless 'backup' option is set
4274      */
4275     if (!p_bk && backup != NULL && mch_remove(backup) != 0)
4276 	EMSG(_("E207: Can't delete backup file"));
4277 
4278 #ifdef FEAT_SUN_WORKSHOP
4279     if (usingSunWorkShop)
4280 	workshop_file_saved((char *) ffname);
4281 #endif
4282 
4283     goto nofail;
4284 
4285     /*
4286      * Finish up.  We get here either after failure or success.
4287      */
4288 fail:
4289     --no_wait_return;		/* may wait for return now */
4290 nofail:
4291 
4292     /* Done saving, we accept changed buffer warnings again */
4293     buf->b_saving = FALSE;
4294 
4295     vim_free(backup);
4296     if (buffer != smallbuf)
4297 	vim_free(buffer);
4298 #ifdef FEAT_MBYTE
4299     vim_free(fenc_tofree);
4300     vim_free(write_info.bw_conv_buf);
4301 # ifdef USE_ICONV
4302     if (write_info.bw_iconv_fd != (iconv_t)-1)
4303     {
4304 	iconv_close(write_info.bw_iconv_fd);
4305 	write_info.bw_iconv_fd = (iconv_t)-1;
4306     }
4307 # endif
4308 #endif
4309 #ifdef HAVE_ACL
4310     mch_free_acl(acl);
4311 #endif
4312 
4313     if (errmsg != NULL)
4314     {
4315 	int numlen = errnum != NULL ? STRLEN(errnum) : 0;
4316 
4317 	attr = hl_attr(HLF_E);	/* set highlight for error messages */
4318 	msg_add_fname(buf,
4319 #ifndef UNIX
4320 		sfname
4321 #else
4322 		fname
4323 #endif
4324 		     );		/* put file name in IObuff with quotes */
4325 	if (STRLEN(IObuff) + STRLEN(errmsg) + numlen >= IOSIZE)
4326 	    IObuff[IOSIZE - STRLEN(errmsg) - numlen - 1] = NUL;
4327 	/* If the error message has the form "is ...", put the error number in
4328 	 * front of the file name. */
4329 	if (errnum != NULL)
4330 	{
4331 	    mch_memmove(IObuff + numlen, IObuff, STRLEN(IObuff) + 1);
4332 	    mch_memmove(IObuff, errnum, (size_t)numlen);
4333 	}
4334 	STRCAT(IObuff, errmsg);
4335 	emsg(IObuff);
4336 
4337 	retval = FAIL;
4338 	if (end == 0)
4339 	{
4340 	    MSG_PUTS_ATTR(_("\nWARNING: Original file may be lost or damaged\n"),
4341 		    attr | MSG_HIST);
4342 	    MSG_PUTS_ATTR(_("don't quit the editor until the file is successfully written!"),
4343 		    attr | MSG_HIST);
4344 
4345 	    /* Update the timestamp to avoid an "overwrite changed file"
4346 	     * prompt when writing again. */
4347 	    if (mch_stat((char *)fname, &st_old) >= 0)
4348 	    {
4349 		buf_store_time(buf, &st_old, fname);
4350 		buf->b_mtime_read = buf->b_mtime;
4351 	    }
4352 	}
4353     }
4354     msg_scroll = msg_save;
4355 
4356 #ifdef FEAT_AUTOCMD
4357 #ifdef FEAT_EVAL
4358     if (!should_abort(retval))
4359 #else
4360     if (!got_int)
4361 #endif
4362     {
4363 	aco_save_T	aco;
4364 
4365 	write_no_eol_lnum = 0;	/* in case it was set by the previous read */
4366 
4367 	/*
4368 	 * Apply POST autocommands.
4369 	 * Careful: The autocommands may call buf_write() recursively!
4370 	 */
4371 	aucmd_prepbuf(&aco, buf);
4372 
4373 	if (append)
4374 	    apply_autocmds_exarg(EVENT_FILEAPPENDPOST, fname, fname,
4375 							  FALSE, curbuf, eap);
4376 	else if (filtering)
4377 	    apply_autocmds_exarg(EVENT_FILTERWRITEPOST, NULL, fname,
4378 							  FALSE, curbuf, eap);
4379 	else if (reset_changed && whole)
4380 	    apply_autocmds_exarg(EVENT_BUFWRITEPOST, fname, fname,
4381 							  FALSE, curbuf, eap);
4382 	else
4383 	    apply_autocmds_exarg(EVENT_FILEWRITEPOST, fname, fname,
4384 							  FALSE, curbuf, eap);
4385 
4386 	/* restore curwin/curbuf and a few other things */
4387 	aucmd_restbuf(&aco);
4388 
4389 #ifdef FEAT_EVAL
4390 	if (aborting())	    /* autocmds may abort script processing */
4391 	    retval = FALSE;
4392 #endif
4393     }
4394 #endif
4395 
4396     got_int |= prev_got_int;
4397 
4398 #ifdef MACOS_CLASSIC /* TODO: Is it need for MACOS_X? (Dany) */
4399     /* Update machine specific information. */
4400     mch_post_buffer_write(buf);
4401 #endif
4402     return retval;
4403 }
4404 
4405 /*
4406  * Put file name into IObuff with quotes.
4407  */
4408     static void
4409 msg_add_fname(buf, fname)
4410     buf_T	*buf;
4411     char_u	*fname;
4412 {
4413     if (fname == NULL)
4414 	fname = (char_u *)"-stdin-";
4415     home_replace(buf, fname, IObuff + 1, IOSIZE - 4, TRUE);
4416     IObuff[0] = '"';
4417     STRCAT(IObuff, "\" ");
4418 }
4419 
4420 /*
4421  * Append message for text mode to IObuff.
4422  * Return TRUE if something appended.
4423  */
4424     static int
4425 msg_add_fileformat(eol_type)
4426     int	    eol_type;
4427 {
4428 #ifndef USE_CRNL
4429     if (eol_type == EOL_DOS)
4430     {
4431 	STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[dos]") : _("[dos format]"));
4432 	return TRUE;
4433     }
4434 #endif
4435 #ifndef USE_CR
4436     if (eol_type == EOL_MAC)
4437     {
4438 	STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[mac]") : _("[mac format]"));
4439 	return TRUE;
4440     }
4441 #endif
4442 #if defined(USE_CRNL) || defined(USE_CR)
4443     if (eol_type == EOL_UNIX)
4444     {
4445 	STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[unix]") : _("[unix format]"));
4446 	return TRUE;
4447     }
4448 #endif
4449     return FALSE;
4450 }
4451 
4452 /*
4453  * Append line and character count to IObuff.
4454  */
4455     static void
4456 msg_add_lines(insert_space, lnum, nchars)
4457     int	    insert_space;
4458     long    lnum;
4459     long    nchars;
4460 {
4461     char_u  *p;
4462 
4463     p = IObuff + STRLEN(IObuff);
4464 
4465     if (insert_space)
4466 	*p++ = ' ';
4467     if (shortmess(SHM_LINES))
4468 	sprintf((char *)p, "%ldL, %ldC", lnum, nchars);
4469     else
4470     {
4471 	if (lnum == 1)
4472 	    STRCPY(p, _("1 line, "));
4473 	else
4474 	    sprintf((char *)p, _("%ld lines, "), lnum);
4475 	p += STRLEN(p);
4476 	if (nchars == 1)
4477 	    STRCPY(p, _("1 character"));
4478 	else
4479 	    sprintf((char *)p, _("%ld characters"), nchars);
4480     }
4481 }
4482 
4483 /*
4484  * Append message for missing line separator to IObuff.
4485  */
4486     static void
4487 msg_add_eol()
4488 {
4489     STRCAT(IObuff, shortmess(SHM_LAST) ? _("[noeol]") : _("[Incomplete last line]"));
4490 }
4491 
4492 /*
4493  * Check modification time of file, before writing to it.
4494  * The size isn't checked, because using a tool like "gzip" takes care of
4495  * using the same timestamp but can't set the size.
4496  */
4497     static int
4498 check_mtime(buf, st)
4499     buf_T		*buf;
4500     struct stat		*st;
4501 {
4502     if (buf->b_mtime_read != 0
4503 	    && time_differs((long)st->st_mtime, buf->b_mtime_read))
4504     {
4505 	msg_scroll = TRUE;	    /* don't overwrite messages here */
4506 	msg_silent = 0;		    /* must give this prompt */
4507 	/* don't use emsg() here, don't want to flush the buffers */
4508 	MSG_ATTR(_("WARNING: The file has been changed since reading it!!!"),
4509 						       hl_attr(HLF_E));
4510 	if (ask_yesno((char_u *)_("Do you really want to write to it"),
4511 								 TRUE) == 'n')
4512 	    return FAIL;
4513 	msg_scroll = FALSE;	    /* always overwrite the file message now */
4514     }
4515     return OK;
4516 }
4517 
4518     static int
4519 time_differs(t1, t2)
4520     long	t1, t2;
4521 {
4522 #if defined(__linux__) || defined(MSDOS) || defined(MSWIN)
4523     /* On a FAT filesystem, esp. under Linux, there are only 5 bits to store
4524      * the seconds.  Since the roundoff is done when flushing the inode, the
4525      * time may change unexpectedly by one second!!! */
4526     return (t1 - t2 > 1 || t2 - t1 > 1);
4527 #else
4528     return (t1 != t2);
4529 #endif
4530 }
4531 
4532 /*
4533  * Call write() to write a number of bytes to the file.
4534  * Also handles encryption and 'encoding' conversion.
4535  *
4536  * Return FAIL for failure, OK otherwise.
4537  */
4538     static int
4539 buf_write_bytes(ip)
4540     struct bw_info *ip;
4541 {
4542     int		wlen;
4543     char_u	*buf = ip->bw_buf;	/* data to write */
4544     int		len = ip->bw_len;	/* length of data */
4545 #ifdef HAS_BW_FLAGS
4546     int		flags = ip->bw_flags;	/* extra flags */
4547 #endif
4548 
4549 #ifdef FEAT_MBYTE
4550     /*
4551      * Skip conversion when writing the crypt magic number or the BOM.
4552      */
4553     if (!(flags & FIO_NOCONVERT))
4554     {
4555 	char_u		*p;
4556 	unsigned	c;
4557 	int		n;
4558 
4559 	if (flags & FIO_UTF8)
4560 	{
4561 	    /*
4562 	     * Convert latin1 in the buffer to UTF-8 in the file.
4563 	     */
4564 	    p = ip->bw_conv_buf;	/* translate to buffer */
4565 	    for (wlen = 0; wlen < len; ++wlen)
4566 		p += utf_char2bytes(buf[wlen], p);
4567 	    buf = ip->bw_conv_buf;
4568 	    len = (int)(p - ip->bw_conv_buf);
4569 	}
4570 	else if (flags & (FIO_UCS4 | FIO_UTF16 | FIO_UCS2 | FIO_LATIN1))
4571 	{
4572 	    /*
4573 	     * Convert UTF-8 bytes in the buffer to UCS-2, UCS-4, UTF-16 or
4574 	     * Latin1 chars in the file.
4575 	     */
4576 	    if (flags & FIO_LATIN1)
4577 		p = buf;	/* translate in-place (can only get shorter) */
4578 	    else
4579 		p = ip->bw_conv_buf;	/* translate to buffer */
4580 	    for (wlen = 0; wlen < len; wlen += n)
4581 	    {
4582 		if (wlen == 0 && ip->bw_restlen != 0)
4583 		{
4584 		    int		l;
4585 
4586 		    /* Use remainder of previous call.  Append the start of
4587 		     * buf[] to get a full sequence.  Might still be too
4588 		     * short! */
4589 		    l = CONV_RESTLEN - ip->bw_restlen;
4590 		    if (l > len)
4591 			l = len;
4592 		    mch_memmove(ip->bw_rest + ip->bw_restlen, buf, (size_t)l);
4593 		    n = utf_ptr2len_check_len(ip->bw_rest, ip->bw_restlen + l);
4594 		    if (n > ip->bw_restlen + len)
4595 		    {
4596 			/* We have an incomplete byte sequence at the end to
4597 			 * be written.  We can't convert it without the
4598 			 * remaining bytes.  Keep them for the next call. */
4599 			if (ip->bw_restlen + len > CONV_RESTLEN)
4600 			    return FAIL;
4601 			ip->bw_restlen += len;
4602 			break;
4603 		    }
4604 		    if (n > 1)
4605 			c = utf_ptr2char(ip->bw_rest);
4606 		    else
4607 			c = ip->bw_rest[0];
4608 		    if (n >= ip->bw_restlen)
4609 		    {
4610 			n -= ip->bw_restlen;
4611 			ip->bw_restlen = 0;
4612 		    }
4613 		    else
4614 		    {
4615 			ip->bw_restlen -= n;
4616 			mch_memmove(ip->bw_rest, ip->bw_rest + n,
4617 						      (size_t)ip->bw_restlen);
4618 			n = 0;
4619 		    }
4620 		}
4621 		else
4622 		{
4623 		    n = utf_ptr2len_check_len(buf + wlen, len - wlen);
4624 		    if (n > len - wlen)
4625 		    {
4626 			/* We have an incomplete byte sequence at the end to
4627 			 * be written.  We can't convert it without the
4628 			 * remaining bytes.  Keep them for the next call. */
4629 			if (len - wlen > CONV_RESTLEN)
4630 			    return FAIL;
4631 			ip->bw_restlen = len - wlen;
4632 			mch_memmove(ip->bw_rest, buf + wlen,
4633 						      (size_t)ip->bw_restlen);
4634 			break;
4635 		    }
4636 		    if (n > 1)
4637 			c = utf_ptr2char(buf + wlen);
4638 		    else
4639 			c = buf[wlen];
4640 		}
4641 
4642 		ip->bw_conv_error |= ucs2bytes(c, &p, flags);
4643 	    }
4644 	    if (flags & FIO_LATIN1)
4645 		len = (int)(p - buf);
4646 	    else
4647 	    {
4648 		buf = ip->bw_conv_buf;
4649 		len = (int)(p - ip->bw_conv_buf);
4650 	    }
4651 	}
4652 
4653 # ifdef WIN3264
4654 	else if (flags & FIO_CODEPAGE)
4655 	{
4656 	    /*
4657 	     * Convert UTF-8 or codepage to UCS-2 and then to MS-Windows
4658 	     * codepage.
4659 	     */
4660 	    char_u	*from;
4661 	    size_t	fromlen;
4662 	    char_u	*to;
4663 	    int		u8c;
4664 	    BOOL	bad = FALSE;
4665 	    int		needed;
4666 
4667 	    if (ip->bw_restlen > 0)
4668 	    {
4669 		/* Need to concatenate the remainder of the previous call and
4670 		 * the bytes of the current call.  Use the end of the
4671 		 * conversion buffer for this. */
4672 		fromlen = len + ip->bw_restlen;
4673 		from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
4674 		mch_memmove(from, ip->bw_rest, (size_t)ip->bw_restlen);
4675 		mch_memmove(from + ip->bw_restlen, buf, (size_t)len);
4676 	    }
4677 	    else
4678 	    {
4679 		from = buf;
4680 		fromlen = len;
4681 	    }
4682 
4683 	    to = ip->bw_conv_buf;
4684 	    if (enc_utf8)
4685 	    {
4686 		/* Convert from UTF-8 to UCS-2, to the start of the buffer.
4687 		 * The buffer has been allocated to be big enough. */
4688 		while (fromlen > 0)
4689 		{
4690 		    n = utf_ptr2len_check_len(from, fromlen);
4691 		    if (n > (int)fromlen)	/* incomplete byte sequence */
4692 			break;
4693 		    u8c = utf_ptr2char(from);
4694 		    *to++ = (u8c & 0xff);
4695 		    *to++ = (u8c >> 8);
4696 		    fromlen -= n;
4697 		    from += n;
4698 		}
4699 
4700 		/* Copy remainder to ip->bw_rest[] to be used for the next
4701 		 * call. */
4702 		if (fromlen > CONV_RESTLEN)
4703 		{
4704 		    /* weird overlong sequence */
4705 		    ip->bw_conv_error = TRUE;
4706 		    return FAIL;
4707 		}
4708 		mch_memmove(ip->bw_rest, from, fromlen);
4709 		ip->bw_restlen = fromlen;
4710 	    }
4711 	    else
4712 	    {
4713 		/* Convert from enc_codepage to UCS-2, to the start of the
4714 		 * buffer.  The buffer has been allocated to be big enough. */
4715 		ip->bw_restlen = 0;
4716 		needed = MultiByteToWideChar(enc_codepage,
4717 				  MB_ERR_INVALID_CHARS, (LPCSTR)from, fromlen,
4718 								     NULL, 0);
4719 		if (needed == 0)
4720 		{
4721 		    /* When conversion fails there may be a trailing byte. */
4722 		    needed = MultiByteToWideChar(enc_codepage,
4723 			      MB_ERR_INVALID_CHARS, (LPCSTR)from, fromlen - 1,
4724 								     NULL, 0);
4725 		    if (needed == 0)
4726 		    {
4727 			/* Conversion doesn't work. */
4728 			ip->bw_conv_error = TRUE;
4729 			return FAIL;
4730 		    }
4731 		    /* Save the trailing byte for the next call. */
4732 		    ip->bw_rest[0] = from[fromlen - 1];
4733 		    ip->bw_restlen = 1;
4734 		}
4735 		needed = MultiByteToWideChar(enc_codepage, MB_ERR_INVALID_CHARS,
4736 				       (LPCSTR)from, fromlen - ip->bw_restlen,
4737 							  (LPWSTR)to, needed);
4738 		if (needed == 0)
4739 		{
4740 		    /* Safety check: Conversion doesn't work. */
4741 		    ip->bw_conv_error = TRUE;
4742 		    return FAIL;
4743 		}
4744 		to += needed * 2;
4745 	    }
4746 
4747 	    fromlen = to - ip->bw_conv_buf;
4748 	    buf = to;
4749 #  ifdef CP_UTF8	/* VC 4.1 doesn't define CP_UTF8 */
4750 	    if (FIO_GET_CP(flags) == CP_UTF8)
4751 	    {
4752 		/* Convert from UCS-2 to UTF-8, using the remainder of the
4753 		 * conversion buffer.  Fails when out of space. */
4754 		for (from = ip->bw_conv_buf; fromlen > 1; fromlen -= 2)
4755 		{
4756 		    u8c = *from++;
4757 		    u8c += (*from++ << 8);
4758 		    to += utf_char2bytes(u8c, to);
4759 		    if (to + 6 >= ip->bw_conv_buf + ip->bw_conv_buflen)
4760 		    {
4761 			ip->bw_conv_error = TRUE;
4762 			return FAIL;
4763 		    }
4764 		}
4765 		len = to - buf;
4766 	    }
4767 	    else
4768 #endif
4769 	    {
4770 		/* Convert from UCS-2 to the codepage, using the remainder of
4771 		 * the conversion buffer.  If the conversion uses the default
4772 		 * character "0", the data doesn't fit in this encoding, so
4773 		 * fail. */
4774 		len = WideCharToMultiByte(FIO_GET_CP(flags), 0,
4775 			(LPCWSTR)ip->bw_conv_buf, (int)fromlen / sizeof(WCHAR),
4776 			(LPSTR)to, ip->bw_conv_buflen - fromlen, 0, &bad);
4777 		if (bad)
4778 		{
4779 		    ip->bw_conv_error = TRUE;
4780 		    return FAIL;
4781 		}
4782 	    }
4783 	}
4784 # endif
4785 
4786 # ifdef MACOS_X
4787 	else if (flags & FIO_MACROMAN)
4788 	{
4789 	    /*
4790 	     * Convert UTF-8 or latin1 to Apple MacRoman.
4791 	     */
4792 	    CFStringRef	cfstr;
4793 	    CFRange	r;
4794 	    CFIndex	l;
4795 	    char_u	*from;
4796 	    size_t	fromlen;
4797 
4798 	    if (ip->bw_restlen > 0)
4799 	    {
4800 		/* Need to concatenate the remainder of the previous call and
4801 		 * the bytes of the current call.  Use the end of the
4802 		 * conversion buffer for this. */
4803 		fromlen = len + ip->bw_restlen;
4804 		from = ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
4805 		mch_memmove(from, ip->bw_rest, (size_t)ip->bw_restlen);
4806 		mch_memmove(from + ip->bw_restlen, buf, (size_t)len);
4807 	    }
4808 	    else
4809 	    {
4810 		from = buf;
4811 		fromlen = len;
4812 	    }
4813 
4814 	    ip->bw_restlen = 0;
4815 	    cfstr = CFStringCreateWithBytes(NULL, from, fromlen,
4816 		    (enc_utf8) ?
4817 		    kCFStringEncodingUTF8 : kCFStringEncodingISOLatin1,
4818 		    0);
4819 	    while (cfstr == NULL && ip->bw_restlen < 3 && fromlen > 1)
4820 	    {
4821 		ip->bw_rest[ip->bw_restlen++] = from[--fromlen];
4822 		cfstr = CFStringCreateWithBytes(NULL, from, fromlen,
4823 		    (enc_utf8) ?
4824 		    kCFStringEncodingUTF8 : kCFStringEncodingISOLatin1,
4825 		    0);
4826 	    }
4827 	    if (cfstr == NULL)
4828 	    {
4829 		ip->bw_conv_error = TRUE;
4830 		return FAIL;
4831 	    }
4832 
4833 	    r.location = 0;
4834 	    r.length = CFStringGetLength(cfstr);
4835 	    if (r.length != CFStringGetBytes(cfstr, r,
4836 			kCFStringEncodingMacRoman,
4837 			0, /* no lossy conversion */
4838 			0, /* not external representation (since vim
4839 			    * handles this internally */
4840 			ip->bw_conv_buf, ip->bw_conv_buflen, &l))
4841 	    {
4842 		CFRelease(cfstr);
4843 		ip->bw_conv_error = TRUE;
4844 		return FAIL;
4845 	    }
4846 	    CFRelease(cfstr);
4847 	    buf = ip->bw_conv_buf;
4848 	    len = l;
4849 	}
4850 # endif
4851 
4852 # ifdef USE_ICONV
4853 	if (ip->bw_iconv_fd != (iconv_t)-1)
4854 	{
4855 	    const char	*from;
4856 	    size_t	fromlen;
4857 	    char	*to;
4858 	    size_t	tolen;
4859 
4860 	    /* Convert with iconv(). */
4861 	    if (ip->bw_restlen > 0)
4862 	    {
4863 		/* Need to concatenate the remainder of the previous call and
4864 		 * the bytes of the current call.  Use the end of the
4865 		 * conversion buffer for this. */
4866 		fromlen = len + ip->bw_restlen;
4867 		from = (char *)ip->bw_conv_buf + ip->bw_conv_buflen - fromlen;
4868 		mch_memmove((void *)from, ip->bw_rest, (size_t)ip->bw_restlen);
4869 		mch_memmove((void *)(from + ip->bw_restlen), buf, (size_t)len);
4870 		tolen = ip->bw_conv_buflen - fromlen;
4871 	    }
4872 	    else
4873 	    {
4874 		from = (const char *)buf;
4875 		fromlen = len;
4876 		tolen = ip->bw_conv_buflen;
4877 	    }
4878 	    to = (char *)ip->bw_conv_buf;
4879 
4880 	    if (ip->bw_first)
4881 	    {
4882 		size_t	save_len = tolen;
4883 
4884 		/* output the initial shift state sequence */
4885 		(void)iconv(ip->bw_iconv_fd, NULL, NULL, &to, &tolen);
4886 
4887 		/* There is a bug in iconv() on Linux (which appears to be
4888 		 * wide-spread) which sets "to" to NULL and messes up "tolen".
4889 		 */
4890 		if (to == NULL)
4891 		{
4892 		    to = (char *)ip->bw_conv_buf;
4893 		    tolen = save_len;
4894 		}
4895 		ip->bw_first = FALSE;
4896 	    }
4897 
4898 	    /*
4899 	     * If iconv() has an error or there is not enough room, fail.
4900 	     */
4901 	    if ((iconv(ip->bw_iconv_fd, (void *)&from, &fromlen, &to, &tolen)
4902 			== (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
4903 						    || fromlen > CONV_RESTLEN)
4904 	    {
4905 		ip->bw_conv_error = TRUE;
4906 		return FAIL;
4907 	    }
4908 
4909 	    /* copy remainder to ip->bw_rest[] to be used for the next call. */
4910 	    if (fromlen > 0)
4911 		mch_memmove(ip->bw_rest, (void *)from, fromlen);
4912 	    ip->bw_restlen = (int)fromlen;
4913 
4914 	    buf = ip->bw_conv_buf;
4915 	    len = (int)((char_u *)to - ip->bw_conv_buf);
4916 	}
4917 # endif
4918     }
4919 #endif /* FEAT_MBYTE */
4920 
4921 #ifdef FEAT_CRYPT
4922     if (flags & FIO_ENCRYPTED)		/* encrypt the data */
4923     {
4924 	int ztemp, t, i;
4925 
4926 	for (i = 0; i < len; i++)
4927 	{
4928 	    ztemp  = buf[i];
4929 	    buf[i] = ZENCODE(ztemp, t);
4930 	}
4931     }
4932 #endif
4933 
4934     /* Repeat the write(), it may be interrupted by a signal. */
4935     while (len)
4936     {
4937 	wlen = vim_write(ip->bw_fd, buf, len);
4938 	if (wlen <= 0)		    /* error! */
4939 	    return FAIL;
4940 	len -= wlen;
4941 	buf += wlen;
4942     }
4943     return OK;
4944 }
4945 
4946 #ifdef FEAT_MBYTE
4947 /*
4948  * Convert a Unicode character to bytes.
4949  */
4950     static int
4951 ucs2bytes(c, pp, flags)
4952     unsigned	c;		/* in: character */
4953     char_u	**pp;		/* in/out: pointer to result */
4954     int		flags;		/* FIO_ flags */
4955 {
4956     char_u	*p = *pp;
4957     int		error = FALSE;
4958     int		cc;
4959 
4960 
4961     if (flags & FIO_UCS4)
4962     {
4963 	if (flags & FIO_ENDIAN_L)
4964 	{
4965 	    *p++ = c;
4966 	    *p++ = (c >> 8);
4967 	    *p++ = (c >> 16);
4968 	    *p++ = (c >> 24);
4969 	}
4970 	else
4971 	{
4972 	    *p++ = (c >> 24);
4973 	    *p++ = (c >> 16);
4974 	    *p++ = (c >> 8);
4975 	    *p++ = c;
4976 	}
4977     }
4978     else if (flags & (FIO_UCS2 | FIO_UTF16))
4979     {
4980 	if (c >= 0x10000)
4981 	{
4982 	    if (flags & FIO_UTF16)
4983 	    {
4984 		/* Make two words, ten bits of the character in each.  First
4985 		 * word is 0xd800 - 0xdbff, second one 0xdc00 - 0xdfff */
4986 		c -= 0x10000;
4987 		if (c >= 0x100000)
4988 		    error = TRUE;
4989 		cc = ((c >> 10) & 0x3ff) + 0xd800;
4990 		if (flags & FIO_ENDIAN_L)
4991 		{
4992 		    *p++ = cc;
4993 		    *p++ = ((unsigned)cc >> 8);
4994 		}
4995 		else
4996 		{
4997 		    *p++ = ((unsigned)cc >> 8);
4998 		    *p++ = cc;
4999 		}
5000 		c = (c & 0x3ff) + 0xdc00;
5001 	    }
5002 	    else
5003 		error = TRUE;
5004 	}
5005 	if (flags & FIO_ENDIAN_L)
5006 	{
5007 	    *p++ = c;
5008 	    *p++ = (c >> 8);
5009 	}
5010 	else
5011 	{
5012 	    *p++ = (c >> 8);
5013 	    *p++ = c;
5014 	}
5015     }
5016     else    /* Latin1 */
5017     {
5018 	if (c >= 0x100)
5019 	{
5020 	    error = TRUE;
5021 	    *p++ = 0xBF;
5022 	}
5023 	else
5024 	    *p++ = c;
5025     }
5026 
5027     *pp = p;
5028     return error;
5029 }
5030 
5031 /*
5032  * Return TRUE if "a" and "b" are the same 'encoding'.
5033  * Ignores difference between "ansi" and "latin1", "ucs-4" and "ucs-4be", etc.
5034  */
5035     static int
5036 same_encoding(a, b)
5037     char_u	*a;
5038     char_u	*b;
5039 {
5040     int		f;
5041 
5042     if (STRCMP(a, b) == 0)
5043 	return TRUE;
5044     f = get_fio_flags(a);
5045     return (f != 0 && get_fio_flags(b) == f);
5046 }
5047 
5048 /*
5049  * Check "ptr" for a unicode encoding and return the FIO_ flags needed for the
5050  * internal conversion.
5051  * if "ptr" is an empty string, use 'encoding'.
5052  */
5053     static int
5054 get_fio_flags(ptr)
5055     char_u	*ptr;
5056 {
5057     int		prop;
5058 
5059     if (*ptr == NUL)
5060 	ptr = p_enc;
5061 
5062     prop = enc_canon_props(ptr);
5063     if (prop & ENC_UNICODE)
5064     {
5065 	if (prop & ENC_2BYTE)
5066 	{
5067 	    if (prop & ENC_ENDIAN_L)
5068 		return FIO_UCS2 | FIO_ENDIAN_L;
5069 	    return FIO_UCS2;
5070 	}
5071 	if (prop & ENC_4BYTE)
5072 	{
5073 	    if (prop & ENC_ENDIAN_L)
5074 		return FIO_UCS4 | FIO_ENDIAN_L;
5075 	    return FIO_UCS4;
5076 	}
5077 	if (prop & ENC_2WORD)
5078 	{
5079 	    if (prop & ENC_ENDIAN_L)
5080 		return FIO_UTF16 | FIO_ENDIAN_L;
5081 	    return FIO_UTF16;
5082 	}
5083 	return FIO_UTF8;
5084     }
5085     if (prop & ENC_LATIN1)
5086 	return FIO_LATIN1;
5087     /* must be ENC_DBCS, requires iconv() */
5088     return 0;
5089 }
5090 
5091 #ifdef WIN3264
5092 /*
5093  * Check "ptr" for a MS-Windows codepage name and return the FIO_ flags needed
5094  * for the conversion MS-Windows can do for us.  Also accept "utf-8".
5095  * Used for conversion between 'encoding' and 'fileencoding'.
5096  */
5097     static int
5098 get_win_fio_flags(ptr)
5099     char_u	*ptr;
5100 {
5101     int		cp;
5102 
5103     /* Cannot do this when 'encoding' is not utf-8 and not a codepage. */
5104     if (!enc_utf8 && enc_codepage <= 0)
5105 	return 0;
5106 
5107     cp = encname2codepage(ptr);
5108     if (cp == 0)
5109     {
5110 #  ifdef CP_UTF8	/* VC 4.1 doesn't define CP_UTF8 */
5111 	if (STRCMP(ptr, "utf-8") == 0)
5112 	    cp = CP_UTF8;
5113 	else
5114 #  endif
5115 	    return 0;
5116     }
5117     return FIO_PUT_CP(cp) | FIO_CODEPAGE;
5118 }
5119 #endif
5120 
5121 #ifdef MACOS_X
5122 /*
5123  * Check "ptr" for a Carbon supported encoding and return the FIO_ flags
5124  * needed for the internal conversion to/from utf-8 or latin1.
5125  */
5126     static int
5127 get_mac_fio_flags(ptr)
5128     char_u	*ptr;
5129 {
5130     if ((enc_utf8 || STRCMP(p_enc, "latin1") == 0)
5131 				     && (enc_canon_props(ptr) & ENC_MACROMAN))
5132 	return FIO_MACROMAN;
5133     return 0;
5134 }
5135 #endif
5136 
5137 /*
5138  * Check for a Unicode BOM (Byte Order Mark) at the start of p[size].
5139  * "size" must be at least 2.
5140  * Return the name of the encoding and set "*lenp" to the length.
5141  * Returns NULL when no BOM found.
5142  */
5143     static char_u *
5144 check_for_bom(p, size, lenp, flags)
5145     char_u	*p;
5146     long	size;
5147     int		*lenp;
5148     int		flags;
5149 {
5150     char	*name = NULL;
5151     int		len = 2;
5152 
5153     if (p[0] == 0xef && p[1] == 0xbb && size >= 3 && p[2] == 0xbf
5154 	    && (flags == FIO_ALL || flags == 0))
5155     {
5156 	name = "utf-8";		/* EF BB BF */
5157 	len = 3;
5158     }
5159     else if (p[0] == 0xff && p[1] == 0xfe)
5160     {
5161 	if (size >= 4 && p[2] == 0 && p[3] == 0
5162 	    && (flags == FIO_ALL || flags == (FIO_UCS4 | FIO_ENDIAN_L)))
5163 	{
5164 	    name = "ucs-4le";	/* FF FE 00 00 */
5165 	    len = 4;
5166 	}
5167 	else if (flags == FIO_ALL || flags == (FIO_UCS2 | FIO_ENDIAN_L))
5168 	    name = "ucs-2le";	/* FF FE */
5169 	else if (flags == (FIO_UTF16 | FIO_ENDIAN_L))
5170 	    name = "utf-16le";	/* FF FE */
5171     }
5172     else if (p[0] == 0xfe && p[1] == 0xff
5173 	    && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16))
5174     {
5175 	if (flags == FIO_UTF16)
5176 	    name = "utf-16";	/* FE FF */
5177 	else
5178 	    name = "ucs-2";	/* FE FF */
5179     }
5180     else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe
5181 	    && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4))
5182     {
5183 	name = "ucs-4";		/* 00 00 FE FF */
5184 	len = 4;
5185     }
5186 
5187     *lenp = len;
5188     return (char_u *)name;
5189 }
5190 
5191 /*
5192  * Generate a BOM in "buf[4]" for encoding "name".
5193  * Return the length of the BOM (zero when no BOM).
5194  */
5195     static int
5196 make_bom(buf, name)
5197     char_u	*buf;
5198     char_u	*name;
5199 {
5200     int		flags;
5201     char_u	*p;
5202 
5203     flags = get_fio_flags(name);
5204 
5205     /* Can't put a BOM in a non-Unicode file. */
5206     if (flags == FIO_LATIN1 || flags == 0)
5207 	return 0;
5208 
5209     if (flags == FIO_UTF8)	/* UTF-8 */
5210     {
5211 	buf[0] = 0xef;
5212 	buf[1] = 0xbb;
5213 	buf[2] = 0xbf;
5214 	return 3;
5215     }
5216     p = buf;
5217     (void)ucs2bytes(0xfeff, &p, flags);
5218     return (int)(p - buf);
5219 }
5220 #endif
5221 
5222 /*
5223  * Try to find a shortname by comparing the fullname with the current
5224  * directory.
5225  * Returns NULL if not shorter name possible, pointer into "full_path"
5226  * otherwise.
5227  */
5228     char_u *
5229 shorten_fname(full_path, dir_name)
5230     char_u	*full_path;
5231     char_u	*dir_name;
5232 {
5233     int		len;
5234     char_u	*p;
5235 
5236     if (full_path == NULL)
5237 	return NULL;
5238     len = (int)STRLEN(dir_name);
5239     if (fnamencmp(dir_name, full_path, len) == 0)
5240     {
5241 	p = full_path + len;
5242 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
5243 	/*
5244 	 * MSDOS: when a file is in the root directory, dir_name will end in a
5245 	 * slash, since C: by itself does not define a specific dir. In this
5246 	 * case p may already be correct. <negri>
5247 	 */
5248 	if (!((len > 2) && (*(p - 2) == ':')))
5249 #endif
5250 	{
5251 	    if (vim_ispathsep(*p))
5252 		++p;
5253 #ifndef VMS   /* the path separator is always part of the path */
5254 	    else
5255 		p = NULL;
5256 #endif
5257 	}
5258     }
5259 #if defined(MSDOS) || defined(MSWIN) || defined(OS2)
5260     /*
5261      * When using a file in the current drive, remove the drive name:
5262      * "A:\dir\file" -> "\dir\file".  This helps when moving a session file on
5263      * a floppy from "A:\dir" to "B:\dir".
5264      */
5265     else if (len > 3
5266 	    && TOUPPER_LOC(full_path[0]) == TOUPPER_LOC(dir_name[0])
5267 	    && full_path[1] == ':'
5268 	    && vim_ispathsep(full_path[2]))
5269 	p = full_path + 2;
5270 #endif
5271     else
5272 	p = NULL;
5273     return p;
5274 }
5275 
5276 /*
5277  * Shorten filenames for all buffers.
5278  * When "force" is TRUE: Use full path from now on for files currently being
5279  * edited, both for file name and swap file name.  Try to shorten the file
5280  * names a bit, if safe to do so.
5281  * When "force" is FALSE: Only try to shorten absolute file names.
5282  * For buffers that have buftype "nofile" or "scratch": never change the file
5283  * name.
5284  */
5285     void
5286 shorten_fnames(force)
5287     int		force;
5288 {
5289     char_u	dirname[MAXPATHL];
5290     buf_T	*buf;
5291     char_u	*p;
5292 
5293     mch_dirname(dirname, MAXPATHL);
5294     for (buf = firstbuf; buf != NULL; buf = buf->b_next)
5295     {
5296 	if (buf->b_fname != NULL
5297 #ifdef FEAT_QUICKFIX
5298 		&& !bt_nofile(buf)
5299 #endif
5300 		&& !path_with_url(buf->b_fname)
5301 		&& (force
5302 		    || buf->b_sfname == NULL
5303 		    || mch_isFullName(buf->b_sfname)))
5304 	{
5305 	    vim_free(buf->b_sfname);
5306 	    buf->b_sfname = NULL;
5307 	    p = shorten_fname(buf->b_ffname, dirname);
5308 	    if (p != NULL)
5309 	    {
5310 		buf->b_sfname = vim_strsave(p);
5311 		buf->b_fname = buf->b_sfname;
5312 	    }
5313 	    if (p == NULL || buf->b_fname == NULL)
5314 		buf->b_fname = buf->b_ffname;
5315 	}
5316 
5317 	/* Always make the swap file name a full path, a "nofile" buffer may
5318 	 * also have a swap file. */
5319 	mf_fullname(buf->b_ml.ml_mfp);
5320     }
5321 #ifdef FEAT_WINDOWS
5322     status_redraw_all();
5323 #endif
5324 }
5325 
5326 #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
5327 	|| defined(FEAT_GUI_MSWIN) \
5328 	|| defined(FEAT_GUI_MAC) \
5329 	|| defined(PROTO)
5330 /*
5331  * Shorten all filenames in "fnames[count]" by current directory.
5332  */
5333     void
5334 shorten_filenames(fnames, count)
5335     char_u	**fnames;
5336     int		count;
5337 {
5338     int		i;
5339     char_u	dirname[MAXPATHL];
5340     char_u	*p;
5341 
5342     if (fnames == NULL || count < 1)
5343 	return;
5344     mch_dirname(dirname, sizeof(dirname));
5345     for (i = 0; i < count; ++i)
5346     {
5347 	if ((p = shorten_fname(fnames[i], dirname)) != NULL)
5348 	{
5349 	    /* shorten_fname() returns pointer in given "fnames[i]".  If free
5350 	     * "fnames[i]" first, "p" becomes invalid.  So we need to copy
5351 	     * "p" first then free fnames[i]. */
5352 	    p = vim_strsave(p);
5353 	    vim_free(fnames[i]);
5354 	    fnames[i] = p;
5355 	}
5356     }
5357 }
5358 #endif
5359 
5360 /*
5361  * add extention to file name - change path/fo.o.h to path/fo.o.h.ext or
5362  * fo_o_h.ext for MSDOS or when shortname option set.
5363  *
5364  * Assumed that fname is a valid name found in the filesystem we assure that
5365  * the return value is a different name and ends in 'ext'.
5366  * "ext" MUST be at most 4 characters long if it starts with a dot, 3
5367  * characters otherwise.
5368  * Space for the returned name is allocated, must be freed later.
5369  * Returns NULL when out of memory.
5370  */
5371     char_u *
5372 modname(fname, ext, prepend_dot)
5373     char_u *fname, *ext;
5374     int	    prepend_dot;	/* may prepend a '.' to file name */
5375 {
5376     return buf_modname(
5377 #ifdef SHORT_FNAME
5378 			TRUE,
5379 #else
5380 			(curbuf->b_p_sn || curbuf->b_shortname),
5381 #endif
5382 						     fname, ext, prepend_dot);
5383 }
5384 
5385     char_u *
5386 buf_modname(shortname, fname, ext, prepend_dot)
5387     int	    shortname;		/* use 8.3 file name */
5388     char_u  *fname, *ext;
5389     int	    prepend_dot;	/* may prepend a '.' to file name */
5390 {
5391     char_u	*retval;
5392     char_u	*s;
5393     char_u	*e;
5394     char_u	*ptr;
5395     int		fnamelen, extlen;
5396 
5397     extlen = (int)STRLEN(ext);
5398 
5399     /*
5400      * If there is no file name we must get the name of the current directory
5401      * (we need the full path in case :cd is used).
5402      */
5403     if (fname == NULL || *fname == NUL)
5404     {
5405 	retval = alloc((unsigned)(MAXPATHL + extlen + 3));
5406 	if (retval == NULL)
5407 	    return NULL;
5408 	if (mch_dirname(retval, MAXPATHL) == FAIL ||
5409 				     (fnamelen = (int)STRLEN(retval)) == 0)
5410 	{
5411 	    vim_free(retval);
5412 	    return NULL;
5413 	}
5414 	if (!vim_ispathsep(retval[fnamelen - 1]))
5415 	{
5416 	    retval[fnamelen++] = PATHSEP;
5417 	    retval[fnamelen] = NUL;
5418 	}
5419 #ifndef SHORT_FNAME
5420 	prepend_dot = FALSE;	    /* nothing to prepend a dot to */
5421 #endif
5422     }
5423     else
5424     {
5425 	fnamelen = (int)STRLEN(fname);
5426 	retval = alloc((unsigned)(fnamelen + extlen + 3));
5427 	if (retval == NULL)
5428 	    return NULL;
5429 	STRCPY(retval, fname);
5430 #ifdef VMS
5431 	vms_remove_version(retval); /* we do not need versions here */
5432 #endif
5433     }
5434 
5435     /*
5436      * search backwards until we hit a '/', '\' or ':' replacing all '.'
5437      * by '_' for MSDOS or when shortname option set and ext starts with a dot.
5438      * Then truncate what is after the '/', '\' or ':' to 8 characters for
5439      * MSDOS and 26 characters for AMIGA, a lot more for UNIX.
5440      */
5441     for (ptr = retval + fnamelen; ptr >= retval; ptr--)
5442     {
5443 #ifndef RISCOS
5444 	if (*ext == '.'
5445 #ifdef USE_LONG_FNAME
5446 		    && (!USE_LONG_FNAME || shortname)
5447 #else
5448 # ifndef SHORT_FNAME
5449 		    && shortname
5450 # endif
5451 #endif
5452 								)
5453 	    if (*ptr == '.')	/* replace '.' by '_' */
5454 		*ptr = '_';
5455 #endif /* RISCOS */
5456 	if (vim_ispathsep(*ptr))
5457 	    break;
5458     }
5459     ptr++;
5460 
5461     /* the file name has at most BASENAMELEN characters. */
5462 #ifndef SHORT_FNAME
5463     if (STRLEN(ptr) > (unsigned)BASENAMELEN)
5464 	ptr[BASENAMELEN] = '\0';
5465 #endif
5466 
5467     s = ptr + STRLEN(ptr);
5468 
5469     /*
5470      * For 8.3 file names we may have to reduce the length.
5471      */
5472 #ifdef USE_LONG_FNAME
5473     if (!USE_LONG_FNAME || shortname)
5474 #else
5475 # ifndef SHORT_FNAME
5476     if (shortname)
5477 # endif
5478 #endif
5479     {
5480 	/*
5481 	 * If there is no file name, or the file name ends in '/', and the
5482 	 * extension starts with '.', put a '_' before the dot, because just
5483 	 * ".ext" is invalid.
5484 	 */
5485 	if (fname == NULL || *fname == NUL
5486 				   || vim_ispathsep(fname[STRLEN(fname) - 1]))
5487 	{
5488 #ifdef RISCOS
5489 	    if (*ext == '/')
5490 #else
5491 	    if (*ext == '.')
5492 #endif
5493 		*s++ = '_';
5494 	}
5495 	/*
5496 	 * If the extension starts with '.', truncate the base name at 8
5497 	 * characters
5498 	 */
5499 #ifdef RISCOS
5500 	/* We normally use '/', but swap files are '_' */
5501 	else if (*ext == '/' || *ext == '_')
5502 #else
5503 	else if (*ext == '.')
5504 #endif
5505 	{
5506 	    if (s - ptr > (size_t)8)
5507 	    {
5508 		s = ptr + 8;
5509 		*s = '\0';
5510 	    }
5511 	}
5512 	/*
5513 	 * If the extension doesn't start with '.', and the file name
5514 	 * doesn't have an extension yet, append a '.'
5515 	 */
5516 #ifdef RISCOS
5517 	else if ((e = vim_strchr(ptr, '/')) == NULL)
5518 	    *s++ = '/';
5519 #else
5520 	else if ((e = vim_strchr(ptr, '.')) == NULL)
5521 	    *s++ = '.';
5522 #endif
5523 	/*
5524 	 * If the extension doesn't start with '.', and there already is an
5525 	 * extension, it may need to be tructated
5526 	 */
5527 	else if ((int)STRLEN(e) + extlen > 4)
5528 	    s = e + 4 - extlen;
5529     }
5530 #if defined(OS2) || defined(USE_LONG_FNAME) || defined(WIN3264)
5531     /*
5532      * If there is no file name, and the extension starts with '.', put a
5533      * '_' before the dot, because just ".ext" may be invalid if it's on a
5534      * FAT partition, and on HPFS it doesn't matter.
5535      */
5536     else if ((fname == NULL || *fname == NUL) && *ext == '.')
5537 	*s++ = '_';
5538 #endif
5539 
5540     /*
5541      * Append the extention.
5542      * ext can start with '.' and cannot exceed 3 more characters.
5543      */
5544     STRCPY(s, ext);
5545 
5546 #ifndef SHORT_FNAME
5547     /*
5548      * Prepend the dot.
5549      */
5550     if (prepend_dot && !shortname && *(e = gettail(retval)) !=
5551 #ifdef RISCOS
5552 	    '/'
5553 #else
5554 	    '.'
5555 #endif
5556 #ifdef USE_LONG_FNAME
5557 	    && USE_LONG_FNAME
5558 #endif
5559 				)
5560     {
5561 	mch_memmove(e + 1, e, STRLEN(e) + 1);
5562 #ifdef RISCOS
5563 	*e = '/';
5564 #else
5565 	*e = '.';
5566 #endif
5567     }
5568 #endif
5569 
5570     /*
5571      * Check that, after appending the extension, the file name is really
5572      * different.
5573      */
5574     if (fname != NULL && STRCMP(fname, retval) == 0)
5575     {
5576 	/* we search for a character that can be replaced by '_' */
5577 	while (--s >= ptr)
5578 	{
5579 	    if (*s != '_')
5580 	    {
5581 		*s = '_';
5582 		break;
5583 	    }
5584 	}
5585 	if (s < ptr)	/* fname was "________.<ext>", how tricky! */
5586 	    *ptr = 'v';
5587     }
5588     return retval;
5589 }
5590 
5591 /*
5592  * Like fgets(), but if the file line is too long, it is truncated and the
5593  * rest of the line is thrown away.  Returns TRUE for end-of-file.
5594  */
5595     int
5596 vim_fgets(buf, size, fp)
5597     char_u	*buf;
5598     int		size;
5599     FILE	*fp;
5600 {
5601     char	*eof;
5602 #define FGETS_SIZE 200
5603     char	tbuf[FGETS_SIZE];
5604 
5605     buf[size - 2] = NUL;
5606 #ifdef USE_CR
5607     eof = fgets_cr((char *)buf, size, fp);
5608 #else
5609     eof = fgets((char *)buf, size, fp);
5610 #endif
5611     if (buf[size - 2] != NUL && buf[size - 2] != '\n')
5612     {
5613 	buf[size - 1] = NUL;	    /* Truncate the line */
5614 
5615 	/* Now throw away the rest of the line: */
5616 	do
5617 	{
5618 	    tbuf[FGETS_SIZE - 2] = NUL;
5619 #ifdef USE_CR
5620 	    fgets_cr((char *)tbuf, FGETS_SIZE, fp);
5621 #else
5622 	    fgets((char *)tbuf, FGETS_SIZE, fp);
5623 #endif
5624 	} while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
5625     }
5626     return (eof == NULL);
5627 }
5628 
5629 #if defined(USE_CR) || defined(PROTO)
5630 /*
5631  * Like vim_fgets(), but accept any line terminator: CR, CR-LF or LF.
5632  * Returns TRUE for end-of-file.
5633  * Only used for the Mac, because it's much slower than vim_fgets().
5634  */
5635     int
5636 tag_fgets(buf, size, fp)
5637     char_u	*buf;
5638     int		size;
5639     FILE	*fp;
5640 {
5641     int		i = 0;
5642     int		c;
5643     int		eof = FALSE;
5644 
5645     for (;;)
5646     {
5647 	c = fgetc(fp);
5648 	if (c == EOF)
5649 	{
5650 	    eof = TRUE;
5651 	    break;
5652 	}
5653 	if (c == '\r')
5654 	{
5655 	    /* Always store a NL for end-of-line. */
5656 	    if (i < size - 1)
5657 		buf[i++] = '\n';
5658 	    c = fgetc(fp);
5659 	    if (c != '\n')	/* Macintosh format: single CR. */
5660 		ungetc(c, fp);
5661 	    break;
5662 	}
5663 	if (i < size - 1)
5664 	    buf[i++] = c;
5665 	if (c == '\n')
5666 	    break;
5667     }
5668     buf[i] = NUL;
5669     return eof;
5670 }
5671 #endif
5672 
5673 /*
5674  * rename() only works if both files are on the same file system, this
5675  * function will (attempts to?) copy the file across if rename fails -- webb
5676  * Return -1 for failure, 0 for success.
5677  */
5678     int
5679 vim_rename(from, to)
5680     char_u	*from;
5681     char_u	*to;
5682 {
5683     int		fd_in;
5684     int		fd_out;
5685     int		n;
5686     char	*errmsg = NULL;
5687     char	*buffer;
5688 #ifdef AMIGA
5689     BPTR	flock;
5690 #endif
5691     struct stat	st;
5692 
5693     /*
5694      * When the names are identical, there is nothing to do.
5695      */
5696     if (fnamecmp(from, to) == 0)
5697 	return 0;
5698 
5699     /*
5700      * Fail if the "from" file doesn't exist.  Avoids that "to" is deleted.
5701      */
5702     if (mch_stat((char *)from, &st) < 0)
5703 	return -1;
5704 
5705     /*
5706      * Delete the "to" file, this is required on some systems to make the
5707      * mch_rename() work, on other systems it makes sure that we don't have
5708      * two files when the mch_rename() fails.
5709      */
5710 
5711 #ifdef AMIGA
5712     /*
5713      * With MSDOS-compatible filesystems (crossdos, messydos) it is possible
5714      * that the name of the "to" file is the same as the "from" file, even
5715      * though the names are different. To avoid the chance of accidently
5716      * deleting the "from" file (horror!) we lock it during the remove.
5717      *
5718      * When used for making a backup before writing the file: This should not
5719      * happen with ":w", because startscript() should detect this problem and
5720      * set buf->b_shortname, causing modname() to return a correct ".bak" file
5721      * name.  This problem does exist with ":w filename", but then the
5722      * original file will be somewhere else so the backup isn't really
5723      * important. If autoscripting is off the rename may fail.
5724      */
5725     flock = Lock((UBYTE *)from, (long)ACCESS_READ);
5726 #endif
5727     mch_remove(to);
5728 #ifdef AMIGA
5729     if (flock)
5730 	UnLock(flock);
5731 #endif
5732 
5733     /*
5734      * First try a normal rename, return if it works.
5735      */
5736     if (mch_rename((char *)from, (char *)to) == 0)
5737 	return 0;
5738 
5739     /*
5740      * Rename() failed, try copying the file.
5741      */
5742     fd_in = mch_open((char *)from, O_RDONLY|O_EXTRA, 0);
5743     if (fd_in == -1)
5744 	return -1;
5745     fd_out = mch_open((char *)to, O_CREAT|O_EXCL|O_WRONLY|O_EXTRA, 0666);
5746     if (fd_out == -1)
5747     {
5748 	close(fd_in);
5749 	return -1;
5750     }
5751 
5752     buffer = (char *)alloc(BUFSIZE);
5753     if (buffer == NULL)
5754     {
5755 	close(fd_in);
5756 	close(fd_out);
5757 	return -1;
5758     }
5759 
5760     while ((n = vim_read(fd_in, buffer, BUFSIZE)) > 0)
5761 	if (vim_write(fd_out, buffer, n) != n)
5762 	{
5763 	    errmsg = _("E208: Error writing to \"%s\"");
5764 	    break;
5765 	}
5766 
5767     vim_free(buffer);
5768     close(fd_in);
5769     if (close(fd_out) < 0)
5770 	errmsg = _("E209: Error closing \"%s\"");
5771     if (n < 0)
5772     {
5773 	errmsg = _("E210: Error reading \"%s\"");
5774 	to = from;
5775     }
5776     if (errmsg != NULL)
5777     {
5778 	EMSG2(errmsg, to);
5779 	return -1;
5780     }
5781     mch_remove(from);
5782     return 0;
5783 }
5784 
5785 static int already_warned = FALSE;
5786 
5787 /*
5788  * Check if any not hidden buffer has been changed.
5789  * Postpone the check if there are characters in the stuff buffer, a global
5790  * command is being executed, a mapping is being executed or an autocommand is
5791  * busy.
5792  * Returns TRUE if some message was written (screen should be redrawn and
5793  * cursor positioned).
5794  */
5795     int
5796 check_timestamps(focus)
5797     int		focus;		/* called for GUI focus event */
5798 {
5799     buf_T	*buf;
5800     int		didit = 0;
5801     int		n;
5802 
5803     /* Don't check timestamps while system() or another low-level function may
5804      * cause us to lose and gain focus. */
5805     if (no_check_timestamps > 0)
5806 	return FALSE;
5807 
5808     /* Avoid doing a check twice.  The OK/Reload dialog can cause a focus
5809      * event and we would keep on checking if the file is steadily growing.
5810      * Do check again after typing something. */
5811     if (focus && did_check_timestamps)
5812     {
5813 	need_check_timestamps = TRUE;
5814 	return FALSE;
5815     }
5816 
5817     if (!stuff_empty() || global_busy || !typebuf_typed()
5818 #ifdef FEAT_AUTOCMD
5819 			|| autocmd_busy
5820 #endif
5821 					)
5822 	need_check_timestamps = TRUE;		/* check later */
5823     else
5824     {
5825 	++no_wait_return;
5826 	did_check_timestamps = TRUE;
5827 	already_warned = FALSE;
5828 	for (buf = firstbuf; buf != NULL; )
5829 	{
5830 	    /* Only check buffers in a window. */
5831 	    if (buf->b_nwindows > 0)
5832 	    {
5833 		n = buf_check_timestamp(buf, focus);
5834 		if (didit < n)
5835 		    didit = n;
5836 		if (n > 0 && !buf_valid(buf))
5837 		{
5838 		    /* Autocommands have removed the buffer, start at the
5839 		     * first one again. */
5840 		    buf = firstbuf;
5841 		    continue;
5842 		}
5843 	    }
5844 	    buf = buf->b_next;
5845 	}
5846 	--no_wait_return;
5847 	need_check_timestamps = FALSE;
5848 	if (need_wait_return && didit == 2)
5849 	{
5850 	    /* make sure msg isn't overwritten */
5851 	    msg_puts((char_u *)"\n");
5852 	    out_flush();
5853 	}
5854     }
5855     return didit;
5856 }
5857 
5858 /*
5859  * Move all the lines from buffer "frombuf" to buffer "tobuf".
5860  * Return OK or FAIL.  When FAIL "tobuf" is incomplete and/or "frombuf" is not
5861  * empty.
5862  */
5863     static int
5864 move_lines(frombuf, tobuf)
5865     buf_T	*frombuf;
5866     buf_T	*tobuf;
5867 {
5868     buf_T	*tbuf = curbuf;
5869     int		retval = OK;
5870     linenr_T	lnum;
5871     char_u	*p;
5872 
5873     /* Copy the lines in "frombuf" to "tobuf". */
5874     curbuf = tobuf;
5875     for (lnum = 1; lnum <= frombuf->b_ml.ml_line_count; ++lnum)
5876     {
5877 	p = vim_strsave(ml_get_buf(frombuf, lnum, FALSE));
5878 	if (p == NULL || ml_append(lnum - 1, p, 0, FALSE) == FAIL)
5879 	{
5880 	    vim_free(p);
5881 	    retval = FAIL;
5882 	    break;
5883 	}
5884 	vim_free(p);
5885     }
5886 
5887     /* Delete all the lines in "frombuf". */
5888     if (retval != FAIL)
5889     {
5890 	curbuf = frombuf;
5891 	while (!bufempty())
5892 	    if (ml_delete(curbuf->b_ml.ml_line_count, FALSE) == FAIL)
5893 	    {
5894 		/* Oops!  We could try putting back the saved lines, but that
5895 		 * might fail again... */
5896 		retval = FAIL;
5897 		break;
5898 	    }
5899     }
5900 
5901     curbuf = tbuf;
5902     return retval;
5903 }
5904 
5905 /*
5906  * Check if buffer "buf" has been changed.
5907  * Also check if the file for a new buffer unexpectedly appeared.
5908  * return 1 if a changed buffer was found.
5909  * return 2 if a message has been displayed.
5910  * return 0 otherwise.
5911  */
5912 /*ARGSUSED*/
5913     int
5914 buf_check_timestamp(buf, focus)
5915     buf_T	*buf;
5916     int		focus;		/* called for GUI focus event */
5917 {
5918     struct stat	st;
5919     int		stat_res;
5920     int		retval = 0;
5921     char_u	*path;
5922     char_u	*tbuf;
5923     char	*mesg = NULL;
5924     char	*mesg2;
5925     int		helpmesg = FALSE;
5926     int		reload = FALSE;
5927 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
5928     int		can_reload = FALSE;
5929 #endif
5930     size_t	orig_size = buf->b_orig_size;
5931     int		orig_mode = buf->b_orig_mode;
5932 #ifdef FEAT_GUI
5933     int		save_mouse_correct = need_mouse_correct;
5934 #endif
5935 #ifdef FEAT_AUTOCMD
5936     static int	busy = FALSE;
5937 #endif
5938 
5939     /* If there is no file name, the buffer is not loaded, 'buftype' is
5940      * set, we are in the middle of a save or being called recursively: ignore
5941      * this buffer. */
5942     if (buf->b_ffname == NULL
5943 	    || buf->b_ml.ml_mfp == NULL
5944 #if defined(FEAT_QUICKFIX)
5945 	    || *buf->b_p_bt != NUL
5946 #endif
5947 	    || buf->b_saving
5948 #ifdef FEAT_AUTOCMD
5949 	    || busy
5950 #endif
5951 	    )
5952 	return 0;
5953 
5954     if (       !(buf->b_flags & BF_NOTEDITED)
5955 	    && buf->b_mtime != 0
5956 	    && ((stat_res = mch_stat((char *)buf->b_ffname, &st)) < 0
5957 		|| time_differs((long)st.st_mtime, buf->b_mtime)
5958 #ifdef HAVE_ST_MODE
5959 		|| (int)st.st_mode != buf->b_orig_mode
5960 #else
5961 		|| mch_getperm(buf->b_ffname) != buf->b_orig_mode
5962 #endif
5963 		))
5964     {
5965 	retval = 1;
5966 
5967 	/* set b_mtime to stop further warnings */
5968 	if (stat_res < 0)
5969 	{
5970 	    buf->b_mtime = 0;
5971 	    buf->b_orig_size = 0;
5972 	    buf->b_orig_mode = 0;
5973 	}
5974 	else
5975 	    buf_store_time(buf, &st, buf->b_ffname);
5976 
5977 	/* Don't do anything for a directory.  Might contain the file
5978 	 * explorer. */
5979 	if (mch_isdir(buf->b_fname))
5980 	    ;
5981 
5982 	/*
5983 	 * If 'autoread' is set, the buffer has no changes and the file still
5984 	 * exists, reload the buffer.  Use the buffer-local option value if it
5985 	 * was set, the global option value otherwise.
5986 	 */
5987 	else if ((buf->b_p_ar >= 0 ? buf->b_p_ar : p_ar)
5988 				       && !bufIsChanged(buf) && stat_res >= 0)
5989 	    reload = TRUE;
5990 	else
5991 	{
5992 #ifdef FEAT_AUTOCMD
5993 	    int n;
5994 
5995 	    /*
5996 	     * Only give the warning if there are no FileChangedShell
5997 	     * autocommands.
5998 	     * Avoid being called recursively by setting "busy".
5999 	     */
6000 	    busy = TRUE;
6001 	    n = apply_autocmds(EVENT_FILECHANGEDSHELL,
6002 				      buf->b_fname, buf->b_fname, FALSE, buf);
6003 	    busy = FALSE;
6004 	    if (n)
6005 	    {
6006 		if (!buf_valid(buf))
6007 		    EMSG(_("E246: FileChangedShell autocommand deleted buffer"));
6008 		return 2;
6009 	    }
6010 	    else
6011 #endif
6012 	    {
6013 		if (stat_res < 0)
6014 		    mesg = _("E211: Warning: File \"%s\" no longer available");
6015 		else
6016 		{
6017 		    helpmesg = TRUE;
6018 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
6019 		    can_reload = TRUE;
6020 #endif
6021 		    /*
6022 		     * Check if the file contents really changed to avoid
6023 		     * giving a warning when only the timestamp was set (e.g.,
6024 		     * checked out of CVS).  Always warn when the buffer was
6025 		     * changed.
6026 		     */
6027 		    if (bufIsChanged(buf))
6028 			mesg = _("W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as well");
6029 		    else if (orig_size != buf->b_orig_size
6030 			    || buf_contents_changed(buf))
6031 			mesg = _("W11: Warning: File \"%s\" has changed since editing started");
6032 		    else if (orig_mode != buf->b_orig_mode)
6033 			mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started");
6034 		}
6035 	    }
6036 	}
6037 
6038     }
6039     else if ((buf->b_flags & BF_NEW) && !(buf->b_flags & BF_NEW_W)
6040 						&& vim_fexists(buf->b_ffname))
6041     {
6042 	retval = 1;
6043 	mesg = _("W13: Warning: File \"%s\" has been created after editing started");
6044 	buf->b_flags |= BF_NEW_W;
6045 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
6046 	can_reload = TRUE;
6047 #endif
6048     }
6049 
6050     if (mesg != NULL)
6051     {
6052 	path = home_replace_save(buf, buf->b_fname);
6053 	if (path != NULL)
6054 	{
6055 	    if (helpmesg)
6056 		mesg2 = _("See \":help W11\" for more info.");
6057 	    else
6058 		mesg2 = "";
6059 	    tbuf = alloc((unsigned)(STRLEN(path) + STRLEN(mesg)
6060 							+ STRLEN(mesg2) + 2));
6061 	    sprintf((char *)tbuf, mesg, path);
6062 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
6063 	    if (can_reload)
6064 	    {
6065 		if (*mesg2 != NUL)
6066 		{
6067 		    STRCAT(tbuf, "\n");
6068 		    STRCAT(tbuf, mesg2);
6069 		}
6070 		if (do_dialog(VIM_WARNING, (char_u *)_("Warning"), tbuf,
6071 				(char_u *)_("&OK\n&Load File"), 1, NULL) == 2)
6072 		    reload = TRUE;
6073 	    }
6074 	    else
6075 #endif
6076 	    if (State > NORMAL_BUSY || (State & CMDLINE) || already_warned)
6077 	    {
6078 		if (*mesg2 != NUL)
6079 		{
6080 		    STRCAT(tbuf, "; ");
6081 		    STRCAT(tbuf, mesg2);
6082 		}
6083 		EMSG(tbuf);
6084 		retval = 2;
6085 	    }
6086 	    else
6087 	    {
6088 # ifdef FEAT_AUTOCMD
6089 		if (!autocmd_busy)
6090 # endif
6091 		{
6092 		    msg_start();
6093 		    msg_puts_attr(tbuf, hl_attr(HLF_E) + MSG_HIST);
6094 		    if (*mesg2 != NUL)
6095 			msg_puts_attr((char_u *)mesg2,
6096 						   hl_attr(HLF_W) + MSG_HIST);
6097 		    msg_clr_eos();
6098 		    (void)msg_end();
6099 		    if (emsg_silent == 0)
6100 		    {
6101 			out_flush();
6102 # ifdef FEAT_GUI
6103 			if (!focus)
6104 # endif
6105 			    /* give the user some time to think about it */
6106 			    ui_delay(1000L, TRUE);
6107 
6108 			/* don't redraw and erase the message */
6109 			redraw_cmdline = FALSE;
6110 		    }
6111 		}
6112 		already_warned = TRUE;
6113 	    }
6114 
6115 	    vim_free(path);
6116 	    vim_free(tbuf);
6117 	}
6118     }
6119 
6120     if (reload)
6121     {
6122 	exarg_T		ea;
6123 	pos_T		old_cursor;
6124 	linenr_T	old_topline;
6125 	int		old_ro = buf->b_p_ro;
6126 	buf_T		*savebuf;
6127 	int		saved = OK;
6128 #ifdef FEAT_AUTOCMD
6129 	aco_save_T	aco;
6130 
6131 	/* set curwin/curbuf for "buf" and save some things */
6132 	aucmd_prepbuf(&aco, buf);
6133 #else
6134 	buf_T	*save_curbuf = curbuf;
6135 
6136 	curbuf = buf;
6137 	curwin->w_buffer = buf;
6138 #endif
6139 
6140 	/* We only want to read the text from the file, not reset the syntax
6141 	 * highlighting, clear marks, diff status, etc.  Force the fileformat
6142 	 * and encoding to be the same. */
6143 	if (prep_exarg(&ea, buf) == OK)
6144 	{
6145 	    old_cursor = curwin->w_cursor;
6146 	    old_topline = curwin->w_topline;
6147 
6148 	    /*
6149 	     * To behave like when a new file is edited (matters for
6150 	     * BufReadPost autocommands) we first need to delete the current
6151 	     * buffer contents.  But if reading the file fails we should keep
6152 	     * the old contents.  Can't use memory only, the file might be
6153 	     * too big.  Use a hidden buffer to move the buffer contents to.
6154 	     */
6155 	    if (bufempty())
6156 		savebuf = NULL;
6157 	    else
6158 	    {
6159 		/* Allocate a buffer without putting it in the buffer list. */
6160 		savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
6161 		if (savebuf != NULL)
6162 		{
6163 		    /* Open the memline. */
6164 		    curbuf = savebuf;
6165 		    curwin->w_buffer = savebuf;
6166 		    saved = ml_open();
6167 		    curbuf = buf;
6168 		    curwin->w_buffer = buf;
6169 		}
6170 		if (savebuf == NULL || saved == FAIL
6171 					  || move_lines(buf, savebuf) == FAIL)
6172 		{
6173 		    EMSG2(_("E462: Could not prepare for reloading \"%s\""),
6174 								buf->b_fname);
6175 		    saved = FAIL;
6176 		}
6177 	    }
6178 
6179 	    if (saved == OK)
6180 	    {
6181 		curbuf->b_flags |= BF_CHECK_RO;	/* check for RO again */
6182 #ifdef FEAT_AUTOCMD
6183 		keep_filetype = TRUE;		/* don't detect 'filetype' */
6184 #endif
6185 		if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
6186 			    (linenr_T)0,
6187 			    (linenr_T)MAXLNUM, &ea, READ_NEW) == FAIL)
6188 		{
6189 #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
6190 		    if (!aborting())
6191 #endif
6192 			EMSG2(_("E321: Could not reload \"%s\""), buf->b_fname);
6193 		    if (savebuf != NULL)
6194 		    {
6195 			/* Put the text back from the save buffer.  First
6196 			 * delete any lines that readfile() added. */
6197 			while (!bufempty())
6198 			    if (ml_delete(curbuf->b_ml.ml_line_count, FALSE)
6199 								      == FAIL)
6200 				break;
6201 			(void)move_lines(savebuf, buf);
6202 		    }
6203 		}
6204 		else
6205 		{
6206 		    /* Mark the buffer as unmodified and free undo info. */
6207 		    unchanged(buf, TRUE);
6208 		    u_blockfree(buf);
6209 		    u_clearall(buf);
6210 		}
6211 	    }
6212 	    vim_free(ea.cmd);
6213 
6214 	    if (savebuf != NULL)
6215 		wipe_buffer(savebuf, FALSE);
6216 
6217 #ifdef FEAT_DIFF
6218 	    /* Invalidate diff info if necessary. */
6219 	    diff_invalidate();
6220 #endif
6221 
6222 	    /* Restore the topline and cursor position and check it (lines may
6223 	     * have been removed). */
6224 	    if (old_topline > curbuf->b_ml.ml_line_count)
6225 		curwin->w_topline = curbuf->b_ml.ml_line_count;
6226 	    else
6227 		curwin->w_topline = old_topline;
6228 	    curwin->w_cursor = old_cursor;
6229 	    check_cursor();
6230 	    update_topline();
6231 #ifdef FEAT_AUTOCMD
6232 	    keep_filetype = FALSE;
6233 #endif
6234 #ifdef FEAT_FOLDING
6235 	    {
6236 		win_T *wp;
6237 
6238 		/* Update folds unless they are defined manually. */
6239 		FOR_ALL_WINDOWS(wp)
6240 		    if (wp->w_buffer == curwin->w_buffer
6241 			    && !foldmethodIsManual(wp))
6242 			foldUpdateAll(wp);
6243 	    }
6244 #endif
6245 	    /* If the mode didn't change and 'readonly' was set, keep the old
6246 	     * value; the user probably used the ":view" command.  But don't
6247 	     * reset it, might have had a read error. */
6248 	    if (orig_mode == curbuf->b_orig_mode)
6249 		curbuf->b_p_ro |= old_ro;
6250 	}
6251 
6252 #ifdef FEAT_AUTOCMD
6253 	/* restore curwin/curbuf and a few other things */
6254 	aucmd_restbuf(&aco);
6255 	/* Careful: autocommands may have made "buf" invalid! */
6256 #else
6257 	curwin->w_buffer = save_curbuf;
6258 	curbuf = save_curbuf;
6259 #endif
6260     }
6261 
6262 #ifdef FEAT_GUI
6263     /* restore this in case an autocommand has set it; it would break
6264      * 'mousefocus' */
6265     need_mouse_correct = save_mouse_correct;
6266 #endif
6267 
6268     return retval;
6269 }
6270 
6271 /*ARGSUSED*/
6272     void
6273 buf_store_time(buf, st, fname)
6274     buf_T	*buf;
6275     struct stat	*st;
6276     char_u	*fname;
6277 {
6278     buf->b_mtime = (long)st->st_mtime;
6279     buf->b_orig_size = (size_t)st->st_size;
6280 #ifdef HAVE_ST_MODE
6281     buf->b_orig_mode = (int)st->st_mode;
6282 #else
6283     buf->b_orig_mode = mch_getperm(fname);
6284 #endif
6285 }
6286 
6287 /*
6288  * Adjust the line with missing eol, used for the next write.
6289  * Used for do_filter(), when the input lines for the filter are deleted.
6290  */
6291     void
6292 write_lnum_adjust(offset)
6293     linenr_T	offset;
6294 {
6295     if (write_no_eol_lnum)		/* only if there is a missing eol */
6296 	write_no_eol_lnum += offset;
6297 }
6298 
6299 #if defined(TEMPDIRNAMES) || defined(PROTO)
6300 static long	temp_count = 0;		/* Temp filename counter. */
6301 
6302 /*
6303  * Delete the temp directory and all files it contains.
6304  */
6305     void
6306 vim_deltempdir()
6307 {
6308     char_u	**files;
6309     int		file_count;
6310     int		i;
6311 
6312     if (vim_tempdir != NULL)
6313     {
6314 	sprintf((char *)NameBuff, "%s*", vim_tempdir);
6315 	if (gen_expand_wildcards(1, &NameBuff, &file_count, &files,
6316 					      EW_DIR|EW_FILE|EW_SILENT) == OK)
6317 	{
6318 	    for (i = 0; i < file_count; ++i)
6319 		mch_remove(files[i]);
6320 	    FreeWild(file_count, files);
6321 	}
6322 	gettail(NameBuff)[-1] = NUL;
6323 	(void)mch_rmdir(NameBuff);
6324 
6325 	vim_free(vim_tempdir);
6326 	vim_tempdir = NULL;
6327     }
6328 }
6329 #endif
6330 
6331 /*
6332  * vim_tempname(): Return a unique name that can be used for a temp file.
6333  *
6334  * The temp file is NOT created.
6335  *
6336  * The returned pointer is to allocated memory.
6337  * The returned pointer is NULL if no valid name was found.
6338  */
6339 /*ARGSUSED*/
6340     char_u  *
6341 vim_tempname(extra_char)
6342     int	    extra_char;	    /* character to use in the name instead of '?' */
6343 {
6344 #ifdef USE_TMPNAM
6345     char_u	itmp[L_tmpnam];	/* use tmpnam() */
6346 #else
6347     char_u	itmp[TEMPNAMELEN];
6348 #endif
6349 
6350 #ifdef TEMPDIRNAMES
6351     static char	*(tempdirs[]) = {TEMPDIRNAMES};
6352     int		i;
6353     long	nr;
6354     long	off;
6355 # ifndef EEXIST
6356     struct stat	st;
6357 # endif
6358 
6359     /*
6360      * This will create a directory for private use by this instance of Vim.
6361      * This is done once, and the same directory is used for all temp files.
6362      * This method avoids security problems because of symlink attacks et al.
6363      * It's also a bit faster, because we only need to check for an existing
6364      * file when creating the directory and not for each temp file.
6365      */
6366     if (vim_tempdir == NULL)
6367     {
6368 	/*
6369 	 * Try the entries in TEMPDIRNAMES to create the temp directory.
6370 	 */
6371 	for (i = 0; i < sizeof(tempdirs) / sizeof(char *); ++i)
6372 	{
6373 	    /* expand $TMP, leave room for "/v1100000/999999999" */
6374 	    expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20);
6375 	    if (mch_isdir(itmp))		/* directory exists */
6376 	    {
6377 # ifdef __EMX__
6378 		/* If $TMP contains a forward slash (perhaps using bash or
6379 		 * tcsh), don't add a backslash, use a forward slash!
6380 		 * Adding 2 backslashes didn't work. */
6381 		if (vim_strchr(itmp, '/') != NULL)
6382 		    STRCAT(itmp, "/");
6383 		else
6384 # endif
6385 		    add_pathsep(itmp);
6386 
6387 		/* Get an arbitrary number of up to 6 digits.  When it's
6388 		 * unlikely that it already exists it will be faster,
6389 		 * otherwise it doesn't matter.  The use of mkdir() avoids any
6390 		 * security problems because of the predictable number. */
6391 		nr = (mch_get_pid() + (long)time(NULL)) % 1000000L;
6392 
6393 		/* Try up to 10000 different values until we find a name that
6394 		 * doesn't exist. */
6395 		for (off = 0; off < 10000L; ++off)
6396 		{
6397 		    int		r;
6398 #if defined(UNIX) || defined(VMS)
6399 		    mode_t	umask_save;
6400 #endif
6401 
6402 		    sprintf((char *)itmp + STRLEN(itmp), "v%ld", nr + off);
6403 # ifndef EEXIST
6404 		    /* If mkdir() does not set errno to EEXIST, check for
6405 		     * existing file here.  There is a race condition then,
6406 		     * although it's fail-safe. */
6407 		    if (mch_stat((char *)itmp, &st) >= 0)
6408 			continue;
6409 # endif
6410 #if defined(UNIX) || defined(VMS)
6411 		    /* Make sure the umask doesn't remove the executable bit.
6412 		     * "repl" has been reported to use "177". */
6413 		    umask_save = umask(077);
6414 #endif
6415 		    r = vim_mkdir(itmp, 0700);
6416 #if defined(UNIX) || defined(VMS)
6417 		    (void)umask(umask_save);
6418 #endif
6419 		    if (r == 0)
6420 		    {
6421 			char_u	*buf;
6422 
6423 			/* Directory was created, use this name.
6424 			 * Expand to full path; When using the current
6425 			 * directory a ":cd" would confuse us. */
6426 			buf = alloc((unsigned)MAXPATHL + 1);
6427 			if (buf != NULL)
6428 			{
6429 			    if (vim_FullName(itmp, buf, MAXPATHL, FALSE)
6430 								      == FAIL)
6431 				STRCPY(buf, itmp);
6432 # ifdef __EMX__
6433 			    if (vim_strchr(buf, '/') != NULL)
6434 				STRCAT(buf, "/");
6435 			    else
6436 # endif
6437 				add_pathsep(buf);
6438 			    vim_tempdir = vim_strsave(buf);
6439 			    vim_free(buf);
6440 			}
6441 			break;
6442 		    }
6443 # ifdef EEXIST
6444 		    /* If the mkdir() didn't fail because the file/dir exists,
6445 		     * we probably can't create any dir here, try another
6446 		     * place. */
6447 		    if (errno != EEXIST)
6448 # endif
6449 			break;
6450 		}
6451 		if (vim_tempdir != NULL)
6452 		    break;
6453 	    }
6454 	}
6455     }
6456 
6457     if (vim_tempdir != NULL)
6458     {
6459 	/* There is no need to check if the file exists, because we own the
6460 	 * directory and nobody else creates a file in it. */
6461 	sprintf((char *)itmp, "%s%ld", vim_tempdir, temp_count++);
6462 	return vim_strsave(itmp);
6463     }
6464 
6465     return NULL;
6466 
6467 #else /* TEMPDIRNAMES */
6468 
6469 # ifdef WIN3264
6470     char	szTempFile[_MAX_PATH + 1];
6471     char	buf4[4];
6472     char_u	*retval;
6473     char_u	*p;
6474 
6475     STRCPY(itmp, "");
6476     if (GetTempPath(_MAX_PATH, szTempFile) == 0)
6477 	szTempFile[0] = NUL;	/* GetTempPath() failed, use current dir */
6478     strcpy(buf4, "VIM");
6479     buf4[2] = extra_char;   /* make it "VIa", "VIb", etc. */
6480     if (GetTempFileName(szTempFile, buf4, 0, itmp) == 0)
6481 	return NULL;
6482     /* GetTempFileName() will create the file, we don't want that */
6483     (void)DeleteFile(itmp);
6484 
6485     /* Backslashes in a temp file name cause problems when filtering with
6486      * "sh".  NOTE: This also checks 'shellcmdflag' to help those people who
6487      * didn't set 'shellslash'. */
6488     retval = vim_strsave(itmp);
6489     if (*p_shcf == '-' || p_ssl)
6490 	for (p = retval; *p; ++p)
6491 	    if (*p == '\\')
6492 		*p = '/';
6493     return retval;
6494 
6495 # else /* WIN3264 */
6496 
6497 #  ifdef USE_TMPNAM
6498     /* tmpnam() will make its own name */
6499     if (*tmpnam((char *)itmp) == NUL)
6500 	return NULL;
6501 #  else
6502     char_u	*p;
6503 
6504 #   ifdef VMS_TEMPNAM
6505     /* mktemp() is not working on VMS.  It seems to be
6506      * a do-nothing function. Therefore we use tempnam().
6507      */
6508     sprintf((char *)itmp, "VIM%c", extra_char);
6509     p = (char_u *)tempnam("tmp:", (char *)itmp);
6510     if (p != NULL)
6511     {
6512 	/* VMS will use '.LOG' if we don't explicitly specify an extension,
6513 	 * and VIM will then be unable to find the file later */
6514 	STRCPY(itmp, p);
6515 	STRCAT(itmp, ".txt");
6516 	free(p);
6517     }
6518     else
6519 	return NULL;
6520 #   else
6521     STRCPY(itmp, TEMPNAME);
6522     if ((p = vim_strchr(itmp, '?')) != NULL)
6523 	*p = extra_char;
6524     if (mktemp((char *)itmp) == NULL)
6525 	return NULL;
6526 #   endif
6527 #  endif
6528 
6529     return vim_strsave(itmp);
6530 # endif /* WIN3264 */
6531 #endif /* TEMPDIRNAMES */
6532 }
6533 
6534 #if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
6535 /*
6536  * Convert all backslashes in fname to forward slashes in-place.
6537  */
6538     void
6539 forward_slash(fname)
6540     char_u	*fname;
6541 {
6542     char_u	*p;
6543 
6544     for (p = fname; *p != NUL; ++p)
6545 # ifdef  FEAT_MBYTE
6546 	/* The Big5 encoding can have '\' in the trail byte. */
6547 	if (enc_dbcs != 0 && (*mb_ptr2len_check)(p) > 1)
6548 	    ++p;
6549 	else
6550 # endif
6551 	if (*p == '\\')
6552 	    *p = '/';
6553 }
6554 #endif
6555 
6556 
6557 /*
6558  * Code for automatic commands.
6559  *
6560  * Only included when "FEAT_AUTOCMD" has been defined.
6561  */
6562 
6563 #if defined(FEAT_AUTOCMD) || defined(PROTO)
6564 
6565 /*
6566  * The autocommands are stored in a list for each event.
6567  * Autocommands for the same pattern, that are consecutive, are joined
6568  * together, to avoid having to match the pattern too often.
6569  * The result is an array of Autopat lists, which point to AutoCmd lists:
6570  *
6571  * first_autopat[0] --> Autopat.next  -->  Autopat.next -->  NULL
6572  *			Autopat.cmds	   Autopat.cmds
6573  *			    |			 |
6574  *			    V			 V
6575  *			AutoCmd.next	   AutoCmd.next
6576  *			    |			 |
6577  *			    V			 V
6578  *			AutoCmd.next		NULL
6579  *			    |
6580  *			    V
6581  *			   NULL
6582  *
6583  * first_autopat[1] --> Autopat.next  -->  NULL
6584  *			Autopat.cmds
6585  *			    |
6586  *			    V
6587  *			AutoCmd.next
6588  *			    |
6589  *			    V
6590  *			   NULL
6591  *   etc.
6592  *
6593  *   The order of AutoCmds is important, this is the order in which they were
6594  *   defined and will have to be executed.
6595  */
6596 typedef struct AutoCmd
6597 {
6598     char_u	    *cmd;		/* The command to be executed (NULL
6599 					   when command has been removed) */
6600     char	    nested;		/* If autocommands nest here */
6601     char	    last;		/* last command in list */
6602 #ifdef FEAT_EVAL
6603     scid_T	    scriptID;		/* script ID where defined */
6604 #endif
6605     struct AutoCmd  *next;		/* Next AutoCmd in list */
6606 } AutoCmd;
6607 
6608 typedef struct AutoPat
6609 {
6610     int		    group;		/* group ID */
6611     char_u	    *pat;		/* pattern as typed (NULL when pattern
6612 					   has been removed) */
6613     int		    patlen;		/* strlen() of pat */
6614     char_u	    *reg_pat;		/* pattern converted to regexp */
6615     char	    allow_dirs;		/* Pattern may match whole path */
6616     char	    last;		/* last pattern for apply_autocmds() */
6617     AutoCmd	    *cmds;		/* list of commands to do */
6618     struct AutoPat  *next;		/* next AutoPat in AutoPat list */
6619 } AutoPat;
6620 
6621 static struct event_name
6622 {
6623     char	*name;	/* event name */
6624     EVENT_T	event;	/* event number */
6625 } event_names[] =
6626 {
6627     {"BufAdd",		EVENT_BUFADD},
6628     {"BufCreate",	EVENT_BUFADD},
6629     {"BufDelete",	EVENT_BUFDELETE},
6630     {"BufEnter",	EVENT_BUFENTER},
6631     {"BufFilePost",	EVENT_BUFFILEPOST},
6632     {"BufFilePre",	EVENT_BUFFILEPRE},
6633     {"BufHidden",	EVENT_BUFHIDDEN},
6634     {"BufLeave",	EVENT_BUFLEAVE},
6635     {"BufNew",		EVENT_BUFNEW},
6636     {"BufNewFile",	EVENT_BUFNEWFILE},
6637     {"BufRead",		EVENT_BUFREADPOST},
6638     {"BufReadCmd",	EVENT_BUFREADCMD},
6639     {"BufReadPost",	EVENT_BUFREADPOST},
6640     {"BufReadPre",	EVENT_BUFREADPRE},
6641     {"BufUnload",	EVENT_BUFUNLOAD},
6642     {"BufWinEnter",	EVENT_BUFWINENTER},
6643     {"BufWinLeave",	EVENT_BUFWINLEAVE},
6644     {"BufWipeout",	EVENT_BUFWIPEOUT},
6645     {"BufWrite",	EVENT_BUFWRITEPRE},
6646     {"BufWritePost",	EVENT_BUFWRITEPOST},
6647     {"BufWritePre",	EVENT_BUFWRITEPRE},
6648     {"BufWriteCmd",	EVENT_BUFWRITECMD},
6649     {"CmdwinEnter",	EVENT_CMDWINENTER},
6650     {"CmdwinLeave",	EVENT_CMDWINLEAVE},
6651     {"ColorScheme",	EVENT_COLORSCHEME},
6652     {"EncodingChanged",	EVENT_ENCODINGCHANGED},
6653     {"FileEncoding",	EVENT_ENCODINGCHANGED},
6654     {"CursorHold",	EVENT_CURSORHOLD},
6655     {"FileAppendPost",	EVENT_FILEAPPENDPOST},
6656     {"FileAppendPre",	EVENT_FILEAPPENDPRE},
6657     {"FileAppendCmd",	EVENT_FILEAPPENDCMD},
6658     {"FileChangedShell",EVENT_FILECHANGEDSHELL},
6659     {"FileChangedRO",	EVENT_FILECHANGEDRO},
6660     {"FileReadPost",	EVENT_FILEREADPOST},
6661     {"FileReadPre",	EVENT_FILEREADPRE},
6662     {"FileReadCmd",	EVENT_FILEREADCMD},
6663     {"FileType",	EVENT_FILETYPE},
6664     {"FileWritePost",	EVENT_FILEWRITEPOST},
6665     {"FileWritePre",	EVENT_FILEWRITEPRE},
6666     {"FileWriteCmd",	EVENT_FILEWRITECMD},
6667     {"FilterReadPost",	EVENT_FILTERREADPOST},
6668     {"FilterReadPre",	EVENT_FILTERREADPRE},
6669     {"FilterWritePost",	EVENT_FILTERWRITEPOST},
6670     {"FilterWritePre",	EVENT_FILTERWRITEPRE},
6671     {"FocusGained",	EVENT_FOCUSGAINED},
6672     {"FocusLost",	EVENT_FOCUSLOST},
6673     {"FuncUndefined",	EVENT_FUNCUNDEFINED},
6674     {"GUIEnter",	EVENT_GUIENTER},
6675     {"InsertChange",	EVENT_INSERTCHANGE},
6676     {"InsertEnter",	EVENT_INSERTENTER},
6677     {"InsertLeave",	EVENT_INSERTLEAVE},
6678     {"RemoteReply",	EVENT_REMOTEREPLY},
6679     {"StdinReadPost",	EVENT_STDINREADPOST},
6680     {"StdinReadPre",	EVENT_STDINREADPRE},
6681     {"Syntax",		EVENT_SYNTAX},
6682     {"TermChanged",	EVENT_TERMCHANGED},
6683     {"TermResponse",	EVENT_TERMRESPONSE},
6684     {"User",		EVENT_USER},
6685     {"VimEnter",	EVENT_VIMENTER},
6686     {"VimLeave",	EVENT_VIMLEAVE},
6687     {"VimLeavePre",	EVENT_VIMLEAVEPRE},
6688     {"WinEnter",	EVENT_WINENTER},
6689     {"WinLeave",	EVENT_WINLEAVE},
6690     {NULL,		(EVENT_T)0}
6691 };
6692 
6693 static AutoPat *first_autopat[NUM_EVENTS] =
6694 {
6695     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6696     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6697     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6698     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
6699     NULL, NULL, NULL, NULL, NULL, NULL, NULL
6700 };
6701 
6702 /*
6703  * struct used to keep status while executing autocommands for an event.
6704  */
6705 typedef struct AutoPatCmd
6706 {
6707     AutoPat	*curpat;	/* next AutoPat to examine */
6708     AutoCmd	*nextcmd;	/* next AutoCmd to execute */
6709     int		group;		/* group being used */
6710     char_u	*fname;		/* fname to match with */
6711     char_u	*sfname;	/* sfname to match with */
6712     char_u	*tail;		/* tail of fname */
6713     EVENT_T	event;		/* current event */
6714 } AutoPatCmd;
6715 
6716 /*
6717  * augroups stores a list of autocmd group names.
6718  */
6719 garray_T augroups = {0, 0, sizeof(char_u *), 10, NULL};
6720 #define AUGROUP_NAME(i) (((char_u **)augroups.ga_data)[i])
6721 
6722 /*
6723  * The ID of the current group.  Group 0 is the default one.
6724  */
6725 #define AUGROUP_DEFAULT	    -1	    /* default autocmd group */
6726 #define AUGROUP_ERROR	    -2	    /* errornouse autocmd group */
6727 #define AUGROUP_ALL	    -3	    /* all autocmd groups */
6728 static int current_augroup = AUGROUP_DEFAULT;
6729 
6730 static int au_need_clean = FALSE;   /* need to delete marked patterns */
6731 
6732 static void show_autocmd __ARGS((AutoPat *ap, EVENT_T event));
6733 static void au_remove_pat __ARGS((AutoPat *ap));
6734 static void au_remove_cmds __ARGS((AutoPat *ap));
6735 static void au_cleanup __ARGS((void));
6736 static int au_new_group __ARGS((char_u *name));
6737 static void au_del_group __ARGS((char_u *name));
6738 static int au_find_group __ARGS((char_u *name));
6739 static EVENT_T event_name2nr __ARGS((char_u *start, char_u **end));
6740 static char_u *event_nr2name __ARGS((EVENT_T event));
6741 static char_u *find_end_event __ARGS((char_u *arg, int have_group));
6742 static int event_ignored __ARGS((EVENT_T event));
6743 static int au_get_grouparg __ARGS((char_u **argp));
6744 static int do_autocmd_event __ARGS((EVENT_T event, char_u *pat, int nested, char_u *cmd, int forceit, int group));
6745 static char_u *getnextac __ARGS((int c, void *cookie, int indent));
6746 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));
6747 static void auto_next_pat __ARGS((AutoPatCmd *apc, int stop_at_last));
6748 
6749 static EVENT_T	last_event;
6750 static int	last_group;
6751 
6752 /*
6753  * Show the autocommands for one AutoPat.
6754  */
6755     static void
6756 show_autocmd(ap, event)
6757     AutoPat	*ap;
6758     EVENT_T	event;
6759 {
6760     AutoCmd *ac;
6761 
6762     /* Check for "got_int" (here and at various places below), which is set
6763      * when "q" has been hit for the "--more--" prompt */
6764     if (got_int)
6765 	return;
6766     if (ap->pat == NULL)		/* pattern has been removed */
6767 	return;
6768 
6769     msg_putchar('\n');
6770     if (got_int)
6771 	return;
6772     if (event != last_event || ap->group != last_group)
6773     {
6774 	if (ap->group != AUGROUP_DEFAULT)
6775 	{
6776 	    if (AUGROUP_NAME(ap->group) == NULL)
6777 		msg_puts_attr((char_u *)_("--Deleted--"), hl_attr(HLF_E));
6778 	    else
6779 		msg_puts_attr(AUGROUP_NAME(ap->group), hl_attr(HLF_T));
6780 	    msg_puts((char_u *)"  ");
6781 	}
6782 	msg_puts_attr(event_nr2name(event), hl_attr(HLF_T));
6783 	last_event = event;
6784 	last_group = ap->group;
6785 	msg_putchar('\n');
6786 	if (got_int)
6787 	    return;
6788     }
6789     msg_col = 4;
6790     msg_outtrans(ap->pat);
6791 
6792     for (ac = ap->cmds; ac != NULL; ac = ac->next)
6793     {
6794 	if (ac->cmd != NULL)		/* skip removed commands */
6795 	{
6796 	    if (msg_col >= 14)
6797 		msg_putchar('\n');
6798 	    msg_col = 14;
6799 	    if (got_int)
6800 		return;
6801 	    msg_outtrans(ac->cmd);
6802 	    if (got_int)
6803 		return;
6804 	    if (ac->next != NULL)
6805 	    {
6806 		msg_putchar('\n');
6807 		if (got_int)
6808 		    return;
6809 	    }
6810 	}
6811     }
6812 }
6813 
6814 /*
6815  * Mark an autocommand pattern for deletion.
6816  */
6817     static void
6818 au_remove_pat(ap)
6819     AutoPat *ap;
6820 {
6821     vim_free(ap->pat);
6822     ap->pat = NULL;
6823     au_need_clean = TRUE;
6824 }
6825 
6826 /*
6827  * Mark all commands for a pattern for deletion.
6828  */
6829     static void
6830 au_remove_cmds(ap)
6831     AutoPat *ap;
6832 {
6833     AutoCmd *ac;
6834 
6835     for (ac = ap->cmds; ac != NULL; ac = ac->next)
6836     {
6837 	vim_free(ac->cmd);
6838 	ac->cmd = NULL;
6839     }
6840     au_need_clean = TRUE;
6841 }
6842 
6843 /*
6844  * Cleanup autocommands and patterns that have been deleted.
6845  * This is only done when not executing autocommands.
6846  */
6847     static void
6848 au_cleanup()
6849 {
6850     AutoPat	*ap, **prev_ap;
6851     AutoCmd	*ac, **prev_ac;
6852     EVENT_T	event;
6853 
6854     if (autocmd_busy || !au_need_clean)
6855 	return;
6856 
6857     /* loop over all events */
6858     for (event = (EVENT_T)0; (int)event < (int)NUM_EVENTS;
6859 					    event = (EVENT_T)((int)event + 1))
6860     {
6861 	/* loop over all autocommand patterns */
6862 	prev_ap = &(first_autopat[(int)event]);
6863 	for (ap = *prev_ap; ap != NULL; ap = *prev_ap)
6864 	{
6865 	    /* loop over all commands for this pattern */
6866 	    prev_ac = &(ap->cmds);
6867 	    for (ac = *prev_ac; ac != NULL; ac = *prev_ac)
6868 	    {
6869 		/* remove the command if the pattern is to be deleted or when
6870 		 * the command has been marked for deletion */
6871 		if (ap->pat == NULL || ac->cmd == NULL)
6872 		{
6873 		    *prev_ac = ac->next;
6874 		    vim_free(ac->cmd);
6875 		    vim_free(ac);
6876 		}
6877 		else
6878 		    prev_ac = &(ac->next);
6879 	    }
6880 
6881 	    /* remove the pattern if it has been marked for deletion */
6882 	    if (ap->pat == NULL)
6883 	    {
6884 		*prev_ap = ap->next;
6885 		vim_free(ap->reg_pat);
6886 		vim_free(ap);
6887 	    }
6888 	    else
6889 		prev_ap = &(ap->next);
6890 	}
6891     }
6892 
6893     au_need_clean = FALSE;
6894 }
6895 
6896 /*
6897  * Add an autocmd group name.
6898  * Return it's ID.  Returns AUGROUP_ERROR (< 0) for error.
6899  */
6900     static int
6901 au_new_group(name)
6902     char_u	*name;
6903 {
6904     int		i;
6905 
6906     i = au_find_group(name);
6907     if (i == AUGROUP_ERROR)	/* the group doesn't exist yet, add it */
6908     {
6909 	/* First try using a free entry. */
6910 	for (i = 0; i < augroups.ga_len; ++i)
6911 	    if (AUGROUP_NAME(i) == NULL)
6912 		break;
6913 	if (i == augroups.ga_len && ga_grow(&augroups, 1) == FAIL)
6914 	    return AUGROUP_ERROR;
6915 
6916 	AUGROUP_NAME(i) = vim_strsave(name);
6917 	if (AUGROUP_NAME(i) == NULL)
6918 	    return AUGROUP_ERROR;
6919 	if (i == augroups.ga_len)
6920 	{
6921 	    ++augroups.ga_len;
6922 	    --augroups.ga_room;
6923 	}
6924     }
6925 
6926     return i;
6927 }
6928 
6929     static void
6930 au_del_group(name)
6931     char_u	*name;
6932 {
6933     int	    i;
6934 
6935     i = au_find_group(name);
6936     if (i == AUGROUP_ERROR)	/* the group doesn't exist */
6937 	EMSG2(_("E367: No such group: \"%s\""), name);
6938     else
6939     {
6940 	vim_free(AUGROUP_NAME(i));
6941 	AUGROUP_NAME(i) = NULL;
6942     }
6943 }
6944 
6945 /*
6946  * Find the ID of an autocmd group name.
6947  * Return it's ID.  Returns AUGROUP_ERROR (< 0) for error.
6948  */
6949     static int
6950 au_find_group(name)
6951     char_u	*name;
6952 {
6953     int	    i;
6954 
6955     for (i = 0; i < augroups.ga_len; ++i)
6956 	if (AUGROUP_NAME(i) != NULL && STRCMP(AUGROUP_NAME(i), name) == 0)
6957 	    return i;
6958     return AUGROUP_ERROR;
6959 }
6960 
6961 /*
6962  * ":augroup {name}".
6963  */
6964     void
6965 do_augroup(arg, del_group)
6966     char_u	*arg;
6967     int		del_group;
6968 {
6969     int	    i;
6970 
6971     if (del_group)
6972     {
6973 	if (*arg == NUL)
6974 	    EMSG(_(e_argreq));
6975 	else
6976 	    au_del_group(arg);
6977     }
6978     else if (STRICMP(arg, "end") == 0)   /* ":aug end": back to group 0 */
6979 	current_augroup = AUGROUP_DEFAULT;
6980     else if (*arg)		    /* ":aug xxx": switch to group xxx */
6981     {
6982 	i = au_new_group(arg);
6983 	if (i != AUGROUP_ERROR)
6984 	    current_augroup = i;
6985     }
6986     else			    /* ":aug": list the group names */
6987     {
6988 	msg_start();
6989 	for (i = 0; i < augroups.ga_len; ++i)
6990 	{
6991 	    if (AUGROUP_NAME(i) != NULL)
6992 	    {
6993 		msg_puts(AUGROUP_NAME(i));
6994 		msg_puts((char_u *)"  ");
6995 	    }
6996 	}
6997 	msg_clr_eos();
6998 	msg_end();
6999     }
7000 }
7001 
7002 /*
7003  * Return the event number for event name "start".
7004  * Return NUM_EVENTS if the event name was not found.
7005  * Return a pointer to the next event name in "end".
7006  */
7007     static EVENT_T
7008 event_name2nr(start, end)
7009     char_u  *start;
7010     char_u  **end;
7011 {
7012     char_u	*p;
7013     int		i;
7014     int		len;
7015 
7016     /* the event name ends with end of line, a blank or a comma */
7017     for (p = start; *p && !vim_iswhite(*p) && *p != ','; ++p)
7018 	;
7019     for (i = 0; event_names[i].name != NULL; ++i)
7020     {
7021 	len = (int)STRLEN(event_names[i].name);
7022 	if (len == p - start && STRNICMP(event_names[i].name, start, len) == 0)
7023 	    break;
7024     }
7025     if (*p == ',')
7026 	++p;
7027     *end = p;
7028     if (event_names[i].name == NULL)
7029 	return NUM_EVENTS;
7030     return event_names[i].event;
7031 }
7032 
7033 /*
7034  * Return the name for event "event".
7035  */
7036     static char_u *
7037 event_nr2name(event)
7038     EVENT_T	event;
7039 {
7040     int	    i;
7041 
7042     for (i = 0; event_names[i].name != NULL; ++i)
7043 	if (event_names[i].event == event)
7044 	    return (char_u *)event_names[i].name;
7045     return (char_u *)"Unknown";
7046 }
7047 
7048 /*
7049  * Scan over the events.  "*" stands for all events.
7050  */
7051     static char_u *
7052 find_end_event(arg, have_group)
7053     char_u  *arg;
7054     int	    have_group;	    /* TRUE when group name was found */
7055 {
7056     char_u  *pat;
7057     char_u  *p;
7058 
7059     if (*arg == '*')
7060     {
7061 	if (arg[1] && !vim_iswhite(arg[1]))
7062 	{
7063 	    EMSG2(_("E215: Illegal character after *: %s"), arg);
7064 	    return NULL;
7065 	}
7066 	pat = arg + 1;
7067     }
7068     else
7069     {
7070 	for (pat = arg; *pat && !vim_iswhite(*pat); pat = p)
7071 	{
7072 	    if ((int)event_name2nr(pat, &p) >= (int)NUM_EVENTS)
7073 	    {
7074 		if (have_group)
7075 		    EMSG2(_("E216: No such event: %s"), pat);
7076 		else
7077 		    EMSG2(_("E216: No such group or event: %s"), pat);
7078 		return NULL;
7079 	    }
7080 	}
7081     }
7082     return pat;
7083 }
7084 
7085 /*
7086  * Return TRUE if "event" is included in 'eventignore'.
7087  */
7088     static int
7089 event_ignored(event)
7090     EVENT_T	event;
7091 {
7092     char_u	*p = p_ei;
7093 
7094     if (STRICMP(p_ei, "all") == 0)
7095 	return TRUE;
7096 
7097     while (*p)
7098 	if (event_name2nr(p, &p) == event)
7099 	    return TRUE;
7100 
7101     return FALSE;
7102 }
7103 
7104 /*
7105  * Return OK when the contents of p_ei is valid, FAIL otherwise.
7106  */
7107     int
7108 check_ei()
7109 {
7110     char_u	*p = p_ei;
7111 
7112     if (STRICMP(p_ei, "all") == 0)
7113 	return OK;
7114 
7115     while (*p)
7116 	if (event_name2nr(p, &p) == NUM_EVENTS)
7117 	    return FAIL;
7118 
7119     return OK;
7120 }
7121 
7122 /*
7123  * do_autocmd() -- implements the :autocmd command.  Can be used in the
7124  *  following ways:
7125  *
7126  * :autocmd <event> <pat> <cmd>	    Add <cmd> to the list of commands that
7127  *				    will be automatically executed for <event>
7128  *				    when editing a file matching <pat>, in
7129  *				    the current group.
7130  * :autocmd <event> <pat>	    Show the auto-commands associated with
7131  *				    <event> and <pat>.
7132  * :autocmd <event>		    Show the auto-commands associated with
7133  *				    <event>.
7134  * :autocmd			    Show all auto-commands.
7135  * :autocmd! <event> <pat> <cmd>    Remove all auto-commands associated with
7136  *				    <event> and <pat>, and add the command
7137  *				    <cmd>, for the current group.
7138  * :autocmd! <event> <pat>	    Remove all auto-commands associated with
7139  *				    <event> and <pat> for the current group.
7140  * :autocmd! <event>		    Remove all auto-commands associated with
7141  *				    <event> for the current group.
7142  * :autocmd!			    Remove ALL auto-commands for the current
7143  *				    group.
7144  *
7145  *  Multiple events and patterns may be given separated by commas.  Here are
7146  *  some examples:
7147  * :autocmd bufread,bufenter *.c,*.h	set tw=0 smartindent noic
7148  * :autocmd bufleave	     *		set tw=79 nosmartindent ic infercase
7149  *
7150  * :autocmd * *.c		show all autocommands for *.c files.
7151  */
7152     void
7153 do_autocmd(arg, forceit)
7154     char_u  *arg;
7155     int	    forceit;
7156 {
7157     char_u	*pat;
7158     char_u	*envpat = NULL;
7159     char_u	*cmd;
7160     EVENT_T	event;
7161     int		need_free = FALSE;
7162     int		nested = FALSE;
7163     int		group;
7164 
7165     /*
7166      * Check for a legal group name.  If not, use AUGROUP_ALL.
7167      */
7168     group = au_get_grouparg(&arg);
7169     if (arg == NULL)	    /* out of memory */
7170 	return;
7171 
7172     /*
7173      * Scan over the events.
7174      * If we find an illegal name, return here, don't do anything.
7175      */
7176     pat = find_end_event(arg, group != AUGROUP_ALL);
7177     if (pat == NULL)
7178 	return;
7179 
7180     /*
7181      * Scan over the pattern.  Put a NUL at the end.
7182      */
7183     pat = skipwhite(pat);
7184     cmd = pat;
7185     while (*cmd && (!vim_iswhite(*cmd) || cmd[-1] == '\\'))
7186 	cmd++;
7187     if (*cmd)
7188 	*cmd++ = NUL;
7189 
7190     /* Expand environment variables in the pattern.  Set 'shellslash', we want
7191      * forward slashes here. */
7192     if (vim_strchr(pat, '$') != NULL || vim_strchr(pat, '~') != NULL)
7193     {
7194 #ifdef BACKSLASH_IN_FILENAME
7195 	int	p_ssl_save = p_ssl;
7196 
7197 	p_ssl = TRUE;
7198 #endif
7199 	envpat = expand_env_save(pat);
7200 #ifdef BACKSLASH_IN_FILENAME
7201 	p_ssl = p_ssl_save;
7202 #endif
7203 	if (envpat != NULL)
7204 	    pat = envpat;
7205     }
7206 
7207     /*
7208      * Check for "nested" flag.
7209      */
7210     cmd = skipwhite(cmd);
7211     if (*cmd != NUL && STRNCMP(cmd, "nested", 6) == 0 && vim_iswhite(cmd[6]))
7212     {
7213 	nested = TRUE;
7214 	cmd = skipwhite(cmd + 6);
7215     }
7216 
7217     /*
7218      * Find the start of the commands.
7219      * Expand <sfile> in it.
7220      */
7221     if (*cmd != NUL)
7222     {
7223 	cmd = expand_sfile(cmd);
7224 	if (cmd == NULL)	    /* some error */
7225 	    return;
7226 	need_free = TRUE;
7227     }
7228 
7229     /*
7230      * Print header when showing autocommands.
7231      */
7232     if (!forceit && *cmd == NUL)
7233     {
7234 	/* Highlight title */
7235 	MSG_PUTS_TITLE(_("\n--- Auto-Commands ---"));
7236     }
7237 
7238     /*
7239      * Loop over the events.
7240      */
7241     last_event = (EVENT_T)-1;		/* for listing the event name */
7242     last_group = AUGROUP_ERROR;		/* for listing the group name */
7243     if (*arg == '*' || *arg == NUL)
7244     {
7245 	for (event = (EVENT_T)0; (int)event < (int)NUM_EVENTS;
7246 					    event = (EVENT_T)((int)event + 1))
7247 	    if (do_autocmd_event(event, pat,
7248 					 nested, cmd, forceit, group) == FAIL)
7249 		break;
7250     }
7251     else
7252     {
7253 	while (*arg && !vim_iswhite(*arg))
7254 	    if (do_autocmd_event(event_name2nr(arg, &arg), pat,
7255 					nested,	cmd, forceit, group) == FAIL)
7256 		break;
7257     }
7258 
7259     if (need_free)
7260 	vim_free(cmd);
7261     vim_free(envpat);
7262 }
7263 
7264 /*
7265  * Find the group ID in a ":autocmd" or ":doautocmd" argument.
7266  * The "argp" argument is advanced to the following argument.
7267  *
7268  * Returns the group ID, AUGROUP_ERROR for error (out of memory).
7269  */
7270     static int
7271 au_get_grouparg(argp)
7272     char_u	**argp;
7273 {
7274     char_u	*group_name;
7275     char_u	*p;
7276     char_u	*arg = *argp;
7277     int		group = AUGROUP_ALL;
7278 
7279     p = skiptowhite(arg);
7280     if (p > arg)
7281     {
7282 	group_name = vim_strnsave(arg, (int)(p - arg));
7283 	if (group_name == NULL)		/* out of memory */
7284 	    return AUGROUP_ERROR;
7285 	group = au_find_group(group_name);
7286 	if (group == AUGROUP_ERROR)
7287 	    group = AUGROUP_ALL;	/* no match, use all groups */
7288 	else
7289 	    *argp = skipwhite(p);	/* match, skip over group name */
7290 	vim_free(group_name);
7291     }
7292     return group;
7293 }
7294 
7295 /*
7296  * do_autocmd() for one event.
7297  * If *pat == NUL do for all patterns.
7298  * If *cmd == NUL show entries.
7299  * If forceit == TRUE delete entries.
7300  * If group is not AUGROUP_ALL, only use this group.
7301  */
7302     static int
7303 do_autocmd_event(event, pat, nested, cmd, forceit, group)
7304     EVENT_T	event;
7305     char_u	*pat;
7306     int		nested;
7307     char_u	*cmd;
7308     int		forceit;
7309     int		group;
7310 {
7311     AutoPat	*ap;
7312     AutoPat	**prev_ap;
7313     AutoCmd	*ac;
7314     AutoCmd	**prev_ac;
7315     int		brace_level;
7316     char_u	*endpat;
7317     int		findgroup;
7318     int		allgroups;
7319     int		patlen;
7320 
7321     if (group == AUGROUP_ALL)
7322 	findgroup = current_augroup;
7323     else
7324 	findgroup = group;
7325     allgroups = (group == AUGROUP_ALL && !forceit && *cmd == NUL);
7326 
7327     /*
7328      * Show or delete all patterns for an event.
7329      */
7330     if (*pat == NUL)
7331     {
7332 	for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
7333 	{
7334 	    if (forceit)  /* delete the AutoPat, if it's in the current group */
7335 	    {
7336 		if (ap->group == findgroup)
7337 		    au_remove_pat(ap);
7338 	    }
7339 	    else if (group == AUGROUP_ALL || ap->group == group)
7340 		show_autocmd(ap, event);
7341 	}
7342     }
7343 
7344     /*
7345      * Loop through all the specified patterns.
7346      */
7347     for ( ; *pat; pat = (*endpat == ',' ? endpat + 1 : endpat))
7348     {
7349 	/*
7350 	 * Find end of the pattern.
7351 	 * Watch out for a comma in braces, like "*.\{obj,o\}".
7352 	 */
7353 	brace_level = 0;
7354 	for (endpat = pat; *endpat && (*endpat != ',' || brace_level
7355 					     || endpat[-1] == '\\'); ++endpat)
7356 	{
7357 	    if (*endpat == '{')
7358 		brace_level++;
7359 	    else if (*endpat == '}')
7360 		brace_level--;
7361 	}
7362 	if (pat == endpat)		/* ignore single comma */
7363 	    continue;
7364 	patlen = (int)(endpat - pat);
7365 
7366 	/*
7367 	 * Find AutoPat entries with this pattern.
7368 	 */
7369 	prev_ap = &first_autopat[(int)event];
7370 	while ((ap = *prev_ap) != NULL)
7371 	{
7372 	    if (ap->pat != NULL)
7373 	    {
7374 		/* Accept a pattern when:
7375 		 * - a group was specified and it's that group, or a group was
7376 		 *   not specified and it's the current group, or a group was
7377 		 *   not specified and we are listing
7378 		 * - the length of the pattern matches
7379 		 * - the pattern matches
7380 		 */
7381 		if ((allgroups || ap->group == findgroup)
7382 			&& ap->patlen == patlen
7383 			&& STRNCMP(pat, ap->pat, patlen) == 0)
7384 		{
7385 		    /*
7386 		     * Remove existing autocommands.
7387 		     * If adding any new autocmd's for this AutoPat, don't
7388 		     * delete the pattern from the autopat list, append to
7389 		     * this list.
7390 		     */
7391 		    if (forceit)
7392 		    {
7393 			if (*cmd != NUL && ap->next == NULL)
7394 			{
7395 			    au_remove_cmds(ap);
7396 			    break;
7397 			}
7398 			au_remove_pat(ap);
7399 		    }
7400 
7401 		    /*
7402 		     * Show autocmd's for this autopat
7403 		     */
7404 		    else if (*cmd == NUL)
7405 			show_autocmd(ap, event);
7406 
7407 		    /*
7408 		     * Add autocmd to this autopat, if it's the last one.
7409 		     */
7410 		    else if (ap->next == NULL)
7411 			break;
7412 		}
7413 	    }
7414 	    prev_ap = &ap->next;
7415 	}
7416 
7417 	/*
7418 	 * Add a new command.
7419 	 */
7420 	if (*cmd != NUL)
7421 	{
7422 	    /*
7423 	     * If the pattern we want to add a command to does appear at the
7424 	     * end of the list (or not is not in the list at all), add the
7425 	     * pattern at the end of the list.
7426 	     */
7427 	    if (ap == NULL)
7428 	    {
7429 		ap = (AutoPat *)alloc((unsigned)sizeof(AutoPat));
7430 		if (ap == NULL)
7431 		    return FAIL;
7432 		ap->pat = vim_strnsave(pat, patlen);
7433 		ap->patlen = patlen;
7434 		if (ap->pat == NULL)
7435 		{
7436 		    vim_free(ap);
7437 		    return FAIL;
7438 		}
7439 		ap->reg_pat = file_pat_to_reg_pat(pat, endpat,
7440 						       &ap->allow_dirs, TRUE);
7441 		if (ap->reg_pat == NULL)
7442 		{
7443 		    vim_free(ap->pat);
7444 		    vim_free(ap);
7445 		    return FAIL;
7446 		}
7447 		ap->cmds = NULL;
7448 		*prev_ap = ap;
7449 		ap->next = NULL;
7450 		if (group == AUGROUP_ALL)
7451 		    ap->group = current_augroup;
7452 		else
7453 		    ap->group = group;
7454 	    }
7455 
7456 	    /*
7457 	     * Add the autocmd at the end of the AutoCmd list.
7458 	     */
7459 	    prev_ac = &(ap->cmds);
7460 	    while ((ac = *prev_ac) != NULL)
7461 		prev_ac = &ac->next;
7462 	    ac = (AutoCmd *)alloc((unsigned)sizeof(AutoCmd));
7463 	    if (ac == NULL)
7464 		return FAIL;
7465 	    ac->cmd = vim_strsave(cmd);
7466 #ifdef FEAT_EVAL
7467 	    ac->scriptID = current_SID;
7468 #endif
7469 	    if (ac->cmd == NULL)
7470 	    {
7471 		vim_free(ac);
7472 		return FAIL;
7473 	    }
7474 	    ac->next = NULL;
7475 	    *prev_ac = ac;
7476 	    ac->nested = nested;
7477 	}
7478     }
7479 
7480     au_cleanup();	/* may really delete removed patterns/commands now */
7481     return OK;
7482 }
7483 
7484 /*
7485  * Implementation of ":doautocmd [group] event [fname]".
7486  * Return OK for success, FAIL for failure;
7487  */
7488     int
7489 do_doautocmd(arg, do_msg)
7490     char_u	*arg;
7491     int		do_msg;	    /* give message for no matching autocmds? */
7492 {
7493     char_u	*fname;
7494     int		nothing_done = TRUE;
7495     int		group;
7496 
7497     /*
7498      * Check for a legal group name.  If not, use AUGROUP_ALL.
7499      */
7500     group = au_get_grouparg(&arg);
7501     if (arg == NULL)	    /* out of memory */
7502 	return FAIL;
7503 
7504     if (*arg == '*')
7505     {
7506 	EMSG(_("E217: Can't execute autocommands for ALL events"));
7507 	return FAIL;
7508     }
7509 
7510     /*
7511      * Scan over the events.
7512      * If we find an illegal name, return here, don't do anything.
7513      */
7514     fname = find_end_event(arg, group != AUGROUP_ALL);
7515     if (fname == NULL)
7516 	return FAIL;
7517 
7518     fname = skipwhite(fname);
7519 
7520     /*
7521      * Loop over the events.
7522      */
7523     while (*arg && !vim_iswhite(*arg))
7524 	if (apply_autocmds_group(event_name2nr(arg, &arg),
7525 				      fname, NULL, TRUE, group, curbuf, NULL))
7526 	    nothing_done = FALSE;
7527 
7528     if (nothing_done && do_msg)
7529 	MSG(_("No matching autocommands"));
7530 
7531 #ifdef FEAT_EVAL
7532     return aborting() ? FAIL : OK;
7533 #else
7534     return OK;
7535 #endif
7536 }
7537 
7538 /*
7539  * ":doautoall": execute autocommands for each loaded buffer.
7540  */
7541     void
7542 ex_doautoall(eap)
7543     exarg_T	*eap;
7544 {
7545     int		retval;
7546     aco_save_T	aco;
7547     buf_T	*buf;
7548 
7549     /*
7550      * This is a bit tricky: For some commands curwin->w_buffer needs to be
7551      * equal to curbuf, but for some buffers there may not be a window.
7552      * So we change the buffer for the current window for a moment.  This
7553      * gives problems when the autocommands make changes to the list of
7554      * buffers or windows...
7555      */
7556     for (buf = firstbuf; buf != NULL; buf = buf->b_next)
7557     {
7558 	if (curbuf->b_ml.ml_mfp != NULL)
7559 	{
7560 	    /* find a window for this buffer and save some values */
7561 	    aucmd_prepbuf(&aco, buf);
7562 
7563 	    /* execute the autocommands for this buffer */
7564 	    retval = do_doautocmd(eap->arg, FALSE);
7565 	    do_modelines();
7566 
7567 	    /* restore the current window */
7568 	    aucmd_restbuf(&aco);
7569 
7570 	    /* stop if there is some error or buffer was deleted */
7571 	    if (retval == FAIL || !buf_valid(buf))
7572 		break;
7573 	}
7574     }
7575 
7576     check_cursor();	    /* just in case lines got deleted */
7577 }
7578 
7579 /*
7580  * Prepare for executing autocommands for (hidden) buffer "buf".
7581  * Search a window for the current buffer.  Save the cursor position and
7582  * screen offset.
7583  * Set "curbuf" and "curwin" to match "buf".
7584  */
7585     void
7586 aucmd_prepbuf(aco, buf)
7587     aco_save_T	*aco;		/* structure to save values in */
7588     buf_T	*buf;		/* new curbuf */
7589 {
7590     win_T	*win;
7591 
7592     aco->new_curbuf = buf;
7593 
7594     /* Find a window that is for the new buffer */
7595     if (buf == curbuf)		/* be quick when buf is curbuf */
7596 	win = curwin;
7597     else
7598 #ifdef FEAT_WINDOWS
7599 	for (win = firstwin; win != NULL; win = win->w_next)
7600 	    if (win->w_buffer == buf)
7601 		break;
7602 #else
7603 	win = NULL;
7604 #endif
7605 
7606     /*
7607      * Prefer to use an existing window for the buffer, it has the least side
7608      * effects (esp. if "buf" is curbuf).
7609      * Otherwise, use curwin for "buf".  It might make some items in the
7610      * window invalid.  At least save the cursor and topline.
7611      */
7612     if (win != NULL)
7613     {
7614 	/* there is a window for "buf", make it the curwin */
7615 	aco->save_curwin = curwin;
7616 	curwin = win;
7617 	aco->save_buf = win->w_buffer;
7618 	aco->new_curwin = win;
7619     }
7620     else
7621     {
7622 	/* there is no window for "buf", use curwin */
7623 	aco->save_curwin = NULL;
7624 	aco->save_buf = curbuf;
7625 	--curbuf->b_nwindows;
7626 	curwin->w_buffer = buf;
7627 	++buf->b_nwindows;
7628 
7629 	/* save cursor and topline, set them to safe values */
7630 	aco->save_cursor = curwin->w_cursor;
7631 	curwin->w_cursor.lnum = 1;
7632 	curwin->w_cursor.col = 0;
7633 	aco->save_topline = curwin->w_topline;
7634 	curwin->w_topline = 1;
7635 #ifdef FEAT_DIFF
7636 	aco->save_topfill = curwin->w_topfill;
7637 	curwin->w_topfill = 0;
7638 #endif
7639     }
7640 
7641     curbuf = buf;
7642 }
7643 
7644 /*
7645  * Cleanup after executing autocommands for a (hidden) buffer.
7646  * Restore the window as it was (if possible).
7647  */
7648     void
7649 aucmd_restbuf(aco)
7650     aco_save_T	*aco;		/* structure holding saved values */
7651 {
7652     if (aco->save_curwin != NULL)
7653     {
7654 	/* restore curwin */
7655 #ifdef FEAT_WINDOWS
7656 	if (win_valid(aco->save_curwin))
7657 #endif
7658 	{
7659 	    /* restore the buffer which was previously edited by curwin, if
7660 	     * it's still the same window and it's valid */
7661 	    if (curwin == aco->new_curwin
7662 		    && buf_valid(aco->save_buf)
7663 		    && aco->save_buf->b_ml.ml_mfp != NULL)
7664 	    {
7665 		--curbuf->b_nwindows;
7666 		curbuf = aco->save_buf;
7667 		curwin->w_buffer = curbuf;
7668 		++curbuf->b_nwindows;
7669 	    }
7670 
7671 	    curwin = aco->save_curwin;
7672 	    curbuf = curwin->w_buffer;
7673 	}
7674     }
7675     else
7676     {
7677 	/* restore buffer for curwin if it still exists and is loaded */
7678 	if (buf_valid(aco->save_buf) && aco->save_buf->b_ml.ml_mfp != NULL)
7679 	{
7680 	    --curbuf->b_nwindows;
7681 	    curbuf = aco->save_buf;
7682 	    curwin->w_buffer = curbuf;
7683 	    ++curbuf->b_nwindows;
7684 	    curwin->w_cursor = aco->save_cursor;
7685 	    check_cursor();
7686 	    /* check topline < line_count, in case lines got deleted */
7687 	    if (aco->save_topline <= curbuf->b_ml.ml_line_count)
7688 	    {
7689 		curwin->w_topline = aco->save_topline;
7690 #ifdef FEAT_DIFF
7691 		curwin->w_topfill = aco->save_topfill;
7692 #endif
7693 	    }
7694 	    else
7695 	    {
7696 		curwin->w_topline = curbuf->b_ml.ml_line_count;
7697 #ifdef FEAT_DIFF
7698 		curwin->w_topfill = 0;
7699 #endif
7700 	    }
7701 	}
7702     }
7703 }
7704 
7705 static int	autocmd_nested = FALSE;
7706 
7707 /*
7708  * Execute autocommands for "event" and file name "fname".
7709  * Return TRUE if some commands were executed.
7710  */
7711     int
7712 apply_autocmds(event, fname, fname_io, force, buf)
7713     EVENT_T	event;
7714     char_u	*fname;	    /* NULL or empty means use actual file name */
7715     char_u	*fname_io;  /* fname to use for <afile> on cmdline */
7716     int		force;	    /* when TRUE, ignore autocmd_busy */
7717     buf_T	*buf;	    /* buffer for <abuf> */
7718 {
7719     return apply_autocmds_group(event, fname, fname_io, force,
7720 						      AUGROUP_ALL, buf, NULL);
7721 }
7722 
7723 /*
7724  * Like apply_autocmds(), but with extra "eap" argument.  This takes care of
7725  * setting v:filearg.
7726  */
7727     static int
7728 apply_autocmds_exarg(event, fname, fname_io, force, buf, eap)
7729     EVENT_T	event;
7730     char_u	*fname;
7731     char_u	*fname_io;
7732     int		force;
7733     buf_T	*buf;
7734     exarg_T	*eap;
7735 {
7736     return apply_autocmds_group(event, fname, fname_io, force,
7737 						       AUGROUP_ALL, buf, eap);
7738 }
7739 
7740 /*
7741  * Like apply_autocmds(), but handles the caller's retval.  If the script
7742  * processing is being aborted or if retval is FAIL when inside a try
7743  * conditional, no autocommands are executed.  If otherwise the autocommands
7744  * cause the script to be aborted, retval is set to FAIL.
7745  */
7746     int
7747 apply_autocmds_retval(event, fname, fname_io, force, buf, retval)
7748     EVENT_T	event;
7749     char_u	*fname;	    /* NULL or empty means use actual file name */
7750     char_u	*fname_io;  /* fname to use for <afile> on cmdline */
7751     int		force;	    /* when TRUE, ignore autocmd_busy */
7752     buf_T	*buf;	    /* buffer for <abuf> */
7753     int		*retval;    /* pointer to caller's retval */
7754 {
7755     int		did_cmd;
7756 
7757     if (should_abort(*retval))
7758 	return FALSE;
7759 
7760     did_cmd = apply_autocmds_group(event, fname, fname_io, force,
7761 						      AUGROUP_ALL, buf, NULL);
7762     if (did_cmd && aborting())
7763 	*retval = FAIL;
7764     return did_cmd;
7765 }
7766 
7767 #if defined(FEAT_AUTOCMD) || defined(PROTO)
7768     int
7769 has_cursorhold()
7770 {
7771     return (first_autopat[(int)EVENT_CURSORHOLD] != NULL);
7772 }
7773 #endif
7774 
7775     static int
7776 apply_autocmds_group(event, fname, fname_io, force, group, buf, eap)
7777     EVENT_T	event;
7778     char_u	*fname;	    /* NULL or empty means use actual file name */
7779     char_u	*fname_io;  /* fname to use for <afile> on cmdline, NULL means
7780 			       use fname */
7781     int		force;	    /* when TRUE, ignore autocmd_busy */
7782     int		group;	    /* group ID, or AUGROUP_ALL */
7783     buf_T	*buf;	    /* buffer for <abuf> */
7784     exarg_T	*eap;	    /* command arguments */
7785 {
7786     char_u	*sfname = NULL;	/* short file name */
7787     char_u	*tail;
7788     int		save_changed;
7789     buf_T	*old_curbuf;
7790     int		retval = FALSE;
7791     char_u	*save_sourcing_name;
7792     linenr_T	save_sourcing_lnum;
7793     char_u	*save_autocmd_fname;
7794     int		save_autocmd_bufnr;
7795     char_u	*save_autocmd_match;
7796     int		save_autocmd_busy;
7797     int		save_autocmd_nested;
7798     static int	nesting = 0;
7799     AutoPatCmd	patcmd;
7800     AutoPat	*ap;
7801 #ifdef FEAT_EVAL
7802     scid_T	save_current_SID;
7803     void	*save_funccalp;
7804     char_u	*save_cmdarg;
7805     long	save_cmdbang;
7806 #endif
7807     static int	filechangeshell_busy = FALSE;
7808 
7809     /*
7810      * Quickly return if there are no autocommands for this event or
7811      * autocommands are blocked.
7812      */
7813     if (first_autopat[(int)event] == NULL || autocmd_block > 0)
7814 	return retval;
7815 
7816     /*
7817      * When autocommands are busy, new autocommands are only executed when
7818      * explicitly enabled with the "nested" flag.
7819      */
7820     if (autocmd_busy && !(force || autocmd_nested))
7821 	return retval;
7822 
7823 #ifdef FEAT_EVAL
7824     /*
7825      * Quickly return when immdediately aborting on error, or when an interrupt
7826      * occurred or an exception was thrown but not caught.
7827      */
7828     if (aborting())
7829 	return retval;
7830 #endif
7831 
7832     /*
7833      * FileChangedShell never nests, because it can create an endless loop.
7834      */
7835     if (filechangeshell_busy && event == EVENT_FILECHANGEDSHELL)
7836 	return retval;
7837 
7838     /*
7839      * Ignore events in 'eventignore'.
7840      */
7841     if (event_ignored(event))
7842 	return retval;
7843 
7844     /*
7845      * Allow nesting of autocommands, but restrict the depth, because it's
7846      * possible to create an endless loop.
7847      */
7848     if (nesting == 10)
7849     {
7850 	EMSG(_("E218: autocommand nesting too deep"));
7851 	return retval;
7852     }
7853 
7854     /*
7855      * Check if these autocommands are disabled.  Used when doing ":all" or
7856      * ":ball".
7857      */
7858     if (       (autocmd_no_enter
7859 		&& (event == EVENT_WINENTER || event == EVENT_BUFENTER))
7860 	    || (autocmd_no_leave
7861 		&& (event == EVENT_WINLEAVE || event == EVENT_BUFLEAVE)))
7862 	return retval;
7863 
7864     /*
7865      * Save the autocmd_* variables and info about the current buffer.
7866      */
7867     save_autocmd_fname = autocmd_fname;
7868     save_autocmd_bufnr = autocmd_bufnr;
7869     save_autocmd_match = autocmd_match;
7870     save_autocmd_busy = autocmd_busy;
7871     save_autocmd_nested = autocmd_nested;
7872     save_changed = curbuf->b_changed;
7873     old_curbuf = curbuf;
7874 
7875     /*
7876      * Set the file name to be used for <afile>.
7877      */
7878     if (fname_io == NULL)
7879     {
7880 	if (fname != NULL && *fname != NUL)
7881 	    autocmd_fname = fname;
7882 	else if (buf != NULL)
7883 	    autocmd_fname = buf->b_fname;
7884 	else
7885 	    autocmd_fname = NULL;
7886     }
7887     else
7888 	autocmd_fname = fname_io;
7889 
7890     /*
7891      * Set the buffer number to be used for <abuf>.
7892      */
7893     if (buf == NULL)
7894 	autocmd_bufnr = 0;
7895     else
7896 	autocmd_bufnr = buf->b_fnum;
7897 
7898     /*
7899      * When the file name is NULL or empty, use the file name of buffer "buf".
7900      * Always use the full path of the file name to match with, in case
7901      * "allow_dirs" is set.
7902      */
7903     if (fname == NULL || *fname == NUL)
7904     {
7905 	if (buf == NULL)
7906 	    fname = NULL;
7907 	else
7908 	{
7909 #ifdef FEAT_SYN_HL
7910 	    if (event == EVENT_SYNTAX)
7911 		fname = buf->b_p_syn;
7912 	    else
7913 #endif
7914 		if (event == EVENT_FILETYPE)
7915 		    fname = buf->b_p_ft;
7916 		else
7917 		{
7918 		    if (buf->b_sfname != NULL)
7919 			sfname = vim_strsave(buf->b_sfname);
7920 		    fname = buf->b_ffname;
7921 		}
7922 	}
7923 	if (fname == NULL)
7924 	    fname = (char_u *)"";
7925 	fname = vim_strsave(fname);	/* make a copy, so we can change it */
7926     }
7927     else
7928     {
7929 	sfname = vim_strsave(fname);
7930 	/* Don't try expanding FileType, Syntax or WindowID. */
7931 	if (event == EVENT_FILETYPE || event == EVENT_SYNTAX
7932 		|| event == EVENT_REMOTEREPLY)
7933 	    fname = vim_strsave(fname);
7934 	else
7935 	    fname = FullName_save(fname, FALSE);
7936     }
7937     if (fname == NULL)	    /* out of memory */
7938     {
7939 	vim_free(sfname);
7940 	return FALSE;
7941     }
7942 
7943 #ifdef BACKSLASH_IN_FILENAME
7944     /*
7945      * Replace all backslashes with forward slashes.  This makes the
7946      * autocommand patterns portable between Unix and MS-DOS.
7947      */
7948     if (sfname != NULL)
7949 	forward_slash(sfname);
7950     forward_slash(fname);
7951 #endif
7952 
7953 #ifdef VMS
7954     /* remove version for correct match */
7955     if (sfname != NULL)
7956 	vms_remove_version(sfname);
7957     vms_remove_version(fname);
7958 #endif
7959 
7960     /*
7961      * Set the name to be used for <amatch>.
7962      */
7963     autocmd_match = fname;
7964 
7965 
7966     /* Don't redraw while doing auto commands. */
7967     ++RedrawingDisabled;
7968     save_sourcing_name = sourcing_name;
7969     sourcing_name = NULL;	/* don't free this one */
7970     save_sourcing_lnum = sourcing_lnum;
7971     sourcing_lnum = 0;		/* no line number here */
7972 
7973 #ifdef FEAT_EVAL
7974     save_current_SID = current_SID;
7975 
7976     /* Don't use local function variables, if called from a function */
7977     save_funccalp = save_funccal();
7978 #endif
7979 
7980     /*
7981      * When starting to execute autocommands, save the search patterns.
7982      */
7983     if (!autocmd_busy)
7984     {
7985 	save_search_patterns();
7986 	saveRedobuff();
7987 	did_filetype = keep_filetype;
7988     }
7989 
7990     /*
7991      * Note that we are applying autocmds.  Some commands need to know.
7992      */
7993     autocmd_busy = TRUE;
7994     filechangeshell_busy = (event == EVENT_FILECHANGEDSHELL);
7995     ++nesting;		/* see matching decrement below */
7996 
7997     /* Remember that FileType was triggered.  Used for did_filetype(). */
7998     if (event == EVENT_FILETYPE)
7999 	did_filetype = TRUE;
8000 
8001     tail = gettail(fname);
8002 
8003     /* Find first autocommand that matches */
8004     patcmd.curpat = first_autopat[(int)event];
8005     patcmd.nextcmd = NULL;
8006     patcmd.group = group;
8007     patcmd.fname = fname;
8008     patcmd.sfname = sfname;
8009     patcmd.tail = tail;
8010     patcmd.event = event;
8011     auto_next_pat(&patcmd, FALSE);
8012 
8013     /* found one, start executing the autocommands */
8014     if (patcmd.curpat != NULL)
8015     {
8016 #ifdef FEAT_EVAL
8017 	/* set v:cmdarg (only when there is a matching pattern) */
8018 	save_cmdbang = get_vim_var_nr(VV_CMDBANG);
8019 	if (eap != NULL)
8020 	{
8021 	    save_cmdarg = set_cmdarg(eap, NULL);
8022 	    set_vim_var_nr(VV_CMDBANG, (long)eap->forceit);
8023 	}
8024 	else
8025 	    save_cmdarg = NULL;	/* avoid gcc warning */
8026 #endif
8027 	retval = TRUE;
8028 	/* mark the last pattern, to avoid an endless loop when more patterns
8029 	 * are added when executing autocommands */
8030 	for (ap = patcmd.curpat; ap->next != NULL; ap = ap->next)
8031 	    ap->last = FALSE;
8032 	ap->last = TRUE;
8033 	check_lnums(TRUE);	/* make sure cursor and topline are valid */
8034 	do_cmdline(NULL, getnextac, (void *)&patcmd,
8035 				     DOCMD_NOWAIT|DOCMD_VERBOSE|DOCMD_REPEAT);
8036 #ifdef FEAT_EVAL
8037 	if (eap != NULL)
8038 	{
8039 	    (void)set_cmdarg(NULL, save_cmdarg);
8040 	    set_vim_var_nr(VV_CMDBANG, save_cmdbang);
8041 	}
8042 #endif
8043     }
8044 
8045     --RedrawingDisabled;
8046     autocmd_busy = save_autocmd_busy;
8047     filechangeshell_busy = FALSE;
8048     autocmd_nested = save_autocmd_nested;
8049     vim_free(sourcing_name);
8050     sourcing_name = save_sourcing_name;
8051     sourcing_lnum = save_sourcing_lnum;
8052     autocmd_fname = save_autocmd_fname;
8053     autocmd_bufnr = save_autocmd_bufnr;
8054     autocmd_match = save_autocmd_match;
8055 #ifdef FEAT_EVAL
8056     current_SID = save_current_SID;
8057     restore_funccal(save_funccalp);
8058 #endif
8059     vim_free(fname);
8060     vim_free(sfname);
8061     --nesting;		/* see matching increment above */
8062 
8063     /*
8064      * When stopping to execute autocommands, restore the search patterns and
8065      * the redo buffer.
8066      */
8067     if (!autocmd_busy)
8068     {
8069 	restore_search_patterns();
8070 	restoreRedobuff();
8071 	did_filetype = FALSE;
8072     }
8073 
8074     /*
8075      * Some events don't set or reset the Changed flag.
8076      * Check if still in the same buffer!
8077      */
8078     if (curbuf == old_curbuf
8079 	    && (event == EVENT_BUFREADPOST
8080 		|| event == EVENT_BUFWRITEPOST
8081 		|| event == EVENT_FILEAPPENDPOST
8082 		|| event == EVENT_VIMLEAVE
8083 		|| event == EVENT_VIMLEAVEPRE))
8084     {
8085 #ifdef FEAT_TITLE
8086 	if (curbuf->b_changed != save_changed)
8087 	    need_maketitle = TRUE;
8088 #endif
8089 	curbuf->b_changed = save_changed;
8090     }
8091 
8092     au_cleanup();	/* may really delete removed patterns/commands now */
8093     return retval;
8094 }
8095 
8096 /*
8097  * Find next autocommand pattern that matches.
8098  */
8099     static void
8100 auto_next_pat(apc, stop_at_last)
8101     AutoPatCmd	*apc;
8102     int		stop_at_last;	    /* stop when 'last' flag is set */
8103 {
8104     AutoPat	*ap;
8105     AutoCmd	*cp;
8106     char_u	*name;
8107     char	*s;
8108 
8109     vim_free(sourcing_name);
8110     sourcing_name = NULL;
8111 
8112     for (ap = apc->curpat; ap != NULL && !got_int; ap = ap->next)
8113     {
8114 	apc->curpat = NULL;
8115 
8116 	/* only use a pattern when it has not been removed, has commands and
8117 	 * the group matches */
8118 	if (ap->pat != NULL && ap->cmds != NULL
8119 		&& (apc->group == AUGROUP_ALL || apc->group == ap->group))
8120 	{
8121 	    if (match_file_pat(ap->reg_pat, apc->fname, apc->sfname, apc->tail,
8122 							      ap->allow_dirs))
8123 	    {
8124 		name = event_nr2name(apc->event);
8125 		s = _("%s Auto commands for \"%s\"");
8126 		sourcing_name = alloc((unsigned)(STRLEN(s)
8127 					    + STRLEN(name) + ap->patlen + 1));
8128 		if (sourcing_name != NULL)
8129 		{
8130 		    sprintf((char *)sourcing_name, s,
8131 					       (char *)name, (char *)ap->pat);
8132 		    if (p_verbose >= 8)
8133 			msg_str((char_u *)_("Executing %s"), sourcing_name);
8134 		}
8135 
8136 		apc->curpat = ap;
8137 		apc->nextcmd = ap->cmds;
8138 		/* mark last command */
8139 		for (cp = ap->cmds; cp->next != NULL; cp = cp->next)
8140 		    cp->last = FALSE;
8141 		cp->last = TRUE;
8142 	    }
8143 	    line_breakcheck();
8144 	    if (apc->curpat != NULL)	    /* found a match */
8145 		break;
8146 	}
8147 	if (stop_at_last && ap->last)
8148 	    break;
8149     }
8150 }
8151 
8152 /*
8153  * Get next autocommand command.
8154  * Called by do_cmdline() to get the next line for ":if".
8155  * Returns allocated string, or NULL for end of autocommands.
8156  */
8157 /* ARGSUSED */
8158     static char_u *
8159 getnextac(c, cookie, indent)
8160     int	    c;		    /* not used */
8161     void    *cookie;
8162     int	    indent;	    /* not used */
8163 {
8164     AutoPatCmd	    *acp = (AutoPatCmd *)cookie;
8165     char_u	    *retval;
8166     AutoCmd	    *ac;
8167 
8168     /* Can be called again after returning the last line. */
8169     if (acp->curpat == NULL)
8170 	return NULL;
8171 
8172     /* repeat until we find an autocommand to execute */
8173     for (;;)
8174     {
8175 	/* skip removed commands */
8176 	while (acp->nextcmd != NULL && acp->nextcmd->cmd == NULL)
8177 	    if (acp->nextcmd->last)
8178 		acp->nextcmd = NULL;
8179 	    else
8180 		acp->nextcmd = acp->nextcmd->next;
8181 
8182 	if (acp->nextcmd != NULL)
8183 	    break;
8184 
8185 	/* at end of commands, find next pattern that matches */
8186 	if (acp->curpat->last)
8187 	    acp->curpat = NULL;
8188 	else
8189 	    acp->curpat = acp->curpat->next;
8190 	if (acp->curpat != NULL)
8191 	    auto_next_pat(acp, TRUE);
8192 	if (acp->curpat == NULL)
8193 	    return NULL;
8194     }
8195 
8196     ac = acp->nextcmd;
8197 
8198     if (p_verbose >= 9)
8199     {
8200 	msg_scroll = TRUE;	    /* always scroll up, don't overwrite */
8201 	msg_str((char_u *)_("autocommand %s"), ac->cmd);
8202 	msg_puts((char_u *)"\n");   /* don't overwrite this either */
8203 	cmdline_row = msg_row;
8204     }
8205     retval = vim_strsave(ac->cmd);
8206     autocmd_nested = ac->nested;
8207 #ifdef FEAT_EVAL
8208     current_SID = ac->scriptID;
8209 #endif
8210     if (ac->last)
8211 	acp->nextcmd = NULL;
8212     else
8213 	acp->nextcmd = ac->next;
8214     return retval;
8215 }
8216 
8217 /*
8218  * Return TRUE if there is a matching autocommand for "fname".
8219  */
8220     int
8221 has_autocmd(event, sfname)
8222     EVENT_T	event;
8223     char_u	*sfname;
8224 {
8225     AutoPat	*ap;
8226     char_u	*fname;
8227     char_u	*tail = gettail(sfname);
8228     int		retval = FALSE;
8229 
8230     fname = FullName_save(sfname, FALSE);
8231     if (fname == NULL)
8232 	return FALSE;
8233 
8234 #ifdef BACKSLASH_IN_FILENAME
8235     /*
8236      * Replace all backslashes with forward slashes.  This makes the
8237      * autocommand patterns portable between Unix and MS-DOS.
8238      */
8239     sfname = vim_strsave(sfname);
8240     if (sfname != NULL)
8241 	forward_slash(sfname);
8242     forward_slash(fname);
8243 #endif
8244 
8245     for (ap = first_autopat[(int)event]; ap != NULL; ap = ap->next)
8246 	if (ap->pat != NULL && ap->cmds != NULL
8247 		&& match_file_pat(ap->reg_pat, fname, sfname, tail,
8248 							      ap->allow_dirs))
8249 	{
8250 	    retval = TRUE;
8251 	    break;
8252 	}
8253 
8254     vim_free(fname);
8255 #ifdef BACKSLASH_IN_FILENAME
8256     vim_free(sfname);
8257 #endif
8258 
8259     return retval;
8260 }
8261 
8262 #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
8263 /*
8264  * Function given to ExpandGeneric() to obtain the list of autocommand group
8265  * names.
8266  */
8267 /*ARGSUSED*/
8268     char_u *
8269 get_augroup_name(xp, idx)
8270     expand_T	*xp;
8271     int		idx;
8272 {
8273     if (idx == augroups.ga_len)		/* add "END" add the end */
8274 	return (char_u *)"END";
8275     if (idx >= augroups.ga_len)		/* end of list */
8276 	return NULL;
8277     if (AUGROUP_NAME(idx) == NULL)	/* skip deleted entries */
8278 	return (char_u *)"";
8279     return AUGROUP_NAME(idx);		/* return a name */
8280 }
8281 
8282 static int include_groups = FALSE;
8283 
8284     char_u  *
8285 set_context_in_autocmd(xp, arg, doautocmd)
8286     expand_T	*xp;
8287     char_u	*arg;
8288     int		doautocmd;	/* TRUE for :doautocmd, FALSE for :autocmd */
8289 {
8290     char_u	*p;
8291     int		group;
8292 
8293     /* check for a group name, skip it if present */
8294     include_groups = FALSE;
8295     p = arg;
8296     group = au_get_grouparg(&arg);
8297     if (group == AUGROUP_ERROR)
8298 	return NULL;
8299     /* If there only is a group name that's what we expand. */
8300     if (*arg == NUL && group != AUGROUP_ALL && !vim_iswhite(arg[-1]))
8301     {
8302 	arg = p;
8303 	group = AUGROUP_ALL;
8304     }
8305 
8306     /* skip over event name */
8307     for (p = arg; *p != NUL && !vim_iswhite(*p); ++p)
8308 	if (*p == ',')
8309 	    arg = p + 1;
8310     if (*p == NUL)
8311     {
8312 	if (group == AUGROUP_ALL)
8313 	    include_groups = TRUE;
8314 	xp->xp_context = EXPAND_EVENTS;	    /* expand event name */
8315 	xp->xp_pattern = arg;
8316 	return NULL;
8317     }
8318 
8319     /* skip over pattern */
8320     arg = skipwhite(p);
8321     while (*arg && (!vim_iswhite(*arg) || arg[-1] == '\\'))
8322 	arg++;
8323     if (*arg)
8324 	return arg;			    /* expand (next) command */
8325 
8326     if (doautocmd)
8327 	xp->xp_context = EXPAND_FILES;	    /* expand file names */
8328     else
8329 	xp->xp_context = EXPAND_NOTHING;    /* pattern is not expanded */
8330     return NULL;
8331 }
8332 
8333 /*
8334  * Function given to ExpandGeneric() to obtain the list of event names.
8335  */
8336 /*ARGSUSED*/
8337     char_u *
8338 get_event_name(xp, idx)
8339     expand_T	*xp;
8340     int		idx;
8341 {
8342     if (idx < augroups.ga_len)		/* First list group names, if wanted */
8343     {
8344 	if (!include_groups || AUGROUP_NAME(idx) == NULL)
8345 	    return (char_u *)"";	/* skip deleted entries */
8346 	return AUGROUP_NAME(idx);	/* return a name */
8347     }
8348     return (char_u *)event_names[idx - augroups.ga_len].name;
8349 }
8350 
8351 #endif	/* FEAT_CMDL_COMPL */
8352 
8353 /*
8354  * Return TRUE if an autocommand is defined for "event" and "pattern".
8355  * "pattern" can be NULL to accept any pattern.
8356  */
8357     int
8358 au_exists(name, name_end, pattern)
8359     char_u	*name;
8360     char_u	*name_end;
8361     char_u	*pattern;
8362 {
8363     char_u	*event_name;
8364     char_u	*p;
8365     EVENT_T	event;
8366     AutoPat	*ap;
8367 
8368     /* find the index (enum) for the event name */
8369     event_name = vim_strnsave(name, (int)(name_end - name));
8370     if (event_name == NULL)
8371 	return FALSE;
8372     event = event_name2nr(event_name, &p);
8373     vim_free(event_name);
8374 
8375     /* return FALSE if the event name is not recognized */
8376     if (event == NUM_EVENTS)	    /* unknown event name */
8377 	return FALSE;
8378 
8379     /* Find the first autocommand for this event.
8380      * If there isn't any, return FALSE;
8381      * If there is one and no pattern given, return TRUE; */
8382     ap = first_autopat[(int)event];
8383     if (ap == NULL)
8384 	return FALSE;
8385     if (pattern == NULL)
8386 	return TRUE;
8387 
8388     /* Check if there is an autocommand with the given pattern. */
8389     for ( ; ap != NULL; ap = ap->next)
8390 	/* only use a pattern when it has not been removed and has commands */
8391 	if (ap->pat != NULL && ap->cmds != NULL
8392 					   && fnamecmp(ap->pat, pattern) == 0)
8393 	    return TRUE;
8394 
8395     return FALSE;
8396 }
8397 #endif	/* FEAT_AUTOCMD */
8398 
8399 #if defined(FEAT_AUTOCMD) || defined(FEAT_WILDIGN) || defined(PROTO)
8400 /*
8401  * Try matching a filename with a pattern.
8402  * Used for autocommands and 'wildignore'.
8403  * Returns TRUE if there is a match, FALSE otherwise.
8404  */
8405     int
8406 match_file_pat(pattern, fname, sfname, tail, allow_dirs)
8407     char_u	*pattern;		/* pattern to match with */
8408     char_u	*fname;			/* full path of file name */
8409     char_u	*sfname;		/* short file name or NULL */
8410     char_u	*tail;			/* tail of path */
8411     int		allow_dirs;		/* allow matching with dir */
8412 {
8413     regmatch_T	regmatch;
8414     int		result = FALSE;
8415 #ifdef FEAT_OSFILETYPE
8416     int		no_pattern = FALSE; /* TRUE if check is filetype only */
8417     char_u	*type_start;
8418     char_u	c;
8419     int		match = FALSE;
8420 #endif
8421 
8422 #ifdef CASE_INSENSITIVE_FILENAME
8423     regmatch.rm_ic = TRUE;		/* Always ignore case */
8424 #else
8425     regmatch.rm_ic = FALSE;		/* Don't ever ignore case */
8426 #endif
8427 #ifdef FEAT_OSFILETYPE
8428     if (*pattern == '<')
8429     {
8430 	/* There is a filetype condition specified with this pattern.
8431 	 * Check the filetype matches first. If not, don't bother with the
8432 	 * pattern (set regprog to NULL).
8433 	 * Always use magic for the regexp.
8434 	 */
8435 
8436 	for (type_start = pattern + 1; (c = *pattern); pattern++)
8437 	{
8438 	    if ((c == ';' || c == '>') && match == FALSE)
8439 	    {
8440 		*pattern = NUL;	    /* Terminate the string */
8441 		match = mch_check_filetype(fname, type_start);
8442 		*pattern = c;	    /* Restore the terminator */
8443 		type_start = pattern + 1;
8444 	    }
8445 	    if (c == '>')
8446 		break;
8447 	}
8448 
8449 	/* (c should never be NUL, but check anyway) */
8450 	if (match == FALSE || c == NUL)
8451 	    regmatch.regprog = NULL;	/* Doesn't match - don't check pat. */
8452 	else if (*pattern == NUL)
8453 	{
8454 	    regmatch.regprog = NULL;	/* Vim will try to free regprog later */
8455 	    no_pattern = TRUE;	/* Always matches - don't check pat. */
8456 	}
8457 	else
8458 	    regmatch.regprog = vim_regcomp(pattern + 1, RE_MAGIC);
8459     }
8460     else
8461 #endif
8462 	regmatch.regprog = vim_regcomp(pattern, RE_MAGIC);
8463 
8464     /*
8465      * Try for a match with the pattern with:
8466      * 1. the full file name, when the pattern has a '/'.
8467      * 2. the short file name, when the pattern has a '/'.
8468      * 3. the tail of the file name, when the pattern has no '/'.
8469      */
8470     if (
8471 #ifdef FEAT_OSFILETYPE
8472 	    /* If the check is for a filetype only and we don't care
8473 	     * about the path then skip all the regexp stuff.
8474 	     */
8475 	    no_pattern ||
8476 #endif
8477 	    (regmatch.regprog != NULL
8478 	     && ((allow_dirs
8479 		     && (vim_regexec(&regmatch, fname, (colnr_T)0)
8480 			 || (sfname != NULL
8481 			     && vim_regexec(&regmatch, sfname, (colnr_T)0))))
8482 		 || (!allow_dirs && vim_regexec(&regmatch, tail, (colnr_T)0)))))
8483 	result = TRUE;
8484 
8485     vim_free(regmatch.regprog);
8486     return result;
8487 }
8488 #endif
8489 
8490 #if defined(FEAT_WILDIGN) || defined(PROTO)
8491 /*
8492  * Return TRUE if a file matches with a pattern in "list".
8493  * "list" is a comma-separated list of patterns, like 'wildignore'.
8494  * "sfname" is the short file name or NULL, "ffname" the long file name.
8495  */
8496     int
8497 match_file_list(list, sfname, ffname)
8498     char_u	*list;
8499     char_u	*sfname;
8500     char_u	*ffname;
8501 {
8502     char_u	buf[100];
8503     char_u	*tail;
8504     char_u	*regpat;
8505     char	allow_dirs;
8506     int		match;
8507     char_u	*p;
8508 
8509     tail = gettail(sfname);
8510 
8511     /* try all patterns in 'wildignore' */
8512     p = list;
8513     while (*p)
8514     {
8515 	copy_option_part(&p, buf, 100, ",");
8516 	regpat = file_pat_to_reg_pat(buf, NULL, &allow_dirs, FALSE);
8517 	if (regpat == NULL)
8518 	    break;
8519 	match = match_file_pat(regpat, ffname, sfname, tail, (int)allow_dirs);
8520 	vim_free(regpat);
8521 	if (match)
8522 	    return TRUE;
8523     }
8524     return FALSE;
8525 }
8526 #endif
8527 
8528 /*
8529  * Convert the given pattern "pat" which has shell style wildcards in it, into
8530  * a regular expression, and return the result in allocated memory.  If there
8531  * is a directory path separator to be matched, then TRUE is put in
8532  * allow_dirs, otherwise FALSE is put there -- webb.
8533  * Handle backslashes before special characters, like "\*" and "\ ".
8534  *
8535  * If FEAT_OSFILETYPE defined then pass initial <type> through unchanged. Eg:
8536  * '<html>myfile' becomes '<html>^myfile$' -- leonard.
8537  *
8538  * Returns NULL when out of memory.
8539  */
8540 /*ARGSUSED*/
8541     char_u *
8542 file_pat_to_reg_pat(pat, pat_end, allow_dirs, no_bslash)
8543     char_u	*pat;
8544     char_u	*pat_end;	/* first char after pattern or NULL */
8545     char	*allow_dirs;	/* Result passed back out in here */
8546     int		no_bslash;	/* Don't use a backward slash as pathsep */
8547 {
8548     int		size;
8549     char_u	*endp;
8550     char_u	*reg_pat;
8551     char_u	*p;
8552     int		i;
8553     int		nested = 0;
8554     int		add_dollar = TRUE;
8555 #ifdef FEAT_OSFILETYPE
8556     int		check_length = 0;
8557 #endif
8558 
8559     if (allow_dirs != NULL)
8560 	*allow_dirs = FALSE;
8561     if (pat_end == NULL)
8562 	pat_end = pat + STRLEN(pat);
8563 
8564 #ifdef FEAT_OSFILETYPE
8565     /* Find out how much of the string is the filetype check */
8566     if (*pat == '<')
8567     {
8568 	/* Count chars until the next '>' */
8569 	for (p = pat + 1; p < pat_end && *p != '>'; p++)
8570 	    ;
8571 	if (p < pat_end)
8572 	{
8573 	    /* Pattern is of the form <.*>.*  */
8574 	    check_length = p - pat + 1;
8575 	    if (p + 1 >= pat_end)
8576 	    {
8577 		/* The 'pattern' is a filetype check ONLY */
8578 		reg_pat = (char_u *)alloc(check_length + 1);
8579 		if (reg_pat != NULL)
8580 		{
8581 		    mch_memmove(reg_pat, pat, (size_t)check_length);
8582 		    reg_pat[check_length] = NUL;
8583 		}
8584 		return reg_pat;
8585 	    }
8586 	}
8587 	/* else: there was no closing '>' - assume it was a normal pattern */
8588 
8589     }
8590     pat += check_length;
8591     size = 2 + check_length;
8592 #else
8593     size = 2;		/* '^' at start, '$' at end */
8594 #endif
8595 
8596     for (p = pat; p < pat_end; p++)
8597     {
8598 	switch (*p)
8599 	{
8600 	    case '*':
8601 	    case '.':
8602 	    case ',':
8603 	    case '{':
8604 	    case '}':
8605 	    case '~':
8606 		size += 2;	/* extra backslash */
8607 		break;
8608 #ifdef BACKSLASH_IN_FILENAME
8609 	    case '\\':
8610 	    case '/':
8611 		size += 4;	/* could become "[\/]" */
8612 		break;
8613 #endif
8614 	    default:
8615 		size++;
8616 # ifdef  FEAT_MBYTE
8617 		if (enc_dbcs != 0 && (*mb_ptr2len_check)(p) > 1)
8618 		{
8619 		    ++p;
8620 		    ++size;
8621 		}
8622 # endif
8623 		break;
8624 	}
8625     }
8626     reg_pat = alloc(size + 1);
8627     if (reg_pat == NULL)
8628 	return NULL;
8629 
8630 #ifdef FEAT_OSFILETYPE
8631     /* Copy the type check in to the start. */
8632     if (check_length)
8633 	mch_memmove(reg_pat, pat - check_length, (size_t)check_length);
8634     i = check_length;
8635 #else
8636     i = 0;
8637 #endif
8638 
8639     if (pat[0] == '*')
8640 	while (pat[0] == '*' && pat < pat_end - 1)
8641 	    pat++;
8642     else
8643 	reg_pat[i++] = '^';
8644     endp = pat_end - 1;
8645     if (*endp == '*')
8646     {
8647 	while (endp - pat > 0 && *endp == '*')
8648 	    endp--;
8649 	add_dollar = FALSE;
8650     }
8651     for (p = pat; *p && nested >= 0 && p <= endp; p++)
8652     {
8653 	switch (*p)
8654 	{
8655 	    case '*':
8656 		reg_pat[i++] = '.';
8657 		reg_pat[i++] = '*';
8658 		break;
8659 	    case '.':
8660 #ifdef RISCOS
8661 		if (allow_dirs != NULL)
8662 		     *allow_dirs = TRUE;
8663 		/* FALLTHROUGH */
8664 #endif
8665 	    case '~':
8666 		reg_pat[i++] = '\\';
8667 		reg_pat[i++] = *p;
8668 		break;
8669 	    case '?':
8670 #ifdef RISCOS
8671 	    case '#':
8672 #endif
8673 		reg_pat[i++] = '.';
8674 		break;
8675 	    case '\\':
8676 		if (p[1] == NUL)
8677 		    break;
8678 #ifdef BACKSLASH_IN_FILENAME
8679 		if (!no_bslash)
8680 		{
8681 		    /* translate:
8682 		     * "\x" to "\\x"  e.g., "dir\file"
8683 		     * "\*" to "\\.*" e.g., "dir\*.c"
8684 		     * "\?" to "\\."  e.g., "dir\??.c"
8685 		     * "\+" to "\+"   e.g., "fileX\+.c"
8686 		     */
8687 		    if ((vim_isfilec(p[1]) || p[1] == '*' || p[1] == '?')
8688 			    && p[1] != '+')
8689 		    {
8690 			reg_pat[i++] = '[';
8691 			reg_pat[i++] = '\\';
8692 			reg_pat[i++] = '/';
8693 			reg_pat[i++] = ']';
8694 			if (allow_dirs != NULL)
8695 			    *allow_dirs = TRUE;
8696 			break;
8697 		    }
8698 		}
8699 #endif
8700 		if (*++p == '?'
8701 #ifdef BACKSLASH_IN_FILENAME
8702 			&& no_bslash
8703 #endif
8704 			)
8705 		    reg_pat[i++] = '?';
8706 		else
8707 		    if (*p == ',')
8708 			reg_pat[i++] = ',';
8709 		    else
8710 		    {
8711 			if (allow_dirs != NULL && vim_ispathsep(*p)
8712 #ifdef BACKSLASH_IN_FILENAME
8713 				&& (!no_bslash || *p != '\\')
8714 #endif
8715 				)
8716 			    *allow_dirs = TRUE;
8717 			reg_pat[i++] = '\\';
8718 			reg_pat[i++] = *p;
8719 		    }
8720 		break;
8721 #ifdef BACKSLASH_IN_FILENAME
8722 	    case '/':
8723 		reg_pat[i++] = '[';
8724 		reg_pat[i++] = '\\';
8725 		reg_pat[i++] = '/';
8726 		reg_pat[i++] = ']';
8727 		if (allow_dirs != NULL)
8728 		    *allow_dirs = TRUE;
8729 		break;
8730 #endif
8731 	    case '{':
8732 		reg_pat[i++] = '\\';
8733 		reg_pat[i++] = '(';
8734 		nested++;
8735 		break;
8736 	    case '}':
8737 		reg_pat[i++] = '\\';
8738 		reg_pat[i++] = ')';
8739 		--nested;
8740 		break;
8741 	    case ',':
8742 		if (nested)
8743 		{
8744 		    reg_pat[i++] = '\\';
8745 		    reg_pat[i++] = '|';
8746 		}
8747 		else
8748 		    reg_pat[i++] = ',';
8749 		break;
8750 	    default:
8751 # ifdef  FEAT_MBYTE
8752 		if (enc_dbcs != 0 && (*mb_ptr2len_check)(p) > 1)
8753 		    reg_pat[i++] = *p++;
8754 		else
8755 # endif
8756 		if (allow_dirs != NULL && vim_ispathsep(*p))
8757 		    *allow_dirs = TRUE;
8758 		reg_pat[i++] = *p;
8759 		break;
8760 	}
8761     }
8762     if (add_dollar)
8763 	reg_pat[i++] = '$';
8764     reg_pat[i] = NUL;
8765     if (nested != 0)
8766     {
8767 	if (nested < 0)
8768 	    EMSG(_("E219: Missing {."));
8769 	else
8770 	    EMSG(_("E220: Missing }."));
8771 	vim_free(reg_pat);
8772 	reg_pat = NULL;
8773     }
8774     return reg_pat;
8775 }
8776