xref: /vim-8.2.3635/src/fileio.c (revision ed37d9b3)
1 /* vi:set ts=8 sts=4 sw=4 noet:
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 #include "vim.h"
15 
16 #if defined(__TANDEM) || defined(__MINT__)
17 # include <limits.h>		// for SSIZE_MAX
18 #endif
19 
20 // Is there any system that doesn't have access()?
21 #define USE_MCH_ACCESS
22 
23 static char_u *next_fenc(char_u **pp, int *alloced);
24 #ifdef FEAT_EVAL
25 static char_u *readfile_charconvert(char_u *fname, char_u *fenc, int *fdp);
26 #endif
27 #ifdef FEAT_CRYPT
28 static char_u *check_for_cryptkey(char_u *cryptkey, char_u *ptr, long *sizep, off_T *filesizep, int newfile, char_u *fname, int *did_ask);
29 #endif
30 static linenr_T readfile_linenr(linenr_T linecnt, char_u *p, char_u *endp);
31 static char_u *check_for_bom(char_u *p, long size, int *lenp, int flags);
32 static char *e_auchangedbuf = N_("E812: Autocommands changed buffer or buffer name");
33 
34     void
35 filemess(
36     buf_T	*buf,
37     char_u	*name,
38     char_u	*s,
39     int		attr)
40 {
41     int		msg_scroll_save;
42     int		prev_msg_col = msg_col;
43 
44     if (msg_silent != 0)
45 	return;
46     msg_add_fname(buf, name);	    // put file name in IObuff with quotes
47     // If it's extremely long, truncate it.
48     if (STRLEN(IObuff) > IOSIZE - 80)
49 	IObuff[IOSIZE - 80] = NUL;
50     STRCAT(IObuff, s);
51     /*
52      * For the first message may have to start a new line.
53      * For further ones overwrite the previous one, reset msg_scroll before
54      * calling filemess().
55      */
56     msg_scroll_save = msg_scroll;
57     if (shortmess(SHM_OVERALL) && !exiting && p_verbose == 0)
58 	msg_scroll = FALSE;
59     if (!msg_scroll)	// wait a bit when overwriting an error msg
60 	check_for_delay(FALSE);
61     msg_start();
62     if (prev_msg_col != 0 && msg_col == 0)
63 	msg_putchar('\r');  // overwrite any previous message.
64     msg_scroll = msg_scroll_save;
65     msg_scrolled_ign = TRUE;
66     // may truncate the message to avoid a hit-return prompt
67     msg_outtrans_attr(msg_may_trunc(FALSE, IObuff), attr);
68     msg_clr_eos();
69     out_flush();
70     msg_scrolled_ign = FALSE;
71 }
72 
73 /*
74  * Read lines from file "fname" into the buffer after line "from".
75  *
76  * 1. We allocate blocks with lalloc, as big as possible.
77  * 2. Each block is filled with characters from the file with a single read().
78  * 3. The lines are inserted in the buffer with ml_append().
79  *
80  * (caller must check that fname != NULL, unless READ_STDIN is used)
81  *
82  * "lines_to_skip" is the number of lines that must be skipped
83  * "lines_to_read" is the number of lines that are appended
84  * When not recovering lines_to_skip is 0 and lines_to_read MAXLNUM.
85  *
86  * flags:
87  * READ_NEW	starting to edit a new buffer
88  * READ_FILTER	reading filter output
89  * READ_STDIN	read from stdin instead of a file
90  * READ_BUFFER	read from curbuf instead of a file (converting after reading
91  *		stdin)
92  * READ_DUMMY	read into a dummy buffer (to check if file contents changed)
93  * READ_KEEP_UNDO  don't clear undo info or read it from a file
94  * READ_FIFO	read from fifo/socket instead of a file
95  *
96  * return FAIL for failure, NOTDONE for directory (failure), or OK
97  */
98     int
99 readfile(
100     char_u	*fname,
101     char_u	*sfname,
102     linenr_T	from,
103     linenr_T	lines_to_skip,
104     linenr_T	lines_to_read,
105     exarg_T	*eap,			// can be NULL!
106     int		flags)
107 {
108     int		fd = 0;
109     int		newfile = (flags & READ_NEW);
110     int		check_readonly;
111     int		filtering = (flags & READ_FILTER);
112     int		read_stdin = (flags & READ_STDIN);
113     int		read_buffer = (flags & READ_BUFFER);
114     int		read_fifo = (flags & READ_FIFO);
115     int		set_options = newfile || read_buffer
116 					   || (eap != NULL && eap->read_edit);
117     linenr_T	read_buf_lnum = 1;	// next line to read from curbuf
118     colnr_T	read_buf_col = 0;	// next char to read from this line
119     char_u	c;
120     linenr_T	lnum = from;
121     char_u	*ptr = NULL;		// pointer into read buffer
122     char_u	*buffer = NULL;		// read buffer
123     char_u	*new_buffer = NULL;	// init to shut up gcc
124     char_u	*line_start = NULL;	// init to shut up gcc
125     int		wasempty;		// buffer was empty before reading
126     colnr_T	len;
127     long	size = 0;
128     char_u	*p;
129     off_T	filesize = 0;
130     int		skip_read = FALSE;
131 #ifdef FEAT_CRYPT
132     char_u	*cryptkey = NULL;
133     int		did_ask_for_key = FALSE;
134 #endif
135 #ifdef FEAT_PERSISTENT_UNDO
136     context_sha256_T sha_ctx;
137     int		read_undo_file = FALSE;
138 #endif
139     int		split = 0;		// number of split lines
140 #define UNKNOWN	 0x0fffffff		// file size is unknown
141     linenr_T	linecnt;
142     int		error = FALSE;		// errors encountered
143     int		ff_error = EOL_UNKNOWN; // file format with errors
144     long	linerest = 0;		// remaining chars in line
145 #ifdef UNIX
146     int		perm = 0;
147     int		swap_mode = -1;		// protection bits for swap file
148 #else
149     int		perm;
150 #endif
151     int		fileformat = 0;		// end-of-line format
152     int		keep_fileformat = FALSE;
153     stat_T	st;
154     int		file_readonly;
155     linenr_T	skip_count = 0;
156     linenr_T	read_count = 0;
157     int		msg_save = msg_scroll;
158     linenr_T	read_no_eol_lnum = 0;   // non-zero lnum when last line of
159 					// last read was missing the eol
160     int		try_mac;
161     int		try_dos;
162     int		try_unix;
163     int		file_rewind = FALSE;
164     int		can_retry;
165     linenr_T	conv_error = 0;		// line nr with conversion error
166     linenr_T	illegal_byte = 0;	// line nr with illegal byte
167     int		keep_dest_enc = FALSE;	// don't retry when char doesn't fit
168 					// in destination encoding
169     int		bad_char_behavior = BAD_REPLACE;
170 					// BAD_KEEP, BAD_DROP or character to
171 					// replace with
172     char_u	*tmpname = NULL;	// name of 'charconvert' output file
173     int		fio_flags = 0;
174     char_u	*fenc;			// fileencoding to use
175     int		fenc_alloced;		// fenc_next is in allocated memory
176     char_u	*fenc_next = NULL;	// next item in 'fencs' or NULL
177     int		advance_fenc = FALSE;
178     long	real_size = 0;
179 #ifdef USE_ICONV
180     iconv_t	iconv_fd = (iconv_t)-1;	// descriptor for iconv() or -1
181 # ifdef FEAT_EVAL
182     int		did_iconv = FALSE;	// TRUE when iconv() failed and trying
183 					// 'charconvert' next
184 # endif
185 #endif
186     int		converted = FALSE;	// TRUE if conversion done
187     int		notconverted = FALSE;	// TRUE if conversion wanted but it
188 					// wasn't possible
189     char_u	conv_rest[CONV_RESTLEN];
190     int		conv_restlen = 0;	// nr of bytes in conv_rest[]
191     pos_T	orig_start;
192     buf_T	*old_curbuf;
193     char_u	*old_b_ffname;
194     char_u	*old_b_fname;
195     int		using_b_ffname;
196     int		using_b_fname;
197 
198     au_did_filetype = FALSE; // reset before triggering any autocommands
199 
200     curbuf->b_no_eol_lnum = 0;	// in case it was set by the previous read
201 
202     /*
203      * If there is no file name yet, use the one for the read file.
204      * BF_NOTEDITED is set to reflect this.
205      * Don't do this for a read from a filter.
206      * Only do this when 'cpoptions' contains the 'f' flag.
207      */
208     if (curbuf->b_ffname == NULL
209 	    && !filtering
210 	    && fname != NULL
211 	    && vim_strchr(p_cpo, CPO_FNAMER) != NULL
212 	    && !(flags & READ_DUMMY))
213     {
214 	if (set_rw_fname(fname, sfname) == FAIL)
215 	    return FAIL;
216     }
217 
218     // Remember the initial values of curbuf, curbuf->b_ffname and
219     // curbuf->b_fname to detect whether they are altered as a result of
220     // executing nasty autocommands.  Also check if "fname" and "sfname"
221     // point to one of these values.
222     old_curbuf = curbuf;
223     old_b_ffname = curbuf->b_ffname;
224     old_b_fname = curbuf->b_fname;
225     using_b_ffname = (fname == curbuf->b_ffname)
226 					      || (sfname == curbuf->b_ffname);
227     using_b_fname = (fname == curbuf->b_fname) || (sfname == curbuf->b_fname);
228 
229     // After reading a file the cursor line changes but we don't want to
230     // display the line.
231     ex_no_reprint = TRUE;
232 
233     // don't display the file info for another buffer now
234     need_fileinfo = FALSE;
235 
236     /*
237      * For Unix: Use the short file name whenever possible.
238      * Avoids problems with networks and when directory names are changed.
239      * Don't do this for MS-DOS, a "cd" in a sub-shell may have moved us to
240      * another directory, which we don't detect.
241      */
242     if (sfname == NULL)
243 	sfname = fname;
244 #if defined(UNIX)
245     fname = sfname;
246 #endif
247 
248     /*
249      * The BufReadCmd and FileReadCmd events intercept the reading process by
250      * executing the associated commands instead.
251      */
252     if (!filtering && !read_stdin && !read_buffer)
253     {
254 	orig_start = curbuf->b_op_start;
255 
256 	// Set '[ mark to the line above where the lines go (line 1 if zero).
257 	curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
258 	curbuf->b_op_start.col = 0;
259 
260 	if (newfile)
261 	{
262 	    if (apply_autocmds_exarg(EVENT_BUFREADCMD, NULL, sfname,
263 							  FALSE, curbuf, eap))
264 	    {
265 		int status = OK;
266 #ifdef FEAT_EVAL
267 		if (aborting())
268 		    status = FAIL;
269 #endif
270 		// The BufReadCmd code usually uses ":read" to get the text and
271 		// perhaps ":file" to change the buffer name. But we should
272 		// consider this to work like ":edit", thus reset the
273 		// BF_NOTEDITED flag.  Then ":write" will work to overwrite the
274 		// same file.
275 		if (status == OK)
276 		    curbuf->b_flags &= ~BF_NOTEDITED;
277 		return status;
278 	    }
279 	}
280 	else if (apply_autocmds_exarg(EVENT_FILEREADCMD, sfname, sfname,
281 							    FALSE, NULL, eap))
282 #ifdef FEAT_EVAL
283 	    return aborting() ? FAIL : OK;
284 #else
285 	    return OK;
286 #endif
287 
288 	curbuf->b_op_start = orig_start;
289     }
290 
291     if ((shortmess(SHM_OVER) || curbuf->b_help) && p_verbose == 0)
292 	msg_scroll = FALSE;	// overwrite previous file message
293     else
294 	msg_scroll = TRUE;	// don't overwrite previous file message
295 
296     /*
297      * If the name ends in a path separator, we can't open it.  Check here,
298      * because reading the file may actually work, but then creating the swap
299      * file may destroy it!  Reported on MS-DOS and Win 95.
300      * If the name is too long we might crash further on, quit here.
301      */
302     if (fname != NULL && *fname != NUL)
303     {
304 	p = fname + STRLEN(fname);
305 	if (after_pathsep(fname, p) || STRLEN(fname) >= MAXPATHL)
306 	{
307 	    filemess(curbuf, fname, (char_u *)_("Illegal file name"), 0);
308 	    msg_end();
309 	    msg_scroll = msg_save;
310 	    return FAIL;
311 	}
312     }
313 
314     if (!read_stdin && !read_buffer && !read_fifo)
315     {
316 #ifdef UNIX
317 	/*
318 	 * On Unix it is possible to read a directory, so we have to
319 	 * check for it before the mch_open().
320 	 */
321 	perm = mch_getperm(fname);
322 	if (perm >= 0 && !S_ISREG(perm)		    // not a regular file ...
323 		      && !S_ISFIFO(perm)	    // ... or fifo
324 		      && !S_ISSOCK(perm)	    // ... or socket
325 # ifdef OPEN_CHR_FILES
326 		      && !(S_ISCHR(perm) && is_dev_fd_file(fname))
327 			// ... or a character special file named /dev/fd/<n>
328 # endif
329 						)
330 	{
331 	    int retval = FAIL;
332 
333 	    if (S_ISDIR(perm))
334 	    {
335 		filemess(curbuf, fname, (char_u *)_("is a directory"), 0);
336 		retval = NOTDONE;
337 	    }
338 	    else
339 		filemess(curbuf, fname, (char_u *)_("is not a file"), 0);
340 	    msg_end();
341 	    msg_scroll = msg_save;
342 	    return retval;
343 	}
344 #endif
345 #if defined(MSWIN)
346 	/*
347 	 * MS-Windows allows opening a device, but we will probably get stuck
348 	 * trying to read it.
349 	 */
350 	if (!p_odev && mch_nodetype(fname) == NODE_WRITABLE)
351 	{
352 	    filemess(curbuf, fname, (char_u *)_("is a device (disabled with 'opendevice' option)"), 0);
353 	    msg_end();
354 	    msg_scroll = msg_save;
355 	    return FAIL;
356 	}
357 #endif
358     }
359 
360     // Set default or forced 'fileformat' and 'binary'.
361     set_file_options(set_options, eap);
362 
363     /*
364      * When opening a new file we take the readonly flag from the file.
365      * Default is r/w, can be set to r/o below.
366      * Don't reset it when in readonly mode
367      * Only set/reset b_p_ro when BF_CHECK_RO is set.
368      */
369     check_readonly = (newfile && (curbuf->b_flags & BF_CHECK_RO));
370     if (check_readonly && !readonlymode)
371 	curbuf->b_p_ro = FALSE;
372 
373     if (newfile && !read_stdin && !read_buffer && !read_fifo)
374     {
375 	// Remember time of file.
376 	if (mch_stat((char *)fname, &st) >= 0)
377 	{
378 	    buf_store_time(curbuf, &st, fname);
379 	    curbuf->b_mtime_read = curbuf->b_mtime;
380 #ifdef UNIX
381 	    /*
382 	     * Use the protection bits of the original file for the swap file.
383 	     * This makes it possible for others to read the name of the
384 	     * edited file from the swapfile, but only if they can read the
385 	     * edited file.
386 	     * Remove the "write" and "execute" bits for group and others
387 	     * (they must not write the swapfile).
388 	     * Add the "read" and "write" bits for the user, otherwise we may
389 	     * not be able to write to the file ourselves.
390 	     * Setting the bits is done below, after creating the swap file.
391 	     */
392 	    swap_mode = (st.st_mode & 0644) | 0600;
393 #endif
394 #ifdef FEAT_CW_EDITOR
395 	    // Get the FSSpec on MacOS
396 	    // TODO: Update it properly when the buffer name changes
397 	    (void)GetFSSpecFromPath(curbuf->b_ffname, &curbuf->b_FSSpec);
398 #endif
399 #ifdef VMS
400 	    curbuf->b_fab_rfm = st.st_fab_rfm;
401 	    curbuf->b_fab_rat = st.st_fab_rat;
402 	    curbuf->b_fab_mrs = st.st_fab_mrs;
403 #endif
404 	}
405 	else
406 	{
407 	    curbuf->b_mtime = 0;
408 	    curbuf->b_mtime_read = 0;
409 	    curbuf->b_orig_size = 0;
410 	    curbuf->b_orig_mode = 0;
411 	}
412 
413 	// Reset the "new file" flag.  It will be set again below when the
414 	// file doesn't exist.
415 	curbuf->b_flags &= ~(BF_NEW | BF_NEW_W);
416     }
417 
418 /*
419  * for UNIX: check readonly with perm and mch_access()
420  * for Amiga: check readonly by trying to open the file for writing
421  */
422     file_readonly = FALSE;
423     if (read_stdin)
424     {
425 #if defined(MSWIN)
426 	// Force binary I/O on stdin to avoid CR-LF -> LF conversion.
427 	setmode(0, O_BINARY);
428 #endif
429     }
430     else if (!read_buffer)
431     {
432 #ifdef USE_MCH_ACCESS
433 	if (
434 # ifdef UNIX
435 	    !(perm & 0222) ||
436 # endif
437 				mch_access((char *)fname, W_OK))
438 	    file_readonly = TRUE;
439 	fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
440 #else
441 	if (!newfile
442 		|| readonlymode
443 		|| (fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0)
444 	{
445 	    file_readonly = TRUE;
446 	    // try to open ro
447 	    fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
448 	}
449 #endif
450     }
451 
452     if (fd < 0)			    // cannot open at all
453     {
454 #ifndef UNIX
455 	int	isdir_f;
456 #endif
457 	msg_scroll = msg_save;
458 #ifndef UNIX
459 	/*
460 	 * On Amiga we can't open a directory, check here.
461 	 */
462 	isdir_f = (mch_isdir(fname));
463 	perm = mch_getperm(fname);  // check if the file exists
464 	if (isdir_f)
465 	{
466 	    filemess(curbuf, sfname, (char_u *)_("is a directory"), 0);
467 	    curbuf->b_p_ro = TRUE;	// must use "w!" now
468 	}
469 	else
470 #endif
471 	    if (newfile)
472 	    {
473 		if (perm < 0
474 #ifdef ENOENT
475 			&& errno == ENOENT
476 #endif
477 		   )
478 		{
479 		    /*
480 		     * Set the 'new-file' flag, so that when the file has
481 		     * been created by someone else, a ":w" will complain.
482 		     */
483 		    curbuf->b_flags |= BF_NEW;
484 
485 		    // Create a swap file now, so that other Vims are warned
486 		    // that we are editing this file.  Don't do this for a
487 		    // "nofile" or "nowrite" buffer type.
488 #ifdef FEAT_QUICKFIX
489 		    if (!bt_dontwrite(curbuf))
490 #endif
491 		    {
492 			check_need_swap(newfile);
493 			// SwapExists autocommand may mess things up
494 			if (curbuf != old_curbuf
495 				|| (using_b_ffname
496 					&& (old_b_ffname != curbuf->b_ffname))
497 				|| (using_b_fname
498 					 && (old_b_fname != curbuf->b_fname)))
499 			{
500 			    emsg(_(e_auchangedbuf));
501 			    return FAIL;
502 			}
503 		    }
504 		    if (dir_of_file_exists(fname))
505 			filemess(curbuf, sfname, (char_u *)_("[New File]"), 0);
506 		    else
507 			filemess(curbuf, sfname,
508 					   (char_u *)_("[New DIRECTORY]"), 0);
509 #ifdef FEAT_VIMINFO
510 		    // Even though this is a new file, it might have been
511 		    // edited before and deleted.  Get the old marks.
512 		    check_marks_read();
513 #endif
514 		    // Set forced 'fileencoding'.
515 		    if (eap != NULL)
516 			set_forced_fenc(eap);
517 		    apply_autocmds_exarg(EVENT_BUFNEWFILE, sfname, sfname,
518 							  FALSE, curbuf, eap);
519 		    // remember the current fileformat
520 		    save_file_ff(curbuf);
521 
522 #if defined(FEAT_EVAL)
523 		    if (aborting())   // autocmds may abort script processing
524 			return FAIL;
525 #endif
526 		    return OK;	    // a new file is not an error
527 		}
528 		else
529 		{
530 		    filemess(curbuf, sfname, (char_u *)(
531 # ifdef EFBIG
532 			    (errno == EFBIG) ? _("[File too big]") :
533 # endif
534 # ifdef EOVERFLOW
535 			    (errno == EOVERFLOW) ? _("[File too big]") :
536 # endif
537 						_("[Permission Denied]")), 0);
538 		    curbuf->b_p_ro = TRUE;	// must use "w!" now
539 		}
540 	    }
541 
542 	return FAIL;
543     }
544 
545     /*
546      * Only set the 'ro' flag for readonly files the first time they are
547      * loaded.	Help files always get readonly mode
548      */
549     if ((check_readonly && file_readonly) || curbuf->b_help)
550 	curbuf->b_p_ro = TRUE;
551 
552     if (set_options)
553     {
554 	// Don't change 'eol' if reading from buffer as it will already be
555 	// correctly set when reading stdin.
556 	if (!read_buffer)
557 	{
558 	    curbuf->b_p_eol = TRUE;
559 	    curbuf->b_start_eol = TRUE;
560 	}
561 	curbuf->b_p_bomb = FALSE;
562 	curbuf->b_start_bomb = FALSE;
563     }
564 
565     // Create a swap file now, so that other Vims are warned that we are
566     // editing this file.
567     // Don't do this for a "nofile" or "nowrite" buffer type.
568 #ifdef FEAT_QUICKFIX
569     if (!bt_dontwrite(curbuf))
570 #endif
571     {
572 	check_need_swap(newfile);
573 	if (!read_stdin && (curbuf != old_curbuf
574 		|| (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
575 		|| (using_b_fname && (old_b_fname != curbuf->b_fname))))
576 	{
577 	    emsg(_(e_auchangedbuf));
578 	    if (!read_buffer)
579 		close(fd);
580 	    return FAIL;
581 	}
582 #ifdef UNIX
583 	// Set swap file protection bits after creating it.
584 	if (swap_mode > 0 && curbuf->b_ml.ml_mfp != NULL
585 			  && curbuf->b_ml.ml_mfp->mf_fname != NULL)
586 	{
587 	    char_u *swap_fname = curbuf->b_ml.ml_mfp->mf_fname;
588 
589 	    /*
590 	     * If the group-read bit is set but not the world-read bit, then
591 	     * the group must be equal to the group of the original file.  If
592 	     * we can't make that happen then reset the group-read bit.  This
593 	     * avoids making the swap file readable to more users when the
594 	     * primary group of the user is too permissive.
595 	     */
596 	    if ((swap_mode & 044) == 040)
597 	    {
598 		stat_T	swap_st;
599 
600 		if (mch_stat((char *)swap_fname, &swap_st) >= 0
601 			&& st.st_gid != swap_st.st_gid
602 # ifdef HAVE_FCHOWN
603 			&& fchown(curbuf->b_ml.ml_mfp->mf_fd, -1, st.st_gid)
604 									  == -1
605 # endif
606 		   )
607 		    swap_mode &= 0600;
608 	    }
609 
610 	    (void)mch_setperm(swap_fname, (long)swap_mode);
611 	}
612 #endif
613     }
614 
615     // If "Quit" selected at ATTENTION dialog, don't load the file
616     if (swap_exists_action == SEA_QUIT)
617     {
618 	if (!read_buffer && !read_stdin)
619 	    close(fd);
620 	return FAIL;
621     }
622 
623     ++no_wait_return;	    // don't wait for return yet
624 
625     /*
626      * Set '[ mark to the line above where the lines go (line 1 if zero).
627      */
628     orig_start = curbuf->b_op_start;
629     curbuf->b_op_start.lnum = ((from == 0) ? 1 : from);
630     curbuf->b_op_start.col = 0;
631 
632     try_mac = (vim_strchr(p_ffs, 'm') != NULL);
633     try_dos = (vim_strchr(p_ffs, 'd') != NULL);
634     try_unix = (vim_strchr(p_ffs, 'x') != NULL);
635 
636     if (!read_buffer)
637     {
638 	int	m = msg_scroll;
639 	int	n = msg_scrolled;
640 
641 	/*
642 	 * The file must be closed again, the autocommands may want to change
643 	 * the file before reading it.
644 	 */
645 	if (!read_stdin)
646 	    close(fd);		// ignore errors
647 
648 	/*
649 	 * The output from the autocommands should not overwrite anything and
650 	 * should not be overwritten: Set msg_scroll, restore its value if no
651 	 * output was done.
652 	 */
653 	msg_scroll = TRUE;
654 	if (filtering)
655 	    apply_autocmds_exarg(EVENT_FILTERREADPRE, NULL, sfname,
656 							  FALSE, curbuf, eap);
657 	else if (read_stdin)
658 	    apply_autocmds_exarg(EVENT_STDINREADPRE, NULL, sfname,
659 							  FALSE, curbuf, eap);
660 	else if (newfile)
661 	    apply_autocmds_exarg(EVENT_BUFREADPRE, NULL, sfname,
662 							  FALSE, curbuf, eap);
663 	else
664 	    apply_autocmds_exarg(EVENT_FILEREADPRE, sfname, sfname,
665 							    FALSE, NULL, eap);
666 	// autocommands may have changed it
667 	try_mac = (vim_strchr(p_ffs, 'm') != NULL);
668 	try_dos = (vim_strchr(p_ffs, 'd') != NULL);
669 	try_unix = (vim_strchr(p_ffs, 'x') != NULL);
670 	curbuf->b_op_start = orig_start;
671 
672 	if (msg_scrolled == n)
673 	    msg_scroll = m;
674 
675 #ifdef FEAT_EVAL
676 	if (aborting())	    // autocmds may abort script processing
677 	{
678 	    --no_wait_return;
679 	    msg_scroll = msg_save;
680 	    curbuf->b_p_ro = TRUE;	// must use "w!" now
681 	    return FAIL;
682 	}
683 #endif
684 	/*
685 	 * Don't allow the autocommands to change the current buffer.
686 	 * Try to re-open the file.
687 	 *
688 	 * Don't allow the autocommands to change the buffer name either
689 	 * (cd for example) if it invalidates fname or sfname.
690 	 */
691 	if (!read_stdin && (curbuf != old_curbuf
692 		|| (using_b_ffname && (old_b_ffname != curbuf->b_ffname))
693 		|| (using_b_fname && (old_b_fname != curbuf->b_fname))
694 		|| (fd = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0)) < 0))
695 	{
696 	    --no_wait_return;
697 	    msg_scroll = msg_save;
698 	    if (fd < 0)
699 		emsg(_("E200: *ReadPre autocommands made the file unreadable"));
700 	    else
701 		emsg(_("E201: *ReadPre autocommands must not change current buffer"));
702 	    curbuf->b_p_ro = TRUE;	// must use "w!" now
703 	    return FAIL;
704 	}
705     }
706 
707     // Autocommands may add lines to the file, need to check if it is empty
708     wasempty = (curbuf->b_ml.ml_flags & ML_EMPTY);
709 
710     if (!recoverymode && !filtering && !(flags & READ_DUMMY))
711     {
712 	/*
713 	 * Show the user that we are busy reading the input.  Sometimes this
714 	 * may take a while.  When reading from stdin another program may
715 	 * still be running, don't move the cursor to the last line, unless
716 	 * always using the GUI.
717 	 */
718 	if (read_stdin)
719 	{
720 	    if (!is_not_a_term())
721 	    {
722 #ifndef ALWAYS_USE_GUI
723 # ifdef VIMDLL
724 		if (!gui.in_use)
725 # endif
726 		    mch_msg(_("Vim: Reading from stdin...\n"));
727 #endif
728 #ifdef FEAT_GUI
729 		// Also write a message in the GUI window, if there is one.
730 		if (gui.in_use && !gui.dying && !gui.starting)
731 		{
732 		    p = (char_u *)_("Reading from stdin...");
733 		    gui_write(p, (int)STRLEN(p));
734 		}
735 #endif
736 	    }
737 	}
738 	else if (!read_buffer)
739 	    filemess(curbuf, sfname, (char_u *)"", 0);
740     }
741 
742     msg_scroll = FALSE;			// overwrite the file message
743 
744     /*
745      * Set linecnt now, before the "retry" caused by a wrong guess for
746      * fileformat, and after the autocommands, which may change them.
747      */
748     linecnt = curbuf->b_ml.ml_line_count;
749 
750     // "++bad=" argument.
751     if (eap != NULL && eap->bad_char != 0)
752     {
753 	bad_char_behavior = eap->bad_char;
754 	if (set_options)
755 	    curbuf->b_bad_char = eap->bad_char;
756     }
757     else
758 	curbuf->b_bad_char = 0;
759 
760     /*
761      * Decide which 'encoding' to use or use first.
762      */
763     if (eap != NULL && eap->force_enc != 0)
764     {
765 	fenc = enc_canonize(eap->cmd + eap->force_enc);
766 	fenc_alloced = TRUE;
767 	keep_dest_enc = TRUE;
768     }
769     else if (curbuf->b_p_bin)
770     {
771 	fenc = (char_u *)"";		// binary: don't convert
772 	fenc_alloced = FALSE;
773     }
774     else if (curbuf->b_help)
775     {
776 	char_u	    firstline[80];
777 	int	    fc;
778 
779 	// Help files are either utf-8 or latin1.  Try utf-8 first, if this
780 	// fails it must be latin1.
781 	// Always do this when 'encoding' is "utf-8".  Otherwise only do
782 	// this when needed to avoid [converted] remarks all the time.
783 	// It is needed when the first line contains non-ASCII characters.
784 	// That is only in *.??x files.
785 	fenc = (char_u *)"latin1";
786 	c = enc_utf8;
787 	if (!c && !read_stdin)
788 	{
789 	    fc = fname[STRLEN(fname) - 1];
790 	    if (TOLOWER_ASC(fc) == 'x')
791 	    {
792 		// Read the first line (and a bit more).  Immediately rewind to
793 		// the start of the file.  If the read() fails "len" is -1.
794 		len = read_eintr(fd, firstline, 80);
795 		vim_lseek(fd, (off_T)0L, SEEK_SET);
796 		for (p = firstline; p < firstline + len; ++p)
797 		    if (*p >= 0x80)
798 		    {
799 			c = TRUE;
800 			break;
801 		    }
802 	    }
803 	}
804 
805 	if (c)
806 	{
807 	    fenc_next = fenc;
808 	    fenc = (char_u *)"utf-8";
809 
810 	    // When the file is utf-8 but a character doesn't fit in
811 	    // 'encoding' don't retry.  In help text editing utf-8 bytes
812 	    // doesn't make sense.
813 	    if (!enc_utf8)
814 		keep_dest_enc = TRUE;
815 	}
816 	fenc_alloced = FALSE;
817     }
818     else if (*p_fencs == NUL)
819     {
820 	fenc = curbuf->b_p_fenc;	// use format from buffer
821 	fenc_alloced = FALSE;
822     }
823     else
824     {
825 	fenc_next = p_fencs;		// try items in 'fileencodings'
826 	fenc = next_fenc(&fenc_next, &fenc_alloced);
827     }
828 
829     /*
830      * Jump back here to retry reading the file in different ways.
831      * Reasons to retry:
832      * - encoding conversion failed: try another one from "fenc_next"
833      * - BOM detected and fenc was set, need to setup conversion
834      * - "fileformat" check failed: try another
835      *
836      * Variables set for special retry actions:
837      * "file_rewind"	Rewind the file to start reading it again.
838      * "advance_fenc"	Advance "fenc" using "fenc_next".
839      * "skip_read"	Re-use already read bytes (BOM detected).
840      * "did_iconv"	iconv() conversion failed, try 'charconvert'.
841      * "keep_fileformat" Don't reset "fileformat".
842      *
843      * Other status indicators:
844      * "tmpname"	When != NULL did conversion with 'charconvert'.
845      *			Output file has to be deleted afterwards.
846      * "iconv_fd"	When != -1 did conversion with iconv().
847      */
848 retry:
849 
850     if (file_rewind)
851     {
852 	if (read_buffer)
853 	{
854 	    read_buf_lnum = 1;
855 	    read_buf_col = 0;
856 	}
857 	else if (read_stdin || vim_lseek(fd, (off_T)0L, SEEK_SET) != 0)
858 	{
859 	    // Can't rewind the file, give up.
860 	    error = TRUE;
861 	    goto failed;
862 	}
863 	// Delete the previously read lines.
864 	while (lnum > from)
865 	    ml_delete(lnum--, FALSE);
866 	file_rewind = FALSE;
867 	if (set_options)
868 	{
869 	    curbuf->b_p_bomb = FALSE;
870 	    curbuf->b_start_bomb = FALSE;
871 	}
872 	conv_error = 0;
873     }
874 
875     /*
876      * When retrying with another "fenc" and the first time "fileformat"
877      * will be reset.
878      */
879     if (keep_fileformat)
880 	keep_fileformat = FALSE;
881     else
882     {
883 	if (eap != NULL && eap->force_ff != 0)
884 	{
885 	    fileformat = get_fileformat_force(curbuf, eap);
886 	    try_unix = try_dos = try_mac = FALSE;
887 	}
888 	else if (curbuf->b_p_bin)
889 	    fileformat = EOL_UNIX;		// binary: use Unix format
890 	else if (*p_ffs == NUL)
891 	    fileformat = get_fileformat(curbuf);// use format from buffer
892 	else
893 	    fileformat = EOL_UNKNOWN;		// detect from file
894     }
895 
896 #ifdef USE_ICONV
897     if (iconv_fd != (iconv_t)-1)
898     {
899 	// aborted conversion with iconv(), close the descriptor
900 	iconv_close(iconv_fd);
901 	iconv_fd = (iconv_t)-1;
902     }
903 #endif
904 
905     if (advance_fenc)
906     {
907 	/*
908 	 * Try the next entry in 'fileencodings'.
909 	 */
910 	advance_fenc = FALSE;
911 
912 	if (eap != NULL && eap->force_enc != 0)
913 	{
914 	    // Conversion given with "++cc=" wasn't possible, read
915 	    // without conversion.
916 	    notconverted = TRUE;
917 	    conv_error = 0;
918 	    if (fenc_alloced)
919 		vim_free(fenc);
920 	    fenc = (char_u *)"";
921 	    fenc_alloced = FALSE;
922 	}
923 	else
924 	{
925 	    if (fenc_alloced)
926 		vim_free(fenc);
927 	    if (fenc_next != NULL)
928 	    {
929 		fenc = next_fenc(&fenc_next, &fenc_alloced);
930 	    }
931 	    else
932 	    {
933 		fenc = (char_u *)"";
934 		fenc_alloced = FALSE;
935 	    }
936 	}
937 	if (tmpname != NULL)
938 	{
939 	    mch_remove(tmpname);		// delete converted file
940 	    VIM_CLEAR(tmpname);
941 	}
942     }
943 
944     /*
945      * Conversion may be required when the encoding of the file is different
946      * from 'encoding' or 'encoding' is UTF-16, UCS-2 or UCS-4.
947      */
948     fio_flags = 0;
949     converted = need_conversion(fenc);
950     if (converted)
951     {
952 
953 	// "ucs-bom" means we need to check the first bytes of the file
954 	// for a BOM.
955 	if (STRCMP(fenc, ENC_UCSBOM) == 0)
956 	    fio_flags = FIO_UCSBOM;
957 
958 	/*
959 	 * Check if UCS-2/4 or Latin1 to UTF-8 conversion needs to be
960 	 * done.  This is handled below after read().  Prepare the
961 	 * fio_flags to avoid having to parse the string each time.
962 	 * Also check for Unicode to Latin1 conversion, because iconv()
963 	 * appears not to handle this correctly.  This works just like
964 	 * conversion to UTF-8 except how the resulting character is put in
965 	 * the buffer.
966 	 */
967 	else if (enc_utf8 || STRCMP(p_enc, "latin1") == 0)
968 	    fio_flags = get_fio_flags(fenc);
969 
970 #ifdef MSWIN
971 	/*
972 	 * Conversion from an MS-Windows codepage to UTF-8 or another codepage
973 	 * is handled with MultiByteToWideChar().
974 	 */
975 	if (fio_flags == 0)
976 	    fio_flags = get_win_fio_flags(fenc);
977 #endif
978 
979 #ifdef MACOS_CONVERT
980 	// Conversion from Apple MacRoman to latin1 or UTF-8
981 	if (fio_flags == 0)
982 	    fio_flags = get_mac_fio_flags(fenc);
983 #endif
984 
985 #ifdef USE_ICONV
986 	/*
987 	 * Try using iconv() if we can't convert internally.
988 	 */
989 	if (fio_flags == 0
990 # ifdef FEAT_EVAL
991 		&& !did_iconv
992 # endif
993 		)
994 	    iconv_fd = (iconv_t)my_iconv_open(
995 				  enc_utf8 ? (char_u *)"utf-8" : p_enc, fenc);
996 #endif
997 
998 #ifdef FEAT_EVAL
999 	/*
1000 	 * Use the 'charconvert' expression when conversion is required
1001 	 * and we can't do it internally or with iconv().
1002 	 */
1003 	if (fio_flags == 0 && !read_stdin && !read_buffer && *p_ccv != NUL
1004 						    && !read_fifo
1005 # ifdef USE_ICONV
1006 						    && iconv_fd == (iconv_t)-1
1007 # endif
1008 		)
1009 	{
1010 # ifdef USE_ICONV
1011 	    did_iconv = FALSE;
1012 # endif
1013 	    // Skip conversion when it's already done (retry for wrong
1014 	    // "fileformat").
1015 	    if (tmpname == NULL)
1016 	    {
1017 		tmpname = readfile_charconvert(fname, fenc, &fd);
1018 		if (tmpname == NULL)
1019 		{
1020 		    // Conversion failed.  Try another one.
1021 		    advance_fenc = TRUE;
1022 		    if (fd < 0)
1023 		    {
1024 			// Re-opening the original file failed!
1025 			emsg(_("E202: Conversion made file unreadable!"));
1026 			error = TRUE;
1027 			goto failed;
1028 		    }
1029 		    goto retry;
1030 		}
1031 	    }
1032 	}
1033 	else
1034 #endif
1035 	{
1036 	    if (fio_flags == 0
1037 #ifdef USE_ICONV
1038 		    && iconv_fd == (iconv_t)-1
1039 #endif
1040 	       )
1041 	    {
1042 		// Conversion wanted but we can't.
1043 		// Try the next conversion in 'fileencodings'
1044 		advance_fenc = TRUE;
1045 		goto retry;
1046 	    }
1047 	}
1048     }
1049 
1050     // Set "can_retry" when it's possible to rewind the file and try with
1051     // another "fenc" value.  It's FALSE when no other "fenc" to try, reading
1052     // stdin or fixed at a specific encoding.
1053     can_retry = (*fenc != NUL && !read_stdin && !read_fifo && !keep_dest_enc);
1054 
1055     if (!skip_read)
1056     {
1057 	linerest = 0;
1058 	filesize = 0;
1059 	skip_count = lines_to_skip;
1060 	read_count = lines_to_read;
1061 	conv_restlen = 0;
1062 #ifdef FEAT_PERSISTENT_UNDO
1063 	read_undo_file = (newfile && (flags & READ_KEEP_UNDO) == 0
1064 				  && curbuf->b_ffname != NULL
1065 				  && curbuf->b_p_udf
1066 				  && !filtering
1067 				  && !read_fifo
1068 				  && !read_stdin
1069 				  && !read_buffer);
1070 	if (read_undo_file)
1071 	    sha256_start(&sha_ctx);
1072 #endif
1073 #ifdef FEAT_CRYPT
1074 	if (curbuf->b_cryptstate != NULL)
1075 	{
1076 	    // Need to free the state, but keep the key, don't want to ask for
1077 	    // it again.
1078 	    crypt_free_state(curbuf->b_cryptstate);
1079 	    curbuf->b_cryptstate = NULL;
1080 	}
1081 #endif
1082     }
1083 
1084     while (!error && !got_int)
1085     {
1086 	/*
1087 	 * We allocate as much space for the file as we can get, plus
1088 	 * space for the old line plus room for one terminating NUL.
1089 	 * The amount is limited by the fact that read() only can read
1090 	 * up to max_unsigned characters (and other things).
1091 	 */
1092 	if (!skip_read)
1093 	{
1094 #if defined(SSIZE_MAX) && (SSIZE_MAX < 0x10000L)
1095 		size = SSIZE_MAX;		    // use max I/O size, 52K
1096 #else
1097 		// Use buffer >= 64K.  Add linerest to double the size if the
1098 		// line gets very long, to avoid a lot of copying. But don't
1099 		// read more than 1 Mbyte at a time, so we can be interrupted.
1100 		size = 0x10000L + linerest;
1101 		if (size > 0x100000L)
1102 		    size = 0x100000L;
1103 #endif
1104 	}
1105 
1106 	// Protect against the argument of lalloc() going negative.
1107 	if (size < 0 || size + linerest + 1 < 0 || linerest >= MAXCOL)
1108 	{
1109 	    ++split;
1110 	    *ptr = NL;		    // split line by inserting a NL
1111 	    size = 1;
1112 	}
1113 	else
1114 	{
1115 	    if (!skip_read)
1116 	    {
1117 		for ( ; size >= 10; size = (long)((long_u)size >> 1))
1118 		{
1119 		    if ((new_buffer = lalloc(size + linerest + 1,
1120 							      FALSE)) != NULL)
1121 			break;
1122 		}
1123 		if (new_buffer == NULL)
1124 		{
1125 		    do_outofmem_msg((long_u)(size * 2 + linerest + 1));
1126 		    error = TRUE;
1127 		    break;
1128 		}
1129 		if (linerest)	// copy characters from the previous buffer
1130 		    mch_memmove(new_buffer, ptr - linerest, (size_t)linerest);
1131 		vim_free(buffer);
1132 		buffer = new_buffer;
1133 		ptr = buffer + linerest;
1134 		line_start = buffer;
1135 
1136 		// May need room to translate into.
1137 		// For iconv() we don't really know the required space, use a
1138 		// factor ICONV_MULT.
1139 		// latin1 to utf-8: 1 byte becomes up to 2 bytes
1140 		// utf-16 to utf-8: 2 bytes become up to 3 bytes, 4 bytes
1141 		// become up to 4 bytes, size must be multiple of 2
1142 		// ucs-2 to utf-8: 2 bytes become up to 3 bytes, size must be
1143 		// multiple of 2
1144 		// ucs-4 to utf-8: 4 bytes become up to 6 bytes, size must be
1145 		// multiple of 4
1146 		real_size = (int)size;
1147 #ifdef USE_ICONV
1148 		if (iconv_fd != (iconv_t)-1)
1149 		    size = size / ICONV_MULT;
1150 		else
1151 #endif
1152 		    if (fio_flags & FIO_LATIN1)
1153 		    size = size / 2;
1154 		else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1155 		    size = (size * 2 / 3) & ~1;
1156 		else if (fio_flags & FIO_UCS4)
1157 		    size = (size * 2 / 3) & ~3;
1158 		else if (fio_flags == FIO_UCSBOM)
1159 		    size = size / ICONV_MULT;	// worst case
1160 #ifdef MSWIN
1161 		else if (fio_flags & FIO_CODEPAGE)
1162 		    size = size / ICONV_MULT;	// also worst case
1163 #endif
1164 #ifdef MACOS_CONVERT
1165 		else if (fio_flags & FIO_MACROMAN)
1166 		    size = size / ICONV_MULT;	// also worst case
1167 #endif
1168 
1169 		if (conv_restlen > 0)
1170 		{
1171 		    // Insert unconverted bytes from previous line.
1172 		    mch_memmove(ptr, conv_rest, conv_restlen);
1173 		    ptr += conv_restlen;
1174 		    size -= conv_restlen;
1175 		}
1176 
1177 		if (read_buffer)
1178 		{
1179 		    /*
1180 		     * Read bytes from curbuf.  Used for converting text read
1181 		     * from stdin.
1182 		     */
1183 		    if (read_buf_lnum > from)
1184 			size = 0;
1185 		    else
1186 		    {
1187 			int	n, ni;
1188 			long	tlen;
1189 
1190 			tlen = 0;
1191 			for (;;)
1192 			{
1193 			    p = ml_get(read_buf_lnum) + read_buf_col;
1194 			    n = (int)STRLEN(p);
1195 			    if ((int)tlen + n + 1 > size)
1196 			    {
1197 				// Filled up to "size", append partial line.
1198 				// Change NL to NUL to reverse the effect done
1199 				// below.
1200 				n = (int)(size - tlen);
1201 				for (ni = 0; ni < n; ++ni)
1202 				{
1203 				    if (p[ni] == NL)
1204 					ptr[tlen++] = NUL;
1205 				    else
1206 					ptr[tlen++] = p[ni];
1207 				}
1208 				read_buf_col += n;
1209 				break;
1210 			    }
1211 			    else
1212 			    {
1213 				// Append whole line and new-line.  Change NL
1214 				// to NUL to reverse the effect done below.
1215 				for (ni = 0; ni < n; ++ni)
1216 				{
1217 				    if (p[ni] == NL)
1218 					ptr[tlen++] = NUL;
1219 				    else
1220 					ptr[tlen++] = p[ni];
1221 				}
1222 				ptr[tlen++] = NL;
1223 				read_buf_col = 0;
1224 				if (++read_buf_lnum > from)
1225 				{
1226 				    // When the last line didn't have an
1227 				    // end-of-line don't add it now either.
1228 				    if (!curbuf->b_p_eol)
1229 					--tlen;
1230 				    size = tlen;
1231 				    break;
1232 				}
1233 			    }
1234 			}
1235 		    }
1236 		}
1237 		else
1238 		{
1239 		    /*
1240 		     * Read bytes from the file.
1241 		     */
1242 		    size = read_eintr(fd, ptr, size);
1243 		}
1244 
1245 #ifdef FEAT_CRYPT
1246 		/*
1247 		 * At start of file: Check for magic number of encryption.
1248 		 */
1249 		if (filesize == 0 && size > 0)
1250 		    cryptkey = check_for_cryptkey(cryptkey, ptr, &size,
1251 						  &filesize, newfile, sfname,
1252 						  &did_ask_for_key);
1253 		/*
1254 		 * Decrypt the read bytes.  This is done before checking for
1255 		 * EOF because the crypt layer may be buffering.
1256 		 */
1257 		if (cryptkey != NULL && curbuf->b_cryptstate != NULL
1258 								   && size > 0)
1259 		{
1260 # ifdef CRYPT_NOT_INPLACE
1261 		    if (crypt_works_inplace(curbuf->b_cryptstate))
1262 		    {
1263 # endif
1264 			crypt_decode_inplace(curbuf->b_cryptstate, ptr, size);
1265 # ifdef CRYPT_NOT_INPLACE
1266 		    }
1267 		    else
1268 		    {
1269 			char_u	*newptr = NULL;
1270 			int	decrypted_size;
1271 
1272 			decrypted_size = crypt_decode_alloc(
1273 				    curbuf->b_cryptstate, ptr, size, &newptr);
1274 
1275 			// If the crypt layer is buffering, not producing
1276 			// anything yet, need to read more.
1277 			if (decrypted_size == 0)
1278 			    continue;
1279 
1280 			if (linerest == 0)
1281 			{
1282 			    // Simple case: reuse returned buffer (may be
1283 			    // NULL, checked later).
1284 			    new_buffer = newptr;
1285 			}
1286 			else
1287 			{
1288 			    long_u	new_size;
1289 
1290 			    // Need new buffer to add bytes carried over.
1291 			    new_size = (long_u)(decrypted_size + linerest + 1);
1292 			    new_buffer = lalloc(new_size, FALSE);
1293 			    if (new_buffer == NULL)
1294 			    {
1295 				do_outofmem_msg(new_size);
1296 				error = TRUE;
1297 				break;
1298 			    }
1299 
1300 			    mch_memmove(new_buffer, buffer, linerest);
1301 			    if (newptr != NULL)
1302 				mch_memmove(new_buffer + linerest, newptr,
1303 							      decrypted_size);
1304 			}
1305 
1306 			if (new_buffer != NULL)
1307 			{
1308 			    vim_free(buffer);
1309 			    buffer = new_buffer;
1310 			    new_buffer = NULL;
1311 			    line_start = buffer;
1312 			    ptr = buffer + linerest;
1313 			}
1314 			size = decrypted_size;
1315 		    }
1316 # endif
1317 		}
1318 #endif
1319 
1320 		if (size <= 0)
1321 		{
1322 		    if (size < 0)		    // read error
1323 			error = TRUE;
1324 		    else if (conv_restlen > 0)
1325 		    {
1326 			/*
1327 			 * Reached end-of-file but some trailing bytes could
1328 			 * not be converted.  Truncated file?
1329 			 */
1330 
1331 			// When we did a conversion report an error.
1332 			if (fio_flags != 0
1333 #ifdef USE_ICONV
1334 				|| iconv_fd != (iconv_t)-1
1335 #endif
1336 			   )
1337 			{
1338 			    if (can_retry)
1339 				goto rewind_retry;
1340 			    if (conv_error == 0)
1341 				conv_error = curbuf->b_ml.ml_line_count
1342 								- linecnt + 1;
1343 			}
1344 			// Remember the first linenr with an illegal byte
1345 			else if (illegal_byte == 0)
1346 			    illegal_byte = curbuf->b_ml.ml_line_count
1347 								- linecnt + 1;
1348 			if (bad_char_behavior == BAD_DROP)
1349 			{
1350 			    *(ptr - conv_restlen) = NUL;
1351 			    conv_restlen = 0;
1352 			}
1353 			else
1354 			{
1355 			    // Replace the trailing bytes with the replacement
1356 			    // character if we were converting; if we weren't,
1357 			    // leave the UTF8 checking code to do it, as it
1358 			    // works slightly differently.
1359 			    if (bad_char_behavior != BAD_KEEP && (fio_flags != 0
1360 #ifdef USE_ICONV
1361 				    || iconv_fd != (iconv_t)-1
1362 #endif
1363 			       ))
1364 			    {
1365 				while (conv_restlen > 0)
1366 				{
1367 				    *(--ptr) = bad_char_behavior;
1368 				    --conv_restlen;
1369 				}
1370 			    }
1371 			    fio_flags = 0;	// don't convert this
1372 #ifdef USE_ICONV
1373 			    if (iconv_fd != (iconv_t)-1)
1374 			    {
1375 				iconv_close(iconv_fd);
1376 				iconv_fd = (iconv_t)-1;
1377 			    }
1378 #endif
1379 			}
1380 		    }
1381 		}
1382 	    }
1383 	    skip_read = FALSE;
1384 
1385 	    /*
1386 	     * At start of file (or after crypt magic number): Check for BOM.
1387 	     * Also check for a BOM for other Unicode encodings, but not after
1388 	     * converting with 'charconvert' or when a BOM has already been
1389 	     * found.
1390 	     */
1391 	    if ((filesize == 0
1392 #ifdef FEAT_CRYPT
1393 		   || (cryptkey != NULL
1394 			&& filesize == crypt_get_header_len(
1395 						 crypt_get_method_nr(curbuf)))
1396 #endif
1397 		       )
1398 		    && (fio_flags == FIO_UCSBOM
1399 			|| (!curbuf->b_p_bomb
1400 			    && tmpname == NULL
1401 			    && (*fenc == 'u' || (*fenc == NUL && enc_utf8)))))
1402 	    {
1403 		char_u	*ccname;
1404 		int	blen;
1405 
1406 		// no BOM detection in a short file or in binary mode
1407 		if (size < 2 || curbuf->b_p_bin)
1408 		    ccname = NULL;
1409 		else
1410 		    ccname = check_for_bom(ptr, size, &blen,
1411 		      fio_flags == FIO_UCSBOM ? FIO_ALL : get_fio_flags(fenc));
1412 		if (ccname != NULL)
1413 		{
1414 		    // Remove BOM from the text
1415 		    filesize += blen;
1416 		    size -= blen;
1417 		    mch_memmove(ptr, ptr + blen, (size_t)size);
1418 		    if (set_options)
1419 		    {
1420 			curbuf->b_p_bomb = TRUE;
1421 			curbuf->b_start_bomb = TRUE;
1422 		    }
1423 		}
1424 
1425 		if (fio_flags == FIO_UCSBOM)
1426 		{
1427 		    if (ccname == NULL)
1428 		    {
1429 			// No BOM detected: retry with next encoding.
1430 			advance_fenc = TRUE;
1431 		    }
1432 		    else
1433 		    {
1434 			// BOM detected: set "fenc" and jump back
1435 			if (fenc_alloced)
1436 			    vim_free(fenc);
1437 			fenc = ccname;
1438 			fenc_alloced = FALSE;
1439 		    }
1440 		    // retry reading without getting new bytes or rewinding
1441 		    skip_read = TRUE;
1442 		    goto retry;
1443 		}
1444 	    }
1445 
1446 	    // Include not converted bytes.
1447 	    ptr -= conv_restlen;
1448 	    size += conv_restlen;
1449 	    conv_restlen = 0;
1450 	    /*
1451 	     * Break here for a read error or end-of-file.
1452 	     */
1453 	    if (size <= 0)
1454 		break;
1455 
1456 
1457 #ifdef USE_ICONV
1458 	    if (iconv_fd != (iconv_t)-1)
1459 	    {
1460 		/*
1461 		 * Attempt conversion of the read bytes to 'encoding' using
1462 		 * iconv().
1463 		 */
1464 		const char	*fromp;
1465 		char		*top;
1466 		size_t		from_size;
1467 		size_t		to_size;
1468 
1469 		fromp = (char *)ptr;
1470 		from_size = size;
1471 		ptr += size;
1472 		top = (char *)ptr;
1473 		to_size = real_size - size;
1474 
1475 		/*
1476 		 * If there is conversion error or not enough room try using
1477 		 * another conversion.  Except for when there is no
1478 		 * alternative (help files).
1479 		 */
1480 		while ((iconv(iconv_fd, (void *)&fromp, &from_size,
1481 							       &top, &to_size)
1482 			    == (size_t)-1 && ICONV_ERRNO != ICONV_EINVAL)
1483 						  || from_size > CONV_RESTLEN)
1484 		{
1485 		    if (can_retry)
1486 			goto rewind_retry;
1487 		    if (conv_error == 0)
1488 			conv_error = readfile_linenr(linecnt,
1489 							  ptr, (char_u *)top);
1490 
1491 		    // Deal with a bad byte and continue with the next.
1492 		    ++fromp;
1493 		    --from_size;
1494 		    if (bad_char_behavior == BAD_KEEP)
1495 		    {
1496 			*top++ = *(fromp - 1);
1497 			--to_size;
1498 		    }
1499 		    else if (bad_char_behavior != BAD_DROP)
1500 		    {
1501 			*top++ = bad_char_behavior;
1502 			--to_size;
1503 		    }
1504 		}
1505 
1506 		if (from_size > 0)
1507 		{
1508 		    // Some remaining characters, keep them for the next
1509 		    // round.
1510 		    mch_memmove(conv_rest, (char_u *)fromp, from_size);
1511 		    conv_restlen = (int)from_size;
1512 		}
1513 
1514 		// move the linerest to before the converted characters
1515 		line_start = ptr - linerest;
1516 		mch_memmove(line_start, buffer, (size_t)linerest);
1517 		size = (long)((char_u *)top - ptr);
1518 	    }
1519 #endif
1520 
1521 #ifdef MSWIN
1522 	    if (fio_flags & FIO_CODEPAGE)
1523 	    {
1524 		char_u	*src, *dst;
1525 		WCHAR	ucs2buf[3];
1526 		int	ucs2len;
1527 		int	codepage = FIO_GET_CP(fio_flags);
1528 		int	bytelen;
1529 		int	found_bad;
1530 		char	replstr[2];
1531 
1532 		/*
1533 		 * Conversion from an MS-Windows codepage or UTF-8 to UTF-8 or
1534 		 * a codepage, using standard MS-Windows functions.  This
1535 		 * requires two steps:
1536 		 * 1. convert from 'fileencoding' to ucs-2
1537 		 * 2. convert from ucs-2 to 'encoding'
1538 		 *
1539 		 * Because there may be illegal bytes AND an incomplete byte
1540 		 * sequence at the end, we may have to do the conversion one
1541 		 * character at a time to get it right.
1542 		 */
1543 
1544 		// Replacement string for WideCharToMultiByte().
1545 		if (bad_char_behavior > 0)
1546 		    replstr[0] = bad_char_behavior;
1547 		else
1548 		    replstr[0] = '?';
1549 		replstr[1] = NUL;
1550 
1551 		/*
1552 		 * Move the bytes to the end of the buffer, so that we have
1553 		 * room to put the result at the start.
1554 		 */
1555 		src = ptr + real_size - size;
1556 		mch_memmove(src, ptr, size);
1557 
1558 		/*
1559 		 * Do the conversion.
1560 		 */
1561 		dst = ptr;
1562 		size = size;
1563 		while (size > 0)
1564 		{
1565 		    found_bad = FALSE;
1566 
1567 #  ifdef CP_UTF8	// VC 4.1 doesn't define CP_UTF8
1568 		    if (codepage == CP_UTF8)
1569 		    {
1570 			// Handle CP_UTF8 input ourselves to be able to handle
1571 			// trailing bytes properly.
1572 			// Get one UTF-8 character from src.
1573 			bytelen = (int)utf_ptr2len_len(src, size);
1574 			if (bytelen > size)
1575 			{
1576 			    // Only got some bytes of a character.  Normally
1577 			    // it's put in "conv_rest", but if it's too long
1578 			    // deal with it as if they were illegal bytes.
1579 			    if (bytelen <= CONV_RESTLEN)
1580 				break;
1581 
1582 			    // weird overlong byte sequence
1583 			    bytelen = size;
1584 			    found_bad = TRUE;
1585 			}
1586 			else
1587 			{
1588 			    int	    u8c = utf_ptr2char(src);
1589 
1590 			    if (u8c > 0xffff || (*src >= 0x80 && bytelen == 1))
1591 				found_bad = TRUE;
1592 			    ucs2buf[0] = u8c;
1593 			    ucs2len = 1;
1594 			}
1595 		    }
1596 		    else
1597 #  endif
1598 		    {
1599 			// We don't know how long the byte sequence is, try
1600 			// from one to three bytes.
1601 			for (bytelen = 1; bytelen <= size && bytelen <= 3;
1602 								    ++bytelen)
1603 			{
1604 			    ucs2len = MultiByteToWideChar(codepage,
1605 							 MB_ERR_INVALID_CHARS,
1606 							 (LPCSTR)src, bytelen,
1607 								   ucs2buf, 3);
1608 			    if (ucs2len > 0)
1609 				break;
1610 			}
1611 			if (ucs2len == 0)
1612 			{
1613 			    // If we have only one byte then it's probably an
1614 			    // incomplete byte sequence.  Otherwise discard
1615 			    // one byte as a bad character.
1616 			    if (size == 1)
1617 				break;
1618 			    found_bad = TRUE;
1619 			    bytelen = 1;
1620 			}
1621 		    }
1622 
1623 		    if (!found_bad)
1624 		    {
1625 			int	i;
1626 
1627 			// Convert "ucs2buf[ucs2len]" to 'enc' in "dst".
1628 			if (enc_utf8)
1629 			{
1630 			    // From UCS-2 to UTF-8.  Cannot fail.
1631 			    for (i = 0; i < ucs2len; ++i)
1632 				dst += utf_char2bytes(ucs2buf[i], dst);
1633 			}
1634 			else
1635 			{
1636 			    BOOL	bad = FALSE;
1637 			    int		dstlen;
1638 
1639 			    // From UCS-2 to "enc_codepage".  If the
1640 			    // conversion uses the default character "?",
1641 			    // the data doesn't fit in this encoding.
1642 			    dstlen = WideCharToMultiByte(enc_codepage, 0,
1643 				    (LPCWSTR)ucs2buf, ucs2len,
1644 				    (LPSTR)dst, (int)(src - dst),
1645 				    replstr, &bad);
1646 			    if (bad)
1647 				found_bad = TRUE;
1648 			    else
1649 				dst += dstlen;
1650 			}
1651 		    }
1652 
1653 		    if (found_bad)
1654 		    {
1655 			// Deal with bytes we can't convert.
1656 			if (can_retry)
1657 			    goto rewind_retry;
1658 			if (conv_error == 0)
1659 			    conv_error = readfile_linenr(linecnt, ptr, dst);
1660 			if (bad_char_behavior != BAD_DROP)
1661 			{
1662 			    if (bad_char_behavior == BAD_KEEP)
1663 			    {
1664 				mch_memmove(dst, src, bytelen);
1665 				dst += bytelen;
1666 			    }
1667 			    else
1668 				*dst++ = bad_char_behavior;
1669 			}
1670 		    }
1671 
1672 		    src += bytelen;
1673 		    size -= bytelen;
1674 		}
1675 
1676 		if (size > 0)
1677 		{
1678 		    // An incomplete byte sequence remaining.
1679 		    mch_memmove(conv_rest, src, size);
1680 		    conv_restlen = size;
1681 		}
1682 
1683 		// The new size is equal to how much "dst" was advanced.
1684 		size = (long)(dst - ptr);
1685 	    }
1686 	    else
1687 #endif
1688 #ifdef MACOS_CONVERT
1689 	    if (fio_flags & FIO_MACROMAN)
1690 	    {
1691 		/*
1692 		 * Conversion from Apple MacRoman char encoding to UTF-8 or
1693 		 * latin1.  This is in os_mac_conv.c.
1694 		 */
1695 		if (macroman2enc(ptr, &size, real_size) == FAIL)
1696 		    goto rewind_retry;
1697 	    }
1698 	    else
1699 #endif
1700 	    if (fio_flags != 0)
1701 	    {
1702 		int	u8c;
1703 		char_u	*dest;
1704 		char_u	*tail = NULL;
1705 
1706 		/*
1707 		 * "enc_utf8" set: Convert Unicode or Latin1 to UTF-8.
1708 		 * "enc_utf8" not set: Convert Unicode to Latin1.
1709 		 * Go from end to start through the buffer, because the number
1710 		 * of bytes may increase.
1711 		 * "dest" points to after where the UTF-8 bytes go, "p" points
1712 		 * to after the next character to convert.
1713 		 */
1714 		dest = ptr + real_size;
1715 		if (fio_flags == FIO_LATIN1 || fio_flags == FIO_UTF8)
1716 		{
1717 		    p = ptr + size;
1718 		    if (fio_flags == FIO_UTF8)
1719 		    {
1720 			// Check for a trailing incomplete UTF-8 sequence
1721 			tail = ptr + size - 1;
1722 			while (tail > ptr && (*tail & 0xc0) == 0x80)
1723 			    --tail;
1724 			if (tail + utf_byte2len(*tail) <= ptr + size)
1725 			    tail = NULL;
1726 			else
1727 			    p = tail;
1728 		    }
1729 		}
1730 		else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1731 		{
1732 		    // Check for a trailing byte
1733 		    p = ptr + (size & ~1);
1734 		    if (size & 1)
1735 			tail = p;
1736 		    if ((fio_flags & FIO_UTF16) && p > ptr)
1737 		    {
1738 			// Check for a trailing leading word
1739 			if (fio_flags & FIO_ENDIAN_L)
1740 			{
1741 			    u8c = (*--p << 8);
1742 			    u8c += *--p;
1743 			}
1744 			else
1745 			{
1746 			    u8c = *--p;
1747 			    u8c += (*--p << 8);
1748 			}
1749 			if (u8c >= 0xd800 && u8c <= 0xdbff)
1750 			    tail = p;
1751 			else
1752 			    p += 2;
1753 		    }
1754 		}
1755 		else //  FIO_UCS4
1756 		{
1757 		    // Check for trailing 1, 2 or 3 bytes
1758 		    p = ptr + (size & ~3);
1759 		    if (size & 3)
1760 			tail = p;
1761 		}
1762 
1763 		// If there is a trailing incomplete sequence move it to
1764 		// conv_rest[].
1765 		if (tail != NULL)
1766 		{
1767 		    conv_restlen = (int)((ptr + size) - tail);
1768 		    mch_memmove(conv_rest, (char_u *)tail, conv_restlen);
1769 		    size -= conv_restlen;
1770 		}
1771 
1772 
1773 		while (p > ptr)
1774 		{
1775 		    if (fio_flags & FIO_LATIN1)
1776 			u8c = *--p;
1777 		    else if (fio_flags & (FIO_UCS2 | FIO_UTF16))
1778 		    {
1779 			if (fio_flags & FIO_ENDIAN_L)
1780 			{
1781 			    u8c = (*--p << 8);
1782 			    u8c += *--p;
1783 			}
1784 			else
1785 			{
1786 			    u8c = *--p;
1787 			    u8c += (*--p << 8);
1788 			}
1789 			if ((fio_flags & FIO_UTF16)
1790 					    && u8c >= 0xdc00 && u8c <= 0xdfff)
1791 			{
1792 			    int u16c;
1793 
1794 			    if (p == ptr)
1795 			    {
1796 				// Missing leading word.
1797 				if (can_retry)
1798 				    goto rewind_retry;
1799 				if (conv_error == 0)
1800 				    conv_error = readfile_linenr(linecnt,
1801 								      ptr, p);
1802 				if (bad_char_behavior == BAD_DROP)
1803 				    continue;
1804 				if (bad_char_behavior != BAD_KEEP)
1805 				    u8c = bad_char_behavior;
1806 			    }
1807 
1808 			    // found second word of double-word, get the first
1809 			    // word and compute the resulting character
1810 			    if (fio_flags & FIO_ENDIAN_L)
1811 			    {
1812 				u16c = (*--p << 8);
1813 				u16c += *--p;
1814 			    }
1815 			    else
1816 			    {
1817 				u16c = *--p;
1818 				u16c += (*--p << 8);
1819 			    }
1820 			    u8c = 0x10000 + ((u16c & 0x3ff) << 10)
1821 							      + (u8c & 0x3ff);
1822 
1823 			    // Check if the word is indeed a leading word.
1824 			    if (u16c < 0xd800 || u16c > 0xdbff)
1825 			    {
1826 				if (can_retry)
1827 				    goto rewind_retry;
1828 				if (conv_error == 0)
1829 				    conv_error = readfile_linenr(linecnt,
1830 								      ptr, p);
1831 				if (bad_char_behavior == BAD_DROP)
1832 				    continue;
1833 				if (bad_char_behavior != BAD_KEEP)
1834 				    u8c = bad_char_behavior;
1835 			    }
1836 			}
1837 		    }
1838 		    else if (fio_flags & FIO_UCS4)
1839 		    {
1840 			if (fio_flags & FIO_ENDIAN_L)
1841 			{
1842 			    u8c = (unsigned)*--p << 24;
1843 			    u8c += (unsigned)*--p << 16;
1844 			    u8c += (unsigned)*--p << 8;
1845 			    u8c += *--p;
1846 			}
1847 			else	// big endian
1848 			{
1849 			    u8c = *--p;
1850 			    u8c += (unsigned)*--p << 8;
1851 			    u8c += (unsigned)*--p << 16;
1852 			    u8c += (unsigned)*--p << 24;
1853 			}
1854 		    }
1855 		    else    // UTF-8
1856 		    {
1857 			if (*--p < 0x80)
1858 			    u8c = *p;
1859 			else
1860 			{
1861 			    len = utf_head_off(ptr, p);
1862 			    p -= len;
1863 			    u8c = utf_ptr2char(p);
1864 			    if (len == 0)
1865 			    {
1866 				// Not a valid UTF-8 character, retry with
1867 				// another fenc when possible, otherwise just
1868 				// report the error.
1869 				if (can_retry)
1870 				    goto rewind_retry;
1871 				if (conv_error == 0)
1872 				    conv_error = readfile_linenr(linecnt,
1873 								      ptr, p);
1874 				if (bad_char_behavior == BAD_DROP)
1875 				    continue;
1876 				if (bad_char_behavior != BAD_KEEP)
1877 				    u8c = bad_char_behavior;
1878 			    }
1879 			}
1880 		    }
1881 		    if (enc_utf8)	// produce UTF-8
1882 		    {
1883 			dest -= utf_char2len(u8c);
1884 			(void)utf_char2bytes(u8c, dest);
1885 		    }
1886 		    else		// produce Latin1
1887 		    {
1888 			--dest;
1889 			if (u8c >= 0x100)
1890 			{
1891 			    // character doesn't fit in latin1, retry with
1892 			    // another fenc when possible, otherwise just
1893 			    // report the error.
1894 			    if (can_retry)
1895 				goto rewind_retry;
1896 			    if (conv_error == 0)
1897 				conv_error = readfile_linenr(linecnt, ptr, p);
1898 			    if (bad_char_behavior == BAD_DROP)
1899 				++dest;
1900 			    else if (bad_char_behavior == BAD_KEEP)
1901 				*dest = u8c;
1902 			    else if (eap != NULL && eap->bad_char != 0)
1903 				*dest = bad_char_behavior;
1904 			    else
1905 				*dest = 0xBF;
1906 			}
1907 			else
1908 			    *dest = u8c;
1909 		    }
1910 		}
1911 
1912 		// move the linerest to before the converted characters
1913 		line_start = dest - linerest;
1914 		mch_memmove(line_start, buffer, (size_t)linerest);
1915 		size = (long)((ptr + real_size) - dest);
1916 		ptr = dest;
1917 	    }
1918 	    else if (enc_utf8 && !curbuf->b_p_bin)
1919 	    {
1920 		int  incomplete_tail = FALSE;
1921 
1922 		// Reading UTF-8: Check if the bytes are valid UTF-8.
1923 		for (p = ptr; ; ++p)
1924 		{
1925 		    int	 todo = (int)((ptr + size) - p);
1926 		    int	 l;
1927 
1928 		    if (todo <= 0)
1929 			break;
1930 		    if (*p >= 0x80)
1931 		    {
1932 			// A length of 1 means it's an illegal byte.  Accept
1933 			// an incomplete character at the end though, the next
1934 			// read() will get the next bytes, we'll check it
1935 			// then.
1936 			l = utf_ptr2len_len(p, todo);
1937 			if (l > todo && !incomplete_tail)
1938 			{
1939 			    // Avoid retrying with a different encoding when
1940 			    // a truncated file is more likely, or attempting
1941 			    // to read the rest of an incomplete sequence when
1942 			    // we have already done so.
1943 			    if (p > ptr || filesize > 0)
1944 				incomplete_tail = TRUE;
1945 			    // Incomplete byte sequence, move it to conv_rest[]
1946 			    // and try to read the rest of it, unless we've
1947 			    // already done so.
1948 			    if (p > ptr)
1949 			    {
1950 				conv_restlen = todo;
1951 				mch_memmove(conv_rest, p, conv_restlen);
1952 				size -= conv_restlen;
1953 				break;
1954 			    }
1955 			}
1956 			if (l == 1 || l > todo)
1957 			{
1958 			    // Illegal byte.  If we can try another encoding
1959 			    // do that, unless at EOF where a truncated
1960 			    // file is more likely than a conversion error.
1961 			    if (can_retry && !incomplete_tail)
1962 				break;
1963 #ifdef USE_ICONV
1964 			    // When we did a conversion report an error.
1965 			    if (iconv_fd != (iconv_t)-1 && conv_error == 0)
1966 				conv_error = readfile_linenr(linecnt, ptr, p);
1967 #endif
1968 			    // Remember the first linenr with an illegal byte
1969 			    if (conv_error == 0 && illegal_byte == 0)
1970 				illegal_byte = readfile_linenr(linecnt, ptr, p);
1971 
1972 			    // Drop, keep or replace the bad byte.
1973 			    if (bad_char_behavior == BAD_DROP)
1974 			    {
1975 				mch_memmove(p, p + 1, todo - 1);
1976 				--p;
1977 				--size;
1978 			    }
1979 			    else if (bad_char_behavior != BAD_KEEP)
1980 				*p = bad_char_behavior;
1981 			}
1982 			else
1983 			    p += l - 1;
1984 		    }
1985 		}
1986 		if (p < ptr + size && !incomplete_tail)
1987 		{
1988 		    // Detected a UTF-8 error.
1989 rewind_retry:
1990 		    // Retry reading with another conversion.
1991 #if defined(FEAT_EVAL) && defined(USE_ICONV)
1992 		    if (*p_ccv != NUL && iconv_fd != (iconv_t)-1)
1993 			// iconv() failed, try 'charconvert'
1994 			did_iconv = TRUE;
1995 		    else
1996 #endif
1997 			// use next item from 'fileencodings'
1998 			advance_fenc = TRUE;
1999 		    file_rewind = TRUE;
2000 		    goto retry;
2001 		}
2002 	    }
2003 
2004 	    // count the number of characters (after conversion!)
2005 	    filesize += size;
2006 
2007 	    /*
2008 	     * when reading the first part of a file: guess EOL type
2009 	     */
2010 	    if (fileformat == EOL_UNKNOWN)
2011 	    {
2012 		// First try finding a NL, for Dos and Unix
2013 		if (try_dos || try_unix)
2014 		{
2015 		    // Reset the carriage return counter.
2016 		    if (try_mac)
2017 			try_mac = 1;
2018 
2019 		    for (p = ptr; p < ptr + size; ++p)
2020 		    {
2021 			if (*p == NL)
2022 			{
2023 			    if (!try_unix
2024 				    || (try_dos && p > ptr && p[-1] == CAR))
2025 				fileformat = EOL_DOS;
2026 			    else
2027 				fileformat = EOL_UNIX;
2028 			    break;
2029 			}
2030 			else if (*p == CAR && try_mac)
2031 			    try_mac++;
2032 		    }
2033 
2034 		    // Don't give in to EOL_UNIX if EOL_MAC is more likely
2035 		    if (fileformat == EOL_UNIX && try_mac)
2036 		    {
2037 			// Need to reset the counters when retrying fenc.
2038 			try_mac = 1;
2039 			try_unix = 1;
2040 			for (; p >= ptr && *p != CAR; p--)
2041 			    ;
2042 			if (p >= ptr)
2043 			{
2044 			    for (p = ptr; p < ptr + size; ++p)
2045 			    {
2046 				if (*p == NL)
2047 				    try_unix++;
2048 				else if (*p == CAR)
2049 				    try_mac++;
2050 			    }
2051 			    if (try_mac > try_unix)
2052 				fileformat = EOL_MAC;
2053 			}
2054 		    }
2055 		    else if (fileformat == EOL_UNKNOWN && try_mac == 1)
2056 			// Looking for CR but found no end-of-line markers at
2057 			// all: use the default format.
2058 			fileformat = default_fileformat();
2059 		}
2060 
2061 		// No NL found: may use Mac format
2062 		if (fileformat == EOL_UNKNOWN && try_mac)
2063 		    fileformat = EOL_MAC;
2064 
2065 		// Still nothing found?  Use first format in 'ffs'
2066 		if (fileformat == EOL_UNKNOWN)
2067 		    fileformat = default_fileformat();
2068 
2069 		// if editing a new file: may set p_tx and p_ff
2070 		if (set_options)
2071 		    set_fileformat(fileformat, OPT_LOCAL);
2072 	    }
2073 	}
2074 
2075 	/*
2076 	 * This loop is executed once for every character read.
2077 	 * Keep it fast!
2078 	 */
2079 	if (fileformat == EOL_MAC)
2080 	{
2081 	    --ptr;
2082 	    while (++ptr, --size >= 0)
2083 	    {
2084 		// catch most common case first
2085 		if ((c = *ptr) != NUL && c != CAR && c != NL)
2086 		    continue;
2087 		if (c == NUL)
2088 		    *ptr = NL;	// NULs are replaced by newlines!
2089 		else if (c == NL)
2090 		    *ptr = CAR;	// NLs are replaced by CRs!
2091 		else
2092 		{
2093 		    if (skip_count == 0)
2094 		    {
2095 			*ptr = NUL;	    // end of line
2096 			len = (colnr_T) (ptr - line_start + 1);
2097 			if (ml_append(lnum, line_start, len, newfile) == FAIL)
2098 			{
2099 			    error = TRUE;
2100 			    break;
2101 			}
2102 #ifdef FEAT_PERSISTENT_UNDO
2103 			if (read_undo_file)
2104 			    sha256_update(&sha_ctx, line_start, len);
2105 #endif
2106 			++lnum;
2107 			if (--read_count == 0)
2108 			{
2109 			    error = TRUE;	// break loop
2110 			    line_start = ptr;	// nothing left to write
2111 			    break;
2112 			}
2113 		    }
2114 		    else
2115 			--skip_count;
2116 		    line_start = ptr + 1;
2117 		}
2118 	    }
2119 	}
2120 	else
2121 	{
2122 	    --ptr;
2123 	    while (++ptr, --size >= 0)
2124 	    {
2125 		if ((c = *ptr) != NUL && c != NL)  // catch most common case
2126 		    continue;
2127 		if (c == NUL)
2128 		    *ptr = NL;	// NULs are replaced by newlines!
2129 		else
2130 		{
2131 		    if (skip_count == 0)
2132 		    {
2133 			*ptr = NUL;		// end of line
2134 			len = (colnr_T)(ptr - line_start + 1);
2135 			if (fileformat == EOL_DOS)
2136 			{
2137 			    if (ptr > line_start && ptr[-1] == CAR)
2138 			    {
2139 				// remove CR before NL
2140 				ptr[-1] = NUL;
2141 				--len;
2142 			    }
2143 			    /*
2144 			     * Reading in Dos format, but no CR-LF found!
2145 			     * When 'fileformats' includes "unix", delete all
2146 			     * the lines read so far and start all over again.
2147 			     * Otherwise give an error message later.
2148 			     */
2149 			    else if (ff_error != EOL_DOS)
2150 			    {
2151 				if (   try_unix
2152 				    && !read_stdin
2153 				    && (read_buffer
2154 					|| vim_lseek(fd, (off_T)0L, SEEK_SET)
2155 									  == 0))
2156 				{
2157 				    fileformat = EOL_UNIX;
2158 				    if (set_options)
2159 					set_fileformat(EOL_UNIX, OPT_LOCAL);
2160 				    file_rewind = TRUE;
2161 				    keep_fileformat = TRUE;
2162 				    goto retry;
2163 				}
2164 				ff_error = EOL_DOS;
2165 			    }
2166 			}
2167 			if (ml_append(lnum, line_start, len, newfile) == FAIL)
2168 			{
2169 			    error = TRUE;
2170 			    break;
2171 			}
2172 #ifdef FEAT_PERSISTENT_UNDO
2173 			if (read_undo_file)
2174 			    sha256_update(&sha_ctx, line_start, len);
2175 #endif
2176 			++lnum;
2177 			if (--read_count == 0)
2178 			{
2179 			    error = TRUE;	    // break loop
2180 			    line_start = ptr;	// nothing left to write
2181 			    break;
2182 			}
2183 		    }
2184 		    else
2185 			--skip_count;
2186 		    line_start = ptr + 1;
2187 		}
2188 	    }
2189 	}
2190 	linerest = (long)(ptr - line_start);
2191 	ui_breakcheck();
2192     }
2193 
2194 failed:
2195     // not an error, max. number of lines reached
2196     if (error && read_count == 0)
2197 	error = FALSE;
2198 
2199     /*
2200      * If we get EOF in the middle of a line, note the fact and
2201      * complete the line ourselves.
2202      * In Dos format ignore a trailing CTRL-Z, unless 'binary' set.
2203      */
2204     if (!error
2205 	    && !got_int
2206 	    && linerest != 0
2207 	    && !(!curbuf->b_p_bin
2208 		&& fileformat == EOL_DOS
2209 		&& *line_start == Ctrl_Z
2210 		&& ptr == line_start + 1))
2211     {
2212 	// remember for when writing
2213 	if (set_options)
2214 	    curbuf->b_p_eol = FALSE;
2215 	*ptr = NUL;
2216 	len = (colnr_T)(ptr - line_start + 1);
2217 	if (ml_append(lnum, line_start, len, newfile) == FAIL)
2218 	    error = TRUE;
2219 	else
2220 	{
2221 #ifdef FEAT_PERSISTENT_UNDO
2222 	    if (read_undo_file)
2223 		sha256_update(&sha_ctx, line_start, len);
2224 #endif
2225 	    read_no_eol_lnum = ++lnum;
2226 	}
2227     }
2228 
2229     if (set_options)
2230 	save_file_ff(curbuf);		// remember the current file format
2231 
2232 #ifdef FEAT_CRYPT
2233     if (curbuf->b_cryptstate != NULL)
2234     {
2235 	crypt_free_state(curbuf->b_cryptstate);
2236 	curbuf->b_cryptstate = NULL;
2237     }
2238     if (cryptkey != NULL && cryptkey != curbuf->b_p_key)
2239 	crypt_free_key(cryptkey);
2240     // Don't set cryptkey to NULL, it's used below as a flag that
2241     // encryption was used.
2242 #endif
2243 
2244     // If editing a new file: set 'fenc' for the current buffer.
2245     // Also for ":read ++edit file".
2246     if (set_options)
2247 	set_string_option_direct((char_u *)"fenc", -1, fenc,
2248 						       OPT_FREE|OPT_LOCAL, 0);
2249     if (fenc_alloced)
2250 	vim_free(fenc);
2251 #ifdef USE_ICONV
2252     if (iconv_fd != (iconv_t)-1)
2253 	iconv_close(iconv_fd);
2254 #endif
2255 
2256     if (!read_buffer && !read_stdin)
2257 	close(fd);				// errors are ignored
2258 #ifdef HAVE_FD_CLOEXEC
2259     else
2260     {
2261 	int fdflags = fcntl(fd, F_GETFD);
2262 	if (fdflags >= 0 && (fdflags & FD_CLOEXEC) == 0)
2263 	    (void)fcntl(fd, F_SETFD, fdflags | FD_CLOEXEC);
2264     }
2265 #endif
2266     vim_free(buffer);
2267 
2268 #ifdef HAVE_DUP
2269     if (read_stdin)
2270     {
2271 	// Use stderr for stdin, makes shell commands work.
2272 	close(0);
2273 	vim_ignored = dup(2);
2274     }
2275 #endif
2276 
2277     if (tmpname != NULL)
2278     {
2279 	mch_remove(tmpname);		// delete converted file
2280 	vim_free(tmpname);
2281     }
2282     --no_wait_return;			// may wait for return now
2283 
2284     /*
2285      * In recovery mode everything but autocommands is skipped.
2286      */
2287     if (!recoverymode)
2288     {
2289 	// need to delete the last line, which comes from the empty buffer
2290 	if (newfile && wasempty && !(curbuf->b_ml.ml_flags & ML_EMPTY))
2291 	{
2292 #ifdef FEAT_NETBEANS_INTG
2293 	    netbeansFireChanges = 0;
2294 #endif
2295 	    ml_delete(curbuf->b_ml.ml_line_count, FALSE);
2296 #ifdef FEAT_NETBEANS_INTG
2297 	    netbeansFireChanges = 1;
2298 #endif
2299 	    --linecnt;
2300 	}
2301 	linecnt = curbuf->b_ml.ml_line_count - linecnt;
2302 	if (filesize == 0)
2303 	    linecnt = 0;
2304 	if (newfile || read_buffer)
2305 	{
2306 	    redraw_curbuf_later(NOT_VALID);
2307 #ifdef FEAT_DIFF
2308 	    // After reading the text into the buffer the diff info needs to
2309 	    // be updated.
2310 	    diff_invalidate(curbuf);
2311 #endif
2312 #ifdef FEAT_FOLDING
2313 	    // All folds in the window are invalid now.  Mark them for update
2314 	    // before triggering autocommands.
2315 	    foldUpdateAll(curwin);
2316 #endif
2317 	}
2318 	else if (linecnt)		// appended at least one line
2319 	    appended_lines_mark(from, linecnt);
2320 
2321 #ifndef ALWAYS_USE_GUI
2322 	/*
2323 	 * If we were reading from the same terminal as where messages go,
2324 	 * the screen will have been messed up.
2325 	 * Switch on raw mode now and clear the screen.
2326 	 */
2327 	if (read_stdin)
2328 	{
2329 	    settmode(TMODE_RAW);	// set to raw mode
2330 	    starttermcap();
2331 	    screenclear();
2332 	}
2333 #endif
2334 
2335 	if (got_int)
2336 	{
2337 	    if (!(flags & READ_DUMMY))
2338 	    {
2339 		filemess(curbuf, sfname, (char_u *)_(e_interr), 0);
2340 		if (newfile)
2341 		    curbuf->b_p_ro = TRUE;	// must use "w!" now
2342 	    }
2343 	    msg_scroll = msg_save;
2344 #ifdef FEAT_VIMINFO
2345 	    check_marks_read();
2346 #endif
2347 	    return OK;		// an interrupt isn't really an error
2348 	}
2349 
2350 	if (!filtering && !(flags & READ_DUMMY))
2351 	{
2352 	    msg_add_fname(curbuf, sfname);   // fname in IObuff with quotes
2353 	    c = FALSE;
2354 
2355 #ifdef UNIX
2356 	    if (S_ISFIFO(perm))			    // fifo
2357 	    {
2358 		STRCAT(IObuff, _("[fifo]"));
2359 		c = TRUE;
2360 	    }
2361 	    if (S_ISSOCK(perm))			    // or socket
2362 	    {
2363 		STRCAT(IObuff, _("[socket]"));
2364 		c = TRUE;
2365 	    }
2366 # ifdef OPEN_CHR_FILES
2367 	    if (S_ISCHR(perm))			    // or character special
2368 	    {
2369 		STRCAT(IObuff, _("[character special]"));
2370 		c = TRUE;
2371 	    }
2372 # endif
2373 #endif
2374 	    if (curbuf->b_p_ro)
2375 	    {
2376 		STRCAT(IObuff, shortmess(SHM_RO) ? _("[RO]") : _("[readonly]"));
2377 		c = TRUE;
2378 	    }
2379 	    if (read_no_eol_lnum)
2380 	    {
2381 		msg_add_eol();
2382 		c = TRUE;
2383 	    }
2384 	    if (ff_error == EOL_DOS)
2385 	    {
2386 		STRCAT(IObuff, _("[CR missing]"));
2387 		c = TRUE;
2388 	    }
2389 	    if (split)
2390 	    {
2391 		STRCAT(IObuff, _("[long lines split]"));
2392 		c = TRUE;
2393 	    }
2394 	    if (notconverted)
2395 	    {
2396 		STRCAT(IObuff, _("[NOT converted]"));
2397 		c = TRUE;
2398 	    }
2399 	    else if (converted)
2400 	    {
2401 		STRCAT(IObuff, _("[converted]"));
2402 		c = TRUE;
2403 	    }
2404 #ifdef FEAT_CRYPT
2405 	    if (cryptkey != NULL)
2406 	    {
2407 		crypt_append_msg(curbuf);
2408 		c = TRUE;
2409 	    }
2410 #endif
2411 	    if (conv_error != 0)
2412 	    {
2413 		sprintf((char *)IObuff + STRLEN(IObuff),
2414 		       _("[CONVERSION ERROR in line %ld]"), (long)conv_error);
2415 		c = TRUE;
2416 	    }
2417 	    else if (illegal_byte > 0)
2418 	    {
2419 		sprintf((char *)IObuff + STRLEN(IObuff),
2420 			 _("[ILLEGAL BYTE in line %ld]"), (long)illegal_byte);
2421 		c = TRUE;
2422 	    }
2423 	    else if (error)
2424 	    {
2425 		STRCAT(IObuff, _("[READ ERRORS]"));
2426 		c = TRUE;
2427 	    }
2428 	    if (msg_add_fileformat(fileformat))
2429 		c = TRUE;
2430 #ifdef FEAT_CRYPT
2431 	    if (cryptkey != NULL)
2432 		msg_add_lines(c, (long)linecnt, filesize
2433 			 - crypt_get_header_len(crypt_get_method_nr(curbuf)));
2434 	    else
2435 #endif
2436 		msg_add_lines(c, (long)linecnt, filesize);
2437 
2438 	    VIM_CLEAR(keep_msg);
2439 	    msg_scrolled_ign = TRUE;
2440 #ifdef ALWAYS_USE_GUI
2441 	    // Don't show the message when reading stdin, it would end up in a
2442 	    // message box (which might be shown when exiting!)
2443 	    if (read_stdin || read_buffer)
2444 		p = msg_may_trunc(FALSE, IObuff);
2445 	    else
2446 #endif
2447 	    {
2448 		if (msg_col > 0)
2449 		    msg_putchar('\r');  // overwrite previous message
2450 		p = (char_u *)msg_trunc_attr((char *)IObuff, FALSE, 0);
2451 	    }
2452 	    if (read_stdin || read_buffer || restart_edit != 0
2453 		    || (msg_scrolled != 0 && !need_wait_return))
2454 		// Need to repeat the message after redrawing when:
2455 		// - When reading from stdin (the screen will be cleared next).
2456 		// - When restart_edit is set (otherwise there will be a delay
2457 		//   before redrawing).
2458 		// - When the screen was scrolled but there is no wait-return
2459 		//   prompt.
2460 		set_keep_msg(p, 0);
2461 	    msg_scrolled_ign = FALSE;
2462 	}
2463 
2464 	// with errors writing the file requires ":w!"
2465 	if (newfile && (error
2466 		    || conv_error != 0
2467 		    || (illegal_byte > 0 && bad_char_behavior != BAD_KEEP)))
2468 	    curbuf->b_p_ro = TRUE;
2469 
2470 	u_clearline();	    // cannot use "U" command after adding lines
2471 
2472 	/*
2473 	 * In Ex mode: cursor at last new line.
2474 	 * Otherwise: cursor at first new line.
2475 	 */
2476 	if (exmode_active)
2477 	    curwin->w_cursor.lnum = from + linecnt;
2478 	else
2479 	    curwin->w_cursor.lnum = from + 1;
2480 	check_cursor_lnum();
2481 	beginline(BL_WHITE | BL_FIX);	    // on first non-blank
2482 
2483 	if (!cmdmod.lockmarks)
2484 	{
2485 	    // Set '[ and '] marks to the newly read lines.
2486 	    curbuf->b_op_start.lnum = from + 1;
2487 	    curbuf->b_op_start.col = 0;
2488 	    curbuf->b_op_end.lnum = from + linecnt;
2489 	    curbuf->b_op_end.col = 0;
2490 	}
2491 
2492 #ifdef MSWIN
2493 	/*
2494 	 * Work around a weird problem: When a file has two links (only
2495 	 * possible on NTFS) and we write through one link, then stat() it
2496 	 * through the other link, the timestamp information may be wrong.
2497 	 * It's correct again after reading the file, thus reset the timestamp
2498 	 * here.
2499 	 */
2500 	if (newfile && !read_stdin && !read_buffer
2501 					 && mch_stat((char *)fname, &st) >= 0)
2502 	{
2503 	    buf_store_time(curbuf, &st, fname);
2504 	    curbuf->b_mtime_read = curbuf->b_mtime;
2505 	}
2506 #endif
2507     }
2508     msg_scroll = msg_save;
2509 
2510 #ifdef FEAT_VIMINFO
2511     /*
2512      * Get the marks before executing autocommands, so they can be used there.
2513      */
2514     check_marks_read();
2515 #endif
2516 
2517     /*
2518      * We remember if the last line of the read didn't have
2519      * an eol even when 'binary' is off, to support turning 'fixeol' off,
2520      * or writing the read again with 'binary' on.  The latter is required
2521      * for ":autocmd FileReadPost *.gz set bin|'[,']!gunzip" to work.
2522      */
2523     curbuf->b_no_eol_lnum = read_no_eol_lnum;
2524 
2525     // When reloading a buffer put the cursor at the first line that is
2526     // different.
2527     if (flags & READ_KEEP_UNDO)
2528 	u_find_first_changed();
2529 
2530 #ifdef FEAT_PERSISTENT_UNDO
2531     /*
2532      * When opening a new file locate undo info and read it.
2533      */
2534     if (read_undo_file)
2535     {
2536 	char_u	hash[UNDO_HASH_SIZE];
2537 
2538 	sha256_finish(&sha_ctx, hash);
2539 	u_read_undo(NULL, hash, fname);
2540     }
2541 #endif
2542 
2543     if (!read_stdin && !read_fifo && (!read_buffer || sfname != NULL))
2544     {
2545 	int m = msg_scroll;
2546 	int n = msg_scrolled;
2547 
2548 	// Save the fileformat now, otherwise the buffer will be considered
2549 	// modified if the format/encoding was automatically detected.
2550 	if (set_options)
2551 	    save_file_ff(curbuf);
2552 
2553 	/*
2554 	 * The output from the autocommands should not overwrite anything and
2555 	 * should not be overwritten: Set msg_scroll, restore its value if no
2556 	 * output was done.
2557 	 */
2558 	msg_scroll = TRUE;
2559 	if (filtering)
2560 	    apply_autocmds_exarg(EVENT_FILTERREADPOST, NULL, sfname,
2561 							  FALSE, curbuf, eap);
2562 	else if (newfile || (read_buffer && sfname != NULL))
2563 	{
2564 	    apply_autocmds_exarg(EVENT_BUFREADPOST, NULL, sfname,
2565 							  FALSE, curbuf, eap);
2566 	    if (!au_did_filetype && *curbuf->b_p_ft != NUL)
2567 		/*
2568 		 * EVENT_FILETYPE was not triggered but the buffer already has a
2569 		 * filetype. Trigger EVENT_FILETYPE using the existing filetype.
2570 		 */
2571 		apply_autocmds(EVENT_FILETYPE, curbuf->b_p_ft, curbuf->b_fname,
2572 			TRUE, curbuf);
2573 	}
2574 	else
2575 	    apply_autocmds_exarg(EVENT_FILEREADPOST, sfname, sfname,
2576 							    FALSE, NULL, eap);
2577 	if (msg_scrolled == n)
2578 	    msg_scroll = m;
2579 # ifdef FEAT_EVAL
2580 	if (aborting())	    // autocmds may abort script processing
2581 	    return FAIL;
2582 # endif
2583     }
2584 
2585     if (recoverymode && error)
2586 	return FAIL;
2587     return OK;
2588 }
2589 
2590 #if defined(OPEN_CHR_FILES) || defined(PROTO)
2591 /*
2592  * Returns TRUE if the file name argument is of the form "/dev/fd/\d\+",
2593  * which is the name of files used for process substitution output by
2594  * some shells on some operating systems, e.g., bash on SunOS.
2595  * Do not accept "/dev/fd/[012]", opening these may hang Vim.
2596  */
2597     int
2598 is_dev_fd_file(char_u *fname)
2599 {
2600     return (STRNCMP(fname, "/dev/fd/", 8) == 0
2601 	    && VIM_ISDIGIT(fname[8])
2602 	    && *skipdigits(fname + 9) == NUL
2603 	    && (fname[9] != NUL
2604 		|| (fname[8] != '0' && fname[8] != '1' && fname[8] != '2')));
2605 }
2606 #endif
2607 
2608 /*
2609  * From the current line count and characters read after that, estimate the
2610  * line number where we are now.
2611  * Used for error messages that include a line number.
2612  */
2613     static linenr_T
2614 readfile_linenr(
2615     linenr_T	linecnt,	// line count before reading more bytes
2616     char_u	*p,		// start of more bytes read
2617     char_u	*endp)		// end of more bytes read
2618 {
2619     char_u	*s;
2620     linenr_T	lnum;
2621 
2622     lnum = curbuf->b_ml.ml_line_count - linecnt + 1;
2623     for (s = p; s < endp; ++s)
2624 	if (*s == '\n')
2625 	    ++lnum;
2626     return lnum;
2627 }
2628 
2629 /*
2630  * Fill "*eap" to force the 'fileencoding', 'fileformat' and 'binary to be
2631  * equal to the buffer "buf".  Used for calling readfile().
2632  * Returns OK or FAIL.
2633  */
2634     int
2635 prep_exarg(exarg_T *eap, buf_T *buf)
2636 {
2637     eap->cmd = alloc(15 + (unsigned)STRLEN(buf->b_p_fenc));
2638     if (eap->cmd == NULL)
2639 	return FAIL;
2640 
2641     sprintf((char *)eap->cmd, "e ++enc=%s", buf->b_p_fenc);
2642     eap->force_enc = 8;
2643     eap->bad_char = buf->b_bad_char;
2644     eap->force_ff = *buf->b_p_ff;
2645 
2646     eap->force_bin = buf->b_p_bin ? FORCE_BIN : FORCE_NOBIN;
2647     eap->read_edit = FALSE;
2648     eap->forceit = FALSE;
2649     return OK;
2650 }
2651 
2652 /*
2653  * Set default or forced 'fileformat' and 'binary'.
2654  */
2655     void
2656 set_file_options(int set_options, exarg_T *eap)
2657 {
2658     // set default 'fileformat'
2659     if (set_options)
2660     {
2661 	if (eap != NULL && eap->force_ff != 0)
2662 	    set_fileformat(get_fileformat_force(curbuf, eap), OPT_LOCAL);
2663 	else if (*p_ffs != NUL)
2664 	    set_fileformat(default_fileformat(), OPT_LOCAL);
2665     }
2666 
2667     // set or reset 'binary'
2668     if (eap != NULL && eap->force_bin != 0)
2669     {
2670 	int	oldval = curbuf->b_p_bin;
2671 
2672 	curbuf->b_p_bin = (eap->force_bin == FORCE_BIN);
2673 	set_options_bin(oldval, curbuf->b_p_bin, OPT_LOCAL);
2674     }
2675 }
2676 
2677 /*
2678  * Set forced 'fileencoding'.
2679  */
2680     void
2681 set_forced_fenc(exarg_T *eap)
2682 {
2683     if (eap->force_enc != 0)
2684     {
2685 	char_u *fenc = enc_canonize(eap->cmd + eap->force_enc);
2686 
2687 	if (fenc != NULL)
2688 	    set_string_option_direct((char_u *)"fenc", -1,
2689 				 fenc, OPT_FREE|OPT_LOCAL, 0);
2690 	vim_free(fenc);
2691     }
2692 }
2693 
2694 /*
2695  * Find next fileencoding to use from 'fileencodings'.
2696  * "pp" points to fenc_next.  It's advanced to the next item.
2697  * When there are no more items, an empty string is returned and *pp is set to
2698  * NULL.
2699  * When *pp is not set to NULL, the result is in allocated memory and "alloced"
2700  * is set to TRUE.
2701  */
2702     static char_u *
2703 next_fenc(char_u **pp, int *alloced)
2704 {
2705     char_u	*p;
2706     char_u	*r;
2707 
2708     *alloced = FALSE;
2709     if (**pp == NUL)
2710     {
2711 	*pp = NULL;
2712 	return (char_u *)"";
2713     }
2714     p = vim_strchr(*pp, ',');
2715     if (p == NULL)
2716     {
2717 	r = enc_canonize(*pp);
2718 	*pp += STRLEN(*pp);
2719     }
2720     else
2721     {
2722 	r = vim_strnsave(*pp, (int)(p - *pp));
2723 	*pp = p + 1;
2724 	if (r != NULL)
2725 	{
2726 	    p = enc_canonize(r);
2727 	    vim_free(r);
2728 	    r = p;
2729 	}
2730     }
2731     if (r != NULL)
2732 	*alloced = TRUE;
2733     else
2734     {
2735 	// out of memory
2736 	r = (char_u *)"";
2737 	*pp = NULL;
2738     }
2739     return r;
2740 }
2741 
2742 #ifdef FEAT_EVAL
2743 /*
2744  * Convert a file with the 'charconvert' expression.
2745  * This closes the file which is to be read, converts it and opens the
2746  * resulting file for reading.
2747  * Returns name of the resulting converted file (the caller should delete it
2748  * after reading it).
2749  * Returns NULL if the conversion failed ("*fdp" is not set) .
2750  */
2751     static char_u *
2752 readfile_charconvert(
2753     char_u	*fname,		// name of input file
2754     char_u	*fenc,		// converted from
2755     int		*fdp)		// in/out: file descriptor of file
2756 {
2757     char_u	*tmpname;
2758     char	*errmsg = NULL;
2759 
2760     tmpname = vim_tempname('r', FALSE);
2761     if (tmpname == NULL)
2762 	errmsg = _("Can't find temp file for conversion");
2763     else
2764     {
2765 	close(*fdp);		// close the input file, ignore errors
2766 	*fdp = -1;
2767 	if (eval_charconvert(fenc, enc_utf8 ? (char_u *)"utf-8" : p_enc,
2768 						      fname, tmpname) == FAIL)
2769 	    errmsg = _("Conversion with 'charconvert' failed");
2770 	if (errmsg == NULL && (*fdp = mch_open((char *)tmpname,
2771 						  O_RDONLY | O_EXTRA, 0)) < 0)
2772 	    errmsg = _("can't read output of 'charconvert'");
2773     }
2774 
2775     if (errmsg != NULL)
2776     {
2777 	// Don't use emsg(), it breaks mappings, the retry with
2778 	// another type of conversion might still work.
2779 	msg(errmsg);
2780 	if (tmpname != NULL)
2781 	{
2782 	    mch_remove(tmpname);	// delete converted file
2783 	    VIM_CLEAR(tmpname);
2784 	}
2785     }
2786 
2787     // If the input file is closed, open it (caller should check for error).
2788     if (*fdp < 0)
2789 	*fdp = mch_open((char *)fname, O_RDONLY | O_EXTRA, 0);
2790 
2791     return tmpname;
2792 }
2793 #endif
2794 
2795 #if defined(FEAT_CRYPT) || defined(PROTO)
2796 /*
2797  * Check for magic number used for encryption.  Applies to the current buffer.
2798  * If found, the magic number is removed from ptr[*sizep] and *sizep and
2799  * *filesizep are updated.
2800  * Return the (new) encryption key, NULL for no encryption.
2801  */
2802     static char_u *
2803 check_for_cryptkey(
2804     char_u	*cryptkey,	// previous encryption key or NULL
2805     char_u	*ptr,		// pointer to read bytes
2806     long	*sizep,		// length of read bytes
2807     off_T	*filesizep,	// nr of bytes used from file
2808     int		newfile,	// editing a new buffer
2809     char_u	*fname,		// file name to display
2810     int		*did_ask)	// flag: whether already asked for key
2811 {
2812     int method = crypt_method_nr_from_magic((char *)ptr, *sizep);
2813     int b_p_ro = curbuf->b_p_ro;
2814 
2815     if (method >= 0)
2816     {
2817 	// Mark the buffer as read-only until the decryption has taken place.
2818 	// Avoids accidentally overwriting the file with garbage.
2819 	curbuf->b_p_ro = TRUE;
2820 
2821 	// Set the cryptmethod local to the buffer.
2822 	crypt_set_cm_option(curbuf, method);
2823 	if (cryptkey == NULL && !*did_ask)
2824 	{
2825 	    if (*curbuf->b_p_key)
2826 		cryptkey = curbuf->b_p_key;
2827 	    else
2828 	    {
2829 		// When newfile is TRUE, store the typed key in the 'key'
2830 		// option and don't free it.  bf needs hash of the key saved.
2831 		// Don't ask for the key again when first time Enter was hit.
2832 		// Happens when retrying to detect encoding.
2833 		smsg(_(need_key_msg), fname);
2834 		msg_scroll = TRUE;
2835 		crypt_check_method(method);
2836 		cryptkey = crypt_get_key(newfile, FALSE);
2837 		*did_ask = TRUE;
2838 
2839 		// check if empty key entered
2840 		if (cryptkey != NULL && *cryptkey == NUL)
2841 		{
2842 		    if (cryptkey != curbuf->b_p_key)
2843 			vim_free(cryptkey);
2844 		    cryptkey = NULL;
2845 		}
2846 	    }
2847 	}
2848 
2849 	if (cryptkey != NULL)
2850 	{
2851 	    int header_len;
2852 
2853 	    curbuf->b_cryptstate = crypt_create_from_header(
2854 						       method, cryptkey, ptr);
2855 	    crypt_set_cm_option(curbuf, method);
2856 
2857 	    // Remove cryptmethod specific header from the text.
2858 	    header_len = crypt_get_header_len(method);
2859 	    if (*sizep <= header_len)
2860 		// invalid header, buffer can't be encrypted
2861 		return NULL;
2862 	    *filesizep += header_len;
2863 	    *sizep -= header_len;
2864 	    mch_memmove(ptr, ptr + header_len, (size_t)*sizep);
2865 
2866 	    // Restore the read-only flag.
2867 	    curbuf->b_p_ro = b_p_ro;
2868 	}
2869     }
2870     // When starting to edit a new file which does not have encryption, clear
2871     // the 'key' option, except when starting up (called with -x argument)
2872     else if (newfile && *curbuf->b_p_key != NUL && !starting)
2873 	set_option_value((char_u *)"key", 0L, (char_u *)"", OPT_LOCAL);
2874 
2875     return cryptkey;
2876 }
2877 #endif  // FEAT_CRYPT
2878 
2879 /*
2880  * Return TRUE if a file appears to be read-only from the file permissions.
2881  */
2882     int
2883 check_file_readonly(
2884     char_u	*fname,		// full path to file
2885     int		perm UNUSED)	// known permissions on file
2886 {
2887 #ifndef USE_MCH_ACCESS
2888     int	    fd = 0;
2889 #endif
2890 
2891     return (
2892 #ifdef USE_MCH_ACCESS
2893 # ifdef UNIX
2894 	(perm & 0222) == 0 ||
2895 # endif
2896 	mch_access((char *)fname, W_OK)
2897 #else
2898 	(fd = mch_open((char *)fname, O_RDWR | O_EXTRA, 0)) < 0
2899 					? TRUE : (close(fd), FALSE)
2900 #endif
2901 	);
2902 }
2903 
2904 #if defined(HAVE_FSYNC) || defined(PROTO)
2905 /*
2906  * Call fsync() with Mac-specific exception.
2907  * Return fsync() result: zero for success.
2908  */
2909     int
2910 vim_fsync(int fd)
2911 {
2912     int r;
2913 
2914 # ifdef MACOS_X
2915     r = fcntl(fd, F_FULLFSYNC);
2916     if (r != 0)  // F_FULLFSYNC not working or not supported
2917 # endif
2918 	r = fsync(fd);
2919     return r;
2920 }
2921 #endif
2922 
2923 /*
2924  * Set the name of the current buffer.  Use when the buffer doesn't have a
2925  * name and a ":r" or ":w" command with a file name is used.
2926  */
2927     int
2928 set_rw_fname(char_u *fname, char_u *sfname)
2929 {
2930     buf_T	*buf = curbuf;
2931 
2932     // It's like the unnamed buffer is deleted....
2933     if (curbuf->b_p_bl)
2934 	apply_autocmds(EVENT_BUFDELETE, NULL, NULL, FALSE, curbuf);
2935     apply_autocmds(EVENT_BUFWIPEOUT, NULL, NULL, FALSE, curbuf);
2936 #ifdef FEAT_EVAL
2937     if (aborting())	    // autocmds may abort script processing
2938 	return FAIL;
2939 #endif
2940     if (curbuf != buf)
2941     {
2942 	// We are in another buffer now, don't do the renaming.
2943 	emsg(_(e_auchangedbuf));
2944 	return FAIL;
2945     }
2946 
2947     if (setfname(curbuf, fname, sfname, FALSE) == OK)
2948 	curbuf->b_flags |= BF_NOTEDITED;
2949 
2950     // ....and a new named one is created
2951     apply_autocmds(EVENT_BUFNEW, NULL, NULL, FALSE, curbuf);
2952     if (curbuf->b_p_bl)
2953 	apply_autocmds(EVENT_BUFADD, NULL, NULL, FALSE, curbuf);
2954 #ifdef FEAT_EVAL
2955     if (aborting())	    // autocmds may abort script processing
2956 	return FAIL;
2957 #endif
2958 
2959     // Do filetype detection now if 'filetype' is empty.
2960     if (*curbuf->b_p_ft == NUL)
2961     {
2962 	if (au_has_group((char_u *)"filetypedetect"))
2963 	    (void)do_doautocmd((char_u *)"filetypedetect BufRead", FALSE, NULL);
2964 	do_modelines(0);
2965     }
2966 
2967     return OK;
2968 }
2969 
2970 /*
2971  * Put file name into IObuff with quotes.
2972  */
2973     void
2974 msg_add_fname(buf_T *buf, char_u *fname)
2975 {
2976     if (fname == NULL)
2977 	fname = (char_u *)"-stdin-";
2978     home_replace(buf, fname, IObuff + 1, IOSIZE - 4, TRUE);
2979     IObuff[0] = '"';
2980     STRCAT(IObuff, "\" ");
2981 }
2982 
2983 /*
2984  * Append message for text mode to IObuff.
2985  * Return TRUE if something appended.
2986  */
2987     int
2988 msg_add_fileformat(int eol_type)
2989 {
2990 #ifndef USE_CRNL
2991     if (eol_type == EOL_DOS)
2992     {
2993 	STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[dos]") : _("[dos format]"));
2994 	return TRUE;
2995     }
2996 #endif
2997     if (eol_type == EOL_MAC)
2998     {
2999 	STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[mac]") : _("[mac format]"));
3000 	return TRUE;
3001     }
3002 #ifdef USE_CRNL
3003     if (eol_type == EOL_UNIX)
3004     {
3005 	STRCAT(IObuff, shortmess(SHM_TEXT) ? _("[unix]") : _("[unix format]"));
3006 	return TRUE;
3007     }
3008 #endif
3009     return FALSE;
3010 }
3011 
3012 /*
3013  * Append line and character count to IObuff.
3014  */
3015     void
3016 msg_add_lines(
3017     int	    insert_space,
3018     long    lnum,
3019     off_T   nchars)
3020 {
3021     char_u  *p;
3022 
3023     p = IObuff + STRLEN(IObuff);
3024 
3025     if (insert_space)
3026 	*p++ = ' ';
3027     if (shortmess(SHM_LINES))
3028 	vim_snprintf((char *)p, IOSIZE - (p - IObuff),
3029 		"%ldL, %lldC", lnum, (varnumber_T)nchars);
3030     else
3031     {
3032 	sprintf((char *)p, NGETTEXT("%ld line, ", "%ld lines, ", lnum), lnum);
3033 	p += STRLEN(p);
3034 	vim_snprintf((char *)p, IOSIZE - (p - IObuff),
3035 		NGETTEXT("%lld character", "%lld characters", nchars),
3036 		(varnumber_T)nchars);
3037     }
3038 }
3039 
3040 /*
3041  * Append message for missing line separator to IObuff.
3042  */
3043     void
3044 msg_add_eol(void)
3045 {
3046     STRCAT(IObuff, shortmess(SHM_LAST) ? _("[noeol]") : _("[Incomplete last line]"));
3047 }
3048 
3049     int
3050 time_differs(long t1, long t2)
3051 {
3052 #if defined(__linux__) || defined(MSWIN)
3053     // On a FAT filesystem, esp. under Linux, there are only 5 bits to store
3054     // the seconds.  Since the roundoff is done when flushing the inode, the
3055     // time may change unexpectedly by one second!!!
3056     return (t1 - t2 > 1 || t2 - t1 > 1);
3057 #else
3058     return (t1 != t2);
3059 #endif
3060 }
3061 
3062 /*
3063  * Return TRUE if file encoding "fenc" requires conversion from or to
3064  * 'encoding'.
3065  */
3066     int
3067 need_conversion(char_u *fenc)
3068 {
3069     int		same_encoding;
3070     int		enc_flags;
3071     int		fenc_flags;
3072 
3073     if (*fenc == NUL || STRCMP(p_enc, fenc) == 0)
3074     {
3075 	same_encoding = TRUE;
3076 	fenc_flags = 0;
3077     }
3078     else
3079     {
3080 	// Ignore difference between "ansi" and "latin1", "ucs-4" and
3081 	// "ucs-4be", etc.
3082 	enc_flags = get_fio_flags(p_enc);
3083 	fenc_flags = get_fio_flags(fenc);
3084 	same_encoding = (enc_flags != 0 && fenc_flags == enc_flags);
3085     }
3086     if (same_encoding)
3087     {
3088 	// Specified encoding matches with 'encoding'.  This requires
3089 	// conversion when 'encoding' is Unicode but not UTF-8.
3090 	return enc_unicode != 0;
3091     }
3092 
3093     // Encodings differ.  However, conversion is not needed when 'enc' is any
3094     // Unicode encoding and the file is UTF-8.
3095     return !(enc_utf8 && fenc_flags == FIO_UTF8);
3096 }
3097 
3098 /*
3099  * Check "ptr" for a unicode encoding and return the FIO_ flags needed for the
3100  * internal conversion.
3101  * if "ptr" is an empty string, use 'encoding'.
3102  */
3103     int
3104 get_fio_flags(char_u *ptr)
3105 {
3106     int		prop;
3107 
3108     if (*ptr == NUL)
3109 	ptr = p_enc;
3110 
3111     prop = enc_canon_props(ptr);
3112     if (prop & ENC_UNICODE)
3113     {
3114 	if (prop & ENC_2BYTE)
3115 	{
3116 	    if (prop & ENC_ENDIAN_L)
3117 		return FIO_UCS2 | FIO_ENDIAN_L;
3118 	    return FIO_UCS2;
3119 	}
3120 	if (prop & ENC_4BYTE)
3121 	{
3122 	    if (prop & ENC_ENDIAN_L)
3123 		return FIO_UCS4 | FIO_ENDIAN_L;
3124 	    return FIO_UCS4;
3125 	}
3126 	if (prop & ENC_2WORD)
3127 	{
3128 	    if (prop & ENC_ENDIAN_L)
3129 		return FIO_UTF16 | FIO_ENDIAN_L;
3130 	    return FIO_UTF16;
3131 	}
3132 	return FIO_UTF8;
3133     }
3134     if (prop & ENC_LATIN1)
3135 	return FIO_LATIN1;
3136     // must be ENC_DBCS, requires iconv()
3137     return 0;
3138 }
3139 
3140 #if defined(MSWIN) || defined(PROTO)
3141 /*
3142  * Check "ptr" for a MS-Windows codepage name and return the FIO_ flags needed
3143  * for the conversion MS-Windows can do for us.  Also accept "utf-8".
3144  * Used for conversion between 'encoding' and 'fileencoding'.
3145  */
3146     int
3147 get_win_fio_flags(char_u *ptr)
3148 {
3149     int		cp;
3150 
3151     // Cannot do this when 'encoding' is not utf-8 and not a codepage.
3152     if (!enc_utf8 && enc_codepage <= 0)
3153 	return 0;
3154 
3155     cp = encname2codepage(ptr);
3156     if (cp == 0)
3157     {
3158 #  ifdef CP_UTF8	// VC 4.1 doesn't define CP_UTF8
3159 	if (STRCMP(ptr, "utf-8") == 0)
3160 	    cp = CP_UTF8;
3161 	else
3162 #  endif
3163 	    return 0;
3164     }
3165     return FIO_PUT_CP(cp) | FIO_CODEPAGE;
3166 }
3167 #endif
3168 
3169 #if defined(MACOS_CONVERT) || defined(PROTO)
3170 /*
3171  * Check "ptr" for a Carbon supported encoding and return the FIO_ flags
3172  * needed for the internal conversion to/from utf-8 or latin1.
3173  */
3174     int
3175 get_mac_fio_flags(char_u *ptr)
3176 {
3177     if ((enc_utf8 || STRCMP(p_enc, "latin1") == 0)
3178 				     && (enc_canon_props(ptr) & ENC_MACROMAN))
3179 	return FIO_MACROMAN;
3180     return 0;
3181 }
3182 #endif
3183 
3184 /*
3185  * Check for a Unicode BOM (Byte Order Mark) at the start of p[size].
3186  * "size" must be at least 2.
3187  * Return the name of the encoding and set "*lenp" to the length.
3188  * Returns NULL when no BOM found.
3189  */
3190     static char_u *
3191 check_for_bom(
3192     char_u	*p,
3193     long	size,
3194     int		*lenp,
3195     int		flags)
3196 {
3197     char	*name = NULL;
3198     int		len = 2;
3199 
3200     if (p[0] == 0xef && p[1] == 0xbb && size >= 3 && p[2] == 0xbf
3201 	    && (flags == FIO_ALL || flags == FIO_UTF8 || flags == 0))
3202     {
3203 	name = "utf-8";		// EF BB BF
3204 	len = 3;
3205     }
3206     else if (p[0] == 0xff && p[1] == 0xfe)
3207     {
3208 	if (size >= 4 && p[2] == 0 && p[3] == 0
3209 	    && (flags == FIO_ALL || flags == (FIO_UCS4 | FIO_ENDIAN_L)))
3210 	{
3211 	    name = "ucs-4le";	// FF FE 00 00
3212 	    len = 4;
3213 	}
3214 	else if (flags == (FIO_UCS2 | FIO_ENDIAN_L))
3215 	    name = "ucs-2le";	// FF FE
3216 	else if (flags == FIO_ALL || flags == (FIO_UTF16 | FIO_ENDIAN_L))
3217 	    // utf-16le is preferred, it also works for ucs-2le text
3218 	    name = "utf-16le";	// FF FE
3219     }
3220     else if (p[0] == 0xfe && p[1] == 0xff
3221 	    && (flags == FIO_ALL || flags == FIO_UCS2 || flags == FIO_UTF16))
3222     {
3223 	// Default to utf-16, it works also for ucs-2 text.
3224 	if (flags == FIO_UCS2)
3225 	    name = "ucs-2";	// FE FF
3226 	else
3227 	    name = "utf-16";	// FE FF
3228     }
3229     else if (size >= 4 && p[0] == 0 && p[1] == 0 && p[2] == 0xfe
3230 	    && p[3] == 0xff && (flags == FIO_ALL || flags == FIO_UCS4))
3231     {
3232 	name = "ucs-4";		// 00 00 FE FF
3233 	len = 4;
3234     }
3235 
3236     *lenp = len;
3237     return (char_u *)name;
3238 }
3239 
3240 /*
3241  * Try to find a shortname by comparing the fullname with the current
3242  * directory.
3243  * Returns "full_path" or pointer into "full_path" if shortened.
3244  */
3245     char_u *
3246 shorten_fname1(char_u *full_path)
3247 {
3248     char_u	*dirname;
3249     char_u	*p = full_path;
3250 
3251     dirname = alloc(MAXPATHL);
3252     if (dirname == NULL)
3253 	return full_path;
3254     if (mch_dirname(dirname, MAXPATHL) == OK)
3255     {
3256 	p = shorten_fname(full_path, dirname);
3257 	if (p == NULL || *p == NUL)
3258 	    p = full_path;
3259     }
3260     vim_free(dirname);
3261     return p;
3262 }
3263 
3264 /*
3265  * Try to find a shortname by comparing the fullname with the current
3266  * directory.
3267  * Returns NULL if not shorter name possible, pointer into "full_path"
3268  * otherwise.
3269  */
3270     char_u *
3271 shorten_fname(char_u *full_path, char_u *dir_name)
3272 {
3273     int		len;
3274     char_u	*p;
3275 
3276     if (full_path == NULL)
3277 	return NULL;
3278     len = (int)STRLEN(dir_name);
3279     if (fnamencmp(dir_name, full_path, len) == 0)
3280     {
3281 	p = full_path + len;
3282 #if defined(MSWIN)
3283 	/*
3284 	 * MS-Windows: when a file is in the root directory, dir_name will end
3285 	 * in a slash, since C: by itself does not define a specific dir. In
3286 	 * this case p may already be correct. <negri>
3287 	 */
3288 	if (!((len > 2) && (*(p - 2) == ':')))
3289 #endif
3290 	{
3291 	    if (vim_ispathsep(*p))
3292 		++p;
3293 #ifndef VMS   // the path separator is always part of the path
3294 	    else
3295 		p = NULL;
3296 #endif
3297 	}
3298     }
3299 #if defined(MSWIN)
3300     /*
3301      * When using a file in the current drive, remove the drive name:
3302      * "A:\dir\file" -> "\dir\file".  This helps when moving a session file on
3303      * a floppy from "A:\dir" to "B:\dir".
3304      */
3305     else if (len > 3
3306 	    && TOUPPER_LOC(full_path[0]) == TOUPPER_LOC(dir_name[0])
3307 	    && full_path[1] == ':'
3308 	    && vim_ispathsep(full_path[2]))
3309 	p = full_path + 2;
3310 #endif
3311     else
3312 	p = NULL;
3313     return p;
3314 }
3315 
3316 /*
3317  * Shorten filename of a buffer.
3318  * When "force" is TRUE: Use full path from now on for files currently being
3319  * edited, both for file name and swap file name.  Try to shorten the file
3320  * names a bit, if safe to do so.
3321  * When "force" is FALSE: Only try to shorten absolute file names.
3322  * For buffers that have buftype "nofile" or "scratch": never change the file
3323  * name.
3324  */
3325     void
3326 shorten_buf_fname(buf_T *buf, char_u *dirname, int force)
3327 {
3328     char_u	*p;
3329 
3330     if (buf->b_fname != NULL
3331 #ifdef FEAT_QUICKFIX
3332 	    && !bt_nofilename(buf)
3333 #endif
3334 	    && !path_with_url(buf->b_fname)
3335 	    && (force
3336 		|| buf->b_sfname == NULL
3337 		|| mch_isFullName(buf->b_sfname)))
3338     {
3339 	if (buf->b_sfname != buf->b_ffname)
3340 	    VIM_CLEAR(buf->b_sfname);
3341 	p = shorten_fname(buf->b_ffname, dirname);
3342 	if (p != NULL)
3343 	{
3344 	    buf->b_sfname = vim_strsave(p);
3345 	    buf->b_fname = buf->b_sfname;
3346 	}
3347 	if (p == NULL || buf->b_fname == NULL)
3348 	    buf->b_fname = buf->b_ffname;
3349     }
3350 }
3351 
3352 /*
3353  * Shorten filenames for all buffers.
3354  */
3355     void
3356 shorten_fnames(int force)
3357 {
3358     char_u	dirname[MAXPATHL];
3359     buf_T	*buf;
3360 
3361     mch_dirname(dirname, MAXPATHL);
3362     FOR_ALL_BUFFERS(buf)
3363     {
3364 	shorten_buf_fname(buf, dirname, force);
3365 
3366 	// Always make the swap file name a full path, a "nofile" buffer may
3367 	// also have a swap file.
3368 	mf_fullname(buf->b_ml.ml_mfp);
3369     }
3370     status_redraw_all();
3371     redraw_tabline = TRUE;
3372 #if defined(FEAT_PROP_POPUP) && defined(FEAT_QUICKFIX)
3373     popup_update_preview_title();
3374 #endif
3375 }
3376 
3377 #if (defined(FEAT_DND) && defined(FEAT_GUI_GTK)) \
3378 	|| defined(FEAT_GUI_MSWIN) \
3379 	|| defined(FEAT_GUI_MAC) \
3380 	|| defined(FEAT_GUI_HAIKU) \
3381 	|| defined(PROTO)
3382 /*
3383  * Shorten all filenames in "fnames[count]" by current directory.
3384  */
3385     void
3386 shorten_filenames(char_u **fnames, int count)
3387 {
3388     int		i;
3389     char_u	dirname[MAXPATHL];
3390     char_u	*p;
3391 
3392     if (fnames == NULL || count < 1)
3393 	return;
3394     mch_dirname(dirname, sizeof(dirname));
3395     for (i = 0; i < count; ++i)
3396     {
3397 	if ((p = shorten_fname(fnames[i], dirname)) != NULL)
3398 	{
3399 	    // shorten_fname() returns pointer in given "fnames[i]".  If free
3400 	    // "fnames[i]" first, "p" becomes invalid.  So we need to copy
3401 	    // "p" first then free fnames[i].
3402 	    p = vim_strsave(p);
3403 	    vim_free(fnames[i]);
3404 	    fnames[i] = p;
3405 	}
3406     }
3407 }
3408 #endif
3409 
3410 /*
3411  * Add extension to file name - change path/fo.o.h to path/fo.o.h.ext or
3412  * fo_o_h.ext for MSDOS or when shortname option set.
3413  *
3414  * Assumed that fname is a valid name found in the filesystem we assure that
3415  * the return value is a different name and ends in 'ext'.
3416  * "ext" MUST be at most 4 characters long if it starts with a dot, 3
3417  * characters otherwise.
3418  * Space for the returned name is allocated, must be freed later.
3419  * Returns NULL when out of memory.
3420  */
3421     char_u *
3422 modname(
3423     char_u *fname,
3424     char_u *ext,
3425     int	    prepend_dot)	// may prepend a '.' to file name
3426 {
3427     return buf_modname((curbuf->b_p_sn || curbuf->b_shortname),
3428 						     fname, ext, prepend_dot);
3429 }
3430 
3431     char_u *
3432 buf_modname(
3433     int	    shortname,		// use 8.3 file name
3434     char_u  *fname,
3435     char_u  *ext,
3436     int	    prepend_dot)	// may prepend a '.' to file name
3437 {
3438     char_u	*retval;
3439     char_u	*s;
3440     char_u	*e;
3441     char_u	*ptr;
3442     int		fnamelen, extlen;
3443 
3444     extlen = (int)STRLEN(ext);
3445 
3446     /*
3447      * If there is no file name we must get the name of the current directory
3448      * (we need the full path in case :cd is used).
3449      */
3450     if (fname == NULL || *fname == NUL)
3451     {
3452 	retval = alloc(MAXPATHL + extlen + 3);
3453 	if (retval == NULL)
3454 	    return NULL;
3455 	if (mch_dirname(retval, MAXPATHL) == FAIL ||
3456 				     (fnamelen = (int)STRLEN(retval)) == 0)
3457 	{
3458 	    vim_free(retval);
3459 	    return NULL;
3460 	}
3461 	if (!after_pathsep(retval, retval + fnamelen))
3462 	{
3463 	    retval[fnamelen++] = PATHSEP;
3464 	    retval[fnamelen] = NUL;
3465 	}
3466 	prepend_dot = FALSE;	    // nothing to prepend a dot to
3467     }
3468     else
3469     {
3470 	fnamelen = (int)STRLEN(fname);
3471 	retval = alloc(fnamelen + extlen + 3);
3472 	if (retval == NULL)
3473 	    return NULL;
3474 	STRCPY(retval, fname);
3475 #ifdef VMS
3476 	vms_remove_version(retval); // we do not need versions here
3477 #endif
3478     }
3479 
3480     /*
3481      * search backwards until we hit a '/', '\' or ':' replacing all '.'
3482      * by '_' for MSDOS or when shortname option set and ext starts with a dot.
3483      * Then truncate what is after the '/', '\' or ':' to 8 characters for
3484      * MSDOS and 26 characters for AMIGA, a lot more for UNIX.
3485      */
3486     for (ptr = retval + fnamelen; ptr > retval; MB_PTR_BACK(retval, ptr))
3487     {
3488 	if (*ext == '.' && shortname)
3489 	    if (*ptr == '.')	// replace '.' by '_'
3490 		*ptr = '_';
3491 	if (vim_ispathsep(*ptr))
3492 	{
3493 	    ++ptr;
3494 	    break;
3495 	}
3496     }
3497 
3498     // the file name has at most BASENAMELEN characters.
3499     if (STRLEN(ptr) > (unsigned)BASENAMELEN)
3500 	ptr[BASENAMELEN] = '\0';
3501 
3502     s = ptr + STRLEN(ptr);
3503 
3504     /*
3505      * For 8.3 file names we may have to reduce the length.
3506      */
3507     if (shortname)
3508     {
3509 	/*
3510 	 * If there is no file name, or the file name ends in '/', and the
3511 	 * extension starts with '.', put a '_' before the dot, because just
3512 	 * ".ext" is invalid.
3513 	 */
3514 	if (fname == NULL || *fname == NUL
3515 				   || vim_ispathsep(fname[STRLEN(fname) - 1]))
3516 	{
3517 	    if (*ext == '.')
3518 		*s++ = '_';
3519 	}
3520 	/*
3521 	 * If the extension starts with '.', truncate the base name at 8
3522 	 * characters
3523 	 */
3524 	else if (*ext == '.')
3525 	{
3526 	    if ((size_t)(s - ptr) > (size_t)8)
3527 	    {
3528 		s = ptr + 8;
3529 		*s = '\0';
3530 	    }
3531 	}
3532 	/*
3533 	 * If the extension doesn't start with '.', and the file name
3534 	 * doesn't have an extension yet, append a '.'
3535 	 */
3536 	else if ((e = vim_strchr(ptr, '.')) == NULL)
3537 	    *s++ = '.';
3538 	/*
3539 	 * If the extension doesn't start with '.', and there already is an
3540 	 * extension, it may need to be truncated
3541 	 */
3542 	else if ((int)STRLEN(e) + extlen > 4)
3543 	    s = e + 4 - extlen;
3544     }
3545 #ifdef MSWIN
3546     /*
3547      * If there is no file name, and the extension starts with '.', put a
3548      * '_' before the dot, because just ".ext" may be invalid if it's on a
3549      * FAT partition, and on HPFS it doesn't matter.
3550      */
3551     else if ((fname == NULL || *fname == NUL) && *ext == '.')
3552 	*s++ = '_';
3553 #endif
3554 
3555     /*
3556      * Append the extension.
3557      * ext can start with '.' and cannot exceed 3 more characters.
3558      */
3559     STRCPY(s, ext);
3560 
3561     /*
3562      * Prepend the dot.
3563      */
3564     if (prepend_dot && !shortname && *(e = gettail(retval)) != '.')
3565     {
3566 	STRMOVE(e + 1, e);
3567 	*e = '.';
3568     }
3569 
3570     /*
3571      * Check that, after appending the extension, the file name is really
3572      * different.
3573      */
3574     if (fname != NULL && STRCMP(fname, retval) == 0)
3575     {
3576 	// we search for a character that can be replaced by '_'
3577 	while (--s >= ptr)
3578 	{
3579 	    if (*s != '_')
3580 	    {
3581 		*s = '_';
3582 		break;
3583 	    }
3584 	}
3585 	if (s < ptr)	// fname was "________.<ext>", how tricky!
3586 	    *ptr = 'v';
3587     }
3588     return retval;
3589 }
3590 
3591 /*
3592  * Like fgets(), but if the file line is too long, it is truncated and the
3593  * rest of the line is thrown away.  Returns TRUE for end-of-file.
3594  * If the line is truncated then buf[size - 2] will not be NUL.
3595  */
3596     int
3597 vim_fgets(char_u *buf, int size, FILE *fp)
3598 {
3599     char	*eof;
3600 #define FGETS_SIZE 200
3601     char	tbuf[FGETS_SIZE];
3602 
3603     buf[size - 2] = NUL;
3604     eof = fgets((char *)buf, size, fp);
3605     if (buf[size - 2] != NUL && buf[size - 2] != '\n')
3606     {
3607 	buf[size - 1] = NUL;	    // Truncate the line
3608 
3609 	// Now throw away the rest of the line:
3610 	do
3611 	{
3612 	    tbuf[FGETS_SIZE - 2] = NUL;
3613 	    vim_ignoredp = fgets((char *)tbuf, FGETS_SIZE, fp);
3614 	} while (tbuf[FGETS_SIZE - 2] != NUL && tbuf[FGETS_SIZE - 2] != '\n');
3615     }
3616     return (eof == NULL);
3617 }
3618 
3619 /*
3620  * rename() only works if both files are on the same file system, this
3621  * function will (attempts to?) copy the file across if rename fails -- webb
3622  * Return -1 for failure, 0 for success.
3623  */
3624     int
3625 vim_rename(char_u *from, char_u *to)
3626 {
3627     int		fd_in;
3628     int		fd_out;
3629     int		n;
3630     char	*errmsg = NULL;
3631     char	*buffer;
3632 #ifdef AMIGA
3633     BPTR	flock;
3634 #endif
3635     stat_T	st;
3636     long	perm;
3637 #ifdef HAVE_ACL
3638     vim_acl_T	acl;		// ACL from original file
3639 #endif
3640     int		use_tmp_file = FALSE;
3641 
3642     /*
3643      * When the names are identical, there is nothing to do.  When they refer
3644      * to the same file (ignoring case and slash/backslash differences) but
3645      * the file name differs we need to go through a temp file.
3646      */
3647     if (fnamecmp(from, to) == 0)
3648     {
3649 	if (p_fic && STRCMP(gettail(from), gettail(to)) != 0)
3650 	    use_tmp_file = TRUE;
3651 	else
3652 	    return 0;
3653     }
3654 
3655     /*
3656      * Fail if the "from" file doesn't exist.  Avoids that "to" is deleted.
3657      */
3658     if (mch_stat((char *)from, &st) < 0)
3659 	return -1;
3660 
3661 #ifdef UNIX
3662     {
3663 	stat_T	st_to;
3664 
3665 	// It's possible for the source and destination to be the same file.
3666 	// This happens when "from" and "to" differ in case and are on a FAT32
3667 	// filesystem.  In that case go through a temp file name.
3668 	if (mch_stat((char *)to, &st_to) >= 0
3669 		&& st.st_dev == st_to.st_dev
3670 		&& st.st_ino == st_to.st_ino)
3671 	    use_tmp_file = TRUE;
3672     }
3673 #endif
3674 #ifdef MSWIN
3675     {
3676 	BY_HANDLE_FILE_INFORMATION info1, info2;
3677 
3678 	// It's possible for the source and destination to be the same file.
3679 	// In that case go through a temp file name.  This makes rename("foo",
3680 	// "./foo") a no-op (in a complicated way).
3681 	if (win32_fileinfo(from, &info1) == FILEINFO_OK
3682 		&& win32_fileinfo(to, &info2) == FILEINFO_OK
3683 		&& info1.dwVolumeSerialNumber == info2.dwVolumeSerialNumber
3684 		&& info1.nFileIndexHigh == info2.nFileIndexHigh
3685 		&& info1.nFileIndexLow == info2.nFileIndexLow)
3686 	    use_tmp_file = TRUE;
3687     }
3688 #endif
3689 
3690     if (use_tmp_file)
3691     {
3692 	char	tempname[MAXPATHL + 1];
3693 
3694 	/*
3695 	 * Find a name that doesn't exist and is in the same directory.
3696 	 * Rename "from" to "tempname" and then rename "tempname" to "to".
3697 	 */
3698 	if (STRLEN(from) >= MAXPATHL - 5)
3699 	    return -1;
3700 	STRCPY(tempname, from);
3701 	for (n = 123; n < 99999; ++n)
3702 	{
3703 	    sprintf((char *)gettail((char_u *)tempname), "%d", n);
3704 	    if (mch_stat(tempname, &st) < 0)
3705 	    {
3706 		if (mch_rename((char *)from, tempname) == 0)
3707 		{
3708 		    if (mch_rename(tempname, (char *)to) == 0)
3709 			return 0;
3710 		    // Strange, the second step failed.  Try moving the
3711 		    // file back and return failure.
3712 		    mch_rename(tempname, (char *)from);
3713 		    return -1;
3714 		}
3715 		// If it fails for one temp name it will most likely fail
3716 		// for any temp name, give up.
3717 		return -1;
3718 	    }
3719 	}
3720 	return -1;
3721     }
3722 
3723     /*
3724      * Delete the "to" file, this is required on some systems to make the
3725      * mch_rename() work, on other systems it makes sure that we don't have
3726      * two files when the mch_rename() fails.
3727      */
3728 
3729 #ifdef AMIGA
3730     /*
3731      * With MSDOS-compatible filesystems (crossdos, messydos) it is possible
3732      * that the name of the "to" file is the same as the "from" file, even
3733      * though the names are different. To avoid the chance of accidentally
3734      * deleting the "from" file (horror!) we lock it during the remove.
3735      *
3736      * When used for making a backup before writing the file: This should not
3737      * happen with ":w", because startscript() should detect this problem and
3738      * set buf->b_shortname, causing modname() to return a correct ".bak" file
3739      * name.  This problem does exist with ":w filename", but then the
3740      * original file will be somewhere else so the backup isn't really
3741      * important. If autoscripting is off the rename may fail.
3742      */
3743     flock = Lock((UBYTE *)from, (long)ACCESS_READ);
3744 #endif
3745     mch_remove(to);
3746 #ifdef AMIGA
3747     if (flock)
3748 	UnLock(flock);
3749 #endif
3750 
3751     /*
3752      * First try a normal rename, return if it works.
3753      */
3754     if (mch_rename((char *)from, (char *)to) == 0)
3755 	return 0;
3756 
3757     /*
3758      * Rename() failed, try copying the file.
3759      */
3760     perm = mch_getperm(from);
3761 #ifdef HAVE_ACL
3762     // For systems that support ACL: get the ACL from the original file.
3763     acl = mch_get_acl(from);
3764 #endif
3765     fd_in = mch_open((char *)from, O_RDONLY|O_EXTRA, 0);
3766     if (fd_in == -1)
3767     {
3768 #ifdef HAVE_ACL
3769 	mch_free_acl(acl);
3770 #endif
3771 	return -1;
3772     }
3773 
3774     // Create the new file with same permissions as the original.
3775     fd_out = mch_open((char *)to,
3776 		       O_CREAT|O_EXCL|O_WRONLY|O_EXTRA|O_NOFOLLOW, (int)perm);
3777     if (fd_out == -1)
3778     {
3779 	close(fd_in);
3780 #ifdef HAVE_ACL
3781 	mch_free_acl(acl);
3782 #endif
3783 	return -1;
3784     }
3785 
3786     buffer = alloc(WRITEBUFSIZE);
3787     if (buffer == NULL)
3788     {
3789 	close(fd_out);
3790 	close(fd_in);
3791 #ifdef HAVE_ACL
3792 	mch_free_acl(acl);
3793 #endif
3794 	return -1;
3795     }
3796 
3797     while ((n = read_eintr(fd_in, buffer, WRITEBUFSIZE)) > 0)
3798 	if (write_eintr(fd_out, buffer, n) != n)
3799 	{
3800 	    errmsg = _("E208: Error writing to \"%s\"");
3801 	    break;
3802 	}
3803 
3804     vim_free(buffer);
3805     close(fd_in);
3806     if (close(fd_out) < 0)
3807 	errmsg = _("E209: Error closing \"%s\"");
3808     if (n < 0)
3809     {
3810 	errmsg = _("E210: Error reading \"%s\"");
3811 	to = from;
3812     }
3813 #ifndef UNIX	    // for Unix mch_open() already set the permission
3814     mch_setperm(to, perm);
3815 #endif
3816 #ifdef HAVE_ACL
3817     mch_set_acl(to, acl);
3818     mch_free_acl(acl);
3819 #endif
3820 #if defined(HAVE_SELINUX) || defined(HAVE_SMACK)
3821     mch_copy_sec(from, to);
3822 #endif
3823     if (errmsg != NULL)
3824     {
3825 	semsg(errmsg, to);
3826 	return -1;
3827     }
3828     mch_remove(from);
3829     return 0;
3830 }
3831 
3832 static int already_warned = FALSE;
3833 
3834 /*
3835  * Check if any not hidden buffer has been changed.
3836  * Postpone the check if there are characters in the stuff buffer, a global
3837  * command is being executed, a mapping is being executed or an autocommand is
3838  * busy.
3839  * Returns TRUE if some message was written (screen should be redrawn and
3840  * cursor positioned).
3841  */
3842     int
3843 check_timestamps(
3844     int		focus)		// called for GUI focus event
3845 {
3846     buf_T	*buf;
3847     int		didit = 0;
3848     int		n;
3849 
3850     // Don't check timestamps while system() or another low-level function may
3851     // cause us to lose and gain focus.
3852     if (no_check_timestamps > 0)
3853 	return FALSE;
3854 
3855     // Avoid doing a check twice.  The OK/Reload dialog can cause a focus
3856     // event and we would keep on checking if the file is steadily growing.
3857     // Do check again after typing something.
3858     if (focus && did_check_timestamps)
3859     {
3860 	need_check_timestamps = TRUE;
3861 	return FALSE;
3862     }
3863 
3864     if (!stuff_empty() || global_busy || !typebuf_typed()
3865 			|| autocmd_busy || curbuf_lock > 0 || allbuf_lock > 0)
3866 	need_check_timestamps = TRUE;		// check later
3867     else
3868     {
3869 	++no_wait_return;
3870 	did_check_timestamps = TRUE;
3871 	already_warned = FALSE;
3872 	FOR_ALL_BUFFERS(buf)
3873 	{
3874 	    // Only check buffers in a window.
3875 	    if (buf->b_nwindows > 0)
3876 	    {
3877 		bufref_T bufref;
3878 
3879 		set_bufref(&bufref, buf);
3880 		n = buf_check_timestamp(buf, focus);
3881 		if (didit < n)
3882 		    didit = n;
3883 		if (n > 0 && !bufref_valid(&bufref))
3884 		{
3885 		    // Autocommands have removed the buffer, start at the
3886 		    // first one again.
3887 		    buf = firstbuf;
3888 		    continue;
3889 		}
3890 	    }
3891 	}
3892 	--no_wait_return;
3893 	need_check_timestamps = FALSE;
3894 	if (need_wait_return && didit == 2)
3895 	{
3896 	    // make sure msg isn't overwritten
3897 	    msg_puts("\n");
3898 	    out_flush();
3899 	}
3900     }
3901     return didit;
3902 }
3903 
3904 /*
3905  * Move all the lines from buffer "frombuf" to buffer "tobuf".
3906  * Return OK or FAIL.  When FAIL "tobuf" is incomplete and/or "frombuf" is not
3907  * empty.
3908  */
3909     static int
3910 move_lines(buf_T *frombuf, buf_T *tobuf)
3911 {
3912     buf_T	*tbuf = curbuf;
3913     int		retval = OK;
3914     linenr_T	lnum;
3915     char_u	*p;
3916 
3917     // Copy the lines in "frombuf" to "tobuf".
3918     curbuf = tobuf;
3919     for (lnum = 1; lnum <= frombuf->b_ml.ml_line_count; ++lnum)
3920     {
3921 	p = vim_strsave(ml_get_buf(frombuf, lnum, FALSE));
3922 	if (p == NULL || ml_append(lnum - 1, p, 0, FALSE) == FAIL)
3923 	{
3924 	    vim_free(p);
3925 	    retval = FAIL;
3926 	    break;
3927 	}
3928 	vim_free(p);
3929     }
3930 
3931     // Delete all the lines in "frombuf".
3932     if (retval != FAIL)
3933     {
3934 	curbuf = frombuf;
3935 	for (lnum = curbuf->b_ml.ml_line_count; lnum > 0; --lnum)
3936 	    if (ml_delete(lnum, FALSE) == FAIL)
3937 	    {
3938 		// Oops!  We could try putting back the saved lines, but that
3939 		// might fail again...
3940 		retval = FAIL;
3941 		break;
3942 	    }
3943     }
3944 
3945     curbuf = tbuf;
3946     return retval;
3947 }
3948 
3949 /*
3950  * Check if buffer "buf" has been changed.
3951  * Also check if the file for a new buffer unexpectedly appeared.
3952  * return 1 if a changed buffer was found.
3953  * return 2 if a message has been displayed.
3954  * return 0 otherwise.
3955  */
3956     int
3957 buf_check_timestamp(
3958     buf_T	*buf,
3959     int		focus UNUSED)	// called for GUI focus event
3960 {
3961     stat_T	st;
3962     int		stat_res;
3963     int		retval = 0;
3964     char_u	*path;
3965     char	*tbuf;
3966     char	*mesg = NULL;
3967     char	*mesg2 = "";
3968     int		helpmesg = FALSE;
3969     int		reload = FALSE;
3970     char	*reason;
3971 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
3972     int		can_reload = FALSE;
3973 #endif
3974     off_T	orig_size = buf->b_orig_size;
3975     int		orig_mode = buf->b_orig_mode;
3976 #ifdef FEAT_GUI
3977     int		save_mouse_correct = need_mouse_correct;
3978 #endif
3979     static int	busy = FALSE;
3980     int		n;
3981 #ifdef FEAT_EVAL
3982     char_u	*s;
3983 #endif
3984     bufref_T	bufref;
3985 
3986     set_bufref(&bufref, buf);
3987 
3988     // If there is no file name, the buffer is not loaded, 'buftype' is
3989     // set, we are in the middle of a save or being called recursively: ignore
3990     // this buffer.
3991     if (buf->b_ffname == NULL
3992 	    || buf->b_ml.ml_mfp == NULL
3993 	    || !bt_normal(buf)
3994 	    || buf->b_saving
3995 	    || busy
3996 #ifdef FEAT_NETBEANS_INTG
3997 	    || isNetbeansBuffer(buf)
3998 #endif
3999 #ifdef FEAT_TERMINAL
4000 	    || buf->b_term != NULL
4001 #endif
4002 	    )
4003 	return 0;
4004 
4005     if (       !(buf->b_flags & BF_NOTEDITED)
4006 	    && buf->b_mtime != 0
4007 	    && ((stat_res = mch_stat((char *)buf->b_ffname, &st)) < 0
4008 		|| time_differs((long)st.st_mtime, buf->b_mtime)
4009 		|| st.st_size != buf->b_orig_size
4010 #ifdef HAVE_ST_MODE
4011 		|| (int)st.st_mode != buf->b_orig_mode
4012 #else
4013 		|| mch_getperm(buf->b_ffname) != buf->b_orig_mode
4014 #endif
4015 		))
4016     {
4017 	long prev_b_mtime = buf->b_mtime;
4018 
4019 	retval = 1;
4020 
4021 	// set b_mtime to stop further warnings (e.g., when executing
4022 	// FileChangedShell autocmd)
4023 	if (stat_res < 0)
4024 	{
4025 	    // Check the file again later to see if it re-appears.
4026 	    buf->b_mtime = -1;
4027 	    buf->b_orig_size = 0;
4028 	    buf->b_orig_mode = 0;
4029 	}
4030 	else
4031 	    buf_store_time(buf, &st, buf->b_ffname);
4032 
4033 	// Don't do anything for a directory.  Might contain the file
4034 	// explorer.
4035 	if (mch_isdir(buf->b_fname))
4036 	    ;
4037 
4038 	/*
4039 	 * If 'autoread' is set, the buffer has no changes and the file still
4040 	 * exists, reload the buffer.  Use the buffer-local option value if it
4041 	 * was set, the global option value otherwise.
4042 	 */
4043 	else if ((buf->b_p_ar >= 0 ? buf->b_p_ar : p_ar)
4044 				       && !bufIsChanged(buf) && stat_res >= 0)
4045 	    reload = TRUE;
4046 	else
4047 	{
4048 	    if (stat_res < 0)
4049 		reason = "deleted";
4050 	    else if (bufIsChanged(buf))
4051 		reason = "conflict";
4052 	    /*
4053 	     * Check if the file contents really changed to avoid giving a
4054 	     * warning when only the timestamp was set (e.g., checked out of
4055 	     * CVS).  Always warn when the buffer was changed.
4056 	     */
4057 	    else if (orig_size != buf->b_orig_size || buf_contents_changed(buf))
4058 		reason = "changed";
4059 	    else if (orig_mode != buf->b_orig_mode)
4060 		reason = "mode";
4061 	    else
4062 		reason = "time";
4063 
4064 	    /*
4065 	     * Only give the warning if there are no FileChangedShell
4066 	     * autocommands.
4067 	     * Avoid being called recursively by setting "busy".
4068 	     */
4069 	    busy = TRUE;
4070 #ifdef FEAT_EVAL
4071 	    set_vim_var_string(VV_FCS_REASON, (char_u *)reason, -1);
4072 	    set_vim_var_string(VV_FCS_CHOICE, (char_u *)"", -1);
4073 #endif
4074 	    ++allbuf_lock;
4075 	    n = apply_autocmds(EVENT_FILECHANGEDSHELL,
4076 				      buf->b_fname, buf->b_fname, FALSE, buf);
4077 	    --allbuf_lock;
4078 	    busy = FALSE;
4079 	    if (n)
4080 	    {
4081 		if (!bufref_valid(&bufref))
4082 		    emsg(_("E246: FileChangedShell autocommand deleted buffer"));
4083 #ifdef FEAT_EVAL
4084 		s = get_vim_var_str(VV_FCS_CHOICE);
4085 		if (STRCMP(s, "reload") == 0 && *reason != 'd')
4086 		    reload = TRUE;
4087 		else if (STRCMP(s, "ask") == 0)
4088 		    n = FALSE;
4089 		else
4090 #endif
4091 		    return 2;
4092 	    }
4093 	    if (!n)
4094 	    {
4095 		if (*reason == 'd')
4096 		{
4097 		    // Only give the message once.
4098 		    if (prev_b_mtime != -1)
4099 			mesg = _("E211: File \"%s\" no longer available");
4100 		}
4101 		else
4102 		{
4103 		    helpmesg = TRUE;
4104 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
4105 		    can_reload = TRUE;
4106 #endif
4107 		    if (reason[2] == 'n')
4108 		    {
4109 			mesg = _("W12: Warning: File \"%s\" has changed and the buffer was changed in Vim as well");
4110 			mesg2 = _("See \":help W12\" for more info.");
4111 		    }
4112 		    else if (reason[1] == 'h')
4113 		    {
4114 			mesg = _("W11: Warning: File \"%s\" has changed since editing started");
4115 			mesg2 = _("See \":help W11\" for more info.");
4116 		    }
4117 		    else if (*reason == 'm')
4118 		    {
4119 			mesg = _("W16: Warning: Mode of file \"%s\" has changed since editing started");
4120 			mesg2 = _("See \":help W16\" for more info.");
4121 		    }
4122 		    else
4123 			// Only timestamp changed, store it to avoid a warning
4124 			// in check_mtime() later.
4125 			buf->b_mtime_read = buf->b_mtime;
4126 		}
4127 	    }
4128 	}
4129 
4130     }
4131     else if ((buf->b_flags & BF_NEW) && !(buf->b_flags & BF_NEW_W)
4132 						&& vim_fexists(buf->b_ffname))
4133     {
4134 	retval = 1;
4135 	mesg = _("W13: Warning: File \"%s\" has been created after editing started");
4136 	buf->b_flags |= BF_NEW_W;
4137 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
4138 	can_reload = TRUE;
4139 #endif
4140     }
4141 
4142     if (mesg != NULL)
4143     {
4144 	path = home_replace_save(buf, buf->b_fname);
4145 	if (path != NULL)
4146 	{
4147 	    if (!helpmesg)
4148 		mesg2 = "";
4149 	    tbuf = alloc(STRLEN(path) + STRLEN(mesg) + STRLEN(mesg2) + 2);
4150 	    sprintf(tbuf, mesg, path);
4151 #ifdef FEAT_EVAL
4152 	    // Set warningmsg here, before the unimportant and output-specific
4153 	    // mesg2 has been appended.
4154 	    set_vim_var_string(VV_WARNINGMSG, (char_u *)tbuf, -1);
4155 #endif
4156 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG)
4157 	    if (can_reload)
4158 	    {
4159 		if (*mesg2 != NUL)
4160 		{
4161 		    STRCAT(tbuf, "\n");
4162 		    STRCAT(tbuf, mesg2);
4163 		}
4164 		if (do_dialog(VIM_WARNING, (char_u *)_("Warning"),
4165 			    (char_u *)tbuf,
4166 			  (char_u *)_("&OK\n&Load File"), 1, NULL, TRUE) == 2)
4167 		    reload = TRUE;
4168 	    }
4169 	    else
4170 #endif
4171 	    if (State > NORMAL_BUSY || (State & CMDLINE) || already_warned)
4172 	    {
4173 		if (*mesg2 != NUL)
4174 		{
4175 		    STRCAT(tbuf, "; ");
4176 		    STRCAT(tbuf, mesg2);
4177 		}
4178 		emsg(tbuf);
4179 		retval = 2;
4180 	    }
4181 	    else
4182 	    {
4183 		if (!autocmd_busy)
4184 		{
4185 		    msg_start();
4186 		    msg_puts_attr(tbuf, HL_ATTR(HLF_E) + MSG_HIST);
4187 		    if (*mesg2 != NUL)
4188 			msg_puts_attr(mesg2, HL_ATTR(HLF_W) + MSG_HIST);
4189 		    msg_clr_eos();
4190 		    (void)msg_end();
4191 		    if (emsg_silent == 0)
4192 		    {
4193 			out_flush();
4194 #ifdef FEAT_GUI
4195 			if (!focus)
4196 #endif
4197 			    // give the user some time to think about it
4198 			    ui_delay(1004L, TRUE);
4199 
4200 			// don't redraw and erase the message
4201 			redraw_cmdline = FALSE;
4202 		    }
4203 		}
4204 		already_warned = TRUE;
4205 	    }
4206 
4207 	    vim_free(path);
4208 	    vim_free(tbuf);
4209 	}
4210     }
4211 
4212     if (reload)
4213     {
4214 	// Reload the buffer.
4215 	buf_reload(buf, orig_mode);
4216 #ifdef FEAT_PERSISTENT_UNDO
4217 	if (buf->b_p_udf && buf->b_ffname != NULL)
4218 	{
4219 	    char_u	    hash[UNDO_HASH_SIZE];
4220 	    buf_T	    *save_curbuf = curbuf;
4221 
4222 	    // Any existing undo file is unusable, write it now.
4223 	    curbuf = buf;
4224 	    u_compute_hash(hash);
4225 	    u_write_undo(NULL, FALSE, buf, hash);
4226 	    curbuf = save_curbuf;
4227 	}
4228 #endif
4229     }
4230 
4231     // Trigger FileChangedShell when the file was changed in any way.
4232     if (bufref_valid(&bufref) && retval != 0)
4233 	(void)apply_autocmds(EVENT_FILECHANGEDSHELLPOST,
4234 				      buf->b_fname, buf->b_fname, FALSE, buf);
4235 #ifdef FEAT_GUI
4236     // restore this in case an autocommand has set it; it would break
4237     // 'mousefocus'
4238     need_mouse_correct = save_mouse_correct;
4239 #endif
4240 
4241     return retval;
4242 }
4243 
4244 /*
4245  * Reload a buffer that is already loaded.
4246  * Used when the file was changed outside of Vim.
4247  * "orig_mode" is buf->b_orig_mode before the need for reloading was detected.
4248  * buf->b_orig_mode may have been reset already.
4249  */
4250     void
4251 buf_reload(buf_T *buf, int orig_mode)
4252 {
4253     exarg_T	ea;
4254     pos_T	old_cursor;
4255     linenr_T	old_topline;
4256     int		old_ro = buf->b_p_ro;
4257     buf_T	*savebuf;
4258     bufref_T	bufref;
4259     int		saved = OK;
4260     aco_save_T	aco;
4261     int		flags = READ_NEW;
4262 
4263     // set curwin/curbuf for "buf" and save some things
4264     aucmd_prepbuf(&aco, buf);
4265 
4266     // We only want to read the text from the file, not reset the syntax
4267     // highlighting, clear marks, diff status, etc.  Force the fileformat
4268     // and encoding to be the same.
4269     if (prep_exarg(&ea, buf) == OK)
4270     {
4271 	old_cursor = curwin->w_cursor;
4272 	old_topline = curwin->w_topline;
4273 
4274 	if (p_ur < 0 || curbuf->b_ml.ml_line_count <= p_ur)
4275 	{
4276 	    // Save all the text, so that the reload can be undone.
4277 	    // Sync first so that this is a separate undo-able action.
4278 	    u_sync(FALSE);
4279 	    saved = u_savecommon(0, curbuf->b_ml.ml_line_count + 1, 0, TRUE);
4280 	    flags |= READ_KEEP_UNDO;
4281 	}
4282 
4283 	/*
4284 	 * To behave like when a new file is edited (matters for
4285 	 * BufReadPost autocommands) we first need to delete the current
4286 	 * buffer contents.  But if reading the file fails we should keep
4287 	 * the old contents.  Can't use memory only, the file might be
4288 	 * too big.  Use a hidden buffer to move the buffer contents to.
4289 	 */
4290 	if (BUFEMPTY() || saved == FAIL)
4291 	    savebuf = NULL;
4292 	else
4293 	{
4294 	    // Allocate a buffer without putting it in the buffer list.
4295 	    savebuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
4296 	    set_bufref(&bufref, savebuf);
4297 	    if (savebuf != NULL && buf == curbuf)
4298 	    {
4299 		// Open the memline.
4300 		curbuf = savebuf;
4301 		curwin->w_buffer = savebuf;
4302 		saved = ml_open(curbuf);
4303 		curbuf = buf;
4304 		curwin->w_buffer = buf;
4305 	    }
4306 	    if (savebuf == NULL || saved == FAIL || buf != curbuf
4307 				      || move_lines(buf, savebuf) == FAIL)
4308 	    {
4309 		semsg(_("E462: Could not prepare for reloading \"%s\""),
4310 							    buf->b_fname);
4311 		saved = FAIL;
4312 	    }
4313 	}
4314 
4315 	if (saved == OK)
4316 	{
4317 	    curbuf->b_flags |= BF_CHECK_RO;	// check for RO again
4318 	    keep_filetype = TRUE;		// don't detect 'filetype'
4319 	    if (readfile(buf->b_ffname, buf->b_fname, (linenr_T)0,
4320 			(linenr_T)0,
4321 			(linenr_T)MAXLNUM, &ea, flags) != OK)
4322 	    {
4323 #if defined(FEAT_EVAL)
4324 		if (!aborting())
4325 #endif
4326 		    semsg(_("E321: Could not reload \"%s\""), buf->b_fname);
4327 		if (savebuf != NULL && bufref_valid(&bufref) && buf == curbuf)
4328 		{
4329 		    // Put the text back from the save buffer.  First
4330 		    // delete any lines that readfile() added.
4331 		    while (!BUFEMPTY())
4332 			if (ml_delete(buf->b_ml.ml_line_count, FALSE) == FAIL)
4333 			    break;
4334 		    (void)move_lines(savebuf, buf);
4335 		}
4336 	    }
4337 	    else if (buf == curbuf)  // "buf" still valid
4338 	    {
4339 		// Mark the buffer as unmodified and free undo info.
4340 		unchanged(buf, TRUE, TRUE);
4341 		if ((flags & READ_KEEP_UNDO) == 0)
4342 		{
4343 		    u_blockfree(buf);
4344 		    u_clearall(buf);
4345 		}
4346 		else
4347 		{
4348 		    // Mark all undo states as changed.
4349 		    u_unchanged(curbuf);
4350 		}
4351 	    }
4352 	}
4353 	vim_free(ea.cmd);
4354 
4355 	if (savebuf != NULL && bufref_valid(&bufref))
4356 	    wipe_buffer(savebuf, FALSE);
4357 
4358 #ifdef FEAT_DIFF
4359 	// Invalidate diff info if necessary.
4360 	diff_invalidate(curbuf);
4361 #endif
4362 
4363 	// Restore the topline and cursor position and check it (lines may
4364 	// have been removed).
4365 	if (old_topline > curbuf->b_ml.ml_line_count)
4366 	    curwin->w_topline = curbuf->b_ml.ml_line_count;
4367 	else
4368 	    curwin->w_topline = old_topline;
4369 	curwin->w_cursor = old_cursor;
4370 	check_cursor();
4371 	update_topline();
4372 	keep_filetype = FALSE;
4373 #ifdef FEAT_FOLDING
4374 	{
4375 	    win_T	*wp;
4376 	    tabpage_T	*tp;
4377 
4378 	    // Update folds unless they are defined manually.
4379 	    FOR_ALL_TAB_WINDOWS(tp, wp)
4380 		if (wp->w_buffer == curwin->w_buffer
4381 			&& !foldmethodIsManual(wp))
4382 		    foldUpdateAll(wp);
4383 	}
4384 #endif
4385 	// If the mode didn't change and 'readonly' was set, keep the old
4386 	// value; the user probably used the ":view" command.  But don't
4387 	// reset it, might have had a read error.
4388 	if (orig_mode == curbuf->b_orig_mode)
4389 	    curbuf->b_p_ro |= old_ro;
4390 
4391 	// Modelines must override settings done by autocommands.
4392 	do_modelines(0);
4393     }
4394 
4395     // restore curwin/curbuf and a few other things
4396     aucmd_restbuf(&aco);
4397     // Careful: autocommands may have made "buf" invalid!
4398 }
4399 
4400     void
4401 buf_store_time(buf_T *buf, stat_T *st, char_u *fname UNUSED)
4402 {
4403     buf->b_mtime = (long)st->st_mtime;
4404     buf->b_orig_size = st->st_size;
4405 #ifdef HAVE_ST_MODE
4406     buf->b_orig_mode = (int)st->st_mode;
4407 #else
4408     buf->b_orig_mode = mch_getperm(fname);
4409 #endif
4410 }
4411 
4412 /*
4413  * Adjust the line with missing eol, used for the next write.
4414  * Used for do_filter(), when the input lines for the filter are deleted.
4415  */
4416     void
4417 write_lnum_adjust(linenr_T offset)
4418 {
4419     if (curbuf->b_no_eol_lnum != 0)	// only if there is a missing eol
4420 	curbuf->b_no_eol_lnum += offset;
4421 }
4422 
4423 #if defined(TEMPDIRNAMES) || defined(FEAT_EVAL) || defined(PROTO)
4424 /*
4425  * Core part of "readdir()" function.
4426  * Retrieve the list of files/directories of "path" into "gap".
4427  * Return OK for success, FAIL for failure.
4428  */
4429     int
4430 readdir_core(
4431     garray_T	*gap,
4432     char_u	*path,
4433     void	*context,
4434     int		(*checkitem)(void *context, char_u *name))
4435 {
4436     int		failed = FALSE;
4437     char_u	*p;
4438 
4439     ga_init2(gap, (int)sizeof(char *), 20);
4440 
4441 # ifdef MSWIN
4442     {
4443 	char_u		*buf;
4444 	int		ok;
4445 	HANDLE		hFind = INVALID_HANDLE_VALUE;
4446 	WIN32_FIND_DATAW    wfb;
4447 	WCHAR		*wn = NULL;	// UTF-16 name, NULL when not used.
4448 
4449 	buf = alloc(MAXPATHL);
4450 	if (buf == NULL)
4451 	    return FAIL;
4452 	STRNCPY(buf, path, MAXPATHL-5);
4453 	p = buf + STRLEN(buf);
4454 	MB_PTR_BACK(buf, p);
4455 	if (*p == '\\' || *p == '/')
4456 	    *p = NUL;
4457 	STRCAT(buf, "\\*");
4458 
4459 	wn = enc_to_utf16(buf, NULL);
4460 	if (wn != NULL)
4461 	    hFind = FindFirstFileW(wn, &wfb);
4462 	ok = (hFind != INVALID_HANDLE_VALUE);
4463 	if (!ok)
4464 	{
4465 	    failed = TRUE;
4466 	    smsg(_(e_notopen), path);
4467 	}
4468 	else
4469 	{
4470 	    while (ok)
4471 	    {
4472 		int	ignore;
4473 
4474 		p = utf16_to_enc(wfb.cFileName, NULL);   // p is allocated here
4475 		if (p == NULL)
4476 		    break;  // out of memory
4477 
4478 		ignore = p[0] == '.' && (p[1] == NUL
4479 						  || (p[1] == '.' && p[2] == NUL));
4480 		if (!ignore && checkitem != NULL)
4481 		{
4482 		    int r = checkitem(context, p);
4483 
4484 		    if (r < 0)
4485 		    {
4486 			vim_free(p);
4487 			break;
4488 		    }
4489 		    if (r == 0)
4490 			ignore = TRUE;
4491 		}
4492 
4493 		if (!ignore)
4494 		{
4495 		    if (ga_grow(gap, 1) == OK)
4496 			((char_u**)gap->ga_data)[gap->ga_len++] = vim_strsave(p);
4497 		    else
4498 		    {
4499 			failed = TRUE;
4500 			vim_free(p);
4501 			break;
4502 		    }
4503 		}
4504 
4505 		vim_free(p);
4506 		ok = FindNextFileW(hFind, &wfb);
4507 	    }
4508 	    FindClose(hFind);
4509 	}
4510 
4511 	vim_free(buf);
4512 	vim_free(wn);
4513     }
4514 # else
4515     {
4516 	DIR			*dirp;
4517 	struct dirent	*dp;
4518 
4519 	dirp = opendir((char *)path);
4520 	if (dirp == NULL)
4521 	{
4522 	    failed = TRUE;
4523 	    smsg(_(e_notopen), path);
4524 	}
4525 	else
4526 	{
4527 	    for (;;)
4528 	    {
4529 		int	ignore;
4530 
4531 		dp = readdir(dirp);
4532 		if (dp == NULL)
4533 		    break;
4534 		p = (char_u *)dp->d_name;
4535 
4536 		ignore = p[0] == '.' &&
4537 			(p[1] == NUL ||
4538 			 (p[1] == '.' && p[2] == NUL));
4539 		if (!ignore && checkitem != NULL)
4540 		{
4541 		    int r = checkitem(context, p);
4542 
4543 		    if (r < 0)
4544 			break;
4545 		    if (r == 0)
4546 			ignore = TRUE;
4547 		}
4548 
4549 		if (!ignore)
4550 		{
4551 		    if (ga_grow(gap, 1) == OK)
4552 			((char_u**)gap->ga_data)[gap->ga_len++] = vim_strsave(p);
4553 		    else
4554 		    {
4555 			failed = TRUE;
4556 			break;
4557 		    }
4558 		}
4559 	    }
4560 
4561 	    closedir(dirp);
4562 	}
4563     }
4564 # endif
4565 
4566     if (!failed && gap->ga_len > 0)
4567 	sort_strings((char_u **)gap->ga_data, gap->ga_len);
4568 
4569     return failed ? FAIL : OK;
4570 }
4571 
4572 /*
4573  * Delete "name" and everything in it, recursively.
4574  * return 0 for success, -1 if some file was not deleted.
4575  */
4576     int
4577 delete_recursive(char_u *name)
4578 {
4579     int result = 0;
4580     int		i;
4581     char_u	*exp;
4582     garray_T	ga;
4583 
4584     // A symbolic link to a directory itself is deleted, not the directory it
4585     // points to.
4586     if (
4587 # if defined(UNIX) || defined(MSWIN)
4588 	 mch_isrealdir(name)
4589 # else
4590 	 mch_isdir(name)
4591 # endif
4592 	    )
4593     {
4594 	exp = vim_strsave(name);
4595 	if (exp == NULL)
4596 	    return -1;
4597 	if (readdir_core(&ga, exp, NULL, NULL) == OK)
4598 	{
4599 	    for (i = 0; i < ga.ga_len; ++i)
4600 	    {
4601 		vim_snprintf((char *)NameBuff, MAXPATHL, "%s/%s", exp,
4602 					    ((char_u **)ga.ga_data)[i]);
4603 		if (delete_recursive(NameBuff) != 0)
4604 		    result = -1;
4605 	    }
4606 	    ga_clear_strings(&ga);
4607 	}
4608 	else
4609 	    result = -1;
4610 	(void)mch_rmdir(exp);
4611 	vim_free(exp);
4612     }
4613     else
4614 	result = mch_remove(name) == 0 ? 0 : -1;
4615 
4616     return result;
4617 }
4618 #endif
4619 
4620 #if defined(TEMPDIRNAMES) || defined(PROTO)
4621 static long	temp_count = 0;		// Temp filename counter.
4622 
4623 # if defined(UNIX) && defined(HAVE_FLOCK) && defined(HAVE_DIRFD)
4624 /*
4625  * Open temporary directory and take file lock to prevent
4626  * to be auto-cleaned.
4627  */
4628    static void
4629 vim_opentempdir(void)
4630 {
4631     DIR *dp = NULL;
4632 
4633     if (vim_tempdir_dp != NULL)
4634 	return;
4635 
4636     dp = opendir((const char*)vim_tempdir);
4637 
4638     if (dp != NULL)
4639     {
4640 	vim_tempdir_dp = dp;
4641 	flock(dirfd(vim_tempdir_dp), LOCK_SH);
4642     }
4643 }
4644 
4645 /*
4646  * Close temporary directory - it automatically release file lock.
4647  */
4648    static void
4649 vim_closetempdir(void)
4650 {
4651     if (vim_tempdir_dp != NULL)
4652     {
4653 	closedir(vim_tempdir_dp);
4654 	vim_tempdir_dp = NULL;
4655     }
4656 }
4657 # endif
4658 
4659 /*
4660  * Delete the temp directory and all files it contains.
4661  */
4662     void
4663 vim_deltempdir(void)
4664 {
4665     if (vim_tempdir != NULL)
4666     {
4667 # if defined(UNIX) && defined(HAVE_FLOCK) && defined(HAVE_DIRFD)
4668 	vim_closetempdir();
4669 # endif
4670 	// remove the trailing path separator
4671 	gettail(vim_tempdir)[-1] = NUL;
4672 	delete_recursive(vim_tempdir);
4673 	VIM_CLEAR(vim_tempdir);
4674     }
4675 }
4676 
4677 /*
4678  * Directory "tempdir" was created.  Expand this name to a full path and put
4679  * it in "vim_tempdir".  This avoids that using ":cd" would confuse us.
4680  * "tempdir" must be no longer than MAXPATHL.
4681  */
4682     static void
4683 vim_settempdir(char_u *tempdir)
4684 {
4685     char_u	*buf;
4686 
4687     buf = alloc(MAXPATHL + 2);
4688     if (buf != NULL)
4689     {
4690 	if (vim_FullName(tempdir, buf, MAXPATHL, FALSE) == FAIL)
4691 	    STRCPY(buf, tempdir);
4692 	add_pathsep(buf);
4693 	vim_tempdir = vim_strsave(buf);
4694 # if defined(UNIX) && defined(HAVE_FLOCK) && defined(HAVE_DIRFD)
4695 	vim_opentempdir();
4696 # endif
4697 	vim_free(buf);
4698     }
4699 }
4700 #endif
4701 
4702 /*
4703  * vim_tempname(): Return a unique name that can be used for a temp file.
4704  *
4705  * The temp file is NOT guaranteed to be created.  If "keep" is FALSE it is
4706  * guaranteed to NOT be created.
4707  *
4708  * The returned pointer is to allocated memory.
4709  * The returned pointer is NULL if no valid name was found.
4710  */
4711     char_u  *
4712 vim_tempname(
4713     int	    extra_char UNUSED,  // char to use in the name instead of '?'
4714     int	    keep UNUSED)
4715 {
4716 #ifdef USE_TMPNAM
4717     char_u	itmp[L_tmpnam];	// use tmpnam()
4718 #elif defined(MSWIN)
4719     WCHAR	itmp[TEMPNAMELEN];
4720 #else
4721     char_u	itmp[TEMPNAMELEN];
4722 #endif
4723 
4724 #ifdef TEMPDIRNAMES
4725     static char	*(tempdirs[]) = {TEMPDIRNAMES};
4726     int		i;
4727 # ifndef EEXIST
4728     stat_T	st;
4729 # endif
4730 
4731     /*
4732      * This will create a directory for private use by this instance of Vim.
4733      * This is done once, and the same directory is used for all temp files.
4734      * This method avoids security problems because of symlink attacks et al.
4735      * It's also a bit faster, because we only need to check for an existing
4736      * file when creating the directory and not for each temp file.
4737      */
4738     if (vim_tempdir == NULL)
4739     {
4740 	/*
4741 	 * Try the entries in TEMPDIRNAMES to create the temp directory.
4742 	 */
4743 	for (i = 0; i < (int)(sizeof(tempdirs) / sizeof(char *)); ++i)
4744 	{
4745 # ifndef HAVE_MKDTEMP
4746 	    size_t	itmplen;
4747 	    long	nr;
4748 	    long	off;
4749 # endif
4750 
4751 	    // Expand $TMP, leave room for "/v1100000/999999999".
4752 	    // Skip the directory check if the expansion fails.
4753 	    expand_env((char_u *)tempdirs[i], itmp, TEMPNAMELEN - 20);
4754 	    if (itmp[0] != '$' && mch_isdir(itmp))
4755 	    {
4756 		// directory exists
4757 		add_pathsep(itmp);
4758 
4759 # ifdef HAVE_MKDTEMP
4760 		{
4761 #  if defined(UNIX) || defined(VMS)
4762 		    // Make sure the umask doesn't remove the executable bit.
4763 		    // "repl" has been reported to use "177".
4764 		    mode_t	umask_save = umask(077);
4765 #  endif
4766 		    // Leave room for filename
4767 		    STRCAT(itmp, "vXXXXXX");
4768 		    if (mkdtemp((char *)itmp) != NULL)
4769 			vim_settempdir(itmp);
4770 #  if defined(UNIX) || defined(VMS)
4771 		    (void)umask(umask_save);
4772 #  endif
4773 		}
4774 # else
4775 		// Get an arbitrary number of up to 6 digits.  When it's
4776 		// unlikely that it already exists it will be faster,
4777 		// otherwise it doesn't matter.  The use of mkdir() avoids any
4778 		// security problems because of the predictable number.
4779 		nr = (mch_get_pid() + (long)time(NULL)) % 1000000L;
4780 		itmplen = STRLEN(itmp);
4781 
4782 		// Try up to 10000 different values until we find a name that
4783 		// doesn't exist.
4784 		for (off = 0; off < 10000L; ++off)
4785 		{
4786 		    int		r;
4787 #  if defined(UNIX) || defined(VMS)
4788 		    mode_t	umask_save;
4789 #  endif
4790 
4791 		    sprintf((char *)itmp + itmplen, "v%ld", nr + off);
4792 #  ifndef EEXIST
4793 		    // If mkdir() does not set errno to EEXIST, check for
4794 		    // existing file here.  There is a race condition then,
4795 		    // although it's fail-safe.
4796 		    if (mch_stat((char *)itmp, &st) >= 0)
4797 			continue;
4798 #  endif
4799 #  if defined(UNIX) || defined(VMS)
4800 		    // Make sure the umask doesn't remove the executable bit.
4801 		    // "repl" has been reported to use "177".
4802 		    umask_save = umask(077);
4803 #  endif
4804 		    r = vim_mkdir(itmp, 0700);
4805 #  if defined(UNIX) || defined(VMS)
4806 		    (void)umask(umask_save);
4807 #  endif
4808 		    if (r == 0)
4809 		    {
4810 			vim_settempdir(itmp);
4811 			break;
4812 		    }
4813 #  ifdef EEXIST
4814 		    // If the mkdir() didn't fail because the file/dir exists,
4815 		    // we probably can't create any dir here, try another
4816 		    // place.
4817 		    if (errno != EEXIST)
4818 #  endif
4819 			break;
4820 		}
4821 # endif // HAVE_MKDTEMP
4822 		if (vim_tempdir != NULL)
4823 		    break;
4824 	    }
4825 	}
4826     }
4827 
4828     if (vim_tempdir != NULL)
4829     {
4830 	// There is no need to check if the file exists, because we own the
4831 	// directory and nobody else creates a file in it.
4832 	sprintf((char *)itmp, "%s%ld", vim_tempdir, temp_count++);
4833 	return vim_strsave(itmp);
4834     }
4835 
4836     return NULL;
4837 
4838 #else // TEMPDIRNAMES
4839 
4840 # ifdef MSWIN
4841     WCHAR	wszTempFile[_MAX_PATH + 1];
4842     WCHAR	buf4[4];
4843     char_u	*retval;
4844     char_u	*p;
4845 
4846     wcscpy(itmp, L"");
4847     if (GetTempPathW(_MAX_PATH, wszTempFile) == 0)
4848     {
4849 	wszTempFile[0] = L'.';	// GetTempPathW() failed, use current dir
4850 	wszTempFile[1] = NUL;
4851     }
4852     wcscpy(buf4, L"VIM");
4853     buf4[2] = extra_char;   // make it "VIa", "VIb", etc.
4854     if (GetTempFileNameW(wszTempFile, buf4, 0, itmp) == 0)
4855 	return NULL;
4856     if (!keep)
4857 	// GetTempFileName() will create the file, we don't want that
4858 	(void)DeleteFileW(itmp);
4859 
4860     // Backslashes in a temp file name cause problems when filtering with
4861     // "sh".  NOTE: This also checks 'shellcmdflag' to help those people who
4862     // didn't set 'shellslash'.
4863     retval = utf16_to_enc(itmp, NULL);
4864     if (*p_shcf == '-' || p_ssl)
4865 	for (p = retval; *p; ++p)
4866 	    if (*p == '\\')
4867 		*p = '/';
4868     return retval;
4869 
4870 # else // MSWIN
4871 
4872 #  ifdef USE_TMPNAM
4873     char_u	*p;
4874 
4875     // tmpnam() will make its own name
4876     p = tmpnam((char *)itmp);
4877     if (p == NULL || *p == NUL)
4878 	return NULL;
4879 #  else
4880     char_u	*p;
4881 
4882 #   ifdef VMS_TEMPNAM
4883     // mktemp() is not working on VMS.  It seems to be
4884     // a do-nothing function. Therefore we use tempnam().
4885     sprintf((char *)itmp, "VIM%c", extra_char);
4886     p = (char_u *)tempnam("tmp:", (char *)itmp);
4887     if (p != NULL)
4888     {
4889 	// VMS will use '.LIS' if we don't explicitly specify an extension,
4890 	// and VIM will then be unable to find the file later
4891 	STRCPY(itmp, p);
4892 	STRCAT(itmp, ".txt");
4893 	free(p);
4894     }
4895     else
4896 	return NULL;
4897 #   else
4898     STRCPY(itmp, TEMPNAME);
4899     if ((p = vim_strchr(itmp, '?')) != NULL)
4900 	*p = extra_char;
4901     if (mktemp((char *)itmp) == NULL)
4902 	return NULL;
4903 #   endif
4904 #  endif
4905 
4906     return vim_strsave(itmp);
4907 # endif // MSWIN
4908 #endif // TEMPDIRNAMES
4909 }
4910 
4911 #if defined(BACKSLASH_IN_FILENAME) || defined(PROTO)
4912 /*
4913  * Convert all backslashes in fname to forward slashes in-place, unless when
4914  * it looks like a URL.
4915  */
4916     void
4917 forward_slash(char_u *fname)
4918 {
4919     char_u	*p;
4920 
4921     if (path_with_url(fname))
4922 	return;
4923     for (p = fname; *p != NUL; ++p)
4924 	// The Big5 encoding can have '\' in the trail byte.
4925 	if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
4926 	    ++p;
4927 	else if (*p == '\\')
4928 	    *p = '/';
4929 }
4930 #endif
4931 
4932 /*
4933  * Try matching a filename with a "pattern" ("prog" is NULL), or use the
4934  * precompiled regprog "prog" ("pattern" is NULL).  That avoids calling
4935  * vim_regcomp() often.
4936  * Used for autocommands and 'wildignore'.
4937  * Returns TRUE if there is a match, FALSE otherwise.
4938  */
4939     int
4940 match_file_pat(
4941     char_u	*pattern,		// pattern to match with
4942     regprog_T	**prog,			// pre-compiled regprog or NULL
4943     char_u	*fname,			// full path of file name
4944     char_u	*sfname,		// short file name or NULL
4945     char_u	*tail,			// tail of path
4946     int		allow_dirs)		// allow matching with dir
4947 {
4948     regmatch_T	regmatch;
4949     int		result = FALSE;
4950 
4951     regmatch.rm_ic = p_fic; // ignore case if 'fileignorecase' is set
4952     if (prog != NULL)
4953 	regmatch.regprog = *prog;
4954     else
4955 	regmatch.regprog = vim_regcomp(pattern, RE_MAGIC);
4956 
4957     /*
4958      * Try for a match with the pattern with:
4959      * 1. the full file name, when the pattern has a '/'.
4960      * 2. the short file name, when the pattern has a '/'.
4961      * 3. the tail of the file name, when the pattern has no '/'.
4962      */
4963     if (regmatch.regprog != NULL
4964 	     && ((allow_dirs
4965 		     && (vim_regexec(&regmatch, fname, (colnr_T)0)
4966 			 || (sfname != NULL
4967 			     && vim_regexec(&regmatch, sfname, (colnr_T)0))))
4968 		 || (!allow_dirs && vim_regexec(&regmatch, tail, (colnr_T)0))))
4969 	result = TRUE;
4970 
4971     if (prog != NULL)
4972 	*prog = regmatch.regprog;
4973     else
4974 	vim_regfree(regmatch.regprog);
4975     return result;
4976 }
4977 
4978 #if defined(FEAT_WILDIGN) || defined(PROTO)
4979 /*
4980  * Return TRUE if a file matches with a pattern in "list".
4981  * "list" is a comma-separated list of patterns, like 'wildignore'.
4982  * "sfname" is the short file name or NULL, "ffname" the long file name.
4983  */
4984     int
4985 match_file_list(char_u *list, char_u *sfname, char_u *ffname)
4986 {
4987     char_u	buf[100];
4988     char_u	*tail;
4989     char_u	*regpat;
4990     char	allow_dirs;
4991     int		match;
4992     char_u	*p;
4993 
4994     tail = gettail(sfname);
4995 
4996     // try all patterns in 'wildignore'
4997     p = list;
4998     while (*p)
4999     {
5000 	copy_option_part(&p, buf, 100, ",");
5001 	regpat = file_pat_to_reg_pat(buf, NULL, &allow_dirs, FALSE);
5002 	if (regpat == NULL)
5003 	    break;
5004 	match = match_file_pat(regpat, NULL, ffname, sfname,
5005 						       tail, (int)allow_dirs);
5006 	vim_free(regpat);
5007 	if (match)
5008 	    return TRUE;
5009     }
5010     return FALSE;
5011 }
5012 #endif
5013 
5014 /*
5015  * Convert the given pattern "pat" which has shell style wildcards in it, into
5016  * a regular expression, and return the result in allocated memory.  If there
5017  * is a directory path separator to be matched, then TRUE is put in
5018  * allow_dirs, otherwise FALSE is put there -- webb.
5019  * Handle backslashes before special characters, like "\*" and "\ ".
5020  *
5021  * Returns NULL when out of memory.
5022  */
5023     char_u *
5024 file_pat_to_reg_pat(
5025     char_u	*pat,
5026     char_u	*pat_end,	// first char after pattern or NULL
5027     char	*allow_dirs,	// Result passed back out in here
5028     int		no_bslash UNUSED) // Don't use a backward slash as pathsep
5029 {
5030     int		size = 2; // '^' at start, '$' at end
5031     char_u	*endp;
5032     char_u	*reg_pat;
5033     char_u	*p;
5034     int		i;
5035     int		nested = 0;
5036     int		add_dollar = TRUE;
5037 
5038     if (allow_dirs != NULL)
5039 	*allow_dirs = FALSE;
5040     if (pat_end == NULL)
5041 	pat_end = pat + STRLEN(pat);
5042 
5043     for (p = pat; p < pat_end; p++)
5044     {
5045 	switch (*p)
5046 	{
5047 	    case '*':
5048 	    case '.':
5049 	    case ',':
5050 	    case '{':
5051 	    case '}':
5052 	    case '~':
5053 		size += 2;	// extra backslash
5054 		break;
5055 #ifdef BACKSLASH_IN_FILENAME
5056 	    case '\\':
5057 	    case '/':
5058 		size += 4;	// could become "[\/]"
5059 		break;
5060 #endif
5061 	    default:
5062 		size++;
5063 		if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
5064 		{
5065 		    ++p;
5066 		    ++size;
5067 		}
5068 		break;
5069 	}
5070     }
5071     reg_pat = alloc(size + 1);
5072     if (reg_pat == NULL)
5073 	return NULL;
5074 
5075     i = 0;
5076 
5077     if (pat[0] == '*')
5078 	while (pat[0] == '*' && pat < pat_end - 1)
5079 	    pat++;
5080     else
5081 	reg_pat[i++] = '^';
5082     endp = pat_end - 1;
5083     if (endp >= pat && *endp == '*')
5084     {
5085 	while (endp - pat > 0 && *endp == '*')
5086 	    endp--;
5087 	add_dollar = FALSE;
5088     }
5089     for (p = pat; *p && nested >= 0 && p <= endp; p++)
5090     {
5091 	switch (*p)
5092 	{
5093 	    case '*':
5094 		reg_pat[i++] = '.';
5095 		reg_pat[i++] = '*';
5096 		while (p[1] == '*')	// "**" matches like "*"
5097 		    ++p;
5098 		break;
5099 	    case '.':
5100 	    case '~':
5101 		reg_pat[i++] = '\\';
5102 		reg_pat[i++] = *p;
5103 		break;
5104 	    case '?':
5105 		reg_pat[i++] = '.';
5106 		break;
5107 	    case '\\':
5108 		if (p[1] == NUL)
5109 		    break;
5110 #ifdef BACKSLASH_IN_FILENAME
5111 		if (!no_bslash)
5112 		{
5113 		    // translate:
5114 		    // "\x" to "\\x"  e.g., "dir\file"
5115 		    // "\*" to "\\.*" e.g., "dir\*.c"
5116 		    // "\?" to "\\."  e.g., "dir\??.c"
5117 		    // "\+" to "\+"   e.g., "fileX\+.c"
5118 		    if ((vim_isfilec(p[1]) || p[1] == '*' || p[1] == '?')
5119 			    && p[1] != '+')
5120 		    {
5121 			reg_pat[i++] = '[';
5122 			reg_pat[i++] = '\\';
5123 			reg_pat[i++] = '/';
5124 			reg_pat[i++] = ']';
5125 			if (allow_dirs != NULL)
5126 			    *allow_dirs = TRUE;
5127 			break;
5128 		    }
5129 		}
5130 #endif
5131 		// Undo escaping from ExpandEscape():
5132 		// foo\?bar -> foo?bar
5133 		// foo\%bar -> foo%bar
5134 		// foo\,bar -> foo,bar
5135 		// foo\ bar -> foo bar
5136 		// Don't unescape \, * and others that are also special in a
5137 		// regexp.
5138 		// An escaped { must be unescaped since we use magic not
5139 		// verymagic.  Use "\\\{n,m\}"" to get "\{n,m}".
5140 		if (*++p == '?'
5141 #ifdef BACKSLASH_IN_FILENAME
5142 			&& no_bslash
5143 #endif
5144 			)
5145 		    reg_pat[i++] = '?';
5146 		else
5147 		    if (*p == ',' || *p == '%' || *p == '#'
5148 			       || vim_isspace(*p) || *p == '{' || *p == '}')
5149 			reg_pat[i++] = *p;
5150 		    else if (*p == '\\' && p[1] == '\\' && p[2] == '{')
5151 		    {
5152 			reg_pat[i++] = '\\';
5153 			reg_pat[i++] = '{';
5154 			p += 2;
5155 		    }
5156 		    else
5157 		    {
5158 			if (allow_dirs != NULL && vim_ispathsep(*p)
5159 #ifdef BACKSLASH_IN_FILENAME
5160 				&& (!no_bslash || *p != '\\')
5161 #endif
5162 				)
5163 			    *allow_dirs = TRUE;
5164 			reg_pat[i++] = '\\';
5165 			reg_pat[i++] = *p;
5166 		    }
5167 		break;
5168 #ifdef BACKSLASH_IN_FILENAME
5169 	    case '/':
5170 		reg_pat[i++] = '[';
5171 		reg_pat[i++] = '\\';
5172 		reg_pat[i++] = '/';
5173 		reg_pat[i++] = ']';
5174 		if (allow_dirs != NULL)
5175 		    *allow_dirs = TRUE;
5176 		break;
5177 #endif
5178 	    case '{':
5179 		reg_pat[i++] = '\\';
5180 		reg_pat[i++] = '(';
5181 		nested++;
5182 		break;
5183 	    case '}':
5184 		reg_pat[i++] = '\\';
5185 		reg_pat[i++] = ')';
5186 		--nested;
5187 		break;
5188 	    case ',':
5189 		if (nested)
5190 		{
5191 		    reg_pat[i++] = '\\';
5192 		    reg_pat[i++] = '|';
5193 		}
5194 		else
5195 		    reg_pat[i++] = ',';
5196 		break;
5197 	    default:
5198 		if (enc_dbcs != 0 && (*mb_ptr2len)(p) > 1)
5199 		    reg_pat[i++] = *p++;
5200 		else if (allow_dirs != NULL && vim_ispathsep(*p))
5201 		    *allow_dirs = TRUE;
5202 		reg_pat[i++] = *p;
5203 		break;
5204 	}
5205     }
5206     if (add_dollar)
5207 	reg_pat[i++] = '$';
5208     reg_pat[i] = NUL;
5209     if (nested != 0)
5210     {
5211 	if (nested < 0)
5212 	    emsg(_("E219: Missing {."));
5213 	else
5214 	    emsg(_("E220: Missing }."));
5215 	VIM_CLEAR(reg_pat);
5216     }
5217     return reg_pat;
5218 }
5219 
5220 #if defined(EINTR) || defined(PROTO)
5221 /*
5222  * Version of read() that retries when interrupted by EINTR (possibly
5223  * by a SIGWINCH).
5224  */
5225     long
5226 read_eintr(int fd, void *buf, size_t bufsize)
5227 {
5228     long ret;
5229 
5230     for (;;)
5231     {
5232 	ret = vim_read(fd, buf, bufsize);
5233 	if (ret >= 0 || errno != EINTR)
5234 	    break;
5235     }
5236     return ret;
5237 }
5238 
5239 /*
5240  * Version of write() that retries when interrupted by EINTR (possibly
5241  * by a SIGWINCH).
5242  */
5243     long
5244 write_eintr(int fd, void *buf, size_t bufsize)
5245 {
5246     long    ret = 0;
5247     long    wlen;
5248 
5249     // Repeat the write() so long it didn't fail, other than being interrupted
5250     // by a signal.
5251     while (ret < (long)bufsize)
5252     {
5253 	wlen = vim_write(fd, (char *)buf + ret, bufsize - ret);
5254 	if (wlen < 0)
5255 	{
5256 	    if (errno != EINTR)
5257 		break;
5258 	}
5259 	else
5260 	    ret += wlen;
5261     }
5262     return ret;
5263 }
5264 #endif
5265