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(®match, fname, (colnr_T)0) 4966 || (sfname != NULL 4967 && vim_regexec(®match, sfname, (colnr_T)0)))) 4968 || (!allow_dirs && vim_regexec(®match, 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