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