diff --git a/7.3.872 b/7.3.872 new file mode 100644 index 0000000..0e407f4 --- /dev/null +++ b/7.3.872 @@ -0,0 +1,524 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.872 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.872 +Problem: On some systems case of file names is always ignored, on others + never. +Solution: Add the 'fileignorecase' option to control this at runtime. + Implies 'wildignorecase'. +Files: src/buffer.c, src/edit.c, src/ex_cmds2.c, src/ex_getln.c, + src/fileio.c, src/misc1.c, src/misc2.c, src/option.c, + src/option.h, src/vim.h, runtime/doc/options.txt + + +*** ../vim-7.3.871/src/buffer.c 2013-03-19 14:25:50.000000000 +0100 +--- src/buffer.c 2013-03-19 16:03:42.000000000 +0100 +*************** +*** 2401,2412 **** + if (name != NULL) + { + regmatch.regprog = prog; +! #ifdef CASE_INSENSITIVE_FILENAME +! regmatch.rm_ic = TRUE; /* Always ignore case */ +! #else +! regmatch.rm_ic = FALSE; /* Never ignore case */ +! #endif +! + if (vim_regexec(®match, name, (colnr_T)0)) + match = name; + else +--- 2401,2407 ---- + if (name != NULL) + { + regmatch.regprog = prog; +! regmatch.rm_ic = p_fic; /* ignore case when 'fileignorecase' is set */ + if (vim_regexec(®match, name, (colnr_T)0)) + match = name; + else +*** ../vim-7.3.871/src/edit.c 2013-03-19 13:33:18.000000000 +0100 +--- src/edit.c 2013-03-19 15:43:19.000000000 +0100 +*************** +*** 4336,4348 **** + + /* May change home directory back to "~". */ + tilde_replace(compl_pattern, num_matches, matches); +! ins_compl_add_matches(num_matches, matches, +! #ifdef CASE_INSENSITIVE_FILENAME +! TRUE +! #else +! FALSE +! #endif +! ); + } + break; + +--- 4336,4342 ---- + + /* May change home directory back to "~". */ + tilde_replace(compl_pattern, num_matches, matches); +! ins_compl_add_matches(num_matches, matches, p_fic || p_wic); + } + break; + +*** ../vim-7.3.871/src/ex_cmds2.c 2012-10-03 18:24:55.000000000 +0200 +--- src/ex_cmds2.c 2013-03-19 16:03:50.000000000 +0100 +*************** +*** 1926,1936 **** + * Delete the items: use each item as a regexp and find a match in the + * argument list. + */ +! #ifdef CASE_INSENSITIVE_FILENAME +! regmatch.rm_ic = TRUE; /* Always ignore case */ +! #else +! regmatch.rm_ic = FALSE; /* Never ignore case */ +! #endif + for (i = 0; i < new_ga.ga_len && !got_int; ++i) + { + p = ((char_u **)new_ga.ga_data)[i]; +--- 1926,1932 ---- + * Delete the items: use each item as a regexp and find a match in the + * argument list. + */ +! regmatch.rm_ic = p_fic; /* ignore case when 'fileignorecase' is set */ + for (i = 0; i < new_ga.ga_len && !got_int; ++i) + { + p = ((char_u **)new_ga.ga_data)[i]; +*** ../vim-7.3.871/src/ex_getln.c 2012-11-28 16:49:53.000000000 +0100 +--- src/ex_getln.c 2013-03-19 16:03:53.000000000 +0100 +*************** +*** 3653,3671 **** + { + for (i = 0; i < xp->xp_numfiles; ++i) + { +! #ifdef CASE_INSENSITIVE_FILENAME +! if (xp->xp_context == EXPAND_DIRECTORIES + || xp->xp_context == EXPAND_FILES + || xp->xp_context == EXPAND_SHELLCMD +! || xp->xp_context == EXPAND_BUFFERS) + { + if (TOLOWER_LOC(xp->xp_files[i][len]) != + TOLOWER_LOC(xp->xp_files[0][len])) + break; + } +! else +! #endif +! if (xp->xp_files[i][len] != xp->xp_files[0][len]) + break; + } + if (i < xp->xp_numfiles) +--- 3653,3668 ---- + { + for (i = 0; i < xp->xp_numfiles; ++i) + { +! if (p_fic && (xp->xp_context == EXPAND_DIRECTORIES + || xp->xp_context == EXPAND_FILES + || xp->xp_context == EXPAND_SHELLCMD +! || xp->xp_context == EXPAND_BUFFERS)) + { + if (TOLOWER_LOC(xp->xp_files[i][len]) != + TOLOWER_LOC(xp->xp_files[0][len])) + break; + } +! else if (xp->xp_files[i][len] != xp->xp_files[0][len]) + break; + } + if (i < xp->xp_numfiles) +*** ../vim-7.3.871/src/fileio.c 2013-03-19 13:33:18.000000000 +0100 +--- src/fileio.c 2013-03-19 15:49:28.000000000 +0100 +*************** +*** 6485,6493 **** + #ifdef HAVE_ACL + vim_acl_T acl; /* ACL from original file */ + #endif +- #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME) + int use_tmp_file = FALSE; +- #endif + + /* + * When the names are identical, there is nothing to do. When they refer +--- 6485,6491 ---- +*************** +*** 6496,6506 **** + */ + if (fnamecmp(from, to) == 0) + { +! #ifdef CASE_INSENSITIVE_FILENAME +! if (STRCMP(gettail(from), gettail(to)) != 0) + use_tmp_file = TRUE; + else +- #endif + return 0; + } + +--- 6494,6502 ---- + */ + if (fnamecmp(from, to) == 0) + { +! if (p_fic && STRCMP(gettail(from), gettail(to)) != 0) + use_tmp_file = TRUE; + else + return 0; + } + +*************** +*** 6539,6545 **** + } + #endif + +- #if defined(UNIX) || defined(CASE_INSENSITIVE_FILENAME) + if (use_tmp_file) + { + char tempname[MAXPATHL + 1]; +--- 6535,6540 ---- +*************** +*** 6572,6578 **** + } + return -1; + } +- #endif + + /* + * Delete the "to" file, this is required on some systems to make the +--- 6567,6572 ---- +*************** +*** 10007,10017 **** + int match = FALSE; + #endif + +! #ifdef CASE_INSENSITIVE_FILENAME +! regmatch.rm_ic = TRUE; /* Always ignore case */ +! #else +! regmatch.rm_ic = FALSE; /* Don't ever ignore case */ +! #endif + #ifdef FEAT_OSFILETYPE + if (*pattern == '<') + { +--- 10001,10007 ---- + int match = FALSE; + #endif + +! regmatch.rm_ic = p_fic; /* ignore case if 'fileignorecase' is set */ + #ifdef FEAT_OSFILETYPE + if (*pattern == '<') + { +*** ../vim-7.3.871/src/misc1.c 2013-03-16 21:35:28.000000000 +0100 +--- src/misc1.c 2013-03-19 16:16:24.000000000 +0100 +*************** +*** 5026,5041 **** + return retval; + } + +- #if (defined(CASE_INSENSITIVE_FILENAME) && defined(BACKSLASH_IN_FILENAME)) \ +- || defined(PROTO) + /* +! * Versions of fnamecmp() and fnamencmp() that handle '/' and '\' equally. + */ + int + vim_fnamecmp(x, y) + char_u *x, *y; + { + return vim_fnamencmp(x, y, MAXPATHL); + } + + int +--- 5026,5046 ---- + return retval; + } + + /* +! * Versions of fnamecmp() and fnamencmp() that handle '/' and '\' equally +! * and deal with 'fileignorecase'. + */ + int + vim_fnamecmp(x, y) + char_u *x, *y; + { ++ #ifdef BACKSLASH_IN_FILENAME + return vim_fnamencmp(x, y, MAXPATHL); ++ #else ++ if (p_fic) ++ return MB_STRICMP(x, y); ++ return STRCMP(x, y); ++ #endif + } + + int +*************** +*** 5043,5051 **** + char_u *x, *y; + size_t len; + { + while (len > 0 && *x && *y) + { +! if (TOLOWER_LOC(*x) != TOLOWER_LOC(*y) + && !(*x == '/' && *y == '\\') + && !(*x == '\\' && *y == '/')) + break; +--- 5048,5058 ---- + char_u *x, *y; + size_t len; + { ++ #ifdef BACKSLASH_IN_FILENAME ++ /* TODO: multi-byte characters. */ + while (len > 0 && *x && *y) + { +! if ((p_fic ? TOLOWER_LOC(*x) != TOLOWER_LOC(*y) : *x != *y) + && !(*x == '/' && *y == '\\') + && !(*x == '\\' && *y == '/')) + break; +*************** +*** 5056,5063 **** + if (len == 0) + return 0; + return (*x - *y); +! } + #endif + + /* + * Concatenate file names fname1 and fname2 into allocated memory. +--- 5063,5074 ---- + if (len == 0) + return 0; + return (*x - *y); +! #else +! if (p_fic) +! return MB_STRNICMP(x, y, len); +! return STRNCMP(x, y, len); + #endif ++ } + + /* + * Concatenate file names fname1 and fname2 into allocated memory. +*************** +*** 9835,9845 **** + } + else if (path_end >= path + wildoff + && (vim_strchr((char_u *)"*?[{~$", *path_end) != NULL +! #ifndef CASE_INSENSITIVE_FILENAME +! || ((flags & EW_ICASE) +! && isalpha(PTR2CHAR(path_end))) +! #endif +! )) + e = p; + #ifdef FEAT_MBYTE + if (has_mbyte) +--- 9846,9853 ---- + } + else if (path_end >= path + wildoff + && (vim_strchr((char_u *)"*?[{~$", *path_end) != NULL +! || (!p_fic && (flags & EW_ICASE) +! && isalpha(PTR2CHAR(path_end))))) + e = p; + #ifdef FEAT_MBYTE + if (has_mbyte) +*************** +*** 9882,9895 **** + } + + /* compile the regexp into a program */ +- #ifdef CASE_INSENSITIVE_FILENAME +- regmatch.rm_ic = TRUE; /* Behave like Terminal.app */ +- #else + if (flags & EW_ICASE) + regmatch.rm_ic = TRUE; /* 'wildignorecase' set */ + else +! regmatch.rm_ic = FALSE; /* Don't ignore case */ +! #endif + if (flags & (EW_NOERROR | EW_NOTWILD)) + ++emsg_silent; + regmatch.regprog = vim_regcomp(pat, RE_MAGIC); +--- 9890,9899 ---- + } + + /* compile the regexp into a program */ + if (flags & EW_ICASE) + regmatch.rm_ic = TRUE; /* 'wildignorecase' set */ + else +! regmatch.rm_ic = p_fic; /* ignore case when 'fileignorecase' is set */ + if (flags & (EW_NOERROR | EW_NOTWILD)) + ++emsg_silent; + regmatch.regprog = vim_regcomp(pat, RE_MAGIC); +*** ../vim-7.3.871/src/misc2.c 2012-11-28 18:31:49.000000000 +0100 +--- src/misc2.c 2013-03-19 16:39:56.000000000 +0100 +*************** +*** 5362,5374 **** + if (STRLEN(s1) != STRLEN(s2)) + return FAIL; + + for (i = 0; s1[i] != NUL && s2[i] != NUL; i++) + { + if (s1[i] != s2[i] +! #ifdef CASE_INSENSITIVE_FILENAME +! && TOUPPER_LOC(s1[i]) != TOUPPER_LOC(s2[i]) +! #endif +! ) + { + if (i >= 2) + if (s1[i-1] == '*' && s1[i-2] == '*') +--- 5362,5372 ---- + if (STRLEN(s1) != STRLEN(s2)) + return FAIL; + ++ /* TODO: handle multi-byte characters. */ + for (i = 0; s1[i] != NUL && s2[i] != NUL; i++) + { + if (s1[i] != s2[i] +! && (!p_fic || TOUPPER_LOC(s1[i]) != TOUPPER_LOC(s2[i]))) + { + if (i >= 2) + if (s1[i-1] == '*' && s1[i-2] == '*') +*************** +*** 6123,6134 **** + break; + } + +! if ( +! #ifdef CASE_INSENSITIVE_FILENAME +! TOUPPER_LOC(p[i]) != TOUPPER_LOC(q[i]) +! #else +! p[i] != q[i] +! #endif + #ifdef BACKSLASH_IN_FILENAME + /* consider '/' and '\\' to be equal */ + && !((p[i] == '/' && q[i] == '\\') +--- 6121,6127 ---- + break; + } + +! if ((p_fic ? TOUPPER_LOC(p[i]) != TOUPPER_LOC(q[i]) : p[i] != q[i]) + #ifdef BACKSLASH_IN_FILENAME + /* consider '/' and '\\' to be equal */ + && !((p[i] == '/' && q[i] == '\\') +*** ../vim-7.3.871/src/option.c 2013-03-13 20:42:28.000000000 +0100 +--- src/option.c 2013-03-19 15:40:25.000000000 +0100 +*************** +*** 1108,1113 **** +--- 1108,1122 ---- + (char_u *)&p_ffs, PV_NONE, + {(char_u *)DFLT_FFS_VI, (char_u *)DFLT_FFS_VIM} + SCRIPTID_INIT}, ++ {"fileignorecase", "fic", P_BOOL|P_VI_DEF, ++ (char_u *)&p_fic, PV_NONE, ++ { ++ #ifdef CASE_INSENSITIVE_FILENAME ++ (char_u *)TRUE, ++ #else ++ (char_u *)FALSE, ++ #endif ++ (char_u *)0L} SCRIPTID_INIT}, + {"filetype", "ft", P_STRING|P_ALLOCED|P_VI_DEF|P_NOGLOB|P_NFNAME, + #ifdef FEAT_AUTOCMD + (char_u *)&p_ft, PV_FT, +*** ../vim-7.3.871/src/option.h 2012-08-15 16:20:59.000000000 +0200 +--- src/option.h 2013-03-19 15:42:24.000000000 +0100 +*************** +*** 453,458 **** +--- 453,459 ---- + EXTERN char_u *p_fencs; /* 'fileencodings' */ + #endif + EXTERN char_u *p_ffs; /* 'fileformats' */ ++ EXTERN long p_fic; /* 'fileignorecase' */ + #ifdef FEAT_FOLDING + EXTERN char_u *p_fcl; /* 'foldclose' */ + EXTERN long p_fdls; /* 'foldlevelstart' */ +*** ../vim-7.3.871/src/vim.h 2013-03-19 13:33:18.000000000 +0100 +--- src/vim.h 2013-03-19 16:14:29.000000000 +0100 +*************** +*** 1627,1644 **** + * (this does not account for maximum name lengths and things like "../dir", + * thus it is not 100% accurate!) + */ +! #ifdef CASE_INSENSITIVE_FILENAME +! # ifdef BACKSLASH_IN_FILENAME +! # define fnamecmp(x, y) vim_fnamecmp((x), (y)) +! # define fnamencmp(x, y, n) vim_fnamencmp((x), (y), (size_t)(n)) +! # else +! # define fnamecmp(x, y) MB_STRICMP((x), (y)) +! # define fnamencmp(x, y, n) MB_STRNICMP((x), (y), (n)) +! # endif +! #else +! # define fnamecmp(x, y) strcmp((char *)(x), (char *)(y)) +! # define fnamencmp(x, y, n) strncmp((char *)(x), (char *)(y), (size_t)(n)) +! #endif + + #ifdef HAVE_MEMSET + # define vim_memset(ptr, c, size) memset((ptr), (c), (size)) +--- 1627,1634 ---- + * (this does not account for maximum name lengths and things like "../dir", + * thus it is not 100% accurate!) + */ +! #define fnamecmp(x, y) vim_fnamecmp((char_u *)(x), (char_u *)(y)) +! #define fnamencmp(x, y, n) vim_fnamencmp((char_u *)(x), (char_u *)(y), (size_t)(n)) + + #ifdef HAVE_MEMSET + # define vim_memset(ptr, c, size) memset((ptr), (c), (size)) +*** ../vim-7.3.871/runtime/doc/options.txt 2013-01-23 18:37:31.000000000 +0100 +--- runtime/doc/options.txt 2013-03-19 16:25:49.000000000 +0100 +*************** +*** 2895,2900 **** +--- 2941,2954 ---- + NOTE: This option is set to the Vi default value when 'compatible' is + set and to the Vim default value when 'compatible' is reset. + ++ *'fileignorecase'* *'wic'* *'nofileignorecase'* *'nowic'* ++ 'fileignorecase' 'wic' boolean (default on for systems where case in file ++ names is normally ignored. ++ global ++ {not in Vi} ++ When set case is ignored when using file names and directories. ++ See 'wildignorecase' for only ignoring case when doing completion. ++ + *'filetype'* *'ft'* + 'filetype' 'ft' string (default: "") + local to buffer +*************** +*** 7832,7843 **** + uses another default. + + +! *'wildignorecase* *'wic'* *'nowildignorecase* *'nowic'* + 'wildignorecase' 'wic' boolean (default off) + global + {not in Vi} + When set case is ignored when completing file names and directories. +! Has no effect on systems where file name case is generally ignored. + Does not apply when the shell is used to expand wildcards, which + happens when there are special characters. + +--- 7906,7917 ---- + uses another default. + + +! *'wildignorecase'* *'wic'* *'nowildignorecase'* *'nowic'* + 'wildignorecase' 'wic' boolean (default off) + global + {not in Vi} + When set case is ignored when completing file names and directories. +! Has no effect when 'fileignorecase' is set. + Does not apply when the shell is used to expand wildcards, which + happens when there are special characters. + +*** ../vim-7.3.871/src/version.c 2013-03-19 15:27:43.000000000 +0100 +--- src/version.c 2013-03-19 16:22:46.000000000 +0100 +*************** +*** 730,731 **** +--- 730,733 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 872, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +76. Your ISP regards you as a business partner rather than as a customer. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///